mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-07-28 03:51:15 +00:00
Merge branch 'master' into model_f_labs
This commit is contained in:
commit
fbf9e33c5d
2
.clangd
2
.clangd
@ -1,4 +1,4 @@
|
|||||||
CompileFlags:
|
CompileFlags:
|
||||||
Add: [-Wno-unknown-attributes, -Wno-maybe-uninitialized, -Wno-unknown-warning-option]
|
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
|
Compiler: clang
|
||||||
|
@ -11,7 +11,8 @@ charset = utf-8
|
|||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
|
|
||||||
[{*.yaml,*.yml}] # To match GitHub Actions formatting
|
# To match GitHub Actions formatting
|
||||||
|
[*.{yaml,yml}]
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
|
||||||
[*.md]
|
[*.md]
|
||||||
|
3
.github/PULL_REQUEST_TEMPLATE.md
vendored
3
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -1,6 +1,5 @@
|
|||||||
<!--- Provide a general summary of your changes in the title above. -->
|
<!--- Provide a general summary of your changes in the title above. -->
|
||||||
|
|
||||||
<!--- This template is entirely optional and can be removed, but is here to help both you and us. -->
|
|
||||||
<!--- Anything on lines wrapped in comments like these will not show up in the final text. -->
|
<!--- Anything on lines wrapped in comments like these will not show up in the final text. -->
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
@ -15,7 +14,7 @@
|
|||||||
- [ ] New feature
|
- [ ] New feature
|
||||||
- [ ] Enhancement/optimization
|
- [ ] Enhancement/optimization
|
||||||
- [ ] Keyboard (addition or update)
|
- [ ] Keyboard (addition or update)
|
||||||
- [ ] Keymap/layout/userspace (addition or update)
|
- [ ] Keymap/layout (addition or update)
|
||||||
- [ ] Documentation
|
- [ ] Documentation
|
||||||
|
|
||||||
## Issues Fixed or Closed by This PR
|
## Issues Fixed or Closed by This PR
|
||||||
|
4
.github/labeler.yml
vendored
4
.github/labeler.yml
vendored
@ -54,3 +54,7 @@ dd:
|
|||||||
- data/constants/**
|
- data/constants/**
|
||||||
- data/mappings/**
|
- data/mappings/**
|
||||||
- data/schemas/**
|
- 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/**/*
|
- quantum/**/*
|
||||||
- tests/**/*
|
- tests/**/*
|
||||||
- tmk_core/**/*
|
- tmk_core/**/*
|
||||||
|
- lib/python/**/*
|
||||||
- util/**/*
|
- util/**/*
|
||||||
- Makefile
|
- Makefile
|
||||||
- '*.mk'
|
- '*.mk'
|
||||||
|
2
.github/workflows/docs.yml
vendored
2
.github/workflows/docs.yml
vendored
@ -56,7 +56,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Deploy
|
- name: Deploy
|
||||||
if: ${{ github.event_name == 'push' && github.repository == 'qmk/qmk_firmware' }}
|
if: ${{ github.event_name == 'push' && github.repository == 'qmk/qmk_firmware' }}
|
||||||
uses: JamesIves/github-pages-deploy-action@v4.6.4
|
uses: JamesIves/github-pages-deploy-action@v4.7.3
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
branch: gh-pages
|
branch: gh-pages
|
||||||
|
3
.github/workflows/format.yml
vendored
3
.github/workflows/format.yml
vendored
@ -10,6 +10,7 @@ on:
|
|||||||
- 'lib/arm_atsam/**'
|
- 'lib/arm_atsam/**'
|
||||||
- 'lib/lib8tion/**'
|
- 'lib/lib8tion/**'
|
||||||
- 'lib/python/**'
|
- 'lib/python/**'
|
||||||
|
- 'modules/**'
|
||||||
- 'platforms/**'
|
- 'platforms/**'
|
||||||
- 'quantum/**'
|
- 'quantum/**'
|
||||||
- 'tests/**'
|
- 'tests/**'
|
||||||
@ -35,7 +36,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Get changed files
|
- name: Get changed files
|
||||||
id: file_changes
|
id: file_changes
|
||||||
uses: tj-actions/changed-files@v45
|
uses: tj-actions/changed-files@v46
|
||||||
with:
|
with:
|
||||||
use_rest_api: true
|
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
|
qmk format-text -a
|
||||||
git diff
|
git diff
|
||||||
|
|
||||||
- uses: rlespinasse/github-slug-action@v3.x
|
- uses: rlespinasse/github-slug-action@v5
|
||||||
|
|
||||||
- name: Become QMK Bot
|
- name: Become QMK Bot
|
||||||
run: |
|
run: |
|
||||||
|
2
.github/workflows/lint.yml
vendored
2
.github/workflows/lint.yml
vendored
@ -27,7 +27,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Get changed files
|
- name: Get changed files
|
||||||
id: file_changes
|
id: file_changes
|
||||||
uses: tj-actions/changed-files@v45
|
uses: tj-actions/changed-files@v46
|
||||||
with:
|
with:
|
||||||
use_rest_api: true
|
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
|
util/regen.sh
|
||||||
git diff
|
git diff
|
||||||
|
|
||||||
- uses: rlespinasse/github-slug-action@v3.x
|
- uses: rlespinasse/github-slug-action@v5
|
||||||
|
|
||||||
- name: Become QMK Bot
|
- name: Become QMK Bot
|
||||||
run: |
|
run: |
|
||||||
|
2
.github/workflows/stale.yml
vendored
2
.github/workflows/stale.yml
vendored
@ -45,7 +45,7 @@ jobs:
|
|||||||
stale-pr-label: stale
|
stale-pr-label: stale
|
||||||
days-before-pr-stale: 45
|
days-before-pr-stale: 45
|
||||||
days-before-pr-close: 30
|
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: >
|
stale-pr-message: >
|
||||||
Thank you for your contribution!
|
Thank you for your contribution!
|
||||||
|
27
.vscode/settings.json
vendored
27
.vscode/settings.json
vendored
@ -10,6 +10,13 @@
|
|||||||
"**/*.uf2": true
|
"**/*.uf2": true
|
||||||
},
|
},
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
|
// QMK Filetypes
|
||||||
|
"keyboard.json": "jsonc",
|
||||||
|
"info.json": "jsonc",
|
||||||
|
"keymap.json": "jsonc",
|
||||||
|
"qmk.json": "jsonc",
|
||||||
|
"qmk_module.json": "jsonc",
|
||||||
|
// Standard filetypes
|
||||||
"*.h": "c",
|
"*.h": "c",
|
||||||
"*.c": "c",
|
"*.c": "c",
|
||||||
"*.inc": "c",
|
"*.inc": "c",
|
||||||
@ -28,7 +35,23 @@
|
|||||||
"[json]": {
|
"[json]": {
|
||||||
"editor.formatOnSave": false
|
"editor.formatOnSave": false
|
||||||
},
|
},
|
||||||
"clangd.arguments": [
|
"clangd.arguments": ["--header-insertion=never"],
|
||||||
"--header-insertion=never"
|
"json.schemas": [
|
||||||
|
{
|
||||||
|
"fileMatch": ["qmk.json"],
|
||||||
|
"url": "./data/schemas/user_repo_v1_1.jsonschema"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fileMatch": ["qmk_module.json"],
|
||||||
|
"url": "./data/schemas/community_module.jsonschema"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fileMatch": ["keyboard.json", "info.json"],
|
||||||
|
"url": "./data/schemas/keyboard.jsonschema"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fileMatch": ["keymap.json"],
|
||||||
|
"url": "./data/schemas/keymap.jsonschema"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
2
Doxyfile
2
Doxyfile
@ -145,7 +145,7 @@ FILE_PATTERNS = *.c \
|
|||||||
RECURSIVE = YES
|
RECURSIVE = YES
|
||||||
EXCLUDE =
|
EXCLUDE =
|
||||||
EXCLUDE_SYMLINKS = NO
|
EXCLUDE_SYMLINKS = NO
|
||||||
EXCLUDE_PATTERNS = */protocol/arm_atsam/*
|
EXCLUDE_PATTERNS =
|
||||||
EXCLUDE_SYMBOLS =
|
EXCLUDE_SYMBOLS =
|
||||||
EXAMPLE_PATH =
|
EXAMPLE_PATH =
|
||||||
EXAMPLE_PATTERNS = *
|
EXAMPLE_PATTERNS = *
|
||||||
|
37
Makefile
37
Makefile
@ -59,6 +59,7 @@ ifeq ($(ROOT_DIR),)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
include paths.mk
|
include paths.mk
|
||||||
|
include $(BUILDDEFS_PATH)/support.mk
|
||||||
|
|
||||||
TEST_OUTPUT_DIR := $(BUILD_DIR)/test
|
TEST_OUTPUT_DIR := $(BUILD_DIR)/test
|
||||||
ERROR_FILE := $(BUILD_DIR)/error_occurred
|
ERROR_FILE := $(BUILD_DIR)/error_occurred
|
||||||
@ -113,6 +114,29 @@ endef
|
|||||||
# Make it easier to call TRY_TO_MATCH_RULE_FROM_LIST
|
# 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)
|
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
|
define ALL_IN_LIST_LOOP
|
||||||
OLD_RULE$1 := $$(RULE)
|
OLD_RULE$1 := $$(RULE)
|
||||||
$$(eval $$(call $1,$$(ITEM$1)))
|
$$(eval $$(call $1,$$(ITEM$1)))
|
||||||
@ -138,7 +162,7 @@ define PARSE_RULE
|
|||||||
$$(eval $$(call PARSE_TEST))
|
$$(eval $$(call PARSE_TEST))
|
||||||
# If the rule starts with the name of a known keyboard, then continue
|
# If the rule starts with the name of a known keyboard, then continue
|
||||||
# the parsing from PARSE_KEYBOARD
|
# 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)
|
KEYBOARD_RULE=$$(MATCHED_ITEM)
|
||||||
$$(eval $$(call PARSE_KEYBOARD,$$(MATCHED_ITEM)))
|
$$(eval $$(call PARSE_KEYBOARD,$$(MATCHED_ITEM)))
|
||||||
else
|
else
|
||||||
@ -170,17 +194,6 @@ define PARSE_KEYBOARD
|
|||||||
# include the correct makefile to determine the actual name of it
|
# include the correct makefile to determine the actual name of it
|
||||||
CURRENT_KB := $1
|
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
|
# 5/4/3/2/1
|
||||||
KEYBOARD_FOLDER_PATH_1 := $$(CURRENT_KB)
|
KEYBOARD_FOLDER_PATH_1 := $$(CURRENT_KB)
|
||||||
KEYBOARD_FOLDER_PATH_2 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_1)))
|
KEYBOARD_FOLDER_PATH_2 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_1)))
|
||||||
|
@ -21,10 +21,10 @@ $(TEST_OUTPUT)_SRC := \
|
|||||||
$(SRC) \
|
$(SRC) \
|
||||||
$(QUANTUM_PATH)/keymap_introspection.c \
|
$(QUANTUM_PATH)/keymap_introspection.c \
|
||||||
tests/test_common/matrix.c \
|
tests/test_common/matrix.c \
|
||||||
|
tests/test_common/pointing_device_driver.c \
|
||||||
tests/test_common/test_driver.cpp \
|
tests/test_common/test_driver.cpp \
|
||||||
tests/test_common/keyboard_report_util.cpp \
|
tests/test_common/keyboard_report_util.cpp \
|
||||||
tests/test_common/keycode_util.cpp \
|
tests/test_common/mouse_report_util.cpp \
|
||||||
tests/test_common/keycode_table.cpp \
|
|
||||||
tests/test_common/test_fixture.cpp \
|
tests/test_common/test_fixture.cpp \
|
||||||
tests/test_common/test_keymap_key.cpp \
|
tests/test_common/test_keymap_key.cpp \
|
||||||
tests/test_common/test_logger.cpp \
|
tests/test_common/test_logger.cpp \
|
||||||
|
@ -11,6 +11,7 @@ endif
|
|||||||
.DEFAULT_GOAL := all
|
.DEFAULT_GOAL := all
|
||||||
|
|
||||||
include paths.mk
|
include paths.mk
|
||||||
|
include $(BUILDDEFS_PATH)/support.mk
|
||||||
include $(BUILDDEFS_PATH)/message.mk
|
include $(BUILDDEFS_PATH)/message.mk
|
||||||
|
|
||||||
# Helper to add defines with a 'QMK_' prefix
|
# Helper to add defines with a 'QMK_' prefix
|
||||||
@ -97,20 +98,44 @@ endif
|
|||||||
|
|
||||||
|
|
||||||
# Pull in rules.mk files from all our subfolders
|
# 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
|
endif
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/rules.mk)","")
|
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/info.json)","")
|
||||||
include $(KEYBOARD_PATH_4)/rules.mk
|
DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/info.json
|
||||||
endif
|
endif
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/rules.mk)","")
|
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/info.json)","")
|
||||||
include $(KEYBOARD_PATH_3)/rules.mk
|
DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/info.json
|
||||||
endif
|
endif
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/rules.mk)","")
|
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/info.json)","")
|
||||||
include $(KEYBOARD_PATH_2)/rules.mk
|
DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/info.json
|
||||||
endif
|
endif
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","")
|
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","")
|
||||||
include $(KEYBOARD_PATH_1)/rules.mk
|
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
|
endif
|
||||||
|
|
||||||
MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP)
|
MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP)
|
||||||
@ -186,7 +211,10 @@ endif
|
|||||||
# Have we found a keymap.json?
|
# Have we found a keymap.json?
|
||||||
ifneq ("$(wildcard $(KEYMAP_JSON))", "")
|
ifneq ("$(wildcard $(KEYMAP_JSON))", "")
|
||||||
ifneq ("$(wildcard $(KEYMAP_C))", "")
|
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
|
endif
|
||||||
|
|
||||||
KEYMAP_PATH := $(KEYMAP_JSON_PATH)
|
KEYMAP_PATH := $(KEYMAP_JSON_PATH)
|
||||||
@ -194,25 +222,27 @@ ifneq ("$(wildcard $(KEYMAP_JSON))", "")
|
|||||||
KEYMAP_C := $(INTERMEDIATE_OUTPUT)/src/keymap.c
|
KEYMAP_C := $(INTERMEDIATE_OUTPUT)/src/keymap.c
|
||||||
KEYMAP_H := $(INTERMEDIATE_OUTPUT)/src/config.h
|
KEYMAP_H := $(INTERMEDIATE_OUTPUT)/src/config.h
|
||||||
|
|
||||||
# Load the keymap-level rules.mk if exists
|
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
|
-include $(KEYMAP_PATH)/rules.mk
|
||||||
|
endif
|
||||||
|
|
||||||
# Load any rules.mk content from keymap.json
|
# 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))
|
INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --output $(INTERMEDIATE_OUTPUT)/src/rules.mk $(KEYMAP_JSON))
|
||||||
include $(INFO_RULES_MK)
|
include $(INFO_RULES_MK)
|
||||||
|
|
||||||
# Add rules to generate the keymap files - indentation here is important
|
# 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)
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
$(eval CMD=$(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON))
|
$(eval CMD=$(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON))
|
||||||
@$(BUILD_CMD)
|
@$(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)
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
$(eval CMD=$(QMK_BIN) generate-config-h --quiet --output $(KEYMAP_H) $(KEYMAP_JSON))
|
$(eval CMD=$(QMK_BIN) generate-config-h --quiet --output $(KEYMAP_H) $(KEYMAP_JSON))
|
||||||
@$(BUILD_CMD)
|
@$(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)
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
$(eval CMD=$(QMK_BIN) generate-keymap-h --quiet --output $(INTERMEDIATE_OUTPUT)/src/keymap.h $(KEYMAP_JSON))
|
$(eval CMD=$(QMK_BIN) generate-keymap-h --quiet --output $(INTERMEDIATE_OUTPUT)/src/keymap.h $(KEYMAP_JSON))
|
||||||
@$(BUILD_CMD)
|
@$(BUILD_CMD)
|
||||||
@ -221,6 +251,44 @@ generated-files: $(INTERMEDIATE_OUTPUT)/src/config.h $(INTERMEDIATE_OUTPUT)/src/
|
|||||||
|
|
||||||
endif
|
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)
|
||||||
|
|
||||||
|
$(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||||
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
|
$(eval CMD=$(QMK_BIN) generate-led-matrix-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(KEYMAP_JSON))
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
$(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||||
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
|
$(eval CMD=$(QMK_BIN) generate-rgb-matrix-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc $(KEYMAP_JSON))
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
SRC += $(INTERMEDIATE_OUTPUT)/src/community_modules.c
|
||||||
|
|
||||||
|
generated-files: $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc
|
||||||
|
|
||||||
include $(BUILDDEFS_PATH)/converters.mk
|
include $(BUILDDEFS_PATH)/converters.mk
|
||||||
|
|
||||||
# Generate the board's version.h file.
|
# Generate the board's version.h file.
|
||||||
@ -310,6 +378,14 @@ endif
|
|||||||
|
|
||||||
# Find all of the config.h files and add them to our CONFIG_H define.
|
# Find all of the config.h files and add them to our CONFIG_H define.
|
||||||
CONFIG_H :=
|
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)","")
|
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","")
|
||||||
CONFIG_H += $(KEYBOARD_PATH_5)/config.h
|
CONFIG_H += $(KEYBOARD_PATH_5)/config.h
|
||||||
endif
|
endif
|
||||||
@ -327,6 +403,14 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_1)/config.h)","")
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
POST_CONFIG_H :=
|
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)","")
|
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_config.h)","")
|
||||||
POST_CONFIG_H += $(KEYBOARD_PATH_1)/post_config.h
|
POST_CONFIG_H += $(KEYBOARD_PATH_1)/post_config.h
|
||||||
endif
|
endif
|
||||||
@ -343,40 +427,6 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_config.h)","")
|
|||||||
POST_CONFIG_H += $(KEYBOARD_PATH_5)/post_config.h
|
POST_CONFIG_H += $(KEYBOARD_PATH_5)/post_config.h
|
||||||
endif
|
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
|
CONFIG_H += $(INTERMEDIATE_OUTPUT)/src/info_config.h
|
||||||
KEYBOARD_SRC += $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c
|
KEYBOARD_SRC += $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c
|
||||||
|
|
||||||
@ -441,21 +491,18 @@ ifneq ("$(CONVERTER)","")
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
# Pull in post_rules.mk files from all our subfolders
|
# 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
|
||||||
include $(KEYBOARD_PATH_1)/post_rules.mk
|
-include $(KEYBOARD_PATH_2)/post_rules.mk
|
||||||
endif
|
-include $(KEYBOARD_PATH_3)/post_rules.mk
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/post_rules.mk)","")
|
-include $(KEYBOARD_PATH_4)/post_rules.mk
|
||||||
include $(KEYBOARD_PATH_2)/post_rules.mk
|
-include $(KEYBOARD_PATH_5)/post_rules.mk
|
||||||
endif
|
|
||||||
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/post_rules.mk)","")
|
define post_rules_mk_community_module_includer
|
||||||
include $(KEYBOARD_PATH_3)/post_rules.mk
|
ifneq ("$(wildcard $(1)/post_rules.mk)","")
|
||||||
endif
|
include $(1)/post_rules.mk
|
||||||
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
|
endif
|
||||||
|
endef
|
||||||
|
$(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call post_rules_mk_community_module_includer,$(module))))
|
||||||
|
|
||||||
ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
|
ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
|
||||||
CONFIG_H += $(KEYMAP_PATH)/config.h
|
CONFIG_H += $(KEYMAP_PATH)/config.h
|
||||||
|
@ -7,6 +7,7 @@ endif
|
|||||||
OPT = g
|
OPT = g
|
||||||
|
|
||||||
include paths.mk
|
include paths.mk
|
||||||
|
include $(BUILDDEFS_PATH)/support.mk
|
||||||
include $(BUILDDEFS_PATH)/message.mk
|
include $(BUILDDEFS_PATH)/message.mk
|
||||||
|
|
||||||
TARGET=test/$(TEST_OUTPUT)
|
TARGET=test/$(TEST_OUTPUT)
|
||||||
|
@ -28,6 +28,9 @@ QUANTUM_SRC += \
|
|||||||
$(QUANTUM_DIR)/sync_timer.c \
|
$(QUANTUM_DIR)/sync_timer.c \
|
||||||
$(QUANTUM_DIR)/logging/debug.c \
|
$(QUANTUM_DIR)/logging/debug.c \
|
||||||
$(QUANTUM_DIR)/logging/sendchar.c \
|
$(QUANTUM_DIR)/logging/sendchar.c \
|
||||||
|
$(QUANTUM_DIR)/process_keycode/process_default_layer.c \
|
||||||
|
|
||||||
|
include $(QUANTUM_DIR)/nvm/rules.mk
|
||||||
|
|
||||||
VPATH += $(QUANTUM_DIR)/logging
|
VPATH += $(QUANTUM_DIR)/logging
|
||||||
# Fall back to lib/printf if there is no platform provided print
|
# 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
|
MOUSE_ENABLE := yes
|
||||||
VPATH += $(QUANTUM_DIR)/pointing_device
|
VPATH += $(QUANTUM_DIR)/pointing_device
|
||||||
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device.c
|
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
|
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_auto_mouse.c
|
||||||
ifneq ($(strip $(POINTING_DEVICE_DRIVER)), custom)
|
ifneq ($(strip $(POINTING_DEVICE_DRIVER)), custom)
|
||||||
SRC += drivers/sensors/$(strip $(POINTING_DEVICE_DRIVER)).c
|
SRC += drivers/sensors/$(strip $(POINTING_DEVICE_DRIVER)).c
|
||||||
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(shell echo $(POINTING_DEVICE_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(shell echo $(POINTING_DEVICE_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||||
endif
|
endif
|
||||||
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(POINTING_DEVICE_DRIVER))
|
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)
|
ifeq ($(strip $(POINTING_DEVICE_DRIVER)), adns9800)
|
||||||
SPI_DRIVER_REQUIRED = yes
|
SPI_DRIVER_REQUIRED = yes
|
||||||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), analog_joystick)
|
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), analog_joystick)
|
||||||
@ -168,6 +171,7 @@ endif
|
|||||||
|
|
||||||
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi wear_leveling legacy_stm32_flash
|
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi wear_leveling legacy_stm32_flash
|
||||||
EEPROM_DRIVER ?= vendor
|
EEPROM_DRIVER ?= vendor
|
||||||
|
ifneq ($(strip $(EEPROM_DRIVER)),none)
|
||||||
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
|
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
|
||||||
$(call CATASTROPHIC_ERROR,Invalid EEPROM_DRIVER,EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver)
|
$(call CATASTROPHIC_ERROR,Invalid EEPROM_DRIVER,EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver)
|
||||||
else
|
else
|
||||||
@ -215,7 +219,7 @@ else
|
|||||||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
|
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/flash
|
COMMON_VPATH += $(DRIVER_PATH)/flash
|
||||||
SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c
|
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),)
|
else ifneq ($(filter $(MCU_SERIES),STM32F1xx STM32F3xx STM32F4xx STM32L4xx STM32G0xx STM32G4xx WB32F3G71xx WB32FQ95xx AT32F415 GD32VF103),)
|
||||||
# Wear-leveling EEPROM implementation, backed by MCU flash
|
# Wear-leveling EEPROM implementation, backed by MCU flash
|
||||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
|
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
|
||||||
SRC += eeprom_driver.c eeprom_wear_leveling.c
|
SRC += eeprom_driver.c eeprom_wear_leveling.c
|
||||||
@ -238,10 +242,6 @@ else
|
|||||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
|
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
|
||||||
SRC += eeprom_driver.c eeprom_transient.c
|
SRC += eeprom_driver.c eeprom_transient.c
|
||||||
endif
|
endif
|
||||||
else ifeq ($(PLATFORM),ARM_ATSAM)
|
|
||||||
# arm_atsam EEPROM
|
|
||||||
OPT_DEFS += -DEEPROM_SAMD
|
|
||||||
SRC += eeprom_samd.c
|
|
||||||
else ifeq ($(PLATFORM),TEST)
|
else ifeq ($(PLATFORM),TEST)
|
||||||
# Test harness "EEPROM"
|
# Test harness "EEPROM"
|
||||||
OPT_DEFS += -DEEPROM_TEST_HARNESS
|
OPT_DEFS += -DEEPROM_TEST_HARNESS
|
||||||
@ -249,6 +249,7 @@ else
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
VALID_WEAR_LEVELING_DRIVER_TYPES := custom embedded_flash spi_flash rp2040_flash legacy
|
VALID_WEAR_LEVELING_DRIVER_TYPES := custom embedded_flash spi_flash rp2040_flash legacy
|
||||||
WEAR_LEVELING_DRIVER ?= none
|
WEAR_LEVELING_DRIVER ?= none
|
||||||
@ -266,18 +267,14 @@ ifneq ($(strip $(WEAR_LEVELING_DRIVER)),none)
|
|||||||
ifeq ($(strip $(WEAR_LEVELING_DRIVER)), embedded_flash)
|
ifeq ($(strip $(WEAR_LEVELING_DRIVER)), embedded_flash)
|
||||||
OPT_DEFS += -DHAL_USE_EFL
|
OPT_DEFS += -DHAL_USE_EFL
|
||||||
SRC += wear_leveling_efl.c
|
SRC += wear_leveling_efl.c
|
||||||
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling/wear_leveling_efl_config.h
|
|
||||||
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), spi_flash)
|
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), spi_flash)
|
||||||
FLASH_DRIVER := spi
|
FLASH_DRIVER := spi
|
||||||
SRC += wear_leveling_flash_spi.c
|
SRC += wear_leveling_flash_spi.c
|
||||||
POST_CONFIG_H += $(DRIVER_PATH)/wear_leveling/wear_leveling_flash_spi_config.h
|
|
||||||
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), rp2040_flash)
|
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), rp2040_flash)
|
||||||
SRC += wear_leveling_rp2040_flash.c
|
SRC += wear_leveling_rp2040_flash.c
|
||||||
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_rp2040_flash_config.h
|
|
||||||
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), legacy)
|
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), legacy)
|
||||||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
|
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
|
||||||
SRC += legacy_flash_ops.c wear_leveling_legacy.c
|
SRC += legacy_flash_ops.c wear_leveling_legacy.c
|
||||||
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling/wear_leveling_legacy_config.h
|
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@ -310,11 +307,11 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
|
|||||||
POST_CONFIG_H += $(QUANTUM_DIR)/rgblight/rgblight_post_config.h
|
POST_CONFIG_H += $(QUANTUM_DIR)/rgblight/rgblight_post_config.h
|
||||||
OPT_DEFS += -DRGBLIGHT_ENABLE
|
OPT_DEFS += -DRGBLIGHT_ENABLE
|
||||||
OPT_DEFS += -DRGBLIGHT_$(strip $(shell echo $(RGBLIGHT_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
OPT_DEFS += -DRGBLIGHT_$(strip $(shell echo $(RGBLIGHT_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_underglow.c
|
||||||
SRC += $(QUANTUM_DIR)/color.c
|
SRC += $(QUANTUM_DIR)/color.c
|
||||||
SRC += $(QUANTUM_DIR)/rgblight/rgblight.c
|
SRC += $(QUANTUM_DIR)/rgblight/rgblight.c
|
||||||
SRC += $(QUANTUM_DIR)/rgblight/rgblight_drivers.c
|
SRC += $(QUANTUM_DIR)/rgblight/rgblight_drivers.c
|
||||||
CIE1931_CURVE := yes
|
CIE1931_CURVE := yes
|
||||||
RGB_KEYCODES_ENABLE := yes
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(RGBLIGHT_DRIVER)), ws2812)
|
ifeq ($(strip $(RGBLIGHT_DRIVER)), ws2812)
|
||||||
@ -436,6 +433,13 @@ ifeq ($(strip $(LED_MATRIX_ENABLE)), yes)
|
|||||||
SRC += snled27351-mono.c
|
SRC += snled27351-mono.c
|
||||||
endif
|
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
|
endif
|
||||||
|
|
||||||
# Deprecated driver names - do not use
|
# Deprecated driver names - do not use
|
||||||
@ -460,12 +464,16 @@ ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
|
|||||||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations
|
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations
|
||||||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations/runners
|
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations/runners
|
||||||
POST_CONFIG_H += $(QUANTUM_DIR)/rgb_matrix/post_config.h
|
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)/color.c
|
||||||
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix.c
|
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix.c
|
||||||
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix_drivers.c
|
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix_drivers.c
|
||||||
LIB8TION_ENABLE := yes
|
LIB8TION_ENABLE := yes
|
||||||
CIE1931_CURVE := yes
|
CIE1931_CURVE := yes
|
||||||
RGB_KEYCODES_ENABLE := yes
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), aw20216s)
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), aw20216s)
|
||||||
SPI_DRIVER_REQUIRED = yes
|
SPI_DRIVER_REQUIRED = yes
|
||||||
@ -568,10 +576,6 @@ ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_KEYCODES_ENABLE)), yes)
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_rgb.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
VARIABLE_TRACE ?= no
|
VARIABLE_TRACE ?= no
|
||||||
ifneq ($(strip $(VARIABLE_TRACE)),no)
|
ifneq ($(strip $(VARIABLE_TRACE)),no)
|
||||||
SRC += $(QUANTUM_DIR)/variable_trace.c
|
SRC += $(QUANTUM_DIR)/variable_trace.c
|
||||||
@ -631,6 +635,15 @@ ifeq ($(strip $(VIA_ENABLE)), yes)
|
|||||||
TRI_LAYER_ENABLE := yes
|
TRI_LAYER_ENABLE := yes
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RAW_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DRAW_ENABLE
|
||||||
|
SRC += raw_hid.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes)
|
||||||
|
SEND_STRING_ENABLE := yes
|
||||||
|
endif
|
||||||
|
|
||||||
VALID_CUSTOM_MATRIX_TYPES:= yes lite no
|
VALID_CUSTOM_MATRIX_TYPES:= yes lite no
|
||||||
|
|
||||||
CUSTOM_MATRIX ?= no
|
CUSTOM_MATRIX ?= no
|
||||||
@ -709,6 +722,7 @@ ifeq ($(strip $(LIB8TION_ENABLE)), yes)
|
|||||||
# ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines
|
# ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines
|
||||||
OPT_DEFS += -DLIB8_ATTINY
|
OPT_DEFS += -DLIB8_ATTINY
|
||||||
endif
|
endif
|
||||||
|
OPT_DEFS += -DFASTLED_SCALE8_FIXED=1 -DFASTLED_BLEND_FIXED=1
|
||||||
SRC += $(LIB_PATH)/lib8tion/lib8tion.c
|
SRC += $(LIB_PATH)/lib8tion/lib8tion.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -880,19 +894,19 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
|
|||||||
OPT_DEFS += -DBLUETOOTH_ENABLE
|
OPT_DEFS += -DBLUETOOTH_ENABLE
|
||||||
OPT_DEFS += -DBLUETOOTH_$(strip $(shell echo $(BLUETOOTH_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
OPT_DEFS += -DBLUETOOTH_$(strip $(shell echo $(BLUETOOTH_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||||
NO_USB_STARTUP_CHECK := yes
|
NO_USB_STARTUP_CHECK := yes
|
||||||
|
CONNECTION_ENABLE := yes
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/bluetooth
|
COMMON_VPATH += $(DRIVER_PATH)/bluetooth
|
||||||
SRC += outputselect.c
|
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
|
||||||
|
|
||||||
ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le)
|
ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le)
|
||||||
SPI_DRIVER_REQUIRED = yes
|
SPI_DRIVER_REQUIRED = yes
|
||||||
ANALOG_DRIVER_REQUIRED = yes
|
SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c
|
||||||
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
|
|
||||||
SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp
|
SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(BLUETOOTH_DRIVER)), rn42)
|
ifeq ($(strip $(BLUETOOTH_DRIVER)), rn42)
|
||||||
UART_DRIVER_REQUIRED = yes
|
UART_DRIVER_REQUIRED = yes
|
||||||
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
|
SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c
|
||||||
SRC += $(DRIVER_PATH)/bluetooth/rn42.c
|
SRC += $(DRIVER_PATH)/bluetooth/rn42.c
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@ -926,6 +940,28 @@ ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes)
|
|||||||
endif
|
endif
|
||||||
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
|
VALID_WS2812_DRIVER_TYPES := bitbang custom i2c pwm spi vendor
|
||||||
|
|
||||||
WS2812_DRIVER ?= bitbang
|
WS2812_DRIVER ?= bitbang
|
||||||
@ -936,7 +972,9 @@ ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes)
|
|||||||
|
|
||||||
OPT_DEFS += -DWS2812_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
OPT_DEFS += -DWS2812_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||||
|
|
||||||
SRC += ws2812_$(strip $(WS2812_DRIVER)).c
|
COMMON_VPATH += $(DRIVER_PATH)/led
|
||||||
|
|
||||||
|
SRC += ws2812.c ws2812_$(strip $(WS2812_DRIVER)).c
|
||||||
|
|
||||||
ifeq ($(strip $(PLATFORM)), CHIBIOS)
|
ifeq ($(strip $(PLATFORM)), CHIBIOS)
|
||||||
ifeq ($(strip $(WS2812_DRIVER)), pwm)
|
ifeq ($(strip $(WS2812_DRIVER)), pwm)
|
||||||
|
@ -43,25 +43,25 @@ ifneq ($(USE_CCACHE),no)
|
|||||||
CC_PREFIX ?= ccache
|
CC_PREFIX ?= ccache
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
#---------------- Debug Options ----------------
|
||||||
|
|
||||||
|
DEBUG_ENABLE ?= no
|
||||||
|
ifeq ($(strip $(DEBUG_ENABLE)),yes)
|
||||||
|
CFLAGS += -ggdb3
|
||||||
|
CXXFLAGS += -ggdb3
|
||||||
|
ASFLAGS += -ggdb3
|
||||||
|
# Create a map file when debugging
|
||||||
|
LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
#---------------- C Compiler Options ----------------
|
#---------------- C Compiler Options ----------------
|
||||||
|
|
||||||
ifeq ($(strip $(LTO_ENABLE)), yes)
|
ifeq ($(strip $(LTO_ENABLE)), yes)
|
||||||
ifeq ($(PLATFORM),ARM_ATSAM)
|
|
||||||
$(info Enabling LTO on arm_atsam-targeting boards is known to have a high likelihood of failure.)
|
|
||||||
$(info If unsure, set LTO_ENABLE = no.)
|
|
||||||
endif
|
|
||||||
CDEFS += -flto
|
CDEFS += -flto
|
||||||
CDEFS += -DLTO_ENABLE
|
CDEFS += -DLTO_ENABLE
|
||||||
endif
|
endif
|
||||||
|
|
||||||
DEBUG_ENABLE ?= yes
|
|
||||||
ifeq ($(strip $(SKIP_DEBUG_INFO)),yes)
|
|
||||||
DEBUG_ENABLE=no
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(DEBUG_ENABLE)),yes)
|
|
||||||
CFLAGS += -g$(DEBUG)
|
|
||||||
endif
|
|
||||||
CFLAGS += $(CDEFS)
|
CFLAGS += $(CDEFS)
|
||||||
CFLAGS += -O$(OPT)
|
CFLAGS += -O$(OPT)
|
||||||
# add color
|
# add color
|
||||||
@ -83,9 +83,6 @@ CFLAGS += -fcommon
|
|||||||
|
|
||||||
#---------------- C++ Compiler Options ----------------
|
#---------------- C++ Compiler Options ----------------
|
||||||
|
|
||||||
ifeq ($(strip $(DEBUG_ENABLE)),yes)
|
|
||||||
CXXFLAGS += -g$(DEBUG)
|
|
||||||
endif
|
|
||||||
CXXFLAGS += $(CXXDEFS)
|
CXXFLAGS += $(CXXDEFS)
|
||||||
CXXFLAGS += -O$(OPT)
|
CXXFLAGS += -O$(OPT)
|
||||||
# to suppress "warning: only initialized variables can be placed into program memory area"
|
# to suppress "warning: only initialized variables can be placed into program memory area"
|
||||||
@ -106,14 +103,10 @@ endif
|
|||||||
|
|
||||||
#---------------- Linker Options ----------------
|
#---------------- Linker Options ----------------
|
||||||
|
|
||||||
CREATE_MAP ?= yes
|
|
||||||
ifeq ($(CREATE_MAP),yes)
|
|
||||||
LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
|
|
||||||
endif
|
|
||||||
ifeq ($(VERBOSE_LD_CMD),yes)
|
ifeq ($(VERBOSE_LD_CMD),yes)
|
||||||
LDFLAGS += -v
|
LDFLAGS += -v
|
||||||
endif
|
endif
|
||||||
#LDFLAGS += -Wl,--relax
|
|
||||||
LDFLAGS += $(EXTMEMOPTS)
|
LDFLAGS += $(EXTMEMOPTS)
|
||||||
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
||||||
LDFLAGS += -lm
|
LDFLAGS += -lm
|
||||||
@ -130,11 +123,7 @@ ifeq ($(ADHLNS_ENABLE),yes)
|
|||||||
else
|
else
|
||||||
CFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
|
CFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
|
||||||
CXXFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
|
CXXFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
|
||||||
ifeq ($(strip $(DEBUG_ENABLE)),yes)
|
ASFLAGS += -Wa,-adhlns=$(@:%.o=%.lst),--listing-cont-lines=100
|
||||||
ASFLAGS = -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100
|
|
||||||
else
|
|
||||||
ASFLAGS = -Wa,-adhlns=$(@:%.o=%.lst),--listing-cont-lines=100
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -179,7 +168,7 @@ MOVE_DEP = mv -f $(patsubst %.o,%.td,$@) $(patsubst %.o,%.d,$@)
|
|||||||
|
|
||||||
# For a ChibiOS build, ensure that the board files have the hook overrides injected
|
# For a ChibiOS build, ensure that the board files have the hook overrides injected
|
||||||
define BOARDSRC_INJECT_HOOKS
|
define BOARDSRC_INJECT_HOOKS
|
||||||
$(INTERMEDIATE_OUTPUT)/$(patsubst %.c,%.o,$(patsubst ./%,%,$1)): INIT_HOOK_CFLAGS += -include $(TOP_DIR)/tmk_core/protocol/chibios/init_hooks.h
|
$(INTERMEDIATE_OUTPUT)/$(patsubst %.c,%.o,$(patsubst ./%,%,$1)): FILE_SPECIFIC_CFLAGS += -include $(TOP_DIR)/tmk_core/protocol/chibios/init_hooks.h
|
||||||
endef
|
endef
|
||||||
$(foreach LOBJ, $(BOARDSRC), $(eval $(call BOARDSRC_INJECT_HOOKS,$(LOBJ))))
|
$(foreach LOBJ, $(BOARDSRC), $(eval $(call BOARDSRC_INJECT_HOOKS,$(LOBJ))))
|
||||||
|
|
||||||
@ -300,10 +289,10 @@ $1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN)
|
|||||||
ifneq ($$(VERBOSE_C_INCLUDE),)
|
ifneq ($$(VERBOSE_C_INCLUDE),)
|
||||||
$$(if $$(filter $$(notdir $$(VERBOSE_C_INCLUDE)),$$(notdir $$<)),$$(eval CC_EXEC += -H))
|
$$(if $$(filter $$(notdir $$(VERBOSE_C_INCLUDE)),$$(notdir $$<)),$$(eval CC_EXEC += -H))
|
||||||
endif
|
endif
|
||||||
$$(eval CMD := $$(CC_EXEC) -c $$($1_CFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
$$(eval CMD := $$(CC_EXEC) -c $$($1_CFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
||||||
@$$(BUILD_CMD)
|
@$$(BUILD_CMD)
|
||||||
ifneq ($$(DUMP_C_MACROS),)
|
ifneq ($$(DUMP_C_MACROS),)
|
||||||
$$(eval CMD := $$(CC) -E -dM $$($1_CFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$<)
|
$$(eval CMD := $$(CC) -E -dM $$($1_CFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$<)
|
||||||
@$$(if $$(filter $$(notdir $$(DUMP_C_MACROS)),$$(notdir $$<)),$$(BUILD_CMD))
|
@$$(if $$(filter $$(notdir $$(DUMP_C_MACROS)),$$(notdir $$<)),$$(BUILD_CMD))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -311,13 +300,13 @@ $1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN)
|
|||||||
$1/%.o : %.cpp $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
|
$1/%.o : %.cpp $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
|
||||||
@mkdir -p $$(@D)
|
@mkdir -p $$(@D)
|
||||||
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
|
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
|
||||||
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
||||||
@$$(BUILD_CMD)
|
@$$(BUILD_CMD)
|
||||||
|
|
||||||
$1/%.o : %.cc $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
|
$1/%.o : %.cc $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
|
||||||
@mkdir -p $$(@D)
|
@mkdir -p $$(@D)
|
||||||
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
|
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
|
||||||
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
||||||
@$$(BUILD_CMD)
|
@$$(BUILD_CMD)
|
||||||
|
|
||||||
# Assemble: create object files from assembler source files.
|
# Assemble: create object files from assembler source files.
|
||||||
|
@ -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))
|
ifneq (,$(filter $(MCU),atmega32u4))
|
||||||
# TODO: opt in rather than assume everything uses a pro micro
|
# TODO: opt in rather than assume everything uses a pro micro
|
||||||
PIN_COMPATIBLE ?= promicro
|
PIN_COMPATIBLE ?= promicro
|
||||||
|
@ -39,8 +39,15 @@ export default defineConfig(({ mode }) => {
|
|||||||
provider: "local",
|
provider: "local",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
editLink: {
|
||||||
|
pattern: 'https://github.com/qmk/qmk_firmware/edit/master/docs/:path'
|
||||||
|
},
|
||||||
|
lastUpdated: true,
|
||||||
|
|
||||||
sidebar: sidebar,
|
sidebar: sidebar,
|
||||||
|
|
||||||
|
externalLinkIcon: true,
|
||||||
|
|
||||||
socialLinks: [
|
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: { 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" },
|
{ icon: "discord", link: "https://discord.gg/qmk" },
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"license": "GPL-2.0-or-later",
|
"license": "GPL-2.0-or-later",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"vite": "^5.2.10",
|
"vite": "^5.4.19",
|
||||||
"vitepress": "^1.1.0",
|
"vitepress": "^1.1.0",
|
||||||
"vitepress-plugin-tabs": "^0.5.0",
|
"vitepress-plugin-tabs": "^0.5.0",
|
||||||
"vue": "^3.4.24"
|
"vue": "^3.4.24"
|
||||||
|
@ -178,205 +178,220 @@
|
|||||||
"@docsearch/css" "3.6.0"
|
"@docsearch/css" "3.6.0"
|
||||||
algoliasearch "^4.19.1"
|
algoliasearch "^4.19.1"
|
||||||
|
|
||||||
"@esbuild/aix-ppc64@0.20.2":
|
"@esbuild/aix-ppc64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537"
|
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f"
|
||||||
integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==
|
integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==
|
||||||
|
|
||||||
"@esbuild/android-arm64@0.20.2":
|
"@esbuild/android-arm64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9"
|
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052"
|
||||||
integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==
|
integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==
|
||||||
|
|
||||||
"@esbuild/android-arm@0.20.2":
|
"@esbuild/android-arm@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995"
|
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28"
|
||||||
integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==
|
integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==
|
||||||
|
|
||||||
"@esbuild/android-x64@0.20.2":
|
"@esbuild/android-x64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98"
|
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e"
|
||||||
integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==
|
integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==
|
||||||
|
|
||||||
"@esbuild/darwin-arm64@0.20.2":
|
"@esbuild/darwin-arm64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb"
|
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a"
|
||||||
integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==
|
integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==
|
||||||
|
|
||||||
"@esbuild/darwin-x64@0.20.2":
|
"@esbuild/darwin-x64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0"
|
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22"
|
||||||
integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==
|
integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==
|
||||||
|
|
||||||
"@esbuild/freebsd-arm64@0.20.2":
|
"@esbuild/freebsd-arm64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911"
|
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e"
|
||||||
integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==
|
integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==
|
||||||
|
|
||||||
"@esbuild/freebsd-x64@0.20.2":
|
"@esbuild/freebsd-x64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c"
|
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261"
|
||||||
integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==
|
integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==
|
||||||
|
|
||||||
"@esbuild/linux-arm64@0.20.2":
|
"@esbuild/linux-arm64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b"
|
||||||
integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==
|
integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==
|
||||||
|
|
||||||
"@esbuild/linux-arm@0.20.2":
|
"@esbuild/linux-arm@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9"
|
||||||
integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==
|
integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==
|
||||||
|
|
||||||
"@esbuild/linux-ia32@0.20.2":
|
"@esbuild/linux-ia32@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2"
|
||||||
integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==
|
integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==
|
||||||
|
|
||||||
"@esbuild/linux-loong64@0.20.2":
|
"@esbuild/linux-loong64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df"
|
||||||
integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==
|
integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==
|
||||||
|
|
||||||
"@esbuild/linux-mips64el@0.20.2":
|
"@esbuild/linux-mips64el@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe"
|
||||||
integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==
|
integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==
|
||||||
|
|
||||||
"@esbuild/linux-ppc64@0.20.2":
|
"@esbuild/linux-ppc64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4"
|
||||||
integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==
|
integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==
|
||||||
|
|
||||||
"@esbuild/linux-riscv64@0.20.2":
|
"@esbuild/linux-riscv64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc"
|
||||||
integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==
|
integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==
|
||||||
|
|
||||||
"@esbuild/linux-s390x@0.20.2":
|
"@esbuild/linux-s390x@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de"
|
||||||
integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==
|
integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==
|
||||||
|
|
||||||
"@esbuild/linux-x64@0.20.2":
|
"@esbuild/linux-x64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0"
|
||||||
integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==
|
integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==
|
||||||
|
|
||||||
"@esbuild/netbsd-x64@0.20.2":
|
"@esbuild/netbsd-x64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6"
|
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047"
|
||||||
integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==
|
integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==
|
||||||
|
|
||||||
"@esbuild/openbsd-x64@0.20.2":
|
"@esbuild/openbsd-x64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf"
|
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70"
|
||||||
integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==
|
integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==
|
||||||
|
|
||||||
"@esbuild/sunos-x64@0.20.2":
|
"@esbuild/sunos-x64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f"
|
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b"
|
||||||
integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==
|
integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==
|
||||||
|
|
||||||
"@esbuild/win32-arm64@0.20.2":
|
"@esbuild/win32-arm64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90"
|
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d"
|
||||||
integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==
|
integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==
|
||||||
|
|
||||||
"@esbuild/win32-ia32@0.20.2":
|
"@esbuild/win32-ia32@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23"
|
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b"
|
||||||
integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==
|
integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==
|
||||||
|
|
||||||
"@esbuild/win32-x64@0.20.2":
|
"@esbuild/win32-x64@0.21.5":
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc"
|
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c"
|
||||||
integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==
|
integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
|
||||||
|
|
||||||
"@jridgewell/sourcemap-codec@^1.4.15":
|
"@jridgewell/sourcemap-codec@^1.4.15":
|
||||||
version "1.4.15"
|
version "1.4.15"
|
||||||
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
|
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
|
||||||
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
|
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
|
||||||
|
|
||||||
"@rollup/rollup-android-arm-eabi@4.16.4":
|
"@rollup/rollup-android-arm-eabi@4.31.0":
|
||||||
version "4.16.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz#5e8930291f1e5ead7fb1171d53ba5c87718de062"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz#d4dd60da0075a6ce9a6c76d71b8204f3e1822285"
|
||||||
integrity sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==
|
integrity sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==
|
||||||
|
|
||||||
"@rollup/rollup-android-arm64@4.16.4":
|
"@rollup/rollup-android-arm64@4.31.0":
|
||||||
version "4.16.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz#ffb84f1359c04ec8a022a97110e18a5600f5f638"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz#25c4d33259a7a2ccd2f52a5ffcc0bb3ab3f0729d"
|
||||||
integrity sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==
|
integrity sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==
|
||||||
|
|
||||||
"@rollup/rollup-darwin-arm64@4.16.4":
|
"@rollup/rollup-darwin-arm64@4.31.0":
|
||||||
version "4.16.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz#b2fcee8d4806a0b1b9185ac038cc428ddedce9f4"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz#d137dff254b19163a6b52ac083a71cd055dae844"
|
||||||
integrity sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==
|
integrity sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==
|
||||||
|
|
||||||
"@rollup/rollup-darwin-x64@4.16.4":
|
"@rollup/rollup-darwin-x64@4.31.0":
|
||||||
version "4.16.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz#fcb25ccbaa3dd33a6490e9d1c64bab2e0e16b932"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz#58ff20b5dacb797d3adca19f02a21c532f9d55bf"
|
||||||
integrity sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==
|
integrity sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm-gnueabihf@4.16.4":
|
"@rollup/rollup-freebsd-arm64@4.31.0":
|
||||||
version "4.16.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz#40d46bdfe667e5eca31bf40047460e326d2e26bb"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz#96ce1a241c591ec3e068f4af765d94eddb24e60c"
|
||||||
integrity sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==
|
integrity sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm-musleabihf@4.16.4":
|
"@rollup/rollup-freebsd-x64@4.31.0":
|
||||||
version "4.16.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz#7741df2448c11c56588b50835dbfe91b1a10b375"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz#e59e7ede505be41f0b4311b0b943f8eb44938467"
|
||||||
integrity sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==
|
integrity sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm64-gnu@4.16.4":
|
"@rollup/rollup-linux-arm-gnueabihf@4.31.0":
|
||||||
version "4.16.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz#0a23b02d2933e4c4872ad18d879890b6a4a295df"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz#e455ca6e4ff35bd46d62201c153352e717000a7b"
|
||||||
integrity sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==
|
integrity sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm64-musl@4.16.4":
|
"@rollup/rollup-linux-arm-musleabihf@4.31.0":
|
||||||
version "4.16.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz#e37ef259358aa886cc07d782220a4fb83c1e6970"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz#bc1a93d807d19e70b1e343a5bfea43723bcd6327"
|
||||||
integrity sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==
|
integrity sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==
|
||||||
|
|
||||||
"@rollup/rollup-linux-powerpc64le-gnu@4.16.4":
|
"@rollup/rollup-linux-arm64-gnu@4.31.0":
|
||||||
version "4.16.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz#8c69218b6de05ee2ba211664a2d2ac1e54e43f94"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz#f38bf843f1dc3d5de680caf31084008846e3efae"
|
||||||
integrity sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==
|
integrity sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==
|
||||||
|
|
||||||
"@rollup/rollup-linux-riscv64-gnu@4.16.4":
|
"@rollup/rollup-linux-arm64-musl@4.31.0":
|
||||||
version "4.16.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz#d32727dab8f538d9a4a7c03bcf58c436aecd0139"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz#b3987a96c18b7287129cf735be2dbf83e94d9d05"
|
||||||
integrity sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==
|
integrity sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==
|
||||||
|
|
||||||
"@rollup/rollup-linux-s390x-gnu@4.16.4":
|
"@rollup/rollup-linux-loongarch64-gnu@4.31.0":
|
||||||
version "4.16.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz#d46097246a187d99fc9451fe8393b7155b47c5ec"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz#0f0324044e71c4f02e9f49e7ec4e347b655b34ee"
|
||||||
integrity sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==
|
integrity sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==
|
||||||
|
|
||||||
"@rollup/rollup-linux-x64-gnu@4.16.4":
|
"@rollup/rollup-linux-powerpc64le-gnu@4.31.0":
|
||||||
version "4.16.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz#6356c5a03a4afb1c3057490fc51b4764e109dbc7"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz#809479f27f1fd5b4eecd2aa732132ad952d454ba"
|
||||||
integrity sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==
|
integrity sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==
|
||||||
|
|
||||||
"@rollup/rollup-linux-x64-musl@4.16.4":
|
"@rollup/rollup-linux-riscv64-gnu@4.31.0":
|
||||||
version "4.16.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz#03a5831a9c0d05877b94653b5ddd3020d3c6fb06"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz#7bc75c4f22db04d3c972f83431739cfa41c6a36e"
|
||||||
integrity sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==
|
integrity sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==
|
||||||
|
|
||||||
"@rollup/rollup-win32-arm64-msvc@4.16.4":
|
"@rollup/rollup-linux-s390x-gnu@4.31.0":
|
||||||
version "4.16.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz#6cc0db57750376b9303bdb6f5482af8974fcae35"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz#cfe8052345c55864d83ae343362cf1912480170e"
|
||||||
integrity sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==
|
integrity sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==
|
||||||
|
|
||||||
"@rollup/rollup-win32-ia32-msvc@4.16.4":
|
"@rollup/rollup-linux-x64-gnu@4.31.0":
|
||||||
version "4.16.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz#aea0b7e492bd9ed46971cb80bc34f1eb14e07789"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz#c6b048f1e25f3fea5b4bd246232f4d07a159c5a0"
|
||||||
integrity sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==
|
integrity sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==
|
||||||
|
|
||||||
"@rollup/rollup-win32-x64-msvc@4.16.4":
|
"@rollup/rollup-linux-x64-musl@4.31.0":
|
||||||
version "4.16.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz#c09ad9a132ccb5a67c4f211d909323ab1294f95f"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz#615273ac52d1a201f4de191cbd3389016a9d7d80"
|
||||||
integrity sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==
|
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":
|
"@shikijs/core@1.3.0", "@shikijs/core@^1.3.0":
|
||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
@ -390,10 +405,10 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
shiki "1.3.0"
|
shiki "1.3.0"
|
||||||
|
|
||||||
"@types/estree@1.0.5":
|
"@types/estree@1.0.6":
|
||||||
version "1.0.5"
|
version "1.0.6"
|
||||||
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
|
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50"
|
||||||
integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
|
integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==
|
||||||
|
|
||||||
"@types/linkify-it@*":
|
"@types/linkify-it@*":
|
||||||
version "3.0.5"
|
version "3.0.5"
|
||||||
@ -589,34 +604,34 @@ entities@^4.5.0:
|
|||||||
resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
|
resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
|
||||||
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
|
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
|
||||||
|
|
||||||
esbuild@^0.20.1:
|
esbuild@^0.21.3:
|
||||||
version "0.20.2"
|
version "0.21.5"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1"
|
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d"
|
||||||
integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==
|
integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
"@esbuild/aix-ppc64" "0.20.2"
|
"@esbuild/aix-ppc64" "0.21.5"
|
||||||
"@esbuild/android-arm" "0.20.2"
|
"@esbuild/android-arm" "0.21.5"
|
||||||
"@esbuild/android-arm64" "0.20.2"
|
"@esbuild/android-arm64" "0.21.5"
|
||||||
"@esbuild/android-x64" "0.20.2"
|
"@esbuild/android-x64" "0.21.5"
|
||||||
"@esbuild/darwin-arm64" "0.20.2"
|
"@esbuild/darwin-arm64" "0.21.5"
|
||||||
"@esbuild/darwin-x64" "0.20.2"
|
"@esbuild/darwin-x64" "0.21.5"
|
||||||
"@esbuild/freebsd-arm64" "0.20.2"
|
"@esbuild/freebsd-arm64" "0.21.5"
|
||||||
"@esbuild/freebsd-x64" "0.20.2"
|
"@esbuild/freebsd-x64" "0.21.5"
|
||||||
"@esbuild/linux-arm" "0.20.2"
|
"@esbuild/linux-arm" "0.21.5"
|
||||||
"@esbuild/linux-arm64" "0.20.2"
|
"@esbuild/linux-arm64" "0.21.5"
|
||||||
"@esbuild/linux-ia32" "0.20.2"
|
"@esbuild/linux-ia32" "0.21.5"
|
||||||
"@esbuild/linux-loong64" "0.20.2"
|
"@esbuild/linux-loong64" "0.21.5"
|
||||||
"@esbuild/linux-mips64el" "0.20.2"
|
"@esbuild/linux-mips64el" "0.21.5"
|
||||||
"@esbuild/linux-ppc64" "0.20.2"
|
"@esbuild/linux-ppc64" "0.21.5"
|
||||||
"@esbuild/linux-riscv64" "0.20.2"
|
"@esbuild/linux-riscv64" "0.21.5"
|
||||||
"@esbuild/linux-s390x" "0.20.2"
|
"@esbuild/linux-s390x" "0.21.5"
|
||||||
"@esbuild/linux-x64" "0.20.2"
|
"@esbuild/linux-x64" "0.21.5"
|
||||||
"@esbuild/netbsd-x64" "0.20.2"
|
"@esbuild/netbsd-x64" "0.21.5"
|
||||||
"@esbuild/openbsd-x64" "0.20.2"
|
"@esbuild/openbsd-x64" "0.21.5"
|
||||||
"@esbuild/sunos-x64" "0.20.2"
|
"@esbuild/sunos-x64" "0.21.5"
|
||||||
"@esbuild/win32-arm64" "0.20.2"
|
"@esbuild/win32-arm64" "0.21.5"
|
||||||
"@esbuild/win32-ia32" "0.20.2"
|
"@esbuild/win32-ia32" "0.21.5"
|
||||||
"@esbuild/win32-x64" "0.20.2"
|
"@esbuild/win32-x64" "0.21.5"
|
||||||
|
|
||||||
estree-walker@^2.0.2:
|
estree-walker@^2.0.2:
|
||||||
version "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"
|
resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1"
|
||||||
integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
|
integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
|
||||||
|
|
||||||
nanoid@^3.3.7:
|
nanoid@^3.3.8:
|
||||||
version "3.3.7"
|
version "3.3.8"
|
||||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
|
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf"
|
||||||
integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
|
integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==
|
||||||
|
|
||||||
perfect-debounce@^1.0.0:
|
perfect-debounce@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a"
|
resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a"
|
||||||
integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==
|
integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==
|
||||||
|
|
||||||
picocolors@^1.0.0:
|
picocolors@^1.1.1:
|
||||||
version "1.0.0"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
|
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
|
||||||
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
|
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
|
||||||
|
|
||||||
postcss@^8.4.38:
|
postcss@^8.4.38, postcss@^8.4.43:
|
||||||
version "8.4.38"
|
version "8.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e"
|
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214"
|
||||||
integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==
|
integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
nanoid "^3.3.7"
|
nanoid "^3.3.8"
|
||||||
picocolors "^1.0.0"
|
picocolors "^1.1.1"
|
||||||
source-map-js "^1.2.0"
|
source-map-js "^1.2.1"
|
||||||
|
|
||||||
preact@^10.0.0:
|
preact@^10.0.0:
|
||||||
version "10.20.2"
|
version "10.20.2"
|
||||||
@ -696,29 +711,32 @@ rfdc@^1.3.1:
|
|||||||
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f"
|
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f"
|
||||||
integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==
|
integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==
|
||||||
|
|
||||||
rollup@^4.13.0:
|
rollup@^4.20.0:
|
||||||
version "4.16.4"
|
version "4.31.0"
|
||||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.16.4.tgz#fe328eb41293f20c9593a095ec23bdc4b5d93317"
|
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.31.0.tgz#b84af969a0292cb047dce2c0ec5413a9457597a4"
|
||||||
integrity sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==
|
integrity sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/estree" "1.0.5"
|
"@types/estree" "1.0.6"
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
"@rollup/rollup-android-arm-eabi" "4.16.4"
|
"@rollup/rollup-android-arm-eabi" "4.31.0"
|
||||||
"@rollup/rollup-android-arm64" "4.16.4"
|
"@rollup/rollup-android-arm64" "4.31.0"
|
||||||
"@rollup/rollup-darwin-arm64" "4.16.4"
|
"@rollup/rollup-darwin-arm64" "4.31.0"
|
||||||
"@rollup/rollup-darwin-x64" "4.16.4"
|
"@rollup/rollup-darwin-x64" "4.31.0"
|
||||||
"@rollup/rollup-linux-arm-gnueabihf" "4.16.4"
|
"@rollup/rollup-freebsd-arm64" "4.31.0"
|
||||||
"@rollup/rollup-linux-arm-musleabihf" "4.16.4"
|
"@rollup/rollup-freebsd-x64" "4.31.0"
|
||||||
"@rollup/rollup-linux-arm64-gnu" "4.16.4"
|
"@rollup/rollup-linux-arm-gnueabihf" "4.31.0"
|
||||||
"@rollup/rollup-linux-arm64-musl" "4.16.4"
|
"@rollup/rollup-linux-arm-musleabihf" "4.31.0"
|
||||||
"@rollup/rollup-linux-powerpc64le-gnu" "4.16.4"
|
"@rollup/rollup-linux-arm64-gnu" "4.31.0"
|
||||||
"@rollup/rollup-linux-riscv64-gnu" "4.16.4"
|
"@rollup/rollup-linux-arm64-musl" "4.31.0"
|
||||||
"@rollup/rollup-linux-s390x-gnu" "4.16.4"
|
"@rollup/rollup-linux-loongarch64-gnu" "4.31.0"
|
||||||
"@rollup/rollup-linux-x64-gnu" "4.16.4"
|
"@rollup/rollup-linux-powerpc64le-gnu" "4.31.0"
|
||||||
"@rollup/rollup-linux-x64-musl" "4.16.4"
|
"@rollup/rollup-linux-riscv64-gnu" "4.31.0"
|
||||||
"@rollup/rollup-win32-arm64-msvc" "4.16.4"
|
"@rollup/rollup-linux-s390x-gnu" "4.31.0"
|
||||||
"@rollup/rollup-win32-ia32-msvc" "4.16.4"
|
"@rollup/rollup-linux-x64-gnu" "4.31.0"
|
||||||
"@rollup/rollup-win32-x64-msvc" "4.16.4"
|
"@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"
|
fsevents "~2.3.2"
|
||||||
|
|
||||||
shiki@1.3.0, shiki@^1.3.0:
|
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"
|
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
|
||||||
integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
|
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:
|
speakingurl@^14.0.1:
|
||||||
version "14.0.1"
|
version "14.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53"
|
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"
|
resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97"
|
||||||
integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==
|
integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==
|
||||||
|
|
||||||
vite@^5.2.10, vite@^5.2.9:
|
vite@^5.2.9, vite@^5.4.19:
|
||||||
version "5.2.10"
|
version "5.4.19"
|
||||||
resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.10.tgz#2ac927c91e99d51b376a5c73c0e4b059705f5bd7"
|
resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.19.tgz#20efd060410044b3ed555049418a5e7d1998f959"
|
||||||
integrity sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==
|
integrity sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==
|
||||||
dependencies:
|
dependencies:
|
||||||
esbuild "^0.20.1"
|
esbuild "^0.21.3"
|
||||||
postcss "^8.4.38"
|
postcss "^8.4.43"
|
||||||
rollup "^4.13.0"
|
rollup "^4.20.0"
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
fsevents "~2.3.3"
|
fsevents "~2.3.3"
|
||||||
|
|
||||||
|
@ -25,6 +25,7 @@ GENERIC_FEATURES = \
|
|||||||
CAPS_WORD \
|
CAPS_WORD \
|
||||||
COMBO \
|
COMBO \
|
||||||
COMMAND \
|
COMMAND \
|
||||||
|
CONNECTION \
|
||||||
CRC \
|
CRC \
|
||||||
DEFERRED_EXEC \
|
DEFERRED_EXEC \
|
||||||
DIGITIZER \
|
DIGITIZER \
|
||||||
@ -34,8 +35,10 @@ GENERIC_FEATURES = \
|
|||||||
DYNAMIC_TAPPING_TERM \
|
DYNAMIC_TAPPING_TERM \
|
||||||
GRAVE_ESC \
|
GRAVE_ESC \
|
||||||
HAPTIC \
|
HAPTIC \
|
||||||
|
KEYCODE_STRING \
|
||||||
KEY_LOCK \
|
KEY_LOCK \
|
||||||
KEY_OVERRIDE \
|
KEY_OVERRIDE \
|
||||||
|
LAYER_LOCK \
|
||||||
LEADER \
|
LEADER \
|
||||||
MAGIC \
|
MAGIC \
|
||||||
MOUSEKEY \
|
MOUSEKEY \
|
||||||
@ -59,6 +62,7 @@ define HANDLE_GENERIC_FEATURE
|
|||||||
SRC += $$(wildcard $$(QUANTUM_DIR)/process_keycode/process_$2.c)
|
SRC += $$(wildcard $$(QUANTUM_DIR)/process_keycode/process_$2.c)
|
||||||
SRC += $$(wildcard $$(QUANTUM_DIR)/$2/$2.c)
|
SRC += $$(wildcard $$(QUANTUM_DIR)/$2/$2.c)
|
||||||
SRC += $$(wildcard $$(QUANTUM_DIR)/$2.c)
|
SRC += $$(wildcard $$(QUANTUM_DIR)/$2.c)
|
||||||
|
SRC += $$(wildcard $$(QUANTUM_DIR)/nvm/$$(NVM_DRIVER_LOWER)/nvm_$2.c)
|
||||||
VPATH += $$(wildcard $$(QUANTUM_DIR)/$2/)
|
VPATH += $$(wildcard $$(QUANTUM_DIR)/$2/)
|
||||||
OPT_DEFS += -D$1_ENABLE
|
OPT_DEFS += -D$1_ENABLE
|
||||||
endef
|
endef
|
||||||
|
@ -67,7 +67,6 @@ OTHER_OPTION_NAMES = \
|
|||||||
PS2_DRIVER \
|
PS2_DRIVER \
|
||||||
RAW_ENABLE \
|
RAW_ENABLE \
|
||||||
SWAP_HANDS_ENABLE \
|
SWAP_HANDS_ENABLE \
|
||||||
RING_BUFFERED_6KRO_REPORT_ENABLE \
|
|
||||||
WATCHDOG_ENABLE \
|
WATCHDOG_ENABLE \
|
||||||
ERGOINU \
|
ERGOINU \
|
||||||
NO_USB_STARTUP_CHECK \
|
NO_USB_STARTUP_CHECK \
|
||||||
|
11
builddefs/support.mk
Normal file
11
builddefs/support.mk
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Helper to determine if a compiler option is supported
|
||||||
|
# Args:
|
||||||
|
# $(1) = option to test, if successful will be output
|
||||||
|
# $(2) = option to use if $(1) is not supported
|
||||||
|
# $(3) = additional arguments to pass to the compiler during the test, but aren't contained in the output
|
||||||
|
cc-option = $(shell \
|
||||||
|
if { echo 'int main(){return 0;}' | $(CC) $(1) $(3) -o /dev/null -x c /dev/null >/dev/null 2>&1; }; \
|
||||||
|
then echo "$(1)"; else echo "$(2)"; fi)
|
||||||
|
|
||||||
|
# Helper to pass comma character to make functions (use with `$(,)` to pass in `$(call ...)` arguments)
|
||||||
|
, := ,
|
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",
|
"key": "FA_PIPE",
|
||||||
"label": "|",
|
"label": "|",
|
||||||
}
|
}
|
||||||
"ALGR(FA_RA)": {
|
"ALGR(FA_RE)": {
|
||||||
"key": "FA_SUBA",
|
"key": "FA_SUBA",
|
||||||
"label": "ٖ",
|
"label": "ٖ",
|
||||||
}
|
}
|
||||||
|
@ -1140,7 +1140,7 @@
|
|||||||
"0x00AE": {
|
"0x00AE": {
|
||||||
"group": "media",
|
"group": "media",
|
||||||
"key": "KC_MEDIA_PLAY_PAUSE",
|
"key": "KC_MEDIA_PLAY_PAUSE",
|
||||||
"label": "Mute",
|
"label": "Play/Pause Track",
|
||||||
"aliases": [
|
"aliases": [
|
||||||
"KC_MPLY"
|
"KC_MPLY"
|
||||||
]
|
]
|
||||||
|
@ -84,7 +84,7 @@
|
|||||||
"group": "midi",
|
"group": "midi",
|
||||||
"key": "QK_MIDI_NOTE_G_SHARP_0",
|
"key": "QK_MIDI_NOTE_G_SHARP_0",
|
||||||
"aliases": [
|
"aliases": [
|
||||||
"MI_Gs"
|
"MI_Gs",
|
||||||
"MI_Ab"
|
"MI_Ab"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@ -99,7 +99,7 @@
|
|||||||
"group": "midi",
|
"group": "midi",
|
||||||
"key": "QK_MIDI_NOTE_A_SHARP_0",
|
"key": "QK_MIDI_NOTE_A_SHARP_0",
|
||||||
"aliases": [
|
"aliases": [
|
||||||
"MI_As"
|
"MI_As",
|
||||||
"MI_Bb"
|
"MI_Bb"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -2,131 +2,131 @@
|
|||||||
"keycodes": {
|
"keycodes": {
|
||||||
"0x7E00": {
|
"0x7E00": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_0",
|
"key": "QK_KB_0"
|
||||||
},
|
},
|
||||||
"0x7E01": {
|
"0x7E01": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_1",
|
"key": "QK_KB_1"
|
||||||
},
|
},
|
||||||
"0x7E02": {
|
"0x7E02": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_2",
|
"key": "QK_KB_2"
|
||||||
},
|
},
|
||||||
"0x7E03": {
|
"0x7E03": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_3",
|
"key": "QK_KB_3"
|
||||||
},
|
},
|
||||||
"0x7E04": {
|
"0x7E04": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_4",
|
"key": "QK_KB_4"
|
||||||
},
|
},
|
||||||
"0x7E05": {
|
"0x7E05": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_5",
|
"key": "QK_KB_5"
|
||||||
},
|
},
|
||||||
"0x7E06": {
|
"0x7E06": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_6",
|
"key": "QK_KB_6"
|
||||||
},
|
},
|
||||||
"0x7E07": {
|
"0x7E07": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_7",
|
"key": "QK_KB_7"
|
||||||
},
|
},
|
||||||
"0x7E08": {
|
"0x7E08": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_8",
|
"key": "QK_KB_8"
|
||||||
},
|
},
|
||||||
"0x7E09": {
|
"0x7E09": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_9",
|
"key": "QK_KB_9"
|
||||||
},
|
},
|
||||||
"0x7E0A": {
|
"0x7E0A": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_10",
|
"key": "QK_KB_10"
|
||||||
},
|
},
|
||||||
"0x7E0B": {
|
"0x7E0B": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_11",
|
"key": "QK_KB_11"
|
||||||
},
|
},
|
||||||
"0x7E0C": {
|
"0x7E0C": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_12",
|
"key": "QK_KB_12"
|
||||||
},
|
},
|
||||||
"0x7E0D": {
|
"0x7E0D": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_13",
|
"key": "QK_KB_13"
|
||||||
},
|
},
|
||||||
"0x7E0E": {
|
"0x7E0E": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_14",
|
"key": "QK_KB_14"
|
||||||
},
|
},
|
||||||
"0x7E0F": {
|
"0x7E0F": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_15",
|
"key": "QK_KB_15"
|
||||||
},
|
},
|
||||||
"0x7E10": {
|
"0x7E10": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_16",
|
"key": "QK_KB_16"
|
||||||
},
|
},
|
||||||
"0x7E11": {
|
"0x7E11": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_17",
|
"key": "QK_KB_17"
|
||||||
},
|
},
|
||||||
"0x7E12": {
|
"0x7E12": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_18",
|
"key": "QK_KB_18"
|
||||||
},
|
},
|
||||||
"0x7E13": {
|
"0x7E13": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_19",
|
"key": "QK_KB_19"
|
||||||
},
|
},
|
||||||
"0x7E14": {
|
"0x7E14": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_20",
|
"key": "QK_KB_20"
|
||||||
},
|
},
|
||||||
"0x7E15": {
|
"0x7E15": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_21",
|
"key": "QK_KB_21"
|
||||||
},
|
},
|
||||||
"0x7E16": {
|
"0x7E16": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_22",
|
"key": "QK_KB_22"
|
||||||
},
|
},
|
||||||
"0x7E17": {
|
"0x7E17": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_23",
|
"key": "QK_KB_23"
|
||||||
},
|
},
|
||||||
"0x7E18": {
|
"0x7E18": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_24",
|
"key": "QK_KB_24"
|
||||||
},
|
},
|
||||||
"0x7E19": {
|
"0x7E19": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_25",
|
"key": "QK_KB_25"
|
||||||
},
|
},
|
||||||
"0x7E1A": {
|
"0x7E1A": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_26",
|
"key": "QK_KB_26"
|
||||||
},
|
},
|
||||||
"0x7E1B": {
|
"0x7E1B": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_27",
|
"key": "QK_KB_27"
|
||||||
},
|
},
|
||||||
"0x7E1C": {
|
"0x7E1C": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_28",
|
"key": "QK_KB_28"
|
||||||
},
|
},
|
||||||
"0x7E1D": {
|
"0x7E1D": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_29",
|
"key": "QK_KB_29"
|
||||||
},
|
},
|
||||||
"0x7E1E": {
|
"0x7E1E": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_30",
|
"key": "QK_KB_30"
|
||||||
},
|
},
|
||||||
"0x7E1F": {
|
"0x7E1F": {
|
||||||
"group": "kb",
|
"group": "kb",
|
||||||
"key": "QK_KB_31",
|
"key": "QK_KB_31"
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -86,7 +86,7 @@
|
|||||||
"group": "midi",
|
"group": "midi",
|
||||||
"key": "QK_MIDI_NOTE_G_SHARP_0",
|
"key": "QK_MIDI_NOTE_G_SHARP_0",
|
||||||
"aliases": [
|
"aliases": [
|
||||||
"MI_Gs"
|
"MI_Gs",
|
||||||
"MI_Ab"
|
"MI_Ab"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@ -101,7 +101,7 @@
|
|||||||
"group": "midi",
|
"group": "midi",
|
||||||
"key": "QK_MIDI_NOTE_A_SHARP_0",
|
"key": "QK_MIDI_NOTE_A_SHARP_0",
|
||||||
"aliases": [
|
"aliases": [
|
||||||
"MI_As"
|
"MI_As",
|
||||||
"MI_Bb"
|
"MI_Bb"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -2,131 +2,131 @@
|
|||||||
"keycodes": {
|
"keycodes": {
|
||||||
"0x7E40": {
|
"0x7E40": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_0",
|
"key": "QK_USER_0"
|
||||||
},
|
},
|
||||||
"0x7E41": {
|
"0x7E41": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_1",
|
"key": "QK_USER_1"
|
||||||
},
|
},
|
||||||
"0x7E42": {
|
"0x7E42": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_2",
|
"key": "QK_USER_2"
|
||||||
},
|
},
|
||||||
"0x7E43": {
|
"0x7E43": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_3",
|
"key": "QK_USER_3"
|
||||||
},
|
},
|
||||||
"0x7E44": {
|
"0x7E44": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_4",
|
"key": "QK_USER_4"
|
||||||
},
|
},
|
||||||
"0x7E45": {
|
"0x7E45": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_5",
|
"key": "QK_USER_5"
|
||||||
},
|
},
|
||||||
"0x7E46": {
|
"0x7E46": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_6",
|
"key": "QK_USER_6"
|
||||||
},
|
},
|
||||||
"0x7E47": {
|
"0x7E47": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_7",
|
"key": "QK_USER_7"
|
||||||
},
|
},
|
||||||
"0x7E48": {
|
"0x7E48": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_8",
|
"key": "QK_USER_8"
|
||||||
},
|
},
|
||||||
"0x7E49": {
|
"0x7E49": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_9",
|
"key": "QK_USER_9"
|
||||||
},
|
},
|
||||||
"0x7E4A": {
|
"0x7E4A": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_10",
|
"key": "QK_USER_10"
|
||||||
},
|
},
|
||||||
"0x7E4B": {
|
"0x7E4B": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_11",
|
"key": "QK_USER_11"
|
||||||
},
|
},
|
||||||
"0x7E4C": {
|
"0x7E4C": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_12",
|
"key": "QK_USER_12"
|
||||||
},
|
},
|
||||||
"0x7E4D": {
|
"0x7E4D": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_13",
|
"key": "QK_USER_13"
|
||||||
},
|
},
|
||||||
"0x7E4E": {
|
"0x7E4E": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_14",
|
"key": "QK_USER_14"
|
||||||
},
|
},
|
||||||
"0x7E4F": {
|
"0x7E4F": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_15",
|
"key": "QK_USER_15"
|
||||||
},
|
},
|
||||||
"0x7E50": {
|
"0x7E50": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_16",
|
"key": "QK_USER_16"
|
||||||
},
|
},
|
||||||
"0x7E51": {
|
"0x7E51": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_17",
|
"key": "QK_USER_17"
|
||||||
},
|
},
|
||||||
"0x7E52": {
|
"0x7E52": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_18",
|
"key": "QK_USER_18"
|
||||||
},
|
},
|
||||||
"0x7E53": {
|
"0x7E53": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_19",
|
"key": "QK_USER_19"
|
||||||
},
|
},
|
||||||
"0x7E54": {
|
"0x7E54": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_20",
|
"key": "QK_USER_20"
|
||||||
},
|
},
|
||||||
"0x7E55": {
|
"0x7E55": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_21",
|
"key": "QK_USER_21"
|
||||||
},
|
},
|
||||||
"0x7E56": {
|
"0x7E56": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_22",
|
"key": "QK_USER_22"
|
||||||
},
|
},
|
||||||
"0x7E57": {
|
"0x7E57": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_23",
|
"key": "QK_USER_23"
|
||||||
},
|
},
|
||||||
"0x7E58": {
|
"0x7E58": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_24",
|
"key": "QK_USER_24"
|
||||||
},
|
},
|
||||||
"0x7E59": {
|
"0x7E59": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_25",
|
"key": "QK_USER_25"
|
||||||
},
|
},
|
||||||
"0x7E5A": {
|
"0x7E5A": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_26",
|
"key": "QK_USER_26"
|
||||||
},
|
},
|
||||||
"0x7E5B": {
|
"0x7E5B": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_27",
|
"key": "QK_USER_27"
|
||||||
},
|
},
|
||||||
"0x7E5C": {
|
"0x7E5C": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_28",
|
"key": "QK_USER_28"
|
||||||
},
|
},
|
||||||
"0x7E5D": {
|
"0x7E5D": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_29",
|
"key": "QK_USER_29"
|
||||||
},
|
},
|
||||||
"0x7E5E": {
|
"0x7E5E": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_30",
|
"key": "QK_USER_30"
|
||||||
},
|
},
|
||||||
"0x7E5F": {
|
"0x7E5F": {
|
||||||
"group": "user",
|
"group": "user",
|
||||||
"key": "QK_USER_31",
|
"key": "QK_USER_31"
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
7
data/constants/keycodes/keycodes_0.0.6.hjson
Normal file
7
data/constants/keycodes/keycodes_0.0.6.hjson
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"ranges": {
|
||||||
|
"0x52E0/0x001F": {
|
||||||
|
"define": "QK_PERSISTENT_DEF_LAYER"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
115
data/constants/keycodes/keycodes_0.0.6_connection.hjson
Normal file
115
data/constants/keycodes/keycodes_0.0.6_connection.hjson
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
{
|
||||||
|
"ranges": {
|
||||||
|
"0x7780/0x003F": {
|
||||||
|
"define": "QK_CONNECTION"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"keycodes": {
|
||||||
|
"0x7780": {
|
||||||
|
"group": "connection",
|
||||||
|
"key": "QK_OUTPUT_AUTO",
|
||||||
|
"aliases": [
|
||||||
|
"OU_AUTO"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"0x7781": {
|
||||||
|
"group": "connection",
|
||||||
|
"key": "QK_OUTPUT_NEXT",
|
||||||
|
"aliases": [
|
||||||
|
"OU_NEXT"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"0x7782": {
|
||||||
|
"group": "connection",
|
||||||
|
"key": "QK_OUTPUT_PREV",
|
||||||
|
"aliases": [
|
||||||
|
"OU_PREV"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"0x7783": {
|
||||||
|
"group": "connection",
|
||||||
|
"key": "QK_OUTPUT_NONE",
|
||||||
|
"aliases": [
|
||||||
|
"OU_NONE"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"0x7784": {
|
||||||
|
"group": "connection",
|
||||||
|
"key": "QK_OUTPUT_USB",
|
||||||
|
"aliases": [
|
||||||
|
"OU_USB"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"0x7785": {
|
||||||
|
"group": "connection",
|
||||||
|
"key": "QK_OUTPUT_2P4GHZ",
|
||||||
|
"aliases": [
|
||||||
|
"OU_2P4G"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"0x7786": {
|
||||||
|
"group": "connection",
|
||||||
|
"key": "QK_OUTPUT_BLUETOOTH",
|
||||||
|
"aliases": [
|
||||||
|
"OU_BT"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
"0x7790": {
|
||||||
|
"group": "connection",
|
||||||
|
"key": "QK_BLUETOOTH_PROFILE_NEXT",
|
||||||
|
"aliases": [
|
||||||
|
"BT_NEXT"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"0x7791": {
|
||||||
|
"group": "connection",
|
||||||
|
"key": "QK_BLUETOOTH_PROFILE_PREV",
|
||||||
|
"aliases": [
|
||||||
|
"BT_PREV"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"0x7792": {
|
||||||
|
"group": "connection",
|
||||||
|
"key": "QK_BLUETOOTH_UNPAIR",
|
||||||
|
"aliases": [
|
||||||
|
"BT_UNPR"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
"0x7793": {
|
||||||
|
"group": "connection",
|
||||||
|
"key": "QK_BLUETOOTH_PROFILE1",
|
||||||
|
"aliases": [
|
||||||
|
"BT_PRF1"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"0x7794": {
|
||||||
|
"group": "connection",
|
||||||
|
"key": "QK_BLUETOOTH_PROFILE2",
|
||||||
|
"aliases": [
|
||||||
|
"BT_PRF2"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"0x7795": {
|
||||||
|
"group": "connection",
|
||||||
|
"key": "QK_BLUETOOTH_PROFILE3",
|
||||||
|
"aliases": [
|
||||||
|
"BT_PRF3"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"0x7796": {
|
||||||
|
"group": "connection",
|
||||||
|
"key": "QK_BLUETOOTH_PROFILE4",
|
||||||
|
"aliases": [
|
||||||
|
"BT_PRF4"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"0x7797": {
|
||||||
|
"group": "connection",
|
||||||
|
"key": "QK_BLUETOOTH_PROFILE5",
|
||||||
|
"aliases": [
|
||||||
|
"BT_PRF5"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
14
data/constants/keycodes/keycodes_0.0.6_quantum.hjson
Normal file
14
data/constants/keycodes/keycodes_0.0.6_quantum.hjson
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"keycodes": {
|
||||||
|
"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
|
||||||
|
}
|
||||||
|
}
|
55
data/constants/module_hooks/1.1.0.hjson
Normal file
55
data/constants/module_hooks/1.1.0.hjson
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
{
|
||||||
|
pointing_device_init: {
|
||||||
|
ret_type: void
|
||||||
|
args: void
|
||||||
|
guard: defined(POINTING_DEVICE_ENABLE)
|
||||||
|
}
|
||||||
|
pointing_device_task: {
|
||||||
|
ret_type: report_mouse_t
|
||||||
|
args: report_mouse_t mouse_report
|
||||||
|
call_params: mouse_report
|
||||||
|
guard: defined(POINTING_DEVICE_ENABLE)
|
||||||
|
header: report.h
|
||||||
|
}
|
||||||
|
rgb_matrix_indicators: {
|
||||||
|
ret_type: bool
|
||||||
|
args: void
|
||||||
|
guard: defined(RGB_MATRIX_ENABLE)
|
||||||
|
header: rgb_matrix.h
|
||||||
|
}
|
||||||
|
rgb_matrix_indicators_advanced: {
|
||||||
|
ret_type: bool
|
||||||
|
args: uint8_t led_min, uint8_t led_max
|
||||||
|
call_params: led_min, led_max
|
||||||
|
guard: defined(RGB_MATRIX_ENABLE)
|
||||||
|
header: rgb_matrix.h
|
||||||
|
}
|
||||||
|
led_matrix_indicators: {
|
||||||
|
ret_type: bool
|
||||||
|
args: void
|
||||||
|
guard: defined(LED_MATRIX_ENABLE)
|
||||||
|
header: led_matrix.h
|
||||||
|
}
|
||||||
|
led_matrix_indicators_advanced: {
|
||||||
|
ret_type: bool
|
||||||
|
args: uint8_t led_min, uint8_t led_max
|
||||||
|
call_params: led_min, led_max
|
||||||
|
guard: defined(LED_MATRIX_ENABLE)
|
||||||
|
header: led_matrix.h
|
||||||
|
}
|
||||||
|
default_layer_state_set: {
|
||||||
|
ret_type: layer_state_t
|
||||||
|
args: layer_state_t state
|
||||||
|
call_params: state
|
||||||
|
guard: !defined(NO_ACTION_LAYER)
|
||||||
|
header: action_layer.h
|
||||||
|
}
|
||||||
|
layer_state_set: {
|
||||||
|
ret_type: layer_state_t
|
||||||
|
args: layer_state_t state
|
||||||
|
call_params: state
|
||||||
|
guard: !defined(NO_ACTION_LAYER)
|
||||||
|
header: action_layer.h
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
3
data/constants/module_hooks/1.1.1.hjson
Normal file
3
data/constants/module_hooks/1.1.1.hjson
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
// This version exists to signify addition of LED/RGB effect support.
|
||||||
|
}
|
@ -84,6 +84,11 @@
|
|||||||
"board": "STEMCELL",
|
"board": "STEMCELL",
|
||||||
"bootloader": "tinyuf2",
|
"bootloader": "tinyuf2",
|
||||||
"processor": "STM32F411"
|
"processor": "STM32F411"
|
||||||
|
},
|
||||||
|
"svlinky": {
|
||||||
|
"board": "QMK_PM2040",
|
||||||
|
"bootloader": "rp2040",
|
||||||
|
"processor": "RP2040"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,12 @@
|
|||||||
"WEAR_LEVELING_BACKING_SIZE": {"info_key": "eeprom.wear_leveling.backing_size", "value_type": "int", "to_json": false},
|
"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},
|
"WEAR_LEVELING_LOGICAL_SIZE": {"info_key": "eeprom.wear_leveling.logical_size", "value_type": "int", "to_json": false},
|
||||||
|
|
||||||
|
// host
|
||||||
|
"NKRO_DEFAULT_ON": {"info_key": "host.default.nkro", "value_type": "bool"},
|
||||||
|
|
||||||
|
// Layer locking
|
||||||
|
"LAYER_LOCK_IDLE_TIMEOUT": {"info_key": "layer_lock.timeout", "value_type": "int"},
|
||||||
|
|
||||||
// Indicators
|
// Indicators
|
||||||
"LED_CAPS_LOCK_PIN": {"info_key": "indicators.caps_lock"},
|
"LED_CAPS_LOCK_PIN": {"info_key": "indicators.caps_lock"},
|
||||||
"LED_NUM_LOCK_PIN": {"info_key": "indicators.num_lock"},
|
"LED_NUM_LOCK_PIN": {"info_key": "indicators.num_lock"},
|
||||||
@ -197,6 +203,8 @@
|
|||||||
"SPLIT_WPM_ENABLE": {"info_key": "split.transport.sync.wpm", "value_type": "flag"},
|
"SPLIT_WPM_ENABLE": {"info_key": "split.transport.sync.wpm", "value_type": "flag"},
|
||||||
|
|
||||||
// Tapping
|
// 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": {"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"},
|
"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"},
|
"PERMISSIVE_HOLD": {"info_key": "tapping.permissive_hold", "value_type": "flag"},
|
||||||
@ -210,7 +218,6 @@
|
|||||||
"TAPPING_TOGGLE": {"info_key": "tapping.toggle", "value_type": "int"},
|
"TAPPING_TOGGLE": {"info_key": "tapping.toggle", "value_type": "int"},
|
||||||
|
|
||||||
// USB
|
// USB
|
||||||
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "flag"},
|
|
||||||
"USB_MAX_POWER_CONSUMPTION": {"info_key": "usb.max_power", "value_type": "int"},
|
"USB_MAX_POWER_CONSUMPTION": {"info_key": "usb.max_power", "value_type": "int"},
|
||||||
"USB_POLLING_INTERVAL_MS": {"info_key": "usb.polling_interval", "value_type": "int"},
|
"USB_POLLING_INTERVAL_MS": {"info_key": "usb.polling_interval", "value_type": "int"},
|
||||||
"USB_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"},
|
"USB_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"},
|
||||||
@ -248,6 +255,7 @@
|
|||||||
"PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str", "deprecated": true, "replace_with": "`keyboard_name` in info.json"},
|
"PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str", "deprecated": true, "replace_with": "`keyboard_name` in info.json"},
|
||||||
"PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.pid` in info.json"},
|
"PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.pid` in info.json"},
|
||||||
"VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.vid` in info.json"},
|
"VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.vid` in info.json"},
|
||||||
|
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "flag", "deprecated": true, "replace_with": "`host.default.nkro` in info.json"},
|
||||||
|
|
||||||
// Items we want flagged in lint
|
// Items we want flagged in lint
|
||||||
"VIAL_KEYBOARD_UID": {"info_key": "_invalid.vial_uid", "invalid": true},
|
"VIAL_KEYBOARD_UID": {"info_key": "_invalid.vial_uid", "invalid": true},
|
||||||
|
74
data/mappings/info_defaults.hjson
Normal file
74
data/mappings/info_defaults.hjson
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
{
|
||||||
|
"bootmagic": {
|
||||||
|
"matrix": [0, 0]
|
||||||
|
},
|
||||||
|
"backlight": {
|
||||||
|
"default": {
|
||||||
|
"on": true
|
||||||
|
},
|
||||||
|
"breathing_period": 6,
|
||||||
|
"levels": 3,
|
||||||
|
"on_state": 1
|
||||||
|
},
|
||||||
|
"debounce": 5,
|
||||||
|
"features": {
|
||||||
|
"command": false,
|
||||||
|
"console": false
|
||||||
|
},
|
||||||
|
"indicators": {
|
||||||
|
"on_state": 1
|
||||||
|
},
|
||||||
|
"led_matrix": {
|
||||||
|
"default": {
|
||||||
|
"animation": "solid",
|
||||||
|
"on": true,
|
||||||
|
"val": 255,
|
||||||
|
"speed": 128
|
||||||
|
},
|
||||||
|
"led_flush_limit": 16,
|
||||||
|
"max_brightness": 255,
|
||||||
|
"sleep": false,
|
||||||
|
"speed_steps": 16,
|
||||||
|
"val_steps": 16
|
||||||
|
},
|
||||||
|
"rgblight": {
|
||||||
|
"default": {
|
||||||
|
"animation": "static_light",
|
||||||
|
"on": true,
|
||||||
|
"hue": 0,
|
||||||
|
"sat": 255,
|
||||||
|
"val": 255,
|
||||||
|
"speed": 0
|
||||||
|
},
|
||||||
|
"brightness_steps": 17,
|
||||||
|
"hue_steps": 8,
|
||||||
|
"max_brightness": 255,
|
||||||
|
"saturation_steps": 17,
|
||||||
|
"sleep": false
|
||||||
|
},
|
||||||
|
"rgb_matrix": {
|
||||||
|
"default": {
|
||||||
|
"animation": "cycle_left_right",
|
||||||
|
"on": true,
|
||||||
|
"hue": 0,
|
||||||
|
"sat": 255,
|
||||||
|
"val": 255,
|
||||||
|
"speed": 128
|
||||||
|
},
|
||||||
|
"hue_steps": 8,
|
||||||
|
"led_flush_limit": 16,
|
||||||
|
"max_brightness": 255,
|
||||||
|
"sat_steps": 16,
|
||||||
|
"sleep": false,
|
||||||
|
"speed_steps": 16,
|
||||||
|
"val_steps": 16
|
||||||
|
},
|
||||||
|
"split": {
|
||||||
|
"serial": {
|
||||||
|
"driver": "bitbang"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ws2812": {
|
||||||
|
"driver": "bitbang"
|
||||||
|
}
|
||||||
|
}
|
@ -53,7 +53,8 @@
|
|||||||
"WS2812_DRIVER": {"info_key": "ws2812.driver"},
|
"WS2812_DRIVER": {"info_key": "ws2812.driver"},
|
||||||
|
|
||||||
// Items we want flagged in lint
|
// Items we want flagged in lint
|
||||||
"CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"},
|
"DEFAULT_FOLDER": {"info_key": "_deprecated.default_folder", "deprecated": true},
|
||||||
"CONVERT_TO_PROTON_C": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"},
|
"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}
|
"VIAL_ENABLE": {"info_key": "_invalid.vial", "invalid": true}
|
||||||
}
|
}
|
||||||
|
@ -140,9 +140,15 @@
|
|||||||
"custommk/genesis": {
|
"custommk/genesis": {
|
||||||
"target": "custommk/genesis/rev1"
|
"target": "custommk/genesis/rev1"
|
||||||
},
|
},
|
||||||
|
"cxt_studio":{
|
||||||
|
"target":"cxt_studio/12e4"
|
||||||
|
},
|
||||||
"daisy": {
|
"daisy": {
|
||||||
"target": "ktec/daisy"
|
"target": "ktec/daisy"
|
||||||
},
|
},
|
||||||
|
"deemen17/de60": {
|
||||||
|
"target": "deemen17/de60/r1"
|
||||||
|
},
|
||||||
"dp3000": {
|
"dp3000": {
|
||||||
"target": "dp3000/rev1"
|
"target": "dp3000/rev1"
|
||||||
},
|
},
|
||||||
@ -194,6 +200,9 @@
|
|||||||
"ergodone": {
|
"ergodone": {
|
||||||
"target": "ktec/ergodone"
|
"target": "ktec/ergodone"
|
||||||
},
|
},
|
||||||
|
"ergodox_stm32": {
|
||||||
|
"target": "handwired/ergodox_stm32"
|
||||||
|
},
|
||||||
"ergoinu": {
|
"ergoinu": {
|
||||||
"target": "dm9records/ergoinu"
|
"target": "dm9records/ergoinu"
|
||||||
},
|
},
|
||||||
@ -341,6 +350,9 @@
|
|||||||
"keycapsss/plaid_pad": {
|
"keycapsss/plaid_pad": {
|
||||||
"target": "keycapsss/plaid_pad/rev1"
|
"target": "keycapsss/plaid_pad/rev1"
|
||||||
},
|
},
|
||||||
|
"keyten/kt60hs_t": {
|
||||||
|
"target": "keyten/kt60hs_t/v1"
|
||||||
|
},
|
||||||
"kira75": {
|
"kira75": {
|
||||||
"target": "kira/kira75"
|
"target": "kira/kira75"
|
||||||
},
|
},
|
||||||
@ -575,6 +587,9 @@
|
|||||||
"ploopyco/trackball": {
|
"ploopyco/trackball": {
|
||||||
"target": "ploopyco/trackball/rev1_005"
|
"target": "ploopyco/trackball/rev1_005"
|
||||||
},
|
},
|
||||||
|
"plywrks/ply8x": {
|
||||||
|
"target": "plywrks/ply8x/solder"
|
||||||
|
},
|
||||||
"polilla": {
|
"polilla": {
|
||||||
"target": "polilla/rev1"
|
"target": "polilla/rev1"
|
||||||
},
|
},
|
||||||
@ -1027,7 +1042,7 @@
|
|||||||
"target": "kprepublic/bm68hsrgb/rev1"
|
"target": "kprepublic/bm68hsrgb/rev1"
|
||||||
},
|
},
|
||||||
"late9/rev1": {
|
"late9/rev1": {
|
||||||
"target": "rookiebwoy/late9/rev1"
|
"target": "ivndbt/late9/rev1"
|
||||||
},
|
},
|
||||||
"latin17rgb": {
|
"latin17rgb": {
|
||||||
"target": "latincompass/latin17rgb"
|
"target": "latincompass/latin17rgb"
|
||||||
@ -1192,7 +1207,7 @@
|
|||||||
"target": "spaceholdings/nebula68b"
|
"target": "spaceholdings/nebula68b"
|
||||||
},
|
},
|
||||||
"neopad/rev1": {
|
"neopad/rev1": {
|
||||||
"target": "rookiebwoy/neopad/rev1"
|
"target": "ivndbt/neopad/rev1"
|
||||||
},
|
},
|
||||||
"niu_mini": {
|
"niu_mini": {
|
||||||
"target": "kbdfans/niu_mini"
|
"target": "kbdfans/niu_mini"
|
||||||
@ -1365,6 +1380,12 @@
|
|||||||
"runner3680/5x8": {
|
"runner3680/5x8": {
|
||||||
"target": "omkbd/runner3680/5x8"
|
"target": "omkbd/runner3680/5x8"
|
||||||
},
|
},
|
||||||
|
"saevus/cor": {
|
||||||
|
"target": "concreteflowers/cor"
|
||||||
|
},
|
||||||
|
"saevus/cor_tkl": {
|
||||||
|
"target": "concreteflowers/cor_tkl"
|
||||||
|
},
|
||||||
"scarletbandana": {
|
"scarletbandana": {
|
||||||
"target": "woodkeys/scarletbandana"
|
"target": "woodkeys/scarletbandana"
|
||||||
},
|
},
|
||||||
@ -1509,6 +1530,9 @@
|
|||||||
"ymd96": {
|
"ymd96": {
|
||||||
"target": "ymdk/ymd96"
|
"target": "ymdk/ymd96"
|
||||||
},
|
},
|
||||||
|
"ymdk/id75": {
|
||||||
|
"target": "ymdk/id75/f103"
|
||||||
|
},
|
||||||
"ymdk_np21": {
|
"ymdk_np21": {
|
||||||
"target": "ymdk/np21"
|
"target": "ymdk/np21"
|
||||||
},
|
},
|
||||||
@ -1546,5 +1570,693 @@
|
|||||||
},
|
},
|
||||||
"dnworks/9973": {
|
"dnworks/9973": {
|
||||||
"target": "dnworks/tkl87"
|
"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": "ivndbt/late9/rev1"
|
||||||
|
},
|
||||||
|
"rookiebwoy/neopad": {
|
||||||
|
"target": "ivndbt/neopad/rev1"
|
||||||
|
},
|
||||||
|
"ivndbt/late9": {
|
||||||
|
"target": "ivndbt/late9/rev1"
|
||||||
|
},
|
||||||
|
"ivndbt/neopad": {
|
||||||
|
"target": "ivndbt/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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$id": "qmk.api.keyboard.v1",
|
"$id": "qmk.api.keyboard.v1",
|
||||||
"allOf": [
|
"allOf": [
|
||||||
{"$ref": "qmk.keyboard.v1"},
|
{"$ref": "./keyboard.jsonschema#"},
|
||||||
{
|
{
|
||||||
"properties": {
|
"properties": {
|
||||||
"keymaps": {
|
"keymaps": {
|
||||||
@ -10,8 +10,8 @@
|
|||||||
"url": {"type": "string"}
|
"url": {"type": "string"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"parse_errors": {"$ref": "qmk.definitions.v1#/string_array"},
|
"parse_errors": {"$ref": "./definitions.jsonschema#/string_array"},
|
||||||
"parse_warnings": {"$ref": "qmk.definitions.v1#/string_array"},
|
"parse_warnings": {"$ref": "./definitions.jsonschema#/string_array"},
|
||||||
"processor_type": {"type": "string"},
|
"processor_type": {"type": "string"},
|
||||||
"protocol": {"type": "string"},
|
"protocol": {"type": "string"},
|
||||||
"keyboard_folder": {"type": "string"},
|
"keyboard_folder": {"type": "string"},
|
||||||
|
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": "./definitions.jsonschema#/text_identifier"},
|
||||||
|
"maintainer": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||||
|
"license": {"type": "string"},
|
||||||
|
"url": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uri"
|
||||||
|
},
|
||||||
|
"keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"},
|
||||||
|
"features": {"$ref": "./keyboard.jsonschema#/definitions/features_config"}
|
||||||
|
}
|
||||||
|
}
|
@ -17,9 +17,9 @@
|
|||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"required": ["pin_a", "pin_b"],
|
"required": ["pin_a", "pin_b"],
|
||||||
"properties": {
|
"properties": {
|
||||||
"pin_a": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"pin_a": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"pin_b": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"pin_b": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"resolution": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -28,24 +28,29 @@
|
|||||||
"dip_switch_config": {
|
"dip_switch_config": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
|
"pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"features_config": {
|
||||||
|
"$ref": "./definitions.jsonschema#/boolean_array",
|
||||||
|
"propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
|
||||||
|
"not": {"required": ["lto"]}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"not": {"required": ["vendorId", "productId"]}, // reject via keys...
|
"not": {"required": ["vendorId", "productId"]}, // reject via keys...
|
||||||
"properties": {
|
"properties": {
|
||||||
"keyboard_name": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"keyboard_name": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||||
"keyboard_folder": {"$ref": "qmk.definitions.v1#/keyboard"},
|
"keyboard_folder": {"$ref": "./definitions.jsonschema#/keyboard"},
|
||||||
"maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"maintainer": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||||
"manufacturer": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"manufacturer": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||||
"url": {
|
"url": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "uri"
|
"format": "uri"
|
||||||
},
|
},
|
||||||
"development_board": {
|
"development_board": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["promicro", "elite_c", "elite_pi", "proton_c", "kb2040", "promicro_rp2040", "blok", "michi", "bit_c_pro", "stemcell", "bluepill", "blackpill_f401", "blackpill_f411", "bonsai_c4", "helios", "liatris", "imera"]
|
"enum": ["promicro", "elite_c", "elite_pi", "proton_c", "kb2040", "promicro_rp2040", "blok", "michi", "bit_c_pro", "stemcell", "bluepill", "blackpill_f401", "blackpill_f411", "bonsai_c4", "helios", "liatris", "imera", "svlinky"]
|
||||||
},
|
},
|
||||||
"pin_compatible": {
|
"pin_compatible": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
@ -79,6 +84,7 @@
|
|||||||
"STM32F407",
|
"STM32F407",
|
||||||
"STM32F411",
|
"STM32F411",
|
||||||
"STM32F446",
|
"STM32F446",
|
||||||
|
"STM32G0B1",
|
||||||
"STM32G431",
|
"STM32G431",
|
||||||
"STM32G474",
|
"STM32G474",
|
||||||
"STM32H723",
|
"STM32H723",
|
||||||
@ -92,6 +98,7 @@
|
|||||||
"GD32VF103",
|
"GD32VF103",
|
||||||
"WB32F3G71",
|
"WB32F3G71",
|
||||||
"WB32FQ95",
|
"WB32FQ95",
|
||||||
|
"AT32F415",
|
||||||
"atmega16u2",
|
"atmega16u2",
|
||||||
"atmega32u2",
|
"atmega32u2",
|
||||||
"atmega16u4",
|
"atmega16u4",
|
||||||
@ -112,8 +119,8 @@
|
|||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"data_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"data_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"clock_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"clock_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"default_brightness": {
|
"default_brightness": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"minimum": 0,
|
"minimum": 0,
|
||||||
@ -138,13 +145,13 @@
|
|||||||
"enum": ["dac_additive", "dac_basic", "pwm_software", "pwm_hardware"]
|
"enum": ["dac_additive", "dac_basic", "pwm_software", "pwm_hardware"]
|
||||||
},
|
},
|
||||||
"macro_beep": {"type": "boolean"},
|
"macro_beep": {"type": "boolean"},
|
||||||
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
"pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
|
||||||
"power_control": {
|
"power_control": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"on_state": {"$ref": "qmk.definitions.v1#/bit"},
|
"on_state": {"$ref": "./definitions.jsonschema#/bit"},
|
||||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}
|
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"voices": {"type": "boolean"}
|
"voices": {"type": "boolean"}
|
||||||
@ -164,20 +171,20 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"on": {"type": "boolean"},
|
"on": {"type": "boolean"},
|
||||||
"breathing": {"type": "boolean"},
|
"breathing": {"type": "boolean"},
|
||||||
"brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"breathing": {"type": "boolean"},
|
"breathing": {"type": "boolean"},
|
||||||
"breathing_period": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"breathing_period": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"levels": {
|
"levels": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"minimum": 1,
|
"minimum": 1,
|
||||||
"maximum": 31
|
"maximum": 31
|
||||||
},
|
},
|
||||||
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
"pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
|
||||||
"on_state": {"$ref": "qmk.definitions.v1#/bit"},
|
"on_state": {"$ref": "./definitions.jsonschema#/bit"},
|
||||||
"as_caps_lock": {"type": "boolean"}
|
"as_caps_lock": {"type": "boolean"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -216,6 +223,7 @@
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"enum": [
|
||||||
"apm32-dfu",
|
"apm32-dfu",
|
||||||
|
"at32-dfu",
|
||||||
"atmel-dfu",
|
"atmel-dfu",
|
||||||
"bootloadhid",
|
"bootloadhid",
|
||||||
"caterina",
|
"caterina",
|
||||||
@ -261,7 +269,7 @@
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["COL2ROW", "ROW2COL"]
|
"enum": ["COL2ROW", "ROW2COL"]
|
||||||
},
|
},
|
||||||
"debounce": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"debounce": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"caps_word": {
|
"caps_word": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
@ -269,20 +277,20 @@
|
|||||||
"enabled": {"type": "boolean"},
|
"enabled": {"type": "boolean"},
|
||||||
"both_shifts_turns_on": {"type": "boolean"},
|
"both_shifts_turns_on": {"type": "boolean"},
|
||||||
"double_tap_shift_turns_on": {"type": "boolean"},
|
"double_tap_shift_turns_on": {"type": "boolean"},
|
||||||
"idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"idle_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"invert_on_shift": {"type": "boolean"}
|
"invert_on_shift": {"type": "boolean"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"combo": {
|
"combo": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"count": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"count": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"term": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"term": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"community_layouts": {
|
"community_layouts": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {"$ref": "qmk.definitions.v1#/filename"}
|
"items": {"$ref": "./definitions.jsonschema#/filename"}
|
||||||
},
|
},
|
||||||
"dip_switch": {
|
"dip_switch": {
|
||||||
"$ref": "#/definitions/dip_switch_config",
|
"$ref": "#/definitions/dip_switch_config",
|
||||||
@ -312,10 +320,10 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"driver": {
|
"driver": {
|
||||||
"type": "string",
|
"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"},
|
"backing_size": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"logical_size": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"logical_size": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -326,20 +334,16 @@
|
|||||||
"enabled": {"type": "boolean"}
|
"enabled": {"type": "boolean"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"features": {
|
"features": { "$ref": "#/definitions/features_config" },
|
||||||
"$ref": "qmk.definitions.v1#/boolean_array",
|
|
||||||
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
|
|
||||||
"not": {"required": ["lto"]}
|
|
||||||
},
|
|
||||||
"indicators": {
|
"indicators": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"caps_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"caps_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"num_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"num_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"scroll_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"scroll_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"compose": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"compose": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"kana": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"kana": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"on_state": {"$ref": "qmk.definitions.v1#/bit"}
|
"on_state": {"$ref": "./definitions.jsonschema#/bit"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"joystick": {
|
"joystick": {
|
||||||
@ -347,20 +351,20 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"enabled": {"type": "boolean"},
|
"enabled": {"type": "boolean"},
|
||||||
"driver": {"type": "string"},
|
"driver": {"type": "string"},
|
||||||
"button_count": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"button_count": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"axis_resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"axis_resolution": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"axes": {
|
"axes": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"propertyNames": {"enum": ["x", "y", "z", "rx", "ry", "rz"]}
|
"propertyNames": {"enum": ["x", "y", "z", "rx", "ry", "rz"]},
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"oneOf": [
|
"oneOf": [
|
||||||
{
|
{
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"input_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"input_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"low": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"low": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"rest": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"rest": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"high": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"high": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -372,14 +376,20 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"},
|
"keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"},
|
||||||
|
"layer_lock": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
|
}
|
||||||
|
},
|
||||||
"layout_aliases": {
|
"layout_aliases": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": {"$ref": "qmk.definitions.v1#/layout_macro"}
|
"additionalProperties": {"$ref": "./definitions.jsonschema#/layout_macro"}
|
||||||
},
|
},
|
||||||
"layouts": {
|
"layouts": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"propertyNames": {"$ref": "qmk.definitions.v1#/layout_macro"},
|
"propertyNames": {"$ref": "./definitions.jsonschema#/layout_macro"},
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
@ -394,7 +404,7 @@
|
|||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"required": ["x", "y"],
|
"required": ["x", "y"],
|
||||||
"properties": {
|
"properties": {
|
||||||
"encoder": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"encoder": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"label": {
|
"label": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"pattern": "^[^\\n]*$"
|
"pattern": "^[^\\n]*$"
|
||||||
@ -408,13 +418,17 @@
|
|||||||
"minimum": 0
|
"minimum": 0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"r": {"$ref": "qmk.definitions.v1#/signed_decimal"},
|
"r": {"$ref": "./definitions.jsonschema#/signed_decimal"},
|
||||||
"rx": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
|
"rx": {"$ref": "./definitions.jsonschema#/unsigned_decimal"},
|
||||||
"ry": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
|
"ry": {"$ref": "./definitions.jsonschema#/unsigned_decimal"},
|
||||||
"h": {"$ref": "qmk.definitions.v1#/key_unit"},
|
"h": {"$ref": "./definitions.jsonschema#/key_unit"},
|
||||||
"w": {"$ref": "qmk.definitions.v1#/key_unit"},
|
"w": {"$ref": "./definitions.jsonschema#/key_unit"},
|
||||||
"x": {"$ref": "qmk.definitions.v1#/key_unit"},
|
"x": {"$ref": "./definitions.jsonschema#/key_unit"},
|
||||||
"y": {"$ref": "qmk.definitions.v1#/key_unit"}
|
"y": {"$ref": "./definitions.jsonschema#/key_unit"},
|
||||||
|
"hand": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["L", "R", "*"]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -430,12 +444,24 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"host": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"default": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"nkro": {"type": "boolean"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"leader_key": {
|
"leader_key": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"timing": {"type": "boolean"},
|
"timing": {"type": "boolean"},
|
||||||
"strict_processing": {"type": "boolean"},
|
"strict_processing": {"type": "boolean"},
|
||||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"matrix_pins": {
|
"matrix_pins": {
|
||||||
@ -445,32 +471,38 @@
|
|||||||
"custom": {"type": "boolean"},
|
"custom": {"type": "boolean"},
|
||||||
"custom_lite": {"type": "boolean"},
|
"custom_lite": {"type": "boolean"},
|
||||||
"ghost": {"type": "boolean"},
|
"ghost": {"type": "boolean"},
|
||||||
"input_pressed_state": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"input_pressed_state": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"io_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"io_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"direct": {
|
"direct": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
|
"items": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
|
||||||
},
|
},
|
||||||
"cols": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
"cols": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
|
||||||
"rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
|
"rows": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"modules": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mouse_key": {
|
"mouse_key": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"enabled": {"type": "boolean"},
|
"enabled": {"type": "boolean"},
|
||||||
"delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"delay": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"interval": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"max_speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"max_speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"time_to_max": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"time_to_max": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"wheel_delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"wheel_delay": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"oneshot": {
|
"oneshot": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"tap_toggle": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"tap_toggle": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"led_matrix": {
|
"led_matrix": {
|
||||||
@ -478,7 +510,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"animations": {
|
"animations": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
|
"propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
|
||||||
"additionalProperties": {"type": "boolean"}
|
"additionalProperties": {"type": "boolean"}
|
||||||
},
|
},
|
||||||
"default": {
|
"default": {
|
||||||
@ -487,8 +519,8 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"on": {"type": "boolean"},
|
"on": {"type": "boolean"},
|
||||||
"animation": {"type": "string"},
|
"animation": {"type": "string"},
|
||||||
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"driver": {
|
"driver": {
|
||||||
@ -514,27 +546,28 @@
|
|||||||
"type": "array",
|
"type": "array",
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"maxItems": 2,
|
"maxItems": 2,
|
||||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"items": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
},
|
},
|
||||||
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"val_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"speed_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"led_flush_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"led_flush_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"led_process_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"led_process_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"react_on_keyup": {"type": "boolean"},
|
"react_on_keyup": {"type": "boolean"},
|
||||||
"sleep": {"type": "boolean"},
|
"sleep": {"type": "boolean"},
|
||||||
"split_count": {
|
"split_count": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"maxItems": 2,
|
"maxItems": 2,
|
||||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
},
|
},
|
||||||
"layout": {
|
"layout": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
"required": ["x", "y"],
|
||||||
"properties": {
|
"properties": {
|
||||||
"matrix": {
|
"matrix": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
@ -545,9 +578,9 @@
|
|||||||
"minimum": 0
|
"minimum": 0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"x": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"y": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"y": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"flags": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -558,7 +591,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"animations": {
|
"animations": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
|
"propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
|
||||||
"additionalProperties": {"type": "boolean"}
|
"additionalProperties": {"type": "boolean"}
|
||||||
},
|
},
|
||||||
"default": {
|
"default": {
|
||||||
@ -567,10 +600,10 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"on": {"type": "boolean"},
|
"on": {"type": "boolean"},
|
||||||
"animation": {"type": "string"},
|
"animation": {"type": "string"},
|
||||||
"hue": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"hue": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"sat": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"sat": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"driver": {
|
"driver": {
|
||||||
@ -598,29 +631,30 @@
|
|||||||
"type": "array",
|
"type": "array",
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"maxItems": 2,
|
"maxItems": 2,
|
||||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"items": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
},
|
},
|
||||||
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"hue_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"hue_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"sat_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"sat_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"val_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"speed_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"led_flush_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"led_flush_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"led_process_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"led_process_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"react_on_keyup": {"type": "boolean"},
|
"react_on_keyup": {"type": "boolean"},
|
||||||
"sleep": {"type": "boolean"},
|
"sleep": {"type": "boolean"},
|
||||||
"split_count": {
|
"split_count": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"maxItems": 2,
|
"maxItems": 2,
|
||||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
},
|
},
|
||||||
"layout": {
|
"layout": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
"required": ["x", "y"],
|
||||||
"properties": {
|
"properties": {
|
||||||
"matrix": {
|
"matrix": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
@ -631,9 +665,9 @@
|
|||||||
"minimum": 0
|
"minimum": 0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"x": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"x": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"y": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"y": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"flags": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -645,27 +679,27 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"animations": {
|
"animations": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
|
"propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
|
||||||
"additionalProperties": {"type": "boolean"}
|
"additionalProperties": {"type": "boolean"}
|
||||||
},
|
},
|
||||||
"brightness_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"brightness_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"default": {
|
"default": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"on": {"type": "boolean"},
|
"on": {"type": "boolean"},
|
||||||
"animation": {"type": "string"},
|
"animation": {"type": "string"},
|
||||||
"hue": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"hue": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"sat": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"sat": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
"speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"driver": {
|
"driver": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["apa102", "custom", "ws2812"]
|
"enum": ["apa102", "custom", "ws2812"]
|
||||||
},
|
},
|
||||||
"hue_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"hue_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"layers": {
|
"layers": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
@ -680,29 +714,29 @@
|
|||||||
"override_rgb": {"type": "boolean"}
|
"override_rgb": {"type": "boolean"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"led_count": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"led_count": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"led_map": {
|
"led_map": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
},
|
},
|
||||||
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"pin": {
|
"pin": {
|
||||||
"$ref": "qmk.definitions.v1#/mcu_pin",
|
"$ref": "./definitions.jsonschema#/mcu_pin",
|
||||||
"$comment": "Deprecated: use ws2812.pin instead"
|
"$comment": "Deprecated: use ws2812.pin instead"
|
||||||
},
|
},
|
||||||
"rgbw": {
|
"rgbw": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"$comment": "Deprecated: use ws2812.rgbw instead"
|
"$comment": "Deprecated: use ws2812.rgbw instead"
|
||||||
},
|
},
|
||||||
"saturation_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"saturation_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"sleep": {"type": "boolean"},
|
"sleep": {"type": "boolean"},
|
||||||
"split": {"type": "boolean"},
|
"split": {"type": "boolean"},
|
||||||
"split_count": {
|
"split_count": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"maxItems": 2,
|
"maxItems": 2,
|
||||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -711,8 +745,8 @@
|
|||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"enabled": {"type": "boolean"},
|
"enabled": {"type": "boolean"},
|
||||||
"unlock_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"unlock_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"idle_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"unlock_sequence": {
|
"unlock_sequence": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"minItems": 1,
|
"minItems": 1,
|
||||||
@ -746,8 +780,8 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"enabled": {"type": "boolean"},
|
"enabled": {"type": "boolean"},
|
||||||
"mouse_enabled": {"type": "boolean"},
|
"mouse_enabled": {"type": "boolean"},
|
||||||
"clock_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"clock_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"data_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"data_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"driver": {
|
"driver": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["busywait", "interrupt", "usart", "vendor"]
|
"enum": ["busywait", "interrupt", "usart", "vendor"]
|
||||||
@ -784,11 +818,11 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"direct": {
|
"direct": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
|
"items": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
|
||||||
},
|
},
|
||||||
"cols": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
"cols": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
|
||||||
"rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
"rows": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
|
||||||
"unused": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
|
"unused": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -815,16 +849,16 @@
|
|||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"matrix_grid": {
|
"matrix_grid": {
|
||||||
"$ref": "qmk.definitions.v1#/mcu_pin_array",
|
"$ref": "./definitions.jsonschema#/mcu_pin_array",
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"maxItems": 2
|
"maxItems": 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"soft_serial_pin": {
|
"soft_serial_pin": {
|
||||||
"$ref": "qmk.definitions.v1#/mcu_pin",
|
"$ref": "./definitions.jsonschema#/mcu_pin",
|
||||||
"$comment": "Deprecated: use split.serial.pin instead"
|
"$comment": "Deprecated: use split.serial.pin instead"
|
||||||
},
|
},
|
||||||
"soft_serial_speed": {
|
"soft_serial_speed": {
|
||||||
@ -840,7 +874,7 @@
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["bitbang", "usart", "vendor"]
|
"enum": ["bitbang", "usart", "vendor"]
|
||||||
},
|
},
|
||||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}
|
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"transport": {
|
"transport": {
|
||||||
@ -868,7 +902,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"watchdog": {"type": "boolean"},
|
"watchdog": {"type": "boolean"},
|
||||||
"watchdog_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"watchdog_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"sync_matrix_state": {
|
"sync_matrix_state": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"$comment": "Deprecated: use sync.matrix_state instead"
|
"$comment": "Deprecated: use sync.matrix_state instead"
|
||||||
@ -884,8 +918,8 @@
|
|||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"enabled": {"type": "boolean"},
|
"enabled": {"type": "boolean"},
|
||||||
"polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"polling_interval": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"main": {
|
"main": {
|
||||||
@ -895,7 +929,7 @@
|
|||||||
},
|
},
|
||||||
"matrix_grid": {
|
"matrix_grid": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"items": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"$comment": "Deprecated: use split.handedness.matrix_grid instead"
|
"$comment": "Deprecated: use split.handedness.matrix_grid instead"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -907,6 +941,7 @@
|
|||||||
"tapping": {
|
"tapping": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
"chordal_hold": {"type": "boolean"},
|
||||||
"force_hold": {"type": "boolean"},
|
"force_hold": {"type": "boolean"},
|
||||||
"force_hold_per_key": {"type": "boolean"},
|
"force_hold_per_key": {"type": "boolean"},
|
||||||
"ignore_mod_tap_interrupt": {"type": "boolean"},
|
"ignore_mod_tap_interrupt": {"type": "boolean"},
|
||||||
@ -916,9 +951,9 @@
|
|||||||
"permissive_hold_per_key": {"type": "boolean"},
|
"permissive_hold_per_key": {"type": "boolean"},
|
||||||
"retro": {"type": "boolean"},
|
"retro": {"type": "boolean"},
|
||||||
"retro_per_key": {"type": "boolean"},
|
"retro_per_key": {"type": "boolean"},
|
||||||
"term": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"term": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"term_per_key": {"type": "boolean"},
|
"term_per_key": {"type": "boolean"},
|
||||||
"toggle": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"toggle": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"usb": {
|
"usb": {
|
||||||
@ -926,16 +961,20 @@
|
|||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"device_ver": {
|
"device_ver": {
|
||||||
"$ref": "qmk.definitions.v1#/hex_number_4d",
|
"$ref": "./definitions.jsonschema#/hex_number_4d",
|
||||||
"$comment": "Deprecated: use device_version instead"
|
"$comment": "Deprecated: use device_version instead"
|
||||||
},
|
},
|
||||||
"device_version": {"$ref": "qmk.definitions.v1#/bcd_version"},
|
"device_version": {"$ref": "./definitions.jsonschema#/bcd_version"},
|
||||||
"force_nkro": {"type": "boolean"},
|
"force_nkro": {
|
||||||
"pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
|
"type": "boolean",
|
||||||
"vid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
|
"$comment": "Deprecated: use host.default.nkro instead"
|
||||||
"max_power": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
|
||||||
|
},
|
||||||
|
"pid": {"$ref": "./definitions.jsonschema#/hex_number_4d"},
|
||||||
|
"vid": {"$ref": "./definitions.jsonschema#/hex_number_4d"},
|
||||||
|
"max_power": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"no_startup_check": {"type": "boolean"},
|
"no_startup_check": {"type": "boolean"},
|
||||||
"polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"polling_interval": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"shared_endpoint": {
|
"shared_endpoint": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
@ -944,7 +983,7 @@
|
|||||||
"mouse": {"type": "boolean"}
|
"mouse": {"type": "boolean"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"suspend_wakeup_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"suspend_wakeup_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"wait_for_enumeration": {"type": "boolean"}
|
"wait_for_enumeration": {"type": "boolean"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -952,9 +991,9 @@
|
|||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"keys_per_scan": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"keys_per_scan": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||||
"tap_keycode_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"tap_keycode_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"tap_capslock_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"tap_capslock_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||||
"locking": {
|
"locking": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
@ -969,10 +1008,10 @@
|
|||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"esc_output": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"esc_output": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"esc_input": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"esc_input": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"led": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"led": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"speaker": {"$ref": "qmk.definitions.v1#/mcu_pin"}
|
"speaker": {"$ref": "./definitions.jsonschema#/mcu_pin"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ws2812": {
|
"ws2812": {
|
||||||
@ -983,10 +1022,10 @@
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["bitbang", "custom", "i2c", "pwm", "spi", "vendor"]
|
"enum": ["bitbang", "custom", "i2c", "pwm", "spi", "vendor"]
|
||||||
},
|
},
|
||||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||||
"rgbw": {"type": "boolean"},
|
"rgbw": {"type": "boolean"},
|
||||||
"i2c_address": {"$ref": "qmk.definitions.v1#/hex_number_2d"},
|
"i2c_address": {"$ref": "./definitions.jsonschema#/hex_number_2d"},
|
||||||
"i2c_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"i2c_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,10 +30,10 @@
|
|||||||
"keycodes": {
|
"keycodes": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"propertyNames": {
|
"propertyNames": {
|
||||||
"$ref": "qmk.definitions.v1#/hex_number_4d"
|
"$ref": "./definitions.jsonschema#/hex_number_4d"
|
||||||
},
|
},
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"type": "object", // use 'qmk.definitions.v1#/keycode_decl' when problem keycodes are removed
|
"type": "object", // use './definitions.jsonschema#/keycode_decl' when problem keycodes are removed
|
||||||
"required": [
|
"required": [
|
||||||
"key"
|
"key"
|
||||||
],
|
],
|
||||||
|
@ -10,10 +10,10 @@
|
|||||||
"minLength": 1,
|
"minLength": 1,
|
||||||
"pattern": "^[a-z][0-9a-z_]*$"
|
"pattern": "^[a-z][0-9a-z_]*$"
|
||||||
},
|
},
|
||||||
"host_language": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"host_language": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||||
"keyboard": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"keyboard": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||||
"keymap": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"keymap": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||||
"layout": {"$ref": "qmk.definitions.v1#/layout_macro"},
|
"layout": {"$ref": "./definitions.jsonschema#/layout_macro"},
|
||||||
"layers": {
|
"layers": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
@ -55,11 +55,11 @@
|
|||||||
"keycodes": {
|
"keycodes": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"$ref": "qmk.definitions.v1#/text_identifier"
|
"$ref": "./definitions.jsonschema#/text_identifier"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"duration": {
|
"duration": {
|
||||||
"$ref": "qmk.definitions.v1#/unsigned_int"
|
"$ref": "./definitions.jsonschema#/unsigned_int"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -67,15 +67,16 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"},
|
"keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"},
|
||||||
"config": {"$ref": "qmk.keyboard.v1"},
|
"config": {"$ref": "./keyboard.jsonschema#"},
|
||||||
"notes": {
|
"notes": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"required": [
|
"modules": {
|
||||||
"keyboard",
|
"type": "array",
|
||||||
"layout",
|
"items": {
|
||||||
"layers"
|
"type": "string"
|
||||||
]
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"userspace_version": {
|
"userspace_version": {
|
||||||
"type": "string",
|
"type": "string"
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,10 +6,10 @@
|
|||||||
"definitions": {
|
"definitions": {
|
||||||
"build_target": {
|
"build_target": {
|
||||||
"oneOf": [
|
"oneOf": [
|
||||||
{"$ref": "qmk.definitions.v1#/keyboard_keymap_tuple"},
|
{"$ref": "./definitions.jsonschema#/keyboard_keymap_tuple"},
|
||||||
{"$ref": "qmk.definitions.v1#/json_file_path"}
|
{"$ref": "./definitions.jsonschema#/json_file_path"}
|
||||||
]
|
]
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": [
|
||||||
"userspace_version",
|
"userspace_version",
|
||||||
|
@ -6,11 +6,11 @@
|
|||||||
"definitions": {
|
"definitions": {
|
||||||
"build_target": {
|
"build_target": {
|
||||||
"oneOf": [
|
"oneOf": [
|
||||||
{"$ref": "qmk.definitions.v1#/keyboard_keymap_tuple"},
|
{"$ref": "./definitions.jsonschema#/keyboard_keymap_tuple"},
|
||||||
{"$ref": "qmk.definitions.v1#/keyboard_keymap_env"},
|
{"$ref": "./definitions.jsonschema#/keyboard_keymap_env"},
|
||||||
{"$ref": "qmk.definitions.v1#/json_file_path"}
|
{"$ref": "./definitions.jsonschema#/json_file_path"}
|
||||||
]
|
]
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": [
|
||||||
"userspace_version",
|
"userspace_version",
|
||||||
|
@ -14,8 +14,6 @@
|
|||||||
},
|
},
|
||||||
"features": {
|
"features": {
|
||||||
"bootmagic": true,
|
"bootmagic": true,
|
||||||
"command": false,
|
|
||||||
"console": false,
|
|
||||||
"extrakey": true,
|
"extrakey": true,
|
||||||
"mousekey": true,
|
"mousekey": true,
|
||||||
"nkro": 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))
|
299
docs/ChangeLog/20250525.md
Normal file
299
docs/ChangeLog/20250525.md
Normal file
@ -0,0 +1,299 @@
|
|||||||
|
# QMK Breaking Changes - 2025 May 25 Changelog
|
||||||
|
|
||||||
|
## Notable Features
|
||||||
|
|
||||||
|
### Flow Tap ([#25125](https://github.com/qmk/qmk_firmware/pull/25125))
|
||||||
|
|
||||||
|
Adds Flow Tap as a core tap-hold option to disable HRMs during fast typing, aka Global Quick Tap, Require Prior Idle.
|
||||||
|
|
||||||
|
Flow Tap modifies mod-tap MT and layer-tap LT keys such that when pressed within a short timeout of the preceding key, the tapping behavior is triggered. It basically disables the hold behavior during fast typing, creating a "flow of taps." It also helps to reduce the input lag of tap-hold keys during fast typing, since the tapped behavior is sent immediately.
|
||||||
|
|
||||||
|
See the [Flow Tap documentation](../tap_hold#flow-tap) for more information.
|
||||||
|
|
||||||
|
### Community Modules `1.1.1` ([#25050](https://github.com/qmk/qmk_firmware/pull/25050), [#25187](https://github.com/qmk/qmk_firmware/pull/25187))
|
||||||
|
|
||||||
|
Version `1.1.1` introduces support for module defined RGB matrix effects and indicator callbacks, as well as pointing and layer state callbacks.
|
||||||
|
|
||||||
|
See the [Community Modules documentation](../features/community_modules) for more information, including the full list of available hooks.
|
||||||
|
|
||||||
|
## Changes Requiring User Action
|
||||||
|
|
||||||
|
### Updated Keyboard Codebases
|
||||||
|
|
||||||
|
| Old Keyboard Name | New Keyboard Name |
|
||||||
|
|------------------------|----------------------|
|
||||||
|
| chew | chew/split |
|
||||||
|
| deemen17/de60fs | deemen17/de60/r1 |
|
||||||
|
| keyten/kt60hs_t | keyten/kt60hs_t/v1 |
|
||||||
|
| plywrks/ply8x | plywrks/ply8x/solder |
|
||||||
|
| rookiebwoy/late9/rev1 | ivndbt/late9/rev1 |
|
||||||
|
| rookiebwoy/neopad/rev1 | ivndbt/neopad/rev1 |
|
||||||
|
|
||||||
|
## Deprecation Notices
|
||||||
|
|
||||||
|
In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here.
|
||||||
|
|
||||||
|
### Deprecation of `qmk generate-compilation-database` ([#25237](https://github.com/qmk/qmk_firmware/pull/25237))
|
||||||
|
|
||||||
|
This command has been deprecated as it cannot take into account configurables such as [converters](/feature_converters) or environment variables normally specified on the command line; please use the `--compiledb` flag with `qmk compile` instead.
|
||||||
|
|
||||||
|
### Deprecation of `usb.force_nkro`/`FORCE_NKRO` ([#25262](https://github.com/qmk/qmk_firmware/pull/25262))
|
||||||
|
|
||||||
|
Unpicking the assumption that only USB can do NKRO, forcing of NKRO on every boot has been deprecated. As this setting persists, it produces unnecessary user confusion when the various NKRO keycodes (for example `NK_TOGG`) do not behave as expected.
|
||||||
|
|
||||||
|
The new defaults can be configured in the following ways:
|
||||||
|
|
||||||
|
:::::tabs
|
||||||
|
|
||||||
|
==== keyboard.json
|
||||||
|
|
||||||
|
```json [keyboard.json]
|
||||||
|
{
|
||||||
|
"host": { // [!code focus]
|
||||||
|
"default": { // [!code focus]
|
||||||
|
"nkro": true // [!code focus]
|
||||||
|
} // [!code focus]
|
||||||
|
} // [!code focus]
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
==== keymap.json
|
||||||
|
|
||||||
|
```json [keymap.json]
|
||||||
|
{
|
||||||
|
"config": {
|
||||||
|
"host": { // [!code focus]
|
||||||
|
"default": { // [!code focus]
|
||||||
|
"nkro": true // [!code focus]
|
||||||
|
} // [!code focus]
|
||||||
|
} // [!code focus]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
==== config.h
|
||||||
|
|
||||||
|
```c [config.h]
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define NKRO_DEFAULT_ON true // [!code focus]
|
||||||
|
```
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||
|
The deprecated options will be removed in a future breaking changes cycle.
|
||||||
|
|
||||||
|
### `CTPC`/`CONVERT_TO_PROTON_C` removal ([#25111](https://github.com/qmk/qmk_firmware/pull/25111))
|
||||||
|
|
||||||
|
Deprecated build options `CTPC` and `CONVERT_TO_PROTON_C` have been removed. Users should of these should migrate to `CONVERT_TO=proton_c`.
|
||||||
|
|
||||||
|
see the [Converters Feature](../feature_converters) documentation for more information.
|
||||||
|
|
||||||
|
### `DEFAULT_FOLDER` removal ([#23281](https://github.com/qmk/qmk_firmware/pull/23281))
|
||||||
|
|
||||||
|
`DEFAULT_FOLDER` was originally introduced to work around limitations within the build system.
|
||||||
|
Parent folders containing common configuration would create invalid build targets.
|
||||||
|
|
||||||
|
With the introduction of [`keyboard.json`](./20240526#keyboard-json) as a configuration file, the build system now has a consistent method to detect build targets.
|
||||||
|
The `DEFAULT_FOLDER` functionality is now redundant and the intent is for `rules.mk` to become pure configuration.
|
||||||
|
|
||||||
|
Backwards compatibility of build targets has been maintained where possible.
|
||||||
|
|
||||||
|
### Converter `Pin Compatible` updates ([#20330](https://github.com/qmk/qmk_firmware/pull/20330))
|
||||||
|
|
||||||
|
Converter support will be further limited to only function if a keyboard declares that is is compatible.
|
||||||
|
|
||||||
|
This can be configured in the following ways:
|
||||||
|
|
||||||
|
:::::tabs
|
||||||
|
|
||||||
|
==== keyboard.json
|
||||||
|
|
||||||
|
```json [keyboard.json]
|
||||||
|
{
|
||||||
|
"development_board": "promicro", // [!code focus]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
==== rules.mk
|
||||||
|
|
||||||
|
```make [rules.mk]
|
||||||
|
PIN_COMPATIBLE = promicro
|
||||||
|
```
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||
|
see the [Converters Feature](../feature_converters) documentation for more information.
|
||||||
|
|
||||||
|
### Deprecation of `encoder_update_{kb|user}`
|
||||||
|
|
||||||
|
These callbacks are now considered end-of-life and will be removed over the next breaking changes cycle, ending August 2025. PRs containing these callbacks will be asked to change to use [encoder mapping](/features/encoders#encoder-map).
|
||||||
|
|
||||||
|
`ENCODER_MAP_ENABLE` will subsequently be changed to "default-on" when encoders are enabled, and future breaking changes cycles will remove this flag entirely.
|
||||||
|
|
||||||
|
To migrate usage of `encoder_update_user` to encoder map you'll need to handle all of the following changes in your `keymap.c`:
|
||||||
|
|
||||||
|
:::::tabs
|
||||||
|
|
||||||
|
=== 1. Add keycode definitions
|
||||||
|
|
||||||
|
Define new keycodes:
|
||||||
|
|
||||||
|
```c
|
||||||
|
enum {
|
||||||
|
MY_ENCODER_LEFT = QK_USER, // [!code focus]
|
||||||
|
MY_ENCODER_RIGHT, // [!code focus]
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
=== 2. Add encoder mapping
|
||||||
|
|
||||||
|
Add the keycodes to a new encoder map (optionally with transparent layers above, if you want identical functionality of layer-independence):
|
||||||
|
|
||||||
|
```c
|
||||||
|
#if defined(ENCODER_MAP_ENABLE)
|
||||||
|
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
|
||||||
|
[0] = { ENCODER_CCW_CW(MY_ENCODER_LEFT, MY_ENCODER_RIGHT) }, // [!code focus]
|
||||||
|
[1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus]
|
||||||
|
[2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus]
|
||||||
|
[3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus]
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
```
|
||||||
|
|
||||||
|
=== 3. Add keycode processing
|
||||||
|
|
||||||
|
Handle the new keycodes within `process_record_user`, much like any other keycode in your keymap:
|
||||||
|
|
||||||
|
```c
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
switch (keycode) {
|
||||||
|
case MY_ENCODER_LEFT: // [!code focus]
|
||||||
|
if (record->event.pressed) { // [!code focus]
|
||||||
|
// Add the same code you had in your `encoder_update_user` for the left-rotation code // [!code focus]
|
||||||
|
} // [!code focus]
|
||||||
|
return false; // Skip all further processing of this keycode // [!code focus]
|
||||||
|
case MY_ENCODER_RIGHT: // [!code focus]
|
||||||
|
if (record->event.pressed) { // [!code focus]
|
||||||
|
// Add the same code you had in your `encoder_update_user` for the right-rotation code // [!code focus]
|
||||||
|
} // [!code focus]
|
||||||
|
return false; // Skip all further processing of this keycode // [!code focus]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
=== 4. Remove old code
|
||||||
|
|
||||||
|
Remove your implementation of `encoder_update_user` from your `keymap.c`.
|
||||||
|
|
||||||
|
::::::
|
||||||
|
|
||||||
|
If your board has multiple encoders, each encoder will need its own pair of keycodes defined as per above.
|
||||||
|
|
||||||
|
## Full changelist
|
||||||
|
|
||||||
|
Core:
|
||||||
|
* Non-volatile memory data repository pattern ([#24356](https://github.com/qmk/qmk_firmware/pull/24356))
|
||||||
|
* High resolution scrolling (without feature report parsing) ([#24423](https://github.com/qmk/qmk_firmware/pull/24423))
|
||||||
|
* Implement battery level interface ([#24666](https://github.com/qmk/qmk_firmware/pull/24666))
|
||||||
|
* get_keycode_string(): function to format keycodes as strings, for more readable debug logging. ([#24787](https://github.com/qmk/qmk_firmware/pull/24787))
|
||||||
|
* [Cleanup] Handling of optional `*.mk` files ([#24952](https://github.com/qmk/qmk_firmware/pull/24952))
|
||||||
|
* Add EOL to non-keyboard files ([#24990](https://github.com/qmk/qmk_firmware/pull/24990))
|
||||||
|
* use `keycode_string` in unit tests ([#25042](https://github.com/qmk/qmk_firmware/pull/25042))
|
||||||
|
* Add additional hooks for Community modules ([#25050](https://github.com/qmk/qmk_firmware/pull/25050))
|
||||||
|
* Remove `CTPC`/`CONVERT_TO_PROTON_C` options ([#25111](https://github.com/qmk/qmk_firmware/pull/25111))
|
||||||
|
* Flow Tap tap-hold option to disable HRMs during fast typing (aka Global Quick Tap, Require Prior Idle). ([#25125](https://github.com/qmk/qmk_firmware/pull/25125))
|
||||||
|
* Remove `bluefruit_le_read_battery_voltage` function ([#25129](https://github.com/qmk/qmk_firmware/pull/25129))
|
||||||
|
* Avoid duplication in generated community modules `rules.mk` ([#25135](https://github.com/qmk/qmk_firmware/pull/25135))
|
||||||
|
* [chore]: move and rename mouse/scroll min/max defines ([#25141](https://github.com/qmk/qmk_firmware/pull/25141))
|
||||||
|
* Ignore the Layer Lock key in Repeat Key and Caps Word. ([#25171](https://github.com/qmk/qmk_firmware/pull/25171))
|
||||||
|
* Allow for disabling EEPROM subsystem entirely. ([#25173](https://github.com/qmk/qmk_firmware/pull/25173))
|
||||||
|
* Implement connection keycode logic ([#25176](https://github.com/qmk/qmk_firmware/pull/25176))
|
||||||
|
* Align ChibiOS `USB_WAIT_FOR_ENUMERATION` implementation ([#25184](https://github.com/qmk/qmk_firmware/pull/25184))
|
||||||
|
* Enable community modules to define LED matrix and RGB matrix effects. ([#25187](https://github.com/qmk/qmk_firmware/pull/25187))
|
||||||
|
* Bind Bluetooth driver to `host_driver_t` ([#25199](https://github.com/qmk/qmk_firmware/pull/25199))
|
||||||
|
* Enhance Flow Tap to work better for rolls over multiple tap-hold keys. ([#25200](https://github.com/qmk/qmk_firmware/pull/25200))
|
||||||
|
* Remove force disable of NKRO when Bluetooth enabled ([#25201](https://github.com/qmk/qmk_firmware/pull/25201))
|
||||||
|
* [New Feature/Core] New RGB Matrix Animation "Starlight Smooth" ([#25203](https://github.com/qmk/qmk_firmware/pull/25203))
|
||||||
|
* Add battery changed callbacks ([#25207](https://github.com/qmk/qmk_firmware/pull/25207))
|
||||||
|
* Generate versions to keycode headers ([#25219](https://github.com/qmk/qmk_firmware/pull/25219))
|
||||||
|
* Add raw_hid support to host driver ([#25255](https://github.com/qmk/qmk_firmware/pull/25255))
|
||||||
|
* Deprecate `usb.force_nkro`/`FORCE_NKRO` ([#25262](https://github.com/qmk/qmk_firmware/pull/25262))
|
||||||
|
* [Chore] use {rgblight,rgb_matrix}_hsv_to_rgb overrides ([#25271](https://github.com/qmk/qmk_firmware/pull/25271))
|
||||||
|
* Remove outdated `nix` support due to bit-rot. ([#25280](https://github.com/qmk/qmk_firmware/pull/25280))
|
||||||
|
|
||||||
|
CLI:
|
||||||
|
* Align to latest CLI dependencies ([#24553](https://github.com/qmk/qmk_firmware/pull/24553))
|
||||||
|
* Exclude external userspace from lint checking ([#24680](https://github.com/qmk/qmk_firmware/pull/24680))
|
||||||
|
* [Modules] Provide access to current path in `rules.mk`. ([#25061](https://github.com/qmk/qmk_firmware/pull/25061))
|
||||||
|
* Add "license" field to Community Module JSON schema. ([#25085](https://github.com/qmk/qmk_firmware/pull/25085))
|
||||||
|
* Prompt for converter when creating new keymap ([#25116](https://github.com/qmk/qmk_firmware/pull/25116))
|
||||||
|
* Extend lint checks to reject duplication of defaults ([#25149](https://github.com/qmk/qmk_firmware/pull/25149))
|
||||||
|
* Add lint warning for empty url ([#25182](https://github.com/qmk/qmk_firmware/pull/25182))
|
||||||
|
* Deprecate `qmk generate-compilation-database`. ([#25237](https://github.com/qmk/qmk_firmware/pull/25237))
|
||||||
|
* Use relative paths for schemas, instead of $id. Enables VScode validation. ([#25251](https://github.com/qmk/qmk_firmware/pull/25251))
|
||||||
|
|
||||||
|
Submodule updates:
|
||||||
|
* STM32G0x1 support ([#24301](https://github.com/qmk/qmk_firmware/pull/24301))
|
||||||
|
* Update develop branch to Pico SDK 1.5.1 ([#25178](https://github.com/qmk/qmk_firmware/pull/25178))
|
||||||
|
* Add `compiler_support.h` ([#25274](https://github.com/qmk/qmk_firmware/pull/25274))
|
||||||
|
|
||||||
|
Keyboards:
|
||||||
|
* add 75_(ansi|iso) Community Layouts to mechlovin/olly/octagon ([#22459](https://github.com/qmk/qmk_firmware/pull/22459))
|
||||||
|
* Add the plywrks ply8x hotswap variant. ([#23558](https://github.com/qmk/qmk_firmware/pull/23558))
|
||||||
|
* Add Community Layout support to daskeyboard4 ([#23884](https://github.com/qmk/qmk_firmware/pull/23884))
|
||||||
|
* New standard layout for Savage65 (65_ansi_blocker_tsangan_split_bs) ([#24690](https://github.com/qmk/qmk_firmware/pull/24690))
|
||||||
|
* Add Icebreaker keyboard ([#24723](https://github.com/qmk/qmk_firmware/pull/24723))
|
||||||
|
* Update Tractyl Manuform and add F405 (weact) variant ([#24764](https://github.com/qmk/qmk_firmware/pull/24764))
|
||||||
|
* Chew folders ([#24785](https://github.com/qmk/qmk_firmware/pull/24785))
|
||||||
|
* modelh: add prerequisites for via support ([#24932](https://github.com/qmk/qmk_firmware/pull/24932))
|
||||||
|
* Only configure `STM32_HSECLK` within `board.h` ([#25001](https://github.com/qmk/qmk_firmware/pull/25001))
|
||||||
|
* Allow LVGL onekey keymap to be able compile for other board ([#25005](https://github.com/qmk/qmk_firmware/pull/25005))
|
||||||
|
* Remove Sofle `rgb_default` keymap & tidy readme's ([#25010](https://github.com/qmk/qmk_firmware/pull/25010))
|
||||||
|
* Migrate remaining `split.soft_serial_pin` to `split.serial.pin` ([#25046](https://github.com/qmk/qmk_firmware/pull/25046))
|
||||||
|
* Update keymap for keycult 1800 ([#25070](https://github.com/qmk/qmk_firmware/pull/25070))
|
||||||
|
* Add kt60HS-T v2 PCB ([#25080](https://github.com/qmk/qmk_firmware/pull/25080))
|
||||||
|
* Refactor Deemen17 Works DE60 ([#25088](https://github.com/qmk/qmk_firmware/pull/25088))
|
||||||
|
* Rookiebwoy to ivndbt ([#25142](https://github.com/qmk/qmk_firmware/pull/25142))
|
||||||
|
* Remove duplication of RGB Matrix defaults ([#25146](https://github.com/qmk/qmk_firmware/pull/25146))
|
||||||
|
* ymdk/id75/rp2040 ([#25157](https://github.com/qmk/qmk_firmware/pull/25157))
|
||||||
|
* Remove duplication of RGBLight defaults ([#25169](https://github.com/qmk/qmk_firmware/pull/25169))
|
||||||
|
* Remove empty `url` fields ([#25181](https://github.com/qmk/qmk_firmware/pull/25181))
|
||||||
|
* Remove more duplication of defaults ([#25189](https://github.com/qmk/qmk_firmware/pull/25189))
|
||||||
|
* Remove `"console":false` from keyboards ([#25190](https://github.com/qmk/qmk_firmware/pull/25190))
|
||||||
|
* Remove `"command":false` from keyboards ([#25193](https://github.com/qmk/qmk_firmware/pull/25193))
|
||||||
|
* Remove redundant keyboard headers ([#25208](https://github.com/qmk/qmk_firmware/pull/25208))
|
||||||
|
* Add debounce to duplicated defaults check ([#25246](https://github.com/qmk/qmk_firmware/pull/25246))
|
||||||
|
* Remove duplicate of SPI default config from keyboards ([#25266](https://github.com/qmk/qmk_firmware/pull/25266))
|
||||||
|
* Resolve miscellaneous keyboard lint warnings ([#25268](https://github.com/qmk/qmk_firmware/pull/25268))
|
||||||
|
* Configure boards to use development_board - 0-9 ([#25287](https://github.com/qmk/qmk_firmware/pull/25287))
|
||||||
|
* Configure boards to use development_board - UVWXYZ ([#25288](https://github.com/qmk/qmk_firmware/pull/25288))
|
||||||
|
* Configure boards to use development_board - S ([#25293](https://github.com/qmk/qmk_firmware/pull/25293))
|
||||||
|
* Configure boards to use development_board - T ([#25294](https://github.com/qmk/qmk_firmware/pull/25294))
|
||||||
|
|
||||||
|
Keyboard fixes:
|
||||||
|
* Fix `boardsource/beiwagon` RGB Matrix coordinates ([#25018](https://github.com/qmk/qmk_firmware/pull/25018))
|
||||||
|
* amptrics/0422 - Prevent OOB in `update_leds_for_layer` ([#25209](https://github.com/qmk/qmk_firmware/pull/25209))
|
||||||
|
* salicylic_acid3/getta25 - Fix oled keymap ([#25295](https://github.com/qmk/qmk_firmware/pull/25295))
|
||||||
|
|
||||||
|
Others:
|
||||||
|
* Require 'x'/'y' properties for LED/RGB Matrix layout ([#24997](https://github.com/qmk/qmk_firmware/pull/24997))
|
||||||
|
* Align `new-keyboard` template to current standards ([#25191](https://github.com/qmk/qmk_firmware/pull/25191))
|
||||||
|
|
||||||
|
Bugs:
|
||||||
|
* Fix OS_DETECTION_KEYBOARD_RESET ([#25015](https://github.com/qmk/qmk_firmware/pull/25015))
|
||||||
|
* Fix outdated GPIO control function usage ([#25060](https://github.com/qmk/qmk_firmware/pull/25060))
|
||||||
|
* Cater for use of `__errno_r()` in ChibiOS syscalls.c with newer picolibc revisions ([#25121](https://github.com/qmk/qmk_firmware/pull/25121))
|
||||||
|
* Fixup eeconfig lighting reset. ([#25166](https://github.com/qmk/qmk_firmware/pull/25166))
|
||||||
|
* Fix for Flow Tap: fix handling of distinct taps and timer updates. ([#25175](https://github.com/qmk/qmk_firmware/pull/25175))
|
||||||
|
* Minimise force-included files ([#25194](https://github.com/qmk/qmk_firmware/pull/25194))
|
||||||
|
* Ensure `qmk_userspace_paths` maintains detected order ([#25204](https://github.com/qmk/qmk_firmware/pull/25204))
|
||||||
|
* Resolve alias for `qmk new-keymap` keyboard prompts ([#25210](https://github.com/qmk/qmk_firmware/pull/25210))
|
||||||
|
* gcc15 AVR compilation fixes ([#25238](https://github.com/qmk/qmk_firmware/pull/25238))
|
||||||
|
* Fix typos introduced by PR #25050 ([#25250](https://github.com/qmk/qmk_firmware/pull/25250))
|
||||||
|
* Fix Wear Leveling compilation ([#25254](https://github.com/qmk/qmk_firmware/pull/25254))
|
||||||
|
* Remove more USB only branches from NKRO handling ([#25263](https://github.com/qmk/qmk_firmware/pull/25263))
|
||||||
|
* [Fix] lib8tion: enable fixed scale8 and blend functions ([#25272](https://github.com/qmk/qmk_firmware/pull/25272))
|
||||||
|
* Fix tap_hold code blocks ([#25298](https://github.com/qmk/qmk_firmware/pull/25298))
|
@ -16,6 +16,8 @@
|
|||||||
"/tutorial": "/newbs",
|
"/tutorial": "/newbs",
|
||||||
"/unicode": "/feature_unicode",
|
"/unicode": "/feature_unicode",
|
||||||
|
|
||||||
|
"/features/bluetooth": "/features/wireless",
|
||||||
|
|
||||||
"/adc_driver": "/drivers/adc",
|
"/adc_driver": "/drivers/adc",
|
||||||
"/apa102_driver": "/drivers/apa102",
|
"/apa102_driver": "/drivers/apa102",
|
||||||
"/audio_driver": "/drivers/audio",
|
"/audio_driver": "/drivers/audio",
|
||||||
@ -24,7 +26,7 @@
|
|||||||
"/feature_auto_shift": "/features/auto_shift",
|
"/feature_auto_shift": "/features/auto_shift",
|
||||||
"/feature_autocorrect": "/features/autocorrect",
|
"/feature_autocorrect": "/features/autocorrect",
|
||||||
"/feature_backlight": "/features/backlight",
|
"/feature_backlight": "/features/backlight",
|
||||||
"/feature_bluetooth": "/features/bluetooth",
|
"/feature_bluetooth": "/features/wireless",
|
||||||
"/feature_bootmagic": "/features/bootmagic",
|
"/feature_bootmagic": "/features/bootmagic",
|
||||||
"/feature_caps_word": "/features/caps_word",
|
"/feature_caps_word": "/features/caps_word",
|
||||||
"/feature_combo": "/features/combo",
|
"/feature_combo": "/features/combo",
|
||||||
|
@ -21,7 +21,8 @@
|
|||||||
{ "text": "Debugging QMK", "link": "/faq_debug" },
|
{ "text": "Debugging QMK", "link": "/faq_debug" },
|
||||||
{ "text": "Keymap FAQ", "link": "/faq_keymap" },
|
{ "text": "Keymap FAQ", "link": "/faq_keymap" },
|
||||||
{ "text": "Squeezing Space from AVR", "link": "/squeezing_avr" },
|
{ "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": [
|
"items": [
|
||||||
{ "text": "Customizing Functionality", "link": "/custom_quantum_functions" },
|
{ "text": "Customizing Functionality", "link": "/custom_quantum_functions" },
|
||||||
{ "text": "Driver Installation with Zadig", "link": "/driver_installation_zadig" },
|
{ "text": "Driver Installation with Zadig", "link": "/driver_installation_zadig" },
|
||||||
|
{ "text": "Community Modules", "link": "/features/community_modules" },
|
||||||
{ "text": "Keymap Overview", "link": "/keymap" },
|
{ "text": "Keymap Overview", "link": "/keymap" },
|
||||||
{
|
{
|
||||||
"text": "Development Environments",
|
"text": "Development Environments",
|
||||||
@ -123,6 +125,7 @@
|
|||||||
{ "text": "Key Lock", "link": "/features/key_lock" },
|
{ "text": "Key Lock", "link": "/features/key_lock" },
|
||||||
{ "text": "Key Overrides", "link": "/features/key_overrides" },
|
{ "text": "Key Overrides", "link": "/features/key_overrides" },
|
||||||
{ "text": "Layers", "link": "/feature_layers" },
|
{ "text": "Layers", "link": "/feature_layers" },
|
||||||
|
{ "text": "Layer Lock", "link": "/features/layer_lock" },
|
||||||
{ "text": "One Shot Keys", "link": "/one_shot_keys" },
|
{ "text": "One Shot Keys", "link": "/one_shot_keys" },
|
||||||
{ "text": "OS Detection", "link": "/features/os_detection" },
|
{ "text": "OS Detection", "link": "/features/os_detection" },
|
||||||
{ "text": "Raw HID", "link": "/features/rawhid" },
|
{ "text": "Raw HID", "link": "/features/rawhid" },
|
||||||
@ -166,7 +169,6 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{ "text": "Audio", "link": "/features/audio" },
|
{ "text": "Audio", "link": "/features/audio" },
|
||||||
{ "text": "Bluetooth", "link": "/features/bluetooth" },
|
|
||||||
{ "text": "Bootmagic", "link": "/features/bootmagic" },
|
{ "text": "Bootmagic", "link": "/features/bootmagic" },
|
||||||
{ "text": "Converters", "link": "/feature_converters" },
|
{ "text": "Converters", "link": "/feature_converters" },
|
||||||
{ "text": "Custom Matrix", "link": "/custom_matrix" },
|
{ "text": "Custom Matrix", "link": "/custom_matrix" },
|
||||||
@ -179,7 +181,8 @@
|
|||||||
{ "text": "Pointing Device", "link": "/features/pointing_device" },
|
{ "text": "Pointing Device", "link": "/features/pointing_device" },
|
||||||
{ "text": "PS/2 Mouse", "link": "/features/ps2_mouse" },
|
{ "text": "PS/2 Mouse", "link": "/features/ps2_mouse" },
|
||||||
{ "text": "Split Keyboard", "link": "/features/split_keyboard" },
|
{ "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": "My Pull Request Was Flagged", "link": "/breaking_changes_instructions" },
|
||||||
{
|
{
|
||||||
"text": "Most Recent ChangeLog",
|
"text": "Most Recent ChangeLog",
|
||||||
"link": "/ChangeLog/20240825"
|
"link": "/ChangeLog/20250525"
|
||||||
},
|
},
|
||||||
{ "text": "Past Breaking Changes", "link": "/breaking_changes_history" },
|
{ "text": "Past Breaking Changes", "link": "/breaking_changes_history" },
|
||||||
{ "text": "Deprecation Policy", "link": "/support_deprecation_policy" }
|
{ "text": "Deprecation Policy", "link": "/support_deprecation_policy" }
|
||||||
@ -224,6 +227,7 @@
|
|||||||
{ "text": "ADC Driver", "link": "/drivers/adc" },
|
{ "text": "ADC Driver", "link": "/drivers/adc" },
|
||||||
{ "text": "APA102 Driver", "link": "/drivers/apa102" },
|
{ "text": "APA102 Driver", "link": "/drivers/apa102" },
|
||||||
{ "text": "Audio Driver", "link": "/drivers/audio" },
|
{ "text": "Audio Driver", "link": "/drivers/audio" },
|
||||||
|
{ "text": "Battery Driver", "link": "/drivers/battery" },
|
||||||
{ "text": "EEPROM Driver", "link": "/drivers/eeprom" },
|
{ "text": "EEPROM Driver", "link": "/drivers/eeprom" },
|
||||||
{ "text": "Flash Driver", "link": "/drivers/flash" },
|
{ "text": "Flash Driver", "link": "/drivers/flash" },
|
||||||
{ "text": "I2C Driver", "link": "/drivers/i2c" },
|
{ "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
|
# 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?
|
## What has been included in past Breaking Changes?
|
||||||
|
|
||||||
* [2024 Aug 25](ChangeLog/20240825)
|
* [2025 May 25](ChangeLog/20250525)
|
||||||
* [2024 May 26](ChangeLog/20240526)
|
* [2025 Feb 23](ChangeLog/20250223)
|
||||||
* [2024 Feb 25](ChangeLog/20240225)
|
* [2024 Nov 24](ChangeLog/20241124)
|
||||||
* [Older Breaking Changes](breaking_changes_history)
|
* [Older Breaking Changes](breaking_changes_history)
|
||||||
|
|
||||||
## When is the next Breaking Change?
|
## When is the next Breaking Change?
|
||||||
|
|
||||||
The next Breaking Change is scheduled for November 24, 2024.
|
The next Breaking Change is scheduled for Aug 31, 2025.
|
||||||
|
|
||||||
### Important Dates
|
### 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.
|
* 2025 May 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.
|
* 2025 Aug 3 - `develop` closed to new PRs.
|
||||||
* 2024 Oct 27 - Call for testers.
|
* 2025 Aug 3 - Call for testers.
|
||||||
* 2024 Nov 10 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
* 2025 Aug 17 - 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.
|
* 2025 Aug 24 - `develop` is locked, only critical bugfix PRs merged.
|
||||||
* 2024 Nov 22 - `master` is locked, no PRs merged.
|
* 2025 Aug 29 - `master` is locked, no PRs merged.
|
||||||
* 2024 Nov 24 - Merge `develop` to `master`.
|
* 2025 Aug 31 - Merge `develop` to `master`.
|
||||||
* 2024 Nov 24 - `master` is unlocked. PRs can be merged again.
|
* 2025 Aug 31 - `master` is unlocked. PRs can be merged again.
|
||||||
|
|
||||||
## What changes will be included?
|
## What changes will be included?
|
||||||
|
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
This page links to all previous changelogs from the QMK Breaking Changes process.
|
This page links to all previous changelogs from the QMK Breaking Changes process.
|
||||||
|
|
||||||
|
* [2025 May 25](ChangeLog/20250525) - version 0.29.0
|
||||||
|
* [2025 Feb 23](ChangeLog/20250223) - version 0.28.0
|
||||||
|
* [2024 Nov 24](ChangeLog/20241124) - version 0.27.0
|
||||||
* [2024 Aug 25](ChangeLog/20240825) - version 0.26.0
|
* [2024 Aug 25](ChangeLog/20240825) - version 0.26.0
|
||||||
* [2024 May 26](ChangeLog/20240526) - version 0.25.0
|
* [2024 May 26](ChangeLog/20240526) - version 0.25.0
|
||||||
* [2024 Feb 25](ChangeLog/20240225) - version 0.24.0
|
* [2024 Feb 25](ChangeLog/20240225) - version 0.24.0
|
||||||
|
16
docs/cli.md
16
docs/cli.md
@ -6,7 +6,7 @@ The QMK CLI (command line interface) makes building and working with QMK keyboar
|
|||||||
|
|
||||||
### Requirements {#requirements}
|
### 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}
|
### Install Using Homebrew (macOS, some Linux) {#install-using-homebrew}
|
||||||
|
|
||||||
@ -18,9 +18,21 @@ export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
|
|||||||
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
|
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Install Using uv {#install-using-uv}
|
||||||
|
|
||||||
|
If you have installed [uv](https://docs.astral.sh/uv/), the QMK CLI can be installed and managed as a uv tool:
|
||||||
|
|
||||||
|
```
|
||||||
|
uv tool install qmk
|
||||||
|
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
|
||||||
|
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
|
||||||
|
```
|
||||||
|
|
||||||
|
This installation can be updated via `uv tool upgrade qmk`. See [Upgrading tools](https://docs.astral.sh/uv/guides/tools/#upgrading-tools) for more information.
|
||||||
|
|
||||||
### Install Using pip {#install-using-easy_install-or-pip}
|
### 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
|
python3 -m pip install qmk
|
||||||
|
@ -17,7 +17,7 @@ qmk compile [-c] <configuratorExport.json>
|
|||||||
**Usage for Keymaps**:
|
**Usage for Keymaps**:
|
||||||
|
|
||||||
```
|
```
|
||||||
qmk compile [-c] [-e <var>=<value>] [-j <num_jobs>] -kb <keyboard_name> -km <keymap_name>
|
qmk compile [-c] [-e <var>=<value>] [-j <num_jobs>] [--compiledb] -kb <keyboard_name> -km <keymap_name>
|
||||||
```
|
```
|
||||||
|
|
||||||
**Usage in Keyboard Directory**:
|
**Usage in Keyboard Directory**:
|
||||||
@ -84,6 +84,25 @@ The `num_jobs` argument determines the maximum number of jobs that can be used.
|
|||||||
qmk compile -j 0 -kb <keyboard_name>
|
qmk compile -j 0 -kb <keyboard_name>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Compilation Database**:
|
||||||
|
|
||||||
|
Creates a `compile_commands.json` file.
|
||||||
|
|
||||||
|
Does your IDE/editor use a language server but doesn't _quite_ find all the necessary include files? Do you hate red squigglies? Do you wish your editor could figure out `#include QMK_KEYBOARD_H`? You might need a [compilation database](https://clang.llvm.org/docs/JSONCompilationDatabase.html)! Compiling using this argument can create this for you.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak
|
||||||
|
$ qmk compile --compiledb
|
||||||
|
Ψ Making clean
|
||||||
|
Ψ Gathering build instructions from make ........
|
||||||
|
Ψ Found 63 compile commands
|
||||||
|
Ψ Writing build database to /Users/you/src/qmk_firmware/compile_commands.json
|
||||||
|
Ψ Compiling keymap with make ........
|
||||||
|
... build log continues ...
|
||||||
|
```
|
||||||
|
|
||||||
## `qmk flash`
|
## `qmk flash`
|
||||||
|
|
||||||
This command is similar to `qmk compile`, but can also target a bootloader. The bootloader is optional, and is set to `:flash` by default. To specify a different bootloader, use `-bl <bootloader>`. Visit the [Flashing Firmware](flashing) guide for more details of the available bootloaders.
|
This command is similar to `qmk compile`, but can also target a bootloader. The bootloader is optional, and is set to `:flash` by default. To specify a different bootloader, use `-bl <bootloader>`. Visit the [Flashing Firmware](flashing) guide for more details of the available bootloaders.
|
||||||
@ -153,20 +172,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.
|
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.
|
- `exists(key)`: Match targets where `key` is present.
|
||||||
- `absent(key)`: Match targets where `key` is not 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.
|
- `contains(key, value)`: Match targets where `key` contains `value`. Can be used for strings, arrays and object keys.
|
||||||
@ -175,7 +200,7 @@ The following filter expressions are also supported:
|
|||||||
You can also list arbitrary values for each matched target with `--print`:
|
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**:
|
**Usage**:
|
||||||
@ -688,52 +713,28 @@ qmk format-c
|
|||||||
qmk format-c -b branch_name
|
qmk format-c -b branch_name
|
||||||
```
|
```
|
||||||
|
|
||||||
## `qmk generate-compilation-database`
|
|
||||||
|
|
||||||
**Usage**:
|
|
||||||
|
|
||||||
```
|
|
||||||
qmk generate-compilation-database [-kb KEYBOARD] [-km KEYMAP]
|
|
||||||
```
|
|
||||||
|
|
||||||
Creates a `compile_commands.json` file.
|
|
||||||
|
|
||||||
Does your IDE/editor use a language server but doesn't _quite_ find all the necessary include files? Do you hate red squigglies? Do you wish your editor could figure out `#include QMK_KEYBOARD_H`? You might need a [compilation database](https://clang.llvm.org/docs/JSONCompilationDatabase.html)! The qmk tool can build this for you.
|
|
||||||
|
|
||||||
This command needs to know which keyboard and keymap to build. It uses the same configuration options as the `qmk compile` command: arguments, current directory, and config files.
|
|
||||||
|
|
||||||
**Example:**
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak
|
|
||||||
$ qmk generate-compilation-database
|
|
||||||
Ψ Making clean
|
|
||||||
Ψ Gathering build instructions from make -n gh60/satan:colemak
|
|
||||||
Ψ Found 50 compile commands
|
|
||||||
Ψ Writing build database to /Users/you/src/qmk_firmware/compile_commands.json
|
|
||||||
```
|
|
||||||
|
|
||||||
Now open your dev environment and live a squiggly-free life.
|
|
||||||
|
|
||||||
## `qmk docs`
|
## `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**:
|
||||||
|
|
||||||
```
|
```
|
||||||
usage: qmk docs [-h]
|
usage: qmk docs [-h] [-b] [-p PORT]
|
||||||
|
|
||||||
options:
|
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`
|
## `qmk generate-docs`
|
||||||
|
|
||||||
This command allows you to generate QMK documentation locally. It can be uses for general browsing or improving the docs.
|
This command generates QMK documentation for production.
|
||||||
Use the `-s`/`--serve` flag to also serve the static site once built. Default port is 4173.
|
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.
|
This command requires `node` and `yarn` to be installed as prerequisites, and requires the operating system to support symlinks.
|
||||||
|
|
||||||
@ -876,3 +877,13 @@ Run single test:
|
|||||||
```
|
```
|
||||||
qmk test-c --test basic
|
qmk test-c --test basic
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## `qmk generate-compilation-database`
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk generate-compilation-database [-kb KEYBOARD] [-km KEYMAP]
|
||||||
|
```
|
||||||
|
|
||||||
|
This command has been deprecated as it cannot take into account configurables such as [converters](/feature_converters) or environment variables normally specified on the command line; please use the `--compiledb` flag with `qmk compile` instead.
|
||||||
|
@ -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.
|
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
|
# 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.
|
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.
|
You should never use the format operator (`%`) directly, always pass values as arguments.
|
||||||
|
|
||||||
### Logging (`cli.log`)
|
### 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`.
|
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.
|
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 indent using four (4) spaces (soft tabs)
|
||||||
* We encourage liberal use of comments
|
* We encourage liberal use of comments
|
||||||
* Think of them as a story describing the feature
|
* 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
|
||||||
|
|
||||||
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
|
## 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)
|
* [WB32F3G71xx](http://www.westberrytech.com)
|
||||||
* [WB32FQ95xx](http://www.westberrytech.com)
|
* [WB32FQ95xx](http://www.westberrytech.com)
|
||||||
|
|
||||||
|
### Artery (AT32)
|
||||||
|
|
||||||
|
* [AT32F415](https://www.arterychip.com/en/product/AT32F415.jsp)
|
||||||
|
|
||||||
### NXP (Kinetis)
|
### 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)
|
* [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)
|
||||||
@ -75,10 +79,6 @@ You can also use any ARM chip with USB that [ChibiOS](https://www.chibios.org) s
|
|||||||
|
|
||||||
For a detailed overview about the RP2040 support by QMK see the [dedicated RP2040 page](platformdev_rp2040).
|
For a detailed overview about the RP2040 support by QMK see the [dedicated RP2040 page](platformdev_rp2040).
|
||||||
|
|
||||||
## Atmel ATSAM
|
|
||||||
|
|
||||||
There is limited support for one of Atmel's ATSAM microcontrollers, that being the [ATSAMD51J18A](https://www.microchip.com/wwwproducts/en/ATSAMD51J18A) used by the [Massdrop keyboards](https://github.com/qmk/qmk_firmware/tree/master/keyboards/massdrop). However, it is not recommended to design a board with this microcontroller as the support is quite specialized to Massdrop hardware.
|
|
||||||
|
|
||||||
## RISC-V
|
## RISC-V
|
||||||
|
|
||||||
### GigaDevice
|
### GigaDevice
|
||||||
|
@ -140,8 +140,6 @@ If you define these options you will enable the associated feature, which may in
|
|||||||
|
|
||||||
* `#define ENABLE_COMPILE_KEYCODE`
|
* `#define ENABLE_COMPILE_KEYCODE`
|
||||||
* Enables the `QK_MAKE` keycode
|
* Enables the `QK_MAKE` keycode
|
||||||
* `#define FORCE_NKRO`
|
|
||||||
* NKRO by default requires to be turned on, this forces it on during keyboard startup regardless of EEPROM setting. NKRO can still be turned off but will be turned on again if the keyboard reboots.
|
|
||||||
* `#define STRICT_LAYER_RELEASE`
|
* `#define STRICT_LAYER_RELEASE`
|
||||||
* force a key release to be evaluated using the current layer stack instead of remembering which layer it came from (used for advanced cases)
|
* force a key release to be evaluated using the current layer stack instead of remembering which layer it came from (used for advanced cases)
|
||||||
|
|
||||||
@ -401,6 +399,7 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i
|
|||||||
* `atmel-dfu`
|
* `atmel-dfu`
|
||||||
* `lufa-dfu`
|
* `lufa-dfu`
|
||||||
* `qmk-dfu`
|
* `qmk-dfu`
|
||||||
|
* `qmk-hid`
|
||||||
* `halfkay`
|
* `halfkay`
|
||||||
* `caterina`
|
* `caterina`
|
||||||
* `bootloadhid`
|
* `bootloadhid`
|
||||||
@ -426,8 +425,6 @@ Use these to enable or disable building certain features. The more you have enab
|
|||||||
* Key combo feature
|
* Key combo feature
|
||||||
* `NKRO_ENABLE`
|
* `NKRO_ENABLE`
|
||||||
* USB N-Key Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
* USB N-Key Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||||
* `RING_BUFFERED_6KRO_REPORT_ENABLE`
|
|
||||||
* USB 6-Key Rollover - Instead of stopping any new input once 6 keys are pressed, the oldest key is released and the new key is pressed.
|
|
||||||
* `AUDIO_ENABLE`
|
* `AUDIO_ENABLE`
|
||||||
* Enable the audio subsystem.
|
* Enable the audio subsystem.
|
||||||
* `KEY_OVERRIDE_ENABLE`
|
* `KEY_OVERRIDE_ENABLE`
|
||||||
|
@ -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),
|
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(
|
[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, KC_TRNS, KC_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, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MNXT, KC_VOLD,
|
||||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
@ -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_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", "KC_TRNS", "KC_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", "QK_BOOT", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_MPLY", "KC_MNXT", "KC_VOLD",
|
||||||
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS",
|
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS",
|
||||||
|
@ -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:
|
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
|
## 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:
|
We have structured QMK as a hierarchy:
|
||||||
|
|
||||||
* Core (`_quantum`)
|
* Core (`_quantum`)
|
||||||
|
* Community Module (`_<module>`)
|
||||||
|
* Community Module -> Keyboard/Revision (`_<module>_kb`)
|
||||||
|
* Community Module -> Keymap (`_<module>_user`)
|
||||||
* Keyboard/Revision (`_kb`)
|
* Keyboard/Revision (`_kb`)
|
||||||
* Keymap (`_user`)
|
* 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.
|
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
|
# 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.
|
* `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
|
::: 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
|
## 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 |
|
|`bootloadhid` |HIDBoot |`16C0:05DF` |HidUsb |
|
||||||
|`usbasploader`|USBasp |`16C0:05DC` |libusbK|
|
|`usbasploader`|USBasp |`16C0:05DC` |libusbK|
|
||||||
|`apm32-dfu` |APM32 DFU ISP Mode |`314B:0106` |WinUSB |
|
|`apm32-dfu` |APM32 DFU ISP Mode |`314B:0106` |WinUSB |
|
||||||
|
|`at32-dfu` |AT32 Bootloader DFU |`2E3C:DF11` |WinUSB |
|
||||||
|`stm32-dfu` |STM32 BOOTLOADER |`0483:DF11` |WinUSB |
|
|`stm32-dfu` |STM32 BOOTLOADER |`0483:DF11` |WinUSB |
|
||||||
|`gd32v-dfu` |GD32V BOOTLOADER |`28E9:0189` |WinUSB |
|
|`gd32v-dfu` |GD32V BOOTLOADER |`28E9:0189` |WinUSB |
|
||||||
|`kiibohd` |Kiibohd DFU Bootloader |`1C11:B007` |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:
|
Additionally, in the board config, you'll want to make changes to enable the DACs, GPT for Timers 6, 7 and 8:
|
||||||
|
|
||||||
```c
|
::: code-group
|
||||||
//halconf.h:
|
```c [halconf.h]
|
||||||
#define HAL_USE_DAC TRUE
|
#pragma once
|
||||||
#define HAL_USE_GPT TRUE
|
|
||||||
|
#define HAL_USE_DAC TRUE // [!code focus]
|
||||||
|
#define HAL_USE_GPT TRUE // [!code focus]
|
||||||
|
|
||||||
#include_next <halconf.h>
|
#include_next <halconf.h>
|
||||||
```
|
```
|
||||||
|
```c [mcuconf.h]
|
||||||
|
#pragma once
|
||||||
|
|
||||||
```c
|
|
||||||
// mcuconf.h:
|
|
||||||
#include_next <mcuconf.h>
|
#include_next <mcuconf.h>
|
||||||
#undef STM32_DAC_USE_DAC1_CH1
|
|
||||||
#define STM32_DAC_USE_DAC1_CH1 TRUE
|
#undef STM32_DAC_USE_DAC1_CH1 // [!code focus]
|
||||||
#undef STM32_DAC_USE_DAC1_CH2
|
#define STM32_DAC_USE_DAC1_CH1 TRUE // [!code focus]
|
||||||
#define STM32_DAC_USE_DAC1_CH2 TRUE
|
#undef STM32_DAC_USE_DAC1_CH2 // [!code focus]
|
||||||
#undef STM32_GPT_USE_TIM6
|
#define STM32_DAC_USE_DAC1_CH2 TRUE // [!code focus]
|
||||||
#define STM32_GPT_USE_TIM6 TRUE
|
#undef STM32_GPT_USE_TIM6 // [!code focus]
|
||||||
#undef STM32_GPT_USE_TIM7
|
#define STM32_GPT_USE_TIM6 TRUE // [!code focus]
|
||||||
#define STM32_GPT_USE_TIM7 TRUE
|
#undef STM32_GPT_USE_TIM7 // [!code focus]
|
||||||
#undef STM32_GPT_USE_TIM8
|
#define STM32_GPT_USE_TIM7 TRUE // [!code focus]
|
||||||
#define STM32_GPT_USE_TIM8 TRUE
|
#undef STM32_GPT_USE_TIM8 // [!code focus]
|
||||||
|
#define STM32_GPT_USE_TIM8 TRUE // [!code focus]
|
||||||
```
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
::: tip
|
::: tip
|
||||||
Note: DAC1 (A4) uses TIM6, DAC2 (A5) uses TIM7, and the audio state timer uses TIM8 (configurable).
|
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:
|
Additionally, in the board config, you'll want to make changes to enable the DACs, GPT for Timer 6:
|
||||||
|
|
||||||
```c
|
::: code-group
|
||||||
//halconf.h:
|
```c [halconf.h]
|
||||||
#define HAL_USE_DAC TRUE
|
#pragma once
|
||||||
#define HAL_USE_GPT TRUE
|
|
||||||
|
#define HAL_USE_DAC TRUE // [!code focus]
|
||||||
|
#define HAL_USE_GPT TRUE // [!code focus]
|
||||||
|
|
||||||
#include_next <halconf.h>
|
#include_next <halconf.h>
|
||||||
```
|
```
|
||||||
|
```c [mcuconf.h]
|
||||||
|
#pragma once
|
||||||
|
|
||||||
```c
|
|
||||||
// mcuconf.h:
|
|
||||||
#include_next <mcuconf.h>
|
#include_next <mcuconf.h>
|
||||||
#undef STM32_DAC_USE_DAC1_CH1
|
|
||||||
#define STM32_DAC_USE_DAC1_CH1 TRUE
|
#undef STM32_DAC_USE_DAC1_CH1 // [!code focus]
|
||||||
#undef STM32_DAC_USE_DAC1_CH2
|
#define STM32_DAC_USE_DAC1_CH1 TRUE // [!code focus]
|
||||||
#define STM32_DAC_USE_DAC1_CH2 TRUE
|
#undef STM32_DAC_USE_DAC1_CH2 // [!code focus]
|
||||||
#undef STM32_GPT_USE_TIM6
|
#define STM32_DAC_USE_DAC1_CH2 TRUE // [!code focus]
|
||||||
#define STM32_GPT_USE_TIM6 TRUE
|
#undef STM32_GPT_USE_TIM6 // [!code focus]
|
||||||
|
#define STM32_GPT_USE_TIM6 TRUE // [!code focus]
|
||||||
```
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
### DAC Config
|
### 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.
|
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:
|
A configuration example for the STM32F103C8 would be:
|
||||||
```c
|
|
||||||
//halconf.h:
|
::: code-group
|
||||||
#define HAL_USE_PWM TRUE
|
```c [halconf.h]
|
||||||
#define HAL_USE_PAL TRUE
|
#pragma once
|
||||||
|
|
||||||
|
#define HAL_USE_PWM TRUE // [!code focus]
|
||||||
|
#define HAL_USE_PAL TRUE // [!code focus]
|
||||||
|
|
||||||
#include_next <halconf.h>
|
#include_next <halconf.h>
|
||||||
```
|
```
|
||||||
|
```c [mcuconf.h]
|
||||||
|
#pragma once
|
||||||
|
|
||||||
```c
|
|
||||||
// mcuconf.h:
|
|
||||||
#include_next <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
|
If we now target pin A8, looking through the data-sheet of the STM32F103C8, for the timers and alternate functions
|
||||||
- TIM1_CH1 = PA8 <- alternate0
|
- TIM1_CH1 = PA8 <- alternate0
|
||||||
|
73
docs/drivers/battery.md
Normal file
73
docs/drivers/battery.md
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
# 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` |`100` |The voltage divider resistance, in kOhm. Set to 0 to disable. |
|
||||||
|
|`BATTERY_VOLTAGE_DIVIDER_R2` |`100` |The voltage divider resistance, in kOhm. Set to 0 to disable. |
|
||||||
|
|`BATTERY_ADC_RESOLUTION` |`10` |The ADC resolution configured for the ADC Driver. |
|
||||||
|
|
||||||
|
## Functions
|
||||||
|
|
||||||
|
### `uint8_t battery_get_percent(void)` {#api-battery-get-percent}
|
||||||
|
|
||||||
|
Sample battery level.
|
||||||
|
|
||||||
|
#### Return Value {#api-battery-get-percent-return}
|
||||||
|
|
||||||
|
The battery percentage, in the range 0-100.
|
||||||
|
|
||||||
|
## Callbacks
|
||||||
|
|
||||||
|
### `void battery_percent_changed_user(uint8_t level)` {#api-battery-percent-changed-user}
|
||||||
|
|
||||||
|
User hook called when battery level changed.
|
||||||
|
|
||||||
|
### Arguments {#api-battery-percent-changed-user-arguments}
|
||||||
|
|
||||||
|
- `uint8_t level`
|
||||||
|
The battery percentage, in the range 0-100.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void battery_percent_changed_kb(uint8_t level)` {#api-battery-percent-changed-kb}
|
||||||
|
|
||||||
|
Keyboard hook called when battery level changed.
|
||||||
|
|
||||||
|
### Arguments {#api-battery-percent-changed-kb-arguments}
|
||||||
|
|
||||||
|
- `uint8_t level`
|
||||||
|
The battery percentage, in the range 0-100.
|
@ -13,7 +13,7 @@ The following macros provide basic control of GPIOs and are found in `platforms/
|
|||||||
|`gpio_set_pin_input_low(pin)` |Set pin as input with builtin pull-down resistor (unavailable on AVR)|
|
|`gpio_set_pin_input_low(pin)` |Set pin as input with builtin pull-down resistor (unavailable on AVR)|
|
||||||
|`gpio_set_pin_output(pin)` |Set pin as output (alias of `gpio_set_pin_output_push_pull`) |
|
|`gpio_set_pin_output(pin)` |Set pin as output (alias of `gpio_set_pin_output_push_pull`) |
|
||||||
|`gpio_set_pin_output_push_pull(pin)` |Set pin as output, push/pull mode |
|
|`gpio_set_pin_output_push_pull(pin)` |Set pin as output, push/pull mode |
|
||||||
|`gpio_set_pin_output_open_drain(pin)`|Set pin as output, open-drain mode (unavailable on AVR and ATSAM) |
|
|`gpio_set_pin_output_open_drain(pin)`|Set pin as output, open-drain mode (unavailable on AVR) |
|
||||||
|`gpio_write_pin_high(pin)` |Set pin level as high, assuming it is an output |
|
|`gpio_write_pin_high(pin)` |Set pin level as high, assuming it is an output |
|
||||||
|`gpio_write_pin_low(pin)` |Set pin level as low, assuming it is an output |
|
|`gpio_write_pin_low(pin)` |Set pin level as low, assuming it is an output |
|
||||||
|`gpio_write_pin(pin, level)` |Set pin level, assuming it is an output |
|
|`gpio_write_pin(pin, level)` |Set pin level, assuming it is an output |
|
||||||
|
@ -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}
|
## 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
|
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.
|
||||||
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`.
|
|
||||||
|
|
||||||
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
|
```c
|
||||||
#define MY_I2C_ADDRESS (0x18 << 1)
|
#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.
|
See https://www.robot-electronics.co.uk/i2c-tutorial for more information about I2C addressing and other technical details.
|
||||||
|
|
||||||
## AVR Configuration {#avr-configuration}
|
## AVR Configuration {#avr-configuration}
|
||||||
@ -40,7 +45,7 @@ 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:
|
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`|
|
|MCU |`SCL`|`SDA`|
|
||||||
|------------------|-----|-----|
|
|-------------|-----|-----|
|
||||||
|ATmega16/32U4|`D0` |`D1` |
|
|ATmega16/32U4|`D0` |`D1` |
|
||||||
|AT90USB64/128|`D0` |`D1` |
|
|AT90USB64/128|`D0` |`D1` |
|
||||||
|ATmega32A |`C0` |`C1` |
|
|ATmega32A |`C0` |`C1` |
|
||||||
@ -52,20 +57,27 @@ The ATmega16/32U2 does not possess I2C functionality, and so cannot use this dri
|
|||||||
|
|
||||||
## ChibiOS/ARM Configuration {#arm-configuration}
|
## 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
|
::: code-group
|
||||||
#define HAL_USE_I2C TRUE
|
```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 // [!code focus]
|
||||||
#undef STM32_I2C_USE_I2C2
|
#define STM32_I2C_USE_I2C2 TRUE // [!code focus]
|
||||||
#define STM32_I2C_USE_I2C2 TRUE
|
|
||||||
```
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|`mcuconf.h` Setting |Description |Default|
|
|`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.
|
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|
|
|`config.h` Override|Description |Default|
|
||||||
|------------------------|--------------------------------------------------------------|-------|
|
|-------------------|-------------------------------------------------------------|-------|
|
||||||
|`I2C_DRIVER` |I2C peripheral to use - I2C1 -> `I2CD1`, I2C2 -> `I2CD2` etc.|`I2CD1`|
|
|`I2C_DRIVER` |I2C peripheral to use - I2C1 -> `I2CD1`, I2C2 -> `I2CD2` etc.|`I2CD1`|
|
||||||
|`I2C1_SCL_PIN` |The pin definition for SCL |`B6` |
|
|`I2C1_SCL_PIN` |The pin to use for SCL |`B6` |
|
||||||
|`I2C1_SCL_PAL_MODE`|The alternate function mode for SCL |`4` |
|
|`I2C1_SCL_PAL_MODE`|The alternate function mode for SCL |`4` |
|
||||||
|`I2C1_SDA_PIN` |The pin definition for SDA |`B7` |
|
|`I2C1_SDA_PIN` |The pin to use for SDA |`B7` |
|
||||||
|`I2C1_SDA_PAL_MODE`|The alternate function mode for SDA |`4` |
|
|`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}
|
### 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.
|
Send multiple bytes to the selected I2C device.
|
||||||
|
|
||||||
@ -148,7 +164,7 @@ Send multiple bytes to the selected I2C device.
|
|||||||
|
|
||||||
- `uint8_t address`
|
- `uint8_t address`
|
||||||
The 7-bit I2C address of the device.
|
The 7-bit I2C address of the device.
|
||||||
- `uint8_t *data`
|
- `const uint8_t* data`
|
||||||
A pointer to the data to transmit.
|
A pointer to the data to transmit.
|
||||||
- `uint16_t length`
|
- `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`.
|
||||||
@ -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}
|
### `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.
|
Receive multiple bytes from the selected I2C device.
|
||||||
@ -170,7 +209,7 @@ Receive multiple bytes from the selected I2C device.
|
|||||||
- `uint8_t address`
|
- `uint8_t address`
|
||||||
The 7-bit I2C address of the device.
|
The 7-bit I2C address of the device.
|
||||||
- `uint8_t* data`
|
- `uint8_t* data`
|
||||||
A pointer to the buffer to read into.
|
A pointer to a buffer to read into.
|
||||||
- `uint16_t length`
|
- `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`
|
- `uint16_t timeout`
|
||||||
@ -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}
|
#### Arguments {#api-i2c-write-register-arguments}
|
||||||
|
|
||||||
@ -192,7 +231,7 @@ Writes to a register with an 8-bit address on the I2C device.
|
|||||||
The 7-bit I2C address of the device.
|
The 7-bit I2C address of the device.
|
||||||
- `uint8_t regaddr`
|
- `uint8_t regaddr`
|
||||||
The register address to write to.
|
The register address to write to.
|
||||||
- `uint8_t *data`
|
- `const uint8_t* data`
|
||||||
A pointer to the data to transmit.
|
A pointer to the data to transmit.
|
||||||
- `uint16_t length`
|
- `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`.
|
||||||
@ -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}
|
#### Arguments {#api-i2c-write-register16-arguments}
|
||||||
|
|
||||||
@ -215,7 +254,7 @@ Writes to a register with a 16-bit address (big endian) on the I2C device.
|
|||||||
The 7-bit I2C address of the device.
|
The 7-bit I2C address of the device.
|
||||||
- `uint16_t regaddr`
|
- `uint16_t regaddr`
|
||||||
The register address to write to.
|
The register address to write to.
|
||||||
- `uint8_t *data`
|
- `const uint8_t* data`
|
||||||
A pointer to the data to transmit.
|
A pointer to the data to transmit.
|
||||||
- `uint16_t length`
|
- `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`.
|
||||||
@ -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}
|
### `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}
|
#### Arguments {#api-i2c-read-register-arguments}
|
||||||
|
|
||||||
@ -238,6 +277,8 @@ Reads from a register with an 8-bit address on the I2C device.
|
|||||||
The 7-bit I2C address of the device.
|
The 7-bit I2C address of the device.
|
||||||
- `uint8_t regaddr`
|
- `uint8_t regaddr`
|
||||||
The register address to read from.
|
The register address to read from.
|
||||||
|
- `uint8_t data`
|
||||||
|
A pointer to a buffer to read into.
|
||||||
- `uint16_t length`
|
- `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`
|
- `uint16_t timeout`
|
||||||
@ -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}
|
### `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}
|
#### Arguments {#api-i2c-read-register16-arguments}
|
||||||
|
|
||||||
@ -259,6 +300,8 @@ Reads from a register with a 16-bit address (big endian) on the I2C device.
|
|||||||
The 7-bit I2C address of the device.
|
The 7-bit I2C address of the device.
|
||||||
- `uint16_t regaddr`
|
- `uint16_t regaddr`
|
||||||
The register address to read from.
|
The register address to read from.
|
||||||
|
- `uint8_t* data`
|
||||||
|
A pointer to a buffer to read into.
|
||||||
- `uint16_t length`
|
- `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`
|
- `uint16_t timeout`
|
||||||
@ -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}
|
### `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`
|
- `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`
|
- `uint16_t timeout`
|
||||||
The time in milliseconds to wait for a response from the target device.
|
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`.
|
`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.
|
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
|
## 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.
|
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
|
#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
|
## 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).
|
4. Decide either for `SERIAL`, `SIO`, or `PIO` subsystem. See section ["Choosing a driver subsystem"](#choosing-a-driver-subsystem).
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
## USART Full-duplex
|
## 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.
|
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,34 +179,42 @@ 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).
|
4. Decide either for `SERIAL`, `SIO`, or `PIO` subsystem. See section ["Choosing a driver subsystem"](#choosing-a-driver-subsystem).
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
## Choosing a driver subsystem
|
## Choosing a driver subsystem
|
||||||
|
|
||||||
### The `SERIAL` driver
|
### 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:
|
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.
|
||||||
|
|
||||||
|
Add the following to your keyboard's `halconf.h`, creating it if necessary:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define HAL_USE_SERIAL TRUE
|
#pragma once
|
||||||
|
|
||||||
|
#define HAL_USE_SERIAL TRUE // [!code focus]
|
||||||
|
|
||||||
|
#include_next <halconf.h>
|
||||||
```
|
```
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Just below `#include_next <mcuconf.h>` add:
|
Add the following to your keyboard's `mcuconf.h`, creating it if necessary:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#include_next <mcuconf.h>
|
#include_next <mcuconf.h>
|
||||||
|
|
||||||
#undef STM32_SERIAL_USE_USARTn
|
#undef STM32_SERIAL_USE_USARTn // [!code focus]
|
||||||
#define STM32_SERIAL_USE_USARTn TRUE
|
#define STM32_SERIAL_USE_USARTn TRUE // [!code focus]
|
||||||
```
|
```
|
||||||
|
|
||||||
Where 'n' matches the peripheral number of your selected USART on the MCU.
|
Where *n* matches the peripheral number of your selected USART on the MCU.
|
||||||
|
|
||||||
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`.
|
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
|
```c
|
||||||
#define SERIAL_USART_DRIVER SD3
|
#define SERIAL_USART_DRIVER SD3
|
||||||
@ -218,26 +226,36 @@ The `SIO` Subsystem was added to ChibiOS with the 21.11 release and is only supp
|
|||||||
|
|
||||||
Follow these steps in order to activate it:
|
Follow these steps in order to activate it:
|
||||||
|
|
||||||
1. In your keyboards `halconf.h` add:
|
1. Enable the SIO subsystem in the ChibiOS HAL.
|
||||||
|
|
||||||
|
Add the following to your keyboard's `halconf.h`, creating it if necessary:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define HAL_USE_SIO TRUE
|
#pragma once
|
||||||
|
|
||||||
|
#define HAL_USE_SIO TRUE // [!code focus]
|
||||||
|
|
||||||
|
#include_next <halconf.h>
|
||||||
```
|
```
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Just below `#include_next <mcuconf.h>` add:
|
Add the following to your keyboard's `mcuconf.h`, creating it if necessary:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#include_next <mcuconf.h>
|
#include_next <mcuconf.h>
|
||||||
|
|
||||||
#undef STM32_SIO_USE_USARTn
|
#undef STM32_SIO_USE_USARTn // [!code focus]
|
||||||
#define STM32_SIO_USE_USARTn TRUE
|
#define STM32_SIO_USE_USARTn TRUE // [!code focus]
|
||||||
```
|
```
|
||||||
|
|
||||||
Where 'n' matches the peripheral number of your selected USART on the MCU.
|
Where *n* matches the peripheral number of your selected USART on the MCU.
|
||||||
|
|
||||||
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`.
|
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
|
```c
|
||||||
#define SERIAL_USART_DRIVER SIOD3
|
#define SERIAL_USART_DRIVER SIOD3
|
||||||
@ -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.
|
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
|
## Advanced Configuration
|
||||||
|
|
||||||
There are several advanced configuration options that can be defined in your keyboards `config.h` file:
|
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.
|
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
|
```c
|
||||||
#define SELECT_SOFT_SERIAL_SPEED {#}
|
#define SELECT_SOFT_SERIAL_SPEED n
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Where *n* is one of:
|
||||||
|
|
||||||
| Speed | Bitbang | Half-duplex and Full-duplex |
|
| Speed | Bitbang | Half-duplex and Full-duplex |
|
||||||
| ----- | -------------------------- | --------------------------- |
|
| ----- | -------------------------- | --------------------------- |
|
||||||
| `0` | 189000 baud (experimental) | 460800 baud |
|
| `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
|
#define SERIAL_USART_TIMEOUT 20 // USART driver timeout. default 20
|
||||||
```
|
```
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
If you're having issues withe serial communication, you can enable debug messages that will give you insights which part of the communication failed. The enable these messages add to your keyboards `config.h` file:
|
If you're having issues 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,25 @@ 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.
|
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
|
::: code-group
|
||||||
#define HAL_USE_SPI TRUE
|
```c [halconf.h]
|
||||||
#define SPI_USE_WAIT TRUE
|
#pragma once
|
||||||
#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
|
|
||||||
|
#define HAL_USE_SPI 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_SPI_USE_SPI2 // [!code focus]
|
||||||
#undef STM32_SPI_USE_SPI2
|
#define STM32_SPI_USE_SPI2 TRUE // [!code focus]
|
||||||
#define STM32_SPI_USE_SPI2 TRUE
|
|
||||||
```
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
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.
|
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 +86,7 @@ Start an SPI transaction.
|
|||||||
#### Arguments {#api-spi-start-arguments}
|
#### Arguments {#api-spi-start-arguments}
|
||||||
|
|
||||||
- `pin_t slavePin`
|
- `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`
|
- `bool lsbFirst`
|
||||||
Determines the endianness of the transmission. If `true`, the least significant bit of each byte is sent first.
|
Determines the endianness of the transmission. If `true`, the least significant bit of each byte is sent first.
|
||||||
- `uint8_t mode`
|
- `uint8_t mode`
|
||||||
@ -99,7 +104,7 @@ Start an SPI transaction.
|
|||||||
|
|
||||||
#### Return Value {#api-spi-start-return}
|
#### 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 +129,7 @@ Read a byte from the selected SPI device.
|
|||||||
|
|
||||||
#### Return Value {#api-spi-read-return}
|
#### 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 +157,7 @@ Receive multiple bytes from the selected SPI device.
|
|||||||
#### Arguments {#api-spi-receive-arguments}
|
#### Arguments {#api-spi-receive-arguments}
|
||||||
|
|
||||||
- `uint8_t *data`
|
- `uint8_t *data`
|
||||||
A pointer to the buffer to read into.
|
A pointer to a buffer to read into.
|
||||||
- `uint16_t length`
|
- `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`.
|
||||||
|
|
||||||
|
@ -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:
|
To enable UART, modify your board's `mcuconf.h` to enable the peripheral you've chosen, for example:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#undef STM32_SERIAL_USE_USART2
|
#pragma once
|
||||||
#define STM32_SERIAL_USE_USART2 TRUE
|
|
||||||
|
#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.
|
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 |
|
|`config.h` Override|Description |Default|
|
||||||
| --------------------------- | --------------------------------------------------------------- | ------------- |
|
|-------------------|---------------------------------------------------------------|-------|
|
||||||
| `#define UART_DRIVER` | USART peripheral to use - USART1 -> `SD1`, USART2 -> `SD2` etc. | `SD1` |
|
|`UART_DRIVER` |USART peripheral to use - USART1 -> `SD1`, USART2 -> `SD2` etc.|`SD1` |
|
||||||
| `#define UART_TX_PIN` | The pin to use for TX | `A9` |
|
|`UART_TX_PIN` |The pin to use for TX |`A9` |
|
||||||
| `#define UART_TX_PAL_MODE` | The alternate function mode for TX | `7` |
|
|`UART_TX_PAL_MODE` |The alternate function mode for TX |`7` |
|
||||||
| `#define UART_RX_PIN` | The pin to use for RX | `A10` |
|
|`UART_RX_PIN` |The pin to use for RX |`A10` |
|
||||||
| `#define UART_RX_PAL_MODE` | The alternate function mode for RX | `7` |
|
|`UART_RX_PAL_MODE` |The alternate function mode for RX |`7` |
|
||||||
| `#define UART_CTS_PIN` | The pin to use for CTS | `A11` |
|
|`UART_CTS_PIN` |The pin to use for CTS |`A11` |
|
||||||
| `#define UART_CTS_PAL_MODE` | The alternate function mode for CTS | `7` |
|
|`UART_CTS_PAL_MODE`|The alternate function mode for CTS |`7` |
|
||||||
| `#define UART_RTS_PIN` | The pin to use for RTS | `A12` |
|
|`UART_RTS_PIN` |The pin to use for RTS |`A12` |
|
||||||
| `#define UART_RTS_PAL_MODE` | The alternate function mode for RTS | `7` |
|
|`UART_RTS_PAL_MODE`|The alternate function mode for RTS |`7` |
|
||||||
|
|
||||||
## API {#api}
|
## API {#api}
|
||||||
|
|
||||||
@ -107,7 +111,7 @@ Receive multiple bytes.
|
|||||||
#### Arguments {#api-uart-receive-arguments}
|
#### Arguments {#api-uart-receive-arguments}
|
||||||
|
|
||||||
- `uint8_t *data`
|
- `uint8_t *data`
|
||||||
A pointer to the buffer to read into.
|
A pointer to a buffer to read into.
|
||||||
- `uint16_t length`
|
- `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`.
|
||||||
|
|
||||||
@ -119,4 +123,4 @@ Return whether the receive buffer contains data. Call this function to determine
|
|||||||
|
|
||||||
#### Return Value {#api-uart-available-return}
|
#### 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:
|
Depending on the ChibiOS board configuration, you may need to enable SPI at the keyboard level. For STM32, this would look like:
|
||||||
|
|
||||||
`halconf.h`:
|
::: code-group
|
||||||
```c
|
```c [halconf.h]
|
||||||
#define HAL_USE_SPI TRUE
|
#pragma once
|
||||||
|
|
||||||
|
#define HAL_USE_SPI TRUE // [!code focus]
|
||||||
|
|
||||||
|
#include_next <halconf.h>
|
||||||
```
|
```
|
||||||
`mcuconf.h`:
|
```c [mcuconf.h]
|
||||||
```c
|
#pragma once
|
||||||
#undef STM32_SPI_USE_SPI1
|
|
||||||
#define STM32_SPI_USE_SPI1 TRUE
|
#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:
|
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:
|
Depending on the ChibiOS board configuration, you may need to enable PWM at the keyboard level. For STM32, this would look like:
|
||||||
|
|
||||||
`halconf.h`:
|
::: code-group
|
||||||
```c
|
```c [halconf.h]
|
||||||
#define HAL_USE_PWM TRUE
|
#pragma once
|
||||||
|
|
||||||
|
#define HAL_USE_PWM TRUE // [!code focus]
|
||||||
|
|
||||||
|
#include_next <halconf.h>
|
||||||
```
|
```
|
||||||
`mcuconf.h`:
|
```c [mcuconf.h]
|
||||||
```c
|
#pragma once
|
||||||
#undef STM32_PWM_USE_TIM2
|
|
||||||
#define STM32_PWM_USE_TIM2 TRUE
|
#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:
|
The following `#define`s apply only to the `pwm` driver:
|
||||||
|
|
||||||
@ -236,18 +252,49 @@ The following `#define`s apply only to the `pwm` driver:
|
|||||||
|`WS2812_PWM_COMPLEMENTARY_OUTPUT`|*Not defined* |Whether the PWM output is complementary (`TIMx_CHyN`) |
|
|`WS2812_PWM_COMPLEMENTARY_OUTPUT`|*Not defined* |Whether the PWM output is complementary (`TIMx_CHyN`) |
|
||||||
|
|
||||||
::: tip
|
::: tip
|
||||||
Using a complementary timer output (`TIMx_CHyN`) is possible only for advanced-control timers (1, 8 and 20 on STM32), and the `STM32_PWM_USE_ADVANCED` option in `mcuconf.h` must be set to `TRUE`. Complementary outputs of general-purpose timers are not supported due to ChibiOS limitations.
|
Using a complementary timer output (`TIMx_CHyN`) is possible only for advanced-control timers (1, 8 and 20 on STM32). Complementary outputs of general-purpose timers are not supported due to ChibiOS limitations.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## API {#api}
|
## API {#api}
|
||||||
|
|
||||||
### `void ws2812_setleds(rgb_led_t *ledarray, uint16_t number_of_leds)` {#api-ws2812-setleds}
|
### `void ws2812_init(void)` {#api-ws2812-init}
|
||||||
|
|
||||||
Send RGB data to the WS2812 LED chain.
|
Initialize the LED driver. This function should be called first.
|
||||||
|
|
||||||
#### Arguments {#api-ws2812-setleds-arguments}
|
---
|
||||||
|
|
||||||
- `rgb_led_t *ledarray`
|
### `void ws2812_set_color(int index, uint8_t red, uint8_t green, uint8_t blue)` {#api-ws2812-set-color}
|
||||||
A pointer to the LED array.
|
|
||||||
- `uint16_t number_of_leds`
|
Set the color of a single LED. This function does not immediately update the LEDs; call `ws2812_flush()` after you are finished.
|
||||||
The length of the LED array.
|
|
||||||
|
#### Arguments {#api-ws2812-set-color-arguments}
|
||||||
|
|
||||||
|
- `int index`
|
||||||
|
The LED index in the WS2812 chain.
|
||||||
|
- `uint8_t red`
|
||||||
|
The red value to set.
|
||||||
|
- `uint8_t green`
|
||||||
|
The green value to set.
|
||||||
|
- `uint8_t blue`
|
||||||
|
The blue value to set.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void ws812_set_color_all(uint8_t red, uint8_t green, uint8_t blue)` {#api-ws2812-set-color-all}
|
||||||
|
|
||||||
|
Set the color of all LEDs.
|
||||||
|
|
||||||
|
#### Arguments {#api-ws2812-set-color-all-arguments}
|
||||||
|
|
||||||
|
- `uint8_t red`
|
||||||
|
The red value to set.
|
||||||
|
- `uint8_t green`
|
||||||
|
The green value to set.
|
||||||
|
- `uint8_t blue`
|
||||||
|
The blue value to set.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void ws2812_flush(void)` {#api-ws2812-flush}
|
||||||
|
|
||||||
|
Flush the PWM values to the LED chain.
|
||||||
|
@ -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
|
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?
|
### 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`
|
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
|
## Can't Get Message on Console
|
||||||
Check:
|
Check:
|
||||||
- *hid_listen* finds your device. See above.
|
- *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)
|
- Set `debug_enable=true`. See [Debugging](#debugging)
|
||||||
- Try using `print` function instead of debug print. See **common/print.h**.
|
- 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).
|
- 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` |
|
|`RCTL(kc)`| |Hold Right Control and press `kc` |
|
||||||
|`RSFT(kc)`| |Hold Right Shift and press `kc` |
|
|`RSFT(kc)`| |Hold Right Shift and press `kc` |
|
||||||
|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt 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` |
|
|`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` |
|
|`LAG(kc)` | |Hold Left Alt and Left GUI and press `kc` |
|
||||||
|`RSG(kc)` | |Hold Right Shift and Right GUI and press `kc` |
|
|`RSG(kc)` | |Hold Right Shift and Right GUI and press `kc` |
|
||||||
|
@ -21,6 +21,7 @@ The following converters are available at this time:
|
|||||||
| `promicro` | `liatris` |
|
| `promicro` | `liatris` |
|
||||||
| `promicro` | `imera` |
|
| `promicro` | `imera` |
|
||||||
| `promicro` | `michi` |
|
| `promicro` | `michi` |
|
||||||
|
| `promicro` | `svlinky` |
|
||||||
| `elite_c` | `stemcell` |
|
| `elite_c` | `stemcell` |
|
||||||
| `elite_c` | `rp2040_ce` |
|
| `elite_c` | `rp2040_ce` |
|
||||||
| `elite_c` | `elite_pi` |
|
| `elite_c` | `elite_pi` |
|
||||||
@ -87,6 +88,7 @@ If a board currently supported in QMK uses a [Pro Micro](https://www.sparkfun.co
|
|||||||
| [Liatris](https://splitkb.com/products/liatris) | `liatris` |
|
| [Liatris](https://splitkb.com/products/liatris) | `liatris` |
|
||||||
| [Imera](https://splitkb.com/products/imera) | `imera` |
|
| [Imera](https://splitkb.com/products/imera) | `imera` |
|
||||||
| [Michi](https://github.com/ci-bus/michi-promicro-rp2040) | `michi` |
|
| [Michi](https://github.com/ci-bus/michi-promicro-rp2040) | `michi` |
|
||||||
|
| [Svlinky](https://github.com/sadekbaroudi/svlinky) | `svlinky` |
|
||||||
|
|
||||||
Converter summary:
|
Converter summary:
|
||||||
|
|
||||||
@ -105,6 +107,7 @@ Converter summary:
|
|||||||
| `liatris` | `-e CONVERT_TO=liatris` | `CONVERT_TO=liatris` | `#ifdef CONVERT_TO_LIATRIS` |
|
| `liatris` | `-e CONVERT_TO=liatris` | `CONVERT_TO=liatris` | `#ifdef CONVERT_TO_LIATRIS` |
|
||||||
| `imera` | `-e CONVERT_TO=imera` | `CONVERT_TO=imera` | `#ifdef CONVERT_TO_IMERA` |
|
| `imera` | `-e CONVERT_TO=imera` | `CONVERT_TO=imera` | `#ifdef CONVERT_TO_IMERA` |
|
||||||
| `michi` | `-e CONVERT_TO=michi` | `CONVERT_TO=michi` | `#ifdef CONVERT_TO_MICHI` |
|
| `michi` | `-e CONVERT_TO=michi` | `CONVERT_TO=michi` | `#ifdef CONVERT_TO_MICHI` |
|
||||||
|
| `svlinky` | `-e CONVERT_TO=svlinky` | `CONVERT_TO=svlinky` | `#ifdef CONVERT_TO_SVLINKY` |
|
||||||
|
|
||||||
### Proton C {#proton_c}
|
### Proton C {#proton_c}
|
||||||
|
|
||||||
@ -170,6 +173,9 @@ The Bonsai C4 only has one on-board LED (B2), and by default, both the Pro Micro
|
|||||||
|
|
||||||
Feature set is identical to [Adafruit KB2040](#kb2040). VBUS detection is enabled by default for superior split keyboard support. For more information, refer to the [Community Edition pinout](platformdev_rp2040#rp2040_ce) docs.
|
Feature set is identical to [Adafruit KB2040](#kb2040). VBUS detection is enabled by default for superior split keyboard support. For more information, refer to the [Community Edition pinout](platformdev_rp2040#rp2040_ce) docs.
|
||||||
|
|
||||||
|
### Svlinky {#svlinky}
|
||||||
|
|
||||||
|
Feature set is a pro micro equivalent of the [RP2040 Community Edition](#rp2040_ce), except that two of the analog GPIO have been replaced with digital only GPIO. These two were moved to the FPC connector to support the [VIK specification](https://github.com/sadekbaroudi/vik). This means that if you are expecting analog support on all 4 pins as provided on a RP2040 Community Edition pinout, you will not have that. Please see the [Svlinky github page](https://github.com/sadekbaroudi/svlinky) for more details.
|
||||||
|
|
||||||
## Elite-C
|
## Elite-C
|
||||||
|
|
||||||
|
@ -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.
|
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.
|
* `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)`.
|
* `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.
|
* `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).
|
* `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.
|
* `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}
|
### 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.
|
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.
|
||||||
@ -74,6 +78,7 @@ There are a number of functions (and variables) related to how you can use or ma
|
|||||||
| `default_layer_and(layer_mask)` | Turns on layers based on matching enabled bits between specifed layer and existing default layer state. |
|
| `default_layer_and(layer_mask)` | Turns on layers based on matching enabled bits between specifed layer and existing default layer state. |
|
||||||
| `default_layer_xor(layer_mask)` | Turns on layers based on non-matching bits between specifed layer and existing default layer state. |
|
| `default_layer_xor(layer_mask)` | Turns on layers based on non-matching bits between specifed layer and existing default layer state. |
|
||||||
| `default_layer_debug(layer_mask)` | Prints out the current bit mask and highest active default layer to debugger console. |
|
| `default_layer_debug(layer_mask)` | Prints out the current bit mask and highest active default layer to debugger console. |
|
||||||
|
| [`set_single_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer) | Sets the default layer, but does _not_ write it to persistent memory (EEPROM). |
|
||||||
| [`set_single_persistent_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer) | Sets the default layer and writes it to persistent memory (EEPROM). |
|
| [`set_single_persistent_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer) | Sets the default layer and writes it to persistent memory (EEPROM). |
|
||||||
| [`update_tri_layer(x, y, z)`](ref_functions.md#update_tri_layerx-y-z) | Checks if layers `x` and `y` are both on, and sets `z` based on that (on if both on, otherwise off). |
|
| [`update_tri_layer(x, y, z)`](ref_functions.md#update_tri_layerx-y-z) | Checks if layers `x` and `y` are both on, and sets `z` based on that (on if both on, otherwise off). |
|
||||||
| [`update_tri_layer_state(state, x, y, z)`](ref_functions.md#update_tri_layer_statestate-x-y-z) | Does the same as `update_tri_layer(x, y, z)`, but from `layer_state_set_*` functions. |
|
| [`update_tri_layer_state(state, x, y, z)`](ref_functions.md#update_tri_layer_statestate-x-y-z) | Does the same as `update_tri_layer(x, y, z)`, but from `layer_state_set_*` functions. |
|
||||||
|
@ -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
|
### 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:
|
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).
|
||||||
|
|
||||||
```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** |
|
|
||||||
|
|
||||||
### Macro Basics
|
### 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).
|
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.
|
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 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:
|
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.
|
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`)
|
## 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:
|
Depending on the ChibiOS board configuration, you may need to enable PWM at the keyboard level. For STM32, this would look like:
|
||||||
|
|
||||||
`halconf.h`:
|
::: code-group
|
||||||
```c
|
```c [halconf.h]
|
||||||
#define HAL_USE_PWM TRUE
|
#pragma once
|
||||||
|
|
||||||
|
#define HAL_USE_PWM TRUE // [!code focus]
|
||||||
|
|
||||||
|
#include_next <halconf.h>
|
||||||
```
|
```
|
||||||
`mcuconf.h`:
|
```c [mcuconf.h]
|
||||||
```c
|
#pragma once
|
||||||
#undef STM32_PWM_USE_TIM4
|
|
||||||
#define STM32_PWM_USE_TIM4 TRUE
|
#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:
|
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:
|
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`:
|
::: code-group
|
||||||
```c
|
```c [halconf.h]
|
||||||
#define HAL_USE_GPT TRUE
|
#pragma once
|
||||||
|
|
||||||
|
#define HAL_USE_GPT TRUE // [!code focus]
|
||||||
|
|
||||||
|
#include_next <halconf.h>
|
||||||
```
|
```
|
||||||
`mcuconf.h`:
|
```c [mcuconf.h]
|
||||||
```c
|
#pragma once
|
||||||
#undef STM32_GPT_USE_TIM15
|
|
||||||
#define STM32_GPT_USE_TIM15 TRUE
|
#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:
|
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_AUTO` |`OU_AUTO`|Automatically switch between USB and Bluetooth|
|
|
||||||
|`QK_OUTPUT_USB` |`OU_USB` |USB only |
|
|
||||||
|`QK_OUTPUT_BLUETOOTH`|`OU_BT` |Bluetooth only |
|
|
@ -152,14 +152,15 @@ In order to use these features, the following configuration options and function
|
|||||||
|
|
||||||
| Config Flag | Function | Description |
|
| Config Flag | Function | Description |
|
||||||
|-----------------------------|-----------------------------------------------------------|--------------------------------------------------------------------------------------------------------|
|
|-----------------------------|-----------------------------------------------------------|--------------------------------------------------------------------------------------------------------|
|
||||||
| `COMBO_TERM_PER_COMBO` | uint16_t get_combo_term(uint16_t index, combo_t \*combo) | Optional per-combo timeout window. (default: `COMBO_TERM`) |
|
| `COMBO_TERM_PER_COMBO` | `uint16_t get_combo_term(uint16_t combo_index, combo_t *combo)` | Optional per-combo timeout window. (default: `COMBO_TERM`) |
|
||||||
| `COMBO_MUST_HOLD_PER_COMBO` | bool get_combo_must_hold(uint16_t index, combo_t \*combo) | Controls if a given combo should fire immediately on tap or if it needs to be held. (default: `false`) |
|
| `COMBO_MUST_HOLD_PER_COMBO` | `bool get_combo_must_hold(uint16_t combo_index, combo_t *combo)` | Controls if a given combo should fire immediately on tap or if it needs to be held. (default: `false`) |
|
||||||
| `COMBO_MUST_TAP_PER_COMBO` | bool get_combo_must_tap(uint16_t index, combo_t \*combo) | Controls if a given combo should fire only if tapped within `COMBO_HOLD_TERM`. (default: `false`) |
|
| `COMBO_MUST_TAP_PER_COMBO` | `bool get_combo_must_tap(uint16_t combo_index, combo_t *combo)` | Controls if a given combo should fire only if tapped within `COMBO_HOLD_TERM`. (default: `false`) |
|
||||||
| `COMBO_MUST_PRESS_IN_ORDER_PER_COMBO` | bool get_combo_must_press_in_order(uint16_t index, combo_t \*combo) | Controls if a given combo should fire only if its keys are pressed in order. (default: `true`) |
|
| `COMBO_MUST_PRESS_IN_ORDER_PER_COMBO` | `bool get_combo_must_press_in_order(uint16_t combo_index, combo_t *combo)` | Controls if a given combo should fire only if its keys are pressed in order. (default: `true`) |
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
```c
|
```c
|
||||||
uint16_t get_combo_term(uint16_t index, combo_t *combo) {
|
#ifdef COMBO_TERM_PER_COMBO
|
||||||
|
uint16_t get_combo_term(uint16_t combo_index, combo_t *combo) {
|
||||||
// decide by combo->keycode
|
// decide by combo->keycode
|
||||||
switch (combo->keycode) {
|
switch (combo->keycode) {
|
||||||
case KC_X:
|
case KC_X:
|
||||||
@ -167,7 +168,7 @@ uint16_t get_combo_term(uint16_t index, combo_t *combo) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// or with combo index, i.e. its name from enum.
|
// or with combo index, i.e. its name from enum.
|
||||||
switch (index) {
|
switch (combo_index) {
|
||||||
case COMBO_NAME_HERE:
|
case COMBO_NAME_HERE:
|
||||||
return 9001;
|
return 9001;
|
||||||
}
|
}
|
||||||
@ -182,8 +183,10 @@ uint16_t get_combo_term(uint16_t index, combo_t *combo) {
|
|||||||
|
|
||||||
return COMBO_TERM;
|
return COMBO_TERM;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bool get_combo_must_hold(uint16_t index, combo_t *combo) {
|
#ifdef COMBO_MUST_HOLD_PER_COMBO
|
||||||
|
bool get_combo_must_hold(uint16_t combo_index, combo_t *combo) {
|
||||||
// Same as above, decide by keycode, the combo index, or by the keys in the chord.
|
// Same as above, decide by keycode, the combo index, or by the keys in the chord.
|
||||||
|
|
||||||
if (KEYCODE_IS_MOD(combo->keycode) ||
|
if (KEYCODE_IS_MOD(combo->keycode) ||
|
||||||
@ -192,15 +195,17 @@ bool get_combo_must_hold(uint16_t index, combo_t *combo) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (index) {
|
switch (combo_index) {
|
||||||
case COMBO_NAME_HERE:
|
case COMBO_NAME_HERE:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bool get_combo_must_tap(uint16_t index, combo_t *combo) {
|
#ifdef COMBO_MUST_TAP_PER_COMBO
|
||||||
|
bool get_combo_must_tap(uint16_t combo_index, combo_t *combo) {
|
||||||
// If you want all combos to be tap-only, just uncomment the next line
|
// If you want all combos to be tap-only, just uncomment the next line
|
||||||
// return true
|
// return true
|
||||||
|
|
||||||
@ -219,7 +224,9 @@ bool get_combo_must_tap(uint16_t index, combo_t *combo) {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef COMBO_MUST_PRESS_IN_ORDER_PER_COMBO
|
||||||
bool get_combo_must_press_in_order(uint16_t combo_index, combo_t *combo) {
|
bool get_combo_must_press_in_order(uint16_t combo_index, combo_t *combo) {
|
||||||
switch (combo_index) {
|
switch (combo_index) {
|
||||||
/* List combos here that you want to only activate if their keys
|
/* List combos here that you want to only activate if their keys
|
||||||
@ -231,6 +238,7 @@ bool get_combo_must_press_in_order(uint16_t combo_index, combo_t *combo) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
```
|
```
|
||||||
|
|
||||||
### Generic hook to (dis)allow a combo activation
|
### Generic hook to (dis)allow a combo activation
|
||||||
@ -307,6 +315,50 @@ bool process_combo_key_release(uint16_t combo_index, combo_t *combo, uint8_t key
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Customizable key repress
|
||||||
|
By defining `COMBO_PROCESS_KEY_REPRESS` and implementing `bool process_combo_key_repress(uint16_t combo_index, combo_t *combo, uint8_t key_index, uint16_t keycode)` you can run your custom code when you repress just released key of a combo. By combining it with custom `process_combo_event` we can for example make special handling for Alt+Tab to switch windows, which, on combo F+G activation, registers Alt and presses Tab - then we can switch windows forward by releasing G and pressing it again, or backwards with F key. Here's the full example:
|
||||||
|
|
||||||
|
```c
|
||||||
|
enum combos {
|
||||||
|
CMB_ALTTAB
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM combo_alttab[] = {KC_F, KC_G, COMBO_END};
|
||||||
|
|
||||||
|
combo_t key_combos[COMBO_LENGTH] = {
|
||||||
|
[CMB_ALTTAB] = COMBO(combo_alttab, KC_NO), // KC_NO to leave processing for process_combo_event
|
||||||
|
};
|
||||||
|
|
||||||
|
void process_combo_event(uint16_t combo_index, bool pressed) {
|
||||||
|
switch (combo_index) {
|
||||||
|
case CMB_ALTTAB:
|
||||||
|
if (pressed) {
|
||||||
|
register_mods(MOD_LALT);
|
||||||
|
tap_code(KC_TAB);
|
||||||
|
} else {
|
||||||
|
unregister_mods(MOD_LALT);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool process_combo_key_repress(uint16_t combo_index, combo_t *combo, uint8_t key_index, uint16_t keycode) {
|
||||||
|
switch (combo_index) {
|
||||||
|
case CMB_ALTTAB:
|
||||||
|
switch (keycode) {
|
||||||
|
case KC_F:
|
||||||
|
tap_code16(S(KC_TAB));
|
||||||
|
return true;
|
||||||
|
case KC_G:
|
||||||
|
tap_code(KC_TAB);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Layer independent combos
|
### Layer independent combos
|
||||||
|
|
||||||
If you, for example, use multiple base layers for different key layouts, one for QWERTY, and another one for Colemak, you might want your combos to work from the same key positions on all layers. Defining the same combos again for another layout is redundant and takes more memory. The solution is to just check the keycodes from one layer.
|
If you, for example, use multiple base layers for different key layouts, one for QWERTY, and another one for Colemak, you might want your combos to work from the same key positions on all layers. Defining the same combos again for another layout is redundant and takes more memory. The solution is to just check the keycodes from one layer.
|
||||||
|
164
docs/features/community_modules.md
Normal file
164
docs/features/community_modules.md
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
# 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).
|
||||||
|
:::
|
||||||
|
|
||||||
|
### `led_matrix_module.inc`
|
||||||
|
|
||||||
|
This file defines LED matrix effects in the same form as used with `led_matrix_kb.inc` and `led_matrix_user.inc` (see [Custom LED Matrix Effects](led_matrix#custom-led-matrix-effects)). Effect mode names are prepended with `LED_MATRIX_COMMUNITY_MODULE_`.
|
||||||
|
|
||||||
|
### `rgb_matrix_module.inc`
|
||||||
|
|
||||||
|
This file defines RGB matrix effects in the same form as used with `rgb_matrix_kb.inc` and `rgb_matrix_user.inc` (see [Custom RGB Matrix Effects](rgb_matrix#custom-rgb-matrix-effects)). Effect mode names are prepended with `RGB_MATRIX_COMMUNITY_MODULE_`.
|
||||||
|
|
||||||
|
### Compatible APIs
|
||||||
|
|
||||||
|
Community Modules may provide specializations for the following APIs:
|
||||||
|
|
||||||
|
| 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` |
|
||||||
|
| `default_layer_state_set` | `default_layer_state_set_<module>` | `default_layer_state_set_hello_world` | `1.1.0` |
|
||||||
|
| `layer_state_set` | `layer_state_set_<module>` | `layer_state_set_hello_world` | `1.1.0` |
|
||||||
|
| `led_matrix_indicators` | `led_matrix_indicators_<module>` | `led_matrix_indicators_hello_world` | `1.1.0` |
|
||||||
|
| `led_matrix_indicators_advanced` | `led_matrix_indicators_advanced_<module>` | `led_matrix_indicators_advanced_hello_world` | `1.1.0` |
|
||||||
|
| `rgb_matrix_indicators` | `rgb_matrix_indicators_<module>` | `rgb_matrix_indicators_hello_world` | `1.1.0` |
|
||||||
|
| `rgb_matrix_indicators_advanced` | `rgb_matrix_indicators_advanced_<module>` | `rgb_matrix_indicators_advanced_hello_world` | `1.1.0` |
|
||||||
|
| `pointing_device_init` | `pointing_device_init_<module>` | `pointing_device_init_hello_world` | `1.1.0` |
|
||||||
|
| `pointing_device_task` | `pointing_device_task_<module>` | `pointing_device_task_hello_world` | `1.1.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}
|
# 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.
|
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.
|
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}
|
### Axes {#axes}
|
||||||
|
|
||||||
When defining axes for your joystick, you must provide a definition array typically in your `keymap.c`.
|
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`.
|
A bit-packed array containing the joystick button states. The size is calculated as `(JOYSTICK_BUTTON_COUNT - 1) / 8 + 1`.
|
||||||
- `int16_t axes[]`
|
- `int16_t axes[]`
|
||||||
An array of analog values for each defined axis.
|
An array of analog values for each defined axis.
|
||||||
|
- `int8_t hat`
|
||||||
|
The hat switch position.
|
||||||
- `bool dirty`
|
- `bool dirty`
|
||||||
Whether the current state needs to be sent to the host.
|
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.
|
The axis to set the value of.
|
||||||
- `int16_t value`
|
- `int16_t value`
|
||||||
The value to set.
|
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}
|
### `void leader_start(void)` {#api-leader-start}
|
||||||
|
|
||||||
Begin the leader sequence, resetting the buffer and timer.
|
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_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_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_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_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.
|
#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
|
// 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_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)|
|
|`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
|
## Use with PS/2 Mouse and Pointing Device
|
||||||
|
|
||||||
|
@ -70,17 +70,33 @@ The process is done in steps, generating a number of intermediate results until
|
|||||||
We therefore resort to debouncing the result until it has been stable for a given amount of milliseconds.
|
We therefore resort to debouncing the result until it has been stable for a given amount of milliseconds.
|
||||||
This amount can be configured, in case your board is not stable within the default debouncing time of 200ms.
|
This amount can be configured, in case your board is not stable within the default debouncing time of 200ms.
|
||||||
|
|
||||||
## KVM and USB switches
|
|
||||||
|
|
||||||
Some KVM and USB switches may not trigger the USB controller on the keyboard to fully reset upon switching machines.
|
|
||||||
If your keyboard does not redetect the OS in this situation, you can force the keyboard to reset when the USB initialization event is detected, forcing the USB controller to be reconfigured.
|
|
||||||
|
|
||||||
## Configuration Options
|
## Configuration Options
|
||||||
|
|
||||||
* `#define OS_DETECTION_DEBOUNCE 200`
|
* `#define OS_DETECTION_DEBOUNCE 250`
|
||||||
* defined the debounce time for OS detection, in milliseconds
|
* defined the debounce time for OS detection, in milliseconds
|
||||||
|
* defaults to 250ms
|
||||||
* `#define OS_DETECTION_KEYBOARD_RESET`
|
* `#define OS_DETECTION_KEYBOARD_RESET`
|
||||||
* enables the keyboard reset upon a USB device reinitilization, such as switching devices on some KVMs
|
* enables the keyboard reset upon a USB device reinitilization
|
||||||
|
* this setting may help with detection issues when switching between devices on some KVMs (see [Troubleshooting](#troubleshooting))
|
||||||
|
* `#define OS_DETECTION_SINGLE_REPORT`
|
||||||
|
* allows the report callbacks to be called only once, when the OS detection result is considered stable
|
||||||
|
* subsequent changes in the detection results, if any, are ignored
|
||||||
|
* this setting may help with delayed stability issues when switching devices on some KVMs (see [Troubleshooting](#troubleshooting))
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
Some KVMs and USB switches may cause issues when the OS detection is turned on.
|
||||||
|
Here is a list of common issues and how to fix them:
|
||||||
|
|
||||||
|
* **Problem**: _keyboard won't redetect the OS when switching between machines using a KVM_
|
||||||
|
* **Explanation**: some KVMs keep the USB controller powered on during the switch and OS
|
||||||
|
detection happens when the USB device description is being assembled.
|
||||||
|
* **Solution**: use `OS_DETECTION_KEYBOARD_RESET` to force the keyboard to reset upon switching.
|
||||||
|
* **Problem**: _keyboard OS detection callback gets invoked even minuted after startup_
|
||||||
|
* **Explanation**: some OSes, notably macOS on ARM-based Macs, may cause this behavior.
|
||||||
|
The actual cause is not known at this time.'
|
||||||
|
* **Solution**: use `OS_DETECTION_SINGLE_REPORT` to suppress repeated callback invocations.
|
||||||
|
|
||||||
|
|
||||||
## Debug
|
## Debug
|
||||||
|
|
||||||
|
@ -394,6 +394,7 @@ Ideally, new sensor hardware should be added to `drivers/sensors/` and `quantum/
|
|||||||
| Setting | Description | Default |
|
| Setting | Description | Default |
|
||||||
| ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------- |
|
| ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------- |
|
||||||
| `MOUSE_EXTENDED_REPORT` | (Optional) Enables support for extended mouse reports. (-32767 to 32767, instead of just -127 to 127). | _not defined_ |
|
| `MOUSE_EXTENDED_REPORT` | (Optional) Enables support for extended mouse reports. (-32767 to 32767, instead of just -127 to 127). | _not defined_ |
|
||||||
|
| `WHEEL_EXTENDED_REPORT` | (Optional) Enables support for extended wheel reports. (-32767 to 32767, instead of just -127 to 127). | _not defined_ |
|
||||||
| `POINTING_DEVICE_ROTATION_90` | (Optional) Rotates the X and Y data by 90 degrees. | _not defined_ |
|
| `POINTING_DEVICE_ROTATION_90` | (Optional) Rotates the X and Y data by 90 degrees. | _not defined_ |
|
||||||
| `POINTING_DEVICE_ROTATION_180` | (Optional) Rotates the X and Y data by 180 degrees. | _not defined_ |
|
| `POINTING_DEVICE_ROTATION_180` | (Optional) Rotates the X and Y data by 180 degrees. | _not defined_ |
|
||||||
| `POINTING_DEVICE_ROTATION_270` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ |
|
| `POINTING_DEVICE_ROTATION_270` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ |
|
||||||
@ -418,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.
|
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
|
## 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.
|
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
|
PS2_DRIVER = interrupt
|
||||||
```
|
```
|
||||||
|
|
||||||
In your keyboard config.h:
|
In your keyboard `config.h`:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define PS2_CLOCK_PIN A8
|
#define PS2_CLOCK_PIN A8
|
||||||
#define PS2_DATA_PIN A9
|
#define PS2_DATA_PIN A9
|
||||||
```
|
```
|
||||||
|
|
||||||
And in the chibios specifig halconf.h:
|
And in the ChibiOS specific `halconf.h`:
|
||||||
```c
|
|
||||||
#define PAL_USE_CALLBACKS TRUE
|
|
||||||
```
|
|
||||||
|
|
||||||
|
```c
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define PAL_USE_CALLBACKS TRUE // [!code focus]
|
||||||
|
|
||||||
|
#include_next <halconf.h>
|
||||||
|
```
|
||||||
|
|
||||||
### USART Version {#usart-version}
|
### USART Version {#usart-version}
|
||||||
|
|
||||||
|
@ -81,38 +81,21 @@ As mentioned earlier, the center of the keyboard by default is expected to be `{
|
|||||||
|
|
||||||
## Keycodes {#keycodes}
|
## Keycodes {#keycodes}
|
||||||
|
|
||||||
All RGB keycodes are currently shared with the RGBLIGHT system:
|
|
||||||
|
|
||||||
|Key |Aliases |Description |
|
|Key |Aliases |Description |
|
||||||
|-------------------|----------|--------------------------------------------------------------------------------------|
|
|-------------------------------|---------|-----------------------------------|
|
||||||
|`RGB_TOG` | |Toggle RGB lighting on or off |
|
|`QK_RGB_MATRIX_ON` |`RM_ON` |Turn on RGB Matrix |
|
||||||
|`RGB_MODE_FORWARD` |`RGB_MOD` |Cycle through modes, reverse direction when Shift is held |
|
|`QK_RGB_MATRIX_OFF` |`RM_OFF` |Turn off RGB Matrix |
|
||||||
|`RGB_MODE_REVERSE` |`RGB_RMOD`|Cycle through modes in reverse, forward direction when Shift is held |
|
|`QK_RGB_MATRIX_TOGGLE` |`RM_TOGG`|Toggle RGB Matrix on or off |
|
||||||
|`RGB_HUI` | |Increase hue, decrease hue when Shift is held |
|
|`QK_RGB_MATRIX_MODE_NEXT` |`RM_NEXT`|Cycle through animations |
|
||||||
|`RGB_HUD` | |Decrease hue, increase hue when Shift is held |
|
|`QK_RGB_MATRIX_MODE_PREVIOUS` |`RM_PREV`|Cycle through animations in reverse|
|
||||||
|`RGB_SAI` | |Increase saturation, decrease saturation when Shift is held |
|
|`QK_RGB_MATRIX_HUE_UP` |`RM_HUEU`|Cycle through hue |
|
||||||
|`RGB_SAD` | |Decrease saturation, increase saturation when Shift is held |
|
|`QK_RGB_MATRIX_HUE_DOWN` |`RM_HUED`|Cycle through hue in reverse |
|
||||||
|`RGB_VAI` | |Increase value (brightness), decrease value when Shift is held |
|
|`QK_RGB_MATRIX_SATURATION_UP` |`RM_SATU`|Increase the saturation |
|
||||||
|`RGB_VAD` | |Decrease value (brightness), increase value when Shift is held |
|
|`QK_RGB_MATRIX_SATURATION_DOWN`|`RM_SATD`|Decrease the saturation |
|
||||||
|`RGB_SPI` | |Increase effect speed (does not support eeprom yet), decrease speed when Shift is held|
|
|`QK_RGB_MATRIX_VALUE_UP` |`RM_VALU`|Increase the brightness level |
|
||||||
|`RGB_SPD` | |Decrease effect speed (does not support eeprom yet), increase speed when Shift is held|
|
|`QK_RGB_MATRIX_VALUE_DOWN` |`RM_VALD`|Decrease the brightness level |
|
||||||
|`RGB_MODE_PLAIN` |`RGB_M_P` |Static (no animation) mode |
|
|`QK_RGB_MATRIX_SPEED_UP` |`RM_SPDU`|Increase the animation speed |
|
||||||
|`RGB_MODE_BREATHE` |`RGB_M_B` |Breathing animation mode |
|
|`QK_RGB_MATRIX_SPEED_DOWN` |`RM_SPDD`|Decrease the animation speed |
|
||||||
|`RGB_MODE_RAINBOW` |`RGB_M_R` |Full gradient scrolling left to right (uses the `RGB_MATRIX_CYCLE_LEFT_RIGHT` mode) |
|
|
||||||
|`RGB_MODE_SWIRL` |`RGB_M_SW`|Full gradient spinning pinwheel around center of keyboard (uses `RGB_MATRIX_CYCLE_PINWHEEL` mode) |
|
|
||||||
|
|
||||||
* `RGB_MODE_*` keycodes will generally work, but not all of the modes are currently mapped to the correct effects for the RGB Matrix system.
|
|
||||||
|
|
||||||
`RGB_MODE_PLAIN`, `RGB_MODE_BREATHE`, `RGB_MODE_RAINBOW`, and `RGB_MODE_SWIRL` are the only ones that are mapped properly. The rest don't have a direct equivalent, and are not mapped.
|
|
||||||
|
|
||||||
::: tip
|
|
||||||
`RGB_*` keycodes cannot be used with functions like `tap_code16(RGB_HUD)` as they're not USB HID keycodes. If you wish to replicate similar behaviour in custom code within your firmware (e.g. inside `encoder_update_user()` or `process_record_user()`), the equivalent [RGB functions](#functions) should be used instead.
|
|
||||||
:::
|
|
||||||
|
|
||||||
|
|
||||||
::: warning
|
|
||||||
By default, if you have both the [RGB Light](rgblight) and the RGB Matrix feature enabled, these keycodes will work for both features, at the same time. You can disable the keycode functionality by defining the `*_DISABLE_KEYCODES` option for the specific feature.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## RGB Matrix Effects {#rgb-matrix-effects}
|
## RGB Matrix Effects {#rgb-matrix-effects}
|
||||||
|
|
||||||
@ -167,6 +150,7 @@ enum rgb_matrix_effects {
|
|||||||
RGB_MATRIX_SOLID_SPLASH, // Hue & value pulse away from a single key hit then fades value out
|
RGB_MATRIX_SOLID_SPLASH, // Hue & value pulse away from a single key hit then fades value out
|
||||||
RGB_MATRIX_SOLID_MULTISPLASH, // Hue & value pulse away from multiple key hits then fades value out
|
RGB_MATRIX_SOLID_MULTISPLASH, // Hue & value pulse away from multiple key hits then fades value out
|
||||||
RGB_MATRIX_STARLIGHT, // LEDs turn on and off at random at varying brightness, maintaining user set color
|
RGB_MATRIX_STARLIGHT, // LEDs turn on and off at random at varying brightness, maintaining user set color
|
||||||
|
RGB_MATRIX_STARLIGHT_SMOOTH, // LEDs slowly increase and decrease in brightness randomly
|
||||||
RGB_MATRIX_STARLIGHT_DUAL_HUE, // LEDs turn on and off at random at varying brightness, modifies user set hue by +- 30
|
RGB_MATRIX_STARLIGHT_DUAL_HUE, // LEDs turn on and off at random at varying brightness, modifies user set hue by +- 30
|
||||||
RGB_MATRIX_STARLIGHT_DUAL_SAT, // LEDs turn on and off at random at varying brightness, modifies user set saturation by +- 30
|
RGB_MATRIX_STARLIGHT_DUAL_SAT, // LEDs turn on and off at random at varying brightness, modifies user set saturation by +- 30
|
||||||
RGB_MATRIX_RIVERFLOW, // Modification to breathing animation, offset's animation depending on key location to simulate a river flowing
|
RGB_MATRIX_RIVERFLOW, // Modification to breathing animation, offset's animation depending on key location to simulate a river flowing
|
||||||
@ -210,6 +194,7 @@ You can enable a single effect by defining `ENABLE_[EFFECT_NAME]` in your `confi
|
|||||||
|`#define ENABLE_RGB_MATRIX_PIXEL_FLOW` |Enables `RGB_MATRIX_PIXEL_FLOW` |
|
|`#define ENABLE_RGB_MATRIX_PIXEL_FLOW` |Enables `RGB_MATRIX_PIXEL_FLOW` |
|
||||||
|`#define ENABLE_RGB_MATRIX_PIXEL_RAIN` |Enables `RGB_MATRIX_PIXEL_RAIN` |
|
|`#define ENABLE_RGB_MATRIX_PIXEL_RAIN` |Enables `RGB_MATRIX_PIXEL_RAIN` |
|
||||||
|`#define ENABLE_RGB_MATRIX_STARLIGHT` |Enables `RGB_MATRIX_STARLIGHT` |
|
|`#define ENABLE_RGB_MATRIX_STARLIGHT` |Enables `RGB_MATRIX_STARLIGHT` |
|
||||||
|
|`#define ENABLE_RGB_MATRIX_STARLIGHT_SMOOTH` |Enables `RGB_MATRIX_STARLIGHT_SMOOTH` |
|
||||||
|`#define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_HUE` |Enables `RGB_MATRIX_STARLIGHT_DUAL_HUE` |
|
|`#define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_HUE` |Enables `RGB_MATRIX_STARLIGHT_DUAL_HUE` |
|
||||||
|`#define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_SAT` |Enables `RGB_MATRIX_STARLIGHT_DUAL_SAT` |
|
|`#define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_SAT` |Enables `RGB_MATRIX_STARLIGHT_DUAL_SAT` |
|
||||||
|`#define ENABLE_RGB_MATRIX_RIVERFLOW` |Enables `RGB_MATRIX_RIVERFLOW` |
|
|`#define ENABLE_RGB_MATRIX_RIVERFLOW` |Enables `RGB_MATRIX_RIVERFLOW` |
|
||||||
@ -289,7 +274,7 @@ Solid reactive effects will pulse RGB light on key presses with user configurabl
|
|||||||
#define RGB_MATRIX_SOLID_REACTIVE_GRADIENT_MODE
|
#define RGB_MATRIX_SOLID_REACTIVE_GRADIENT_MODE
|
||||||
```
|
```
|
||||||
|
|
||||||
Gradient mode will loop through the color wheel hues over time and its duration can be controlled with the effect speed keycodes (`RGB_SPI`/`RGB_SPD`).
|
Gradient mode will loop through the color wheel hues over time and its duration can be controlled with the effect speed keycodes (`RM_SPDU`/`RM_SPDD`).
|
||||||
|
|
||||||
## Custom RGB Matrix Effects {#custom-rgb-matrix-effects}
|
## Custom RGB Matrix Effects {#custom-rgb-matrix-effects}
|
||||||
|
|
||||||
@ -395,8 +380,11 @@ 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_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_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_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_DEFAULT_FLAGS LED_FLAG_ALL // Sets the default LED flags, if none has been set
|
||||||
#define RGB_MATRIX_DISABLE_KEYCODES // disables control of rgb matrix by keycodes (must use code functions to control the feature)
|
|
||||||
#define RGB_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
|
#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
|
// If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
|
||||||
#define RGB_TRIGGER_ON_KEYDOWN // Triggers RGB keypress events on key down. This makes RGB control feel more responsive. This may cause RGB to not function properly on some boards
|
#define RGB_TRIGGER_ON_KEYDOWN // Triggers RGB keypress events on key down. This makes RGB control feel more responsive. This may cause RGB to not function properly on some boards
|
||||||
@ -496,18 +484,18 @@ This example sets the modifiers to be a specific color based on the layer state.
|
|||||||
|
|
||||||
```c
|
```c
|
||||||
bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
|
bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
|
||||||
HSV hsv = {0, 255, 255};
|
hsv_t hsv = {0, 255, 255};
|
||||||
|
|
||||||
if (layer_state_is(layer_state, 2)) {
|
if (layer_state_is(layer_state, 2)) {
|
||||||
hsv = (HSV){130, 255, 255};
|
hsv = (hsv_t){130, 255, 255};
|
||||||
} else {
|
} else {
|
||||||
hsv = (HSV){30, 255, 255};
|
hsv = (hsv_t){30, 255, 255};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hsv.v > rgb_matrix_get_val()) {
|
if (hsv.v > rgb_matrix_get_val()) {
|
||||||
hsv.v = rgb_matrix_get_val();
|
hsv.v = rgb_matrix_get_val();
|
||||||
}
|
}
|
||||||
RGB rgb = hsv_to_rgb(hsv);
|
rgb_t rgb = hsv_to_rgb(hsv);
|
||||||
|
|
||||||
for (uint8_t i = led_min; i < led_max; i++) {
|
for (uint8_t i = led_min; i < led_max; i++) {
|
||||||
if (HAS_FLAGS(g_led_config.flags[i], 0x01)) { // 0x01 == LED_FLAG_MODIFIER
|
if (HAS_FLAGS(g_led_config.flags[i], 0x01)) { // 0x01 == LED_FLAG_MODIFIER
|
||||||
@ -873,13 +861,13 @@ Set the global effect hue, saturation, and value (brightness). New state is not
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### `HSV rgb_matrix_get_hsv(void)` {#api-rgb-matrix-get-hsv}
|
### `hsv_t rgb_matrix_get_hsv(void)` {#api-rgb-matrix-get-hsv}
|
||||||
|
|
||||||
Get the current global effect hue, saturation, and value (brightness).
|
Get the current global effect hue, saturation, and value (brightness).
|
||||||
|
|
||||||
#### Return Value {#api-rgb-matrix-get-hsv-return}
|
#### Return Value {#api-rgb-matrix-get-hsv-return}
|
||||||
|
|
||||||
The current effect HSV as an `HSV` struct.
|
The current effect HSV as an `hsv_t` struct.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user