mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-07-17 21:22:05 +00:00
Merge branch 'develop' into test
This commit is contained in:
commit
7f0f712d6e
2
.clangd
2
.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
|
||||
|
4
.github/labeler.yml
vendored
4
.github/labeler.yml
vendored
@ -54,3 +54,7 @@ dd:
|
||||
- data/constants/**
|
||||
- data/mappings/**
|
||||
- data/schemas/**
|
||||
community_module:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/**
|
||||
|
1
.github/workflows/auto_tag.yml
vendored
1
.github/workflows/auto_tag.yml
vendored
@ -15,6 +15,7 @@ on:
|
||||
- quantum/**/*
|
||||
- tests/**/*
|
||||
- tmk_core/**/*
|
||||
- lib/python/**/*
|
||||
- util/**/*
|
||||
- Makefile
|
||||
- '*.mk'
|
||||
|
2
.github/workflows/docs.yml
vendored
2
.github/workflows/docs.yml
vendored
@ -56,7 +56,7 @@ jobs:
|
||||
|
||||
- name: Deploy
|
||||
if: ${{ github.event_name == 'push' && github.repository == 'qmk/qmk_firmware' }}
|
||||
uses: JamesIves/github-pages-deploy-action@v4.6.8
|
||||
uses: JamesIves/github-pages-deploy-action@v4.7.3
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
branch: gh-pages
|
||||
|
3
.github/workflows/format.yml
vendored
3
.github/workflows/format.yml
vendored
@ -10,6 +10,7 @@ on:
|
||||
- 'lib/arm_atsam/**'
|
||||
- 'lib/lib8tion/**'
|
||||
- 'lib/python/**'
|
||||
- 'modules/**'
|
||||
- 'platforms/**'
|
||||
- 'quantum/**'
|
||||
- 'tests/**'
|
||||
@ -35,7 +36,7 @@ jobs:
|
||||
|
||||
- name: Get changed files
|
||||
id: file_changes
|
||||
uses: tj-actions/changed-files@v45
|
||||
uses: tj-actions/changed-files@v46
|
||||
with:
|
||||
use_rest_api: true
|
||||
|
||||
|
2
.github/workflows/format_push.yml
vendored
2
.github/workflows/format_push.yml
vendored
@ -39,7 +39,7 @@ jobs:
|
||||
qmk format-text -a
|
||||
git diff
|
||||
|
||||
- uses: rlespinasse/github-slug-action@v3.x
|
||||
- uses: rlespinasse/github-slug-action@v5
|
||||
|
||||
- name: Become QMK Bot
|
||||
run: |
|
||||
|
2
.github/workflows/lint.yml
vendored
2
.github/workflows/lint.yml
vendored
@ -27,7 +27,7 @@ jobs:
|
||||
|
||||
- name: Get changed files
|
||||
id: file_changes
|
||||
uses: tj-actions/changed-files@v45
|
||||
uses: tj-actions/changed-files@v46
|
||||
with:
|
||||
use_rest_api: true
|
||||
|
||||
|
2
.github/workflows/regen_push.yml
vendored
2
.github/workflows/regen_push.yml
vendored
@ -26,7 +26,7 @@ jobs:
|
||||
util/regen.sh
|
||||
git diff
|
||||
|
||||
- uses: rlespinasse/github-slug-action@v3.x
|
||||
- uses: rlespinasse/github-slug-action@v5
|
||||
|
||||
- name: Become QMK Bot
|
||||
run: |
|
||||
|
2
.github/workflows/stale.yml
vendored
2
.github/workflows/stale.yml
vendored
@ -45,7 +45,7 @@ jobs:
|
||||
stale-pr-label: stale
|
||||
days-before-pr-stale: 45
|
||||
days-before-pr-close: 30
|
||||
exempt-pr-labels: bug,awaiting review,breaking_change,in progress,on hold
|
||||
exempt-pr-labels: bug,awaiting review,breaking_change,in progress,on hold,needs-core-wireless,crippled-firmware
|
||||
|
||||
stale-pr-message: >
|
||||
Thank you for your contribution!
|
||||
|
36
Makefile
36
Makefile
@ -113,6 +113,29 @@ endef
|
||||
# Make it easier to call TRY_TO_MATCH_RULE_FROM_LIST
|
||||
TRY_TO_MATCH_RULE_FROM_LIST = $(eval $(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER,$1))$(RULE_FOUND)
|
||||
|
||||
# As TRY_TO_MATCH_RULE_FROM_LIST_HELPER, but with additional
|
||||
# resolution of DEFAULT_FOLDER and keyboard_aliases.hjson for provided rule
|
||||
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER_KB
|
||||
# Split on ":", padding with empty strings to avoid indexing issues
|
||||
TOKEN1:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[0])" $$(RULE))
|
||||
TOKENr:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[1])" $$(RULE))
|
||||
|
||||
TOKEN1:=$$(shell $(QMK_BIN) resolve-alias --allow-unknown $$(TOKEN1))
|
||||
|
||||
FOUNDx:=$$(shell echo $1 | tr " " "\n" | grep -Fx $$(TOKEN1))
|
||||
ifneq ($$(FOUNDx),)
|
||||
RULE := $$(TOKENr)
|
||||
RULE_FOUND := true
|
||||
MATCHED_ITEM := $$(TOKEN1)
|
||||
else
|
||||
RULE_FOUND := false
|
||||
MATCHED_ITEM :=
|
||||
endif
|
||||
endef
|
||||
|
||||
# Make it easier to call TRY_TO_MATCH_RULE_FROM_LIST_KB
|
||||
TRY_TO_MATCH_RULE_FROM_LIST_KB = $(eval $(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER_KB,$1))$(RULE_FOUND)
|
||||
|
||||
define ALL_IN_LIST_LOOP
|
||||
OLD_RULE$1 := $$(RULE)
|
||||
$$(eval $$(call $1,$$(ITEM$1)))
|
||||
@ -138,7 +161,7 @@ define PARSE_RULE
|
||||
$$(eval $$(call PARSE_TEST))
|
||||
# If the rule starts with the name of a known keyboard, then continue
|
||||
# the parsing from PARSE_KEYBOARD
|
||||
else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST,$$(shell $(QMK_BIN) list-keyboards --no-resolve-defaults)),true)
|
||||
else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST_KB,$$(shell $(QMK_BIN) list-keyboards)),true)
|
||||
KEYBOARD_RULE=$$(MATCHED_ITEM)
|
||||
$$(eval $$(call PARSE_KEYBOARD,$$(MATCHED_ITEM)))
|
||||
else
|
||||
@ -170,17 +193,6 @@ define PARSE_KEYBOARD
|
||||
# include the correct makefile to determine the actual name of it
|
||||
CURRENT_KB := $1
|
||||
|
||||
# KEYBOARD_FOLDERS := $$(subst /, , $(CURRENT_KB))
|
||||
|
||||
DEFAULT_FOLDER := $$(CURRENT_KB)
|
||||
|
||||
# We assume that every rules.mk will contain the full default value
|
||||
$$(eval include $(ROOT_DIR)/keyboards/$$(CURRENT_KB)/rules.mk)
|
||||
ifneq ($$(DEFAULT_FOLDER),$$(CURRENT_KB))
|
||||
$$(eval include $(ROOT_DIR)/keyboards/$$(DEFAULT_FOLDER)/rules.mk)
|
||||
endif
|
||||
CURRENT_KB := $$(DEFAULT_FOLDER)
|
||||
|
||||
# 5/4/3/2/1
|
||||
KEYBOARD_FOLDER_PATH_1 := $$(CURRENT_KB)
|
||||
KEYBOARD_FOLDER_PATH_2 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_1)))
|
||||
|
@ -21,10 +21,10 @@ $(TEST_OUTPUT)_SRC := \
|
||||
$(SRC) \
|
||||
$(QUANTUM_PATH)/keymap_introspection.c \
|
||||
tests/test_common/matrix.c \
|
||||
tests/test_common/pointing_device_driver.c \
|
||||
tests/test_common/test_driver.cpp \
|
||||
tests/test_common/keyboard_report_util.cpp \
|
||||
tests/test_common/keycode_util.cpp \
|
||||
tests/test_common/keycode_table.cpp \
|
||||
tests/test_common/mouse_report_util.cpp \
|
||||
tests/test_common/test_fixture.cpp \
|
||||
tests/test_common/test_keymap_key.cpp \
|
||||
tests/test_common/test_logger.cpp \
|
||||
|
@ -97,20 +97,44 @@ endif
|
||||
|
||||
|
||||
# Pull in rules.mk files from all our subfolders
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/rules.mk)","")
|
||||
include $(KEYBOARD_PATH_5)/rules.mk
|
||||
-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)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/info.json
|
||||
endif
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/rules.mk)","")
|
||||
include $(KEYBOARD_PATH_4)/rules.mk
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/info.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/info.json
|
||||
endif
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/rules.mk)","")
|
||||
include $(KEYBOARD_PATH_3)/rules.mk
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/info.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/info.json
|
||||
endif
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/rules.mk)","")
|
||||
include $(KEYBOARD_PATH_2)/rules.mk
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/info.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/info.json
|
||||
endif
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","")
|
||||
include $(KEYBOARD_PATH_1)/rules.mk
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/info.json
|
||||
endif
|
||||
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/keyboard.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/keyboard.json
|
||||
endif
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/keyboard.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/keyboard.json
|
||||
endif
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/keyboard.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/keyboard.json
|
||||
endif
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/keyboard.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/keyboard.json
|
||||
endif
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/keyboard.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/keyboard.json
|
||||
endif
|
||||
|
||||
MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP)
|
||||
@ -186,7 +210,10 @@ endif
|
||||
# Have we found a keymap.json?
|
||||
ifneq ("$(wildcard $(KEYMAP_JSON))", "")
|
||||
ifneq ("$(wildcard $(KEYMAP_C))", "")
|
||||
$(call WARNING_MESSAGE,Keymap is specified as both keymap.json and keymap.c -- keymap.json file wins.)
|
||||
# Allow a separately-found keymap.c next to keymap.json -- the keymap.c
|
||||
# generator will include the other keymap.c in the process, if supplied.
|
||||
OTHER_KEYMAP_C := $(KEYMAP_C)
|
||||
OPT_DEFS += -DOTHER_KEYMAP_C=\"$(OTHER_KEYMAP_C)\"
|
||||
endif
|
||||
|
||||
KEYMAP_PATH := $(KEYMAP_JSON_PATH)
|
||||
@ -194,25 +221,27 @@ ifneq ("$(wildcard $(KEYMAP_JSON))", "")
|
||||
KEYMAP_C := $(INTERMEDIATE_OUTPUT)/src/keymap.c
|
||||
KEYMAP_H := $(INTERMEDIATE_OUTPUT)/src/config.h
|
||||
|
||||
# Load the keymap-level rules.mk if exists
|
||||
-include $(KEYMAP_PATH)/rules.mk
|
||||
ifeq ($(OTHER_KEYMAP_C),)
|
||||
# Load the keymap-level rules.mk if exists (and we havent already loaded it for keymap.c)
|
||||
-include $(KEYMAP_PATH)/rules.mk
|
||||
endif
|
||||
|
||||
# Load any rules.mk content from keymap.json
|
||||
INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --output $(INTERMEDIATE_OUTPUT)/src/rules.mk $(KEYMAP_JSON))
|
||||
include $(INFO_RULES_MK)
|
||||
|
||||
# Add rules to generate the keymap files - indentation here is important
|
||||
$(INTERMEDIATE_OUTPUT)/src/keymap.c: $(KEYMAP_JSON)
|
||||
$(INTERMEDIATE_OUTPUT)/src/keymap.c: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON))
|
||||
@$(BUILD_CMD)
|
||||
|
||||
$(INTERMEDIATE_OUTPUT)/src/config.h: $(KEYMAP_JSON)
|
||||
$(INTERMEDIATE_OUTPUT)/src/config.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(QMK_BIN) generate-config-h --quiet --output $(KEYMAP_H) $(KEYMAP_JSON))
|
||||
@$(BUILD_CMD)
|
||||
|
||||
$(INTERMEDIATE_OUTPUT)/src/keymap.h: $(KEYMAP_JSON)
|
||||
$(INTERMEDIATE_OUTPUT)/src/keymap.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(QMK_BIN) generate-keymap-h --quiet --output $(INTERMEDIATE_OUTPUT)/src/keymap.h $(KEYMAP_JSON))
|
||||
@$(BUILD_CMD)
|
||||
@ -221,6 +250,35 @@ 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))
|
||||
@$(BUILD_CMD)
|
||||
|
||||
$(INTERMEDIATE_OUTPUT)/src/community_modules.c: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(QMK_BIN) generate-community-modules-c -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(KEYMAP_JSON))
|
||||
@$(BUILD_CMD)
|
||||
|
||||
$(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(QMK_BIN) generate-community-modules-introspection-c -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(KEYMAP_JSON))
|
||||
@$(BUILD_CMD)
|
||||
|
||||
$(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(QMK_BIN) generate-community-modules-introspection-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(KEYMAP_JSON))
|
||||
@$(BUILD_CMD)
|
||||
|
||||
SRC += $(INTERMEDIATE_OUTPUT)/src/community_modules.c
|
||||
|
||||
generated-files: $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h
|
||||
|
||||
|
||||
include $(BUILDDEFS_PATH)/converters.mk
|
||||
|
||||
# Generate the board's version.h file.
|
||||
@ -310,6 +368,14 @@ endif
|
||||
|
||||
# Find all of the config.h files and add them to our CONFIG_H define.
|
||||
CONFIG_H :=
|
||||
|
||||
define config_h_community_module_appender
|
||||
ifneq ("$(wildcard $(1)/config.h)","")
|
||||
CONFIG_H += $(1)/config.h
|
||||
endif
|
||||
endef
|
||||
$(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call config_h_community_module_appender,$(module))))
|
||||
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","")
|
||||
CONFIG_H += $(KEYBOARD_PATH_5)/config.h
|
||||
endif
|
||||
@ -327,6 +393,14 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_1)/config.h)","")
|
||||
endif
|
||||
|
||||
POST_CONFIG_H :=
|
||||
|
||||
define post_config_h_community_module_appender
|
||||
ifneq ("$(wildcard $(1)/post_config.h)","")
|
||||
POST_CONFIG_H += $(1)/post_config.h
|
||||
endif
|
||||
endef
|
||||
$(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call post_config_h_community_module_appender,$(module))))
|
||||
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_config.h)","")
|
||||
POST_CONFIG_H += $(KEYBOARD_PATH_1)/post_config.h
|
||||
endif
|
||||
@ -343,40 +417,6 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_config.h)","")
|
||||
POST_CONFIG_H += $(KEYBOARD_PATH_5)/post_config.h
|
||||
endif
|
||||
|
||||
# Create dependencies on DD keyboard config - structure validated elsewhere
|
||||
DD_CONFIG_FILES :=
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/info.json
|
||||
endif
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/info.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/info.json
|
||||
endif
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/info.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/info.json
|
||||
endif
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/info.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/info.json
|
||||
endif
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/info.json
|
||||
endif
|
||||
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/keyboard.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/keyboard.json
|
||||
endif
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/keyboard.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/keyboard.json
|
||||
endif
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/keyboard.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/keyboard.json
|
||||
endif
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/keyboard.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/keyboard.json
|
||||
endif
|
||||
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/keyboard.json)","")
|
||||
DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/keyboard.json
|
||||
endif
|
||||
|
||||
CONFIG_H += $(INTERMEDIATE_OUTPUT)/src/info_config.h
|
||||
KEYBOARD_SRC += $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c
|
||||
|
||||
@ -441,21 +481,18 @@ 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)","")
|
||||
include $(1)/post_rules.mk
|
||||
endif
|
||||
endef
|
||||
$(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call post_rules_mk_community_module_includer,$(module))))
|
||||
|
||||
ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
|
||||
CONFIG_H += $(KEYMAP_PATH)/config.h
|
||||
|
@ -28,6 +28,9 @@ QUANTUM_SRC += \
|
||||
$(QUANTUM_DIR)/sync_timer.c \
|
||||
$(QUANTUM_DIR)/logging/debug.c \
|
||||
$(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
|
||||
@ -129,13 +132,13 @@ ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
|
||||
MOUSE_ENABLE := yes
|
||||
VPATH += $(QUANTUM_DIR)/pointing_device
|
||||
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device.c
|
||||
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_drivers.c
|
||||
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_auto_mouse.c
|
||||
ifneq ($(strip $(POINTING_DEVICE_DRIVER)), custom)
|
||||
SRC += drivers/sensors/$(strip $(POINTING_DEVICE_DRIVER)).c
|
||||
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(shell echo $(POINTING_DEVICE_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
endif
|
||||
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(POINTING_DEVICE_DRIVER))
|
||||
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_NAME=$(strip $(POINTING_DEVICE_DRIVER))
|
||||
ifeq ($(strip $(POINTING_DEVICE_DRIVER)), adns9800)
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), analog_joystick)
|
||||
@ -168,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 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
|
||||
@ -432,6 +437,13 @@ ifeq ($(strip $(LED_MATRIX_ENABLE)), yes)
|
||||
SRC += snled27351-mono.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(LED_MATRIX_CUSTOM_KB)), yes)
|
||||
OPT_DEFS += -DLED_MATRIX_CUSTOM_KB
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(LED_MATRIX_CUSTOM_USER)), yes)
|
||||
OPT_DEFS += -DLED_MATRIX_CUSTOM_USER
|
||||
endif
|
||||
endif
|
||||
|
||||
# Deprecated driver names - do not use
|
||||
@ -456,6 +468,10 @@ ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
|
||||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations
|
||||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations/runners
|
||||
POST_CONFIG_H += $(QUANTUM_DIR)/rgb_matrix/post_config.h
|
||||
|
||||
# TODO: Remove this
|
||||
SRC += $(QUANTUM_DIR)/process_keycode/process_underglow.c
|
||||
|
||||
SRC += $(QUANTUM_DIR)/process_keycode/process_rgb_matrix.c
|
||||
SRC += $(QUANTUM_DIR)/color.c
|
||||
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix.c
|
||||
@ -623,6 +639,10 @@ ifeq ($(strip $(VIA_ENABLE)), yes)
|
||||
TRI_LAYER_ENABLE := yes
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes)
|
||||
SEND_STRING_ENABLE := yes
|
||||
endif
|
||||
|
||||
VALID_CUSTOM_MATRIX_TYPES:= yes lite no
|
||||
|
||||
CUSTOM_MATRIX ?= no
|
||||
@ -872,12 +892,11 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
|
||||
OPT_DEFS += -DBLUETOOTH_ENABLE
|
||||
OPT_DEFS += -DBLUETOOTH_$(strip $(shell echo $(BLUETOOTH_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
NO_USB_STARTUP_CHECK := yes
|
||||
CONNECTION_ENABLE := yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/bluetooth
|
||||
SRC += outputselect.c process_connection.c
|
||||
|
||||
ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le)
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
ANALOG_DRIVER_REQUIRED = yes
|
||||
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
|
||||
SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp
|
||||
endif
|
||||
@ -918,6 +937,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
|
||||
@ -928,6 +969,8 @@ ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes)
|
||||
|
||||
OPT_DEFS += -DWS2812_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led
|
||||
|
||||
SRC += ws2812.c ws2812_$(strip $(WS2812_DRIVER)).c
|
||||
|
||||
ifeq ($(strip $(PLATFORM)), CHIBIOS)
|
||||
|
@ -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
|
||||
|
@ -39,8 +39,15 @@ export default defineConfig(({ mode }) => {
|
||||
provider: "local",
|
||||
},
|
||||
|
||||
editLink: {
|
||||
pattern: 'https://github.com/qmk/qmk_firmware/edit/master/docs/:path'
|
||||
},
|
||||
lastUpdated: true,
|
||||
|
||||
sidebar: sidebar,
|
||||
|
||||
externalLinkIcon: true,
|
||||
|
||||
socialLinks: [
|
||||
{ icon: { svg: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 29 3 C 28.0625 3 27.164063 3.382813 26.5 4 C 25.835938 4.617188 25.363281 5.433594 25 6.40625 C 24.355469 8.140625 24.085938 10.394531 24.03125 13.03125 C 19.234375 13.179688 14.820313 14.421875 11.28125 16.46875 C 10.214844 15.46875 8.855469 14.96875 7.5 14.96875 C 6.089844 14.96875 4.675781 15.511719 3.59375 16.59375 C 1.425781 18.761719 1.425781 22.238281 3.59375 24.40625 L 3.84375 24.65625 C 3.3125 26.035156 3 27.488281 3 29 C 3 33.527344 5.566406 37.585938 9.5625 40.4375 C 13.558594 43.289063 19.007813 45 25 45 C 30.992188 45 36.441406 43.289063 40.4375 40.4375 C 44.433594 37.585938 47 33.527344 47 29 C 47 27.488281 46.6875 26.035156 46.15625 24.65625 L 46.40625 24.40625 C 48.574219 22.238281 48.574219 18.761719 46.40625 16.59375 C 45.324219 15.511719 43.910156 14.96875 42.5 14.96875 C 41.144531 14.96875 39.785156 15.46875 38.71875 16.46875 C 35.195313 14.433594 30.800781 13.191406 26.03125 13.03125 C 26.09375 10.546875 26.363281 8.46875 26.875 7.09375 C 27.164063 6.316406 27.527344 5.757813 27.875 5.4375 C 28.222656 5.117188 28.539063 5 29 5 C 29.460938 5 29.683594 5.125 30.03125 5.40625 C 30.378906 5.6875 30.785156 6.148438 31.3125 6.6875 C 32.253906 7.652344 33.695313 8.714844 36.09375 8.9375 C 36.539063 11.238281 38.574219 13 41 13 C 43.75 13 46 10.75 46 8 C 46 5.25 43.75 3 41 3 C 38.605469 3 36.574219 4.710938 36.09375 6.96875 C 34.3125 6.796875 33.527344 6.109375 32.75 5.3125 C 32.300781 4.851563 31.886719 4.3125 31.3125 3.84375 C 30.738281 3.375 29.9375 3 29 3 Z M 41 5 C 42.667969 5 44 6.332031 44 8 C 44 9.667969 42.667969 11 41 11 C 39.332031 11 38 9.667969 38 8 C 38 6.332031 39.332031 5 41 5 Z M 25 15 C 30.609375 15 35.675781 16.613281 39.28125 19.1875 C 42.886719 21.761719 45 25.226563 45 29 C 45 32.773438 42.886719 36.238281 39.28125 38.8125 C 35.675781 41.386719 30.609375 43 25 43 C 19.390625 43 14.324219 41.386719 10.71875 38.8125 C 7.113281 36.238281 5 32.773438 5 29 C 5 25.226563 7.113281 21.761719 10.71875 19.1875 C 14.324219 16.613281 19.390625 15 25 15 Z M 7.5 16.9375 C 8.203125 16.9375 8.914063 17.148438 9.53125 17.59375 C 7.527344 19.03125 5.886719 20.769531 4.75 22.71875 C 3.582031 21.296875 3.660156 19.339844 5 18 C 5.714844 17.285156 6.609375 16.9375 7.5 16.9375 Z M 42.5 16.9375 C 43.390625 16.9375 44.285156 17.285156 45 18 C 46.339844 19.339844 46.417969 21.296875 45.25 22.71875 C 44.113281 20.769531 42.472656 19.03125 40.46875 17.59375 C 41.085938 17.148438 41.796875 16.9375 42.5 16.9375 Z M 17 22 C 14.800781 22 13 23.800781 13 26 C 13 28.199219 14.800781 30 17 30 C 19.199219 30 21 28.199219 21 26 C 21 23.800781 19.199219 22 17 22 Z M 33 22 C 30.800781 22 29 23.800781 29 26 C 29 28.199219 30.800781 30 33 30 C 35.199219 30 37 28.199219 37 26 C 37 23.800781 35.199219 22 33 22 Z M 17 24 C 18.117188 24 19 24.882813 19 26 C 19 27.117188 18.117188 28 17 28 C 15.882813 28 15 27.117188 15 26 C 15 24.882813 15.882813 24 17 24 Z M 33 24 C 34.117188 24 35 24.882813 35 26 C 35 27.117188 34.117188 28 33 28 C 31.882813 28 31 27.117188 31 26 C 31 24.882813 31.882813 24 33 24 Z M 34.15625 33.84375 C 34.101563 33.851563 34.050781 33.859375 34 33.875 C 33.683594 33.9375 33.417969 34.144531 33.28125 34.4375 C 33.28125 34.4375 32.757813 35.164063 31.4375 36 C 30.117188 36.835938 28.058594 37.6875 25 37.6875 C 21.941406 37.6875 19.882813 36.835938 18.5625 36 C 17.242188 35.164063 16.71875 34.4375 16.71875 34.4375 C 16.492188 34.082031 16.066406 33.90625 15.65625 34 C 15.332031 34.082031 15.070313 34.316406 14.957031 34.632813 C 14.84375 34.945313 14.894531 35.292969 15.09375 35.5625 C 15.09375 35.5625 15.863281 36.671875 17.46875 37.6875 C 19.074219 38.703125 21.558594 39.6875 25 39.6875 C 28.441406 39.6875 30.925781 38.703125 32.53125 37.6875 C 34.136719 36.671875 34.90625 35.5625 34.90625 35.5625 C 35.207031 35.273438 35.296875 34.824219 35.128906 34.441406 C 34.960938 34.058594 34.574219 33.820313 34.15625 33.84375 Z"/></svg>' }, link: "https://reddit.com/r/olkb" },
|
||||
{ icon: "discord", link: "https://discord.gg/qmk" },
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"license": "GPL-2.0-or-later",
|
||||
"devDependencies": {
|
||||
"vite": "^5.2.14",
|
||||
"vite": "^5.4.18",
|
||||
"vitepress": "^1.1.0",
|
||||
"vitepress-plugin-tabs": "^0.5.0",
|
||||
"vue": "^3.4.24"
|
||||
|
@ -178,205 +178,220 @@
|
||||
"@docsearch/css" "3.6.0"
|
||||
algoliasearch "^4.19.1"
|
||||
|
||||
"@esbuild/aix-ppc64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537"
|
||||
integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==
|
||||
"@esbuild/aix-ppc64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f"
|
||||
integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==
|
||||
|
||||
"@esbuild/android-arm64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9"
|
||||
integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==
|
||||
"@esbuild/android-arm64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052"
|
||||
integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==
|
||||
|
||||
"@esbuild/android-arm@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995"
|
||||
integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==
|
||||
"@esbuild/android-arm@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28"
|
||||
integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==
|
||||
|
||||
"@esbuild/android-x64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98"
|
||||
integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==
|
||||
"@esbuild/android-x64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e"
|
||||
integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==
|
||||
|
||||
"@esbuild/darwin-arm64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb"
|
||||
integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==
|
||||
"@esbuild/darwin-arm64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a"
|
||||
integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==
|
||||
|
||||
"@esbuild/darwin-x64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0"
|
||||
integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==
|
||||
"@esbuild/darwin-x64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22"
|
||||
integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==
|
||||
|
||||
"@esbuild/freebsd-arm64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911"
|
||||
integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==
|
||||
"@esbuild/freebsd-arm64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e"
|
||||
integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==
|
||||
|
||||
"@esbuild/freebsd-x64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c"
|
||||
integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==
|
||||
"@esbuild/freebsd-x64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261"
|
||||
integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==
|
||||
|
||||
"@esbuild/linux-arm64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5"
|
||||
integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==
|
||||
"@esbuild/linux-arm64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b"
|
||||
integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==
|
||||
|
||||
"@esbuild/linux-arm@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c"
|
||||
integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==
|
||||
"@esbuild/linux-arm@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9"
|
||||
integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==
|
||||
|
||||
"@esbuild/linux-ia32@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa"
|
||||
integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==
|
||||
"@esbuild/linux-ia32@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2"
|
||||
integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==
|
||||
|
||||
"@esbuild/linux-loong64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5"
|
||||
integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==
|
||||
"@esbuild/linux-loong64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df"
|
||||
integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==
|
||||
|
||||
"@esbuild/linux-mips64el@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa"
|
||||
integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==
|
||||
"@esbuild/linux-mips64el@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe"
|
||||
integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==
|
||||
|
||||
"@esbuild/linux-ppc64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20"
|
||||
integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==
|
||||
"@esbuild/linux-ppc64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4"
|
||||
integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==
|
||||
|
||||
"@esbuild/linux-riscv64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300"
|
||||
integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==
|
||||
"@esbuild/linux-riscv64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc"
|
||||
integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==
|
||||
|
||||
"@esbuild/linux-s390x@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685"
|
||||
integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==
|
||||
"@esbuild/linux-s390x@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de"
|
||||
integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==
|
||||
|
||||
"@esbuild/linux-x64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff"
|
||||
integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==
|
||||
"@esbuild/linux-x64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0"
|
||||
integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==
|
||||
|
||||
"@esbuild/netbsd-x64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6"
|
||||
integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==
|
||||
"@esbuild/netbsd-x64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047"
|
||||
integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==
|
||||
|
||||
"@esbuild/openbsd-x64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf"
|
||||
integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==
|
||||
"@esbuild/openbsd-x64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70"
|
||||
integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==
|
||||
|
||||
"@esbuild/sunos-x64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f"
|
||||
integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==
|
||||
"@esbuild/sunos-x64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b"
|
||||
integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==
|
||||
|
||||
"@esbuild/win32-arm64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90"
|
||||
integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==
|
||||
"@esbuild/win32-arm64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d"
|
||||
integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==
|
||||
|
||||
"@esbuild/win32-ia32@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23"
|
||||
integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==
|
||||
"@esbuild/win32-ia32@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b"
|
||||
integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==
|
||||
|
||||
"@esbuild/win32-x64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc"
|
||||
integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==
|
||||
"@esbuild/win32-x64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c"
|
||||
integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
|
||||
|
||||
"@jridgewell/sourcemap-codec@^1.4.15":
|
||||
version "1.4.15"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
|
||||
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
|
||||
|
||||
"@rollup/rollup-android-arm-eabi@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz#8b613b9725e8f9479d142970b106b6ae878610d5"
|
||||
integrity sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==
|
||||
"@rollup/rollup-android-arm-eabi@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz#d4dd60da0075a6ce9a6c76d71b8204f3e1822285"
|
||||
integrity sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==
|
||||
|
||||
"@rollup/rollup-android-arm64@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz#654ca1049189132ff602bfcf8df14c18da1f15fb"
|
||||
integrity sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==
|
||||
"@rollup/rollup-android-arm64@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz#25c4d33259a7a2ccd2f52a5ffcc0bb3ab3f0729d"
|
||||
integrity sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==
|
||||
|
||||
"@rollup/rollup-darwin-arm64@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz#6d241d099d1518ef0c2205d96b3fa52e0fe1954b"
|
||||
integrity sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==
|
||||
"@rollup/rollup-darwin-arm64@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz#d137dff254b19163a6b52ac083a71cd055dae844"
|
||||
integrity sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==
|
||||
|
||||
"@rollup/rollup-darwin-x64@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz#42bd19d292a57ee11734c980c4650de26b457791"
|
||||
integrity sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==
|
||||
"@rollup/rollup-darwin-x64@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz#58ff20b5dacb797d3adca19f02a21c532f9d55bf"
|
||||
integrity sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==
|
||||
|
||||
"@rollup/rollup-linux-arm-gnueabihf@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz#f23555ee3d8fe941c5c5fd458cd22b65eb1c2232"
|
||||
integrity sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==
|
||||
"@rollup/rollup-freebsd-arm64@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz#96ce1a241c591ec3e068f4af765d94eddb24e60c"
|
||||
integrity sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==
|
||||
|
||||
"@rollup/rollup-linux-arm-musleabihf@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz#f3bbd1ae2420f5539d40ac1fde2b38da67779baa"
|
||||
integrity sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==
|
||||
"@rollup/rollup-freebsd-x64@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz#e59e7ede505be41f0b4311b0b943f8eb44938467"
|
||||
integrity sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==
|
||||
|
||||
"@rollup/rollup-linux-arm64-gnu@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz#7abe900120113e08a1f90afb84c7c28774054d15"
|
||||
integrity sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==
|
||||
"@rollup/rollup-linux-arm-gnueabihf@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz#e455ca6e4ff35bd46d62201c153352e717000a7b"
|
||||
integrity sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==
|
||||
|
||||
"@rollup/rollup-linux-arm64-musl@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz#9e655285c8175cd44f57d6a1e8e5dedfbba1d820"
|
||||
integrity sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==
|
||||
"@rollup/rollup-linux-arm-musleabihf@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz#bc1a93d807d19e70b1e343a5bfea43723bcd6327"
|
||||
integrity sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==
|
||||
|
||||
"@rollup/rollup-linux-powerpc64le-gnu@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz#9a79ae6c9e9d8fe83d49e2712ecf4302db5bef5e"
|
||||
integrity sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==
|
||||
"@rollup/rollup-linux-arm64-gnu@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz#f38bf843f1dc3d5de680caf31084008846e3efae"
|
||||
integrity sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==
|
||||
|
||||
"@rollup/rollup-linux-riscv64-gnu@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz#67ac70eca4ace8e2942fabca95164e8874ab8128"
|
||||
integrity sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==
|
||||
"@rollup/rollup-linux-arm64-musl@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz#b3987a96c18b7287129cf735be2dbf83e94d9d05"
|
||||
integrity sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==
|
||||
|
||||
"@rollup/rollup-linux-s390x-gnu@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz#9f883a7440f51a22ed7f99e1d070bd84ea5005fc"
|
||||
integrity sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==
|
||||
"@rollup/rollup-linux-loongarch64-gnu@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz#0f0324044e71c4f02e9f49e7ec4e347b655b34ee"
|
||||
integrity sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==
|
||||
|
||||
"@rollup/rollup-linux-x64-gnu@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz#70116ae6c577fe367f58559e2cffb5641a1dd9d0"
|
||||
integrity sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==
|
||||
"@rollup/rollup-linux-powerpc64le-gnu@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz#809479f27f1fd5b4eecd2aa732132ad952d454ba"
|
||||
integrity sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==
|
||||
|
||||
"@rollup/rollup-linux-x64-musl@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz#f473f88219feb07b0b98b53a7923be716d1d182f"
|
||||
integrity sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==
|
||||
"@rollup/rollup-linux-riscv64-gnu@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz#7bc75c4f22db04d3c972f83431739cfa41c6a36e"
|
||||
integrity sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==
|
||||
|
||||
"@rollup/rollup-win32-arm64-msvc@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz#4349482d17f5d1c58604d1c8900540d676f420e0"
|
||||
integrity sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==
|
||||
"@rollup/rollup-linux-s390x-gnu@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz#cfe8052345c55864d83ae343362cf1912480170e"
|
||||
integrity sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==
|
||||
|
||||
"@rollup/rollup-win32-ia32-msvc@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz#a6fc39a15db618040ec3c2a24c1e26cb5f4d7422"
|
||||
integrity sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==
|
||||
"@rollup/rollup-linux-x64-gnu@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz#c6b048f1e25f3fea5b4bd246232f4d07a159c5a0"
|
||||
integrity sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==
|
||||
|
||||
"@rollup/rollup-win32-x64-msvc@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz#3dd5d53e900df2a40841882c02e56f866c04d202"
|
||||
integrity sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==
|
||||
"@rollup/rollup-linux-x64-musl@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz#615273ac52d1a201f4de191cbd3389016a9d7d80"
|
||||
integrity sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==
|
||||
|
||||
"@rollup/rollup-win32-arm64-msvc@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.31.0.tgz#32ed85810c1b831c648eca999d68f01255b30691"
|
||||
integrity sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==
|
||||
|
||||
"@rollup/rollup-win32-ia32-msvc@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.31.0.tgz#d47effada68bcbfdccd30c4a788d42e4542ff4d3"
|
||||
integrity sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==
|
||||
|
||||
"@rollup/rollup-win32-x64-msvc@4.31.0":
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.31.0.tgz#7a2d89a82cf0388d60304964217dd7beac6de645"
|
||||
integrity sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==
|
||||
|
||||
"@shikijs/core@1.3.0", "@shikijs/core@^1.3.0":
|
||||
version "1.3.0"
|
||||
@ -390,10 +405,10 @@
|
||||
dependencies:
|
||||
shiki "1.3.0"
|
||||
|
||||
"@types/estree@1.0.5":
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
|
||||
integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
|
||||
"@types/estree@1.0.6":
|
||||
version "1.0.6"
|
||||
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50"
|
||||
integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==
|
||||
|
||||
"@types/linkify-it@*":
|
||||
version "3.0.5"
|
||||
@ -589,34 +604,34 @@ entities@^4.5.0:
|
||||
resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
|
||||
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
|
||||
|
||||
esbuild@^0.20.1:
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1"
|
||||
integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==
|
||||
esbuild@^0.21.3:
|
||||
version "0.21.5"
|
||||
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d"
|
||||
integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==
|
||||
optionalDependencies:
|
||||
"@esbuild/aix-ppc64" "0.20.2"
|
||||
"@esbuild/android-arm" "0.20.2"
|
||||
"@esbuild/android-arm64" "0.20.2"
|
||||
"@esbuild/android-x64" "0.20.2"
|
||||
"@esbuild/darwin-arm64" "0.20.2"
|
||||
"@esbuild/darwin-x64" "0.20.2"
|
||||
"@esbuild/freebsd-arm64" "0.20.2"
|
||||
"@esbuild/freebsd-x64" "0.20.2"
|
||||
"@esbuild/linux-arm" "0.20.2"
|
||||
"@esbuild/linux-arm64" "0.20.2"
|
||||
"@esbuild/linux-ia32" "0.20.2"
|
||||
"@esbuild/linux-loong64" "0.20.2"
|
||||
"@esbuild/linux-mips64el" "0.20.2"
|
||||
"@esbuild/linux-ppc64" "0.20.2"
|
||||
"@esbuild/linux-riscv64" "0.20.2"
|
||||
"@esbuild/linux-s390x" "0.20.2"
|
||||
"@esbuild/linux-x64" "0.20.2"
|
||||
"@esbuild/netbsd-x64" "0.20.2"
|
||||
"@esbuild/openbsd-x64" "0.20.2"
|
||||
"@esbuild/sunos-x64" "0.20.2"
|
||||
"@esbuild/win32-arm64" "0.20.2"
|
||||
"@esbuild/win32-ia32" "0.20.2"
|
||||
"@esbuild/win32-x64" "0.20.2"
|
||||
"@esbuild/aix-ppc64" "0.21.5"
|
||||
"@esbuild/android-arm" "0.21.5"
|
||||
"@esbuild/android-arm64" "0.21.5"
|
||||
"@esbuild/android-x64" "0.21.5"
|
||||
"@esbuild/darwin-arm64" "0.21.5"
|
||||
"@esbuild/darwin-x64" "0.21.5"
|
||||
"@esbuild/freebsd-arm64" "0.21.5"
|
||||
"@esbuild/freebsd-x64" "0.21.5"
|
||||
"@esbuild/linux-arm" "0.21.5"
|
||||
"@esbuild/linux-arm64" "0.21.5"
|
||||
"@esbuild/linux-ia32" "0.21.5"
|
||||
"@esbuild/linux-loong64" "0.21.5"
|
||||
"@esbuild/linux-mips64el" "0.21.5"
|
||||
"@esbuild/linux-ppc64" "0.21.5"
|
||||
"@esbuild/linux-riscv64" "0.21.5"
|
||||
"@esbuild/linux-s390x" "0.21.5"
|
||||
"@esbuild/linux-x64" "0.21.5"
|
||||
"@esbuild/netbsd-x64" "0.21.5"
|
||||
"@esbuild/openbsd-x64" "0.21.5"
|
||||
"@esbuild/sunos-x64" "0.21.5"
|
||||
"@esbuild/win32-arm64" "0.21.5"
|
||||
"@esbuild/win32-ia32" "0.21.5"
|
||||
"@esbuild/win32-x64" "0.21.5"
|
||||
|
||||
estree-walker@^2.0.2:
|
||||
version "2.0.2"
|
||||
@ -662,29 +677,29 @@ mitt@^3.0.1:
|
||||
resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1"
|
||||
integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
|
||||
|
||||
nanoid@^3.3.7:
|
||||
version "3.3.7"
|
||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
|
||||
integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
|
||||
nanoid@^3.3.8:
|
||||
version "3.3.8"
|
||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf"
|
||||
integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==
|
||||
|
||||
perfect-debounce@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a"
|
||||
integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==
|
||||
|
||||
picocolors@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
|
||||
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
|
||||
picocolors@^1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
|
||||
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
|
||||
|
||||
postcss@^8.4.38:
|
||||
version "8.4.38"
|
||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e"
|
||||
integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==
|
||||
postcss@^8.4.38, postcss@^8.4.43:
|
||||
version "8.5.1"
|
||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214"
|
||||
integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==
|
||||
dependencies:
|
||||
nanoid "^3.3.7"
|
||||
picocolors "^1.0.0"
|
||||
source-map-js "^1.2.0"
|
||||
nanoid "^3.3.8"
|
||||
picocolors "^1.1.1"
|
||||
source-map-js "^1.2.1"
|
||||
|
||||
preact@^10.0.0:
|
||||
version "10.20.2"
|
||||
@ -696,29 +711,32 @@ rfdc@^1.3.1:
|
||||
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f"
|
||||
integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==
|
||||
|
||||
rollup@^4.13.0:
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.22.4.tgz#4135a6446671cd2a2453e1ad42a45d5973ec3a0f"
|
||||
integrity sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==
|
||||
rollup@^4.20.0:
|
||||
version "4.31.0"
|
||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.31.0.tgz#b84af969a0292cb047dce2c0ec5413a9457597a4"
|
||||
integrity sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==
|
||||
dependencies:
|
||||
"@types/estree" "1.0.5"
|
||||
"@types/estree" "1.0.6"
|
||||
optionalDependencies:
|
||||
"@rollup/rollup-android-arm-eabi" "4.22.4"
|
||||
"@rollup/rollup-android-arm64" "4.22.4"
|
||||
"@rollup/rollup-darwin-arm64" "4.22.4"
|
||||
"@rollup/rollup-darwin-x64" "4.22.4"
|
||||
"@rollup/rollup-linux-arm-gnueabihf" "4.22.4"
|
||||
"@rollup/rollup-linux-arm-musleabihf" "4.22.4"
|
||||
"@rollup/rollup-linux-arm64-gnu" "4.22.4"
|
||||
"@rollup/rollup-linux-arm64-musl" "4.22.4"
|
||||
"@rollup/rollup-linux-powerpc64le-gnu" "4.22.4"
|
||||
"@rollup/rollup-linux-riscv64-gnu" "4.22.4"
|
||||
"@rollup/rollup-linux-s390x-gnu" "4.22.4"
|
||||
"@rollup/rollup-linux-x64-gnu" "4.22.4"
|
||||
"@rollup/rollup-linux-x64-musl" "4.22.4"
|
||||
"@rollup/rollup-win32-arm64-msvc" "4.22.4"
|
||||
"@rollup/rollup-win32-ia32-msvc" "4.22.4"
|
||||
"@rollup/rollup-win32-x64-msvc" "4.22.4"
|
||||
"@rollup/rollup-android-arm-eabi" "4.31.0"
|
||||
"@rollup/rollup-android-arm64" "4.31.0"
|
||||
"@rollup/rollup-darwin-arm64" "4.31.0"
|
||||
"@rollup/rollup-darwin-x64" "4.31.0"
|
||||
"@rollup/rollup-freebsd-arm64" "4.31.0"
|
||||
"@rollup/rollup-freebsd-x64" "4.31.0"
|
||||
"@rollup/rollup-linux-arm-gnueabihf" "4.31.0"
|
||||
"@rollup/rollup-linux-arm-musleabihf" "4.31.0"
|
||||
"@rollup/rollup-linux-arm64-gnu" "4.31.0"
|
||||
"@rollup/rollup-linux-arm64-musl" "4.31.0"
|
||||
"@rollup/rollup-linux-loongarch64-gnu" "4.31.0"
|
||||
"@rollup/rollup-linux-powerpc64le-gnu" "4.31.0"
|
||||
"@rollup/rollup-linux-riscv64-gnu" "4.31.0"
|
||||
"@rollup/rollup-linux-s390x-gnu" "4.31.0"
|
||||
"@rollup/rollup-linux-x64-gnu" "4.31.0"
|
||||
"@rollup/rollup-linux-x64-musl" "4.31.0"
|
||||
"@rollup/rollup-win32-arm64-msvc" "4.31.0"
|
||||
"@rollup/rollup-win32-ia32-msvc" "4.31.0"
|
||||
"@rollup/rollup-win32-x64-msvc" "4.31.0"
|
||||
fsevents "~2.3.2"
|
||||
|
||||
shiki@1.3.0, shiki@^1.3.0:
|
||||
@ -733,6 +751,11 @@ source-map-js@^1.2.0:
|
||||
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
|
||||
integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
|
||||
|
||||
source-map-js@^1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
|
||||
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
|
||||
|
||||
speakingurl@^14.0.1:
|
||||
version "14.0.1"
|
||||
resolved "https://registry.yarnpkg.com/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53"
|
||||
@ -743,14 +766,14 @@ tabbable@^6.2.0:
|
||||
resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97"
|
||||
integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==
|
||||
|
||||
vite@^5.2.14, vite@^5.2.9:
|
||||
version "5.2.14"
|
||||
resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.14.tgz#fd5f60facf6b5f90ec7da6323c467a365d380c3d"
|
||||
integrity sha512-TFQLuwWLPms+NBNlh0D9LZQ+HXW471COABxw/9TEUBrjuHMo9BrYBPrN/SYAwIuVL+rLerycxiLT41t4f5MZpA==
|
||||
vite@^5.2.9, vite@^5.4.18:
|
||||
version "5.4.18"
|
||||
resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.18.tgz#b5af357f9d5ebb2e0c085779b7a37a77f09168a4"
|
||||
integrity sha512-1oDcnEp3lVyHCuQ2YFelM4Alm2o91xNoMncRm1U7S+JdYfYOvbiGZ3/CxGttrOu2M/KcGz7cRC2DoNUA6urmMA==
|
||||
dependencies:
|
||||
esbuild "^0.20.1"
|
||||
postcss "^8.4.38"
|
||||
rollup "^4.13.0"
|
||||
esbuild "^0.21.3"
|
||||
postcss "^8.4.43"
|
||||
rollup "^4.20.0"
|
||||
optionalDependencies:
|
||||
fsevents "~2.3.3"
|
||||
|
||||
|
@ -25,6 +25,7 @@ GENERIC_FEATURES = \
|
||||
CAPS_WORD \
|
||||
COMBO \
|
||||
COMMAND \
|
||||
CONNECTION \
|
||||
CRC \
|
||||
DEFERRED_EXEC \
|
||||
DIGITIZER \
|
||||
@ -34,8 +35,10 @@ GENERIC_FEATURES = \
|
||||
DYNAMIC_TAPPING_TERM \
|
||||
GRAVE_ESC \
|
||||
HAPTIC \
|
||||
KEYCODE_STRING \
|
||||
KEY_LOCK \
|
||||
KEY_OVERRIDE \
|
||||
LAYER_LOCK \
|
||||
LEADER \
|
||||
MAGIC \
|
||||
MOUSEKEY \
|
||||
@ -59,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
|
||||
|
596
data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson
Normal file
596
data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson
Normal file
@ -0,0 +1,596 @@
|
||||
{
|
||||
"aliases": {
|
||||
/*
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
* │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||
* │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
|
||||
* │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ │
|
||||
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
|
||||
* │ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ │
|
||||
* ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||
* │ │ │ │ │ │ │ │ │
|
||||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||
*/
|
||||
"KC_GRV": {
|
||||
"key": "EU_GRV",
|
||||
"label": "`",
|
||||
}
|
||||
"KC_1": {
|
||||
"key": "EU_1",
|
||||
"label": "1",
|
||||
}
|
||||
"KC_2": {
|
||||
"key": "EU_2",
|
||||
"label": "2",
|
||||
}
|
||||
"KC_3": {
|
||||
"key": "EU_3",
|
||||
"label": "3",
|
||||
}
|
||||
"KC_4": {
|
||||
"key": "EU_4",
|
||||
"label": "4",
|
||||
}
|
||||
"KC_5": {
|
||||
"key": "EU_5",
|
||||
"label": "5",
|
||||
}
|
||||
"KC_6": {
|
||||
"key": "EU_6",
|
||||
"label": "6",
|
||||
}
|
||||
"KC_7": {
|
||||
"key": "EU_7",
|
||||
"label": "7",
|
||||
}
|
||||
"KC_8": {
|
||||
"key": "EU_8",
|
||||
"label": "8",
|
||||
}
|
||||
"KC_9": {
|
||||
"key": "EU_9",
|
||||
"label": "9",
|
||||
}
|
||||
"KC_0": {
|
||||
"key": "EU_0",
|
||||
"label": "0",
|
||||
}
|
||||
"KC_MINS": {
|
||||
"key": "EU_MINS",
|
||||
"label": "-",
|
||||
}
|
||||
"KC_EQL": {
|
||||
"key": "EU_EQL",
|
||||
"label": "=",
|
||||
}
|
||||
"KC_Q": {
|
||||
"key": "EU_Q",
|
||||
"label": "Q",
|
||||
}
|
||||
"KC_W": {
|
||||
"key": "EU_W",
|
||||
"label": "W",
|
||||
}
|
||||
"KC_E": {
|
||||
"key": "EU_E",
|
||||
"label": "E",
|
||||
}
|
||||
"KC_R": {
|
||||
"key": "EU_R",
|
||||
"label": "R",
|
||||
}
|
||||
"KC_T": {
|
||||
"key": "EU_T",
|
||||
"label": "T",
|
||||
}
|
||||
"KC_Y": {
|
||||
"key": "EU_Y",
|
||||
"label": "Y",
|
||||
}
|
||||
"KC_U": {
|
||||
"key": "EU_U",
|
||||
"label": "U",
|
||||
}
|
||||
"KC_I": {
|
||||
"key": "EU_I",
|
||||
"label": "I",
|
||||
}
|
||||
"KC_O": {
|
||||
"key": "EU_O",
|
||||
"label": "O",
|
||||
}
|
||||
"KC_P": {
|
||||
"key": "EU_P",
|
||||
"label": "P",
|
||||
}
|
||||
"KC_LBRC": {
|
||||
"key": "EU_LBRC",
|
||||
"label": "[",
|
||||
}
|
||||
"KC_RBRC": {
|
||||
"key": "EU_RBRC",
|
||||
"label": "]",
|
||||
}
|
||||
"KC_BSLS": {
|
||||
"key": "EU_BSLS",
|
||||
"label": "\\",
|
||||
}
|
||||
"KC_A": {
|
||||
"key": "EU_A",
|
||||
"label": "A",
|
||||
}
|
||||
"KC_S": {
|
||||
"key": "EU_S",
|
||||
"label": "S",
|
||||
}
|
||||
"KC_D": {
|
||||
"key": "EU_D",
|
||||
"label": "D",
|
||||
}
|
||||
"KC_F": {
|
||||
"key": "EU_F",
|
||||
"label": "F",
|
||||
}
|
||||
"KC_G": {
|
||||
"key": "EU_G",
|
||||
"label": "G",
|
||||
}
|
||||
"KC_H": {
|
||||
"key": "EU_H",
|
||||
"label": "H",
|
||||
}
|
||||
"KC_J": {
|
||||
"key": "EU_J",
|
||||
"label": "J",
|
||||
}
|
||||
"KC_K": {
|
||||
"key": "EU_K",
|
||||
"label": "K",
|
||||
}
|
||||
"KC_L": {
|
||||
"key": "EU_L",
|
||||
"label": "L",
|
||||
}
|
||||
"KC_SCLN": {
|
||||
"key": "EU_SCLN",
|
||||
"label": ";",
|
||||
}
|
||||
"KC_QUOT": {
|
||||
"key": "EU_QUOT",
|
||||
"label": "'",
|
||||
}
|
||||
"KC_Z": {
|
||||
"key": "EU_Z",
|
||||
"label": "Z",
|
||||
}
|
||||
"KC_X": {
|
||||
"key": "EU_X",
|
||||
"label": "X",
|
||||
}
|
||||
"KC_C": {
|
||||
"key": "EU_C",
|
||||
"label": "C",
|
||||
}
|
||||
"KC_V": {
|
||||
"key": "EU_V",
|
||||
"label": "V",
|
||||
}
|
||||
"KC_B": {
|
||||
"key": "EU_B",
|
||||
"label": "B",
|
||||
}
|
||||
"KC_N": {
|
||||
"key": "EU_N",
|
||||
"label": "N",
|
||||
}
|
||||
"KC_M": {
|
||||
"key": "EU_M",
|
||||
"label": "M",
|
||||
}
|
||||
"KC_COMM": {
|
||||
"key": "EU_COMM",
|
||||
"label": ",",
|
||||
}
|
||||
"KC_DOT": {
|
||||
"key": "EU_DOT",
|
||||
"label": ".",
|
||||
}
|
||||
"KC_SLSH": {
|
||||
"key": "EU_SLSH",
|
||||
"label": "/",
|
||||
}
|
||||
/* Shifted symbols
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
* │ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + │ │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||
* │ │ │ │ │ │ │ │ │ │ │ │ { │ } │ | │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
|
||||
* │ │ │ │ │ │ │ │ │ │ │ : │ " │ │
|
||||
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
|
||||
* │ │ │ │ │ │ │ │ │ < │ > │ ? │ │
|
||||
* ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||
* │ │ │ │ │ │ │ │ │
|
||||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||
*/
|
||||
"S(EU_GRV)": {
|
||||
"key": "EU_TILD",
|
||||
"label": "~",
|
||||
}
|
||||
"S(EU_1)": {
|
||||
"key": "EU_EXLM",
|
||||
"label": "!",
|
||||
}
|
||||
"S(EU_2)": {
|
||||
"key": "EU_AT",
|
||||
"label": "@",
|
||||
}
|
||||
"S(EU_3)": {
|
||||
"key": "EU_HASH",
|
||||
"label": "#",
|
||||
}
|
||||
"S(EU_4)": {
|
||||
"key": "EU_DLR",
|
||||
"label": "$",
|
||||
}
|
||||
"S(EU_5)": {
|
||||
"key": "EU_PERC",
|
||||
"label": "%",
|
||||
}
|
||||
"S(EU_6)": {
|
||||
"key": "EU_CIRC",
|
||||
"label": "^",
|
||||
}
|
||||
"S(EU_7)": {
|
||||
"key": "EU_AMPR",
|
||||
"label": "&",
|
||||
}
|
||||
"S(EU_8)": {
|
||||
"key": "EU_ASTR",
|
||||
"label": "*",
|
||||
}
|
||||
"S(EU_9)": {
|
||||
"key": "EU_LPRN",
|
||||
"label": "(",
|
||||
}
|
||||
"S(EU_0)": {
|
||||
"key": "EU_RPRN",
|
||||
"label": ")",
|
||||
}
|
||||
"S(EU_MINS)": {
|
||||
"key": "EU_UNDS",
|
||||
"label": "_",
|
||||
}
|
||||
"S(EU_EQL)": {
|
||||
"key": "EU_PLUS",
|
||||
"label": "+",
|
||||
}
|
||||
"S(EU_LBRC)": {
|
||||
"key": "EU_LCBR",
|
||||
"label": "{",
|
||||
}
|
||||
"S(EU_RBRC)": {
|
||||
"key": "EU_RCBR",
|
||||
"label": "}",
|
||||
}
|
||||
"S(EU_BSLS)": {
|
||||
"key": "EU_PIPE",
|
||||
"label": "|",
|
||||
}
|
||||
"S(EU_SCLN)": {
|
||||
"key": "EU_COLN",
|
||||
"label": ":",
|
||||
}
|
||||
"S(EU_QUOT)": {
|
||||
"key": "EU_DQUO",
|
||||
"label": "\"",
|
||||
}
|
||||
"S(EU_COMM)": {
|
||||
"key": "EU_LABK",
|
||||
"label": "<",
|
||||
}
|
||||
"S(EU_DOT)": {
|
||||
"key": "EU_RABK",
|
||||
"label": ">",
|
||||
}
|
||||
"S(EU_SLSH)": {
|
||||
"key": "EU_QUES",
|
||||
"label": "?",
|
||||
}
|
||||
/* AltGr symbols
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
* │ ` │ ¡ │ ª │ º │ £ │ € │ ^ │ ˚ │ „ │ “ │ ” │ – │ × │ │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||
* │ │ æ │ å │ ë │ ý │ þ │ ÿ │ ü │ ï │ ö │ œ │ « │ » │ ¬ │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
|
||||
* │ │ ä │ ß │ ð │ è │ é │ ù │ ú │ ij │ ø │ ° │ ´ │ │
|
||||
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
|
||||
* │ │ à │ á │ ç │ ì │ í │ ñ │ μ │ ò │ ó │ ¿ │ │
|
||||
* ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||
* │ │ │ │ │ │ │ │ │
|
||||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||
*/
|
||||
"ALGR(EU_GRV)": {
|
||||
"key": "EU_DGRV",
|
||||
"label": "` (dead)",
|
||||
}
|
||||
"ALGR(EU_1)": {
|
||||
"key": "EU_IEXL",
|
||||
"label": "¡",
|
||||
}
|
||||
"ALGR(EU_2)": {
|
||||
"key": "EU_FORD",
|
||||
"label": "ª",
|
||||
}
|
||||
"ALGR(EU_3)": {
|
||||
"key": "EU_MORD",
|
||||
"label": "º",
|
||||
}
|
||||
"ALGR(EU_4)": {
|
||||
"key": "EU_PND",
|
||||
"label": "£",
|
||||
}
|
||||
"ALGR(EU_5)": {
|
||||
"key": "EU_EURO",
|
||||
"label": "€",
|
||||
}
|
||||
"ALGR(EU_6)": {
|
||||
"key": "EU_DCIR",
|
||||
"label": "^ (dead)",
|
||||
}
|
||||
"ALGR(EU_7)": {
|
||||
"key": "EU_RNGA",
|
||||
"label": "˚ (dead)",
|
||||
}
|
||||
"ALGR(EU_8)": {
|
||||
"key": "EU_DLQU",
|
||||
"label": "„",
|
||||
}
|
||||
"ALGR(EU_9)": {
|
||||
"key": "EU_LDQU",
|
||||
"label": "“",
|
||||
}
|
||||
"ALGR(EU_0)": {
|
||||
"key": "EU_RDQU",
|
||||
"label": "”",
|
||||
}
|
||||
"ALGR(EU_MINS)": {
|
||||
"key": "EU_NDSH",
|
||||
"label": "–",
|
||||
}
|
||||
"ALGR(EU_EQL)": {
|
||||
"key": "EU_MUL",
|
||||
"label": "×",
|
||||
}
|
||||
"ALGR(EU_Q)": {
|
||||
"key": "EU_AE",
|
||||
"label": "æ",
|
||||
}
|
||||
"ALGR(EU_W)": {
|
||||
"key": "EU_ARNG",
|
||||
"label": "Å",
|
||||
}
|
||||
"ALGR(EU_E)": {
|
||||
"key": "EU_EDIA",
|
||||
"label": "Ë",
|
||||
}
|
||||
"ALGR(EU_R)": {
|
||||
"key": "EU_YACU",
|
||||
"label": "Ý",
|
||||
}
|
||||
"ALGR(EU_T)": {
|
||||
"key": "EU_THRN",
|
||||
"label": "Þ",
|
||||
}
|
||||
"ALGR(EU_Y)": {
|
||||
"key": "EU_YDIA",
|
||||
"label": "Ÿ",
|
||||
}
|
||||
"ALGR(EU_U)": {
|
||||
"key": "EU_UDIA",
|
||||
"label": "Ü",
|
||||
}
|
||||
"ALGR(EU_I)": {
|
||||
"key": "EU_IDIA",
|
||||
"label": "Ï",
|
||||
}
|
||||
"ALGR(EU_O)": {
|
||||
"key": "EU_ODIA",
|
||||
"label": "Ö",
|
||||
}
|
||||
"ALGR(EU_P)": {
|
||||
"key": "EU_OE",
|
||||
"label": "Œ",
|
||||
}
|
||||
"ALGR(EU_LBRC)": {
|
||||
"key": "EU_LDAQ",
|
||||
"label": "«",
|
||||
}
|
||||
"ALGR(EU_RBRC)": {
|
||||
"key": "EU_RDAQ",
|
||||
"label": "»",
|
||||
}
|
||||
"ALGR(EU_BSLS)": {
|
||||
"key": "EU_NOT",
|
||||
"label": "¬",
|
||||
}
|
||||
"ALGR(EU_A)": {
|
||||
"key": "EU_ADIA",
|
||||
"label": "Ä",
|
||||
}
|
||||
"ALGR(EU_S)": {
|
||||
"key": "EU_SS",
|
||||
"label": "ß",
|
||||
}
|
||||
"ALGR(EU_D)": {
|
||||
"key": "EU_ETH",
|
||||
"label": "Ð",
|
||||
}
|
||||
"ALGR(EU_F)": {
|
||||
"key": "EU_EGRV",
|
||||
"label": "È",
|
||||
}
|
||||
"ALGR(EU_G)": {
|
||||
"key": "EU_EACU",
|
||||
"label": "É",
|
||||
}
|
||||
"ALGR(EU_H)": {
|
||||
"key": "EU_UGRV",
|
||||
"label": "Ù",
|
||||
}
|
||||
"ALGR(EU_J)": {
|
||||
"key": "EU_UACU",
|
||||
"label": "Ú",
|
||||
}
|
||||
"ALGR(EU_K)": {
|
||||
"key": "EU_IJ",
|
||||
"label": "IJ",
|
||||
}
|
||||
"ALGR(EU_L)": {
|
||||
"key": "EU_OSTR",
|
||||
"label": "Ø",
|
||||
}
|
||||
"ALGR(EU_SCLN)": {
|
||||
"key": "EU_DEG",
|
||||
"label": "°",
|
||||
}
|
||||
"ALGR(EU_QUOT)": {
|
||||
"key": "EU_ACUT",
|
||||
"label": "´ (dead)",
|
||||
}
|
||||
"ALGR(EU_Z)": {
|
||||
"key": "EU_AGRV",
|
||||
"label": "À",
|
||||
}
|
||||
"ALGR(EU_X)": {
|
||||
"key": "EU_AACU",
|
||||
"label": "Á",
|
||||
}
|
||||
"ALGR(EU_C)": {
|
||||
"key": "EU_CCED",
|
||||
"label": "Ç",
|
||||
}
|
||||
"ALGR(EU_V)": {
|
||||
"key": "EU_IGRV",
|
||||
"label": "Ì",
|
||||
}
|
||||
"ALGR(EU_B)": {
|
||||
"key": "EU_IACU",
|
||||
"label": "Í",
|
||||
}
|
||||
"ALGR(EU_N)": {
|
||||
"key": "EU_NTIL",
|
||||
"label": "Ñ",
|
||||
}
|
||||
"ALGR(EU_M)": {
|
||||
"key": "EU_DGRK",
|
||||
"label": "μ (dead Greek key)",
|
||||
}
|
||||
"ALGR(EU_COMM)": {
|
||||
"key": "EU_OGRV",
|
||||
"label": "Ò",
|
||||
}
|
||||
"ALGR(EU_DOT)": {
|
||||
"key": "EU_OACU",
|
||||
"label": "Ó",
|
||||
}
|
||||
"ALGR(EU_SLSH)": {
|
||||
"key": "EU_IQUE",
|
||||
"label": "¿",
|
||||
}
|
||||
/* Shift+AltGr symbols
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
* │ ~ │ ¹ │ ² │ ³ │ ¥ │ ¢ │ ˇ │ ¯ │ ‚ │ ‘ │ ’ │ — │ ÷ │ │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||
* │ │ │ │ │ │ │ │ │ │ │ │ ‹ │ › │ ¦ │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
|
||||
* │ │ │ § │ │ │ │ │ │ │ │ · │ ¨ │ │
|
||||
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
|
||||
* │ │ │ │ │ │ │ │ │ │ │ … │ │
|
||||
* ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||
* │ │ │ │ │ │ │ │ │
|
||||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||
*/
|
||||
"ALGR(EU_TILD)": {
|
||||
"key": "EU_DTIL",
|
||||
"label": "~ (dead)",
|
||||
}
|
||||
"S(ALGR(EU_1))": {
|
||||
"key": "EU_SUP1",
|
||||
"label": "¹",
|
||||
}
|
||||
"S(ALGR(EU_2))": {
|
||||
"key": "EU_SUP2",
|
||||
"label": "²",
|
||||
}
|
||||
"S(ALGR(EU_3))": {
|
||||
"key": "EU_SUP3",
|
||||
"label": "³",
|
||||
}
|
||||
"ALGR(EU_DLR)": {
|
||||
"key": "EU_YEN",
|
||||
"label": "¥",
|
||||
}
|
||||
"S(EU_EURO)": {
|
||||
"key": "EU_CENT",
|
||||
"label": "¢",
|
||||
}
|
||||
"S(EU_DCIR)": {
|
||||
"key": "EU_CARN",
|
||||
"label": "ˇ (dead)",
|
||||
}
|
||||
"S(ALGR(EU_7))": {
|
||||
"key": "EU_MACR",
|
||||
"label": "¯ (dead)",
|
||||
}
|
||||
"S(EU_DLQU)": {
|
||||
"key": "EU_SLQU",
|
||||
"label": "‚",
|
||||
}
|
||||
"S(EU_LDQU)": {
|
||||
"key": "EU_LSQU",
|
||||
"label": "‘",
|
||||
}
|
||||
"S(EU_RDQU)": {
|
||||
"key": "EU_RSQU",
|
||||
"label": "’",
|
||||
}
|
||||
"S(EU_NDSH)": {
|
||||
"key": "EU_MDSH",
|
||||
"label": "—",
|
||||
}
|
||||
"S(EU_MUL)": {
|
||||
"key": "EU_DIV",
|
||||
"label": "÷",
|
||||
}
|
||||
"S(EU_LDAQ)": {
|
||||
"key": "EU_LSAQ",
|
||||
"label": "‹",
|
||||
}
|
||||
"S(EU_RDAQ)": {
|
||||
"key": "EU_RSAQ",
|
||||
"label": "›",
|
||||
}
|
||||
"S(ALGR(EU_BSLS))": {
|
||||
"key": "EU_BRKP",
|
||||
"label": "¦",
|
||||
}
|
||||
"S(ALGR(EU_S))": {
|
||||
"key": "EU_SECT",
|
||||
"label": "§",
|
||||
}
|
||||
"S(ALGR(EU_SCLN))": {
|
||||
"key": "EU_MDDT",
|
||||
"label": "·",
|
||||
}
|
||||
"ALGR(EU_DQUO)": {
|
||||
"key": "EU_DIAE",
|
||||
"label": "¨ (dead)",
|
||||
}
|
||||
"ALGR(EU_QUES)": {
|
||||
"key": "EU_ELLP",
|
||||
"label": "…",
|
||||
}
|
||||
}
|
||||
}
|
@ -527,7 +527,7 @@
|
||||
"key": "FA_PIPE",
|
||||
"label": "|",
|
||||
}
|
||||
"ALGR(FA_RA)": {
|
||||
"ALGR(FA_RE)": {
|
||||
"key": "FA_SUBA",
|
||||
"label": "ٖ",
|
||||
}
|
||||
|
@ -1140,7 +1140,7 @@
|
||||
"0x00AE": {
|
||||
"group": "media",
|
||||
"key": "KC_MEDIA_PLAY_PAUSE",
|
||||
"label": "Mute",
|
||||
"label": "Play/Pause Track",
|
||||
"aliases": [
|
||||
"KC_MPLY"
|
||||
]
|
||||
|
@ -84,7 +84,7 @@
|
||||
"group": "midi",
|
||||
"key": "QK_MIDI_NOTE_G_SHARP_0",
|
||||
"aliases": [
|
||||
"MI_Gs"
|
||||
"MI_Gs",
|
||||
"MI_Ab"
|
||||
]
|
||||
},
|
||||
@ -99,7 +99,7 @@
|
||||
"group": "midi",
|
||||
"key": "QK_MIDI_NOTE_A_SHARP_0",
|
||||
"aliases": [
|
||||
"MI_As"
|
||||
"MI_As",
|
||||
"MI_Bb"
|
||||
]
|
||||
},
|
||||
|
@ -2,131 +2,131 @@
|
||||
"keycodes": {
|
||||
"0x7E00": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_0",
|
||||
"key": "QK_KB_0"
|
||||
},
|
||||
"0x7E01": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_1",
|
||||
"key": "QK_KB_1"
|
||||
},
|
||||
"0x7E02": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_2",
|
||||
"key": "QK_KB_2"
|
||||
},
|
||||
"0x7E03": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_3",
|
||||
"key": "QK_KB_3"
|
||||
},
|
||||
"0x7E04": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_4",
|
||||
"key": "QK_KB_4"
|
||||
},
|
||||
"0x7E05": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_5",
|
||||
"key": "QK_KB_5"
|
||||
},
|
||||
"0x7E06": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_6",
|
||||
"key": "QK_KB_6"
|
||||
},
|
||||
"0x7E07": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_7",
|
||||
"key": "QK_KB_7"
|
||||
},
|
||||
"0x7E08": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_8",
|
||||
"key": "QK_KB_8"
|
||||
},
|
||||
"0x7E09": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_9",
|
||||
"key": "QK_KB_9"
|
||||
},
|
||||
"0x7E0A": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_10",
|
||||
"key": "QK_KB_10"
|
||||
},
|
||||
"0x7E0B": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_11",
|
||||
"key": "QK_KB_11"
|
||||
},
|
||||
"0x7E0C": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_12",
|
||||
"key": "QK_KB_12"
|
||||
},
|
||||
"0x7E0D": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_13",
|
||||
"key": "QK_KB_13"
|
||||
},
|
||||
"0x7E0E": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_14",
|
||||
"key": "QK_KB_14"
|
||||
},
|
||||
"0x7E0F": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_15",
|
||||
"key": "QK_KB_15"
|
||||
},
|
||||
"0x7E10": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_16",
|
||||
"key": "QK_KB_16"
|
||||
},
|
||||
"0x7E11": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_17",
|
||||
"key": "QK_KB_17"
|
||||
},
|
||||
"0x7E12": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_18",
|
||||
"key": "QK_KB_18"
|
||||
},
|
||||
"0x7E13": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_19",
|
||||
"key": "QK_KB_19"
|
||||
},
|
||||
"0x7E14": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_20",
|
||||
"key": "QK_KB_20"
|
||||
},
|
||||
"0x7E15": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_21",
|
||||
"key": "QK_KB_21"
|
||||
},
|
||||
"0x7E16": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_22",
|
||||
"key": "QK_KB_22"
|
||||
},
|
||||
"0x7E17": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_23",
|
||||
"key": "QK_KB_23"
|
||||
},
|
||||
"0x7E18": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_24",
|
||||
"key": "QK_KB_24"
|
||||
},
|
||||
"0x7E19": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_25",
|
||||
"key": "QK_KB_25"
|
||||
},
|
||||
"0x7E1A": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_26",
|
||||
"key": "QK_KB_26"
|
||||
},
|
||||
"0x7E1B": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_27",
|
||||
"key": "QK_KB_27"
|
||||
},
|
||||
"0x7E1C": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_28",
|
||||
"key": "QK_KB_28"
|
||||
},
|
||||
"0x7E1D": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_29",
|
||||
"key": "QK_KB_29"
|
||||
},
|
||||
"0x7E1E": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_30",
|
||||
"key": "QK_KB_30"
|
||||
},
|
||||
"0x7E1F": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_31",
|
||||
},
|
||||
"key": "QK_KB_31"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -86,7 +86,7 @@
|
||||
"group": "midi",
|
||||
"key": "QK_MIDI_NOTE_G_SHARP_0",
|
||||
"aliases": [
|
||||
"MI_Gs"
|
||||
"MI_Gs",
|
||||
"MI_Ab"
|
||||
]
|
||||
},
|
||||
@ -101,7 +101,7 @@
|
||||
"group": "midi",
|
||||
"key": "QK_MIDI_NOTE_A_SHARP_0",
|
||||
"aliases": [
|
||||
"MI_As"
|
||||
"MI_As",
|
||||
"MI_Bb"
|
||||
]
|
||||
},
|
||||
|
@ -2,131 +2,131 @@
|
||||
"keycodes": {
|
||||
"0x7E40": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_0",
|
||||
"key": "QK_USER_0"
|
||||
},
|
||||
"0x7E41": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_1",
|
||||
"key": "QK_USER_1"
|
||||
},
|
||||
"0x7E42": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_2",
|
||||
"key": "QK_USER_2"
|
||||
},
|
||||
"0x7E43": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_3",
|
||||
"key": "QK_USER_3"
|
||||
},
|
||||
"0x7E44": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_4",
|
||||
"key": "QK_USER_4"
|
||||
},
|
||||
"0x7E45": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_5",
|
||||
"key": "QK_USER_5"
|
||||
},
|
||||
"0x7E46": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_6",
|
||||
"key": "QK_USER_6"
|
||||
},
|
||||
"0x7E47": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_7",
|
||||
"key": "QK_USER_7"
|
||||
},
|
||||
"0x7E48": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_8",
|
||||
"key": "QK_USER_8"
|
||||
},
|
||||
"0x7E49": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_9",
|
||||
"key": "QK_USER_9"
|
||||
},
|
||||
"0x7E4A": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_10",
|
||||
"key": "QK_USER_10"
|
||||
},
|
||||
"0x7E4B": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_11",
|
||||
"key": "QK_USER_11"
|
||||
},
|
||||
"0x7E4C": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_12",
|
||||
"key": "QK_USER_12"
|
||||
},
|
||||
"0x7E4D": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_13",
|
||||
"key": "QK_USER_13"
|
||||
},
|
||||
"0x7E4E": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_14",
|
||||
"key": "QK_USER_14"
|
||||
},
|
||||
"0x7E4F": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_15",
|
||||
"key": "QK_USER_15"
|
||||
},
|
||||
"0x7E50": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_16",
|
||||
"key": "QK_USER_16"
|
||||
},
|
||||
"0x7E51": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_17",
|
||||
"key": "QK_USER_17"
|
||||
},
|
||||
"0x7E52": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_18",
|
||||
"key": "QK_USER_18"
|
||||
},
|
||||
"0x7E53": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_19",
|
||||
"key": "QK_USER_19"
|
||||
},
|
||||
"0x7E54": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_20",
|
||||
"key": "QK_USER_20"
|
||||
},
|
||||
"0x7E55": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_21",
|
||||
"key": "QK_USER_21"
|
||||
},
|
||||
"0x7E56": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_22",
|
||||
"key": "QK_USER_22"
|
||||
},
|
||||
"0x7E57": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_23",
|
||||
"key": "QK_USER_23"
|
||||
},
|
||||
"0x7E58": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_24",
|
||||
"key": "QK_USER_24"
|
||||
},
|
||||
"0x7E59": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_25",
|
||||
"key": "QK_USER_25"
|
||||
},
|
||||
"0x7E5A": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_26",
|
||||
"key": "QK_USER_26"
|
||||
},
|
||||
"0x7E5B": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_27",
|
||||
"key": "QK_USER_27"
|
||||
},
|
||||
"0x7E5C": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_28",
|
||||
"key": "QK_USER_28"
|
||||
},
|
||||
"0x7E5D": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_29",
|
||||
"key": "QK_USER_29"
|
||||
},
|
||||
"0x7E5E": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_30",
|
||||
"key": "QK_USER_30"
|
||||
},
|
||||
"0x7E5F": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_31",
|
||||
},
|
||||
"key": "QK_USER_31"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,7 @@
|
||||
{
|
||||
"ranges": {
|
||||
"0x52E0/0x001F": {
|
||||
"define": "QK_PERSISTENT_DEF_LAYER"
|
||||
}
|
||||
}
|
||||
}
|
@ -7,41 +7,47 @@
|
||||
"keycodes": {
|
||||
"0x7780": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_NEXT",
|
||||
"key": "QK_OUTPUT_AUTO",
|
||||
"aliases": [
|
||||
"OU_NEXT",
|
||||
"OU_AUTO"
|
||||
]
|
||||
},
|
||||
"0x7781": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_NEXT",
|
||||
"aliases": [
|
||||
"OU_NEXT"
|
||||
]
|
||||
},
|
||||
"0x7782": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_PREV",
|
||||
"aliases": [
|
||||
"OU_PREV"
|
||||
]
|
||||
},
|
||||
"0x7782": {
|
||||
"0x7783": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_NONE",
|
||||
"aliases": [
|
||||
"OU_NONE"
|
||||
]
|
||||
},
|
||||
"0x7783": {
|
||||
"0x7784": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_USB",
|
||||
"aliases": [
|
||||
"OU_USB"
|
||||
]
|
||||
},
|
||||
"0x7784": {
|
||||
"0x7785": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_2P4GHZ",
|
||||
"aliases": [
|
||||
"OU_2P4G"
|
||||
]
|
||||
},
|
||||
"0x7785": {
|
||||
"0x7786": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_BLUETOOTH",
|
||||
"aliases": [
|
||||
|
@ -3,5 +3,12 @@
|
||||
"0x7C20": "!delete!", // old QK_OUTPUT_AUTO
|
||||
"0x7C21": "!delete!", // old QK_OUTPUT_USB
|
||||
"0x7C22": "!delete!", // old QK_OUTPUT_BLUETOOTH
|
||||
"0x7C7B": {
|
||||
"group": "quantum",
|
||||
"key": "QK_LAYER_LOCK",
|
||||
"aliases": [
|
||||
"QK_LLCK"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
7
data/constants/keycodes/keycodes_0.0.7.hjson
Normal file
7
data/constants/keycodes/keycodes_0.0.7.hjson
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"ranges": {
|
||||
"0x77C0/0x003F": {
|
||||
"define": "QK_COMMUNITY_MODULE"
|
||||
}
|
||||
}
|
||||
}
|
25
data/constants/module_hooks/0.1.0.hjson
Normal file
25
data/constants/module_hooks/0.1.0.hjson
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
keyboard_pre_init: {
|
||||
ret_type: void
|
||||
args: void
|
||||
}
|
||||
keyboard_post_init: {
|
||||
ret_type: void
|
||||
args: void
|
||||
}
|
||||
pre_process_record: {
|
||||
ret_type: bool
|
||||
args: uint16_t keycode, keyrecord_t *record
|
||||
call_params: keycode, record
|
||||
}
|
||||
process_record: {
|
||||
ret_type: bool
|
||||
args: uint16_t keycode, keyrecord_t *record
|
||||
call_params: keycode, record
|
||||
}
|
||||
post_process_record: {
|
||||
ret_type: void
|
||||
args: uint16_t keycode, keyrecord_t *record
|
||||
call_params: keycode, record
|
||||
}
|
||||
}
|
26
data/constants/module_hooks/1.0.0.hjson
Normal file
26
data/constants/module_hooks/1.0.0.hjson
Normal file
@ -0,0 +1,26 @@
|
||||
{
|
||||
housekeeping_task: {
|
||||
ret_type: void
|
||||
args: void
|
||||
}
|
||||
suspend_power_down: {
|
||||
ret_type: void
|
||||
args: void
|
||||
}
|
||||
suspend_wakeup_init: {
|
||||
ret_type: void
|
||||
args: void
|
||||
}
|
||||
shutdown: {
|
||||
ret_type: bool
|
||||
args: bool jump_to_bootloader
|
||||
call_params: jump_to_bootloader
|
||||
}
|
||||
process_detected_host_os: {
|
||||
ret_type: bool
|
||||
args: os_variant_t os
|
||||
call_params: os
|
||||
guard: defined(OS_DETECTION_ENABLE)
|
||||
header: os_detection.h
|
||||
}
|
||||
}
|
@ -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},
|
||||
|
||||
// Layer locking
|
||||
"LAYER_LOCK_IDLE_TIMEOUT": {"info_key": "layer_lock.timeout", "value_type": "int"},
|
||||
|
||||
// Indicators
|
||||
"LED_CAPS_LOCK_PIN": {"info_key": "indicators.caps_lock"},
|
||||
"LED_NUM_LOCK_PIN": {"info_key": "indicators.num_lock"},
|
||||
@ -197,6 +200,8 @@
|
||||
"SPLIT_WPM_ENABLE": {"info_key": "split.transport.sync.wpm", "value_type": "flag"},
|
||||
|
||||
// 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"},
|
||||
|
@ -53,7 +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}
|
||||
}
|
||||
|
@ -140,9 +140,15 @@
|
||||
"custommk/genesis": {
|
||||
"target": "custommk/genesis/rev1"
|
||||
},
|
||||
"cxt_studio":{
|
||||
"target":"cxt_studio/12e4"
|
||||
},
|
||||
"daisy": {
|
||||
"target": "ktec/daisy"
|
||||
},
|
||||
"deemen17/de60": {
|
||||
"target": "deemen17/de60/r1"
|
||||
},
|
||||
"dp3000": {
|
||||
"target": "dp3000/rev1"
|
||||
},
|
||||
@ -194,6 +200,9 @@
|
||||
"ergodone": {
|
||||
"target": "ktec/ergodone"
|
||||
},
|
||||
"ergodox_stm32": {
|
||||
"target": "handwired/ergodox_stm32"
|
||||
},
|
||||
"ergoinu": {
|
||||
"target": "dm9records/ergoinu"
|
||||
},
|
||||
@ -341,6 +350,9 @@
|
||||
"keycapsss/plaid_pad": {
|
||||
"target": "keycapsss/plaid_pad/rev1"
|
||||
},
|
||||
"keyten/kt60hs_t": {
|
||||
"target": "keyten/kt60hs_t/v1"
|
||||
},
|
||||
"kira75": {
|
||||
"target": "kira/kira75"
|
||||
},
|
||||
@ -575,6 +587,9 @@
|
||||
"ploopyco/trackball": {
|
||||
"target": "ploopyco/trackball/rev1_005"
|
||||
},
|
||||
"plywrks/ply8x": {
|
||||
"target": "plywrks/ply8x/solder"
|
||||
},
|
||||
"polilla": {
|
||||
"target": "polilla/rev1"
|
||||
},
|
||||
@ -1515,6 +1530,9 @@
|
||||
"ymd96": {
|
||||
"target": "ymdk/ymd96"
|
||||
},
|
||||
"ymdk/id75": {
|
||||
"target": "ymdk/id75/f103"
|
||||
},
|
||||
"ymdk_np21": {
|
||||
"target": "ymdk/np21"
|
||||
},
|
||||
@ -1552,5 +1570,687 @@
|
||||
},
|
||||
"dnworks/9973": {
|
||||
"target": "dnworks/tkl87"
|
||||
},
|
||||
// DEFAULT_FOLDER removed during 2025 Q1 cycle
|
||||
"0_sixty": {
|
||||
"target": "0_sixty/base"
|
||||
},
|
||||
"0xcb/splaytoraid": {
|
||||
"target": "0xcb/splaytoraid/rp2040_ce"
|
||||
},
|
||||
"1upkeyboards/pi40": {
|
||||
"target": "1upkeyboards/pi40/mit_v1_0"
|
||||
},
|
||||
"1upkeyboards/pi50": {
|
||||
"target": "1upkeyboards/pi50/grid"
|
||||
},
|
||||
"1upkeyboards/sweet16": {
|
||||
"target": "1upkeyboards/sweet16/v1"
|
||||
},
|
||||
"25keys/aleth42": {
|
||||
"target": "25keys/aleth42/rev1"
|
||||
},
|
||||
"25keys/zinc": {
|
||||
"target": "25keys/zinc/rev1"
|
||||
},
|
||||
"40percentclub/i75": {
|
||||
"target": "40percentclub/i75/promicro"
|
||||
},
|
||||
"40percentclub/polyandry": {
|
||||
"target": "40percentclub/polyandry/promicro"
|
||||
},
|
||||
"8pack": {
|
||||
"target": "8pack/rev12"
|
||||
},
|
||||
"adkb96": {
|
||||
"target": "adkb96/rev1"
|
||||
},
|
||||
"adm42": {
|
||||
"target": "adm42/rev4"
|
||||
},
|
||||
"aeboards/satellite": {
|
||||
"target": "aeboards/satellite/rev1"
|
||||
},
|
||||
"atreus": {
|
||||
"target": "atreus/astar"
|
||||
},
|
||||
"atreyu": {
|
||||
"target": "atreyu/rev1"
|
||||
},
|
||||
"biacco42/ergo42": {
|
||||
"target": "biacco42/ergo42/rev1"
|
||||
},
|
||||
"binepad/bn009": {
|
||||
"target": "binepad/bn009/r2"
|
||||
},
|
||||
"binepad/bnr1": {
|
||||
"target": "binepad/bnr1/v2"
|
||||
},
|
||||
"boston_meetup": {
|
||||
"target": "boston_meetup/2019"
|
||||
},
|
||||
"bpiphany/frosty_flake": {
|
||||
"target": "bpiphany/frosty_flake/20140521"
|
||||
},
|
||||
"buzzard": {
|
||||
"target": "buzzard/rev1"
|
||||
},
|
||||
"cannonkeys/db60": {
|
||||
"target": "cannonkeys/db60/rev2"
|
||||
},
|
||||
"clickety_split/leeloo": {
|
||||
"target": "clickety_split/leeloo/rev3"
|
||||
},
|
||||
"converter/palm_usb": {
|
||||
"target": "converter/palm_usb/stowaway"
|
||||
},
|
||||
"crkbd": {
|
||||
"target": "crkbd/rev1"
|
||||
},
|
||||
"dailycraft/bat43": {
|
||||
"target": "dailycraft/bat43/rev2"
|
||||
},
|
||||
"dailycraft/claw44": {
|
||||
"target": "dailycraft/claw44/rev1"
|
||||
},
|
||||
"dailycraft/sandbox": {
|
||||
"target": "dailycraft/sandbox/rev2"
|
||||
},
|
||||
"dailycraft/wings42": {
|
||||
"target": "dailycraft/wings42/rev2"
|
||||
},
|
||||
"delikeeb/vanana": {
|
||||
"target": "delikeeb/vanana/rev2"
|
||||
},
|
||||
"delikeeb/waaffle/rev3": {
|
||||
"target": "delikeeb/waaffle/rev3/pro_micro"
|
||||
},
|
||||
"deltasplit75": {
|
||||
"target": "deltasplit75/v2"
|
||||
},
|
||||
"drhigsby/ogurec": {
|
||||
"target": "drhigsby/ogurec/left_pm"
|
||||
},
|
||||
"duck/octagon": {
|
||||
"target": "duck/octagon/v2"
|
||||
},
|
||||
"duck/orion": {
|
||||
"target": "duck/orion/v3"
|
||||
},
|
||||
"ducky/one2mini": {
|
||||
"target": "ducky/one2mini/1861st"
|
||||
},
|
||||
"ducky/one2sf": {
|
||||
"target": "ducky/one2sf/1967st"
|
||||
},
|
||||
"dumbpad": {
|
||||
"target": "dumbpad/v0x"
|
||||
},
|
||||
"durgod/galaxy": {
|
||||
"target": "durgod/dgk6x/galaxy"
|
||||
},
|
||||
"durgod/venus": {
|
||||
"target": "durgod/dgk6x/venus"
|
||||
},
|
||||
"dztech/tofu/ii": {
|
||||
"target": "dztech/tofu/ii/v1"
|
||||
},
|
||||
"dztech/tofu/jr": {
|
||||
"target": "dztech/tofu/jr/v1"
|
||||
},
|
||||
"eco": {
|
||||
"target": "eco/rev2"
|
||||
},
|
||||
"ergoslab": {
|
||||
"target": "ergoslab/rev1"
|
||||
},
|
||||
"ergotravel": {
|
||||
"target": "ergotravel/rev1"
|
||||
},
|
||||
"evyd13/atom47": {
|
||||
"target": "evyd13/atom47/rev4"
|
||||
},
|
||||
"fortitude60": {
|
||||
"target": "fortitude60/rev1"
|
||||
},
|
||||
"fruitykeeb/fruitbar/r1": {
|
||||
"target": "fruitykeeb/fruitbar/r1/promicro"
|
||||
},
|
||||
"ghs/jem": {
|
||||
"target": "ghs/jem/soldered"
|
||||
},
|
||||
"hadron": {
|
||||
"target": "hadron/ver2"
|
||||
},
|
||||
"handwired/bento": {
|
||||
"target": "handwired/bento/rev1"
|
||||
},
|
||||
"handwired/dactyl_manuform/6x6": {
|
||||
"target": "handwired/dactyl_manuform/6x6/promicro"
|
||||
},
|
||||
"handwired/meck_tkl": {
|
||||
"target": "handwired/meck_tkl/blackpill_f401"
|
||||
},
|
||||
"handwired/ms_sculpt_mobile": {
|
||||
"target": "handwired/ms_sculpt_mobile/teensy2pp"
|
||||
},
|
||||
"handwired/onekey": {
|
||||
"target": "handwired/onekey/promicro"
|
||||
},
|
||||
"handwired/pill60": {
|
||||
"target": "handwired/pill60/bluepill"
|
||||
},
|
||||
"handwired/postageboard": {
|
||||
"target": "handwired/postageboard/mini"
|
||||
},
|
||||
"handwired/qc60": {
|
||||
"target": "handwired/qc60/proto"
|
||||
},
|
||||
"handwired/sono1": {
|
||||
"target": "handwired/sono1/t2pp"
|
||||
},
|
||||
"handwired/splittest": {
|
||||
"target": "handwired/splittest/promicro"
|
||||
},
|
||||
"handwired/stef9998/split_5x7": {
|
||||
"target": "handwired/stef9998/split_5x7/rev1"
|
||||
},
|
||||
"handwired/symmetric70_proto/promicro": {
|
||||
"target": "handwired/symmetric70_proto/promicro/base"
|
||||
},
|
||||
"handwired/symmetric70_proto/proton_c": {
|
||||
"target": "handwired/symmetric70_proto/proton_c/base"
|
||||
},
|
||||
"handwired/unk": {
|
||||
"target": "handwired/unk/rev1"
|
||||
},
|
||||
"handwired/xealous": {
|
||||
"target": "handwired/xealous/rev1"
|
||||
},
|
||||
"hillside/46": {
|
||||
"target": "hillside/46/0_1"
|
||||
},
|
||||
"hhkb/ansi": {
|
||||
"target": "hhkb/ansi/32u4"
|
||||
},
|
||||
"hillside/48": {
|
||||
"target": "hillside/48/0_1"
|
||||
},
|
||||
"hillside/52": {
|
||||
"target": "hillside/52/0_1"
|
||||
},
|
||||
"ibnuda/squiggle": {
|
||||
"target": "ibnuda/squiggle/rev1"
|
||||
},
|
||||
"idobao/id80/v1": {
|
||||
"target": "idobao/id80/v2/ansi"
|
||||
},
|
||||
"idobao/id80/v3": {
|
||||
"target": "idobao/id80/v3/ansi"
|
||||
},
|
||||
"inett_studio/sq80": {
|
||||
"target": "inett_studio/sq80/hotswap_layout_i"
|
||||
},
|
||||
"input_club/infinity60": {
|
||||
"target": "input_club/infinity60/led"
|
||||
},
|
||||
"jacky_studio/bear_65": {
|
||||
"target": "jacky_studio/bear_65/rev1"
|
||||
},
|
||||
"jacky_studio/piggy60/rev1": {
|
||||
"target": "jacky_studio/piggy60/rev1/solder"
|
||||
},
|
||||
"jadookb/jkb65": {
|
||||
"target": "jadookb/jkb65/r1"
|
||||
},
|
||||
"jian": {
|
||||
"target": "jian/rev2"
|
||||
},
|
||||
"jiran": {
|
||||
"target": "jiran/rev1"
|
||||
},
|
||||
"jorne": {
|
||||
"target": "jorne/rev1"
|
||||
},
|
||||
"junco": {
|
||||
"target": "junco/rev1"
|
||||
},
|
||||
"kakunpc/angel17": {
|
||||
"target": "kakunpc/angel17/rev1"
|
||||
},
|
||||
"kakunpc/angel64": {
|
||||
"target": "kakunpc/angel64/rev1"
|
||||
},
|
||||
"kakunpc/business_card": {
|
||||
"target": "kakunpc/business_card/beta"
|
||||
},
|
||||
"kakunpc/suihankey": {
|
||||
"target": "kakunpc/suihankey/rev1"
|
||||
},
|
||||
"kakunpc/suihankey/split": {
|
||||
"target": "kakunpc/suihankey/split/rev1"
|
||||
},
|
||||
"kapcave/paladinpad": {
|
||||
"target": "kapcave/paladinpad/rev2"
|
||||
},
|
||||
"kapl": {
|
||||
"target": "kapl/rev1"
|
||||
},
|
||||
"kbdfans/d45": {
|
||||
"target": "kbdfans/d45/v2"
|
||||
},
|
||||
"kbdfans/kbd75": {
|
||||
"target": "kbdfans/kbd75/rev1"
|
||||
},
|
||||
"keebio/bdn9": {
|
||||
"target": "keebio/bdn9/rev1"
|
||||
},
|
||||
"keebio/convolution": {
|
||||
"target": "keebio/convolution/rev1"
|
||||
},
|
||||
"keebio/foldkb": {
|
||||
"target": "keebio/foldkb/rev1"
|
||||
},
|
||||
"keebio/kbo5000": {
|
||||
"target": "keebio/kbo5000/rev1"
|
||||
},
|
||||
"keebio/levinson": {
|
||||
"target": "keebio/levinson/rev2"
|
||||
},
|
||||
"keebio/quefrency": {
|
||||
"target": "keebio/quefrency/rev1"
|
||||
},
|
||||
"keebio/rorschach": {
|
||||
"target": "keebio/rorschach/rev1"
|
||||
},
|
||||
"keebio/sinc": {
|
||||
"target": "keebio/sinc/rev1"
|
||||
},
|
||||
"keebio/viterbi": {
|
||||
"target": "keebio/viterbi/rev2"
|
||||
},
|
||||
"keycapsss/kimiko": {
|
||||
"target": "keycapsss/kimiko/rev2"
|
||||
},
|
||||
"keyhive/navi10": {
|
||||
"target": "keyhive/navi10/rev3"
|
||||
},
|
||||
"keyhive/uno": {
|
||||
"target": "keyhive/uno/rev1"
|
||||
},
|
||||
"kin80": {
|
||||
"target": "kin80/blackpill401"
|
||||
},
|
||||
"kumaokobo/kudox_full": {
|
||||
"target": "kumaokobo/kudox_full/rev1"
|
||||
},
|
||||
"kumaokobo/kudox_game": {
|
||||
"target": "kumaokobo/kudox_game/rev2"
|
||||
},
|
||||
"kumaokobo/kudox": {
|
||||
"target": "kumaokobo/kudox/rev3"
|
||||
},
|
||||
"kumaokobo/pico": {
|
||||
"target": "kumaokobo/pico/65keys"
|
||||
},
|
||||
"lazydesigners/dimple": {
|
||||
"target": "lazydesigners/dimple/staggered/rev1"
|
||||
},
|
||||
"lets_split": {
|
||||
"target": "lets_split/rev2"
|
||||
},
|
||||
"lfkeyboards/lfk87": {
|
||||
"target": "lfkeyboards/lfk78/revc"
|
||||
},
|
||||
"lily58": {
|
||||
"target": "lily58/rev1"
|
||||
},
|
||||
"lime": {
|
||||
"target": "lime/rev1"
|
||||
},
|
||||
"maple_computing/christmas_tree": {
|
||||
"target": "maple_computing/christmas_tree/v2017"
|
||||
},
|
||||
"maple_computing/ivy": {
|
||||
"target": "maple_computing/ivy/rev1"
|
||||
},
|
||||
"maple_computing/launchpad": {
|
||||
"target": "maple_computing/launchpad/rev1"
|
||||
},
|
||||
"maple_computing/minidox": {
|
||||
"target": "maple_computing/minidox/rev1"
|
||||
},
|
||||
"mariorion_v25": {
|
||||
"target": "mariorion_v25/prod"
|
||||
},
|
||||
"marksard/rhymestone": {
|
||||
"target": "marksard/rhymestone/rev1"
|
||||
},
|
||||
"marksard/treadstone32": {
|
||||
"target": "marksard/treadstone32/rev1"
|
||||
},
|
||||
"marksard/treadstone48": {
|
||||
"target": "marksard/treadstone48/rev1"
|
||||
},
|
||||
"maxipad": {
|
||||
"target": "maxipad/promicro"
|
||||
},
|
||||
"mechkeys/mechmini": {
|
||||
"target": "mechkeys/mechmini/v2"
|
||||
},
|
||||
"mechllama/g35": {
|
||||
"target": "mechllama/g35/v2"
|
||||
},
|
||||
"mechlovin/adelais": {
|
||||
"target": "mechlovin/adelais/standard_led/arm/rev2"
|
||||
},
|
||||
"mechlovin/adelais/standard_led/arm/rev4": {
|
||||
"target": "mechlovin/adelais/standard_led/arm/rev4/stm32f303"
|
||||
},
|
||||
"mechlovin/adelais/standard_led/arm": {
|
||||
"target": "mechlovin/adelais/standard_led/arm/rev2"
|
||||
},
|
||||
"mechlovin/adelais/standard_led/avr": {
|
||||
"target": "mechlovin/adelais/standard_led/avr/rev1"
|
||||
},
|
||||
"mechlovin/hannah65/rev1": {
|
||||
"target": "mechlovin/hannah65/rev1/haus"
|
||||
},
|
||||
"mechlovin/infinity87/rev1": {
|
||||
"target": "mechlovin/infinity87/rev1/standard"
|
||||
},
|
||||
"mechlovin/infinity87": {
|
||||
"target": "mechlovin/infinity87/rgb_rev1"
|
||||
},
|
||||
"mechlovin/mechlovin9": {
|
||||
"target": "mechlovin/mechlovin9/rev1"
|
||||
},
|
||||
"mechlovin/olly/jf": {
|
||||
"target": "mechlovin/olly/jf/rev1"
|
||||
},
|
||||
"mechlovin/zed1800": {
|
||||
"target": "mechlovin/zed1800/saber"
|
||||
},
|
||||
"mechlovin/zed65/no_backlight": {
|
||||
"target": "mechlovin/zed65/no_backlight/wearhaus66"
|
||||
},
|
||||
"mechlovin/zed65": {
|
||||
"target": "mechlovin/zed65/no_backlight/wearhaus66"
|
||||
},
|
||||
"mechwild/bde": {
|
||||
"target": "mechwild/bde/rev2"
|
||||
},
|
||||
"mechwild/mokulua": {
|
||||
"target": "mechwild/mokulua/standard"
|
||||
},
|
||||
"mechwild/obe/f401": {
|
||||
"target": "mechwild/obe/f401/base"
|
||||
},
|
||||
"mechwild/obe/f411": {
|
||||
"target": "mechwild/obe/f411/base"
|
||||
},
|
||||
"mechwild/obe": {
|
||||
"target": "mechwild/obe/f401/base"
|
||||
},
|
||||
"mechwild/waka60/f401": {
|
||||
"target": "mechwild/waka60/f401/base"
|
||||
},
|
||||
"mechwild/waka60/f411": {
|
||||
"target": "mechwild/waka60/f411/base"
|
||||
},
|
||||
"mechwild/waka60": {
|
||||
"target": "mechwild/waka60/f401/base"
|
||||
},
|
||||
"murcielago": {
|
||||
"target": "murcielago/rev1"
|
||||
},
|
||||
"nullbitsco/scramble": {
|
||||
"target": "nullbitsco/scramble/v2"
|
||||
},
|
||||
"omkbd/ergodash": {
|
||||
"target": "omkbd/ergodash/rev1"
|
||||
},
|
||||
"omkbd/runner3680": {
|
||||
"target": "omkbd/runner3680/5x8"
|
||||
},
|
||||
"orthodox": {
|
||||
"target": "orthodox/rev3"
|
||||
},
|
||||
"peej/rosaline": {
|
||||
"target": "peej/rosaline/staggered"
|
||||
},
|
||||
"peej/tripel": {
|
||||
"target": "peej/tripel/left"
|
||||
},
|
||||
"peranekofactory/tone": {
|
||||
"target": "peranekofactory/tone/rev2"
|
||||
},
|
||||
"phase_studio/titan65": {
|
||||
"target": "phase_studio/titan65/hotswap"
|
||||
},
|
||||
"pica40": {
|
||||
"target": "pica40/rev2"
|
||||
},
|
||||
"pinky": {
|
||||
"target": "pinky/3"
|
||||
},
|
||||
"ploopyco/madromys": {
|
||||
"target": "ploopyco/madromys/rev1_001"
|
||||
},
|
||||
"ploopyco/trackball_mini": {
|
||||
"target": "ploopyco/trackball_mini/rev1_001"
|
||||
},
|
||||
"ploopyco/trackball_nano": {
|
||||
"target": "ploopyco/trackball_nano/rev1_001"
|
||||
},
|
||||
"ploopyco/trackball_thumb": {
|
||||
"target": "ploopyco/trackball_thumb/rev1_001"
|
||||
},
|
||||
"primekb/meridian": {
|
||||
"target": "primekb/meridian/ktr1010"
|
||||
},
|
||||
"primekb/prime_e": {
|
||||
"target": "primekb/prime_e/std"
|
||||
},
|
||||
"program_yoink": {
|
||||
"target": "program_yoink/staggered"
|
||||
},
|
||||
"projectcain/vault35": {
|
||||
"target": "projectcain/vault35/atmega32u4"
|
||||
},
|
||||
"qpockets/space_space": {
|
||||
"target": "qpockets/space_space/rev2"
|
||||
},
|
||||
"qwertyydox": {
|
||||
"target": "qwertyydox/rev1"
|
||||
},
|
||||
"rate/pistachio": {
|
||||
"target": "rate/pistachio/rev2"
|
||||
},
|
||||
"recompile_keys/choco60": {
|
||||
"target": "recompile_keys/choco60/rev1"
|
||||
},
|
||||
"recompile_keys/nomu30": {
|
||||
"target": "recompile_keys/nomu30/rev1"
|
||||
},
|
||||
"redox/rev1": {
|
||||
"target": "redox/rev1/base"
|
||||
},
|
||||
"rgbkb/mun": {
|
||||
"target": "rgbkb/mun/rev1"
|
||||
},
|
||||
"rgbkb/sol3": {
|
||||
"target": "rgbkb/sol3/rev1"
|
||||
},
|
||||
"rgbkb/sol": {
|
||||
"target": "rgbkb/sol/rev2"
|
||||
},
|
||||
"rgbkb/zen": {
|
||||
"target": "rgbkb/zen/rev2"
|
||||
},
|
||||
"rgbkb/zygomorph": {
|
||||
"target": "rgbkb/zygomorph/rev1"
|
||||
},
|
||||
"rmi_kb/herringbone": {
|
||||
"target": "rmi_kb/herringbone/v1"
|
||||
},
|
||||
"rmi_kb/mona": {
|
||||
"target": "rmi_kb/mona/v1_1"
|
||||
},
|
||||
"rmi_kb/tkl_ff": {
|
||||
"target": "rmi_kb/tkl_ff/v1"
|
||||
},
|
||||
"rmi_kb/wete": {
|
||||
"target": "rmi_kb/wete/v2"
|
||||
},
|
||||
"rookiebwoy/late9": {
|
||||
"target": "rookiebwoy/late9/rev1"
|
||||
},
|
||||
"rookiebwoy/neopad": {
|
||||
"target": "rookiebwoy/neopad/rev1"
|
||||
},
|
||||
"rura66": {
|
||||
"target": "rura66/rev1"
|
||||
},
|
||||
"salicylic_acid3/7skb": {
|
||||
"target": "salicylic_acid3/7skb/rev1"
|
||||
},
|
||||
"salicylic_acid3/getta25": {
|
||||
"target": "salicylic_acid3/getta25/rev1"
|
||||
},
|
||||
"salicylic_acid3/jisplit89": {
|
||||
"target": "salicylic_acid3/jisplit89/rev1"
|
||||
},
|
||||
"salicylic_acid3/naked48": {
|
||||
"target": "salicylic_acid3/naked48/rev1"
|
||||
},
|
||||
"salicylic_acid3/naked60": {
|
||||
"target": "salicylic_acid3/naked60/rev1"
|
||||
},
|
||||
"salicylic_acid3/naked64": {
|
||||
"target": "salicylic_acid3/naked64/rev1"
|
||||
},
|
||||
"salicylic_acid3/setta21": {
|
||||
"target": "salicylic_acid3/setta21/rev1"
|
||||
},
|
||||
"sawnsprojects/okayu": {
|
||||
"target": "sawnsprojects/okayu/stm32f072"
|
||||
},
|
||||
"smoll/lefty": {
|
||||
"target": "smoll/lefty/rev2"
|
||||
},
|
||||
"sofle": {
|
||||
"target": "sofle/rev1"
|
||||
},
|
||||
"spaceholdings/nebula68b": {
|
||||
"target": "spaceholdings/nebula68b/solder"
|
||||
},
|
||||
"spacetime": {
|
||||
"target": "spacetime/rev1"
|
||||
},
|
||||
"splitkb/aurora/corne": {
|
||||
"target": "splitkb/aurora/corne/rev1"
|
||||
},
|
||||
"splitkb/aurora/helix": {
|
||||
"target": "splitkb/aurora/helix/rev1"
|
||||
},
|
||||
"splitkb/aurora/lily58": {
|
||||
"target": "splitkb/aurora/lily58/rev1"
|
||||
},
|
||||
"splitkb/aurora/sofle_v2": {
|
||||
"target": "splitkb/aurora/sofle_v2/rev1"
|
||||
},
|
||||
"splitkb/aurora/sweep": {
|
||||
"target": "splitkb/aurora/sweep/rev1"
|
||||
},
|
||||
"splitkb/kyria": {
|
||||
"target": "splitkb/kyria/rev3"
|
||||
},
|
||||
"splitkb/kyria/rev1": {
|
||||
"target": "splitkb/kyria/rev1/base"
|
||||
},
|
||||
"splitkb/kyria/rev2": {
|
||||
"target": "splitkb/kyria/rev2/base"
|
||||
},
|
||||
"splitty": {
|
||||
"target": "splitty/rev1"
|
||||
},
|
||||
"studiokestra/galatea": {
|
||||
"target": "studiokestra/galatea/rev1"
|
||||
},
|
||||
"takashiski/hecomi": {
|
||||
"target": "takashiski/hecomi/alpha"
|
||||
},
|
||||
"takashiski/namecard2x4": {
|
||||
"target": "takashiski/namecard2x4/rev2"
|
||||
},
|
||||
"teleport/native": {
|
||||
"target": "teleport/native/iso"
|
||||
},
|
||||
"themadnoodle/noodlepad": {
|
||||
"target": "themadnoodle/noodlepad/v1"
|
||||
},
|
||||
"tkw/grandiceps": {
|
||||
"target": "tkw/grandiceps/rev1"
|
||||
},
|
||||
"tominabox1/le_chiffre": {
|
||||
"target": "tominabox1/le_chiffre/rev1"
|
||||
},
|
||||
"tominabox1/littlefoot_lx": {
|
||||
"target": "tominabox1/littlefoot_lx/rev1"
|
||||
},
|
||||
"tominabox1/underscore33": {
|
||||
"target": "tominabox1/underscore33/rev1"
|
||||
},
|
||||
"trnthsn/e8ghty": {
|
||||
"target": "trnthsn/e8ghty/stm32f103"
|
||||
},
|
||||
"trnthsn/s6xty5neor2": {
|
||||
"target": "trnthsn/s6xty5neor2/stm32f103"
|
||||
},
|
||||
"tweetydabird/lotus58": {
|
||||
"target": "tweetydabird/lotus58/promicro"
|
||||
},
|
||||
"unison": {
|
||||
"target": "unison/v04"
|
||||
},
|
||||
"uzu42": {
|
||||
"target": "uzu42/rev1"
|
||||
},
|
||||
"vitamins_included": {
|
||||
"target": "vitamins_included/rev2"
|
||||
},
|
||||
"westm/westm68": {
|
||||
"target": "westm/westm68/rev2"
|
||||
},
|
||||
"westm/westm9": {
|
||||
"target": "westm/westm9/rev2"
|
||||
},
|
||||
"woodkeys/meira": {
|
||||
"target": "woodkeys/meira/promicro"
|
||||
},
|
||||
"work_louder/loop": {
|
||||
"target": "work_louder/loop/rev3"
|
||||
},
|
||||
"work_louder/work_board": {
|
||||
"target": "work_louder/work_board/rev3"
|
||||
},
|
||||
"yanghu/unicorne": {
|
||||
"target": "yanghu/unicorne/f411"
|
||||
},
|
||||
"yosino58": {
|
||||
"target": "yosino58/rev1"
|
||||
},
|
||||
"ymdk/yd60mq": {
|
||||
"target": "ymdk/yd60mq/12led"
|
||||
},
|
||||
"yushakobo/navpad/10": {
|
||||
"target": "yushakobo/navpad/10/rev1"
|
||||
},
|
||||
"yynmt/acperience12": {
|
||||
"target": "yynmt/acperience12/rev1"
|
||||
},
|
||||
"zsa/planck_ez": {
|
||||
"target": "zsa/planck_ez/base"
|
||||
}
|
||||
}
|
||||
|
18
data/schemas/community_module.jsonschema
Normal file
18
data/schemas/community_module.jsonschema
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema#",
|
||||
"$id": "qmk.community_module.v1",
|
||||
"title": "Community Module Information",
|
||||
"type": "object",
|
||||
"required": ["module_name", "maintainer"],
|
||||
"properties": {
|
||||
"module_name": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
||||
"maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
||||
"license": {"type": "string"},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"format": "uri"
|
||||
},
|
||||
"keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"},
|
||||
"features": {"$ref": "qmk.keyboard.v1#/definitions/features_config"}
|
||||
}
|
||||
}
|
@ -30,6 +30,11 @@
|
||||
"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",
|
||||
@ -92,6 +97,7 @@
|
||||
"GD32VF103",
|
||||
"WB32F3G71",
|
||||
"WB32FQ95",
|
||||
"AT32F415",
|
||||
"atmega16u2",
|
||||
"atmega32u2",
|
||||
"atmega16u4",
|
||||
@ -216,6 +222,7 @@
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"apm32-dfu",
|
||||
"at32-dfu",
|
||||
"atmel-dfu",
|
||||
"bootloadhid",
|
||||
"caterina",
|
||||
@ -312,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"}
|
||||
@ -326,11 +333,7 @@
|
||||
"enabled": {"type": "boolean"}
|
||||
}
|
||||
},
|
||||
"features": {
|
||||
"$ref": "qmk.definitions.v1#/boolean_array",
|
||||
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
|
||||
"not": {"required": ["lto"]}
|
||||
},
|
||||
"features": { "$ref": "#/definitions/features_config" },
|
||||
"indicators": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@ -351,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": [
|
||||
{
|
||||
@ -373,6 +376,12 @@
|
||||
}
|
||||
},
|
||||
"keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"},
|
||||
"layer_lock": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
}
|
||||
},
|
||||
"layout_aliases": {
|
||||
"type": "object",
|
||||
"additionalProperties": {"$ref": "qmk.definitions.v1#/layout_macro"}
|
||||
@ -414,7 +423,11 @@
|
||||
"h": {"$ref": "qmk.definitions.v1#/key_unit"},
|
||||
"w": {"$ref": "qmk.definitions.v1#/key_unit"},
|
||||
"x": {"$ref": "qmk.definitions.v1#/key_unit"},
|
||||
"y": {"$ref": "qmk.definitions.v1#/key_unit"}
|
||||
"y": {"$ref": "qmk.definitions.v1#/key_unit"},
|
||||
"hand": {
|
||||
"type": "string",
|
||||
"enum": ["L", "R", "*"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -455,6 +468,12 @@
|
||||
"rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"mouse_key": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@ -535,6 +554,7 @@
|
||||
"items": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["x", "y"],
|
||||
"properties": {
|
||||
"matrix": {
|
||||
"type": "array",
|
||||
@ -621,6 +641,7 @@
|
||||
"items": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["x", "y"],
|
||||
"properties": {
|
||||
"matrix": {
|
||||
"type": "array",
|
||||
@ -907,6 +928,7 @@
|
||||
"tapping": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"chordal_hold": {"type": "boolean"},
|
||||
"force_hold": {"type": "boolean"},
|
||||
"force_hold_per_key": {"type": "boolean"},
|
||||
"ignore_mod_tap_interrupt": {"type": "boolean"},
|
||||
|
@ -71,11 +71,12 @@
|
||||
"config": {"$ref": "qmk.keyboard.v1"},
|
||||
"notes": {
|
||||
"type": "string"
|
||||
},
|
||||
"modules": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"keyboard",
|
||||
"layout",
|
||||
"layers"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
@ -8,7 +8,7 @@
|
||||
],
|
||||
"properties": {
|
||||
"userspace_version": {
|
||||
"type": "string",
|
||||
},
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,7 @@
|
||||
{"$ref": "qmk.definitions.v1#/keyboard_keymap_tuple"},
|
||||
{"$ref": "qmk.definitions.v1#/json_file_path"}
|
||||
]
|
||||
},
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"userspace_version",
|
||||
|
@ -10,7 +10,7 @@
|
||||
{"$ref": "qmk.definitions.v1#/keyboard_keymap_env"},
|
||||
{"$ref": "qmk.definitions.v1#/json_file_path"}
|
||||
]
|
||||
},
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"userspace_version",
|
||||
|
@ -14,8 +14,6 @@
|
||||
},
|
||||
"features": {
|
||||
"bootmagic": true,
|
||||
"command": false,
|
||||
"console": false,
|
||||
"extrakey": true,
|
||||
"mousekey": true,
|
||||
"nkro": true
|
||||
|
122
docs/ChangeLog/20241124.md
Normal file
122
docs/ChangeLog/20241124.md
Normal file
@ -0,0 +1,122 @@
|
||||
# QMK Breaking Changes - 2024 November 24 Changelog
|
||||
|
||||
## Notable Features
|
||||
|
||||
November 2024 brings a relatively lightweight QMK release. As with previous cycles, almost all PRs were related to cleanup or re-organization of aspects of QMK.
|
||||
|
||||
One notable item is the removal of `arm_atsam` -- this affects users with `massdrop/ctrl` or `massdrop/alt` keyboards. These have no current replacement, but support for an alternative to the `arm_atsam` backend is nearing completion. Unfortunately the alternative backend didn't make this quarter's list of merges, so there's a temporary removal of these boards. Users who need to build for these targets should stay on the `0.26.x` version of QMK until these boards have been restored.
|
||||
|
||||
## Changes Requiring User Action
|
||||
|
||||
### Updated Keyboard Codebases
|
||||
|
||||
One note with updated keyboard names -- historical keyboard names are still considered valid when using [External Userspace](../newbs_external_userspace) for builds. If you're already using External Userspace, you do not need to move your keymap inside your repository.
|
||||
|
||||
| Old Keyboard Name | New Keyboard Name |
|
||||
|-------------------|-------------------------|
|
||||
| saevus/cor | concreteflowers/cor |
|
||||
| saevus/cor_tkl | concreteflowers/cor_tkl |
|
||||
|
||||
## Deprecation Notices
|
||||
|
||||
In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here.
|
||||
|
||||
### RGB Keycode Overhaul ([#23679](https://github.com/qmk/qmk_firmware/pull/23679), [#24484](https://github.com/qmk/qmk_firmware/pull/24484), [#24490](https://github.com/qmk/qmk_firmware/pull/24490))
|
||||
|
||||
RGB keycodes have been reworked to allow for both rgblight and rgb_matrix to coexist for the handful of boards in the repo with both enabled. Previously, `RGB_xxx` style keycodes were available, but now for rgblight we have `UG_xxx` (underglow), and `RM_xxx` for rgb_matrix. Default keymaps have been updated to reflect whichever system the respective board enables.
|
||||
|
||||
Longer-term, `RGB_xxx` style keycodes will be removed, but for now they act as if they're `UG_xxx`, and `UG_xxx` keycodes act upon both rgblight and rgb_matrix simultaneously. Put simply, the existing `RGB_xxx` keycodes act as they always have, giving users time to transition across to the new keycodes instead.
|
||||
|
||||
### ADNS9800 and PMW33xx sensor firmware ROM removal ([#24428](https://github.com/qmk/qmk_firmware/pull/24428))
|
||||
|
||||
Following on from the last Breaking Changes cycle, Binary blobs for optical sensors have been removed from the QMK codebase. Hooks allowing users to supply their own have been put in place; users wishing to source firmware blobs and integrate them into their keymap may do so. Doing so renders their firmware un-distributable due to licensing incompatibility with the GPL -- as such user firmware containing such blobs must not be distributed.
|
||||
|
||||
Please get in touch with the QMK team on Discord if your sensor is no longer functional.
|
||||
|
||||
## Full changelist
|
||||
|
||||
Core:
|
||||
* Refactor F4 ld files to use common files ([#18059](https://github.com/qmk/qmk_firmware/pull/18059))
|
||||
* Add LD7032 support to QP. ([#20828](https://github.com/qmk/qmk_firmware/pull/20828))
|
||||
* Add combo key repress feature ([#22858](https://github.com/qmk/qmk_firmware/pull/22858))
|
||||
* Add Layer Lock feature ([#23430](https://github.com/qmk/qmk_firmware/pull/23430))
|
||||
* Added MCU support for ArteryTek AT32F415 ([#23445](https://github.com/qmk/qmk_firmware/pull/23445))
|
||||
* Allow codegen of `keymap.json` => `keymap.c` without requiring layers/layout etc. ([#23451](https://github.com/qmk/qmk_firmware/pull/23451))
|
||||
* Separate RGBLight/RGB Matrix keycode handling ([#23679](https://github.com/qmk/qmk_firmware/pull/23679))
|
||||
* Allow for inverted SPI CS logic ([#23699](https://github.com/qmk/qmk_firmware/pull/23699))
|
||||
* Add timer_save and _restore functions. ([#23887](https://github.com/qmk/qmk_firmware/pull/23887))
|
||||
* Allow for `get_hardware_id()` to be used for serial number. ([#24053](https://github.com/qmk/qmk_firmware/pull/24053))
|
||||
* Segregrate keycode at pre-process record quantum ([#24194](https://github.com/qmk/qmk_firmware/pull/24194))
|
||||
* Add ability to poweroff ADNS5050 sensor ([#24223](https://github.com/qmk/qmk_firmware/pull/24223))
|
||||
* quantum: util: add bit and bitmask helpers ([#24229](https://github.com/qmk/qmk_firmware/pull/24229))
|
||||
* Add new connection keycodes for Bluetooth, 2.4GHz. ([#24251](https://github.com/qmk/qmk_firmware/pull/24251))
|
||||
* `usb_device_state`: consolidate usb state handling across implementations ([#24258](https://github.com/qmk/qmk_firmware/pull/24258))
|
||||
* Remove global k_rgb_matrix_split ([#24348](https://github.com/qmk/qmk_firmware/pull/24348))
|
||||
* util: uf2families: sync with upstream ([#24351](https://github.com/qmk/qmk_firmware/pull/24351))
|
||||
* [Maintenance] builddefs: common_rules: overhaul debug information generation ([#24352](https://github.com/qmk/qmk_firmware/pull/24352))
|
||||
* Add easier way to set default single layer ([#24376](https://github.com/qmk/qmk_firmware/pull/24376))
|
||||
* Tweak OS detect, add OS_DETECTION_SINGLE_REPORT ([#24379](https://github.com/qmk/qmk_firmware/pull/24379))
|
||||
* Reinstate global `k_rgb_matrix_split` ([#24388](https://github.com/qmk/qmk_firmware/pull/24388))
|
||||
* Bring supported STM32F4 configs in line with F4x1 ([#24413](https://github.com/qmk/qmk_firmware/pull/24413))
|
||||
* Extended wheel reports ([#24422](https://github.com/qmk/qmk_firmware/pull/24422))
|
||||
* Remove binary blobs from optical sensors. ([#24428](https://github.com/qmk/qmk_firmware/pull/24428))
|
||||
* Remove `STM32_PWM_USE_ADVANCED` references ([#24432](https://github.com/qmk/qmk_firmware/pull/24432))
|
||||
* Remove `RING_BUFFERED_6KRO_REPORT_ENABLE` due to disuse. ([#24433](https://github.com/qmk/qmk_firmware/pull/24433))
|
||||
* Move pointing device driver code ([#24445](https://github.com/qmk/qmk_firmware/pull/24445))
|
||||
* Add svlinky converter ([#24449](https://github.com/qmk/qmk_firmware/pull/24449))
|
||||
* Update combo user function variable ([#24467](https://github.com/qmk/qmk_firmware/pull/24467))
|
||||
* `qmk find`: expand operator support ([#24468](https://github.com/qmk/qmk_firmware/pull/24468))
|
||||
* Rename RGB and HSV structs ([#24471](https://github.com/qmk/qmk_firmware/pull/24471))
|
||||
* RGBLight: Improve RGB Test animation ([#24477](https://github.com/qmk/qmk_firmware/pull/24477))
|
||||
* Change default ARM hardware PWM WS2812 tick frequency to 800kHz ([#24508](https://github.com/qmk/qmk_firmware/pull/24508))
|
||||
* Add pointing tests ([#24513](https://github.com/qmk/qmk_firmware/pull/24513))
|
||||
* Joystick: add support for 8-way hat switch ([#24515](https://github.com/qmk/qmk_firmware/pull/24515))
|
||||
* Refactor Riverflow matrix effect with runner ([#24520](https://github.com/qmk/qmk_firmware/pull/24520))
|
||||
* Update Pixel Rain to respect LED range limits ([#24532](https://github.com/qmk/qmk_firmware/pull/24532))
|
||||
* Update Jellybean Raindrops to respect LED range limits ([#24534](https://github.com/qmk/qmk_firmware/pull/24534))
|
||||
* Refactor Breathing effect with runner ([#24535](https://github.com/qmk/qmk_firmware/pull/24535))
|
||||
* Refactor LED Breathing effect with runner ([#24540](https://github.com/qmk/qmk_firmware/pull/24540))
|
||||
* Expose rgb_matrix_update_pwm_buffers to be available in keymaps ([#24573](https://github.com/qmk/qmk_firmware/pull/24573))
|
||||
* Simple Python script to show polling rate ([#24622](https://github.com/qmk/qmk_firmware/pull/24622))
|
||||
* Add keycode PDF(layer) to set the default layer in EEPROM ([#24630](https://github.com/qmk/qmk_firmware/pull/24630))
|
||||
* Provide method to save a single default layer in the full range of 0-31 ([#24639](https://github.com/qmk/qmk_firmware/pull/24639))
|
||||
|
||||
CLI:
|
||||
* Refactor painter arguments to table instead of commandline ([#24456](https://github.com/qmk/qmk_firmware/pull/24456))
|
||||
* `qmk new-keyboard`: separate dev board and MCU selection ([#24548](https://github.com/qmk/qmk_firmware/pull/24548))
|
||||
* Bump minimum required Python version ([#24554](https://github.com/qmk/qmk_firmware/pull/24554))
|
||||
|
||||
Submodule updates:
|
||||
* Remove `arm_atsam` platform ([#24337](https://github.com/qmk/qmk_firmware/pull/24337))
|
||||
|
||||
Keyboards:
|
||||
* add ergodox Community Layout for LAYOUT_ergodox keyboards ([#22963](https://github.com/qmk/qmk_firmware/pull/22963))
|
||||
* Cutie Club Fidelity Layout Additions ([#23838](https://github.com/qmk/qmk_firmware/pull/23838))
|
||||
* Add Ploopyco functions for host state control ([#23953](https://github.com/qmk/qmk_firmware/pull/23953))
|
||||
* Corne rev4 ([#24084](https://github.com/qmk/qmk_firmware/pull/24084))
|
||||
* Rename saevus to concreteflowers ([#24249](https://github.com/qmk/qmk_firmware/pull/24249))
|
||||
* Remove `60_tsangan_hhkb` community layout ([#24355](https://github.com/qmk/qmk_firmware/pull/24355))
|
||||
* add USART configuration to config.h for PS/2 mouse support ([#24398](https://github.com/qmk/qmk_firmware/pull/24398))
|
||||
* Add SteelSeries Prime+ mouse ([#24408](https://github.com/qmk/qmk_firmware/pull/24408))
|
||||
* Rename RGB/HSV structs: keyboard-level code ([#24476](https://github.com/qmk/qmk_firmware/pull/24476))
|
||||
* xiudi/xd002: Remove broken oversized `multilayer_rgb` keymap ([#24480](https://github.com/qmk/qmk_firmware/pull/24480))
|
||||
* Update keycodes for keyboards with RGB Matrix ([#24484](https://github.com/qmk/qmk_firmware/pull/24484))
|
||||
* Cipulot Updates ([#24539](https://github.com/qmk/qmk_firmware/pull/24539))
|
||||
* Update keymaps to use PDF keycode ([#24633](https://github.com/qmk/qmk_firmware/pull/24633))
|
||||
* Remove keyboard use of eeconfig_read_default_layer ([#24635](https://github.com/qmk/qmk_firmware/pull/24635))
|
||||
|
||||
Keyboard fixes:
|
||||
* Fix rendering of `keymap_config.no_gui` within `led_update_kb` ([#24473](https://github.com/qmk/qmk_firmware/pull/24473))
|
||||
* Fix duplication of core `GU_TOGG` keycode ([#24474](https://github.com/qmk/qmk_firmware/pull/24474))
|
||||
* keebio/nyquist: Remove invalid I2C config ([#24479](https://github.com/qmk/qmk_firmware/pull/24479))
|
||||
* horrortroll/nyx/rev1: Fix compilation of custom RGB effect ([#24481](https://github.com/qmk/qmk_firmware/pull/24481))
|
||||
|
||||
Others:
|
||||
* Improve consistency of syntax within `data/constants/keycodes` ([#24528](https://github.com/qmk/qmk_firmware/pull/24528))
|
||||
|
||||
Bugs:
|
||||
* WS2812 API rework ([#24364](https://github.com/qmk/qmk_firmware/pull/24364))
|
||||
* Backward compatibility for new RGB keycode handling ([#24490](https://github.com/qmk/qmk_firmware/pull/24490))
|
||||
* Fix compiliation issues with OS Detection ([#24502](https://github.com/qmk/qmk_firmware/pull/24502))
|
||||
* Revert removal of `QK_OUTPUT_AUTO`, fixup docs to reflect. ([#24593](https://github.com/qmk/qmk_firmware/pull/24593))
|
||||
* Review fixes for layer lock feature ([#24627](https://github.com/qmk/qmk_firmware/pull/24627))
|
135
docs/ChangeLog/20250223.md
Normal file
135
docs/ChangeLog/20250223.md
Normal file
@ -0,0 +1,135 @@
|
||||
# QMK Breaking Changes - 2025 February 23 Changelog
|
||||
|
||||
## Notable Features
|
||||
|
||||
### Community Modules ([#24848](https://github.com/qmk/qmk_firmware/pull/24848))
|
||||
|
||||
Community Modules are a feature within QMK which allows code to be implemented by third parties, making it available for other people to import into their own builds.
|
||||
|
||||
These modules can provide implementations which override or enhance normal QMK processing; initialization, key processing, suspend, and shutdown are some of the provided hooks which modules may currently implement.
|
||||
|
||||
See the [Community Modules documentation](../features/community_modules) for more information, including the full list of available hooks.
|
||||
|
||||
First-class support for [External Userspace](../newbs_external_userspace) is included out of the box, so there's even more reason to take the plunge and convert your keymap builds to a userspace repository!
|
||||
|
||||
::: tip
|
||||
An example with a new keycode and some debugging information in the QMK repository [lives here](https://github.com/qmk/qmk_firmware/tree/master/modules/qmk/hello_world), and a community module port of [getreuer's SOCD Cleaner](https://getreuer.info/posts/keyboards/socd-cleaner/) can be found in [tzarc's modules repo](https://github.com/tzarc/qmk_modules).
|
||||
:::
|
||||
|
||||
### Chordal Hold ([#24560](https://github.com/qmk/qmk_firmware/pull/24560))
|
||||
|
||||
Chordal Hold implements, by default, an "opposite hands" rule. Suppose a tap-hold key is pressed and then, before the tapping term, another key is pressed. With Chordal Hold, the tap-hold key is settled as tapped if the two keys are on the same hand.
|
||||
|
||||
Chordal Hold may be useful to avoid accidental modifier activation with mod-taps, particularly in rolled keypresses when using home row mods.
|
||||
|
||||
See the [Chordal Hold documentation](../tap_hold#chordal-hold) for more information.
|
||||
|
||||
## Changes Requiring User Action
|
||||
|
||||
### Updated Keyboard Codebases
|
||||
|
||||
| Old Keyboard Name | New Keyboard Name |
|
||||
|-------------------------|-----------------------------|
|
||||
| cxt_studio | cxt_studio/12e4 |
|
||||
| ergodox_stm32 | handwired/ergodox_stm32 |
|
||||
| ploopyco/mouse | ploopyco/mouse/rev1_002 |
|
||||
| ploopyco/trackball/rev1 | ploopyco/trackball/rev1_004 |
|
||||
| ymdk/id75 | ymdk/id75/f103 |
|
||||
|
||||
## Deprecation Notices
|
||||
|
||||
In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here.
|
||||
|
||||
### DEFAULT_FOLDER removal ([#24836](https://github.com/qmk/qmk_firmware/pull/24836))
|
||||
|
||||
`DEFAULT_FOLDER` was originally introduced to work around limitations within the build system.
|
||||
Parent folders containing common configuration would create invalid build targets.
|
||||
|
||||
With the introduction of [`keyboard.json`](./20240526#keyboard-json) as a configuration file, the build system now has a consistent method to detect build targets.
|
||||
The `DEFAULT_FOLDER` functionality is now redundant and the intent is for `rules.mk` to become pure configuration.
|
||||
|
||||
Backwards compatibility of build targets has been maintained where possible.
|
||||
|
||||
## Full changelist
|
||||
|
||||
Core:
|
||||
* Chaining OSL and MO ([#23065](https://github.com/qmk/qmk_firmware/pull/23065))
|
||||
* Add extra keymap for EurKEY layout ([#24241](https://github.com/qmk/qmk_firmware/pull/24241))
|
||||
* Add leader_add_user callback ([#24266](https://github.com/qmk/qmk_firmware/pull/24266))
|
||||
* always return audio pin to 0 on ARM ([#24503](https://github.com/qmk/qmk_firmware/pull/24503))
|
||||
* Update Starlight matrix effects ([#24521](https://github.com/qmk/qmk_firmware/pull/24521))
|
||||
* Refactor Hue Breathing matrix effect with runner ([#24525](https://github.com/qmk/qmk_firmware/pull/24525))
|
||||
* Ensure timer_read() is safe to call from interrupt handlers on ARM ([#24529](https://github.com/qmk/qmk_firmware/pull/24529))
|
||||
* Update Raindrops effect to respect LED range limits ([#24531](https://github.com/qmk/qmk_firmware/pull/24531))
|
||||
* Add Chordal Hold, an "opposite hands rule" tap-hold option similar to Achordion, Bilateral Combinations. ([#24560](https://github.com/qmk/qmk_firmware/pull/24560))
|
||||
* Azoteq - improve I2C behaviour while polling. ([#24611](https://github.com/qmk/qmk_firmware/pull/24611))
|
||||
* macOS install: remove bad ARM toolchains ([#24637](https://github.com/qmk/qmk_firmware/pull/24637))
|
||||
* small refactoring of TIMER_DIFF ([#24678](https://github.com/qmk/qmk_firmware/pull/24678))
|
||||
* Subscript alef correction ([#24707](https://github.com/qmk/qmk_firmware/pull/24707))
|
||||
* Created SH1107 driver for quantum painter ([#24724](https://github.com/qmk/qmk_firmware/pull/24724))
|
||||
* [CI] Regenerate Files ([#24772](https://github.com/qmk/qmk_firmware/pull/24772))
|
||||
* Patch up issue for inverted complementary output on Backlight ([#24794](https://github.com/qmk/qmk_firmware/pull/24794))
|
||||
* Patch up issue when compile with APA102 driver ([#24800](https://github.com/qmk/qmk_firmware/pull/24800))
|
||||
* Consolidate send_string implementations. ([#24817](https://github.com/qmk/qmk_firmware/pull/24817))
|
||||
* Consolidate timer_elapsed implementations ([#24830](https://github.com/qmk/qmk_firmware/pull/24830))
|
||||
* `i2c_master`: remove deprecated functions ([#24832](https://github.com/qmk/qmk_firmware/pull/24832))
|
||||
* Resolve keyboard_aliases when processing keyboard make targets ([#24834](https://github.com/qmk/qmk_firmware/pull/24834))
|
||||
* LED drivers: remove deprecated defines ([#24837](https://github.com/qmk/qmk_firmware/pull/24837))
|
||||
* `ferris/0_1`: update I2C API usage ([#24839](https://github.com/qmk/qmk_firmware/pull/24839))
|
||||
* Unify i2c_master headers ([#24846](https://github.com/qmk/qmk_firmware/pull/24846))
|
||||
* Community modules ([#24848](https://github.com/qmk/qmk_firmware/pull/24848))
|
||||
* Relocate base WS2812 code ([#24850](https://github.com/qmk/qmk_firmware/pull/24850))
|
||||
* Unify UART headers ([#24855](https://github.com/qmk/qmk_firmware/pull/24855))
|
||||
* Unify spi_master headers ([#24857](https://github.com/qmk/qmk_firmware/pull/24857))
|
||||
* Invoke `process_record_via` after `_user`/`_kb` have a chance to handle it. ([#24879](https://github.com/qmk/qmk_firmware/pull/24879))
|
||||
|
||||
CLI:
|
||||
* Extend lint to reject 'blank' files ([#23994](https://github.com/qmk/qmk_firmware/pull/23994))
|
||||
* `qmk docs`: restore `--port` and `--browser` arguments ([#24623](https://github.com/qmk/qmk_firmware/pull/24623))
|
||||
* Update via2json layout macro searching ([#24640](https://github.com/qmk/qmk_firmware/pull/24640))
|
||||
* Change `new-keymap` keymap name prompt ([#24701](https://github.com/qmk/qmk_firmware/pull/24701))
|
||||
* default_keyboard.h generation tweaks ([#24715](https://github.com/qmk/qmk_firmware/pull/24715))
|
||||
* Ensure `qmk flash` rejects invalid files for uf2 compatible bootloaders ([#24802](https://github.com/qmk/qmk_firmware/pull/24802))
|
||||
* Reject readme dummy content ([#24913](https://github.com/qmk/qmk_firmware/pull/24913))
|
||||
|
||||
Submodule updates:
|
||||
* chibios: usb_main: remove OTG sof workaround ([#24259](https://github.com/qmk/qmk_firmware/pull/24259))
|
||||
* Update ChibiOS to latest stable branch. ([#24651](https://github.com/qmk/qmk_firmware/pull/24651))
|
||||
* Update ChibiOS `stable_21.11.x`. ([#24714](https://github.com/qmk/qmk_firmware/pull/24714))
|
||||
* Update ChibiOS-Contrib. ([#24803](https://github.com/qmk/qmk_firmware/pull/24803))
|
||||
|
||||
Keyboards:
|
||||
* refactor: move ymdk/id75 to revision ([#24590](https://github.com/qmk/qmk_firmware/pull/24590))
|
||||
* skyloong/gk61: Remove overriding of core keycode behaviour ([#24655](https://github.com/qmk/qmk_firmware/pull/24655))
|
||||
* moky/moky88: Remove use of deprecated defines ([#24656](https://github.com/qmk/qmk_firmware/pull/24656))
|
||||
* Updating Promenade keyboard (Missing keys in matrix, other minor changes to keymap) ([#24705](https://github.com/qmk/qmk_firmware/pull/24705))
|
||||
* Moving cxt_studio keyboard to own folder ([#24748](https://github.com/qmk/qmk_firmware/pull/24748))
|
||||
* Add CXT Studio 12E3 keyboard ([#24749](https://github.com/qmk/qmk_firmware/pull/24749))
|
||||
* Add Silakka54 keyboard ([#24757](https://github.com/qmk/qmk_firmware/pull/24757))
|
||||
* Add more layout for skiller_sgk50_s4 ([#24784](https://github.com/qmk/qmk_firmware/pull/24784))
|
||||
* Add watchdog service to RGBKB Sol 3 ([#24786](https://github.com/qmk/qmk_firmware/pull/24786))
|
||||
* Migrate some DEFAULT_FOLDER to keyboard_aliases.hjson ([#24835](https://github.com/qmk/qmk_firmware/pull/24835))
|
||||
* Remove DEFAULT_FOLDER where keyboard aliases already exists ([#24838](https://github.com/qmk/qmk_firmware/pull/24838))
|
||||
* Migrate some DEFAULT_FOLDER to keyboard_aliases.hjson ([#24845](https://github.com/qmk/qmk_firmware/pull/24845))
|
||||
* Update for 'A-JAZZ AKC084' ('A-JAZZ AKP846') ([#24868](https://github.com/qmk/qmk_firmware/pull/24868))
|
||||
* handwired/xealous - Remove DEFAULT_FOLDER ([#24877](https://github.com/qmk/qmk_firmware/pull/24877))
|
||||
* Updates to Ploopy Classic, Mouse, and Thumb for RP2040 hardware upgrade ([#24880](https://github.com/qmk/qmk_firmware/pull/24880))
|
||||
* Move Ergodox STM32 to handwired folder ([#24903](https://github.com/qmk/qmk_firmware/pull/24903))
|
||||
* Remove readme dummy content ([#24912](https://github.com/qmk/qmk_firmware/pull/24912))
|
||||
* Migrate some DEFAULT_FOLDER to keyboard_aliases.hjson ([#24915](https://github.com/qmk/qmk_firmware/pull/24915))
|
||||
* Migrate some DEFAULT_FOLDER to keyboard_aliases.hjson ([#24938](https://github.com/qmk/qmk_firmware/pull/24938))
|
||||
|
||||
Keyboard fixes:
|
||||
* Fix up CI with `DEFAULT_FOLDER`. ([#24842](https://github.com/qmk/qmk_firmware/pull/24842))
|
||||
* rgbkb/pan - Remove invalid build target ([#24844](https://github.com/qmk/qmk_firmware/pull/24844))
|
||||
|
||||
Others:
|
||||
* Formally deprecate DEFAULT_FOLDER ([#24836](https://github.com/qmk/qmk_firmware/pull/24836))
|
||||
* Correct I2C API reference ([#24840](https://github.com/qmk/qmk_firmware/pull/24840))
|
||||
|
||||
Bugs:
|
||||
* Retro Tapping Re-Write; Key Roll Fix ([#23641](https://github.com/qmk/qmk_firmware/pull/23641))
|
||||
* Fix Quantum Painter compiliation issues with heavy optimization ([#24667](https://github.com/qmk/qmk_firmware/pull/24667))
|
||||
* Bugfix and update for AT32F415 ([#24807](https://github.com/qmk/qmk_firmware/pull/24807))
|
||||
* Fix for Chordal Hold: stuck mods when mod-taps are pressed in a stuttered sequence. ([#24878](https://github.com/qmk/qmk_firmware/pull/24878))
|
||||
* fix EEPROM driver for STM32L0/1 cat.1 devices ([#24928](https://github.com/qmk/qmk_firmware/pull/24928))
|
@ -16,6 +16,8 @@
|
||||
"/tutorial": "/newbs",
|
||||
"/unicode": "/feature_unicode",
|
||||
|
||||
"/features/bluetooth": "/features/wireless",
|
||||
|
||||
"/adc_driver": "/drivers/adc",
|
||||
"/apa102_driver": "/drivers/apa102",
|
||||
"/audio_driver": "/drivers/audio",
|
||||
@ -24,7 +26,7 @@
|
||||
"/feature_auto_shift": "/features/auto_shift",
|
||||
"/feature_autocorrect": "/features/autocorrect",
|
||||
"/feature_backlight": "/features/backlight",
|
||||
"/feature_bluetooth": "/features/bluetooth",
|
||||
"/feature_bluetooth": "/features/wireless",
|
||||
"/feature_bootmagic": "/features/bootmagic",
|
||||
"/feature_caps_word": "/features/caps_word",
|
||||
"/feature_combo": "/features/combo",
|
||||
|
@ -21,7 +21,8 @@
|
||||
{ "text": "Debugging QMK", "link": "/faq_debug" },
|
||||
{ "text": "Keymap FAQ", "link": "/faq_keymap" },
|
||||
{ "text": "Squeezing Space from AVR", "link": "/squeezing_avr" },
|
||||
{ "text": "Glossary", "link": "/reference_glossary" }
|
||||
{ "text": "Glossary", "link": "/reference_glossary" },
|
||||
{ "text": "License Violations", "link": "/license_violations" }
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -59,6 +60,7 @@
|
||||
"items": [
|
||||
{ "text": "Customizing Functionality", "link": "/custom_quantum_functions" },
|
||||
{ "text": "Driver Installation with Zadig", "link": "/driver_installation_zadig" },
|
||||
{ "text": "Community Modules", "link": "/features/community_modules" },
|
||||
{ "text": "Keymap Overview", "link": "/keymap" },
|
||||
{
|
||||
"text": "Development Environments",
|
||||
@ -123,6 +125,7 @@
|
||||
{ "text": "Key Lock", "link": "/features/key_lock" },
|
||||
{ "text": "Key Overrides", "link": "/features/key_overrides" },
|
||||
{ "text": "Layers", "link": "/feature_layers" },
|
||||
{ "text": "Layer Lock", "link": "/features/layer_lock" },
|
||||
{ "text": "One Shot Keys", "link": "/one_shot_keys" },
|
||||
{ "text": "OS Detection", "link": "/features/os_detection" },
|
||||
{ "text": "Raw HID", "link": "/features/rawhid" },
|
||||
@ -166,7 +169,6 @@
|
||||
]
|
||||
},
|
||||
{ "text": "Audio", "link": "/features/audio" },
|
||||
{ "text": "Bluetooth", "link": "/features/bluetooth" },
|
||||
{ "text": "Bootmagic", "link": "/features/bootmagic" },
|
||||
{ "text": "Converters", "link": "/feature_converters" },
|
||||
{ "text": "Custom Matrix", "link": "/custom_matrix" },
|
||||
@ -179,7 +181,8 @@
|
||||
{ "text": "Pointing Device", "link": "/features/pointing_device" },
|
||||
{ "text": "PS/2 Mouse", "link": "/features/ps2_mouse" },
|
||||
{ "text": "Split Keyboard", "link": "/features/split_keyboard" },
|
||||
{ "text": "Stenography", "link": "/features/stenography" }
|
||||
{ "text": "Stenography", "link": "/features/stenography" },
|
||||
{ "text": "Wireless", "link": "/features/wireless" }
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -204,7 +207,7 @@
|
||||
{ "text": "My Pull Request Was Flagged", "link": "/breaking_changes_instructions" },
|
||||
{
|
||||
"text": "Most Recent ChangeLog",
|
||||
"link": "/ChangeLog/20240825"
|
||||
"link": "/ChangeLog/20250223"
|
||||
},
|
||||
{ "text": "Past Breaking Changes", "link": "/breaking_changes_history" },
|
||||
{ "text": "Deprecation Policy", "link": "/support_deprecation_policy" }
|
||||
@ -224,6 +227,7 @@
|
||||
{ "text": "ADC Driver", "link": "/drivers/adc" },
|
||||
{ "text": "APA102 Driver", "link": "/drivers/apa102" },
|
||||
{ "text": "Audio Driver", "link": "/drivers/audio" },
|
||||
{ "text": "Battery Driver", "link": "/drivers/battery" },
|
||||
{ "text": "EEPROM Driver", "link": "/drivers/eeprom" },
|
||||
{ "text": "Flash Driver", "link": "/drivers/flash" },
|
||||
{ "text": "I2C Driver", "link": "/drivers/i2c" },
|
||||
|
@ -4,7 +4,7 @@ This page attempts to introduce developers to the QMK Compiler. It does not go i
|
||||
|
||||
# Overview
|
||||
|
||||
The QMK Compile API consists of a few movings parts:
|
||||
The QMK Compile API consists of a few moving parts:
|
||||
|
||||

|
||||
|
||||
|
@ -10,25 +10,25 @@ Practically, this means QMK merges the `develop` branch into the `master` branch
|
||||
|
||||
## What has been included in past Breaking Changes?
|
||||
|
||||
* [2025 Feb 23](ChangeLog/20250223)
|
||||
* [2024 Nov 24](ChangeLog/20241124)
|
||||
* [2024 Aug 25](ChangeLog/20240825)
|
||||
* [2024 May 26](ChangeLog/20240526)
|
||||
* [2024 Feb 25](ChangeLog/20240225)
|
||||
* [Older Breaking Changes](breaking_changes_history)
|
||||
|
||||
## When is the next Breaking Change?
|
||||
|
||||
The next Breaking Change is scheduled for November 24, 2024.
|
||||
The next Breaking Change is scheduled for May 25, 2025.
|
||||
|
||||
### Important Dates
|
||||
|
||||
* 2024 Aug 25 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
|
||||
* 2024 Oct 27 - `develop` closed to new PRs.
|
||||
* 2024 Oct 27 - Call for testers.
|
||||
* 2024 Nov 10 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
||||
* 2024 Nov 17 - `develop` is locked, only critical bugfix PRs merged.
|
||||
* 2024 Nov 22 - `master` is locked, no PRs merged.
|
||||
* 2024 Nov 24 - Merge `develop` to `master`.
|
||||
* 2024 Nov 24 - `master` is unlocked. PRs can be merged again.
|
||||
* 2025 Feb 23 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
|
||||
* 2025 Apr 27 - `develop` closed to new PRs.
|
||||
* 2025 Apr 27 - Call for testers.
|
||||
* 2025 May 11 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
||||
* 2025 May 18 - `develop` is locked, only critical bugfix PRs merged.
|
||||
* 2025 May 23 - `master` is locked, no PRs merged.
|
||||
* 2025 May 25 - Merge `develop` to `master`.
|
||||
* 2025 May 25 - `master` is unlocked. PRs can be merged again.
|
||||
|
||||
## What changes will be included?
|
||||
|
||||
|
@ -2,6 +2,8 @@
|
||||
|
||||
This page links to all previous changelogs from the QMK Breaking Changes process.
|
||||
|
||||
* [2025 Feb 23](ChangeLog/20250223) - version 0.28.0
|
||||
* [2024 Nov 24](ChangeLog/20241124) - version 0.27.0
|
||||
* [2024 Aug 25](ChangeLog/20240825) - version 0.26.0
|
||||
* [2024 May 26](ChangeLog/20240526) - version 0.25.0
|
||||
* [2024 Feb 25](ChangeLog/20240225) - version 0.24.0
|
||||
|
@ -6,7 +6,7 @@ The QMK CLI (command line interface) makes building and working with QMK keyboar
|
||||
|
||||
### Requirements {#requirements}
|
||||
|
||||
QMK requires Python 3.7 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt). These are installed automatically when you install the QMK CLI.
|
||||
QMK requires Python 3.9 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt). These are installed automatically when you install the QMK CLI.
|
||||
|
||||
### Install Using Homebrew (macOS, some Linux) {#install-using-homebrew}
|
||||
|
||||
@ -20,7 +20,7 @@ qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build
|
||||
|
||||
### Install Using pip {#install-using-easy_install-or-pip}
|
||||
|
||||
If your system is not listed above you can install QMK manually. First ensure that you have Python 3.7 (or later) installed and have installed pip. Then install QMK with this command:
|
||||
If your system is not listed above you can install QMK manually. First ensure that you have Python 3.9 (or later) installed and have installed pip. Then install QMK with this command:
|
||||
|
||||
```
|
||||
python3 -m pip install qmk
|
||||
|
@ -153,20 +153,26 @@ qmk cd
|
||||
|
||||
This command allows for searching through keyboard/keymap targets, filtering by specific criteria. `info.json` and `rules.mk` files contribute to the search data, as well as keymap configurations, and the results can be filtered using "dotty" syntax matching the overall `info.json` file format.
|
||||
|
||||
For example, one could search for all keyboards using STM32F411:
|
||||
For example, one could search for all keyboards powered by the STM32F411 microcontroller:
|
||||
|
||||
```
|
||||
qmk find -f 'processor=STM32F411'
|
||||
qmk find -f 'processor==STM32F411'
|
||||
```
|
||||
|
||||
...and one can further constrain the list to keyboards using STM32F411 as well as rgb_matrix support:
|
||||
The list can be further constrained by passing additional filter expressions:
|
||||
|
||||
```
|
||||
qmk find -f 'processor=STM32F411' -f 'features.rgb_matrix=true'
|
||||
qmk find -f 'processor==STM32F411' -f 'features.rgb_matrix==true'
|
||||
```
|
||||
|
||||
The following filter expressions are also supported:
|
||||
The following filter expressions are supported:
|
||||
|
||||
- `key == value`: Match targets where `key` is equal to `value`. May include wildcards such as `*` and `?`.
|
||||
- `key != value`: Match targets where `key` is not `value`. May include wildcards such as `*` and `?`.
|
||||
- `key < value`: Match targets where `key` is a number less than `value`.
|
||||
- `key > value`: Match targets where `key` is a number greater than `value`.
|
||||
- `key <= value`: Match targets where `key` is a number less than or equal to `value`.
|
||||
- `key >= value`: Match targets where `key` is a number greater than or equal to `value`.
|
||||
- `exists(key)`: Match targets where `key` is present.
|
||||
- `absent(key)`: Match targets where `key` is not present.
|
||||
- `contains(key, value)`: Match targets where `key` contains `value`. Can be used for strings, arrays and object keys.
|
||||
@ -175,7 +181,7 @@ The following filter expressions are also supported:
|
||||
You can also list arbitrary values for each matched target with `--print`:
|
||||
|
||||
```
|
||||
qmk find -f 'processor=STM32F411' -p 'keyboard_name' -p 'features.rgb_matrix'
|
||||
qmk find -f 'processor==STM32F411' -p 'keyboard_name' -p 'features.rgb_matrix'
|
||||
```
|
||||
|
||||
**Usage**:
|
||||
@ -717,23 +723,26 @@ Now open your dev environment and live a squiggly-free life.
|
||||
|
||||
## `qmk docs`
|
||||
|
||||
This command starts a local HTTP server which you can use for browsing or improving the docs. Default port is 5173.
|
||||
This command starts a local HTTP server which you can use for browsing or improving the docs, and provides live reload capability whilst editing. Default port is 8936.
|
||||
Use the `-b`/`--browser` flag to automatically open the local webserver in your default browser.
|
||||
|
||||
This command requires `node` and `yarn` to be installed as prerequisites, and provides live reload capability whilst editing.
|
||||
Requires `node` and `yarn` to be installed as prerequisites.
|
||||
|
||||
**Usage**:
|
||||
|
||||
```
|
||||
usage: qmk docs [-h]
|
||||
usage: qmk docs [-h] [-b] [-p PORT]
|
||||
|
||||
options:
|
||||
-h, --help show this help message and exit
|
||||
-h, --help show this help message and exit
|
||||
-b, --browser Open the docs in the default browser.
|
||||
-p, --port PORT Port number to use.
|
||||
```
|
||||
|
||||
## `qmk generate-docs`
|
||||
|
||||
This command allows you to generate QMK documentation locally. It can be uses for general browsing or improving the docs.
|
||||
Use the `-s`/`--serve` flag to also serve the static site once built. Default port is 4173.
|
||||
This command generates QMK documentation for production.
|
||||
Use the `-s`/`--serve` flag to also serve the static site on port 4173 once built. Note that this does not provide live reloading; use `qmk docs` instead for development purposes.
|
||||
|
||||
This command requires `node` and `yarn` to be installed as prerequisites, and requires the operating system to support symlinks.
|
||||
|
||||
|
@ -44,7 +44,7 @@ def hello(cli):
|
||||
|
||||
First we import the `cli` object from `milc`. This is how we interact with the user and control the script's behavior. We use `@cli.argument()` to define a command line flag, `--name`. This also creates a configuration variable named `hello.name` (and the corresponding `user.name`) which the user can set so they don't have to specify the argument. The `cli.subcommand()` decorator designates this function as a subcommand. The name of the subcommand will be taken from the name of the function.
|
||||
|
||||
Once inside our function we find a typical "Hello, World!" program. We use `cli.log` to access the underlying [Logger Object](https://docs.python.org/3.7/library/logging.html#logger-objects), whose behavior is user controllable. We also access the value for name supplied by the user as `cli.config.hello.name`. The value for `cli.config.hello.name` will be determined by looking at the `--name` argument supplied by the user, if not provided it will use the value in the `qmk.ini` config file, and if neither of those is provided it will fall back to the default supplied in the `cli.argument()` decorator.
|
||||
Once inside our function we find a typical "Hello, World!" program. We use `cli.log` to access the underlying [Logger Object](https://docs.python.org/3.9/library/logging.html#logger-objects), whose behavior is user controllable. We also access the value for name supplied by the user as `cli.config.hello.name`. The value for `cli.config.hello.name` will be determined by looking at the `--name` argument supplied by the user, if not provided it will use the value in the `qmk.ini` config file, and if neither of those is provided it will fall back to the default supplied in the `cli.argument()` decorator.
|
||||
|
||||
# User Interaction
|
||||
|
||||
@ -56,13 +56,13 @@ There are two main methods for outputting text in a subcommand- `cli.log` and `c
|
||||
|
||||
You can use special tokens to colorize your text, to make it easier to understand the output of your program. See [Colorizing Text](#colorizing-text) below.
|
||||
|
||||
Both of these methods support built-in string formatting using python's [printf style string format operations](https://docs.python.org/3.7/library/stdtypes.html#old-string-formatting). You can use tokens such as `%s` and `%d` within your text strings then pass the values as arguments. See our Hello, World program above for an example.
|
||||
Both of these methods support built-in string formatting using python's [printf style string format operations](https://docs.python.org/3.9/library/stdtypes.html#old-string-formatting). You can use tokens such as `%s` and `%d` within your text strings then pass the values as arguments. See our Hello, World program above for an example.
|
||||
|
||||
You should never use the format operator (`%`) directly, always pass values as arguments.
|
||||
|
||||
### Logging (`cli.log`)
|
||||
|
||||
The `cli.log` object gives you access to a [Logger Object](https://docs.python.org/3.7/library/logging.html#logger-objects). We have configured our log output to show the user a nice emoji for each log level (or the log level name if their terminal does not support unicode.) This way the user can tell at a glance which messages are most important when something goes wrong.
|
||||
The `cli.log` object gives you access to a [Logger Object](https://docs.python.org/3.9/library/logging.html#logger-objects). We have configured our log output to show the user a nice emoji for each log level (or the log level name if their terminal does not support unicode.) This way the user can tell at a glance which messages are most important when something goes wrong.
|
||||
|
||||
The default log level is `INFO`. If the user runs `qmk -v <subcommand>` the default log level will be set to `DEBUG`.
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
Most of our style follows PEP8 with some local modifications to make things less nit-picky.
|
||||
|
||||
* We target Python 3.7 for compatibility with all supported platforms.
|
||||
* We target Python 3.9 for compatibility with all supported platforms.
|
||||
* We indent using four (4) spaces (soft tabs)
|
||||
* We encourage liberal use of comments
|
||||
* Think of them as a story describing the feature
|
||||
@ -317,7 +317,7 @@ At the time of this writing our tests are not very comprehensive. Looking at the
|
||||
|
||||
## Integration Tests
|
||||
|
||||
Integration tests can be found in `lib/python/qmk/tests/test_cli_commands.py`. This is where CLI commands are actually run and their overall behavior is verified. We use [`subprocess`](https://docs.python.org/3.7/library/subprocess.html#module-subprocess) to launch each CLI command and a combination of checking output and returncode to determine if the right thing happened.
|
||||
Integration tests can be found in `lib/python/qmk/tests/test_cli_commands.py`. This is where CLI commands are actually run and their overall behavior is verified. We use [`subprocess`](https://docs.python.org/3.9/library/subprocess.html#module-subprocess) to launch each CLI command and a combination of checking output and returncode to determine if the right thing happened.
|
||||
|
||||
## Unit Tests
|
||||
|
||||
|
@ -57,6 +57,10 @@ You can also use any ARM chip with USB that [ChibiOS](https://www.chibios.org) s
|
||||
* [WB32F3G71xx](http://www.westberrytech.com)
|
||||
* [WB32FQ95xx](http://www.westberrytech.com)
|
||||
|
||||
### Artery (AT32)
|
||||
|
||||
* [AT32F415](https://www.arterychip.com/en/product/AT32F415.jsp)
|
||||
|
||||
### NXP (Kinetis)
|
||||
|
||||
* [MKL26Z64](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/kl-series-cortex-m0-plus/kinetis-kl2x-72-96-mhz-usb-ultra-low-power-microcontrollers-mcus-based-on-arm-cortex-m0-plus-core:KL2x)
|
||||
|
@ -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`
|
||||
|
@ -54,7 +54,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
|
||||
|
||||
[1] = LAYOUT_all(
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, BL_TOGG, BL_DOWN, BL_UP,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, UG_TOGG, UG_NEXT, UG_HUED, UG_HUEU, UG_SATD, UG_SATU, UG_VALD, UG_VALU, BL_TOGG, BL_DOWN, BL_UP,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MNXT, KC_VOLD,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
@ -82,7 +82,7 @@ The default keymap uses the `LAYOUT_all` macro, so that will be the value of the
|
||||
"KC_LCTL", "KC_LGUI", "KC_LALT", "KC_SPC", "KC_RALT", "MO(1)", "KC_RGUI", "KC_RCTL", "KC_LEFT", "KC_DOWN", "KC_RGHT"
|
||||
],
|
||||
[
|
||||
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_TOG", "RGB_MOD", "RGB_HUD", "RGB_HUI", "RGB_SAD", "RGB_SAI", "RGB_VAD", "RGB_VAI", "BL_TOGG", "BL_DOWN", "BL_UP",
|
||||
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "UG_TOGG", "UG_NEXT", "UG_HUED", "UG_HUEU", "UG_SATD", "UG_SATU", "UG_VALD", "UG_VALU", "BL_TOGG", "BL_DOWN", "BL_UP",
|
||||
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_VOLU",
|
||||
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "QK_BOOT", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_MPLY", "KC_MNXT", "KC_VOLD",
|
||||
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS",
|
||||
|
@ -106,10 +106,10 @@ enum my_keycodes {
|
||||
Before opening a pull request, you can preview your changes if you have set up the development environment by running this command from the `qmk_firmware/` folder:
|
||||
|
||||
```
|
||||
qmk docs
|
||||
qmk docs -b
|
||||
```
|
||||
|
||||
and navigating to `http://localhost:5173/`.
|
||||
Which should automatically open your browser; otherwise, navigate to `http://localhost:8936/`.
|
||||
|
||||
## Keyboards
|
||||
|
||||
|
@ -9,12 +9,19 @@ This page does not assume any special knowledge about QMK, but reading [Understa
|
||||
We have structured QMK as a hierarchy:
|
||||
|
||||
* Core (`_quantum`)
|
||||
* Community Module (`_<module>`)
|
||||
* Community Module -> Keyboard/Revision (`_<module>_kb`)
|
||||
* Community Module -> Keymap (`_<module>_user`)
|
||||
* Keyboard/Revision (`_kb`)
|
||||
* Keymap (`_user`)
|
||||
|
||||
Each of the functions described below can be defined with a `_kb()` suffix or a `_user()` suffix. We intend for you to use the `_kb()` suffix at the Keyboard/Revision level, while the `_user()` suffix should be used at the Keymap level.
|
||||
|
||||
When defining functions at the Keyboard/Revision level it is important that your `_kb()` implementation call `_user()` before executing anything else- otherwise the keymap level function will never be called.
|
||||
When defining functions at the Keyboard/Revision level it is important that your `_kb()` implementation call `_user()` at an appropriate location, otherwise the keymap level function will never be called.
|
||||
|
||||
Functions at the `_<module>_xxx()` level are intended to allow keyboards or keymaps to override or enhance the processing associated with a [community module](/features/community_modules).
|
||||
|
||||
When defining module overrides such as `process_record_<module>()`, the same pattern should be used; the module must invoke `process_record_<module>_kb()` as appropriate.
|
||||
|
||||
# Custom Keycodes
|
||||
|
||||
@ -99,7 +106,7 @@ These are the three main initialization functions, listed in the order that they
|
||||
* `keyboard_post_init_*` - Happens at the end of the firmware's startup process. This is where you'd want to put "customization" code, for the most part.
|
||||
|
||||
::: warning
|
||||
For most people, the `keyboard_post_init_user` function is what you want to call. For instance, this is where you want to set up things for RGB Underglow.
|
||||
For most people, the `keyboard_post_init_user` function is what you want to implement. For instance, this is where you want to set up things for RGB Underglow.
|
||||
:::
|
||||
|
||||
## Keyboard Pre Initialization code
|
||||
|
@ -98,6 +98,7 @@ The device name here is the name that appears in Zadig, and may not be what the
|
||||
|`bootloadhid` |HIDBoot |`16C0:05DF` |HidUsb |
|
||||
|`usbasploader`|USBasp |`16C0:05DC` |libusbK|
|
||||
|`apm32-dfu` |APM32 DFU ISP Mode |`314B:0106` |WinUSB |
|
||||
|`at32-dfu` |AT32 Bootloader DFU |`2E3C:DF11` |WinUSB |
|
||||
|`stm32-dfu` |STM32 BOOTLOADER |`0483:DF11` |WinUSB |
|
||||
|`gd32v-dfu` |GD32V BOOTLOADER |`28E9:0189` |WinUSB |
|
||||
|`kiibohd` |Kiibohd DFU Bootloader |`1C11:B007` |WinUSB |
|
||||
|
@ -57,27 +57,32 @@ This driver needs one Timer per enabled/used DAC channel, to trigger conversion;
|
||||
|
||||
Additionally, in the board config, you'll want to make changes to enable the DACs, GPT for Timers 6, 7 and 8:
|
||||
|
||||
```c
|
||||
//halconf.h:
|
||||
#define HAL_USE_DAC TRUE
|
||||
#define HAL_USE_GPT TRUE
|
||||
::: code-group
|
||||
```c [halconf.h]
|
||||
#pragma once
|
||||
|
||||
#define HAL_USE_DAC TRUE // [!code focus]
|
||||
#define HAL_USE_GPT TRUE // [!code focus]
|
||||
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
```c [mcuconf.h]
|
||||
#pragma once
|
||||
|
||||
```c
|
||||
// mcuconf.h:
|
||||
#include_next <mcuconf.h>
|
||||
#undef STM32_DAC_USE_DAC1_CH1
|
||||
#define STM32_DAC_USE_DAC1_CH1 TRUE
|
||||
#undef STM32_DAC_USE_DAC1_CH2
|
||||
#define STM32_DAC_USE_DAC1_CH2 TRUE
|
||||
#undef STM32_GPT_USE_TIM6
|
||||
#define STM32_GPT_USE_TIM6 TRUE
|
||||
#undef STM32_GPT_USE_TIM7
|
||||
#define STM32_GPT_USE_TIM7 TRUE
|
||||
#undef STM32_GPT_USE_TIM8
|
||||
#define STM32_GPT_USE_TIM8 TRUE
|
||||
|
||||
#undef STM32_DAC_USE_DAC1_CH1 // [!code focus]
|
||||
#define STM32_DAC_USE_DAC1_CH1 TRUE // [!code focus]
|
||||
#undef STM32_DAC_USE_DAC1_CH2 // [!code focus]
|
||||
#define STM32_DAC_USE_DAC1_CH2 TRUE // [!code focus]
|
||||
#undef STM32_GPT_USE_TIM6 // [!code focus]
|
||||
#define STM32_GPT_USE_TIM6 TRUE // [!code focus]
|
||||
#undef STM32_GPT_USE_TIM7 // [!code focus]
|
||||
#define STM32_GPT_USE_TIM7 TRUE // [!code focus]
|
||||
#undef STM32_GPT_USE_TIM8 // [!code focus]
|
||||
#define STM32_GPT_USE_TIM8 TRUE // [!code focus]
|
||||
```
|
||||
:::
|
||||
|
||||
::: tip
|
||||
Note: DAC1 (A4) uses TIM6, DAC2 (A5) uses TIM7, and the audio state timer uses TIM8 (configurable).
|
||||
@ -95,23 +100,28 @@ only needs one timer (GPTD6, Tim6) to trigger the DAC unit to do a conversion; t
|
||||
|
||||
Additionally, in the board config, you'll want to make changes to enable the DACs, GPT for Timer 6:
|
||||
|
||||
```c
|
||||
//halconf.h:
|
||||
#define HAL_USE_DAC TRUE
|
||||
#define HAL_USE_GPT TRUE
|
||||
::: code-group
|
||||
```c [halconf.h]
|
||||
#pragma once
|
||||
|
||||
#define HAL_USE_DAC TRUE // [!code focus]
|
||||
#define HAL_USE_GPT TRUE // [!code focus]
|
||||
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
```c [mcuconf.h]
|
||||
#pragma once
|
||||
|
||||
```c
|
||||
// mcuconf.h:
|
||||
#include_next <mcuconf.h>
|
||||
#undef STM32_DAC_USE_DAC1_CH1
|
||||
#define STM32_DAC_USE_DAC1_CH1 TRUE
|
||||
#undef STM32_DAC_USE_DAC1_CH2
|
||||
#define STM32_DAC_USE_DAC1_CH2 TRUE
|
||||
#undef STM32_GPT_USE_TIM6
|
||||
#define STM32_GPT_USE_TIM6 TRUE
|
||||
|
||||
#undef STM32_DAC_USE_DAC1_CH1 // [!code focus]
|
||||
#define STM32_DAC_USE_DAC1_CH1 TRUE // [!code focus]
|
||||
#undef STM32_DAC_USE_DAC1_CH2 // [!code focus]
|
||||
#define STM32_DAC_USE_DAC1_CH2 TRUE // [!code focus]
|
||||
#undef STM32_GPT_USE_TIM6 // [!code focus]
|
||||
#define STM32_GPT_USE_TIM6 TRUE // [!code focus]
|
||||
```
|
||||
:::
|
||||
|
||||
### DAC Config
|
||||
|
||||
@ -170,19 +180,25 @@ This driver uses the ChibiOS-PWM system to produce a square-wave on specific out
|
||||
The hardware directly toggles the pin via its alternate function. See your MCU's data-sheet for which pin can be driven by what timer - looking for TIMx_CHy and the corresponding alternate function.
|
||||
|
||||
A configuration example for the STM32F103C8 would be:
|
||||
```c
|
||||
//halconf.h:
|
||||
#define HAL_USE_PWM TRUE
|
||||
#define HAL_USE_PAL TRUE
|
||||
|
||||
::: code-group
|
||||
```c [halconf.h]
|
||||
#pragma once
|
||||
|
||||
#define HAL_USE_PWM TRUE // [!code focus]
|
||||
#define HAL_USE_PAL TRUE // [!code focus]
|
||||
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
```c [mcuconf.h]
|
||||
#pragma once
|
||||
|
||||
```c
|
||||
// mcuconf.h:
|
||||
#include_next <mcuconf.h>
|
||||
#undef STM32_PWM_USE_TIM1
|
||||
#define STM32_PWM_USE_TIM1 TRUE
|
||||
|
||||
#undef STM32_PWM_USE_TIM1 // [!code focus]
|
||||
#define STM32_PWM_USE_TIM1 TRUE // [!code focus]
|
||||
```
|
||||
:::
|
||||
|
||||
If we now target pin A8, looking through the data-sheet of the STM32F103C8, for the timers and alternate functions
|
||||
- TIM1_CH1 = PA8 <- alternate0
|
||||
|
51
docs/drivers/battery.md
Normal file
51
docs/drivers/battery.md
Normal file
@ -0,0 +1,51 @@
|
||||
# Battery Driver
|
||||
|
||||
This driver provides support for sampling battery level.
|
||||
|
||||
## Usage
|
||||
|
||||
To use this driver, add the following to your `rules.mk`:
|
||||
|
||||
```make
|
||||
BATTERY_DRIVER_REQUIRED = yes
|
||||
```
|
||||
|
||||
## Basic Configuration {#basic-configuration}
|
||||
|
||||
Add the following to your `config.h`:
|
||||
|
||||
|Define |Default |Description |
|
||||
|--------------------------|--------|--------------------------------------------------|
|
||||
|`BATTERY_SAMPLE_INTERVAL` |`30000` |The time between battery samples in milliseconds. |
|
||||
|
||||
## Driver Configuration {#driver-configuration}
|
||||
|
||||
Driver selection can be configured in `rules.mk` as `BATTERY_DRIVER`. Valid values are `adc` (default), `vendor`, or `custom`. See below for information on individual drivers.
|
||||
|
||||
### ADC Driver {#adc-driver}
|
||||
|
||||
This is the default battery driver. The default configuration assumes the battery is connected to a ADC capable pin through a voltage divider.
|
||||
|
||||
```make
|
||||
BATTERY_DRIVER = adc
|
||||
```
|
||||
|
||||
The following `#define`s apply only to the `adc` driver:
|
||||
|
||||
|Define |Default |Description |
|
||||
|-----------------------------|--------------|--------------------------------------------------------------|
|
||||
|`BATTERY_PIN` |*Not defined* |The GPIO pin connected to the voltage divider. |
|
||||
|`BATTERY_REF_VOLTAGE_MV` |`3300` |The ADC reverence voltage, in millivolts. |
|
||||
|`BATTERY_VOLTAGE_DIVIDER_R1` |`100000` |The voltage divider resistance, in kOhm. Set to 0 to disable. |
|
||||
|`BATTERY_VOLTAGE_DIVIDER_R1` |`100000` |The voltage divider resistance, in kOhm. Set to 0 to disable. |
|
||||
|`BATTERY_ADC_RESOLUTION` |`10` |The ADC resolution configured for the ADC Driver. |
|
||||
|
||||
## Functions
|
||||
|
||||
### `uint8_t battery_get_percent(void)` {#api-battery-get-percent}
|
||||
|
||||
Sample battery level.
|
||||
|
||||
#### Return Value {#api-battery-get-percent-return}
|
||||
|
||||
The battery percentage, in the range 0-100.
|
@ -16,17 +16,22 @@ You can then call the I2C API by including `i2c_master.h` in your code.
|
||||
|
||||
## I2C Addressing {#note-on-i2c-addresses}
|
||||
|
||||
All of the addresses expected by this driver should be pushed to the upper 7 bits of the address byte. Setting
|
||||
the lower bit (indicating read/write) will be done by the respective functions. Almost all I2C addresses listed
|
||||
on datasheets and the internet will be represented as 7 bits occupying the lower 7 bits and will need to be
|
||||
shifted to the left (more significant) by one bit. This is easy to do via the bitwise shift operator `<< 1`.
|
||||
I2C addresses listed on datasheets and the internet are usually represented as a 7-bit value. The eighth bit (the least significant bit) controls whether the operation is a read or a write.
|
||||
|
||||
You can either do this on each call to the functions below, or once in your definition of the address. For example, if your device has an address of `0x18`:
|
||||
All of the address parameters expected by the driver API should therefore be pushed to the upper 7 bits of the address byte; the driver will take care of setting the read/write bit as appropriate.
|
||||
|
||||
This is easy to do via the bitwise left shift operator. For example, if your device has an address of `0x18` you might create a define for convenience:
|
||||
|
||||
```c
|
||||
#define MY_I2C_ADDRESS (0x18 << 1)
|
||||
```
|
||||
|
||||
Or, you can shift the address ahead of time:
|
||||
|
||||
```c
|
||||
#define MY_I2C_ADDRESS 0x30
|
||||
```
|
||||
|
||||
See https://www.robot-electronics.co.uk/i2c-tutorial for more information about I2C addressing and other technical details.
|
||||
|
||||
## AVR Configuration {#avr-configuration}
|
||||
@ -39,12 +44,12 @@ The following defines can be used to configure the I2C master driver:
|
||||
|
||||
No further setup is required - just connect the `SDA` and `SCL` pins of your I2C devices to the matching pins on the MCU:
|
||||
|
||||
|MCU |`SCL`|`SDA`|
|
||||
|------------------|-----|-----|
|
||||
|ATmega16/32U4 |`D0` |`D1` |
|
||||
|AT90USB64/128 |`D0` |`D1` |
|
||||
|ATmega32A |`C0` |`C1` |
|
||||
|ATmega328/P |`C5` |`C4` |
|
||||
|MCU |`SCL`|`SDA`|
|
||||
|-------------|-----|-----|
|
||||
|ATmega16/32U4|`D0` |`D1` |
|
||||
|AT90USB64/128|`D0` |`D1` |
|
||||
|ATmega32A |`C0` |`C1` |
|
||||
|ATmega328/P |`C5` |`C4` |
|
||||
|
||||
::: tip
|
||||
The ATmega16/32U2 does not possess I2C functionality, and so cannot use this driver.
|
||||
@ -52,20 +57,27 @@ The ATmega16/32U2 does not possess I2C functionality, and so cannot use this dri
|
||||
|
||||
## ChibiOS/ARM Configuration {#arm-configuration}
|
||||
|
||||
You'll need to determine which pins can be used for I2C -- a an example, STM32 parts generally have multiple I2C peripherals, labeled I2C1, I2C2, I2C3 etc.
|
||||
You'll need to determine which pins can be used for I2C -- as an example, STM32 parts generally have multiple I2C peripherals, labeled I2C1, I2C2, I2C3 etc.
|
||||
|
||||
To enable I2C, modify your board's `halconf.h` to enable I2C:
|
||||
To enable I2C, modify your board's `halconf.h` to enable I2C, then modify your board's `mcuconf.h` to enable the peripheral you've chosen:
|
||||
|
||||
```c
|
||||
#define HAL_USE_I2C TRUE
|
||||
::: code-group
|
||||
```c [halconf.h]
|
||||
#pragma once
|
||||
|
||||
#define HAL_USE_I2C TRUE // [!code focus]
|
||||
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
```c [mcuconf.h]
|
||||
#pragma once
|
||||
|
||||
Then, modify your board's `mcuconf.h` to enable the peripheral you've chosen, for example:
|
||||
#include_next <mcuconf.h>
|
||||
|
||||
```c
|
||||
#undef STM32_I2C_USE_I2C2
|
||||
#define STM32_I2C_USE_I2C2 TRUE
|
||||
#undef STM32_I2C_USE_I2C2 // [!code focus]
|
||||
#define STM32_I2C_USE_I2C2 TRUE // [!code focus]
|
||||
```
|
||||
:::
|
||||
|
||||
|`mcuconf.h` Setting |Description |Default|
|
||||
|----------------------------|----------------------------------------------------------------------------------|-------|
|
||||
@ -76,15 +88,19 @@ Then, modify your board's `mcuconf.h` to enable the peripheral you've chosen, fo
|
||||
|
||||
Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303.
|
||||
|
||||
|`config.h` Overrride |Description |Default|
|
||||
|------------------------|--------------------------------------------------------------|-------|
|
||||
|`I2C_DRIVER` |I2C peripheral to use - I2C1 -> `I2CD1`, I2C2 -> `I2CD2` etc. |`I2CD1`|
|
||||
|`I2C1_SCL_PIN` |The pin definition for SCL |`B6` |
|
||||
|`I2C1_SCL_PAL_MODE` |The alternate function mode for SCL |`4` |
|
||||
|`I2C1_SDA_PIN` |The pin definition for SDA |`B7` |
|
||||
|`I2C1_SDA_PAL_MODE` |The alternate function mode for SDA |`4` |
|
||||
|`config.h` Override|Description |Default|
|
||||
|-------------------|-------------------------------------------------------------|-------|
|
||||
|`I2C_DRIVER` |I2C peripheral to use - I2C1 -> `I2CD1`, I2C2 -> `I2CD2` etc.|`I2CD1`|
|
||||
|`I2C1_SCL_PIN` |The pin to use for SCL |`B6` |
|
||||
|`I2C1_SCL_PAL_MODE`|The alternate function mode for SCL |`4` |
|
||||
|`I2C1_SDA_PIN` |The pin to use for SDA |`B7` |
|
||||
|`I2C1_SDA_PAL_MODE`|The alternate function mode for SDA |`4` |
|
||||
|
||||
The following configuration values depend on the specific MCU in use.
|
||||
::: tip
|
||||
Currently only a single I2C peripheral is supported, therefore the `I2C1_*` defines are used for configuration regardless of the selected peripheral.
|
||||
:::
|
||||
|
||||
The following configuration values are dependent on the ChibiOS I2C LLD, which is dictated by the microcontroller.
|
||||
|
||||
### I2Cv1 {#arm-configuration-i2cv1}
|
||||
|
||||
@ -140,7 +156,7 @@ void i2c_init(void) {
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_transmit(uint8_t address, uint8_t *data, uint16_t length, uint16_t timeout)` {#api-i2c-transmit}
|
||||
### `i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-transmit}
|
||||
|
||||
Send multiple bytes to the selected I2C device.
|
||||
|
||||
@ -148,10 +164,10 @@ Send multiple bytes to the selected I2C device.
|
||||
|
||||
- `uint8_t address`
|
||||
The 7-bit I2C address of the device.
|
||||
- `uint8_t *data`
|
||||
- `const uint8_t* data`
|
||||
A pointer to the data to transmit.
|
||||
- `uint16_t length`
|
||||
The number of bytes to write. Take care not to overrun the length of `data`.
|
||||
The number of bytes to write. Take care not to overrun the length of `data`.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
@ -161,6 +177,29 @@ Send multiple bytes to the selected I2C device.
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_transmit_P(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-transmit-p}
|
||||
|
||||
Send multiple bytes from PROGMEM to the selected I2C device.
|
||||
|
||||
On ARM devices, this function is simply an alias for `i2c_transmit(address, data, length, timeout)`.
|
||||
|
||||
#### Arguments {#api-i2c-transmit-p-arguments}
|
||||
|
||||
- `uint8_t address`
|
||||
The 7-bit I2C address of the device.
|
||||
- `const uint8_t* data`
|
||||
A pointer to the data to transmit.
|
||||
- `uint16_t length`
|
||||
The number of bytes to write. Take care not to overrun the length of `data`.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value {#api-i2c-transmit-p-return}
|
||||
|
||||
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-receive}
|
||||
|
||||
Receive multiple bytes from the selected I2C device.
|
||||
@ -169,10 +208,10 @@ Receive multiple bytes from the selected I2C device.
|
||||
|
||||
- `uint8_t address`
|
||||
The 7-bit I2C address of the device.
|
||||
- `uint8_t *data`
|
||||
A pointer to the buffer to read into.
|
||||
- `uint8_t* data`
|
||||
A pointer to a buffer to read into.
|
||||
- `uint16_t length`
|
||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
@ -182,9 +221,9 @@ Receive multiple bytes from the selected I2C device.
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-write-register}
|
||||
### `i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-write-register}
|
||||
|
||||
Writes to a register with an 8-bit address on the I2C device.
|
||||
Write to a register with an 8-bit address on the I2C device.
|
||||
|
||||
#### Arguments {#api-i2c-write-register-arguments}
|
||||
|
||||
@ -192,10 +231,10 @@ Writes to a register with an 8-bit address on the I2C device.
|
||||
The 7-bit I2C address of the device.
|
||||
- `uint8_t regaddr`
|
||||
The register address to write to.
|
||||
- `uint8_t *data`
|
||||
- `const uint8_t* data`
|
||||
A pointer to the data to transmit.
|
||||
- `uint16_t length`
|
||||
The number of bytes to write. Take care not to overrun the length of `data`.
|
||||
The number of bytes to write. Take care not to overrun the length of `data`.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
@ -205,9 +244,9 @@ Writes to a register with an 8-bit address on the I2C device.
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_write_register16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-write-register16}
|
||||
### `i2c_status_t i2c_write_register16(uint8_t devaddr, uint16_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-write-register16}
|
||||
|
||||
Writes to a register with a 16-bit address (big endian) on the I2C device.
|
||||
Write to a register with a 16-bit address (big endian) on the I2C device.
|
||||
|
||||
#### Arguments {#api-i2c-write-register16-arguments}
|
||||
|
||||
@ -215,10 +254,10 @@ Writes to a register with a 16-bit address (big endian) on the I2C device.
|
||||
The 7-bit I2C address of the device.
|
||||
- `uint16_t regaddr`
|
||||
The register address to write to.
|
||||
- `uint8_t *data`
|
||||
- `const uint8_t* data`
|
||||
A pointer to the data to transmit.
|
||||
- `uint16_t length`
|
||||
The number of bytes to write. Take care not to overrun the length of `data`.
|
||||
The number of bytes to write. Take care not to overrun the length of `data`.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
@ -230,7 +269,7 @@ Writes to a register with a 16-bit address (big endian) on the I2C device.
|
||||
|
||||
### `i2c_status_t i2c_read_register(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-read-register}
|
||||
|
||||
Reads from a register with an 8-bit address on the I2C device.
|
||||
Read from a register with an 8-bit address on the I2C device.
|
||||
|
||||
#### Arguments {#api-i2c-read-register-arguments}
|
||||
|
||||
@ -238,8 +277,10 @@ Reads from a register with an 8-bit address on the I2C device.
|
||||
The 7-bit I2C address of the device.
|
||||
- `uint8_t regaddr`
|
||||
The register address to read from.
|
||||
- `uint8_t data`
|
||||
A pointer to a buffer to read into.
|
||||
- `uint16_t length`
|
||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
@ -251,7 +292,7 @@ Reads from a register with an 8-bit address on the I2C device.
|
||||
|
||||
### `i2c_status_t i2c_read_register16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-read-register16}
|
||||
|
||||
Reads from a register with a 16-bit address (big endian) on the I2C device.
|
||||
Read from a register with a 16-bit address (big endian) on the I2C device.
|
||||
|
||||
#### Arguments {#api-i2c-read-register16-arguments}
|
||||
|
||||
@ -259,8 +300,10 @@ Reads from a register with a 16-bit address (big endian) on the I2C device.
|
||||
The 7-bit I2C address of the device.
|
||||
- `uint16_t regaddr`
|
||||
The register address to read from.
|
||||
- `uint8_t* data`
|
||||
A pointer to a buffer to read into.
|
||||
- `uint16_t length`
|
||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
@ -272,19 +315,19 @@ Reads from a register with a 16-bit address (big endian) on the I2C device.
|
||||
|
||||
### `i2c_status_t i2c_ping_address(uint8_t address, uint16_t timeout)` {#api-i2c-ping-address}
|
||||
|
||||
Pings the I2C bus for a specific address.
|
||||
Ping the I2C bus for a specific address.
|
||||
|
||||
On ChibiOS a "best effort" attempt is made by reading a single byte from register 0 at the requested address. This should generally work except for I2C devices that do not not respond to a register 0 read request, which will result in a false negative result (unsucessful response to ping attempt).
|
||||
On ChibiOS a "best effort" attempt is made by reading a single byte from register 0 at the given address. This should generally work except for I2C devices that do not not respond to a register 0 read request, which will result in a false negative result (unsuccessful response to ping attempt).
|
||||
|
||||
This function is weakly defined, meaning it can be overridden if necessary for your particular use case:
|
||||
This function is weakly defined, meaning it can be overridden if necessary for your particular use case.
|
||||
|
||||
#### Arguments
|
||||
#### Arguments {#api-i2c-ping-address-arguments}
|
||||
|
||||
- `uint8_t address`
|
||||
The 7-bit I2C address of the device (ie. without the read/write bit - this will be set automatically).
|
||||
The 7-bit I2C address of the device.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value
|
||||
#### Return Value {#api-i2c-ping-address-return}
|
||||
|
||||
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
|
||||
|
@ -12,8 +12,6 @@ The Serial driver powers the [Split Keyboard](../features/split_keyboard) featur
|
||||
Serial in this context should be read as **sending information one bit at a time**, rather than implementing UART/USART/RS485/RS232 standards.
|
||||
:::
|
||||
|
||||
<hr>
|
||||
|
||||
## Bitbang
|
||||
|
||||
This is the Default driver, absence of configuration assumes this driver. It works by [bit banging](https://en.wikipedia.org/wiki/Bit_banging) a GPIO pin using the CPU. It is therefore not as efficient as a dedicated hardware peripheral, which the Half-duplex and Full-duplex drivers use.
|
||||
@ -53,11 +51,15 @@ SERIAL_DRIVER = bitbang
|
||||
#define SOFT_SERIAL_PIN D0 // or D1, D2, D3, E6
|
||||
```
|
||||
|
||||
3. On ARM platforms you must turn on ChibiOS `PAL_USE_CALLBACKS` feature:
|
||||
3. On ARM platforms you must turn on ChibiOS PAL callbacks:
|
||||
|
||||
* In `halconf.h` add the line `#define PAL_USE_CALLBACKS TRUE`.
|
||||
```c
|
||||
#pragma once
|
||||
|
||||
<hr>
|
||||
#define PAL_USE_CALLBACKS TRUE // [!code focus]
|
||||
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
|
||||
## USART Half-duplex
|
||||
|
||||
@ -117,8 +119,6 @@ For STM32 MCUs several GPIO configuration options can be changed as well. See th
|
||||
|
||||
4. Decide either for `SERIAL`, `SIO`, or `PIO` subsystem. See section ["Choosing a driver subsystem"](#choosing-a-driver-subsystem).
|
||||
|
||||
<hr>
|
||||
|
||||
## USART Full-duplex
|
||||
|
||||
Targeting ARM boards based on ChibiOS where communication is offloaded to an USART hardware device. The advantages over bitbanging are fast, accurate timings and reduced CPU usage; therefore it is advised to choose this driver over all others where possible. Due to its internal design Full-duplex is slightly more efficient than the Half-duplex driver, but Full-duplex should be primarily chosen if Half-duplex operation is not supported by the controller's USART peripheral.
|
||||
@ -179,38 +179,46 @@ For STM32 MCUs several GPIO configuration options, including the ability for `TX
|
||||
|
||||
4. Decide either for `SERIAL`, `SIO`, or `PIO` subsystem. See section ["Choosing a driver subsystem"](#choosing-a-driver-subsystem).
|
||||
|
||||
<hr>
|
||||
|
||||
## Choosing a driver subsystem
|
||||
|
||||
### The `SERIAL` driver
|
||||
|
||||
The `SERIAL` Subsystem is supported for the majority of ChibiOS MCUs and should be used whenever supported. Follow these steps in order to activate it:
|
||||
|
||||
1. In your keyboards `halconf.h` add:
|
||||
1. Enable the SERIAL subsystem in the ChibiOS HAL.
|
||||
|
||||
```c
|
||||
#define HAL_USE_SERIAL TRUE
|
||||
```
|
||||
Add the following to your keyboard's `halconf.h`, creating it if necessary:
|
||||
|
||||
2. In your keyboards `mcuconf.h`: activate the USART peripheral that is used on your MCU. The shown example is for an STM32 MCU, so this will not work on MCUs by other manufacturers. You can find the correct names in the `mcuconf.h` files of your MCU that ship with ChibiOS.
|
||||
```c
|
||||
#pragma once
|
||||
|
||||
Just below `#include_next <mcuconf.h>` add:
|
||||
#define HAL_USE_SERIAL TRUE // [!code focus]
|
||||
|
||||
```c
|
||||
#include_next <mcuconf.h>
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
|
||||
#undef STM32_SERIAL_USE_USARTn
|
||||
#define STM32_SERIAL_USE_USARTn TRUE
|
||||
```
|
||||
2. Activate the USART peripheral that is used on your MCU. The shown example is for an STM32 MCU, so this will not work on MCUs by other manufacturers. You can find the correct names in the `mcuconf.h` files of your MCU that ship with ChibiOS.
|
||||
|
||||
Where 'n' matches the peripheral number of your selected USART on the MCU.
|
||||
Add the following to your keyboard's `mcuconf.h`, creating it if necessary:
|
||||
|
||||
3. In you keyboards `config.h`: override the default USART `SERIAL` driver if you use a USART peripheral that does not belong to the default selected `SD1` driver. For instance, if you selected `STM32_SERIAL_USE_USART3` the matching driver would be `SD3`.
|
||||
```c
|
||||
#pragma once
|
||||
|
||||
```c
|
||||
#define SERIAL_USART_DRIVER SD3
|
||||
```
|
||||
#include_next <mcuconf.h>
|
||||
|
||||
#undef STM32_SERIAL_USE_USARTn // [!code focus]
|
||||
#define STM32_SERIAL_USE_USARTn TRUE // [!code focus]
|
||||
```
|
||||
|
||||
Where *n* matches the peripheral number of your selected USART on the MCU.
|
||||
|
||||
3. Override the default USART `SERIAL` driver if you use a USART peripheral that does not belong to the default selected `SD1` driver. For instance, if you selected `STM32_SERIAL_USE_USART3` the matching driver would be `SD3`.
|
||||
|
||||
Add the following to your keyboard's `config.h`:
|
||||
|
||||
```c
|
||||
#define SERIAL_USART_DRIVER SD3
|
||||
```
|
||||
|
||||
### The `SIO` driver
|
||||
|
||||
@ -218,30 +226,40 @@ The `SIO` Subsystem was added to ChibiOS with the 21.11 release and is only supp
|
||||
|
||||
Follow these steps in order to activate it:
|
||||
|
||||
1. In your keyboards `halconf.h` add:
|
||||
1. Enable the SIO subsystem in the ChibiOS HAL.
|
||||
|
||||
```c
|
||||
#define HAL_USE_SIO TRUE
|
||||
```
|
||||
Add the following to your keyboard's `halconf.h`, creating it if necessary:
|
||||
|
||||
2. In your keyboards `mcuconf.h:` activate the USART peripheral that is used on your MCU. The shown example is for an STM32 MCU, so this will not work on MCUs by other manufacturers. You can find the correct names in the `mcuconf.h` files of your MCU that ship with ChibiOS.
|
||||
```c
|
||||
#pragma once
|
||||
|
||||
Just below `#include_next <mcuconf.h>` add:
|
||||
#define HAL_USE_SIO TRUE // [!code focus]
|
||||
|
||||
```c
|
||||
#include_next <mcuconf.h>
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
|
||||
#undef STM32_SIO_USE_USARTn
|
||||
#define STM32_SIO_USE_USARTn TRUE
|
||||
```
|
||||
2. Activate the USART peripheral that is used on your MCU. The shown example is for an STM32 MCU, so this will not work on MCUs by other manufacturers. You can find the correct names in the `mcuconf.h` files of your MCU that ship with ChibiOS.
|
||||
|
||||
Where 'n' matches the peripheral number of your selected USART on the MCU.
|
||||
Add the following to your keyboard's `mcuconf.h`, creating it if necessary:
|
||||
|
||||
3. In the keyboard's `config.h` file: override the default USART `SIO` driver if you use a USART peripheral that does not belong to the default selected `SIOD1` driver. For instance, if you selected `STM32_SERIAL_USE_USART3` the matching driver would be `SIOD3`.
|
||||
```c
|
||||
#pragma once
|
||||
|
||||
```c
|
||||
#define SERIAL_USART_DRIVER SIOD3
|
||||
```
|
||||
#include_next <mcuconf.h>
|
||||
|
||||
#undef STM32_SIO_USE_USARTn // [!code focus]
|
||||
#define STM32_SIO_USE_USARTn TRUE // [!code focus]
|
||||
```
|
||||
|
||||
Where *n* matches the peripheral number of your selected USART on the MCU.
|
||||
|
||||
3. Override the default USART `SIO` driver if you use a USART peripheral that does not belong to the default selected `SIOD1` driver. For instance, if you selected `STM32_SERIAL_USE_USART3` the matching driver would be `SIOD3`.
|
||||
|
||||
Add the following to your keyboard's `config.h`:
|
||||
|
||||
```c
|
||||
#define SERIAL_USART_DRIVER SIOD3
|
||||
```
|
||||
|
||||
### The `PIO` driver
|
||||
|
||||
@ -254,8 +272,6 @@ Optionally, the PIO peripheral utilized for split communication can be changed w
|
||||
|
||||
The Serial PIO program uses 2 state machines, 13 instructions and the complete interrupt handler of the PIO peripheral it is running on.
|
||||
|
||||
<hr>
|
||||
|
||||
## Advanced Configuration
|
||||
|
||||
There are several advanced configuration options that can be defined in your keyboards `config.h` file:
|
||||
@ -265,9 +281,11 @@ There are several advanced configuration options that can be defined in your key
|
||||
If you're having issues or need a higher baudrate with serial communication, you can change the baudrate which in turn controls the communication speed for serial. You want to lower the baudrate if you experience failed transactions.
|
||||
|
||||
```c
|
||||
#define SELECT_SOFT_SERIAL_SPEED {#}
|
||||
#define SELECT_SOFT_SERIAL_SPEED n
|
||||
```
|
||||
|
||||
Where *n* is one of:
|
||||
|
||||
| Speed | Bitbang | Half-duplex and Full-duplex |
|
||||
| ----- | -------------------------- | --------------------------- |
|
||||
| `0` | 189000 baud (experimental) | 460800 baud |
|
||||
@ -287,8 +305,6 @@ This is the default time window in milliseconds in which a successful communicat
|
||||
#define SERIAL_USART_TIMEOUT 20 // USART driver timeout. default 20
|
||||
```
|
||||
|
||||
<hr>
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
If you're having issues withe serial communication, you can enable debug messages that will give you insights which part of the communication failed. The enable these messages add to your keyboards `config.h` file:
|
||||
|
@ -32,20 +32,27 @@ You may use more than one slave select pin, not just the `SS` pin. This is usefu
|
||||
|
||||
You'll need to determine which pins can be used for SPI -- as an example, STM32 parts generally have multiple SPI peripherals, labeled SPI1, SPI2, SPI3 etc.
|
||||
|
||||
To enable SPI, modify your board's `halconf.h` to enable SPI:
|
||||
To enable SPI, modify your board's `halconf.h` to enable SPI, then modify your board's `mcuconf.h` to enable the peripheral you've chosen:
|
||||
|
||||
```c
|
||||
#define HAL_USE_SPI TRUE
|
||||
#define SPI_USE_WAIT TRUE
|
||||
#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
|
||||
::: code-group
|
||||
```c [halconf.h]
|
||||
#pragma once
|
||||
|
||||
#define HAL_USE_SPI TRUE // [!code focus]
|
||||
#define SPI_USE_WAIT TRUE // [!code focus]
|
||||
#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD // [!code focus]
|
||||
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
```c [mcuconf.h]
|
||||
#pragma once
|
||||
|
||||
Then, modify your board's `mcuconf.h` to enable the peripheral you've chosen, for example:
|
||||
#include_next <mcuconf.h>
|
||||
|
||||
```c
|
||||
#undef STM32_SPI_USE_SPI2
|
||||
#define STM32_SPI_USE_SPI2 TRUE
|
||||
#undef STM32_SPI_USE_SPI2 // [!code focus]
|
||||
#define STM32_SPI_USE_SPI2 TRUE // [!code focus]
|
||||
```
|
||||
:::
|
||||
|
||||
Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303.
|
||||
|
||||
@ -81,7 +88,7 @@ Start an SPI transaction.
|
||||
#### Arguments {#api-spi-start-arguments}
|
||||
|
||||
- `pin_t slavePin`
|
||||
The QMK pin to assert as the slave select pin, eg. `B4`.
|
||||
The GPIO pin connected to the desired device's `SS` line.
|
||||
- `bool lsbFirst`
|
||||
Determines the endianness of the transmission. If `true`, the least significant bit of each byte is sent first.
|
||||
- `uint8_t mode`
|
||||
@ -99,7 +106,7 @@ Start an SPI transaction.
|
||||
|
||||
#### Return Value {#api-spi-start-return}
|
||||
|
||||
`false` if the supplied parameters are invalid or the SPI peripheral is already in use, or `true`.
|
||||
`true` if the operation was successful, otherwise `false` if the supplied parameters are invalid or the SPI peripheral is already in use.
|
||||
|
||||
---
|
||||
|
||||
@ -124,7 +131,7 @@ Read a byte from the selected SPI device.
|
||||
|
||||
#### Return Value {#api-spi-read-return}
|
||||
|
||||
`SPI_STATUS_TIMEOUT` if the timeout period elapses, or the byte read from the device.
|
||||
`SPI_STATUS_TIMEOUT` if the timeout period elapses, otherwise the byte read from the device.
|
||||
|
||||
---
|
||||
|
||||
@ -152,7 +159,7 @@ Receive multiple bytes from the selected SPI device.
|
||||
#### Arguments {#api-spi-receive-arguments}
|
||||
|
||||
- `uint8_t *data`
|
||||
A pointer to the buffer to read into.
|
||||
A pointer to a buffer to read into.
|
||||
- `uint16_t length`
|
||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||
|
||||
|
@ -35,23 +35,27 @@ You'll need to determine which pins can be used for UART -- as an example, STM32
|
||||
To enable UART, modify your board's `mcuconf.h` to enable the peripheral you've chosen, for example:
|
||||
|
||||
```c
|
||||
#undef STM32_SERIAL_USE_USART2
|
||||
#define STM32_SERIAL_USE_USART2 TRUE
|
||||
#pragma once
|
||||
|
||||
#include_next <mcuconf.h>
|
||||
|
||||
#undef STM32_SERIAL_USE_USART2 // [!code focus]
|
||||
#define STM32_SERIAL_USE_USART2 TRUE // [!code focus]
|
||||
```
|
||||
|
||||
Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303.
|
||||
|
||||
| `config.h` override | Description | Default Value |
|
||||
| --------------------------- | --------------------------------------------------------------- | ------------- |
|
||||
| `#define UART_DRIVER` | USART peripheral to use - USART1 -> `SD1`, USART2 -> `SD2` etc. | `SD1` |
|
||||
| `#define UART_TX_PIN` | The pin to use for TX | `A9` |
|
||||
| `#define UART_TX_PAL_MODE` | The alternate function mode for TX | `7` |
|
||||
| `#define UART_RX_PIN` | The pin to use for RX | `A10` |
|
||||
| `#define UART_RX_PAL_MODE` | The alternate function mode for RX | `7` |
|
||||
| `#define UART_CTS_PIN` | The pin to use for CTS | `A11` |
|
||||
| `#define UART_CTS_PAL_MODE` | The alternate function mode for CTS | `7` |
|
||||
| `#define UART_RTS_PIN` | The pin to use for RTS | `A12` |
|
||||
| `#define UART_RTS_PAL_MODE` | The alternate function mode for RTS | `7` |
|
||||
|`config.h` Override|Description |Default|
|
||||
|-------------------|---------------------------------------------------------------|-------|
|
||||
|`UART_DRIVER` |USART peripheral to use - USART1 -> `SD1`, USART2 -> `SD2` etc.|`SD1` |
|
||||
|`UART_TX_PIN` |The pin to use for TX |`A9` |
|
||||
|`UART_TX_PAL_MODE` |The alternate function mode for TX |`7` |
|
||||
|`UART_RX_PIN` |The pin to use for RX |`A10` |
|
||||
|`UART_RX_PAL_MODE` |The alternate function mode for RX |`7` |
|
||||
|`UART_CTS_PIN` |The pin to use for CTS |`A11` |
|
||||
|`UART_CTS_PAL_MODE`|The alternate function mode for CTS |`7` |
|
||||
|`UART_RTS_PIN` |The pin to use for RTS |`A12` |
|
||||
|`UART_RTS_PAL_MODE`|The alternate function mode for RTS |`7` |
|
||||
|
||||
## API {#api}
|
||||
|
||||
@ -107,7 +111,7 @@ Receive multiple bytes.
|
||||
#### Arguments {#api-uart-receive-arguments}
|
||||
|
||||
- `uint8_t *data`
|
||||
A pointer to the buffer to read into.
|
||||
A pointer to a buffer to read into.
|
||||
- `uint16_t length`
|
||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||
|
||||
@ -119,4 +123,4 @@ Return whether the receive buffer contains data. Call this function to determine
|
||||
|
||||
#### Return Value {#api-uart-available-return}
|
||||
|
||||
`true` if the receive buffer length is non-zero.
|
||||
`true` if there is data available to read.
|
||||
|
@ -160,15 +160,23 @@ To configure the DI pin for open drain configuration, add the following to your
|
||||
|
||||
Depending on the ChibiOS board configuration, you may need to enable SPI at the keyboard level. For STM32, this would look like:
|
||||
|
||||
`halconf.h`:
|
||||
```c
|
||||
#define HAL_USE_SPI TRUE
|
||||
::: code-group
|
||||
```c [halconf.h]
|
||||
#pragma once
|
||||
|
||||
#define HAL_USE_SPI TRUE // [!code focus]
|
||||
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
`mcuconf.h`:
|
||||
```c
|
||||
#undef STM32_SPI_USE_SPI1
|
||||
#define STM32_SPI_USE_SPI1 TRUE
|
||||
```c [mcuconf.h]
|
||||
#pragma once
|
||||
|
||||
#include_next <mcuconf.h>
|
||||
|
||||
#undef STM32_SPI_USE_SPI1 // [!code focus]
|
||||
#define STM32_SPI_USE_SPI1 TRUE // [!code focus]
|
||||
```
|
||||
:::
|
||||
|
||||
The following `define`s apply only to the `spi` driver:
|
||||
|
||||
@ -213,15 +221,23 @@ The following `#define`s apply only to the PIO driver:
|
||||
|
||||
Depending on the ChibiOS board configuration, you may need to enable PWM at the keyboard level. For STM32, this would look like:
|
||||
|
||||
`halconf.h`:
|
||||
```c
|
||||
#define HAL_USE_PWM TRUE
|
||||
::: code-group
|
||||
```c [halconf.h]
|
||||
#pragma once
|
||||
|
||||
#define HAL_USE_PWM TRUE // [!code focus]
|
||||
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
`mcuconf.h`:
|
||||
```c
|
||||
#undef STM32_PWM_USE_TIM2
|
||||
#define STM32_PWM_USE_TIM2 TRUE
|
||||
```c [mcuconf.h]
|
||||
#pragma once
|
||||
|
||||
#include_next <mcuconf.h>
|
||||
|
||||
#undef STM32_PWM_USE_TIM2 // [!code focus]
|
||||
#define STM32_PWM_USE_TIM2 TRUE // [!code focus]
|
||||
```
|
||||
:::
|
||||
|
||||
The following `#define`s apply only to the `pwm` driver:
|
||||
|
||||
|
@ -77,6 +77,17 @@ KL: kc: 172, col: 2, row: 0, pressed: 1, time: 16303, int: 0, count: 0
|
||||
KL: kc: 172, col: 2, row: 0, pressed: 0, time: 16411, int: 0, count: 0
|
||||
```
|
||||
|
||||
### Which keycode is this keypress?
|
||||
|
||||
Keycodes are logged in the example above as numerical codes, which may be difficult to interpret. For more readable logging, add `KEYCODE_STRING_ENABLE = yes` in your `rules.mk` and use `get_keycode_string(kc)`. For example:
|
||||
|
||||
```c
|
||||
uprintf("kc: %s\n", get_keycode_string(keycode));
|
||||
```
|
||||
|
||||
This logs the keycode as a human-readable string like "`LT(2,KC_D)`" rather than a numerical code like "`0x4207`." See the [Keycode String](unit_testing#keycode-string) section of the Unit Testing page for more information.
|
||||
|
||||
|
||||
### How long did it take to scan for a keypress?
|
||||
|
||||
When testing performance issues, it can be useful to know the frequency at which the switch matrix is being scanned. To enable logging for this scenario, add the following code to your keymaps `config.h`
|
||||
@ -129,7 +140,7 @@ needed for older distros.
|
||||
## Can't Get Message on Console
|
||||
Check:
|
||||
- *hid_listen* finds your device. See above.
|
||||
- Enable debug by pressing **Magic**+d. See [Magic Commands](https://github.com/tmk/tmk_keyboard#magic-commands).
|
||||
- Enable debug by pressing **Magic**+d. See [Magic Commands](https://github.com/tmk/tmk_keyboard/wiki#magic-commands-for-debug).
|
||||
- Set `debug_enable=true`. See [Debugging](#debugging)
|
||||
- Try using `print` function instead of debug print. See **common/print.h**.
|
||||
- Disconnect other devices with console function. See [Issue #97](https://github.com/tmk/tmk_keyboard/issues/97).
|
||||
|
@ -11,7 +11,7 @@ These allow you to combine a modifier with a keycode. When pressed, the keydown
|
||||
|`RCTL(kc)`| |Hold Right Control and press `kc` |
|
||||
|`RSFT(kc)`| |Hold Right Shift and press `kc` |
|
||||
|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt and press `kc` |
|
||||
|`RGUI(kc)`|`RCMD(kc)`, `LWIN(kc)` |Hold Right GUI and press `kc` |
|
||||
|`RGUI(kc)`|`RCMD(kc)`, `RWIN(kc)` |Hold Right GUI and press `kc` |
|
||||
|`LSG(kc)` |`SGUI(kc)`, `SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and GUI and press `kc` |
|
||||
|`LAG(kc)` | |Hold Left Alt and Left GUI and press `kc` |
|
||||
|`RSG(kc)` | |Hold Right Shift and Right GUI and press `kc` |
|
||||
|
@ -8,7 +8,8 @@ For a detailed explanation of how the layer stack works, checkout [Keymap Overvi
|
||||
|
||||
These functions allow you to activate layers in various ways. Note that layers are not generally independent layouts -- multiple layers can be activated at once, and it's typical for layers to use `KC_TRNS` to allow keypresses to pass through to lower layers. When using momentary layer switching with MO(), LM(), TT(), or LT(), make sure to leave the key on the above layers transparent or it may not work as intended.
|
||||
|
||||
* `DF(layer)` - switches the default layer. The default layer is the always-active base layer that other layers stack on top of. See below for more about the default layer. This might be used to switch from QWERTY to Dvorak layout. (Note that this is a temporary switch that only persists until the keyboard loses power. To modify the default layer in a persistent way requires deeper customization, such as calling the `set_single_persistent_default_layer` function inside of [process_record_user](custom_quantum_functions#programming-the-behavior-of-any-keycode).)
|
||||
* `DF(layer)` - switches the default layer. The default layer is the always-active base layer that other layers stack on top of. See below for more about the default layer. This might be used to switch from QWERTY to Dvorak layout. Note that this is a temporary switch that only persists until the keyboard loses power.
|
||||
* `PDF(layer)` - sets a persistent default layer. This switch, which will last through a power loss, might be used to switch from QWERTY to Dvorak layout and only switch again when you want to.
|
||||
* `MO(layer)` - momentarily activates *layer*. As soon as you let go of the key, the layer is deactivated.
|
||||
* `LM(layer, mod)` - Momentarily activates *layer* (like `MO`), but with modifier(s) *mod* active. Only supports layers 0-15. The modifiers this keycode accept are prefixed with `MOD_`, not `KC_`. These modifiers can be combined using bitwise OR, e.g. `LM(_RAISE, MOD_LCTL | MOD_LALT)`.
|
||||
* `LT(layer, kc)` - momentarily activates *layer* when held, and sends *kc* when tapped. Only supports layers 0-15.
|
||||
@ -17,6 +18,9 @@ These functions allow you to activate layers in various ways. Note that layers a
|
||||
* `TO(layer)` - activates *layer* and de-activates all other layers (except your default layer). This function is special, because instead of just adding/removing one layer to your active layer stack, it will completely replace your current active layers, uniquely allowing you to replace higher layers with a lower one. This is activated on keydown (as soon as the key is pressed).
|
||||
* `TT(layer)` - Layer Tap-Toggle. If you hold the key down, *layer* is activated, and then is de-activated when you let go (like `MO`). If you repeatedly tap it, the layer will be toggled on or off (like `TG`). It needs 5 taps by default, but you can change this by defining `TAPPING_TOGGLE` -- for example, `#define TAPPING_TOGGLE 2` to toggle on just two taps.
|
||||
|
||||
See also the [Layer Lock key](features/layer_lock), which locks the highest
|
||||
active layer until pressed again.
|
||||
|
||||
### Caveats {#caveats}
|
||||
|
||||
Currently, the `layer` argument of `LT()` is limited to layers 0-15, and the `kc` argument to the [Basic Keycode set](keycodes_basic), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. This is because QMK uses 16-bit keycodes, of which 4 bits are used for the function identifier and 4 bits for the layer, leaving only 8 bits for the keycode.
|
||||
|
@ -42,38 +42,7 @@ You can define up to 32 macros in a `keymap.json` file, as used by [Configurator
|
||||
|
||||
### Selecting Your Host Keyboard Layout
|
||||
|
||||
If you type in a language other than English, or use a non-QWERTY layout like Colemak, Dvorak, or Workman, you may have set your computer's input language to match this layout. This presents a challenge when creating macros - you may need to type different keys to get the same letters! To address this you can add the `host_language` key to your `keymap.json`, like so:
|
||||
|
||||
```json
|
||||
{
|
||||
"keyboard": "handwired/my_macropad",
|
||||
"keymap": "my_keymap",
|
||||
"host_language": "dvorak",
|
||||
"macros": [
|
||||
["Hello, World!"]
|
||||
],
|
||||
"layout": "LAYOUT_all",
|
||||
"layers": [
|
||||
["QK_MACRO_0"]
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
The current list of available languages is:
|
||||
|
||||
| belgian | bepo | br_abnt2 | canadian_multilingual |
|
||||
|:-------:|:----:|:--------:|:---------------------:|
|
||||
| **colemak** | **croatian** | **czech** | **danish** |
|
||||
| **dvorak_fr** | **dvorak** | **dvp** | **estonian** |
|
||||
| **finnish** | **fr_ch** | **french_afnor** | **french** |
|
||||
| **french_osx** | **german_ch** | **german** | **german_osx** |
|
||||
| **hungarian** | **icelandic** | **italian** | **italian_osx_ansi** |
|
||||
| **italian_osx_iso** | **jis** | **latvian** | **lithuanian_azerty** |
|
||||
| **lithuanian_qwerty** | **norman** | **norwegian** | **portuguese** |
|
||||
| **portuguese_osx_iso** | **romanian** | **serbian_latin** | **slovak** |
|
||||
| **slovenian** | **spanish_dvorak** | **spanish_latin_america** | **spanish** |
|
||||
| **swedish** | **turkish_f** | **turkish_q** | **uk** |
|
||||
| **us_international** | **workman** | **workman_zxcvm** |
|
||||
If you type in a language other than English, or use a non-QWERTY layout like Colemak, Dvorak, or Workman, you may have set your computer's input language to match this layout. This presents a challenge when creating macros — you may need to type different keys to get the same letters! To address this you can use [language-specific keycodes](reference_keymap_extras).
|
||||
|
||||
### Macro Basics
|
||||
|
||||
@ -148,7 +117,9 @@ If yes, we send the string `"QMK is the best thing ever!"` to the computer via t
|
||||
We return `true` to indicate to the caller that the key press we just processed should continue to be processed as normal (as we didn't replace or alter the functionality).
|
||||
Finally, we define the keymap so that the first button activates our macro and the second button is just an escape button.
|
||||
|
||||
?>It is recommended to use the SAFE_RANGE macro as per [Customizing Functionality](custom_quantum_functions).
|
||||
::: tip
|
||||
It is recommended to use the SAFE_RANGE macro as per [Customizing Functionality](custom_quantum_functions).
|
||||
:::
|
||||
|
||||
You might want to add more than one macro.
|
||||
You can do that by adding another keycode and adding another case to the switch statement, like so:
|
||||
|
@ -74,8 +74,9 @@ Additionally, `config.h` here will be processed like the same file in your keyma
|
||||
|
||||
The reason for this, is that `<name>.h` won't be added in time to add settings (such as `#define TAPPING_TERM 100`), and including the `<name.h>` file in any `config.h` files will result in compile issues.
|
||||
|
||||
!>You should use the `config.h` for [configuration options](config_options), and the `<name>.h` file for user or keymap specific settings (such as the enum for layer or keycodes)
|
||||
|
||||
::: warning
|
||||
You should use the `config.h` for [configuration options](config_options), and the `<name>.h` file for user or keymap specific settings (such as the enum for layer or keycodes)
|
||||
:::
|
||||
|
||||
## Readme (`readme.md`)
|
||||
|
||||
|
@ -161,15 +161,23 @@ Note that the choice of timer may conflict with the [Audio](audio) feature.
|
||||
|
||||
Depending on the ChibiOS board configuration, you may need to enable PWM at the keyboard level. For STM32, this would look like:
|
||||
|
||||
`halconf.h`:
|
||||
```c
|
||||
#define HAL_USE_PWM TRUE
|
||||
::: code-group
|
||||
```c [halconf.h]
|
||||
#pragma once
|
||||
|
||||
#define HAL_USE_PWM TRUE // [!code focus]
|
||||
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
`mcuconf.h`:
|
||||
```c
|
||||
#undef STM32_PWM_USE_TIM4
|
||||
#define STM32_PWM_USE_TIM4 TRUE
|
||||
```c [mcuconf.h]
|
||||
#pragma once
|
||||
|
||||
#include_next <mcuconf.h>
|
||||
|
||||
#undef STM32_PWM_USE_TIM4 // [!code focus]
|
||||
#define STM32_PWM_USE_TIM4 TRUE // [!code focus]
|
||||
```
|
||||
:::
|
||||
|
||||
The following `#define`s apply only to the `pwm` driver:
|
||||
|
||||
@ -187,15 +195,23 @@ Refer to the ST datasheet for your particular MCU to determine these values. For
|
||||
|
||||
Depending on the ChibiOS board configuration, you may need to enable general-purpose timers at the keyboard level. For STM32, this would look like:
|
||||
|
||||
`halconf.h`:
|
||||
```c
|
||||
#define HAL_USE_GPT TRUE
|
||||
::: code-group
|
||||
```c [halconf.h]
|
||||
#pragma once
|
||||
|
||||
#define HAL_USE_GPT TRUE // [!code focus]
|
||||
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
`mcuconf.h`:
|
||||
```c
|
||||
#undef STM32_GPT_USE_TIM15
|
||||
#define STM32_GPT_USE_TIM15 TRUE
|
||||
```c [mcuconf.h]
|
||||
#pragma once
|
||||
|
||||
#include_next <mcuconf.h>
|
||||
|
||||
#undef STM32_GPT_USE_TIM15 // [!code focus]
|
||||
#define STM32_GPT_USE_TIM15 TRUE // [!code focus]
|
||||
```
|
||||
:::
|
||||
|
||||
The following `#define`s apply only to the `timer` driver:
|
||||
|
||||
|
@ -1,46 +0,0 @@
|
||||
# Bluetooth
|
||||
|
||||
## Bluetooth Known Supported Hardware
|
||||
|
||||
Currently Bluetooth support is limited to AVR based chips. For Bluetooth 2.1, QMK has support for RN-42 modules. For more recent BLE protocols, currently only the Adafruit Bluefruit SPI Friend is directly supported. BLE is needed to connect to iOS devices. Note iOS does not support mouse input.
|
||||
|
||||
|Board |Bluetooth Protocol |Connection Type|rules.mk |Bluetooth Chip|
|
||||
|----------------------------------------------------------------|--------------------|---------------|---------------------------------|--------------|
|
||||
|Roving Networks RN-42 (Sparkfun Bluesmirf) |Bluetooth Classic |UART |`BLUETOOTH_DRIVER = rn42` |RN-42 |
|
||||
|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633)|Bluetooth Low Energy|SPI |`BLUETOOTH_DRIVER = bluefruit_le`|nRF51822 |
|
||||
|
||||
Not Supported Yet but possible:
|
||||
* [Bluefruit LE UART Friend](https://www.adafruit.com/product/2479). [Possible tmk implementation found in](https://github.com/tmk/tmk_keyboard/issues/514)
|
||||
* HC-05 boards flashed with RN-42 firmware. They apparently both use the CSR BC417 Chip. Flashing it with RN-42 firmware gives it HID capability.
|
||||
* Sparkfun Bluetooth Mate
|
||||
* HM-13 based boards
|
||||
|
||||
### Adafruit BLE SPI Friend
|
||||
Currently The only bluetooth chipset supported by QMK is the Adafruit Bluefruit SPI Friend. It's a Nordic nRF51822 based chip running Adafruit's custom firmware. Data is transmitted via Adafruit's SDEP over Hardware SPI. The [Feather 32u4 Bluefruit LE](https://www.adafruit.com/product/2829) is supported as it's an AVR mcu connected via SPI to the Nordic BLE chip with Adafruit firmware. If Building a custom board with the SPI friend it would be easiest to just use the pin selection that the 32u4 feather uses but you can change the pins in the config.h options with the following defines:
|
||||
* `#define BLUEFRUIT_LE_RST_PIN D4`
|
||||
* `#define BLUEFRUIT_LE_CS_PIN B4`
|
||||
* `#define BLUEFRUIT_LE_IRQ_PIN E6`
|
||||
|
||||
A Bluefruit UART friend can be converted to an SPI friend, however this [requires](https://github.com/qmk/qmk_firmware/issues/2274) some reflashing and soldering directly to the MDBT40 chip.
|
||||
|
||||
<!-- FIXME: Document bluetooth support more completely. -->
|
||||
## Bluetooth Rules.mk Options
|
||||
|
||||
The currently supported Bluetooth chipsets do not support [N-Key Rollover (NKRO)](../reference_glossary#n-key-rollover-nkro), so `rules.mk` must contain `NKRO_ENABLE = no`.
|
||||
|
||||
Add the following to your `rules.mk`:
|
||||
|
||||
```make
|
||||
BLUETOOTH_ENABLE = yes
|
||||
BLUETOOTH_DRIVER = bluefruit_le # or rn42
|
||||
```
|
||||
|
||||
## Bluetooth Keycodes
|
||||
|
||||
This is used when multiple keyboard outputs can be selected. Currently this only allows for switching between USB and Bluetooth on keyboards that support both.
|
||||
|
||||
| Key | Aliases | Description |
|
||||
|-----------------------|----------------------|------------------------------------------------|
|
||||
| `QK_OUTPUT_NEXT` | `OU_NEXT`, `OU_AUTO` | Automatically switch between USB and Bluetooth |
|
||||
| `QK_OUTPUT_USB` | `OU_USB` | USB only |
|
||||
| `QK_OUTPUT_BLUETOOTH` | `OU_BT` | Bluetooth only |
|
147
docs/features/community_modules.md
Normal file
147
docs/features/community_modules.md
Normal file
@ -0,0 +1,147 @@
|
||||
# Community Modules
|
||||
|
||||
Community Modules are a feature within QMK which allows code to be implemented by third parties, making it available for other people to import into their own builds.
|
||||
|
||||
These modules can provide implementations which override or enhance normal QMK processing; initialization, key processing, suspend, and shutdown are some of the provided hooks which modules may implement.
|
||||
|
||||
## Adding a Community Module to your build
|
||||
|
||||
Community Modules have first-class support for [External Userspace](/newbs_external_userspace), and QMK strongly recommends using External Userspace for hosting keymaps and Community Modules together.
|
||||
|
||||
Modules must live in either of two locations:
|
||||
|
||||
* `<QMK_USERSPACE>/modules/`
|
||||
* `<QMK_FIRMWARE>/modules/`
|
||||
|
||||
A basic module is provided within QMK itself -- `qmk/hello_world` -- which prints out a notification over [HID console](/faq_debug) after 10 seconds, and adds a new keycode, `COMMUNITY_MODULE_HELLO` (aliased to `CM_HELO`) which types `Hello there.` to the active application when the corresponding key is pressed.
|
||||
|
||||
To add this module to your build, in your keymap's directory create a `keymap.json` with the following content:
|
||||
|
||||
```json
|
||||
{
|
||||
"modules": [
|
||||
"qmk/hello_world"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
If you already have a `keymap.json`, you'll need to manually merge the `modules` section into your keymap.
|
||||
|
||||
::: warning
|
||||
Community Modules are not supported by QMK Configurator. If you wish to use Community Modules, you must build your own firmware.
|
||||
:::
|
||||
|
||||
## Adding a Community Module to your External Userspace
|
||||
|
||||
Module authors are encouraged to provide a git repository on GitHub which may be imported into a user's external userspace. If a user wishes to import a module repository, they can do the following:
|
||||
|
||||
```sh
|
||||
cd /path/to/your/external/userspace
|
||||
mkdir -p modules
|
||||
# Replace the following {user} and {repo} with the author's community module repository
|
||||
git submodule add https://github.com/{user}/{repo}.git modules/{user}
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
|
||||
This will ensure the copy of the module is made in your userspace.
|
||||
|
||||
Add a new entry into your `keymap.json` with the desired modules, replacing `{user}` and `{module_name}` as appropriate:
|
||||
|
||||
```json
|
||||
{
|
||||
"modules": [
|
||||
"qmk/hello_world",
|
||||
"{user}/{module_name}"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
::: info
|
||||
The module listed in `keymap.json` is the relative path within the `modules/` directory. So long as the module is present _somewhere_ under `modules/`, then the `keymap.json` can refer to that path.
|
||||
:::
|
||||
|
||||
## Writing a QMK Community Module
|
||||
|
||||
As stated earlier, Community Module authors are strongly encouraged to provide their modules through git, allowing users to leverage submodules to import functionality.
|
||||
|
||||
### `qmk_module.json`
|
||||
|
||||
A Community Module is denoted by a `qmk_module.json` file such as the following:
|
||||
|
||||
```json
|
||||
{
|
||||
"module_name": "Hello World",
|
||||
"maintainer": "QMK Maintainers",
|
||||
"license": "GPL-2.0-or-later",
|
||||
"features": {
|
||||
"deferred_exec": true
|
||||
},
|
||||
"keycodes": [
|
||||
{
|
||||
"key": "COMMUNITY_MODULE_HELLO",
|
||||
"aliases": ["CM_HELO"]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
At minimum, the module must provide the `module_name` and `maintainer` fields.
|
||||
|
||||
The `license` field is encouraged to indicate the terms for using and sharing the module. It is recommended to use a [SPDX license identifier](https://spdx.org/licenses/) like "`Apache-2.0`" or "`GPL-2.0-or-later`" if possible.
|
||||
|
||||
The `url` field may specify a URL to more information about the module.
|
||||
|
||||
The use of `features` matches the definition normally provided within `keyboard.json` and `info.json`, allowing a module to signal to the build system that it has its own dependencies. In the example above, it enables the _deferred executor_ feature whenever the above module is used in a build.
|
||||
|
||||
The `keycodes` array allows a module to provide new keycodes (as well as corresponding aliases) to a keymap.
|
||||
|
||||
### `rules.mk` / `post_rules.mk`
|
||||
|
||||
These two files follows standard QMK build system logic, allowing for `Makefile`-style customisation as if it were present in the keyboard or keymap.
|
||||
|
||||
### `<module>.c`
|
||||
|
||||
This file will be automatically added to the build if the filename matches the directory name. For example, the `qmk/hello_world` module contains a `hello_world.c` file, which is automatically added to the build.
|
||||
|
||||
::: info
|
||||
Other files intended to be included must use the normal method of `SRC += my_file.c` inside `rules.mk`.
|
||||
:::
|
||||
|
||||
::: tip
|
||||
This file should use `ASSERT_COMMUNITY_MODULES_MIN_API_VERSION(1,0,0);` to enforce a minimum version of the API that it requires, ensuring the Community Module is built with a compatible version of QMK. The list of APIs and corresponding version is given at the bottom of this document. Note the use of commas instead of periods.
|
||||
:::
|
||||
|
||||
### `introspection.c` / `introspection.h`
|
||||
|
||||
These two files hook into the keymap introspection logic -- the header is prepended before the user keymap, and the C source file is appended after the user keymap.
|
||||
|
||||
The header may provide definitions which are useful to the user's `keymap.c`.
|
||||
|
||||
The source file may provide functions which allow access to information specified in the user's `keymap.c`.
|
||||
|
||||
::: warning
|
||||
Introspection is a relatively advanced topic within QMK, and existing patterns should be followed. If you need help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) or [chat with us on Discord](https://discord.gg/qmk).
|
||||
:::
|
||||
|
||||
### Compatible APIs
|
||||
|
||||
Community Modules may provide specializations for the following APIs:
|
||||
|
||||
| Base API | API Format | Example (`hello_world` module) | API Version |
|
||||
|----------------------------|-------------------------------------|----------------------------------------|-------------|
|
||||
| `keyboard_pre_init` | `keyboard_pre_init_<module>` | `keyboard_pre_init_hello_world` | `0.1.0` |
|
||||
| `keyboard_post_init` | `keyboard_post_init_<module>` | `keyboard_post_init_hello_world` | `0.1.0` |
|
||||
| `pre_process_record` | `pre_process_record_<module>` | `pre_process_record_hello_world` | `0.1.0` |
|
||||
| `process_record` | `process_record_<module>` | `process_record_hello_world` | `0.1.0` |
|
||||
| `post_process_record` | `post_process_record_<module>` | `post_process_record_hello_world` | `0.1.0` |
|
||||
| `housekeeping_task` | `housekeeping_task_<module>` | `housekeeping_task_hello_world` | `1.0.0` |
|
||||
| `suspend_power_down` | `suspend_power_down_<module>` | `suspend_power_down_hello_world` | `1.0.0` |
|
||||
| `suspend_wakeup_init` | `suspend_wakeup_init_<module>` | `suspend_wakeup_init_hello_world` | `1.0.0` |
|
||||
| `shutdown` | `shutdown_<module>` | `shutdown_hello_world` | `1.0.0` |
|
||||
| `process_detected_host_os` | `process_detected_host_os_<module>` | `process_detected_host_os_hello_world` | `1.0.0` |
|
||||
|
||||
::: info
|
||||
An unspecified API is disregarded if a Community Module does not provide a specialization for it.
|
||||
:::
|
||||
|
||||
Each API has an equivalent `_<module>_kb()` and `_<module>_user()` hook, as per the normal QMK [`_quantum`, `_kb`, and `_user` functions](/custom_quantum_functions#a-word-on-core-vs-keyboards-vs-keymap).
|
@ -1,6 +1,6 @@
|
||||
# Joystick {#joystick}
|
||||
|
||||
This feature provides game controller input as a joystick device supporting up to 6 axes and 32 buttons. Axes can be read either from an [ADC-capable input pin](../drivers/adc), or can be virtual, so that its value is provided by your code.
|
||||
This feature provides game controller input as a joystick device supporting up to 6 axes, 32 buttons and a hat switch. Axes can be read either from an [ADC-capable input pin](../drivers/adc), or can be virtual, so that its value is provided by your code.
|
||||
|
||||
An analog device such as a [potentiometer](https://en.wikipedia.org/wiki/Potentiometer) found on an analog joystick's axes is based on a voltage divider, where adjusting the movable wiper controls the output voltage which can then be read by the microcontroller's ADC.
|
||||
|
||||
@ -37,6 +37,42 @@ By default, two axes and eight buttons are defined, with a reported resolution o
|
||||
You must define at least one button or axis. Also note that the maximum ADC resolution of the supported AVR MCUs is 10-bit, and 12-bit for most STM32 MCUs.
|
||||
:::
|
||||
|
||||
### Hat Switch {#hat-switch}
|
||||
|
||||
To enable the 8-way hat switch, add the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define JOYSTICK_HAS_HAT
|
||||
````
|
||||
|
||||
The position can be set by calling `joystick_set_hat(value)`. The range of values moves clockwise from the top (ie. north), with the default "center" position represented by a value of `-1`:
|
||||
|
||||
```
|
||||
0
|
||||
7 N 1
|
||||
NW .--'--. NE
|
||||
/ \
|
||||
6 W | -1 | E 2
|
||||
\ /
|
||||
SW '--.--' SE
|
||||
5 S 3
|
||||
4
|
||||
```
|
||||
|
||||
Alternatively you can use these predefined names:
|
||||
|
||||
|Define |Value|Angle|
|
||||
|------------------------|-----|-----|
|
||||
|`JOYSTICK_HAT_CENTER` |`-1` | |
|
||||
|`JOYSTICK_HAT_NORTH` |`0` |0° |
|
||||
|`JOYSTICK_HAT_NORTHEAST`|`1` |45° |
|
||||
|`JOYSTICK_HAT_EAST` |`2` |90° |
|
||||
|`JOYSTICK_HAT_SOUTHEAST`|`3` |135° |
|
||||
|`JOYSTICK_HAT_SOUTH` |`4` |180° |
|
||||
|`JOYSTICK_HAT_SOUTHWEST`|`5` |225° |
|
||||
|`JOYSTICK_HAT_WEST` |`6` |270° |
|
||||
|`JOYSTICK_HAT_NORTHWEST`|`7` |315° |
|
||||
|
||||
### Axes {#axes}
|
||||
|
||||
When defining axes for your joystick, you must provide a definition array typically in your `keymap.c`.
|
||||
@ -149,6 +185,8 @@ Contains the state of the joystick.
|
||||
A bit-packed array containing the joystick button states. The size is calculated as `(JOYSTICK_BUTTON_COUNT - 1) / 8 + 1`.
|
||||
- `int16_t axes[]`
|
||||
An array of analog values for each defined axis.
|
||||
- `int8_t hat`
|
||||
The hat switch position.
|
||||
- `bool dirty`
|
||||
Whether the current state needs to be sent to the host.
|
||||
|
||||
@ -222,3 +260,14 @@ Set the value of the given axis.
|
||||
The axis to set the value of.
|
||||
- `int16_t value`
|
||||
The value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void joystick_set_hat(int8_t value)` {#api-joystick-set-hat}
|
||||
|
||||
Set the position of the hat switch.
|
||||
|
||||
#### Arguments {#api-joystick-set-hat-arguments}
|
||||
|
||||
- `int8_t value`
|
||||
The hat switch position to set.
|
||||
|
139
docs/features/layer_lock.md
Normal file
139
docs/features/layer_lock.md
Normal file
@ -0,0 +1,139 @@
|
||||
# Layer Lock
|
||||
|
||||
Some [layer switches](../feature_layers#switching-and-toggling-layers) access
|
||||
the layer by holding the key, including momentary layer `MO(layer)` and layer
|
||||
tap `LT(layer, key)` keys. You may sometimes need to stay on the layer for a
|
||||
long period of time. Layer Lock "locks" the current layer to stay on, supposing
|
||||
it was accessed by one of:
|
||||
|
||||
* `MO(layer)` momentary layer switch
|
||||
* `LT(layer, key)` layer tap
|
||||
* `OSL(layer)` one-shot layer
|
||||
* `TT(layer)` layer tap toggle
|
||||
* `LM(layer, mod)` layer-mod key (the layer is locked, but not the mods)
|
||||
|
||||
Press the Layer Lock key again to unlock the layer. Additionally, when a layer
|
||||
is locked, layer switch keys that turn off the layer such as `TO(other_layer)`
|
||||
will unlock it.
|
||||
|
||||
|
||||
## How do I enable Layer Lock
|
||||
|
||||
In your rules.mk, add:
|
||||
|
||||
```make
|
||||
LAYER_LOCK_ENABLE = yes
|
||||
```
|
||||
|
||||
Pick a key in your keymap on a layer you intend to lock, and assign it the
|
||||
keycode `QK_LAYER_LOCK` (short alias `QK_LLCK`). Note that locking the base
|
||||
layer has no effect, so typically, this key is used on layers above the base
|
||||
layer.
|
||||
|
||||
|
||||
## Example use
|
||||
|
||||
Consider a keymap with the following base layer.
|
||||
|
||||

|
||||
|
||||
The highlighted key is a momentary layer switch `MO(NAV)`. Holding it accesses a
|
||||
navigation layer.
|
||||
|
||||

|
||||
|
||||
|
||||
Holding the NAV key is fine for brief use, but awkward to continue holding when
|
||||
using navigation functions continuously. The Layer Lock key comes to the rescue:
|
||||
|
||||
1. Hold the NAV key, activating the navigation layer.
|
||||
2. Tap Layer Lock.
|
||||
3. Release NAV. The navigation layer stays on.
|
||||
4. Make use of the arrow keys, etc.
|
||||
5. Tap Layer Lock or NAV again to turn the navigation layer back off.
|
||||
|
||||
A variation that would also work is to put the Layer Lock key on the base layer
|
||||
and make other layers transparent (`KC_TRNS`) in that position. Pressing the
|
||||
Layer Lock key locks (or unlocks) the highest active layer, regardless of which
|
||||
layer the Layer Lock key is on.
|
||||
|
||||
|
||||
## Idle timeout
|
||||
|
||||
Optionally, Layer Lock may be configured to unlock if the keyboard is idle
|
||||
for some time. In config.h, define `LAYER_LOCK_IDLE_TIMEOUT` in units of
|
||||
milliseconds:
|
||||
|
||||
```c
|
||||
#define LAYER_LOCK_IDLE_TIMEOUT 60000 // Turn off after 60 seconds.
|
||||
```
|
||||
|
||||
|
||||
## Functions
|
||||
|
||||
Use the following functions to query and manipulate the layer lock state.
|
||||
|
||||
| Function | Description |
|
||||
|----------------------------|------------------------------------|
|
||||
| `is_layer_locked(layer)` | Checks whether `layer` is locked. |
|
||||
| `layer_lock_on(layer)` | Locks and turns on `layer`. |
|
||||
| `layer_lock_off(layer)` | Unlocks and turns off `layer`. |
|
||||
| `layer_lock_invert(layer)` | Toggles whether `layer` is locked. |
|
||||
|
||||
|
||||
## Representing the current Layer Lock state
|
||||
|
||||
There is an optional callback `layer_lock_set_user()` that gets called when a
|
||||
layer is locked or unlocked. This is useful to represent the current lock state
|
||||
for instance by setting an LED. In keymap.c, define
|
||||
|
||||
```c
|
||||
bool layer_lock_set_user(layer_state_t locked_layers) {
|
||||
// Do something like `set_led(is_layer_locked(NAV));`
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
||||
The argument `locked_layers` is a bitfield in which the kth bit is on if the kth
|
||||
layer is locked. Alternatively, you can use `is_layer_locked(layer)` to check if
|
||||
a given layer is locked.
|
||||
|
||||
|
||||
## Combine Layer Lock with a mod-tap
|
||||
|
||||
It is possible to create a [mod-tap MT key](../mod_tap) that acts as a modifier
|
||||
on hold and Layer Lock on tap. Since Layer Lock is not a [basic
|
||||
keycode](../keycodes_basic), attempting `MT(mod, QK_LLCK)` is invalid does not
|
||||
work directly, yet this effect can be achieved through [changing the tap
|
||||
function](../mod_tap#changing-tap-function). For example, the following
|
||||
implements a `SFTLLCK` key that acts as Shift on hold and Layer Lock on tap:
|
||||
|
||||
```c
|
||||
#define SFTLLCK LSFT_T(KC_0)
|
||||
|
||||
// Use SFTLLCK in your keymap...
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
case SFTLLCK:
|
||||
if (record->tap.count) {
|
||||
if (record->event.pressed) {
|
||||
// Toggle the lock on the highest layer.
|
||||
layer_lock_invert(get_highest_layer(layer_state));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
// Other macros...
|
||||
}
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
||||
In the above, `KC_0` is an arbitrary placeholder for the tapping keycode. This
|
||||
keycode will never be sent, so any basic keycode will do. In
|
||||
`process_record_user()`, the tap press event is changed to toggle the lock on
|
||||
the highest layer. Layer Lock can be combined with a [layer-tap LT
|
||||
key](../feature_layers#switching-and-toggling-layers) similarly.
|
||||
|
@ -154,6 +154,21 @@ User callback, invoked when the leader sequence ends.
|
||||
|
||||
---
|
||||
|
||||
### `bool leader_add_user(uint16_t keycode)` {#api-leader-add-user}
|
||||
|
||||
User callback, invoked when a keycode is added to the leader sequence.
|
||||
|
||||
#### Arguments {#api-leader-add-user-arguments}
|
||||
|
||||
- `uint16_t keycode`
|
||||
The keycode to added to the leader sequence.
|
||||
|
||||
#### Return Value {#api-leader-add-user-return}
|
||||
|
||||
`true` to finish the key sequence, `false` to continue.
|
||||
|
||||
---
|
||||
|
||||
### `void leader_start(void)` {#api-leader-start}
|
||||
|
||||
Begin the leader sequence, resetting the buffer and timer.
|
||||
|
@ -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
|
||||
|
@ -214,7 +214,9 @@ When additional overlapping mouse key is pressed, the mouse cursor will continue
|
||||
|`MOUSEKEY_OVERLAP_WHEEL_DELTA`|`MOUSEKEY_WHEEL_DELTA`|Step size of reset mouse wheel acceleration |
|
||||
|`MOUSEKEY_OVERLAP_INTERVAL` |`MOUSEKEY_INTERVAL` |Reset time between cursor movements in milliseconds (Kinetic mode only)|
|
||||
|
||||
?> This feature will not be applied on Inertial mode
|
||||
::: tip
|
||||
This feature will not be applied on Inertial mode
|
||||
:::
|
||||
|
||||
## Use with PS/2 Mouse and Pointing Device
|
||||
|
||||
|
@ -419,6 +419,32 @@ The `POINTING_DEVICE_CS_PIN`, `POINTING_DEVICE_SDIO_PIN`, and `POINTING_DEVICE_S
|
||||
Any pointing device with a lift/contact status can integrate inertial cursor feature into its driver, controlled by `POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE`. e.g. PMW3360 can use Lift_Stat from Motion register. Note that `POINTING_DEVICE_MOTION_PIN` cannot be used with this feature; continuous polling of `get_report()` is needed to generate glide reports.
|
||||
:::
|
||||
|
||||
## High Resolution Scrolling
|
||||
|
||||
| Setting | Description | Default |
|
||||
| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------- |
|
||||
| `POINTING_DEVICE_HIRES_SCROLL_ENABLE` | (Optional) Enables high resolution scrolling. | _not defined_ |
|
||||
| `POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER`| (Optional) Resolution mutiplier value used by high resolution scrolling. Must be between 1 and 127, inclusive. | `120` |
|
||||
| `POINTING_DEVICE_HIRES_SCROLL_EXPONENT` | (Optional) Resolution exponent value used by high resolution scrolling. Must be between 0 and 127, inclusive. | `0` |
|
||||
|
||||
The `POINTING_DEVICE_HIRES_SCROLL_ENABLE` setting enables smooth and continuous scrolling when using trackballs or high-end encoders as mouse wheels (as opposed to the typical stepped behavior of most mouse wheels).
|
||||
This works by adding a resolution multiplier to the HID descriptor for mouse wheel reports, causing the host computer to interpret each wheel tick sent by the keyboard as a fraction of a normal wheel tick.
|
||||
The resolution multiplier is set to `1 / (POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER * (10 ^ POINTING_DEVICE_HIRES_SCROLL_EXPONENT))`, which is `1 / 120` by default.
|
||||
If even smoother scrolling than provided by this default value is desired, first try using `#define POINTING_DEVICE_HIRES_SCROLL_EXPONENT 1` which will result in a multiplier of `1 / 1200`.
|
||||
|
||||
The function `pointing_device_get_hires_scroll_resolution()` can be called to get the pre-computed resolution multiplier value as a `uint16_t`.
|
||||
|
||||
::: warning
|
||||
High resolution scrolling usually results in larger and/or more frequent mouse reports. This can result in overflow errors and overloading of the host computer's input buffer.
|
||||
To deal with these issues, define `WHEEL_EXTENDED_REPORT` and throttle the rate at which mouse reports are sent.
|
||||
:::
|
||||
|
||||
::: warning
|
||||
Many programs, especially those that implement their own smoothing for scrolling, don't work well when they receive simultaneous vertical and horizontal wheel inputs (e.g. from high resolution drag-scroll using a trackball).
|
||||
These programs typically implement their smoothing in a way that assumes the user will only scroll in one axis at a time, resulting in slow or jittery motion when trying to scroll at an angle.
|
||||
This can be addressed by snapping scrolling to one axis at a time.
|
||||
:::
|
||||
|
||||
## Split Keyboard Configuration
|
||||
|
||||
The following configuration options are only available when using `SPLIT_POINTING_ENABLE` see [data sync options](split_keyboard#data-sync-options). The rotation and invert `*_RIGHT` options are only used with `POINTING_DEVICE_COMBINED`. If using `POINTING_DEVICE_LEFT` or `POINTING_DEVICE_RIGHT` use the common configuration above to configure your pointing device.
|
||||
|
@ -90,18 +90,22 @@ PS2_ENABLE = yes
|
||||
PS2_DRIVER = interrupt
|
||||
```
|
||||
|
||||
In your keyboard config.h:
|
||||
In your keyboard `config.h`:
|
||||
|
||||
```c
|
||||
#define PS2_CLOCK_PIN A8
|
||||
#define PS2_DATA_PIN A9
|
||||
```
|
||||
|
||||
And in the chibios specifig halconf.h:
|
||||
```c
|
||||
#define PAL_USE_CALLBACKS TRUE
|
||||
```
|
||||
And in the ChibiOS specific `halconf.h`:
|
||||
|
||||
```c
|
||||
#pragma once
|
||||
|
||||
#define PAL_USE_CALLBACKS TRUE // [!code focus]
|
||||
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
|
||||
### USART Version {#usart-version}
|
||||
|
||||
|
@ -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
|
||||
|
@ -59,6 +59,10 @@ Changing the **Value** sets the overall brightness.<br>
|
||||
|
||||
## Keycodes
|
||||
|
||||
::: warning
|
||||
These keycodes also simultaneously control [RGB Matrix](rgb_matrix), if enabled. This behaviour is in the process of being deprecated, so during this time it is recommended to additionally include the dedicated RGB Matrix keycodes to your keymap, and add `#define RGB_MATRIX_DISABLE_SHARED_KEYCODES` to `config.h`.
|
||||
:::
|
||||
|
||||
|Key |Aliases |Description |
|
||||
|------------------------------|----------|---------------------------------------------------------------------|
|
||||
|`QK_UNDERGLOW_TOGGLE` |`UG_TOGG` |Toggle RGB lighting on or off |
|
||||
@ -93,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 |
|
||||
|
@ -444,7 +444,7 @@ This setting implies that `RGBLIGHT_SPLIT` is enabled, and will forcibly enable
|
||||
#define SPLIT_USB_DETECT
|
||||
```
|
||||
|
||||
Enabling this option changes the startup behavior to listen for an active USB communication to delegate which part is master and which is slave. With this option enabled and theres's USB communication, then that half assumes it is the master, otherwise it assumes it is the slave.
|
||||
Enabling this option changes the startup behavior to listen for an active USB communication to delegate which part is master and which is slave. With this option enabled and active USB communication, then that half assumes it is the master, otherwise it assumes it is the slave.
|
||||
|
||||
Without this option, the master is the half that can detect voltage on the physical USB connection (VBUS detection).
|
||||
|
||||
|
58
docs/features/wireless.md
Normal file
58
docs/features/wireless.md
Normal file
@ -0,0 +1,58 @@
|
||||
# Wireless / Bluetooth
|
||||
|
||||
## Bluetooth Known Supported Hardware
|
||||
|
||||
Currently Bluetooth support is limited to AVR based chips. For Bluetooth 2.1, QMK has support for RN-42 modules. For more recent BLE protocols, currently only the Adafruit Bluefruit SPI Friend is directly supported. BLE is needed to connect to iOS devices. Note iOS does not support mouse input.
|
||||
|
||||
|Board |Bluetooth Protocol |Connection Type|rules.mk |Bluetooth Chip|
|
||||
|----------------------------------------------------------------|--------------------|---------------|---------------------------------|--------------|
|
||||
|Roving Networks RN-42 (Sparkfun Bluesmirf) |Bluetooth Classic |UART |`BLUETOOTH_DRIVER = rn42` |RN-42 |
|
||||
|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633)|Bluetooth Low Energy|SPI |`BLUETOOTH_DRIVER = bluefruit_le`|nRF51822 |
|
||||
|
||||
Not Supported Yet but possible:
|
||||
* [Bluefruit LE UART Friend](https://www.adafruit.com/product/2479). [Possible tmk implementation found in](https://github.com/tmk/tmk_keyboard/issues/514)
|
||||
* HC-05 boards flashed with RN-42 firmware. They apparently both use the CSR BC417 Chip. Flashing it with RN-42 firmware gives it HID capability.
|
||||
* Sparkfun Bluetooth Mate
|
||||
* HM-13 based boards
|
||||
|
||||
### Adafruit BLE SPI Friend
|
||||
Currently The only bluetooth chipset supported by QMK is the Adafruit Bluefruit SPI Friend. It's a Nordic nRF51822 based chip running Adafruit's custom firmware. Data is transmitted via Adafruit's SDEP over Hardware SPI. The [Feather 32u4 Bluefruit LE](https://www.adafruit.com/product/2829) is supported as it's an AVR mcu connected via SPI to the Nordic BLE chip with Adafruit firmware. If Building a custom board with the SPI friend it would be easiest to just use the pin selection that the 32u4 feather uses but you can change the pins in the config.h options with the following defines:
|
||||
* `#define BLUEFRUIT_LE_RST_PIN D4`
|
||||
* `#define BLUEFRUIT_LE_CS_PIN B4`
|
||||
* `#define BLUEFRUIT_LE_IRQ_PIN E6`
|
||||
|
||||
A Bluefruit UART friend can be converted to an SPI friend, however this [requires](https://github.com/qmk/qmk_firmware/issues/2274) some reflashing and soldering directly to the MDBT40 chip.
|
||||
|
||||
<!-- FIXME: Document bluetooth support more completely. -->
|
||||
## Bluetooth Rules.mk Options
|
||||
|
||||
The currently supported Bluetooth chipsets do not support [N-Key Rollover (NKRO)](../reference_glossary#n-key-rollover-nkro), so `rules.mk` must contain `NKRO_ENABLE = no`.
|
||||
|
||||
Add the following to your `rules.mk`:
|
||||
|
||||
```make
|
||||
BLUETOOTH_ENABLE = yes
|
||||
BLUETOOTH_DRIVER = bluefruit_le # or rn42
|
||||
```
|
||||
|
||||
## Bluetooth Keycodes
|
||||
|
||||
This is used when multiple keyboard outputs can be selected. Currently this only allows for switching between USB and Bluetooth on keyboards that support both.
|
||||
|
||||
| Key | Aliases | Description |
|
||||
|-----------------------------|-----------|-----------------------------------------------------------------------------------------------|
|
||||
| `QK_OUTPUT_AUTO` | `OU_AUTO` | Automatically switch to USB when plugged in, otherwise use wireless |
|
||||
| `QK_OUTPUT_NEXT` | `OU_NEXT` | Cycle forwards through USB, Bluetooth, and 2.4GHz (when available) **(not yet implemented)** |
|
||||
| `QK_OUTPUT_PREV` | `OU_PREV` | Cycle backwards through USB, Bluetooth, and 2.4GHz (when available) **(not yet implemented)** |
|
||||
| `QK_OUTPUT_NONE` | `OU_NONE` | Disable all output **(not yet implemented)** |
|
||||
| `QK_OUTPUT_USB` | `OU_USB` | Output to USB only |
|
||||
| `QK_OUTPUT_2P4GHZ` | `OU_2P4G` | Output to 2.4GHz only **(not yet implemented)** |
|
||||
| `QK_OUTPUT_BLUETOOTH` | `OU_BT` | Output to Bluetooth only |
|
||||
| `QK_BLUETOOTH_PROFILE_NEXT` | `BT_NEXT` | Move to the next Bluetooth profile **(not yet implemented)** |
|
||||
| `QK_BLUETOOTH_PROFILE_PREV` | `BT_PREV` | Move to the previous Bluetooth profile **(not yet implemented)** |
|
||||
| `QK_BLUETOOTH_UNPAIR` | `BT_UNPR` | Un-pair the current Bluetooth profile **(not yet implemented)** |
|
||||
| `QK_BLUETOOTH_PROFILE1` | `BT_PRF1` | Swap to Bluetooth profile #1 **(not yet implemented)** |
|
||||
| `QK_BLUETOOTH_PROFILE2` | `BT_PRF2` | Swap to Bluetooth profile #2 **(not yet implemented)** |
|
||||
| `QK_BLUETOOTH_PROFILE3` | `BT_PRF3` | Swap to Bluetooth profile #3 **(not yet implemented)** |
|
||||
| `QK_BLUETOOTH_PROFILE4` | `BT_PRF4` | Swap to Bluetooth profile #4 **(not yet implemented)** |
|
||||
| `QK_BLUETOOTH_PROFILE5` | `BT_PRF5` | Swap to Bluetooth profile #5 **(not yet implemented)** |
|
@ -345,6 +345,39 @@ Flashing sequence:
|
||||
3. Flash a .bin file
|
||||
4. Reset the device into application mode (may be done automatically)
|
||||
|
||||
## AT32 DFU
|
||||
|
||||
All AT32 MCUs come preloaded with a factory bootloader that cannot be modified nor deleted.
|
||||
|
||||
To ensure compatibility with the AT32-DFU bootloader, make sure this block is present in your `rules.mk`:
|
||||
|
||||
```make
|
||||
# Bootloader selection
|
||||
BOOTLOADER = at32-dfu
|
||||
```
|
||||
|
||||
Compatible flashers:
|
||||
|
||||
* [dfu-util](https://dfu-util.sourceforge.net/) / `:dfu-util` target in QMK (recommended command line)
|
||||
```
|
||||
dfu-util -a 0 -d 2E3C:DF11 -s 0x8000000:leave -D <filename>
|
||||
```
|
||||
|
||||
Flashing sequence:
|
||||
|
||||
1. Enter the bootloader using any of the following methods:
|
||||
* Tap the `QK_BOOT` keycode
|
||||
* If a reset circuit is present, tap the `RESET` button on the PCB; some boards may also have a toggle switch that must be flipped
|
||||
* Otherwise, you need to bridge `BOOT0` to VCC (via `BOOT0` button or jumper), short `RESET` to GND (via `RESET` button or jumper), and then let go of the `BOOT0` bridge
|
||||
2. Wait for the OS to detect the device
|
||||
3. Flash a .bin file
|
||||
4. Reset the device into application mode (may be done automatically)
|
||||
|
||||
### `make` Targets
|
||||
|
||||
* `:dfu-util`: Waits until an AT32 bootloader device is available, and then flashes the firmware.
|
||||
* `:dfu-util-split-left` and `:dfu-util-split-right`: Flashes the firmware as with `:dfu-util`, but also sets the handedness setting in EEPROM.
|
||||
|
||||
## tinyuf2
|
||||
|
||||
Keyboards may opt into supporting the tinyuf2 bootloader. This is currently only supported on F303/F401/F411.
|
||||
|
@ -50,6 +50,13 @@ By default docker or podman are automatically detected and docker is preferred o
|
||||
RUNTIME="podman" util/docker_build.sh keyboard:keymap:target
|
||||
```
|
||||
|
||||
If flashing is not required, it's possible to run the container as unprivileged (on Linux), and without docker-machine (on Windows/macOS):
|
||||
|
||||
```
|
||||
SKIP_FLASHING_SUPPORT=1 util/docker_build.sh keyboard:keymap:target
|
||||
```
|
||||
|
||||
|
||||
## FAQ
|
||||
|
||||
### Why can't I flash on Windows/macOS
|
||||
|
@ -231,7 +231,7 @@ Once you have confirmed that the keyboard is working, if you have used a seperat
|
||||
|
||||
If you found this fullfilling you could experiment by adding additional features such as [in switch LEDs](https://geekhack.org/index.php?topic=94258.0), [in switch RGB](https://www.reddit.com/r/MechanicalKeyboards/comments/5s1l5u/photoskeyboard_science_i_made_a_handwired_rgb/), [RGB underglow](https://medium.com/@DavidNZ/hand-wired-custom-keyboard-cdd14429c7b3#.7a1ovebsk) or even an [OLED display!](https://www.reddit.com/r/olkb/comments/5zy7og/adding_ssd1306_oled_display_to_your_build/)
|
||||
|
||||
There are a lot of possibilities inside the firmware - explore [docs.qmk.fm](https://docs.qmk.fm) for a full feature list, and dive into the different keyboards to see how people use all of them. You can always stop by [the OLKB subreddit](https://reddit.com/r/olkb) or [QMK Discord](https://discord.gg/qmk) for help!
|
||||
There are a lot of possibilities inside the firmware - explore [the documentation](/) for a full feature list, and dive into the different keyboards to see how people use all of them. You can always stop by [the OLKB subreddit](https://reddit.com/r/olkb) or [QMK Discord](https://discord.gg/qmk) for help!
|
||||
|
||||
## Links to Other Guides
|
||||
|
||||
|
@ -111,7 +111,7 @@ The `post_config.h` file can be used for additional post-processing, depending o
|
||||
#define USB_MAX_POWER_CONSUMPTION 400
|
||||
#else
|
||||
// fix iPhone and iPad power adapter issue
|
||||
// iOS device need lessthan 100
|
||||
// iOS devices need less than 100
|
||||
#define USB_MAX_POWER_CONSUMPTION 100
|
||||
#endif
|
||||
|
||||
|
@ -290,15 +290,27 @@ See also: [Backlighting](features/backlight)
|
||||
| `QK_BACKLIGHT_DOWN` | `BL_DOWN` | Decrease the backlight level |
|
||||
| `QK_BACKLIGHT_TOGGLE_BREATHING` | `BL_BRTG` | Toggle backlight breathing |
|
||||
|
||||
## Bluetooth {#bluetooth}
|
||||
## Wireless/Bluetooth {#bluetooth}
|
||||
|
||||
See also: [Bluetooth](features/bluetooth)
|
||||
See also: [Wireless](features/wireless)
|
||||
|
||||
| Key | Aliases | Description |
|
||||
|-----------------------|----------------------|------------------------------------------------|
|
||||
| `QK_OUTPUT_NEXT` | `OU_NEXT`, `OU_AUTO` | Automatically switch between USB and Bluetooth |
|
||||
| `QK_OUTPUT_USB` | `OU_USB` | USB only |
|
||||
| `QK_OUTPUT_BLUETOOTH` | `OU_BT` | Bluetooth only |
|
||||
| Key | Aliases | Description |
|
||||
|-----------------------------|-----------|-----------------------------------------------------------------------------------------------|
|
||||
| `QK_OUTPUT_AUTO` | `OU_AUTO` | Automatically switch to USB when plugged in, otherwise use wireless |
|
||||
| `QK_OUTPUT_NEXT` | `OU_NEXT` | Cycle forwards through USB, Bluetooth, and 2.4GHz (when available) **(not yet implemented)** |
|
||||
| `QK_OUTPUT_PREV` | `OU_PREV` | Cycle backwards through USB, Bluetooth, and 2.4GHz (when available) **(not yet implemented)** |
|
||||
| `QK_OUTPUT_NONE` | `OU_NONE` | Disable all output **(not yet implemented)** |
|
||||
| `QK_OUTPUT_USB` | `OU_USB` | Output to USB only |
|
||||
| `QK_OUTPUT_2P4GHZ` | `OU_2P4G` | Output to 2.4GHz only **(not yet implemented)** |
|
||||
| `QK_OUTPUT_BLUETOOTH` | `OU_BT` | Output to Bluetooth only |
|
||||
| `QK_BLUETOOTH_PROFILE_NEXT` | `BT_NEXT` | Move to the next Bluetooth profile **(not yet implemented)** |
|
||||
| `QK_BLUETOOTH_PROFILE_PREV` | `BT_PREV` | Move to the previous Bluetooth profile **(not yet implemented)** |
|
||||
| `QK_BLUETOOTH_UNPAIR` | `BT_UNPR` | Un-pair the current Bluetooth profile **(not yet implemented)** |
|
||||
| `QK_BLUETOOTH_PROFILE1` | `BT_PRF1` | Swap to Bluetooth profile #1 **(not yet implemented)** |
|
||||
| `QK_BLUETOOTH_PROFILE2` | `BT_PRF2` | Swap to Bluetooth profile #2 **(not yet implemented)** |
|
||||
| `QK_BLUETOOTH_PROFILE3` | `BT_PRF3` | Swap to Bluetooth profile #3 **(not yet implemented)** |
|
||||
| `QK_BLUETOOTH_PROFILE4` | `BT_PRF4` | Swap to Bluetooth profile #4 **(not yet implemented)** |
|
||||
| `QK_BLUETOOTH_PROFILE5` | `BT_PRF5` | Swap to Bluetooth profile #5 **(not yet implemented)** |
|
||||
|
||||
## Caps Word {#caps-word}
|
||||
|
||||
@ -375,13 +387,22 @@ See also: [Key Lock](features/key_lock)
|
||||
|---------|--------------------------------------------------------------|
|
||||
|`QK_LOCK`|Hold down the next key pressed, until the key is pressed again|
|
||||
|
||||
## Layer Lock {#layer-lock}
|
||||
|
||||
See also: [Layer Lock](features/layer_lock)
|
||||
|
||||
|Key |Aliases |Description |
|
||||
|---------------|---------|----------------------------------|
|
||||
|`QK_LAYER_LOCK`|`QK_LLCK`|Locks or unlocks the highest layer|
|
||||
|
||||
## Layer Switching {#layer-switching}
|
||||
|
||||
See also: [Layer Switching](feature_layers#switching-and-toggling-layers)
|
||||
|
||||
|Key |Description |
|
||||
|----------------|----------------------------------------------------------------------------------|
|
||||
|`DF(layer)` |Set the base (default) layer |
|
||||
|`DF(layer)` |Set the base (default) layer until the keyboard loses power |
|
||||
|`PDF(layer)` |Set the base (default) layer in EEPROM |
|
||||
|`MO(layer)` |Momentarily turn on `layer` when pressed (requires `KC_TRNS` on destination layer)|
|
||||
|`OSL(layer)` |Momentarily activates `layer` until a key is pressed. See [One Shot Keys](one_shot_keys) for details. |
|
||||
|`LM(layer, mod)`|Momentarily turn on `layer` (like MO) with `mod` active as well. Where `mod` is a mods_bit. Mods can be viewed [here](mod_tap). Example Implementation: `LM(LAYER_1, MOD_LALT)`|
|
||||
|
104
docs/license_violations.md
Normal file
104
docs/license_violations.md
Normal file
@ -0,0 +1,104 @@
|
||||
# License Violations
|
||||
|
||||
QMK Firmware has seen its fair share of license violations, which hurts the community and frustrates the QMK maintainers.
|
||||
|
||||
Typical non-compliance includes:
|
||||
|
||||
* Not providing any source code
|
||||
* Providing "crippled" source code, such as a wired-only firmware for a wireless-capable board
|
||||
|
||||
Boards from vendors who don't provide source code are proving to be a significant time sink as the QMK team and other support helpers volunteer their time trying to determine which board someone has before they can help -- and in these cases they can't help. Occasionally this is followed by abuse; something that QMK and its volunteers should not be subjected to, rather redirected to the vendor in question.
|
||||
|
||||
The QMK team now actively directs support requests back to each vendor - vendors must provide their own product support for their boards. The QMK team are volunteers, the vendor must not expect the team to act as their support staff.
|
||||
|
||||
## Offending Vendors
|
||||
|
||||
The QMK team cannot tell you which boards you should or should not purchase, but please consider the lack of license compliance from the following vendors before making your decision. If you wish to look at the boards upstream QMK Firmware currently supports, you can search [here](https://browse.qmk.fm/).
|
||||
|
||||
If you own a board from one of the following vendors already, consider asking them for the equivalent QMK source code if it's not already available. With enough customers demanding corresponding source code, vendors may start to change their policies.
|
||||
|
||||
| Vendor | Reason |
|
||||
|------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| Ajazz | Selling tri-mode boards based on QMK without sources. |
|
||||
| Alpaca / Apos | Selling wireless boards with "open" source code, but linking against closed-source wireless libraries. Crippled source code already unknowingly merged to QMK. |
|
||||
| Attack Shark | Selling tri-mode boards based on QMK without sources. (Clones of Ajazz?) |
|
||||
| BBB Keyboard | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
|
||||
| Chosfox | Selling L75 wired/wireless boards based on QMK without sources, just `via.json` provided. Raised on discord over multiple weeks without response. |
|
||||
| CIDOO | Selling wired boards based on QMK without sources, just `via.json` provided. |
|
||||
| ColorReco | Selling tri-mode boards based on QMK without sources. |
|
||||
| Darmoshark | Selling wired boards based on QMK without sources, just `via.json` provided. |
|
||||
| Epomaker | Lots of historical keyboards with `via.json` but no corresponding sources. Wireless code for a small handful provided, pending core cleanup for QMK upstreaming. Most other boards have source nowhere to be seen. |
|
||||
| Ergokbd (IFKB) | At least their crkbd clone ships with QMK+Vial, seemingly refuses to disclose sources despite multiple customers requesting them. |
|
||||
| iLovBee | Official 30-day copyright source code request issued Sep 11 2024 due to deception on PR, no response received. Ambiguity on PRs -- marketing says wireless, PR author said wired-only, then included wireless code anyway. Seemingly intentionally deceptive. |
|
||||
| KiiBOOM | Seems to use the same OEM as Epomaker, same problems. |
|
||||
| kprepublic | Makes no attempt to release source code, all boards in QMK are reverse-engineered, created, and supported by the community. New board variants magically appear without telling customers they're incompatible with existing QMK versions, in some cases bricking boards or requiring ISP flashing. |
|
||||
| Luminkey | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||
| Meletrix | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||
| mmd / Smartmmd / i-game.tech | Ambiguity on PRs -- marketing says wireless, PR author said wired-only, then included wireless code anyway. Seemingly intentionally deceptive. |
|
||||
| MyKeyClub | Community-supported JRIS75, vendor was contacted by community members and refused to cooperate. |
|
||||
| owlab | Selling wired based on QMK without sources, just `via.json` provided. Ambiguous as to whether or not wireless firmware is based on QMK, given that their configuration tool looks very similar to VIA. |
|
||||
| pressplayid | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided |
|
||||
| qwertykeys | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||
| Redragon | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
|
||||
| Riccks | Selling tri-mode boards based on QMK without sources. |
|
||||
| Royal Kludge | PRs for fake boards in order to attain VIA compatibility identified. Lots of other keyboards with `via.json` but no corresponding sources, attempted upstreaming crippled firmware without wireless. Wireless code for some provided, pending core cleanup for QMK upstreaming. PRs including different manufacturer names as well. |
|
||||
| Shenzhen Hangsheng | PR submissions with crippled firmware, debating with maintainers about wireless despite marketing material clearly stating tri-mode. |
|
||||
| Tacworks | Selling tri-mode boards based on QMK, crippled firmware already merged into QMK without wireless without QMK team realising. |
|
||||
| TKD / Vertex | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
|
||||
| WOBKEY | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
|
||||
| Weikav | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||
| Womier | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. |
|
||||
| Wuque Studio | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||
| XVX | Ambiguity on PRs -- marketing says wireless, PR author said wired-only. Seemingly intentionally deceptive. |
|
||||
| Yunzii | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||
| Zuoya | Selling tri-mode boards based on QMK without sources, just `via.json` provided. |
|
||||
|
||||
::: danger Violations
|
||||
Links are not provided above as the QMK team does not wish to inadvertently promote purchases of boards in violation of QMK's license.
|
||||
:::
|
||||
|
||||
## Licensing
|
||||
|
||||
QMK Firmware's license requires full disclosure of source code for any firmware which is based on QMK. This includes any of the following scenarios:
|
||||
|
||||
* Use of public QMK Firmware, but with "closed source" privately-held board definitions
|
||||
* Vendor-customised QMK Firmware, which the vendor keeps private for building their own boards
|
||||
* Any other non-QMK firmware which includes portions of QMK Firmware, such as adaptation of `via.c` into any other non-QMK firmware, even if used as a reference when translated to another programming language.
|
||||
|
||||
As per the GPL license requirements, vendors must provide entire source code for the as-shipped firmware.
|
||||
|
||||
QMK has traditionally been lenient with this clause -- providing source code to the QMK community is necessary but reproducing the exact build may not be possible. QMK has required functionally-equivalent source code to be made available. In rare cases exact code may be requested; vendors must keep copies regardless.
|
||||
|
||||
At minimum, vendors must provide the source code through some distribution mechanism. This could potentially be an clearly available downloadable copy of the code online, a fork of QMK Firmware, or even a DVD accompanying the product in the box.
|
||||
|
||||
If sources are unable to be provided in a timely fashion, QMK may revoke the vendor's license, effectively rendering them unable to leverage QMK.
|
||||
|
||||
Vendors choosing to keep things closed-source because of a desire to have a "competitive edge" compared to other vendors is unacceptable to both QMK and the community, and is a breach of the QMK license. There's no reason to do so; any new or interesting vendor-specific feature will be quickly replicated by other vendors or the community anyway.
|
||||
|
||||
## QMK PR Considerations
|
||||
|
||||
Vendors who submit PRs to QMK Firmware whilst not providing full sources for all of their license-violating boards will be put on hold until source code for all violating boards is provided. Intentional deception may result in boards being removed from QMK and all future PRs for that manufacturer being denied outright.
|
||||
|
||||
Submitting crippled source code in order to attain a merge into QMK Firmware to pave the way for VIA support is unacceptable. This includes submitting a wired-only firmware for a wireless-capable board, or any other PR which does not include key features as-advertised.
|
||||
|
||||
Reusing the `VID` and `PID` for multiple boards (such as for two variants, wired and wireless) is an unacceptable scenario as this creates confusion for support. Many customers have flashed boards with the wrong firmware, which could have been avoided if vendors were obvious about their board identification mechanisms.
|
||||
|
||||
If there is sufficient ambiguity about a board, supporting evidence will need to be presented to the QMK team. This may include impartial third parties who can demonstrate a board's existence and can confirm its feature set, such as well-known content producers; popular review sites or notable video creators may be leveraged. If such evidence is unavailable, as a last resort the vendor may be required to ship a fully functional board in full retail packaging to QMK maintainers for verification. Engineering samples will not be accepted, as one-off boards have been deceptively used in the past.
|
||||
|
||||
PRs submitted to upstream QMK should not expect an instant merge just because source code has been provided -- code from OEMs has historically been of a quality lower than QMK standards, so as per the [PR checklist](pr_checklist) submitters should make the changes as small as possible and be prepared to change their implementation.
|
||||
|
||||
## Detection
|
||||
|
||||
If the QMK team identifies or is informed of a license violation from a vendor:
|
||||
|
||||
* Any current and future PRs for that vendor will be indefinitely put on hold, preventing merge into QMK Firmware, thus preventing any out-of-the-box VIA support
|
||||
* Any existing keyboards from the vendor may be removed from QMK Firmware
|
||||
* Vendors will be added to the _offending vendors_ list above
|
||||
|
||||
Repeated violations may result in that vendor being disallowed from contributing the QMK in its entirety. In the worst case, the QMK team may choose to revoke a vendor's license to use QMK Firmware outright.
|
||||
|
||||
## Remediation
|
||||
|
||||
Vendors must provide fully-featured source code for each of their identified violations, matching the feature capabilities of their as-shipped products. This will usually be in their own fork of QMK Firmware while awaiting a merge into upstream.
|
||||
|
||||
Once all identified violations have been remediated, current and future PRs will no longer be on hold and the vendor will be removed from the offending vendors list above.
|
@ -2,7 +2,7 @@
|
||||
|
||||
The Mod-Tap key `MT(mod, kc)` acts like a modifier when held, and a regular keycode when tapped. In other words, you can have a key that sends Escape when you tap it, but functions as a Control or Shift key when you hold it down.
|
||||
|
||||
The modifiers this keycode and `OSM()` accept are prefixed with `MOD_`, not `KC_`:
|
||||
The modifiers (`mod`) argument to the `MT()` macro are prefixed with `MOD_`, not `KC_`:
|
||||
|
||||
|Modifier |Description |
|
||||
|----------|----------------------------------------|
|
||||
|
@ -4,7 +4,7 @@ Your computer keyboard has a processor inside of it, similar to the one inside y
|
||||
|
||||
QMK tries to put a lot of power into your hands by making easy things easy, and hard things possible. You don't have to know how to program to create powerful keymaps — you only have to follow a few simple syntax rules.
|
||||
|
||||
Not sure if your keyboard can run QMK? If it's a mechanical keyboard you built yourself chances are good it can. We support a [large number of hobbyist boards](https://qmk.fm/keyboards/). If your current keyboard can't run QMK there are a lot of choices out there for boards that do.
|
||||
Not sure if your keyboard can run QMK? If it's a mechanical keyboard you built yourself chances are good it can. We support a [large number of hobbyist boards](https://browse.qmk.fm/). If your current keyboard can't run QMK there are a lot of choices out there for boards that do.
|
||||
|
||||
::: tip Is This Guide For Me?
|
||||
If the thought of programming intimidates you, please [take a look at our online GUI](newbs_building_firmware_configurator) instead.
|
||||
|
@ -42,7 +42,7 @@ Look at the output from that command, you should see something like this:
|
||||
Ψ Created a new keymap called <github_username> in: /home/me/qmk_firmware/keyboards/clueboard/66/rev3/keymaps/<github_username>.
|
||||
```
|
||||
|
||||
This is the location of your new `keymap.c` file.
|
||||
This is the location of your new keymap file. Your keyboards default keymap file may be a `.json` file or a `.c` file. If your keymap is a `.json` file it can be converted to a `.c` file using QMK's [`json2c`](cli_commands#qmk-json2c) utility.
|
||||
|
||||
## Open `keymap.c` In Your Favorite Text Editor
|
||||
|
||||
|
@ -4,52 +4,51 @@ This page describes the support for [Compatible Microcontrollers](compatible_mic
|
||||
|
||||
If you have not yet you should read the [Keyboard Guidelines](hardware_keyboard_guidelines) to get a sense of how keyboards fit into QMK.
|
||||
|
||||
|
||||
QMK has a number of features to simplify working with keyboards. For most, you don't have to write a single line of code. To get started, run `qmk new-keyboard`:
|
||||
|
||||
```
|
||||
$ qmk new-keyboard
|
||||
Ψ Generating a new QMK keyboard directory
|
||||
|
||||
Name Your Keyboard Project
|
||||
For more infomation, see:
|
||||
https://docs.qmk.fm/hardware_keyboard_guidelines#naming-your-keyboardproject
|
||||
|
||||
keyboard Name? mycoolkeeb
|
||||
|
||||
Attribution
|
||||
Used for maintainer, copyright, etc
|
||||
|
||||
Your GitHub Username? [jsmith]
|
||||
|
||||
More Attribution
|
||||
Used for maintainer, copyright, etc
|
||||
|
||||
Your Real Name? [John Smith]
|
||||
|
||||
Pick Base Layout
|
||||
As a starting point, one of the common layouts can be used to bootstrap the process
|
||||
|
||||
Ψ Name Your Keyboard Project
|
||||
Ψ For more information, see:
|
||||
https://docs.qmk.fm/hardware_keyboard_guidelines#naming-your-keyboard-project
|
||||
Keyboard Name? mycoolkeeb
|
||||
Ψ Attribution
|
||||
Ψ Used for maintainer, copyright, etc.
|
||||
Your GitHub Username? [jsmith]
|
||||
Ψ More Attribution
|
||||
Ψ Used for maintainer, copyright, etc.
|
||||
Your Real Name? [John Smith]
|
||||
Ψ Pick Base Layout
|
||||
Ψ As a starting point, one of the common layouts can be used to
|
||||
bootstrap the process
|
||||
Default Layout?
|
||||
1. 60_ansi
|
||||
...
|
||||
50. tkl_iso
|
||||
51. none of the above
|
||||
Please enter your choice: [51]
|
||||
1. 60_abnt2
|
||||
...
|
||||
65. none of the above
|
||||
Please enter your choice: [65]
|
||||
Ψ What Powers Your Project
|
||||
Ψ Is your board using a separate development board, such as a Pro Micro,
|
||||
or is the microcontroller integrated onto the PCB?
|
||||
|
||||
What Powers Your Project
|
||||
For more infomation, see:
|
||||
https://docs.qmk.fm/#/compatible_microcontrollers
|
||||
|
||||
MCU?
|
||||
1. atmega32u4
|
||||
...
|
||||
22. STM32F303
|
||||
Please enter your choice: [12]
|
||||
For more information, see:
|
||||
https://docs.qmk.fm/compatible_microcontrollers
|
||||
Using a Development Board? [y/n] y
|
||||
Ψ Select Development Board
|
||||
Ψ For more information, see:
|
||||
https://docs.qmk.fm/compatible_microcontrollers
|
||||
Development Board?
|
||||
1. bit_c_pro
|
||||
...
|
||||
14. promicro
|
||||
...
|
||||
18. svlinky
|
||||
Please enter your choice: [14]
|
||||
Ψ Created a new keyboard called mycoolkeeb.
|
||||
Ψ To start working on things, `cd` into keyboards/mycoolkeeb,
|
||||
Ψ or open the directory in your preferred text editor.
|
||||
Ψ And build with qmk compile -kb mycoolkeeb -km default.
|
||||
Ψ Build Command: qmk compile -kb mycoolkeeb -km default.
|
||||
Ψ Project Location: /Users/jsmith/qmk_firmware/keyboards/mycoolkeeb.
|
||||
Ψ Now update the config files to match the hardware!
|
||||
```
|
||||
|
||||
This will create all the files needed to support your new keyboard, and populate the settings with default values. Now you just need to customize it for your keyboard.
|
||||
@ -58,13 +57,13 @@ This will create all the files needed to support your new keyboard, and populate
|
||||
|
||||
This is where you'll describe your keyboard. Please follow the [Keyboard Readme Template](documentation_templates#keyboard-readmemd-template) when writing your `readme.md`. You're encouraged to place an image at the top of your `readme.md`, please use an external service such as [Imgur](https://imgur.com) to host the images.
|
||||
|
||||
## `info.json`
|
||||
## `keyboard.json`
|
||||
|
||||
The `info.json` file is where you configure the hardware and feature set for your keyboard. There are a lot of options that can be placed in that file, too many to list here. For a complete overview of available options see the [Data Driven Configuration Options](reference_info_json) page.
|
||||
The `keyboard.json` file is where you configure the hardware and feature set for your keyboard. There are a lot of options that can be placed in that file, too many to list here. For a complete overview of available options see the [Data Driven Configuration Options](reference_info_json) page.
|
||||
|
||||
### Hardware Configuration
|
||||
|
||||
At the top of the `info.json` you'll find USB related settings. These control how your keyboard appears to the Operating System. If you don't have a good reason to change you should leave the `usb.vid` as `0xFEED`. For the `usb.pid` you should pick a number that is not yet in use.
|
||||
At the top of the `keyboard.json` you'll find USB related settings. These control how your keyboard appears to the Operating System. If you don't have a good reason to change you should leave the `usb.vid` as `0xFEED`. For the `usb.pid` you should pick a number that is not yet in use.
|
||||
|
||||
Do change the `manufacturer` and `keyboard_name` lines to accurately reflect your keyboard.
|
||||
|
||||
@ -82,10 +81,11 @@ Do change the `manufacturer` and `keyboard_name` lines to accurately reflect you
|
||||
Windows and macOS will display the `manufacturer` and `keyboard_name` in the list of USB devices. `lsusb` on Linux instead prefers the values in the list maintained by the [USB ID Repository](http://www.linux-usb.org/usb-ids.html). By default, it will only use `manufacturer` and `keyboard_name` if the list does not contain that `usb.vid` / `usb.pid`. `sudo lsusb -v` will show the values reported by the device, and they are also present in kernel logs after plugging it in.
|
||||
:::
|
||||
|
||||
|
||||
### Matrix Configuration
|
||||
|
||||
The next section of the `info` file deals with your keyboard's matrix. The first thing you should define is which pins on your MCU are connected to rows and columns. To do so simply specify the names of those pins:
|
||||
The next section of the `keyboard.json` deals with your keyboard's matrix. The first thing you should define is which pins on your MCU are connected to rows and columns. To do so simply specify the names of those pins:
|
||||
|
||||
#### Diode Matrix
|
||||
|
||||
```json
|
||||
"matrix_pins": {
|
||||
@ -94,7 +94,7 @@ The next section of the `info` file deals with your keyboard's matrix. The first
|
||||
},
|
||||
```
|
||||
|
||||
The size of the `matrix_pins.cols` and `matrix_pins.rows` arrays infer the size of the matrix (previously `MATRIX_ROWS` and `MATRIX_COLS`).
|
||||
The matrix dimensions are inferred from the length of the `matrix_pins.cols` and `matrix_pins.rows` arrays (previously specified explicitly in `config.h` with `MATRIX_ROWS` and `MATRIX_COLS`).
|
||||
|
||||
Finally, you can specify the direction your diodes point. This can be `COL2ROW` or `ROW2COL`.
|
||||
|
||||
@ -103,54 +103,56 @@ Finally, you can specify the direction your diodes point. This can be `COL2ROW`
|
||||
```
|
||||
|
||||
#### Direct Pin Matrix
|
||||
To configure a keyboard where each switch is connected to a separate pin and ground instead of sharing row and column pins, use `matrix_pins.direct`. The mapping defines the pins of each switch in rows and columns, from left to right. The size of the `matrix_pins.direct` array infers the size of the matrix. Use `NO_PIN` to fill in blank spaces. Overrides the behaviour of `diode_direction`, `matrix_pins.cols` and `matrix_pins.rows`.
|
||||
|
||||
To configure a keyboard where each switch is connected to a separate pin and ground instead of sharing row and column pins, use `matrix_pins.direct`. This overrides the behaviour of `diode_direction`, `matrix_pins.cols` and `matrix_pins.rows`, and they should not be specified together.
|
||||
|
||||
```json
|
||||
"matrix_pins": {
|
||||
"direct": [
|
||||
["F1", "E6", "B0", "B2", "B3" ],
|
||||
["F5", "F0", "B1", "B7", "D2" ],
|
||||
["F6", "F7", "C7", "D5", "D3" ],
|
||||
["B5", "C6", "B6", "NO_PIN", "NO_PIN"]
|
||||
["F1", "E6", "B0", "B2", "B3"],
|
||||
["F5", "F0", "B1", "B7", "D2"],
|
||||
["F6", "F7", "C7", "D5", "D3"],
|
||||
["B5", "C6", "B6", null, null]
|
||||
]
|
||||
},
|
||||
```
|
||||
|
||||
### Layout macros
|
||||
Here, the matrix dimensions are inferred directly from the dimensions of the `matrix_pins.direct` array. Since there are no row or column pins to prescribe the matrix dimensions, you can arrange it however you like. Each "row" must contain the same number of "column"s; use `null` to fill in blank spaces, but try to minimize them.
|
||||
|
||||
Next is configuring Layout Macro(s). These define the physical arrangement of keys, and its position within the matrix that a switch are connected to. This allows you to have a physical arrangement of keys that differs from the wiring matrix.
|
||||
### Layout Macros
|
||||
|
||||
Next is configuring layout macro(s). These define the physical arrangement of keys, and their position within the matrix that switches are connected to. This allows you to have a physical arrangement of keys that differs from the wiring matrix.
|
||||
|
||||
```json
|
||||
"layouts": {
|
||||
"LAYOUT_ortho_4x4": {
|
||||
"layout": [
|
||||
{ "matrix": [0, 0], "x": 0, "y": 0 },
|
||||
{ "matrix": [0, 1], "x": 1, "y": 0 },
|
||||
{ "matrix": [0, 2], "x": 2, "y": 0 },
|
||||
{ "matrix": [0, 3], "x": 3, "y": 0 },
|
||||
{ "matrix": [1, 0], "x": 0, "y": 1 },
|
||||
{ "matrix": [1, 1], "x": 1, "y": 1 },
|
||||
{ "matrix": [1, 2], "x": 2, "y": 1 },
|
||||
{ "matrix": [1, 3], "x": 3, "y": 1 },
|
||||
{ "matrix": [2, 0], "x": 0, "y": 2 },
|
||||
{ "matrix": [2, 1], "x": 1, "y": 2 },
|
||||
{ "matrix": [2, 2], "x": 2, "y": 2 },
|
||||
{ "matrix": [2, 3], "x": 3, "y": 2 },
|
||||
{ "matrix": [3, 0], "x": 0, "y": 3 },
|
||||
{ "matrix": [3, 1], "x": 1, "y": 3 },
|
||||
{ "matrix": [3, 2], "x": 2, "y": 3 },
|
||||
{ "matrix": [3, 3], "x": 3, "y": 3 }
|
||||
{"matrix": [0, 0], "x": 0, "y": 0},
|
||||
{"matrix": [0, 1], "x": 1, "y": 0},
|
||||
{"matrix": [0, 2], "x": 2, "y": 0},
|
||||
{"matrix": [0, 3], "x": 3, "y": 0},
|
||||
{"matrix": [1, 0], "x": 0, "y": 1},
|
||||
{"matrix": [1, 1], "x": 1, "y": 1},
|
||||
{"matrix": [1, 2], "x": 2, "y": 1},
|
||||
{"matrix": [1, 3], "x": 3, "y": 1},
|
||||
{"matrix": [2, 0], "x": 0, "y": 2},
|
||||
{"matrix": [2, 1], "x": 1, "y": 2},
|
||||
{"matrix": [2, 2], "x": 2, "y": 2},
|
||||
{"matrix": [2, 3], "x": 3, "y": 2},
|
||||
{"matrix": [3, 0], "x": 0, "y": 3},
|
||||
{"matrix": [3, 1], "x": 1, "y": 3},
|
||||
{"matrix": [3, 2], "x": 2, "y": 3},
|
||||
{"matrix": [3, 3], "x": 3, "y": 3}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
In the above example,
|
||||
|
||||
* `LAYOUT_ortho_4x4` defines the name of the layout macro
|
||||
* It must conform to the [layout guidelines](hardware_keyboard_guidelines#keyboard-name-h)
|
||||
* `"matrix": [0, 0]` defines the electrical position
|
||||
* `"matrix": [0, 0]` defines the matrix row and column that the key is associated with
|
||||
|
||||
::: tip
|
||||
See also: [Split Keyboard Layout Macro](features/split_keyboard#layout-macro) and [Matrix to Physical Layout](understanding_qmk#matrix-to-physical-layout-map).
|
||||
@ -158,9 +160,10 @@ See also: [Split Keyboard Layout Macro](features/split_keyboard#layout-macro) an
|
||||
|
||||
## Additional Configuration
|
||||
|
||||
There are a lot of features that can be turned on or off, configured or tuned. Some of these have yet to be migrated over to [Data Driven Configuration](data_driven_config). The following sections cover the process for when an `info.json` option is unavailable.
|
||||
There are a lot of features that can be turned on or off, configured or tuned. Some of these have yet to be migrated over to [Data Driven Configuration](data_driven_config). The following sections cover the process for when a data-driven option is unavailable.
|
||||
|
||||
### Configuration Options
|
||||
|
||||
For available options for `config.h`, you should see the [Config Options](config_options#the-configh-file) page for more details.
|
||||
|
||||
### Build Options
|
||||
|
@ -884,7 +884,7 @@ static painter_image_handle_t my_image;
|
||||
void keyboard_post_init_kb(void) {
|
||||
my_image = qp_load_image_mem(gfx_my_image);
|
||||
if (my_image != NULL) {
|
||||
qp_drawimage(display, (239 - my_image->width), (319 - my_image->height), my_image);
|
||||
qp_drawimage(display, (240 - my_image->width), (320 - my_image->height), my_image);
|
||||
}
|
||||
}
|
||||
```
|
||||
@ -909,7 +909,7 @@ static deferred_token my_anim;
|
||||
void keyboard_post_init_kb(void) {
|
||||
my_image = qp_load_image_mem(gfx_my_image);
|
||||
if (my_image != NULL) {
|
||||
my_anim = qp_animate(display, (239 - my_image->width), (319 - my_image->height), my_image);
|
||||
my_anim = qp_animate(display, (240 - my_image->width), (320 - my_image->height), my_image);
|
||||
}
|
||||
}
|
||||
```
|
||||
@ -1001,7 +1001,7 @@ void keyboard_post_init_kb(void) {
|
||||
if (my_font != NULL) {
|
||||
static const char *text = "Hello from QMK!";
|
||||
int16_t width = qp_textwidth(my_font, text);
|
||||
qp_drawtext(display, (239 - width), (319 - my_font->line_height), my_font, text);
|
||||
qp_drawtext(display, (240 - width), (320 - my_font->line_height), my_font, text);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
@ -156,25 +156,25 @@ For more on the `info.json` files, see [`info.json` Format](reference_info_json)
|
||||
|
||||
The Configurator's API uses the layout macro and the JSON file we've given it to create a visual representation of the keyboard that has each visual object tied to a specific key, in sequence:
|
||||
|
||||
key in layout macro | JSON object used
|
||||
:---: | :----
|
||||
k00 | {"label":"Num Lock", "x":0, "y":0}
|
||||
k01 | {"label":"/", "x":1, "y":0}
|
||||
k02 | {"label":"*", "x":2, "y":0}
|
||||
k03 | {"label":"-", "x":3, "y":0}
|
||||
k10 | {"label":"7", "x":0, "y":1}
|
||||
k11 | {"label":"8", "x":1, "y":1}
|
||||
k12 | {"label":"9", "x":2, "y":1}
|
||||
k13 | {"label":"+", "x":3, "y":1, "h":2}
|
||||
k20 | {"label":"4", "x":0, "y":2}
|
||||
k21 | {"label":"5", "x":1, "y":2}
|
||||
k22 | {"label":"6", "x":2, "y":2}
|
||||
k30 | {"label":"1", "x":0, "y":3}
|
||||
k31 | {"label":"2", "x":1, "y":3}
|
||||
k32 | {"label":"3", "x":2, "y":3}
|
||||
k33 | {"label":"Enter", "x":3, "y":3, "h":2}
|
||||
k40 | {"label":"0", "x":0, "y":4, "w":2}
|
||||
k42 | {"label":".", "x":2, "y":4}
|
||||
| Key in layout macro | JSON object used |
|
||||
| ------------------- | ---------------------------------------- |
|
||||
| k00 | `{"label":"Num Lock", "x":0, "y":0}` |
|
||||
| k01 | `{"label":"/", "x":1, "y":0}` |
|
||||
| k02 | `{"label":"*", "x":2, "y":0}` |
|
||||
| k03 | `{"label":"-", "x":3, "y":0}` |
|
||||
| k10 | `{"label":"7", "x":0, "y":1}` |
|
||||
| k11 | `{"label":"8", "x":1, "y":1}` |
|
||||
| k12 | `{"label":"9", "x":2, "y":1}` |
|
||||
| k13 | `{"label":"+", "x":3, "y":1, "h":2}` |
|
||||
| k20 | `{"label":"4", "x":0, "y":2}` |
|
||||
| k21 | `{"label":"5", "x":1, "y":2}` |
|
||||
| k22 | `{"label":"6", "x":2, "y":2}` |
|
||||
| k30 | `{"label":"1", "x":0, "y":3}` |
|
||||
| k31 | `{"label":"2", "x":1, "y":3}` |
|
||||
| k32 | `{"label":"3", "x":2, "y":3}` |
|
||||
| k33 | `{"label":"Enter", "x":3, "y":3, "h":2}` |
|
||||
| k40 | `{"label":"0", "x":0, "y":4, "w":2}` |
|
||||
| k42 | `{"label":".", "x":2, "y":4}` |
|
||||
|
||||
When a user selects the top-left key in the Configurator, and assigns Num Lock to it, the Configurator builds a keymap file with `KC_NUM` as the first key, and so on as the keymap is built. The `label` keys are not used; they are only for the user's reference in identifying specific keys when debugging the `info.json` file.
|
||||
|
||||
|
@ -16,7 +16,7 @@ You can create `info.json` files at every level under `qmk_firmware/keyboards/<k
|
||||
* A free-form text string describing the keyboard's manufacturer. This will be used as the USB manufacturer string. Can include Unicode characters, escaped to ASCII eg. `\u03A8` (Ψ).
|
||||
* Example: `"Clueboard"`
|
||||
* `url` <Badge type="info">String</Badge> <Badge>Required</Badge>
|
||||
* A URL to the keyboard's product page, [QMK.fm/keyboards](https://qmk.fm/keyboards) page, or other page describing information about the keyboard.
|
||||
* A URL to the keyboard's product page, [QMK Keyboards](https://browse.qmk.fm/) page, or other page describing information about the keyboard.
|
||||
* Example: `"https://clueboard.co"`
|
||||
* `bootloader_instructions` <Badge type="info">String</Badge>
|
||||
* Instructions for putting the keyboard into a mode that allows for firmware flashing.
|
||||
@ -74,6 +74,8 @@ You can create `info.json` files at every level under `qmk_firmware/keyboards/<k
|
||||
* The delay between keydown and keyup for tap events in milliseconds.
|
||||
* Default: `0` (no delay)
|
||||
* `tapping`
|
||||
* `chordal_hold` <Badge type="info">Boolean</Badge>
|
||||
* Default: `false`
|
||||
* `hold_on_other_key_press` <Badge type="info">Boolean</Badge>
|
||||
* Default: `false`
|
||||
* `hold_on_other_key_press_per_key` <Badge type="info">Boolean</Badge>
|
||||
@ -177,9 +179,9 @@ Configures the [Backlight](features/backlight) feature.
|
||||
* `pins` <Badge type="info">Array: Pin</Badge>
|
||||
* A list of GPIO pins connected to the backlight LEDs (`software` and `timer` drivers only).
|
||||
|
||||
## Bluetooth {#bluetooth}
|
||||
## Wireless/Bluetooth {#bluetooth}
|
||||
|
||||
Configures the [Bluetooth](features/bluetooth) feature.
|
||||
Configures the [Wireless](features/wireless) feature.
|
||||
|
||||
* `bluetooth`
|
||||
* `driver` <Badge type="info">String</Badge>
|
||||
@ -328,6 +330,8 @@ The ISO enter key is represented by a 1.25u×2uh key. Renderers which utilize in
|
||||
* `h` <Badge type="info">KeyUnit</Badge>
|
||||
* The height of the key, in key units.
|
||||
* Default: `1` (1u)
|
||||
* `hand` <Badge type="info">String</Badge>
|
||||
* The handedness of the key for Chordal Hold, either `"L"` (left hand), `"R"` (right hand), or `"*"` (either or exempted handedness).
|
||||
* `label` <Badge type="info">String</Badge>
|
||||
* What to name the key. This is *not* a key assignment as in the keymap, but should usually correspond to the keycode for the first layer of the default keymap.
|
||||
* Example: `"Escape"`
|
||||
@ -409,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`
|
||||
@ -420,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.
|
||||
@ -429,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}
|
||||
@ -545,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>
|
||||
@ -570,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>
|
||||
@ -589,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.
|
||||
@ -641,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:
|
||||
@ -660,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`
|
||||
@ -668,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.
|
||||
@ -683,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}
|
||||
|
@ -2,9 +2,31 @@
|
||||
|
||||
Keyboards are able to support a wide range of languages. However, this support is not actually achieved within the keyboard itself - instead, it sends numerical codes, which the operating system maps to the appropriate characters depending on the user's configured keyboard layout. By default (and per the HID spec), this is the US ANSI layout. For example, when a Swedish person presses the key with the `å` character printed on it, the keyboard is *actually* sending the keycode for `[`.
|
||||
|
||||
Obviously, this can get confusing, so QMK provides language-specific keycode aliases for many keyboard layouts. These won't do much on their own - you still have to set the matching keyboard layout in your OS settings. Think of them more as keycap labels for your keymap.
|
||||
Obviously, this can get confusing, so QMK provides language-specific keycode aliases for many keyboard layouts. These are used in place of the `KC_` prefixed ones. They won't do much on their own - you still have to set the matching keyboard layout in your OS settings. Think of them more as keycap labels for your keymap. The language-specific keycode aliases are defined in the files listed in the [Keycodes Header](#header-files) column below.
|
||||
|
||||
Simply `#include` one of the keycode headers below at the top of your `keymap.c`, and assign the keycodes defined in the header in place of the `KC_` prefixed ones.
|
||||
## Selecting Your Host Keyboard Layout
|
||||
|
||||
To select a host keyboard layout, simply `#include` one of the [keycode headers](#header-files) below at the top of your `keymap.c`. Example:
|
||||
|
||||
```c
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
#include "keymap_japanese.h" // [!code focus]
|
||||
```
|
||||
|
||||
Alternatively, if using `keymap.json`, add the `host_language` key as shown in the following example. The available languages are those with a _Sendstring LUT Header_ entry in one of the [Header Files](#header-files) tables.
|
||||
|
||||
```json
|
||||
{
|
||||
"keyboard": "handwired/my_macropad",
|
||||
"keymap": "my_keymap",
|
||||
"host_language": "swedish", // [!code focus]
|
||||
"layout": "LAYOUT_all",
|
||||
"layers": [
|
||||
["SE_ARNG"]
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Sendstring Support
|
||||
|
||||
@ -33,6 +55,7 @@ These headers are located in [`quantum/keymap_extras/`](https://github.com/qmk/q
|
||||
|English (US International) |`keymap_us_international.h` |`sendstring_us_international.h` |
|
||||
|English (US International, Linux)|`keymap_us_international_linux.h`| |
|
||||
|Estonian |`keymap_estonian.h` |`sendstring_estonian.h` |
|
||||
|EurKEY |`keymap_eurkey.h` | |
|
||||
|Farsi |`keymap_farsi.h` | |
|
||||
|Finnish |`keymap_finnish.h` |`sendstring_finnish.h` |
|
||||
|French |`keymap_french.h` |`sendstring_french.h` |
|
||||
|
246
docs/tap_hold.md
246
docs/tap_hold.md
@ -425,6 +425,252 @@ uint16_t get_quick_tap_term(uint16_t keycode, keyrecord_t *record) {
|
||||
If `QUICK_TAP_TERM` is set higher than `TAPPING_TERM`, it will default to `TAPPING_TERM`.
|
||||
:::
|
||||
|
||||
## Flow Tap
|
||||
|
||||
Flow Tap modifies mod-tap `MT` and layer-tap `LT` keys such that when pressed within a short timeout of the preceding key, the tapping behavior is triggered. This is particularly useful for home row mods to avoid accidental mod triggers. It basically disables the hold behavior during fast typing, creating a "flow of taps." This also helps to reduce the input lag of tap-hold keys during fast typing, since the tapped behavior is sent immediately.
|
||||
|
||||
Flow Tap is enabled by defining `FLOW_TAP_TERM` in your `config.h` with the desired timeout in milliseconds. A timeout of 150 ms is recommended as a starting point:
|
||||
|
||||
```c
|
||||
#define FLOW_TAP_TERM 150
|
||||
```
|
||||
|
||||
By default, Flow Tap is enabled when:
|
||||
|
||||
* The tap-hold key is pressed within `FLOW_TAP_TERM` milliseconds of the previous key press.
|
||||
|
||||
* The tapping keycodes of the previous key and tap-hold key are *both* among `KC_A`–`KC_Z`, `KC_COMM`, `KC_DOT`, `KC_SCLN`, `KC_SLSH` (the main alphas area of a conventional QWERTY layout) or `KC_SPC`.
|
||||
|
||||
As an exception to the above, Flow Tap is temporarily disabled while a tap-hold key is undecided. This is to allow chording multiple mod-tap keys without having to wait out the Flow Tap term.
|
||||
|
||||
|
||||
### is_flow_tap_key()
|
||||
|
||||
Optionally, define the `is_flow_tap_key()` callback to specify where Flow Tap is enabled. The callback is called for both the tap-hold key *and* the key press immediately preceding it, and if the callback returns true for both keycodes, Flow Tap is enabled.
|
||||
|
||||
The default implementation of this callback is:
|
||||
|
||||
```.c
|
||||
bool is_flow_tap_key(uint16_t keycode) {
|
||||
if ((get_mods() & (MOD_MASK_CG | MOD_BIT_LALT)) != 0) {
|
||||
return false; // Disable Flow Tap on hotkeys.
|
||||
}
|
||||
switch (get_tap_keycode(keycode)) {
|
||||
case KC_SPC:
|
||||
case KC_A ... KC_Z:
|
||||
case KC_DOT:
|
||||
case KC_COMM:
|
||||
case KC_SCLN:
|
||||
case KC_SLSH:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
```
|
||||
|
||||
Copy the above to your `keymap.c` and edit to customize. For instance, remove the `case KC_SPC` line to disable Flow Tap for the Space key.
|
||||
|
||||
### get_flow_tap_term()
|
||||
|
||||
Optionally, for further flexibility, define the `get_flow_tap_term()` callback. Flow Tap acts only when key events are closer together than the time returned by the callback. Return a time of 0 to disable filtering. In this way, Flow Tap may be disabled for certain tap-hold keys, or when following certain previous keys.
|
||||
|
||||
The default implementation of this callback is
|
||||
|
||||
```.c
|
||||
uint16_t get_flow_tap_term(uint16_t keycode, keyrecord_t* record,
|
||||
uint16_t prev_keycode) {
|
||||
if (is_flow_tap_key(keycode) && is_flow_tap_key(prev_keycode)) {
|
||||
return FLOW_TAP_TERM;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
In this callback, `keycode` and `record` correspond to the current tap-hold key, and `prev_keycode` is the keycode of the previous key. Return the timeout to use. Returning `0` disables Flow Tap. This callback enables setting per-key timeouts. It is also possible to enable or disable Flow Tap for certain tap-hold keys or when following certain previous keys. Example:
|
||||
|
||||
```c
|
||||
uint16_t get_flow_tap_term(uint16_t keycode, keyrecord_t* record,
|
||||
uint16_t prev_keycode) {
|
||||
if (is_flow_tap_key(keycode) && is_flow_tap_key(prev_keycode)) {
|
||||
switch (keycode) {
|
||||
case LCTL_T(KC_F):
|
||||
case RCTL_T(KC_H):
|
||||
return FLOW_TAP_TERM - 25; // Short timeout on these keys.
|
||||
|
||||
default:
|
||||
return FLOW_TAP_TERM; // Longer timeout otherwise.
|
||||
}
|
||||
}
|
||||
return 0; // Disable Flow Tap.
|
||||
}
|
||||
```
|
||||
|
||||
::: tip If you define both `is_flow_tap_key()` and `get_flow_tap_term()`, then the latter takes precedence.
|
||||
:::
|
||||
|
||||
## Chordal Hold
|
||||
|
||||
Chordal Hold is intended to be used together with either Permissive Hold or Hold
|
||||
On Other Key Press. Chordal Hold is enabled by adding to your `config.h`:
|
||||
|
||||
```c
|
||||
#define CHORDAL_HOLD
|
||||
```
|
||||
|
||||
Chordal Hold implements, by default, an "opposite hands" rule. Suppose a
|
||||
tap-hold key is pressed and then, before the tapping term, another key is
|
||||
pressed. With Chordal Hold, the tap-hold key is settled as tapped if the two
|
||||
keys are on the same hand.
|
||||
|
||||
Otherwise, if the keys are on opposite hands, Chordal Hold introduces no new
|
||||
behavior. Hold On Other Key Press or Permissive Hold may be used together with
|
||||
Chordal Hold to configure the behavior in the opposite hands case. With Hold On
|
||||
Other Key Press, an opposite hands chord is settled immediately as held. Or with
|
||||
Permissive Hold, an opposite hands chord is settled as held provided the other
|
||||
key is pressed and released (nested press) before releasing the tap-hold key.
|
||||
|
||||
Chordal Hold may be useful to avoid accidental modifier activation with
|
||||
mod-taps, particularly in rolled keypresses when using home row mods.
|
||||
|
||||
Notes:
|
||||
|
||||
* Chordal Hold has no effect after the tapping term.
|
||||
|
||||
* Combos are exempt from the opposite hands rule, since "handedness" is
|
||||
ill-defined in this case. Even so, Chordal Hold's behavior involving combos
|
||||
may be customized through the `get_chordal_hold()` callback.
|
||||
|
||||
An example of a sequence that is affected by “chordal hold”:
|
||||
|
||||
- `SFT_T(KC_A)` Down
|
||||
- `KC_C` Down
|
||||
- `KC_C` Up
|
||||
- `SFT_T(KC_A)` Up
|
||||
|
||||
```
|
||||
TAPPING_TERM
|
||||
+---------------------------|--------+
|
||||
| +----------------------+ | |
|
||||
| | SFT_T(KC_A) | | |
|
||||
| +----------------------+ | |
|
||||
| +--------------+ | |
|
||||
| | KC_C | | |
|
||||
| +--------------+ | |
|
||||
+---------------------------|--------+
|
||||
```
|
||||
|
||||
If the two keys are on the same hand, then this will produce `ac` with
|
||||
`SFT_T(KC_A)` settled as tapped the moment that `KC_C` is pressed.
|
||||
|
||||
If the two keys are on opposite hands and the `HOLD_ON_OTHER_KEY_PRESS` option
|
||||
enabled, this will produce `C` with `SFT_T(KC_A)` settled as held when `KC_C` is
|
||||
pressed.
|
||||
|
||||
Or if the two keys are on opposite hands and the `PERMISSIVE_HOLD` option is
|
||||
enabled, this will produce `C` with `SFT_T(KC_A)` settled as held when that
|
||||
`KC_C` is released.
|
||||
|
||||
### Chordal Hold Handedness
|
||||
|
||||
Determining whether keys are on the same or opposite hands involves defining the
|
||||
"handedness" of each key position. By default, if nothing is specified,
|
||||
handedness is guessed based on keyboard geometry.
|
||||
|
||||
Handedness may be specified with `chordal_hold_layout`. In keymap.c, define
|
||||
`chordal_hold_layout` in the following form:
|
||||
|
||||
```c
|
||||
const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM =
|
||||
LAYOUT(
|
||||
'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R',
|
||||
'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R',
|
||||
'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R',
|
||||
'L', 'L', 'L', 'R', 'R', 'R'
|
||||
);
|
||||
```
|
||||
|
||||
Use the same `LAYOUT` macro as used to define your keymap layers. Each entry is
|
||||
a character indicating the handedness of one key, either `'L'` for left, `'R'`
|
||||
for right, or `'*'` to exempt keys from the "opposite hands rule." A key with
|
||||
`'*'` handedness may settle as held in chords with any other key. This could be
|
||||
used perhaps on thumb keys or other places where you want to allow same-hand
|
||||
chords.
|
||||
|
||||
Keyboard makers may specify handedness in keyboard.json. Under `"layouts"`,
|
||||
specify the handedness of a key by adding a `"hand"` field with a value of
|
||||
either `"L"`, `"R"`, or `"*"`. Note that if `"layouts"` contains multiple
|
||||
layouts, only the first one is read. For example:
|
||||
|
||||
```json
|
||||
{"matrix": [5, 6], "x": 0, "y": 5.5, "w": 1.25, "hand", "*"},
|
||||
```
|
||||
|
||||
Alternatively, handedness may be defined functionally with
|
||||
`chordal_hold_handedness()`. For example, in keymap.c define:
|
||||
|
||||
```c
|
||||
char chordal_hold_handedness(keypos_t key) {
|
||||
if (key.col == 0 || key.col == MATRIX_COLS - 1) {
|
||||
return '*'; // Exempt the outer columns.
|
||||
}
|
||||
// On split keyboards, typically, the first half of the rows are on the
|
||||
// left, and the other half are on the right.
|
||||
return key.row < MATRIX_ROWS / 2 ? 'L' : 'R';
|
||||
}
|
||||
```
|
||||
|
||||
Given the matrix position of a key, the function should return `'L'`, `'R'`, or
|
||||
`'*'`. Adapt the logic in this function according to the keyboard's matrix.
|
||||
|
||||
::: warning
|
||||
Note the matrix may have irregularities around larger keys, around the edges of
|
||||
the board, and around thumb clusters. You may find it helpful to use [this
|
||||
debugging example](faq_debug#which-matrix-position-is-this-keypress) to
|
||||
correspond physical keys to matrix positions.
|
||||
:::
|
||||
|
||||
::: tip If you define both `chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS]` and
|
||||
`chordal_hold_handedness(keypos_t key)` for handedness, the latter takes
|
||||
precedence.
|
||||
:::
|
||||
|
||||
|
||||
### Per-chord customization
|
||||
|
||||
Beyond the per-key configuration possible through handedness, Chordal Hold may
|
||||
be configured at a *per-chord* granularity for detailed tuning. In keymap.c,
|
||||
define `get_chordal_hold()`. Returning `true` allows the chord to be held, while
|
||||
returning `false` settles as tapped.
|
||||
|
||||
For example:
|
||||
|
||||
```c
|
||||
bool get_chordal_hold(uint16_t tap_hold_keycode, keyrecord_t* tap_hold_record,
|
||||
uint16_t other_keycode, keyrecord_t* other_record) {
|
||||
// Exceptionally allow some one-handed chords for hotkeys.
|
||||
switch (tap_hold_keycode) {
|
||||
case LCTL_T(KC_Z):
|
||||
if (other_keycode == KC_C || other_keycode == KC_V) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case RCTL_T(KC_SLSH):
|
||||
if (other_keycode == KC_N) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
// Otherwise defer to the opposite hands rule.
|
||||
return get_chordal_hold_default(tap_hold_record, other_record);
|
||||
}
|
||||
```
|
||||
|
||||
As shown in the last line above, you may use
|
||||
`get_chordal_hold_default(tap_hold_record, other_record)` to get the default tap
|
||||
vs. hold decision according to the opposite hands rule.
|
||||
|
||||
|
||||
## Retro Tapping
|
||||
|
||||
To enable `retro tapping`, add the following to your `config.h`:
|
||||
|
@ -58,6 +58,34 @@ It's not yet possible to do a full integration test, where you would compile the
|
||||
|
||||
In that model you would emulate the input, and expect a certain output from the emulated keyboard.
|
||||
|
||||
# Keycode String {#keycode-string}
|
||||
|
||||
It's much nicer to read keycodes as names like "`LT(2,KC_D)`" than numerical codes like "`0x4207`." To convert keycodes to human-readable strings, add `KEYCODE_STRING_ENABLE = yes` to the `rules.mk` file, then use the `get_keycode_string(kc)` function to convert a given 16-bit keycode to a string.
|
||||
|
||||
```c
|
||||
const char *key_name = get_keycode_string(keycode);
|
||||
dprintf("kc: %s\n", key_name);
|
||||
```
|
||||
|
||||
The stringified keycode may then be logged to console output with `dprintf()` or elsewhere.
|
||||
|
||||
::: warning
|
||||
Use the result of `get_keycode_string()` immediately. Subsequent invocations reuse the same static buffer and overwrite the previous contents.
|
||||
:::
|
||||
|
||||
Many common QMK keycodes are recognized by `get_keycode_string()`, but not all. These include some common basic keycodes, layer switch keycodes, mod-taps, one-shot keycodes, tap dance keycodes, and Unicode keycodes. As a fallback, an unrecognized keycode is written as a hex number.
|
||||
|
||||
Optionally, `KEYCODE_STRING_NAMES_USER` may be defined to add names for additional keycodes. For example, supposing keymap.c defines `MYMACRO1` and `MYMACRO2` as custom keycodes, the following adds their names:
|
||||
|
||||
```c
|
||||
KEYCODE_STRING_NAMES_USER(
|
||||
KEYCODE_STRING_NAME(MYMACRO1),
|
||||
KEYCODE_STRING_NAME(MYMACRO2),
|
||||
);
|
||||
```
|
||||
|
||||
Similarly, `KEYCODE_STRING_NAMES_KB` may be defined to add names at the keyboard level.
|
||||
|
||||
# Tracing Variables {#tracing-variables}
|
||||
|
||||
Sometimes you might wonder why a variable gets changed and where, and this can be quite tricky to track down without having a debugger. It's of course possible to manually add print statements to track it, but you can also enable the variable trace feature. This works for both variables that are changed by the code, and when the variable is changed by some memory corruption.
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user