diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
deleted file mode 100644
index 81561eaba6..0000000000
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ /dev/null
@@ -1,36 +0,0 @@
----
-name: Bug report
-about: Create a report to help us improve QMK Firmware.
-title: "[Bug] "
-labels: bug, help wanted
-assignees: ''
-
----
-
-
-
-
-
-
-## Describe the Bug
-
-
-
-## System Information
-
-**Keyboard:**
-**Revision (if applicable):**
-**Operating system:**
-**`qmk doctor` output:**
-```
-(Paste output here)
-```
-
-**Any keyboard related software installed?**
- - [ ] AutoHotKey (Windows)
- - [ ] Karabiner (macOS)
- - [ ] Other:
-
-## Additional Context
-
-
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
new file mode 100644
index 0000000000..a5d185e1dd
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -0,0 +1,41 @@
+name: Bug report
+description: Create a report to help us improve QMK Firmware.
+title: "[Bug] "
+labels: ["bug", "help wanted"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Provide a general summary of the bug in the title above.
+ - type: textarea
+ attributes:
+ label: Describe the Bug
+ description: A clear and concise description of what the bug is.
+ - type: input
+ attributes:
+ label: Keyboard Used
+ description: The name of the keyboard from the `make` or `qmk compile`/`qmk flash` commands, eg. `planck/rev6`.
+ - type: input
+ attributes:
+ label: Link to product page (if applicable)
+ - type: input
+ attributes:
+ label: Operating System
+ - type: textarea
+ attributes:
+ label: qmk doctor Output
+ description: Output from running the `qmk doctor` command.
+ render: text
+ - type: checkboxes
+ attributes:
+ label: Is AutoHotKey / Karabiner installed
+ options:
+ - label: AutoHotKey (Windows)
+ - label: Karabiner (macOS)
+ - type: input
+ attributes:
+ label: Other keyboard-related software installed
+ - type: textarea
+ attributes:
+ label: Additional Context
+ description: Add any other relevant information about the problem here.
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
deleted file mode 100644
index 1876834247..0000000000
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-name: Feature request
-about: Suggest a new feature or changes to existing features.
-title: "[Feature Request] "
-labels: enhancement, help wanted
-assignees: ''
-
----
-
-
-
-
-
-
-## Feature Request Type
-
-- [ ] Core functionality
-- [ ] Add-on hardware support (eg. audio, RGB, OLED screen, etc.)
-- [ ] Alteration (enhancement/optimization) of existing feature(s)
-- [ ] New behavior
-
-## Description
-
-
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
new file mode 100644
index 0000000000..585bcf2e6f
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -0,0 +1,21 @@
+name: Feature request
+description: Suggest a new feature or changes to existing features.
+title: "[Feature Request] "
+labels: ["enhancement", "help wanted"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Provide a general summary of the changes you want in the title above.
+ - type: checkboxes
+ attributes:
+ label: Feature Request Type
+ options:
+ - label: Core functionality
+ - label: Add-on hardware support (eg. audio, RGB, OLED screen, etc.)
+ - label: Alteration (enhancement/optimization) of existing feature(s)
+ - label: New behavior
+ - type: textarea
+ attributes:
+ label: Description
+ description: A few sentences describing what it is that you'd like to see in QMK. Additional information (such as links to spec sheets, licensing info, other related issues or PRs, etc) would be helpful.
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/other_issues.md b/.github/ISSUE_TEMPLATE/other_issues.md
deleted file mode 100644
index befeeb165a..0000000000
--- a/.github/ISSUE_TEMPLATE/other_issues.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-name: Other issues
-about: Anything else that doesn't fall into the above categories.
-title: ''
-labels: help wanted, question
-assignees: ''
-
----
-
-
-
-
-
-
diff --git a/.github/ISSUE_TEMPLATE/other_issues.yml b/.github/ISSUE_TEMPLATE/other_issues.yml
new file mode 100644
index 0000000000..7c4fbeb23c
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/other_issues.yml
@@ -0,0 +1,16 @@
+name: Other issues
+description: Anything else that doesn't fall into the above categories.
+labels: ["help wanted", "question"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Provide a general summary of the changes you want in the title above.
+ - type: markdown
+ attributes:
+ value: |
+ Please check [https://docs.qmk.fm/#/support](https://docs.qmk.fm/#/support) for additional resources first. If that doesn't answer your question, choose the bug report template instead, as that may be more appropriate.
+ - type: textarea
+ attributes:
+ label: Issue Description
+ description: Describe your issue in as much detail as possible.
\ No newline at end of file
diff --git a/.github/workflows/api.yml b/.github/workflows/api.yml
index 9d850080a6..0cff4f6e75 100644
--- a/.github/workflows/api.yml
+++ b/.github/workflows/api.yml
@@ -4,9 +4,13 @@ on:
push:
branches:
- master
+ - develop
paths:
- 'keyboards/**'
- 'layouts/community/**'
+ - 'lib/python/**'
+ - 'data/**'
+ - '.github/workflows/api.yml'
workflow_dispatch:
jobs:
@@ -14,7 +18,7 @@ jobs:
runs-on: ubuntu-latest
container: qmkfm/qmk_cli
- # protect against those who develop with their fork on master
+ # protect against those who work in their fork on 'important' branches
if: github.repository == 'qmk/qmk_firmware'
steps:
@@ -23,15 +27,20 @@ jobs:
fetch-depth: 1
persist-credentials: false
+ - name: Install dependencies
+ run: |
+ pip3 install -r requirements-dev.txt
+
- name: Generate API Data
- run: qmk generate-api
+ run: |
+ qmk generate-api
- name: Upload API Data
uses: jakejarvis/s3-sync-action@master
with:
args: --acl public-read --follow-symlinks --delete
env:
- AWS_S3_BUCKET: ${{ secrets.API_SPACE_MASTER }}
+ AWS_S3_BUCKET: ${{ github.ref == 'refs/heads/develop' && secrets['API_SPACE_DEVELOP'] || secrets['API_SPACE_MASTER'] }}
AWS_ACCESS_KEY_ID: ${{ secrets.SPACES_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET_KEY }}
AWS_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
diff --git a/.github/workflows/auto_tag.yml b/.github/workflows/auto_tag.yml
index aa6576947c..b858d492a6 100644
--- a/.github/workflows/auto_tag.yml
+++ b/.github/workflows/auto_tag.yml
@@ -27,7 +27,7 @@ jobs:
fetch-depth: 0
- name: Bump version and push tag
- uses: anothrNick/github-tag-action@1.39.0
+ uses: anothrNick/github-tag-action@1.52.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DEFAULT_BUMP: 'patch'
diff --git a/.github/workflows/develop_api.yml b/.github/workflows/develop_api.yml
deleted file mode 100644
index ebc1b545b7..0000000000
--- a/.github/workflows/develop_api.yml
+++ /dev/null
@@ -1,40 +0,0 @@
-name: Update Develop API Data
-
-on:
- push:
- branches:
- - develop
- paths:
- - 'keyboards/**'
- - 'layouts/community/**'
- workflow_dispatch:
-
-jobs:
- api_data:
- runs-on: ubuntu-latest
- container: qmkfm/qmk_cli
-
- # protect against those who work in their fork on develop
- if: github.repository == 'qmk/qmk_firmware'
-
- steps:
- - uses: actions/checkout@v3
- with:
- fetch-depth: 1
- persist-credentials: false
-
- - name: Generate API Data
- run: |
- python3 -m pip install -r requirements-dev.txt
- qmk generate-api
-
- - name: Upload API Data
- uses: jakejarvis/s3-sync-action@master
- with:
- args: --acl public-read --follow-symlinks --delete
- env:
- AWS_S3_BUCKET: ${{ secrets.API_SPACE_DEVELOP }}
- AWS_ACCESS_KEY_ID: ${{ secrets.SPACES_ACCESS_KEY }}
- AWS_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET_KEY }}
- AWS_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
- SOURCE_DIR: '.build/api_data'
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 691770a5af..1497739a0b 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -34,7 +34,7 @@ jobs:
qmk --verbose generate-docs
- name: Deploy
- uses: JamesIves/github-pages-deploy-action@v4.4.0
+ uses: JamesIves/github-pages-deploy-action@v4.4.1
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BASE_BRANCH: master
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index b15f301865..297af8e19c 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -12,7 +12,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- - uses: actions/stale@v5
+ - uses: actions/stale@v6
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitignore b/.gitignore
index 51b0a38e0a..e36b9ae130 100644
--- a/.gitignore
+++ b/.gitignore
@@ -53,6 +53,7 @@ quantum/version.h
build/
cmake-build-debug
CMakeLists.txt
+*.pdf
# Let these ones be user specific, since we have so many different configurations
*.code-workspace
@@ -67,9 +68,20 @@ CMakeLists.txt
tags
# Ignore image/font files
+*.bmp
+*.wbmp
*.gif
*.jpg
+*.jpeg
*.png
+*.apng
+*.mng
+*.svg
+*.webp
+*.webm
+*.avi
+*.mp4
+*.mpeg
*.ttf
*.otf
diff --git a/.gitmodules b/.gitmodules
index 681693a5a4..48c7035afa 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -18,3 +18,6 @@
[submodule "lib/printf"]
path = lib/printf
url = https://github.com/qmk/printf
+[submodule "lib/pico-sdk"]
+ path = lib/pico-sdk
+ url = https://github.com/qmk/pico-sdk.git
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 5fedaf477b..76117e52e0 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -6,7 +6,8 @@
"files.exclude": {
"**/.build": true,
"**/*.hex": true,
- "**/*.bin": true
+ "**/*.bin": true,
+ "**/*.uf2": true
},
"files.associations": {
"*.h": "c",
diff --git a/Makefile b/Makefile
index beaf1132b7..99339192e1 100644
--- a/Makefile
+++ b/Makefile
@@ -241,7 +241,7 @@ endef
# if we are going to compile all keyboards, match the rest of the rule
# for each of them
define PARSE_ALL_KEYBOARDS
- $$(eval $$(call PARSE_ALL_IN_LIST,PARSE_KEYBOARD,$(shell util/list_keyboards.sh noci | sort -u)))
+ $$(eval $$(call PARSE_ALL_IN_LIST,PARSE_KEYBOARD,$(shell util/list_keyboards.sh | sort -u)))
endef
# Prints a list of all known keymaps for the given keyboard
@@ -264,7 +264,7 @@ define PARSE_KEYMAP
# The rest of the rule is the target
# Remove the leading ":" from the target, as it acts as a separator
MAKE_TARGET := $$(patsubst :%,%,$$(RULE))
- # We need to generate an unique indentifer to append to the COMMANDS list
+ # We need to generate an unique identifier to append to the COMMANDS list
CURRENT_KB_UNDER := $$(subst /,_,$$(CURRENT_KB))
COMMAND := COMMAND_KEYBOARD_$$(CURRENT_KB_UNDER)_KEYMAP_$$(CURRENT_KM)
# If we are compiling a keyboard without a subproject, we want to display just the name
@@ -401,6 +401,7 @@ ifndef SKIP_GIT
if [ ! -e lib/lufa ]; then git submodule sync lib/lufa && git submodule update --depth 50 --init lib/lufa; fi
if [ ! -e lib/vusb ]; then git submodule sync lib/vusb && git submodule update --depth 50 --init lib/vusb; fi
if [ ! -e lib/printf ]; then git submodule sync lib/printf && git submodule update --depth 50 --init lib/printf; fi
+ if [ ! -e lib/pico-sdk ]; then git submodule sync lib/pico-sdk && git submodule update --depth 50 --init lib/pico-sdk; fi
git submodule status --recursive 2>/dev/null | \
while IFS= read -r x; do \
case "$$x" in \
diff --git a/builddefs/bootloader.mk b/builddefs/bootloader.mk
deleted file mode 100644
index eba8e280e4..0000000000
--- a/builddefs/bootloader.mk
+++ /dev/null
@@ -1,218 +0,0 @@
-# Copyright 2017 Jack Humbert
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-# If it's possible that multiple bootloaders can be used for one project,
-# you can leave this unset, and the correct size will be selected
-# automatically.
-#
-# Sets the bootloader defined in the keyboard's/keymap's rules.mk
-# Current options:
-#
-# AVR:
-# halfkay PJRC Teensy
-# caterina Pro Micro (Sparkfun/generic)
-# atmel-dfu Atmel factory DFU
-# lufa-dfu LUFA DFU
-# qmk-dfu QMK DFU (LUFA + blinkenlight)
-# qmk-hid QMK HID (LUFA + blinkenlight)
-# bootloadhid HIDBootFlash compatible (ATmega32A)
-# usbasploader USBaspLoader (ATmega328P)
-# ARM:
-# halfkay PJRC Teensy
-# kiibohd Input:Club Kiibohd bootloader (only used on their boards)
-# stm32duino STM32Duino (STM32F103x8)
-# stm32-dfu STM32 USB DFU in ROM
-# apm32-dfu APM32 USB DFU in ROM
-# RISC-V:
-# gd32v-dfu GD32V USB DFU in ROM
-#
-# If you need to provide your own implementation, you can set inside `rules.mk`
-# `BOOTLOADER = custom` -- you'll need to provide your own implementations. See
-# the respective file under `platforms//bootloaders/custom.c` to see
-# which functions may be overridden.
-#
-# BOOTLOADER_SIZE can still be defined manually, but it's recommended
-# you add any possible configuration to this list
-
-ifeq ($(strip $(BOOTLOADER)), custom)
- OPT_DEFS += -DBOOTLOADER_CUSTOM
- BOOTLOADER_TYPE = custom
-endif
-ifeq ($(strip $(BOOTLOADER)), atmel-dfu)
- OPT_DEFS += -DBOOTLOADER_ATMEL_DFU
- OPT_DEFS += -DBOOTLOADER_DFU
- BOOTLOADER_TYPE = dfu
-
- ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
- BOOTLOADER_SIZE = 4096
- endif
- ifneq (,$(filter $(MCU), at90usb1286 at90usb1287))
- BOOTLOADER_SIZE = 8192
- endif
-endif
-ifeq ($(strip $(BOOTLOADER)), lufa-dfu)
- OPT_DEFS += -DBOOTLOADER_LUFA_DFU
- OPT_DEFS += -DBOOTLOADER_DFU
- BOOTLOADER_TYPE = dfu
-
- ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
- BOOTLOADER_SIZE ?= 4096
- endif
- ifneq (,$(filter $(MCU), at90usb1286 at90usb1287))
- BOOTLOADER_SIZE ?= 8192
- endif
-endif
-ifeq ($(strip $(BOOTLOADER)), qmk-dfu)
- OPT_DEFS += -DBOOTLOADER_QMK_DFU
- OPT_DEFS += -DBOOTLOADER_DFU
- BOOTLOADER_TYPE = dfu
-
- ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
- BOOTLOADER_SIZE ?= 4096
- endif
- ifneq (,$(filter $(MCU), at90usb1286 at90usb1287))
- BOOTLOADER_SIZE ?= 8192
- endif
-endif
-ifeq ($(strip $(BOOTLOADER)), qmk-hid)
- OPT_DEFS += -DBOOTLOADER_QMK_HID
- OPT_DEFS += -DBOOTLOADER_HID
- BOOTLOADER_TYPE = dfu
-
- BOOTLOADER_SIZE ?= 4096
-endif
-ifeq ($(strip $(BOOTLOADER)), halfkay)
- OPT_DEFS += -DBOOTLOADER_HALFKAY
- BOOTLOADER_TYPE = halfkay
-
- # Teensy 2.0
- ifeq ($(strip $(MCU)), atmega32u4)
- BOOTLOADER_SIZE = 512
- endif
- # Teensy 2.0++
- ifeq ($(strip $(MCU)), at90usb1286)
- BOOTLOADER_SIZE = 1024
- endif
- # Teensy LC, 3.x
- ifneq (,$(filter $(MCU_ORIG), MKL26Z64 MK20DX128 MK20DX256 MK66FX1M0))
- FIRMWARE_FORMAT = hex
- endif
-endif
-ifeq ($(strip $(BOOTLOADER)), caterina)
- OPT_DEFS += -DBOOTLOADER_CATERINA
- BOOTLOADER_TYPE = caterina
-
- BOOTLOADER_SIZE = 4096
-endif
-ifneq (,$(filter $(BOOTLOADER), bootloadhid bootloadHID))
- OPT_DEFS += -DBOOTLOADER_BOOTLOADHID
- BOOTLOADER_TYPE = bootloadhid
-
- BOOTLOADER_SIZE = 4096
-endif
-ifneq (,$(filter $(BOOTLOADER), usbasploader USBasp))
- OPT_DEFS += -DBOOTLOADER_USBASP
- BOOTLOADER_TYPE = usbasploader
-
- BOOTLOADER_SIZE = 4096
-endif
-ifeq ($(strip $(BOOTLOADER)), lufa-ms)
- OPT_DEFS += -DBOOTLOADER_MS
- BOOTLOADER_TYPE = dfu
-
- BOOTLOADER_SIZE ?= 8192
- FIRMWARE_FORMAT = bin
-cpfirmware: lufa_warning
-.INTERMEDIATE: lufa_warning
-lufa_warning: $(FIRMWARE_FORMAT)
- $(info @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)
- $(info LUFA MASS STORAGE Bootloader selected)
- $(info DO NOT USE THIS BOOTLOADER IN NEW PROJECTS!)
- $(info It is extremely prone to bricking, and is only included to support existing boards.)
- $(info @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)
-endif
-ifdef BOOTLOADER_SIZE
- OPT_DEFS += -DBOOTLOADER_SIZE=$(strip $(BOOTLOADER_SIZE))
-endif
-
-ifeq ($(strip $(BOOTLOADER)), stm32-dfu)
- OPT_DEFS += -DBOOTLOADER_STM32_DFU
- BOOTLOADER_TYPE = stm32_dfu
-
- # Options to pass to dfu-util when flashing
- DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave
- DFU_SUFFIX_ARGS ?= -v 0483 -p DF11
-endif
-ifeq ($(strip $(BOOTLOADER)), apm32-dfu)
- OPT_DEFS += -DBOOTLOADER_APM32_DFU
- BOOTLOADER_TYPE = stm32_dfu
-
- # Options to pass to dfu-util when flashing
- DFU_ARGS ?= -d 314B:0106 -a 0 -s 0x08000000:leave
- DFU_SUFFIX_ARGS ?= -v 314B -p 0106
-endif
-ifeq ($(strip $(BOOTLOADER)), gd32v-dfu)
- OPT_DEFS += -DBOOTLOADER_GD32V_DFU
- BOOTLOADER_TYPE = gd32v_dfu
-
- # Options to pass to dfu-util when flashing
- DFU_ARGS ?= -d 28E9:0189 -a 0 -s 0x08000000:leave
- DFU_SUFFIX_ARGS ?= -v 28E9 -p 0189
-endif
-ifeq ($(strip $(BOOTLOADER)), kiibohd)
- OPT_DEFS += -DBOOTLOADER_KIIBOHD
- BOOTLOADER_TYPE = kiibohd
-
- ifeq ($(strip $(MCU_ORIG)), MK20DX128)
- MCU_LDSCRIPT = MK20DX128BLDR4
- endif
- ifeq ($(strip $(MCU_ORIG)), MK20DX256)
- MCU_LDSCRIPT = MK20DX256BLDR8
- endif
-
- # Options to pass to dfu-util when flashing
- DFU_ARGS = -d 1C11:B007
- DFU_SUFFIX_ARGS = -v 1C11 -p B007
-endif
-ifeq ($(strip $(BOOTLOADER)), stm32duino)
- OPT_DEFS += -DBOOTLOADER_STM32DUINO
- MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader
- BOARD = STM32_F103_STM32DUINO
- BOOTLOADER_TYPE = stm32duino
-
- # Options to pass to dfu-util when flashing
- DFU_ARGS = -d 1EAF:0003 -a 2 -R
- DFU_SUFFIX_ARGS = -v 1EAF -p 0003
-endif
-ifeq ($(strip $(BOOTLOADER)), tinyuf2)
- OPT_DEFS += -DBOOTLOADER_TINYUF2
- BOOTLOADER_TYPE = tinyuf2
-endif
-ifeq ($(strip $(BOOTLOADER)), halfkay)
- OPT_DEFS += -DBOOTLOADER_HALFKAY
- BOOTLOADER_TYPE = halfkay
-endif
-ifeq ($(strip $(BOOTLOADER)), md-boot)
- OPT_DEFS += -DBOOTLOADER_MD_BOOT
- BOOTLOADER_TYPE = md_boot
-endif
-ifeq ($(strip $(BOOTLOADER)), wb32-dfu)
- OPT_DEFS += -DBOOTLOADER_WB32_DFU
- BOOTLOADER_TYPE = wb32_dfu
-endif
-
-ifeq ($(strip $(BOOTLOADER_TYPE)),)
- $(call CATASTROPHIC_ERROR,Invalid BOOTLOADER,No bootloader specified. Please set an appropriate 'BOOTLOADER' in your keyboard's 'rules.mk' file.)
-endif
diff --git a/builddefs/build_full_test.mk b/builddefs/build_full_test.mk
index 4e4b4e4bfd..35f0a05b99 100644
--- a/builddefs/build_full_test.mk
+++ b/builddefs/build_full_test.mk
@@ -20,7 +20,7 @@ $(TEST)_SRC := \
$(TMK_COMMON_SRC) \
$(QUANTUM_SRC) \
$(SRC) \
- tests/test_common/keymap.c \
+ $(QUANTUM_PATH)/keymap_introspection.c \
tests/test_common/matrix.c \
tests/test_common/test_driver.cpp \
tests/test_common/keyboard_report_util.cpp \
@@ -29,7 +29,7 @@ $(TEST)_SRC := \
tests/test_common/test_logger.cpp \
$(patsubst $(ROOTDIR)/%,%,$(wildcard $(TEST_PATH)/*.cpp))
-$(TEST)_DEFS := $(TMK_COMMON_DEFS) $(OPT_DEFS)
+$(TEST)_DEFS := $(TMK_COMMON_DEFS) $(OPT_DEFS) "-DKEYMAP_C=\"keymap.c\""
$(TEST)_CONFIG := $(TEST_PATH)/config.h
diff --git a/builddefs/build_keyboard.mk b/builddefs/build_keyboard.mk
index dc86b232df..499e6ffc69 100644
--- a/builddefs/build_keyboard.mk
+++ b/builddefs/build_keyboard.mk
@@ -13,6 +13,14 @@ endif
include paths.mk
include $(BUILDDEFS_PATH)/message.mk
+# Helper to add defines with a 'QMK_' prefix
+define add_qmk_prefix_defs
+ ifdef $1
+ # Need to cater for 'STM32L4xx+'
+ OPT_DEFS += -DQMK_$(2)="$($1)" -DQMK_$(2)_$(shell echo $($1) | sed -e 's@+@Plus@g' -e 's@[^a-zA-Z0-9]@_@g' | tr '[:lower:]' '[:upper:]')
+ endif
+endef
+
# Set the qmk cli to use
QMK_BIN ?= qmk
@@ -116,26 +124,26 @@ include $(BUILDDEFS_PATH)/build_json.mk
# Pull in keymap level rules.mk
ifeq ("$(wildcard $(KEYMAP_PATH))", "")
# Look through the possible keymap folders until we find a matching keymap.c
- ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.c)","")
- -include $(MAIN_KEYMAP_PATH_5)/rules.mk
- KEYMAP_C := $(MAIN_KEYMAP_PATH_5)/keymap.c
- KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5)
- else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.c)","")
- -include $(MAIN_KEYMAP_PATH_4)/rules.mk
- KEYMAP_C := $(MAIN_KEYMAP_PATH_4)/keymap.c
- KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4)
- else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.c)","")
- -include $(MAIN_KEYMAP_PATH_3)/rules.mk
- KEYMAP_C := $(MAIN_KEYMAP_PATH_3)/keymap.c
- KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3)
+ ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.c)","")
+ -include $(MAIN_KEYMAP_PATH_1)/rules.mk
+ KEYMAP_C := $(MAIN_KEYMAP_PATH_1)/keymap.c
+ KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.c)","")
-include $(MAIN_KEYMAP_PATH_2)/rules.mk
KEYMAP_C := $(MAIN_KEYMAP_PATH_2)/keymap.c
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2)
- else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.c)","")
- -include $(MAIN_KEYMAP_PATH_1)/rules.mk
- KEYMAP_C := $(MAIN_KEYMAP_PATH_1)/keymap.c
- KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
+ else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.c)","")
+ -include $(MAIN_KEYMAP_PATH_3)/rules.mk
+ KEYMAP_C := $(MAIN_KEYMAP_PATH_3)/keymap.c
+ KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3)
+ else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.c)","")
+ -include $(MAIN_KEYMAP_PATH_4)/rules.mk
+ KEYMAP_C := $(MAIN_KEYMAP_PATH_4)/keymap.c
+ KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4)
+ else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.c)","")
+ -include $(MAIN_KEYMAP_PATH_5)/rules.mk
+ KEYMAP_C := $(MAIN_KEYMAP_PATH_5)/keymap.c
+ KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5)
else ifneq ($(LAYOUTS),)
# If we haven't found a keymap yet fall back to community layouts
include $(BUILDDEFS_PATH)/build_layout.mk
@@ -154,7 +162,7 @@ ifneq ("$(wildcard $(KEYMAP_JSON))", "")
-include $(KEYMAP_PATH)/rules.mk
# Load any rules.mk content from keymap.json
- INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --keyboard $(KEYBOARD) --keymap $(KEYMAP) --output $(KEYMAP_OUTPUT)/src/rules.mk)
+ INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --output $(KEYMAP_OUTPUT)/src/rules.mk $(KEYMAP_JSON))
include $(INFO_RULES_MK)
# Add rules to generate the keymap files - indentation here is important
@@ -165,7 +173,7 @@ $(KEYMAP_OUTPUT)/src/keymap.c: $(KEYMAP_JSON)
$(KEYMAP_OUTPUT)/src/config.h: $(KEYMAP_JSON)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
- $(eval CMD=$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --keymap $(KEYMAP) --output $(KEYMAP_H))
+ $(eval CMD=$(QMK_BIN) generate-config-h --quiet --output $(KEYMAP_H) $(KEYMAP_JSON))
@$(BUILD_CMD)
generated-files: $(KEYMAP_OUTPUT)/src/config.h $(KEYMAP_OUTPUT)/src/keymap.c
@@ -228,26 +236,25 @@ endif
# that the same keymap may be used on multiple keyboards.
#
# We grab the most top-level include file that we can. That file should
-# use #ifdef statements to include all the neccesary subfolder includes,
+# use #ifdef statements to include all the necessary subfolder includes,
# as described here:
#
# https://docs.qmk.fm/#/feature_layouts?id=tips-for-making-layouts-keyboard-agnostic
#
-QMK_KEYBOARD_H = $(KEYBOARD_OUTPUT)/src/default_keyboard.h
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).h)","")
- QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_1).h
+ FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_1).h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).h)","")
- QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_2).h
+ FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_2).h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).h)","")
- QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_3).h
+ FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_3).h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).h)","")
- QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_4).h
+ FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_4).h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).h)","")
- QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_5).h
+ FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_5).h
endif
# Determine and set parameters based on the keyboard's processor family.
@@ -321,7 +328,7 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","")
INFO_JSON_FILES += $(KEYBOARD_PATH_5)/info.json
endif
-CONFIG_H += $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/layouts.h
+CONFIG_H += $(KEYBOARD_OUTPUT)/src/info_config.h
KEYBOARD_SRC += $(KEYBOARD_OUTPUT)/src/default_keyboard.c
$(KEYBOARD_OUTPUT)/src/info_config.h: $(INFO_JSON_FILES)
@@ -336,15 +343,10 @@ $(KEYBOARD_OUTPUT)/src/default_keyboard.c: $(INFO_JSON_FILES)
$(KEYBOARD_OUTPUT)/src/default_keyboard.h: $(INFO_JSON_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
- $(eval CMD=$(QMK_BIN) generate-keyboard-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/default_keyboard.h)
+ $(eval CMD=$(QMK_BIN) generate-keyboard-h --quiet --keyboard $(KEYBOARD) --include $(FOUND_KEYBOARD_H) --output $(KEYBOARD_OUTPUT)/src/default_keyboard.h)
@$(BUILD_CMD)
-$(KEYBOARD_OUTPUT)/src/layouts.h: $(INFO_JSON_FILES)
- @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
- $(eval CMD=$(QMK_BIN) generate-layouts --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/layouts.h)
- @$(BUILD_CMD)
-
-generated-files: $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/default_keyboard.c $(KEYBOARD_OUTPUT)/src/default_keyboard.h $(KEYBOARD_OUTPUT)/src/layouts.h
+generated-files: $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/default_keyboard.c $(KEYBOARD_OUTPUT)/src/default_keyboard.h
.INTERMEDIATE : generated-files
@@ -366,6 +368,10 @@ endif
# Disable features that a keyboard doesn't support
-include $(BUILDDEFS_PATH)/disable_features.mk
+ifneq ("$(CONVERTER)","")
+ -include $(CONVERTER)/post_converter.mk
+endif
+
# Pull in post_rules.mk files from all our subfolders
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_rules.mk)","")
include $(KEYBOARD_PATH_1)/post_rules.mk
@@ -390,10 +396,18 @@ ifneq ("$(KEYMAP_H)","")
CONFIG_H += $(KEYMAP_H)
endif
+OPT_DEFS += -DKEYMAP_C=\"$(KEYMAP_C)\"
+
+# If a keymap or userspace places their keymap array in another file instead, allow for it to be included
+# !!NOTE!! -- For this to work, the source file cannot be part of $(SRC), so users should not add it via `SRC += `
+ifneq ($(strip $(INTROSPECTION_KEYMAP_C)),)
+OPT_DEFS += -DINTROSPECTION_KEYMAP_C=\"$(strip $(INTROSPECTION_KEYMAP_C))\"
+endif
+
# project specific files
SRC += \
$(KEYBOARD_SRC) \
- $(KEYMAP_C) \
+ $(QUANTUM_DIR)/keymap_introspection.c \
$(QUANTUM_SRC) \
$(QUANTUM_DIR)/main.c \
@@ -412,7 +426,6 @@ include $(BUILDDEFS_PATH)/common_features.mk
include $(BUILDDEFS_PATH)/generic_features.mk
include $(TMK_PATH)/protocol.mk
include $(PLATFORM_PATH)/common.mk
-include $(BUILDDEFS_PATH)/bootloader.mk
SRC += $(patsubst %.c,%.clib,$(LIB_SRC))
SRC += $(patsubst %.c,%.clib,$(QUANTUM_LIB_SRC))
@@ -427,6 +440,7 @@ ifneq ($(REQUIRE_PLATFORM_KEY),)
endif
endif
+-include $(PLATFORM_PATH)/$(PLATFORM_KEY)/bootloader.mk
include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk
-include $(PLATFORM_PATH)/$(PLATFORM_KEY)/flash.mk
@@ -436,6 +450,14 @@ else
include $(TMK_PATH)/protocol/$(PLATFORM_KEY).mk
endif
+# Setup definitions based on the selected MCU
+$(eval $(call add_qmk_prefix_defs,MCU_ORIG,MCU))
+$(eval $(call add_qmk_prefix_defs,MCU_ARCH,MCU_ARCH))
+$(eval $(call add_qmk_prefix_defs,MCU_PORT_NAME,MCU_PORT_NAME))
+$(eval $(call add_qmk_prefix_defs,MCU_FAMILY,MCU_FAMILY))
+$(eval $(call add_qmk_prefix_defs,MCU_SERIES,MCU_SERIES))
+$(eval $(call add_qmk_prefix_defs,BOARD,BOARD))
+
# TODO: remove this bodge?
PROJECT_DEFS := $(OPT_DEFS)
PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYBOARD_PATHS)
@@ -447,7 +469,7 @@ ALL_CONFIGS := $(PROJECT_CONFIG) $(CONFIG_H)
OUTPUTS := $(KEYMAP_OUTPUT) $(KEYBOARD_OUTPUT)
$(KEYMAP_OUTPUT)_SRC := $(SRC)
$(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) \
--DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYBOARD_H=\"$(QMK_KEYBOARD_H)\" \
+-DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYBOARD_H=\"$(KEYBOARD_OUTPUT)/src/default_keyboard.h\" \
-DQMK_KEYMAP=\"$(KEYMAP)\" -DQMK_KEYMAP_H=\"$(KEYMAP).h\" -DQMK_KEYMAP_CONFIG_H=\"$(KEYMAP_PATH)/config.h\"
$(KEYMAP_OUTPUT)_INC := $(VPATH) $(EXTRAINCDIRS)
$(KEYMAP_OUTPUT)_CONFIG := $(CONFIG_H)
@@ -469,6 +491,19 @@ check-size: build
check-md5: build
objs-size: build
+ifeq ($(strip $(TOP_SYMBOLS)),yes)
+all: top-symbols
+check-size: top-symbols
+top-symbols: build
+ echo "###########################################"
+ echo "# Highest flash usage:"
+ $(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep -i ' [t] ' | head -n10 | sed -e 's#^0000000# #g' -e 's#^000000# #g' -e 's#^00000# #g' -e 's#^0000# #g' -e 's#^000# #g' -e 's#^00# #g' -e 's#^0# #g'
+ echo "###########################################"
+ echo "# Highest RAM usage:"
+ $(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep -i ' [dbv] ' | head -n10 | sed -e 's#^0000000# #g' -e 's#^000000# #g' -e 's#^00000# #g' -e 's#^0000# #g' -e 's#^000# #g' -e 's#^00# #g' -e 's#^0# #g'
+ echo "###########################################"
+endif
+
include $(BUILDDEFS_PATH)/show_options.mk
include $(BUILDDEFS_PATH)/common_rules.mk
diff --git a/builddefs/build_test.mk b/builddefs/build_test.mk
index 5ad33b19c5..7c8fdd20e5 100644
--- a/builddefs/build_test.mk
+++ b/builddefs/build_test.mk
@@ -38,11 +38,11 @@ CREATE_MAP := no
VPATH += \
$(LIB_PATH)/googletest \
$(LIB_PATH)/googlemock \
- $(LIB_PATH)/printf
+ $(COMMON_VPATH) \
+ $(TEST_PATH)
all: elf
-VPATH += $(COMMON_VPATH)
PLATFORM:=TEST
PLATFORM_KEY:=test
BOOTLOADER_TYPE:=none
@@ -63,14 +63,15 @@ include $(TMK_PATH)/protocol.mk
include $(QUANTUM_PATH)/debounce/tests/rules.mk
include $(QUANTUM_PATH)/encoder/tests/rules.mk
include $(QUANTUM_PATH)/sequencer/tests/rules.mk
+include $(QUANTUM_PATH)/wear_leveling/tests/rules.mk
+include $(QUANTUM_PATH)/logging/print.mk
include $(PLATFORM_PATH)/test/rules.mk
ifneq ($(filter $(FULL_TESTS),$(TEST)),)
include $(BUILDDEFS_PATH)/build_full_test.mk
endif
$(TEST)_SRC += \
- tests/test_common/main.c \
- $(LIB_PATH)/printf/printf.c \
+ tests/test_common/main.cpp \
$(QUANTUM_PATH)/logging/print.c
$(TEST_OBJ)/$(TEST)_SRC := $($(TEST)_SRC)
diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk
index c976b8296d..63814bbfae 100644
--- a/builddefs/common_features.mk
+++ b/builddefs/common_features.mk
@@ -15,7 +15,6 @@
QUANTUM_SRC += \
$(QUANTUM_DIR)/quantum.c \
- $(QUANTUM_DIR)/send_string.c \
$(QUANTUM_DIR)/bitwise.c \
$(QUANTUM_DIR)/led.c \
$(QUANTUM_DIR)/action.c \
@@ -65,6 +64,7 @@ ifeq ($(strip $(AUDIO_ENABLE)), yes)
OPT_DEFS += -DAUDIO_DRIVER_PWM
endif
OPT_DEFS += -DAUDIO_ENABLE
+ COMMON_VPATH += $(QUANTUM_PATH)/audio
MUSIC_ENABLE = yes
SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c
SRC += $(QUANTUM_DIR)/process_keycode/process_clicky.c
@@ -92,10 +92,29 @@ ifeq ($(MUSIC_ENABLE), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_music.c
endif
+VALID_STENO_PROTOCOL_TYPES := geminipr txbolt all
+STENO_PROTOCOL ?= all
ifeq ($(strip $(STENO_ENABLE)), yes)
- OPT_DEFS += -DSTENO_ENABLE
- VIRTSER_ENABLE ?= yes
- SRC += $(QUANTUM_DIR)/process_keycode/process_steno.c
+ ifeq ($(filter $(STENO_PROTOCOL),$(VALID_STENO_PROTOCOL_TYPES)),)
+ $(call CATASTROPHIC_ERROR,Invalid STENO_PROTOCOL,STENO_PROTOCOL="$(STENO_PROTOCOL)" is not a valid stenography protocol)
+ else
+ OPT_DEFS += -DSTENO_ENABLE
+ VIRTSER_ENABLE ?= yes
+
+ ifeq ($(strip $(STENO_PROTOCOL)), geminipr)
+ OPT_DEFS += -DSTENO_ENABLE_GEMINI
+ endif
+ ifeq ($(strip $(STENO_PROTOCOL)), txbolt)
+ OPT_DEFS += -DSTENO_ENABLE_BOLT
+ endif
+ ifeq ($(strip $(STENO_PROTOCOL)), all)
+ OPT_DEFS += -DSTENO_ENABLE_ALL
+ OPT_DEFS += -DSTENO_ENABLE_GEMINI
+ OPT_DEFS += -DSTENO_ENABLE_BOLT
+ endif
+
+ SRC += $(QUANTUM_DIR)/process_keycode/process_steno.c
+ endif
endif
ifeq ($(strip $(VIRTSER_ENABLE)), yes)
@@ -108,15 +127,17 @@ ifeq ($(strip $(MOUSEKEY_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/mousekey.c
endif
-VALID_POINTING_DEVICE_DRIVER_TYPES := adns5050 adns9800 analog_joystick cirque_pinnacle_i2c cirque_pinnacle_spi pmw3360 pmw3389 pimoroni_trackball custom
+VALID_POINTING_DEVICE_DRIVER_TYPES := adns5050 adns9800 analog_joystick cirque_pinnacle_i2c cirque_pinnacle_spi paw3204 pmw3360 pmw3389 pimoroni_trackball custom
ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
ifeq ($(filter $(POINTING_DEVICE_DRIVER),$(VALID_POINTING_DEVICE_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid POINTING_DEVICE_DRIVER,POINTING_DEVICE_DRIVER="$(POINTING_DEVICE_DRIVER)" is not a valid pointing device type)
else
OPT_DEFS += -DPOINTING_DEVICE_ENABLE
MOUSE_ENABLE := yes
- SRC += $(QUANTUM_DIR)/pointing_device.c
- SRC += $(QUANTUM_DIR)/pointing_device_drivers.c
+ VPATH += $(QUANTUM_DIR)/pointing_device
+ SRC += $(QUANTUM_DIR)/pointing_device/pointing_device.c
+ SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_drivers.c
+ SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_auto_mouse.c
ifneq ($(strip $(POINTING_DEVICE_DRIVER)), custom)
SRC += drivers/sensors/$(strip $(POINTING_DEVICE_DRIVER)).c
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(shell echo $(POINTING_DEVICE_DRIVER) | tr '[:lower:]' '[:upper:]'))
@@ -131,19 +152,21 @@ ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), cirque_pinnacle_i2c)
OPT_DEFS += -DSTM32_I2C -DHAL_USE_I2C=TRUE
SRC += drivers/sensors/cirque_pinnacle.c
+ SRC += drivers/sensors/cirque_pinnacle_gestures.c
+ SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_gestures.c
QUANTUM_LIB_SRC += i2c_master.c
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), cirque_pinnacle_spi)
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE
SRC += drivers/sensors/cirque_pinnacle.c
+ SRC += drivers/sensors/cirque_pinnacle_gestures.c
+ SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_gestures.c
QUANTUM_LIB_SRC += spi_master.c
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pimoroni_trackball)
OPT_DEFS += -DSTM32_SPI -DHAL_USE_I2C=TRUE
QUANTUM_LIB_SRC += i2c_master.c
- else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pmw3360)
- OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE
- QUANTUM_LIB_SRC += spi_master.c
- else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pmw3389)
+ else ifneq ($(filter $(strip $(POINTING_DEVICE_DRIVER)),pmw3360 pmw3389),)
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE
+ SRC += drivers/sensors/pmw33xx_common.c
QUANTUM_LIB_SRC += spi_master.c
endif
endif
@@ -154,33 +177,42 @@ ifeq ($(strip $(QUANTUM_PAINTER_ENABLE)), yes)
include $(QUANTUM_DIR)/painter/rules.mk
endif
-VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi
+VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi wear_leveling legacy_stm32_flash
EEPROM_DRIVER ?= vendor
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid EEPROM_DRIVER,EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver)
else
OPT_DEFS += -DEEPROM_ENABLE
+ COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom
+ COMMON_VPATH += $(DRIVER_PATH)/eeprom
+ COMMON_VPATH += $(PLATFORM_COMMON_DIR)
ifeq ($(strip $(EEPROM_DRIVER)), custom)
# Custom EEPROM implementation -- only needs to implement init/erase/read_block/write_block
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_CUSTOM
- COMMON_VPATH += $(DRIVER_PATH)/eeprom
SRC += eeprom_driver.c
+ else ifeq ($(strip $(EEPROM_DRIVER)), wear_leveling)
+ # Wear-leveling EEPROM implementation
+ OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
+ SRC += eeprom_driver.c eeprom_wear_leveling.c
else ifeq ($(strip $(EEPROM_DRIVER)), i2c)
# External I2C EEPROM implementation
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C
- COMMON_VPATH += $(DRIVER_PATH)/eeprom
QUANTUM_LIB_SRC += i2c_master.c
SRC += eeprom_driver.c eeprom_i2c.c
else ifeq ($(strip $(EEPROM_DRIVER)), spi)
# External SPI EEPROM implementation
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI
- COMMON_VPATH += $(DRIVER_PATH)/eeprom
QUANTUM_LIB_SRC += spi_master.c
SRC += eeprom_driver.c eeprom_spi.c
+ else ifeq ($(strip $(EEPROM_DRIVER)), legacy_stm32_flash)
+ # STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated)
+ OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_FLASH_EMULATED
+ COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
+ COMMON_VPATH += $(DRIVER_PATH)/flash
+ SRC += eeprom_driver.c eeprom_stm32.c flash_stm32.c
else ifeq ($(strip $(EEPROM_DRIVER)), transient)
# Transient EEPROM implementation -- no data storage but provides runtime area for it
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
- COMMON_VPATH += $(DRIVER_PATH)/eeprom
SRC += eeprom_driver.c eeprom_transient.c
else ifeq ($(strip $(EEPROM_DRIVER)), vendor)
# Vendor-implemented EEPROM
@@ -188,53 +220,91 @@ else
ifeq ($(PLATFORM),AVR)
# Automatically provided by avr-libc, nothing required
else ifeq ($(PLATFORM),CHIBIOS)
- ifneq ($(filter STM32F3xx_% STM32F1xx_% %_STM32F401xC %_STM32F401xE %_STM32F405xG %_STM32F411xE %_STM32F072xB %_STM32F042x6 %_GD32VF103xB %_GD32VF103x8, $(MCU_SERIES)_$(MCU_LDSCRIPT)),)
- # Emulated EEPROM
- OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_FLASH_EMULATED
- COMMON_VPATH += $(DRIVER_PATH)/eeprom
- SRC += eeprom_driver.c
- SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
- SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
+ ifneq ($(filter %_STM32F072xB %_STM32F042x6, $(MCU_SERIES)_$(MCU_LDSCRIPT)),)
+ # STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated)
+ OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_LEGACY_EMULATED_FLASH
+ COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
+ COMMON_VPATH += $(DRIVER_PATH)/flash
+ SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c
+ else ifneq ($(filter $(MCU_SERIES),STM32F1xx STM32F3xx STM32F4xx STM32L4xx STM32G4xx WB32F3G71xx WB32FQ95xx GD32VF103),)
+ # Wear-leveling EEPROM implementation, backed by MCU flash
+ OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
+ SRC += eeprom_driver.c eeprom_wear_leveling.c
+ WEAR_LEVELING_DRIVER = embedded_flash
else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),)
# True EEPROM on STM32L0xx, L1xx
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_L0_L1
- COMMON_VPATH += $(DRIVER_PATH)/eeprom
- COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom
- SRC += eeprom_driver.c
- SRC += eeprom_stm32_L0_L1.c
+ SRC += eeprom_driver.c eeprom_stm32_L0_L1.c
+ else ifneq ($(filter $(MCU_SERIES),RP2040),)
+ # Wear-leveling EEPROM implementation, backed by RP2040 flash
+ OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
+ SRC += eeprom_driver.c eeprom_wear_leveling.c
+ WEAR_LEVELING_DRIVER = rp2040_flash
else ifneq ($(filter $(MCU_SERIES),KL2x K20x),)
# Teensy EEPROM implementations
- OPT_DEFS += -DEEPROM_TEENSY
- SRC += eeprom_teensy.c
+ OPT_DEFS += -DEEPROM_KINETIS_FLEXRAM
+ SRC += eeprom_kinetis_flexram.c
else
# Fall back to transient, i.e. non-persistent
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
- COMMON_VPATH += $(DRIVER_PATH)/eeprom
SRC += eeprom_driver.c eeprom_transient.c
endif
else ifeq ($(PLATFORM),ARM_ATSAM)
# arm_atsam EEPROM
OPT_DEFS += -DEEPROM_SAMD
- SRC += $(PLATFORM_COMMON_DIR)/eeprom_samd.c
+ SRC += eeprom_samd.c
else ifeq ($(PLATFORM),TEST)
# Test harness "EEPROM"
OPT_DEFS += -DEEPROM_TEST_HARNESS
- SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
+ SRC += eeprom.c
+ endif
+ endif
+endif
+
+VALID_WEAR_LEVELING_DRIVER_TYPES := custom embedded_flash spi_flash rp2040_flash legacy
+WEAR_LEVELING_DRIVER ?= none
+ifneq ($(strip $(WEAR_LEVELING_DRIVER)),none)
+ ifeq ($(filter $(WEAR_LEVELING_DRIVER),$(VALID_WEAR_LEVELING_DRIVER_TYPES)),)
+ $(call CATASTROPHIC_ERROR,Invalid WEAR_LEVELING_DRIVER,WEAR_LEVELING_DRIVER="$(WEAR_LEVELING_DRIVER)" is not a valid wear leveling driver)
+ else
+ FNV_ENABLE := yes
+ OPT_DEFS += -DWEAR_LEVELING_ENABLE
+ OPT_DEFS += -DWEAR_LEVELING_$(strip $(shell echo $(WEAR_LEVELING_DRIVER) | tr '[:lower:]' '[:upper:]'))
+ COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling
+ COMMON_VPATH += $(DRIVER_PATH)/wear_leveling
+ COMMON_VPATH += $(QUANTUM_DIR)/wear_leveling
+ SRC += wear_leveling.c
+ ifeq ($(strip $(WEAR_LEVELING_DRIVER)), embedded_flash)
+ OPT_DEFS += -DHAL_USE_EFL
+ SRC += wear_leveling_efl.c
+ POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling/wear_leveling_efl_config.h
+ else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), spi_flash)
+ FLASH_DRIVER := spi
+ SRC += wear_leveling_flash_spi.c
+ POST_CONFIG_H += $(DRIVER_PATH)/wear_leveling/wear_leveling_flash_spi_config.h
+ else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), rp2040_flash)
+ SRC += wear_leveling_rp2040_flash.c
+ POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_rp2040_flash_config.h
+ else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), legacy)
+ COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
+ SRC += legacy_flash_ops.c wear_leveling_legacy.c
+ POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling/wear_leveling_legacy_config.h
endif
endif
endif
VALID_FLASH_DRIVER_TYPES := spi
-FLASH_DRIVER ?= no
-ifneq ($(strip $(FLASH_DRIVER)), no)
+FLASH_DRIVER ?= none
+ifneq ($(strip $(FLASH_DRIVER)), none)
ifeq ($(filter $(FLASH_DRIVER),$(VALID_FLASH_DRIVER_TYPES)),)
- $(error FLASH_DRIVER="$(FLASH_DRIVER)" is not a valid FLASH driver)
+ $(call CATASTROPHIC_ERROR,Invalid FLASH_DRIVER,FLASH_DRIVER="$(FLASH_DRIVER)" is not a valid flash driver)
else
OPT_DEFS += -DFLASH_ENABLE
- ifeq ($(strip $(FLASH_DRIVER)), spi)
+ ifeq ($(strip $(FLASH_DRIVER)),spi)
OPT_DEFS += -DFLASH_DRIVER -DFLASH_SPI
COMMON_VPATH += $(DRIVER_PATH)/flash
SRC += flash_spi.c
+ QUANTUM_LIB_SRC += spi_master.c
endif
endif
endif
@@ -275,7 +345,7 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
endif
LED_MATRIX_ENABLE ?= no
-VALID_LED_MATRIX_TYPES := IS31FL3731 IS31FL3742A IS31FL3743A IS31FL3745 IS31FL3746A custom
+VALID_LED_MATRIX_TYPES := IS31FL3731 IS31FL3742A IS31FL3743A IS31FL3745 IS31FL3746A CKLED2001 custom
# TODO: IS31FL3733 IS31FL3737 IS31FL3741
ifeq ($(strip $(LED_MATRIX_ENABLE)), yes)
@@ -331,6 +401,13 @@ endif
QUANTUM_LIB_SRC += i2c_master.c
endif
+ ifeq ($(strip $(LED_MATRIX_DRIVER)), CKLED2001)
+ OPT_DEFS += -DCKLED2001 -DSTM32_I2C -DHAL_USE_I2C=TRUE
+ COMMON_VPATH += $(DRIVER_PATH)/led
+ SRC += ckled2001-simple.c
+ QUANTUM_LIB_SRC += i2c_master.c
+ endif
+
endif
RGB_MATRIX_ENABLE ?= no
@@ -448,12 +525,6 @@ ifeq ($(strip $(RGB_KEYCODES_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_rgb.c
endif
-ifeq ($(strip $(PRINTING_ENABLE)), yes)
- OPT_DEFS += -DPRINTING_ENABLE
- SRC += $(QUANTUM_DIR)/process_keycode/process_printer.c
- QUANTUM_LIB_SRC += uart.c
-endif
-
VARIABLE_TRACE ?= no
ifneq ($(strip $(VARIABLE_TRACE)),no)
SRC += $(QUANTUM_DIR)/variable_trace.c
@@ -473,11 +544,7 @@ endif
VALID_BACKLIGHT_TYPES := pwm timer software custom
BACKLIGHT_ENABLE ?= no
-ifeq ($(strip $(CONVERT_TO_PROTON_C)), yes)
- BACKLIGHT_DRIVER ?= software
-else
- BACKLIGHT_DRIVER ?= pwm
-endif
+BACKLIGHT_DRIVER ?= pwm
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
ifeq ($(filter $(BACKLIGHT_DRIVER),$(VALID_BACKLIGHT_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid BACKLIGHT_DRIVER,BACKLIGHT_DRIVER="$(BACKLIGHT_DRIVER)" is not a valid backlight type)
@@ -500,7 +567,7 @@ ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
endif
endif
-VALID_WS2812_DRIVER_TYPES := bitbang pwm spi i2c
+VALID_WS2812_DRIVER_TYPES := bitbang pwm spi i2c vendor
WS2812_DRIVER ?= bitbang
ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes)
@@ -542,12 +609,6 @@ ifeq ($(strip $(LED_TABLES)), yes)
SRC += $(QUANTUM_DIR)/led_tables.c
endif
-ifeq ($(strip $(TERMINAL_ENABLE)), yes)
- SRC += $(QUANTUM_DIR)/process_keycode/process_terminal.c
- OPT_DEFS += -DTERMINAL_ENABLE
- OPT_DEFS += -DUSER_PRINT
-endif
-
ifeq ($(strip $(VIA_ENABLE)), yes)
DYNAMIC_KEYMAP_ENABLE := yes
RAW_ENABLE := yes
@@ -595,6 +656,14 @@ ifneq ($(strip $(DEBOUNCE_TYPE)), custom)
QUANTUM_SRC += $(QUANTUM_DIR)/debounce/$(strip $(DEBOUNCE_TYPE)).c
endif
+
+VALID_SERIAL_DRIVER_TYPES := bitbang usart vendor
+
+SERIAL_DRIVER ?= bitbang
+ifeq ($(filter $(SERIAL_DRIVER),$(VALID_SERIAL_DRIVER_TYPES)),)
+ $(call CATASTROPHIC_ERROR,Invalid SERIAL_DRIVER,SERIAL_DRIVER="$(SERIAL_DRIVER)" is not a valid SERIAL driver)
+endif
+
ifeq ($(strip $(SPLIT_KEYBOARD)), yes)
POST_CONFIG_H += $(QUANTUM_DIR)/split_common/post_config.h
OPT_DEFS += -DSPLIT_KEYBOARD
@@ -619,11 +688,11 @@ ifeq ($(strip $(SPLIT_KEYBOARD)), yes)
endif
endif
- SERIAL_DRIVER ?= bitbang
OPT_DEFS += -DSERIAL_DRIVER_$(strip $(shell echo $(SERIAL_DRIVER) | tr '[:lower:]' '[:upper:]'))
ifeq ($(strip $(SERIAL_DRIVER)), bitbang)
QUANTUM_LIB_SRC += serial.c
else
+ QUANTUM_LIB_SRC += serial_protocol.c
QUANTUM_LIB_SRC += serial_$(strip $(SERIAL_DRIVER)).c
endif
endif
@@ -635,6 +704,12 @@ ifeq ($(strip $(CRC_ENABLE)), yes)
SRC += crc.c
endif
+ifeq ($(strip $(FNV_ENABLE)), yes)
+ OPT_DEFS += -DFNV_ENABLE
+ VPATH += $(LIB_PATH)/fnv
+ SRC += qmk_fnv_type_validation.c hash_32a.c hash_64a.c
+endif
+
ifeq ($(strip $(HAPTIC_ENABLE)),yes)
COMMON_VPATH += $(DRIVER_PATH)/haptic
@@ -701,8 +776,10 @@ endif
ifeq ($(strip $(UNICODE_COMMON)), yes)
OPT_DEFS += -DUNICODE_COMMON_ENABLE
+ COMMON_VPATH += $(QUANTUM_DIR)/unicode
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c \
- $(QUANTUM_DIR)/utf8.c
+ $(QUANTUM_DIR)/unicode/unicode.c \
+ $(QUANTUM_DIR)/unicode/utf8.c
endif
MAGIC_ENABLE ?= yes
@@ -711,6 +788,13 @@ ifeq ($(strip $(MAGIC_ENABLE)), yes)
OPT_DEFS += -DMAGIC_KEYCODE_ENABLE
endif
+SEND_STRING_ENABLE ?= yes
+ifeq ($(strip $(SEND_STRING_ENABLE)), yes)
+ OPT_DEFS += -DSEND_STRING_ENABLE
+ COMMON_VPATH += $(QUANTUM_DIR)/send_string
+ SRC += $(QUANTUM_DIR)/send_string/send_string.c
+endif
+
ifeq ($(strip $(AUTO_SHIFT_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_auto_shift.c
OPT_DEFS += -DAUTO_SHIFT_ENABLE
@@ -726,31 +810,25 @@ ifeq ($(strip $(PS2_MOUSE_ENABLE)), yes)
OPT_DEFS += -DMOUSE_ENABLE
endif
-ifeq ($(strip $(PS2_USE_BUSYWAIT)), yes)
- PS2_ENABLE := yes
- SRC += ps2_busywait.c
- SRC += ps2_io.c
- OPT_DEFS += -DPS2_USE_BUSYWAIT
-endif
-
-ifeq ($(strip $(PS2_USE_INT)), yes)
- PS2_ENABLE := yes
- SRC += ps2_interrupt.c
- SRC += ps2_io.c
- OPT_DEFS += -DPS2_USE_INT
-endif
-
-ifeq ($(strip $(PS2_USE_USART)), yes)
- PS2_ENABLE := yes
- SRC += ps2_usart.c
- SRC += ps2_io.c
- OPT_DEFS += -DPS2_USE_USART
-endif
+VALID_PS2_DRIVER_TYPES := busywait interrupt usart vendor
+PS2_DRIVER ?= busywait
ifeq ($(strip $(PS2_ENABLE)), yes)
+ ifeq ($(filter $(PS2_DRIVER),$(VALID_PS2_DRIVER_TYPES)),)
+ $(call CATASTROPHIC_ERROR,Invalid PS2_DRIVER,PS2_DRIVER="$(PS2_DRIVER)" is not a valid PS/2 driver)
+ endif
+
+ OPT_DEFS += -DPS2_DRIVER_$(strip $(shell echo $(PS2_DRIVER) | tr '[:lower:]' '[:upper:]'))
+
COMMON_VPATH += $(DRIVER_PATH)/ps2
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/ps2
OPT_DEFS += -DPS2_ENABLE
+
+ ifneq ($(strip $(PS2_DRIVER)), vendor)
+ SRC += ps2_io.c
+ endif
+
+ SRC += ps2_$(strip $(PS2_DRIVER)).c
endif
JOYSTICK_ENABLE ?= no
@@ -806,18 +884,26 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
OPT_DEFS += -DBLUETOOTH_ENABLE
NO_USB_STARTUP_CHECK := yes
COMMON_VPATH += $(DRIVER_PATH)/bluetooth
- SRC += outputselect.c
+ SRC += outputselect.c bluetooth.c
ifeq ($(strip $(BLUETOOTH_DRIVER)), BluefruitLE)
- OPT_DEFS += -DBLUETOOTH_BLUEFRUIT_LE
- SRC += analog.c
+ OPT_DEFS += -DBLUETOOTH_BLUEFRUIT_LE -DHAL_USE_SPI=TRUE
SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp
+ QUANTUM_LIB_SRC += analog.c
QUANTUM_LIB_SRC += spi_master.c
endif
ifeq ($(strip $(BLUETOOTH_DRIVER)), RN42)
- OPT_DEFS += -DBLUETOOTH_RN42
+ OPT_DEFS += -DBLUETOOTH_RN42 -DHAL_USE_SERIAL=TRUE
SRC += $(DRIVER_PATH)/bluetooth/rn42.c
QUANTUM_LIB_SRC += uart.c
endif
endif
+
+ifeq ($(strip $(ENCODER_ENABLE)), yes)
+ SRC += $(QUANTUM_DIR)/encoder.c
+ OPT_DEFS += -DENCODER_ENABLE
+ ifeq ($(strip $(ENCODER_MAP_ENABLE)), yes)
+ OPT_DEFS += -DENCODER_MAP_ENABLE
+ endif
+endif
diff --git a/builddefs/common_rules.mk b/builddefs/common_rules.mk
index d3acddc87b..5d100fec59 100644
--- a/builddefs/common_rules.mk
+++ b/builddefs/common_rules.mk
@@ -1,21 +1,7 @@
# Hey Emacs, this is a -*- makefile -*-
#----------------------------------------------------------------------------
-# WinAVR Makefile Template written by Eric B. Weddington, Jg Wunsch, et al.
-#
-# Released to the Public Domain
-#
-# Additional material for this makefile was written by:
-# Peter Fleury
-# Tim Henigan
-# Colin O'Flynn
-# Reiner Patommel
-# Markus Pfaff
-# Sander Pool
-# Frederik Rouleau
-# Carlos Lamas
-#
-# Enable vpath seraching for source files only
+# Enable vpath searching for source files only
# Without this, output files, could be read from the wrong .build directories
VPATH_SRC := $(VPATH)
vpath %.c $(VPATH_SRC)
@@ -38,36 +24,15 @@ NO_LTO_OBJ := $(filter %.a,$(OBJ))
MASTER_OUTPUT := $(firstword $(OUTPUTS))
-
-
# Output format. (can be srec, ihex, binary)
FORMAT = ihex
# Optimization level, can be [0, 1, 2, 3, s].
-# 0 = turn off optimization. s = optimize for size.
-# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT ?= s
-# Compiler flag to set the C Standard level.
-# c89 = "ANSI" C
-# gnu89 = c89 plus GCC extensions
-# c99 = ISO C99 standard (not yet fully implemented)
-# gnu99 = c99 plus GCC extensions
-CSTANDARD = -std=gnu99
-
-
-# Place -D or -U options here for C sources
-#CDEFS +=
-
-
-# Place -D or -U options here for ASM sources
-#ADEFS +=
-
-
-# Place -D or -U options here for C++ sources
-#CXXDEFS += -D__STDC_LIMIT_MACROS
-#CXXDEFS += -D__STDC_CONSTANT_MACROS
-#CXXDEFS +=
+# Compiler flag to set the C and C++ language standard level
+CSTANDARD = -std=gnu11
+CXXSTANDARD = -std=gnu++14
# Speed up recompilations by opt-in usage of ccache
USE_CCACHE ?= no
@@ -75,12 +40,8 @@ ifneq ($(USE_CCACHE),no)
CC_PREFIX ?= ccache
endif
-#---------------- Compiler Options C ----------------
-# -g*: generate debugging information
-# -O*: optimization level
-# -f...: tuning, see GCC manual and avr-libc documentation
-# -Wall...: warning level
-# -Wa,...: tell GCC to pass this to the assembler.
+#---------------- C Compiler Options ----------------
+
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.)
@@ -111,29 +72,20 @@ CFLAGS += -Wstrict-prototypes
ifneq ($(strip $(ALLOW_WARNINGS)), yes)
CFLAGS += -Werror
endif
-#CFLAGS += -mshort-calls
-#CFLAGS += -fno-unit-at-a-time
-#CFLAGS += -Wundef
-#CFLAGS += -Wunreachable-code
-#CFLAGS += -Wsign-compare
CFLAGS += $(CSTANDARD)
# This fixes lots of keyboards linking errors but SHOULDN'T BE A FINAL SOLUTION
# Fixing of multiple variable definitions must be made.
CFLAGS += -fcommon
-#---------------- Compiler Options C++ ----------------
-# -g*: generate debugging information
-# -O*: optimization level
-# -f...: tuning, see GCC manual and avr-libc documentation
-# -Wall...: warning level
-# -Wa,...: tell GCC to pass this to the assembler.
+#---------------- C++ Compiler Options ----------------
+
ifeq ($(strip $(DEBUG_ENABLE)),yes)
CXXFLAGS += -g$(DEBUG)
endif
CXXFLAGS += $(CXXDEFS)
CXXFLAGS += -O$(OPT)
-# to supress "warning: only initialized variables can be placed into program memory area"
+# to suppress "warning: only initialized variables can be placed into program memory area"
CXXFLAGS += -w
CXXFLAGS += -Wall
CXXFLAGS += -Wundef
@@ -141,57 +93,17 @@ CXXFLAGS += -Wundef
ifneq ($(strip $(ALLOW_WARNINGS)), yes)
CXXFLAGS += -Werror
endif
-#CXXFLAGS += -mshort-calls
-#CXXFLAGS += -fno-unit-at-a-time
-#CXXFLAGS += -Wstrict-prototypes
-#CXXFLAGS += -Wunreachable-code
-#CXXFLAGS += -Wsign-compare
-#CXXFLAGS += $(CSTANDARD)
#---------------- Assembler Options ----------------
+
ASFLAGS += $(ADEFS)
ifeq ($(VERBOSE_AS_CMD),yes)
ASFLAGS += -v
endif
-#---------------- Library Options ----------------
-# Minimalistic printf version
-PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
-
-# Floating point printf version (requires MATH_LIB = -lm below)
-PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
-
-# If this is left blank, then it will use the Standard printf version.
-PRINTF_LIB =
-#PRINTF_LIB = $(PRINTF_LIB_MIN)
-#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
-
-
-# Minimalistic scanf version
-SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
-
-# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
-SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
-
-# If this is left blank, then it will use the Standard scanf version.
-SCANF_LIB =
-#SCANF_LIB = $(SCANF_LIB_MIN)
-#SCANF_LIB = $(SCANF_LIB_FLOAT)
-
-
-MATH_LIB = -lm
-CREATE_MAP ?= yes
-
-
#---------------- Linker Options ----------------
-# -Wl,...: tell GCC to pass this to linker.
-# -Map: create map file
-# --cref: add cross reference to map file
-#
-# Comennt out "--relax" option to avoid a error such:
-# (.vectors+0x30): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_12'
-#
+CREATE_MAP ?= yes
ifeq ($(CREATE_MAP),yes)
LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
endif
@@ -201,20 +113,11 @@ endif
#LDFLAGS += -Wl,--relax
LDFLAGS += $(EXTMEMOPTS)
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
-LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
-#LDFLAGS += -T linker_script.x
+LDFLAGS += -lm
# You can give EXTRALDFLAGS at 'make' command line.
LDFLAGS += $(EXTRALDFLAGS)
#---------------- Assembler Listings ----------------
-# -Wa,...: tell GCC to pass this to the assembler.
-# -adhlns: create listing
-# -gstabs: have the assembler create line number information; note that
-# for use in COFF files, additional information about filenames
-# and function names needs to be present in the assembler source
-# files -- see avr-libc docs [FIXME: not yet described there]
-# -listing-cont-lines: Sets the maximum number of continuation lines of hex
-# dump that will be displayed for a given single line of source input.
ADHLNS_ENABLE ?= no
ifeq ($(ADHLNS_ENABLE),yes)
@@ -429,6 +332,7 @@ $1/asflags.txt: $1/force
echo '$$($1_ASFLAGS)' | cmp -s - $$@ || echo '$$($1_ASFLAGS)' > $$@
$1/compiler.txt: $1/force
+ test -f $$@ || touch $$@
$$(CC) --version | cmp -s - $$@ || $$(CC) --version > $$@
endef
@@ -468,6 +372,7 @@ show_path:
dump_vars: ERROR_IF_EMPTY=""
dump_vars: ERROR_IF_NONBOOL=""
dump_vars: ERROR_IF_UNSET=""
+dump_vars: CATASTROPHIC_ERROR=""
dump_vars:
@$(foreach V,$(sort $(.VARIABLES)),$(if $(filter-out environment% default automatic,$(origin $V)),$(info $V=$($V))))
diff --git a/builddefs/converters.mk b/builddefs/converters.mk
index b3e7bec007..c7e499226c 100644
--- a/builddefs/converters.mk
+++ b/builddefs/converters.mk
@@ -29,6 +29,7 @@ ifneq ($(CONVERT_TO),)
# Configure any defaults
OPT_DEFS += -DCONVERT_TO_$(strip $(shell echo $(CONVERT_TO) | tr '[:lower:]' '[:upper:]'))
+ OPT_DEFS += -DCONVERTER_TARGET=\"$(strip $(CONVERT_TO))\"
OPT_DEFS += -DCONVERTER_ENABLED
VPATH += $(CONVERTER)
diff --git a/builddefs/disable_features.mk b/builddefs/disable_features.mk
index 090a9b5a11..fe918b72b2 100644
--- a/builddefs/disable_features.mk
+++ b/builddefs/disable_features.mk
@@ -14,7 +14,6 @@ FEATURE_NAMES += LCD_BACKLIGHT
FEATURE_NAMES += LCD
FEATURE_NAMES += OLED
FEATURE_NAMES += POINTING_DEVICE
-FEATURE_NAMES += PRINTING
FEATURE_NAMES += PS2_MOUSE
FEATURE_NAMES += RGBLIGHT
FEATURE_NAMES += RGB_MATRIX
diff --git a/builddefs/generic_features.mk b/builddefs/generic_features.mk
index c3f1ec0f72..0d897bc1c8 100644
--- a/builddefs/generic_features.mk
+++ b/builddefs/generic_features.mk
@@ -17,6 +17,7 @@ SPACE_CADET_ENABLE ?= yes
GRAVE_ESC_ENABLE ?= yes
GENERIC_FEATURES = \
+ AUTOCORRECT \
CAPS_WORD \
COMBO \
COMMAND \
@@ -25,8 +26,6 @@ GENERIC_FEATURES = \
DIP_SWITCH \
DYNAMIC_KEYMAP \
DYNAMIC_MACRO \
- ENCODER \
- ENCODER_MAP \
GRAVE_ESC \
HAPTIC \
KEY_LOCK \
diff --git a/builddefs/mcu_selection.mk b/builddefs/mcu_selection.mk
index d5fb731e08..de919bd263 100644
--- a/builddefs/mcu_selection.mk
+++ b/builddefs/mcu_selection.mk
@@ -87,6 +87,33 @@ ifneq ($(findstring MK20DX256, $(MCU)),)
BOARD ?= PJRC_TEENSY_3_1
endif
+ifneq ($(findstring MK64FX512, $(MCU)),)
+ # Cortex version
+ MCU = cortex-m4
+
+ # ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
+ ARMV = 7
+
+ ## chip/board settings
+ # - the next two should match the directories in
+ # /os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
+ MCU_FAMILY = KINETIS
+ MCU_SERIES = K60x
+
+ # Linker script to use
+ # - it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/
+ # or /ld/
+ MCU_LDSCRIPT ?= MK64FX512
+
+ # Startup code to use
+ # - it should exist in /os/common/startup/ARMCMx/compilers/GCC/mk/
+ MCU_STARTUP ?= k60x
+
+ # Board: it should exist either in /os/hal/boards/,
+ # /boards/, or drivers/boards/
+ BOARD ?= PJRC_TEENSY_3_5
+endif
+
ifneq ($(findstring MK66FX1M0, $(MCU)),)
# Cortex version
MCU = cortex-m4
@@ -116,6 +143,41 @@ ifneq ($(findstring MK66FX1M0, $(MCU)),)
BOARD ?= PJRC_TEENSY_3_6
endif
+ifneq ($(findstring RP2040, $(MCU)),)
+ # Cortex version
+ MCU = cortex-m0plus
+
+ # ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
+ CHIBIOS_PORT = ARMv6-M-RP2
+
+ ## chip/board settings
+ # - the next two should match the directories in
+ # /os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
+ # OR
+ # /os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
+ MCU_FAMILY = RP
+ MCU_SERIES = RP2040
+
+ # Linker script to use
+ # - it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/
+ # or /ld/
+ STARTUPLD_CONTRIB = $(CHIBIOS_CONTRIB)/os/common/startup/ARMCMx/compilers/GCC/ld
+ MCU_LDSCRIPT ?= RP2040_FLASH_TIMECRIT
+ LDFLAGS += -L $(STARTUPLD_CONTRIB)
+
+ # Startup code to use
+ # - it should exist in /os/common/startup/ARMCMx/compilers/GCC/mk/
+ MCU_STARTUP ?= rp2040
+
+ # Board: it should exist either in /os/hal/boards/,
+ # /boards/, or drivers/boards/
+ BOARD ?= GENERIC_PROMICRO_RP2040
+
+ # Default UF2 Bootloader settings
+ UF2_FAMILY ?= RP2040
+ FIRMWARE_FORMAT ?= uf2
+endif
+
ifneq ($(findstring STM32F042, $(MCU)),)
# Cortex version
MCU = cortex-m0
@@ -286,7 +348,6 @@ ifneq ($(findstring STM32F401, $(MCU)),)
# or /ld/
ifeq ($(strip $(BOOTLOADER)), tinyuf2)
MCU_LDSCRIPT ?= STM32F401xC_tinyuf2
- FIRMWARE_FORMAT ?= uf2
else
MCU_LDSCRIPT ?= STM32F401xC
endif
@@ -297,7 +358,7 @@ ifneq ($(findstring STM32F401, $(MCU)),)
# Board: it should exist either in /os/hal/boards/,
# /boards/, or drivers/boards/
- BOARD ?= BLACKPILL_STM32_F401
+ BOARD ?= GENERIC_STM32_F401XC
USE_FPU ?= yes
@@ -402,7 +463,6 @@ ifneq ($(findstring STM32F411, $(MCU)),)
# or /ld/
ifeq ($(strip $(BOOTLOADER)), tinyuf2)
MCU_LDSCRIPT ?= STM32F411xE_tinyuf2
- FIRMWARE_FORMAT ?= uf2
else
MCU_LDSCRIPT ?= STM32F411xE
endif
@@ -413,7 +473,7 @@ ifneq ($(findstring STM32F411, $(MCU)),)
# Board: it should exist either in /os/hal/boards/,
# /boards/, or drivers/boards/
- BOARD ?= BLACKPILL_STM32_F411
+ BOARD ?= GENERIC_STM32_F411XE
USE_FPU ?= yes
@@ -456,6 +516,9 @@ ifneq ($(findstring STM32F446, $(MCU)),)
# Bootloader address for STM32 DFU
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
+
+ # Default as no chibios efl config
+ EEPROM_DRIVER ?= transient
endif
ifneq ($(findstring STM32G431, $(MCU)),)
diff --git a/builddefs/show_options.mk b/builddefs/show_options.mk
index f67d009191..e9f7e7d047 100644
--- a/builddefs/show_options.mk
+++ b/builddefs/show_options.mk
@@ -5,7 +5,6 @@ BUILD_OPTION_NAMES = \
CONSOLE_ENABLE \
COMMAND_ENABLE \
NKRO_ENABLE \
- TERMINAL_ENABLE \
CUSTOM_MATRIX \
DEBOUNCE_TYPE \
SPLIT_KEYBOARD \
@@ -44,8 +43,8 @@ OTHER_OPTION_NAMES = \
KEY_LOCK_ENABLE \
KEY_OVERRIDE_ENABLE \
LEADER_ENABLE \
- PRINTING_ENABLE \
STENO_ENABLE \
+ STENO_PROTOCOL \
TAP_DANCE_ENABLE \
VIRTSER_ENABLE \
OLED_ENABLE \
@@ -66,7 +65,9 @@ OTHER_OPTION_NAMES = \
KEYLOGGER_ENABLE \
LCD_BACKLIGHT_ENABLE \
MACROS_ENABLED \
+ PS2_ENABLE \
PS2_MOUSE_ENABLE \
+ PS2_DRIVER \
RAW_ENABLE \
SWAP_HANDS_ENABLE \
RING_BUFFERED_6KRO_REPORT_ENABLE \
@@ -82,7 +83,8 @@ OTHER_OPTION_NAMES = \
LTO_ENABLE \
PROGRAMMABLE_BUTTON_ENABLE \
SECURE_ENABLE \
- CAPS_WORD_ENABLE
+ CAPS_WORD_ENABLE \
+ AUTOCORRECT_ENABLE
define NAME_ECHO
@printf " %-30s = %-16s # %s\\n" "$1" "$($1)" "$(origin $1)"
diff --git a/builddefs/testlist.mk b/builddefs/testlist.mk
index b8d22bce80..8a30a44972 100644
--- a/builddefs/testlist.mk
+++ b/builddefs/testlist.mk
@@ -4,6 +4,7 @@ FULL_TESTS := $(notdir $(TEST_LIST))
include $(QUANTUM_PATH)/debounce/tests/testlist.mk
include $(QUANTUM_PATH)/encoder/tests/testlist.mk
include $(QUANTUM_PATH)/sequencer/tests/testlist.mk
+include $(QUANTUM_PATH)/wear_leveling/tests/testlist.mk
include $(PLATFORM_PATH)/test/testlist.mk
define VALIDATE_TEST_LIST
diff --git a/data/constants/keycodes/keycodes_0.0.1.hjson b/data/constants/keycodes/keycodes_0.0.1.hjson
new file mode 100644
index 0000000000..7ba1ecf201
--- /dev/null
+++ b/data/constants/keycodes/keycodes_0.0.1.hjson
@@ -0,0 +1,96 @@
+{
+ "ranges": {
+ "0x0000/0x00FF": {
+ "define": "QK_BASIC"
+ },
+ "0x0100/0x1EFF": {
+ "define": "QK_MODS"
+ },
+ "0x2000/0x1FFF": {
+ "define": "QK_MOD_TAP"
+ },
+ "0x4000/0x0FFF": {
+ "define": "QK_LAYER_TAP"
+ },
+ "0x5000/0x01FF": {
+ "define": "QK_LAYER_MOD"
+ },
+ "0x5200/0x001F": {
+ "define": "QK_TO"
+ },
+ "0x5220/0x001F": {
+ "define": "QK_MOMENTARY"
+ },
+ "0x5240/0x001F": {
+ "define": "QK_DEF_LAYER"
+ },
+ "0x5260/0x001F": {
+ "define": "QK_TOGGLE_LAYER"
+ },
+ "0x5280/0x001F": {
+ "define": "QK_ONE_SHOT_LAYER"
+ },
+ "0x52A0/0x001F": {
+ "define": "QK_ONE_SHOT_MOD"
+ },
+ "0x52C0/0x001F": {
+ "define": "QK_LAYER_TAP_TOGGLE"
+ },
+ // 0x52E0/0x001F - UNUSED
+ // 0x5300/0x02FF - UNUSED
+ "0x5600/0x00FF": {
+ "define": "QK_SWAP_HANDS"
+ },
+ "0x5700/0x00FF": {
+ "define": "QK_TAP_DANCE"
+ },
+ // 0x5800/0x17FF - UNUSED
+ "0x7000/0x00FF": {
+ "define": "QK_MAGIC"
+ },
+ "0x7100/0x00FF": {
+ "define": "QK_MIDI"
+ },
+ "0x7200/0x01FF": {
+ "define": "QK_SEQUENCER"
+ },
+ "0x7400/0x003F": {
+ "define": "QK_JOYSTICK"
+ },
+ "0x7440/0x003F": {
+ "define": "QK_PROGRAMMABLE_BUTTON"
+ },
+ "0x7480/0x003F": {
+ "define": "QK_AUDIO"
+ },
+ "0x74C0/0x003F": {
+ "define": "QK_STENO"
+ },
+ // 0x7500/0x01FF - UNUSED
+ "0x7700/0x007F": {
+ "define": "QK_MACRO"
+ },
+ // 0x7780/0x007F - UNUSED
+ "0x7800/0x00FF": {
+ "define": "QK_LIGHTING"
+ },
+ // 0x7900/0x02FF - UNUSED
+ "0x7C00/0x01FF": {
+ "define": "QK_QUANTUM"
+ },
+ "0x7E00/0x00FF": {
+ "define": "QK_KB"
+ },
+ "0x7F00/0x00FF": {
+ "define": "QK_USER"
+ },
+ "0x8000/0x7FFF": {
+ "define": "QK_UNICODE"
+ }
+ },
+ "keycodes": {
+ "0x7E00": {
+ "key": "SAFE_RANGE"
+ }
+ }
+}
\ No newline at end of file
diff --git a/data/constants/keycodes/keycodes_0.0.1_audio.hjson b/data/constants/keycodes/keycodes_0.0.1_audio.hjson
new file mode 100644
index 0000000000..e1d3ac3a0f
--- /dev/null
+++ b/data/constants/keycodes/keycodes_0.0.1_audio.hjson
@@ -0,0 +1,112 @@
+{
+ "keycodes": {
+ "0x7480": {
+ "group": "audio",
+ "key": "QK_AUDIO_ON",
+ "aliases": [
+ "AU_ON"
+ ]
+ },
+ "0x7481": {
+ "group": "audio",
+ "key": "QK_AUDIO_OFF",
+ "aliases": [
+ "AU_OFF"
+ ]
+ },
+ "0x7482": {
+ "group": "audio",
+ "key": "QK_AUDIO_TOGGLE",
+ "aliases": [
+ "AU_TOGG"
+ ]
+ },
+
+ "0x748A": {
+ "group": "audio",
+ "key": "QK_AUDIO_CLICKY_TOGGLE",
+ "aliases": [
+ "CK_TOGG"
+ ]
+ },
+ "0x748B": {
+ "group": "audio",
+ "key": "QK_AUDIO_CLICKY_ON",
+ "aliases": [
+ "CK_ON"
+ ]
+ },
+ "0x748C": {
+ "group": "audio",
+ "key": "QK_AUDIO_CLICKY_OFF",
+ "aliases": [
+ "CK_OFF"
+ ]
+ },
+ "0x748D": {
+ "group": "audio",
+ "key": "QK_AUDIO_CLICKY_UP",
+ "aliases": [
+ "CK_UP"
+ ]
+ },
+ "0x748E": {
+ "group": "audio",
+ "key": "QK_AUDIO_CLICKY_DOWN",
+ "aliases": [
+ "CK_DOWN"
+ ]
+ },
+ "0x748F": {
+ "group": "audio",
+ "key": "QK_AUDIO_CLICKY_RESET",
+ "aliases": [
+ "CK_RST"
+ ]
+ },
+
+ "0x7490": {
+ "group": "audio",
+ "key": "QK_MUSIC_ON",
+ "aliases": [
+ "MU_ON"
+ ]
+ },
+ "0x7491": {
+ "group": "audio",
+ "key": "QK_MUSIC_OFF",
+ "aliases": [
+ "MU_OFF"
+ ]
+ },
+ "0x7492": {
+ "group": "audio",
+ "key": "QK_MUSIC_TOGGLE",
+ "aliases": [
+ "MU_TOGG"
+ ]
+ },
+ "0x7493": {
+ "group": "audio",
+ "key": "QK_MUSIC_MODE_NEXT",
+ "aliases": [
+ "MU_NEXT"
+ ]
+ },
+
+ "0x7494": {
+ "group": "audio",
+ "key": "QK_AUDIO_VOICE_NEXT",
+ "aliases": [
+ "AU_NEXT"
+ ]
+ },
+ "0x7495": {
+ "group": "audio",
+ "key": "QK_AUDIO_VOICE_PREVIOUS",
+ "aliases": [
+ "AU_PREV"
+ ]
+ }
+ }
+}
diff --git a/data/constants/keycodes/keycodes_0.0.1_basic.hjson b/data/constants/keycodes/keycodes_0.0.1_basic.hjson
new file mode 100644
index 0000000000..7141d553b0
--- /dev/null
+++ b/data/constants/keycodes/keycodes_0.0.1_basic.hjson
@@ -0,0 +1,1515 @@
+{
+ "keycodes": {
+ "0x0000": {
+ "group": "internal",
+ "key": "KC_NO",
+ "label": "",
+ "aliases": [
+ "XXXXXXX"
+ ]
+ },
+ "0x0001": {
+ "group": "internal",
+ "key": "KC_TRANSPARENT",
+ "label": "",
+ "aliases": [
+ "_______",
+ "KC_TRNS"
+ ]
+ },
+ "0x0004": {
+ "group": "basic",
+ "key": "KC_A",
+ "label": "A"
+ },
+ "0x0005": {
+ "group": "basic",
+ "key": "KC_B",
+ "label": "B"
+ },
+ "0x0006": {
+ "group": "basic",
+ "key": "KC_C",
+ "label": "C"
+ },
+ "0x0007": {
+ "group": "basic",
+ "key": "KC_D",
+ "label": "D"
+ },
+ "0x0008": {
+ "group": "basic",
+ "key": "KC_E",
+ "label": "E"
+ },
+ "0x0009": {
+ "group": "basic",
+ "key": "KC_F",
+ "label": "F"
+ },
+ "0x000A": {
+ "group": "basic",
+ "key": "KC_G",
+ "label": "G"
+ },
+ "0x000B": {
+ "group": "basic",
+ "key": "KC_H",
+ "label": "H"
+ },
+ "0x000C": {
+ "group": "basic",
+ "key": "KC_I",
+ "label": "I"
+ },
+ "0x000D": {
+ "group": "basic",
+ "key": "KC_J",
+ "label": "J"
+ },
+ "0x000E": {
+ "group": "basic",
+ "key": "KC_K",
+ "label": "K"
+ },
+ "0x000F": {
+ "group": "basic",
+ "key": "KC_L",
+ "label": "L"
+ },
+ "0x0010": {
+ "group": "basic",
+ "key": "KC_M",
+ "label": "M"
+ },
+ "0x0011": {
+ "group": "basic",
+ "key": "KC_N",
+ "label": "N"
+ },
+ "0x0012": {
+ "group": "basic",
+ "key": "KC_O",
+ "label": "O"
+ },
+ "0x0013": {
+ "group": "basic",
+ "key": "KC_P",
+ "label": "P"
+ },
+ "0x0014": {
+ "group": "basic",
+ "key": "KC_Q",
+ "label": "Q"
+ },
+ "0x0015": {
+ "group": "basic",
+ "key": "KC_R",
+ "label": "R"
+ },
+ "0x0016": {
+ "group": "basic",
+ "key": "KC_S",
+ "label": "S"
+ },
+ "0x0017": {
+ "group": "basic",
+ "key": "KC_T",
+ "label": "T"
+ },
+ "0x0018": {
+ "group": "basic",
+ "key": "KC_U",
+ "label": "U"
+ },
+ "0x0019": {
+ "group": "basic",
+ "key": "KC_V",
+ "label": "V"
+ },
+ "0x001A": {
+ "group": "basic",
+ "key": "KC_W",
+ "label": "W"
+ },
+ "0x001B": {
+ "group": "basic",
+ "key": "KC_X",
+ "label": "X"
+ },
+ "0x001C": {
+ "group": "basic",
+ "key": "KC_Y",
+ "label": "Y"
+ },
+ "0x001D": {
+ "group": "basic",
+ "key": "KC_Z",
+ "label": "Z"
+ },
+ "0x001E": {
+ "group": "basic",
+ "key": "KC_1",
+ "label": "1"
+ },
+ "0x001F": {
+ "group": "basic",
+ "key": "KC_2",
+ "label": "2"
+ },
+ "0x0020": {
+ "group": "basic",
+ "key": "KC_3",
+ "label": "3"
+ },
+ "0x0021": {
+ "group": "basic",
+ "key": "KC_4",
+ "label": "4"
+ },
+ "0x0022": {
+ "group": "basic",
+ "key": "KC_5",
+ "label": "5"
+ },
+ "0x0023": {
+ "group": "basic",
+ "key": "KC_6",
+ "label": "6"
+ },
+ "0x0024": {
+ "group": "basic",
+ "key": "KC_7",
+ "label": "7"
+ },
+ "0x0025": {
+ "group": "basic",
+ "key": "KC_8",
+ "label": "8"
+ },
+ "0x0026": {
+ "group": "basic",
+ "key": "KC_9",
+ "label": "9"
+ },
+ "0x0027": {
+ "group": "basic",
+ "key": "KC_0",
+ "label": "0"
+ },
+ "0x0028": {
+ "group": "basic",
+ "key": "KC_ENTER",
+ "label": "Enter",
+ "aliases": [
+ "KC_ENT"
+ ]
+ },
+ "0x0029": {
+ "group": "basic",
+ "key": "KC_ESCAPE",
+ "label": "Esc",
+ "aliases": [
+ "KC_ESC"
+ ]
+ },
+ "0x002A": {
+ "group": "basic",
+ "key": "KC_BACKSPACE",
+ "label": "Backspace",
+ "aliases": [
+ "KC_BSPC"
+ ]
+ },
+ "0x002B": {
+ "group": "basic",
+ "key": "KC_TAB",
+ "label": "Tab"
+ },
+ "0x002C": {
+ "group": "basic",
+ "key": "KC_SPACE",
+ "label": "Spacebar",
+ "aliases": [
+ "KC_SPC"
+ ]
+ },
+ "0x002D": {
+ "group": "basic",
+ "key": "KC_MINUS",
+ "label": "-",
+ "aliases": [
+ "KC_MINS"
+ ]
+ },
+ "0x002E": {
+ "group": "basic",
+ "key": "KC_EQUAL",
+ "label": "=",
+ "aliases": [
+ "KC_EQL"
+ ]
+ },
+ "0x002F": {
+ "group": "basic",
+ "key": "KC_LEFT_BRACKET",
+ "label": "]",
+ "aliases": [
+ "KC_LBRC"
+ ]
+ },
+ "0x0030": {
+ "group": "basic",
+ "key": "KC_RIGHT_BRACKET",
+ "label": "[",
+ "aliases": [
+ "KC_RBRC"
+ ]
+ },
+ "0x0031": {
+ "group": "basic",
+ "key": "KC_BACKSLASH",
+ "label": "\\",
+ "aliases": [
+ "KC_BSLS"
+ ]
+ },
+ "0x0032": {
+ "group": "basic",
+ "key": "KC_NONUS_HASH",
+ "label": "#",
+ "aliases": [
+ "KC_NUHS"
+ ]
+ },
+ "0x0033": {
+ "group": "basic",
+ "key": "KC_SEMICOLON",
+ "label": ";",
+ "aliases": [
+ "KC_SCLN"
+ ]
+ },
+ "0x0034": {
+ "group": "basic",
+ "key": "KC_QUOTE",
+ "label": "'",
+ "aliases": [
+ "KC_QUOT"
+ ]
+ },
+ "0x0035": {
+ "group": "basic",
+ "key": "KC_GRAVE",
+ "label": "`",
+ "aliases": [
+ "KC_GRV"
+ ]
+ },
+ "0x0036": {
+ "group": "basic",
+ "key": "KC_COMMA",
+ "label": ",",
+ "aliases": [
+ "KC_COMM"
+ ]
+ },
+ "0x0037": {
+ "group": "basic",
+ "key": "KC_DOT",
+ "label": "."
+ },
+ "0x0038": {
+ "group": "basic",
+ "key": "KC_SLASH",
+ "label": "/",
+ "aliases": [
+ "KC_SLSH"
+ ]
+ },
+ "0x0039": {
+ "group": "basic",
+ "key": "KC_CAPS_LOCK",
+ "label": "Caps Lock",
+ "aliases": [
+ "KC_CAPS"
+ ]
+ },
+ "0x003A": {
+ "group": "basic",
+ "key": "KC_F1",
+ "label": "F1"
+ },
+ "0x003B": {
+ "group": "basic",
+ "key": "KC_F2",
+ "label": "F2"
+ },
+ "0x003C": {
+ "group": "basic",
+ "key": "KC_F3",
+ "label": "F3"
+ },
+ "0x003D": {
+ "group": "basic",
+ "key": "KC_F4",
+ "label": "F4"
+ },
+ "0x003E": {
+ "group": "basic",
+ "key": "KC_F5",
+ "label": "F5"
+ },
+ "0x003F": {
+ "group": "basic",
+ "key": "KC_F6",
+ "label": "F6"
+ },
+ "0x0040": {
+ "group": "basic",
+ "key": "KC_F7",
+ "label": "F7"
+ },
+ "0x0041": {
+ "group": "basic",
+ "key": "KC_F8",
+ "label": "F8"
+ },
+ "0x0042": {
+ "group": "basic",
+ "key": "KC_F9",
+ "label": "F9"
+ },
+ "0x0043": {
+ "group": "basic",
+ "key": "KC_F10",
+ "label": "F10"
+ },
+ "0x0044": {
+ "group": "basic",
+ "key": "KC_F11",
+ "label": "F11"
+ },
+ "0x0045": {
+ "group": "basic",
+ "key": "KC_F12",
+ "label": "F12"
+ },
+ "0x0046": {
+ "group": "basic",
+ "key": "KC_PRINT_SCREEN",
+ "label": "Print Screen",
+ "aliases": [
+ "KC_PSCR"
+ ]
+ },
+ "0x0047": {
+ "group": "basic",
+ "key": "KC_SCROLL_LOCK",
+ "label": "Scroll Lock",
+ "aliases": [
+ "KC_SCRL",
+ "KC_BRMD"
+ ]
+ },
+ "0x0048": {
+ "group": "basic",
+ "key": "KC_PAUSE",
+ "label": "Pause",
+ "aliases": [
+ "KC_PAUS",
+ "KC_BRK",
+ "KC_BRMU"
+ ]
+ },
+ "0x0049": {
+ "group": "basic",
+ "key": "KC_INSERT",
+ "label": "Insert",
+ "aliases": [
+ "KC_INS"
+ ]
+ },
+ "0x004A": {
+ "group": "basic",
+ "key": "KC_HOME",
+ "label": "Home"
+ },
+ "0x004B": {
+ "group": "basic",
+ "key": "KC_PAGE_UP",
+ "label": "Page Up",
+ "aliases": [
+ "KC_PGUP"
+ ]
+ },
+ "0x004C": {
+ "group": "basic",
+ "key": "KC_DELETE",
+ "label": "Delete",
+ "aliases": [
+ "KC_DEL"
+ ]
+ },
+ "0x004D": {
+ "group": "basic",
+ "key": "KC_END",
+ "label": "End"
+ },
+ "0x004E": {
+ "group": "basic",
+ "key": "KC_PAGE_DOWN",
+ "label": "Page Down",
+ "aliases": [
+ "KC_PGDN"
+ ]
+ },
+ "0x004F": {
+ "group": "basic",
+ "key": "KC_RIGHT",
+ "label": "Right",
+ "aliases": [
+ "KC_RGHT"
+ ]
+ },
+ "0x0050": {
+ "group": "basic",
+ "key": "KC_LEFT",
+ "label": "Left"
+ },
+ "0x0051": {
+ "group": "basic",
+ "key": "KC_DOWN",
+ "label": "Down"
+ },
+ "0x0052": {
+ "group": "basic",
+ "key": "KC_UP",
+ "label": "Up"
+ },
+ "0x0053": {
+ "group": "basic",
+ "key": "KC_NUM_LOCK",
+ "label": "Num Lock",
+ "aliases": [
+ "KC_NUM"
+ ]
+ },
+ "0x0054": {
+ "group": "basic",
+ "key": "KC_KP_SLASH",
+ "label": "/",
+ "aliases": [
+ "KC_PSLS"
+ ]
+ },
+ "0x0055": {
+ "group": "basic",
+ "key": "KC_KP_ASTERISK",
+ "label": "*",
+ "aliases": [
+ "KC_PAST"
+ ]
+ },
+ "0x0056": {
+ "group": "basic",
+ "key": "KC_KP_MINUS",
+ "label": "-",
+ "aliases": [
+ "KC_PMNS"
+ ]
+ },
+ "0x0057": {
+ "group": "basic",
+ "key": "KC_KP_PLUS",
+ "label": "+",
+ "aliases": [
+ "KC_PPLS"
+ ]
+ },
+ "0x0058": {
+ "group": "basic",
+ "key": "KC_KP_ENTER",
+ "label": "Enter",
+ "aliases": [
+ "KC_PENT"
+ ]
+ },
+ "0x0059": {
+ "group": "basic",
+ "key": "KC_KP_1",
+ "label": "1",
+ "aliases": [
+ "KC_P1"
+ ]
+ },
+ "0x005A": {
+ "group": "basic",
+ "key": "KC_KP_2",
+ "label": "2",
+ "aliases": [
+ "KC_P2"
+ ]
+ },
+ "0x005B": {
+ "group": "basic",
+ "key": "KC_KP_3",
+ "label": "3",
+ "aliases": [
+ "KC_P3"
+ ]
+ },
+ "0x005C": {
+ "group": "basic",
+ "key": "KC_KP_4",
+ "label": "4",
+ "aliases": [
+ "KC_P4"
+ ]
+ },
+ "0x005D": {
+ "group": "basic",
+ "key": "KC_KP_5",
+ "label": "5",
+ "aliases": [
+ "KC_P5"
+ ]
+ },
+ "0x005E": {
+ "group": "basic",
+ "key": "KC_KP_6",
+ "label": "6",
+ "aliases": [
+ "KC_P6"
+ ]
+ },
+ "0x005F": {
+ "group": "basic",
+ "key": "KC_KP_7",
+ "label": "7",
+ "aliases": [
+ "KC_P7"
+ ]
+ },
+ "0x0060": {
+ "group": "basic",
+ "key": "KC_KP_8",
+ "label": "8",
+ "aliases": [
+ "KC_P8"
+ ]
+ },
+ "0x0061": {
+ "group": "basic",
+ "key": "KC_KP_9",
+ "label": "9",
+ "aliases": [
+ "KC_P9"
+ ]
+ },
+ "0x0062": {
+ "group": "basic",
+ "key": "KC_KP_0",
+ "label": "0",
+ "aliases": [
+ "KC_P0"
+ ]
+ },
+ "0x0063": {
+ "group": "basic",
+ "key": "KC_KP_DOT",
+ "label": ".",
+ "aliases": [
+ "KC_PDOT"
+ ]
+ },
+ "0x0064": {
+ "group": "basic",
+ "key": "KC_NONUS_BACKSLASH",
+ "label": "\\",
+ "aliases": [
+ "KC_NUBS"
+ ]
+ },
+ "0x0065": {
+ "group": "basic",
+ "key": "KC_APPLICATION",
+ "label": "Application",
+ "aliases": [
+ "KC_APP"
+ ]
+ },
+ "0x0066": {
+ "group": "basic",
+ "key": "KC_KB_POWER",
+ "label": "Application"
+ },
+ "0x0067": {
+ "group": "basic",
+ "key": "KC_KP_EQUAL",
+ "label": "=",
+ "aliases": [
+ "KC_PEQL"
+ ]
+ },
+ "0x0068": {
+ "group": "basic",
+ "key": "KC_F13",
+ "label": "F13"
+ },
+ "0x0069": {
+ "group": "basic",
+ "key": "KC_F14",
+ "label": "F14"
+ },
+ "0x006A": {
+ "group": "basic",
+ "key": "KC_F15",
+ "label": "F15"
+ },
+ "0x006B": {
+ "group": "basic",
+ "key": "KC_F16",
+ "label": "F16"
+ },
+ "0x006C": {
+ "group": "basic",
+ "key": "KC_F17",
+ "label": "F17"
+ },
+ "0x006D": {
+ "group": "basic",
+ "key": "KC_F18",
+ "label": "F18"
+ },
+ "0x006E": {
+ "group": "basic",
+ "key": "KC_F19",
+ "label": "F19"
+ },
+ "0x006F": {
+ "group": "basic",
+ "key": "KC_F20",
+ "label": "F20"
+ },
+ "0x0070": {
+ "group": "basic",
+ "key": "KC_F21",
+ "label": "F21"
+ },
+ "0x0071": {
+ "group": "basic",
+ "key": "KC_F22",
+ "label": "F22"
+ },
+ "0x0072": {
+ "group": "basic",
+ "key": "KC_F23",
+ "label": "F23"
+ },
+ "0x0073": {
+ "group": "basic",
+ "key": "KC_F24",
+ "label": "F24"
+ },
+ "0x0074": {
+ "group": "basic",
+ "key": "KC_EXECUTE",
+ "label": "Execute",
+ "aliases": [
+ "KC_EXEC"
+ ]
+ },
+ "0x0075": {
+ "group": "basic",
+ "key": "KC_HELP",
+ "label": "Help"
+ },
+ "0x0076": {
+ "group": "basic",
+ "key": "KC_MENU",
+ "label": "Menu"
+ },
+ "0x0077": {
+ "group": "basic",
+ "key": "KC_SELECT",
+ "label": "Select",
+ "aliases": [
+ "KC_SLCT"
+ ]
+ },
+ "0x0078": {
+ "group": "basic",
+ "key": "KC_STOP",
+ "label": "Stop"
+ },
+ "0x0079": {
+ "group": "basic",
+ "key": "KC_AGAIN",
+ "label": "Again",
+ "aliases": [
+ "KC_AGIN"
+ ]
+ },
+ "0x007A": {
+ "group": "basic",
+ "key": "KC_UNDO",
+ "label": "Undo"
+ },
+ "0x007B": {
+ "group": "basic",
+ "key": "KC_CUT",
+ "label": "Cut"
+ },
+ "0x007C": {
+ "group": "basic",
+ "key": "KC_COPY",
+ "label": "Copy"
+ },
+ "0x007D": {
+ "group": "basic",
+ "key": "KC_PASTE",
+ "label": "Paste",
+ "aliases": [
+ "KC_PSTE"
+ ]
+ },
+ "0x007E": {
+ "group": "basic",
+ "key": "KC_FIND",
+ "label": "Find"
+ },
+ "0x007F": {
+ "group": "basic",
+ "key": "KC_KB_MUTE",
+ "label": "Mute"
+ },
+ "0x0080": {
+ "group": "basic",
+ "key": "KC_KB_VOLUME_UP",
+ "label": "Volume Up"
+ },
+ "0x0081": {
+ "group": "basic",
+ "key": "KC_KB_VOLUME_DOWN",
+ "label": "Volume Down"
+ },
+ "0x0082": {
+ "group": "basic",
+ "key": "KC_LOCKING_CAPS_LOCK",
+ "label": "Caps Lock",
+ "aliases": [
+ "KC_LCAP"
+ ]
+ },
+ "0x0083": {
+ "group": "basic",
+ "key": "KC_LOCKING_NUM_LOCK",
+ "label": "Num Lock",
+ "aliases": [
+ "KC_LNUM"
+ ]
+ },
+ "0x0084": {
+ "group": "basic",
+ "key": "KC_LOCKING_SCROLL_LOCK",
+ "label": "Scroll Lock",
+ "aliases": [
+ "KC_LSCR"
+ ]
+ },
+ "0x0085": {
+ "group": "basic",
+ "key": "KC_KP_COMMA",
+ "label": ",",
+ "aliases": [
+ "KC_PCMM"
+ ]
+ },
+ "0x0086": {
+ "group": "basic",
+ "key": "KC_KP_EQUAL_AS400",
+ "label": "="
+ },
+ "0x0087": {
+ "group": "basic",
+ "key": "KC_INTERNATIONAL_1",
+ "label": "INT 1",
+ "aliases": [
+ "KC_INT1"
+ ]
+ },
+ "0x0088": {
+ "group": "basic",
+ "key": "KC_INTERNATIONAL_2",
+ "label": "INT 2",
+ "aliases": [
+ "KC_INT2"
+ ]
+ },
+ "0x0089": {
+ "group": "basic",
+ "key": "KC_INTERNATIONAL_3",
+ "label": "INT 3",
+ "aliases": [
+ "KC_INT3"
+ ]
+ },
+ "0x008A": {
+ "group": "basic",
+ "key": "KC_INTERNATIONAL_4",
+ "label": "INT 4",
+ "aliases": [
+ "KC_INT4"
+ ]
+ },
+ "0x008B": {
+ "group": "basic",
+ "key": "KC_INTERNATIONAL_5",
+ "label": "INT 5",
+ "aliases": [
+ "KC_INT5"
+ ]
+ },
+ "0x008C": {
+ "group": "basic",
+ "key": "KC_INTERNATIONAL_6",
+ "label": "INT 6",
+ "aliases": [
+ "KC_INT6"
+ ]
+ },
+ "0x008D": {
+ "group": "basic",
+ "key": "KC_INTERNATIONAL_7",
+ "label": "INT 7",
+ "aliases": [
+ "KC_INT7"
+ ]
+ },
+ "0x008E": {
+ "group": "basic",
+ "key": "KC_INTERNATIONAL_8",
+ "label": "INT 8",
+ "aliases": [
+ "KC_INT8"
+ ]
+ },
+ "0x008F": {
+ "group": "basic",
+ "key": "KC_INTERNATIONAL_9",
+ "label": "INT 9",
+ "aliases": [
+ "KC_INT9"
+ ]
+ },
+ "0x0090": {
+ "group": "basic",
+ "key": "KC_LANGUAGE_1",
+ "label": "LANG 1",
+ "aliases": [
+ "KC_LNG1"
+ ]
+ },
+ "0x0091": {
+ "group": "basic",
+ "key": "KC_LANGUAGE_2",
+ "label": "LANG 2",
+ "aliases": [
+ "KC_LNG2"
+ ]
+ },
+ "0x0092": {
+ "group": "basic",
+ "key": "KC_LANGUAGE_3",
+ "label": "LANG 3",
+ "aliases": [
+ "KC_LNG3"
+ ]
+ },
+ "0x0093": {
+ "group": "basic",
+ "key": "KC_LANGUAGE_4",
+ "label": "LANG 4",
+ "aliases": [
+ "KC_LNG4"
+ ]
+ },
+ "0x0094": {
+ "group": "basic",
+ "key": "KC_LANGUAGE_5",
+ "label": "LANG 5",
+ "aliases": [
+ "KC_LNG5"
+ ]
+ },
+ "0x0095": {
+ "group": "basic",
+ "key": "KC_LANGUAGE_6",
+ "label": "LANG 6",
+ "aliases": [
+ "KC_LNG6"
+ ]
+ },
+ "0x0096": {
+ "group": "basic",
+ "key": "KC_LANGUAGE_7",
+ "label": "LANG 7",
+ "aliases": [
+ "KC_LNG7"
+ ]
+ },
+ "0x0097": {
+ "group": "basic",
+ "key": "KC_LANGUAGE_8",
+ "label": "LANG 8",
+ "aliases": [
+ "KC_LNG8"
+ ]
+ },
+ "0x0098": {
+ "group": "basic",
+ "key": "KC_LANGUAGE_9",
+ "label": "LANG 9",
+ "aliases": [
+ "KC_LNG9"
+ ]
+ },
+ "0x0099": {
+ "group": "basic",
+ "key": "KC_ALTERNATE_ERASE",
+ "label": "Alternate Erase",
+ "aliases": [
+ "KC_ERAS"
+ ]
+ },
+ "0x009A": {
+ "group": "basic",
+ "key": "KC_SYSTEM_REQUEST",
+ "label": "SysReq/Attention",
+ "aliases": [
+ "KC_SYRQ"
+ ]
+ },
+ "0x009B": {
+ "group": "basic",
+ "key": "KC_CANCEL",
+ "label": "Cancel",
+ "aliases": [
+ "KC_CNCL"
+ ]
+ },
+ "0x009C": {
+ "group": "basic",
+ "key": "KC_CLEAR",
+ "label": "Clear",
+ "aliases": [
+ "KC_CLR"
+ ]
+ },
+ "0x009D": {
+ "group": "basic",
+ "key": "KC_PRIOR",
+ "label": "Prior",
+ "aliases": [
+ "KC_PRIR"
+ ]
+ },
+ "0x009E": {
+ "group": "basic",
+ "key": "KC_RETURN",
+ "label": "Return",
+ "aliases": [
+ "KC_RETN"
+ ]
+ },
+ "0x009F": {
+ "group": "basic",
+ "key": "KC_SEPARATOR",
+ "label": "Separator",
+ "aliases": [
+ "KC_SEPR"
+ ]
+ },
+ "0x00A0": {
+ "group": "basic",
+ "key": "KC_OUT",
+ "label": "Out"
+ },
+ "0x00A1": {
+ "group": "basic",
+ "key": "KC_OPER",
+ "label": "Oper"
+ },
+ "0x00A2": {
+ "group": "basic",
+ "key": "KC_CLEAR_AGAIN",
+ "label": "Clear/Again",
+ "aliases": [
+ "KC_CLAG"
+ ]
+ },
+ "0x00A3": {
+ "group": "basic",
+ "key": "KC_CRSEL",
+ "label": "CrSel/Props",
+ "aliases": [
+ "KC_CRSL"
+ ]
+ },
+ "0x00A4": {
+ "group": "basic",
+ "key": "KC_EXSEL",
+ "label": "ExSel",
+ "aliases": [
+ "KC_EXSL"
+ ]
+ },
+ "0x00A5": {
+ "group": "system",
+ "key": "KC_SYSTEM_POWER",
+ "label": "System Power Down",
+ "aliases": [
+ "KC_PWR"
+ ]
+ },
+ "0x00A6": {
+ "group": "system",
+ "key": "KC_SYSTEM_SLEEP",
+ "label": "System Sleep",
+ "aliases": [
+ "KC_SLEP"
+ ]
+ },
+ "0x00A7": {
+ "group": "system",
+ "key": "KC_SYSTEM_WAKE",
+ "label": "System Wake",
+ "aliases": [
+ "KC_WAKE"
+ ]
+ },
+ "0x00A8": {
+ "group": "media",
+ "key": "KC_AUDIO_MUTE",
+ "label": "Mute",
+ "aliases": [
+ "KC_MUTE"
+ ]
+ },
+ "0x00A9": {
+ "group": "media",
+ "key": "KC_AUDIO_VOL_UP",
+ "label": "Volume Up",
+ "aliases": [
+ "KC_VOLU"
+ ]
+ },
+ "0x00AA": {
+ "group": "media",
+ "key": "KC_AUDIO_VOL_DOWN",
+ "label": "Volume Down",
+ "aliases": [
+ "KC_VOLD"
+ ]
+ },
+ "0x00AB": {
+ "group": "media",
+ "key": "KC_MEDIA_NEXT_TRACK",
+ "label": "Next",
+ "aliases": [
+ "KC_MNXT"
+ ]
+ },
+ "0x00AC": {
+ "group": "media",
+ "key": "KC_MEDIA_PREV_TRACK",
+ "label": "Previous",
+ "aliases": [
+ "KC_MPRV"
+ ]
+ },
+ "0x00AD": {
+ "group": "media",
+ "key": "KC_MEDIA_STOP",
+ "label": "Stop",
+ "aliases": [
+ "KC_MSTP"
+ ]
+ },
+ "0x00AE": {
+ "group": "media",
+ "key": "KC_MEDIA_PLAY_PAUSE",
+ "label": "Mute",
+ "aliases": [
+ "KC_MPLY"
+ ]
+ },
+ "0x00AF": {
+ "group": "media",
+ "key": "KC_MEDIA_SELECT",
+ "label": "Launch Player",
+ "aliases": [
+ "KC_MSEL"
+ ]
+ },
+ "0x00B0": {
+ "group": "media",
+ "key": "KC_MEDIA_EJECT",
+ "label": "Eject",
+ "aliases": [
+ "KC_EJCT"
+ ]
+ },
+ "0x00B1": {
+ "group": "media",
+ "key": "KC_MAIL",
+ "label": "Launch Mail"
+ },
+ "0x00B2": {
+ "group": "media",
+ "key": "KC_CALCULATOR",
+ "label": "Launch Calculator",
+ "aliases": [
+ "KC_CALC"
+ ]
+ },
+ "0x00B3": {
+ "group": "media",
+ "key": "KC_MY_COMPUTER",
+ "label": "Launch My Computer",
+ "aliases": [
+ "KC_MYCM"
+ ]
+ },
+ "0x00B4": {
+ "group": "media",
+ "key": "KC_WWW_SEARCH",
+ "label": "Browser Search",
+ "aliases": [
+ "KC_WSCH"
+ ]
+ },
+ "0x00B5": {
+ "group": "media",
+ "key": "KC_WWW_HOME",
+ "label": "Browser Home",
+ "aliases": [
+ "KC_WHOM"
+ ]
+ },
+ "0x00B6": {
+ "group": "media",
+ "key": "KC_WWW_BACK",
+ "label": "Browser Back",
+ "aliases": [
+ "KC_WBAK"
+ ]
+ },
+ "0x00B7": {
+ "group": "media",
+ "key": "KC_WWW_FORWARD",
+ "label": "Browser Forward",
+ "aliases": [
+ "KC_WFWD"
+ ]
+ },
+ "0x00B8": {
+ "group": "media",
+ "key": "KC_WWW_STOP",
+ "label": "Browser Stop",
+ "aliases": [
+ "KC_WSTP"
+ ]
+ },
+ "0x00B9": {
+ "group": "media",
+ "key": "KC_WWW_REFRESH",
+ "label": "Browser Refresh",
+ "aliases": [
+ "KC_WREF"
+ ]
+ },
+ "0x00BA": {
+ "group": "media",
+ "key": "KC_WWW_FAVORITES",
+ "label": "Browser Favorites",
+ "aliases": [
+ "KC_WFAV"
+ ]
+ },
+ "0x00BB": {
+ "group": "media",
+ "key": "KC_MEDIA_FAST_FORWARD",
+ "label": "Next Track",
+ "aliases": [
+ "KC_MFFD"
+ ]
+ },
+ "0x00BC": {
+ "group": "media",
+ "key": "KC_MEDIA_REWIND",
+ "label": "Previous Track",
+ "aliases": [
+ "KC_MRWD"
+ ]
+ },
+ "0x00BD": {
+ "group": "media",
+ "key": "KC_BRIGHTNESS_UP",
+ "label": "Brightness Up",
+ "aliases": [
+ "KC_BRIU"
+ ]
+ },
+ "0x00BE": {
+ "group": "media",
+ "key": "KC_BRIGHTNESS_DOWN",
+ "label": "Brightness Down",
+ "aliases": [
+ "KC_BRID"
+ ]
+ },
+ "0x00BF": {
+ "group": "media",
+ "key": "KC_CONTROL_PANEL",
+ "label": "Open Control Panel",
+ "aliases": [
+ "KC_CPNL"
+ ]
+ },
+ "0x00C0": {
+ "group": "media",
+ "key": "KC_ASSISTANT",
+ "label": "Launch Assistant",
+ "aliases": [
+ "KC_ASST"
+ ]
+ },
+
+ "0x00CD": {
+ "group": "mouse",
+ "key": "KC_MS_UP",
+ "label": "Move cursor up",
+ "aliases": [
+ "KC_MS_U"
+ ]
+ },
+ "0x00CE": {
+ "group": "mouse",
+ "key": "KC_MS_DOWN",
+ "label": "Move cursor down",
+ "aliases": [
+ "KC_MS_D"
+ ]
+ },
+ "0x00CF": {
+ "group": "mouse",
+ "key": "KC_MS_LEFT",
+ "label": "Move cursor left",
+ "aliases": [
+ "KC_MS_L"
+ ]
+ },
+ "0x00D0": {
+ "group": "mouse",
+ "key": "KC_MS_RIGHT",
+ "label": "Move cursor right",
+ "aliases": [
+ "KC_MS_R"
+ ]
+ },
+ "0x00D1": {
+ "group": "mouse",
+ "key": "KC_MS_BTN1",
+ "label": "Press button 1",
+ "aliases": [
+ "KC_BTN1"
+ ]
+ },
+ "0x00D2": {
+ "group": "mouse",
+ "key": "KC_MS_BTN2",
+ "label": "Press button 2",
+ "aliases": [
+ "KC_BTN2"
+ ]
+ },
+ "0x00D3": {
+ "group": "mouse",
+ "key": "KC_MS_BTN3",
+ "label": "Press button 3",
+ "aliases": [
+ "KC_BTN3"
+ ]
+ },
+ "0x00D4": {
+ "group": "mouse",
+ "key": "KC_MS_BTN4",
+ "label": "Press button 4",
+ "aliases": [
+ "KC_BTN4"
+ ]
+ },
+ "0x00D5": {
+ "group": "mouse",
+ "key": "KC_MS_BTN5",
+ "label": "Press button 5",
+ "aliases": [
+ "KC_BTN5"
+ ]
+ },
+ "0x00D6": {
+ "group": "mouse",
+ "key": "KC_MS_BTN6",
+ "label": "Press button 6",
+ "aliases": [
+ "KC_BTN6"
+ ]
+ },
+ "0x00D7": {
+ "group": "mouse",
+ "key": "KC_MS_BTN7",
+ "label": "Press button 7",
+ "aliases": [
+ "KC_BTN7"
+ ]
+ },
+ "0x00D8": {
+ "group": "mouse",
+ "key": "KC_MS_BTN8",
+ "label": "Press button 8",
+ "aliases": [
+ "KC_BTN8"
+ ]
+ },
+ "0x00D9": {
+ "group": "mouse",
+ "key": "KC_MS_WH_UP",
+ "label": "Move wheel up",
+ "aliases": [
+ "KC_WH_U"
+ ]
+ },
+ "0x00DA": {
+ "group": "mouse",
+ "key": "KC_MS_WH_DOWN",
+ "label": "Move wheel down",
+ "aliases": [
+ "KC_WH_D"
+ ]
+ },
+ "0x00DB": {
+ "group": "mouse",
+ "key": "KC_MS_WH_LEFT",
+ "label": "Move wheel left",
+ "aliases": [
+ "KC_WH_L"
+ ]
+ },
+ "0x00DC": {
+ "group": "mouse",
+ "key": "KC_MS_WH_RIGHT",
+ "label": "Move wheel right",
+ "aliases": [
+ "KC_WH_R"
+ ]
+ },
+ "0x00DD": {
+ "group": "mouse",
+ "key": "KC_MS_ACCEL0",
+ "label": "Set speed to 0",
+ "aliases": [
+ "KC_ACL0"
+ ]
+ },
+ "0x00DE": {
+ "group": "mouse",
+ "key": "KC_MS_ACCEL1",
+ "label": "Set speed to 1",
+ "aliases": [
+ "KC_ACL1"
+ ]
+ },
+ "0x00DF": {
+ "group": "mouse",
+ "key": "KC_MS_ACCEL2",
+ "label": "Set speed to 2",
+ "aliases": [
+ "KC_ACL2"
+ ]
+ },
+
+ "0x00E0": {
+ "group": "modifiers",
+ "key": "KC_LEFT_CTRL",
+ "label": "Left Control",
+ "aliases": [
+ "KC_LCTL"
+ ]
+ },
+ "0x00E1": {
+ "group": "modifiers",
+ "key": "KC_LEFT_SHIFT",
+ "label": "Left Shift",
+ "aliases": [
+ "KC_LSFT"
+ ]
+ },
+ "0x00E2": {
+ "group": "modifiers",
+ "key": "KC_LEFT_ALT",
+ "label": "Left Alt",
+ "aliases": [
+ "KC_LALT",
+ "KC_LOPT"
+ ]
+ },
+ "0x00E3": {
+ "group": "modifiers",
+ "key": "KC_LEFT_GUI",
+ "label": "Left GUI",
+ "aliases": [
+ "KC_LGUI",
+ "KC_LCMD",
+ "KC_LWIN"
+ ]
+ },
+ "0x00E4": {
+ "group": "modifiers",
+ "key": "KC_RIGHT_CTRL",
+ "label": "Right Control",
+ "aliases": [
+ "KC_RCTL"
+ ]
+ },
+ "0x00E5": {
+ "group": "modifiers",
+ "key": "KC_RIGHT_SHIFT",
+ "label": "Right Shift",
+ "aliases": [
+ "KC_RSFT"
+ ]
+ },
+ "0x00E6": {
+ "group": "modifiers",
+ "key": "KC_RIGHT_ALT",
+ "label": "Right Alt",
+ "aliases": [
+ "KC_RALT",
+ "KC_ROPT",
+ "KC_ALGR"
+ ]
+ },
+ "0x00E7": {
+ "group": "modifiers",
+ "key": "KC_RIGHT_GUI",
+ "label": "Right GUI",
+ "aliases": [
+ "KC_RGUI",
+ "KC_RCMD",
+ "KC_RWIN"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/data/constants/keycodes/keycodes_0.0.1_joystick.hjson b/data/constants/keycodes/keycodes_0.0.1_joystick.hjson
new file mode 100644
index 0000000000..0bda7c29f3
--- /dev/null
+++ b/data/constants/keycodes/keycodes_0.0.1_joystick.hjson
@@ -0,0 +1,228 @@
+{
+ "keycodes": {
+ "0x7400": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_0",
+ "aliases": [
+ "JS_0"
+ ]
+ },
+ "0x7401": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_1",
+ "aliases": [
+ "JS_1"
+ ]
+ },
+ "0x7402": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_2",
+ "aliases": [
+ "JS_2"
+ ]
+ },
+ "0x7403": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_3",
+ "aliases": [
+ "JS_3"
+ ]
+ },
+ "0x7404": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_4",
+ "aliases": [
+ "JS_4"
+ ]
+ },
+ "0x7405": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_5",
+ "aliases": [
+ "JS_5"
+ ]
+ },
+ "0x7406": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_6",
+ "aliases": [
+ "JS_6"
+ ]
+ },
+ "0x7407": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_7",
+ "aliases": [
+ "JS_7"
+ ]
+ },
+ "0x7408": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_8",
+ "aliases": [
+ "JS_8"
+ ]
+ },
+ "0x7409": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_9",
+ "aliases": [
+ "JS_9"
+ ]
+ },
+ "0x740A": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_10",
+ "aliases": [
+ "JS_10"
+ ]
+ },
+ "0x740B": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_11",
+ "aliases": [
+ "JS_11"
+ ]
+ },
+ "0x740C": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_12",
+ "aliases": [
+ "JS_12"
+ ]
+ },
+ "0x740D": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_13",
+ "aliases": [
+ "JS_13"
+ ]
+ },
+ "0x740E": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_14",
+ "aliases": [
+ "JS_14"
+ ]
+ },
+ "0x740F": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_15",
+ "aliases": [
+ "JS_15"
+ ]
+ },
+ "0x7410": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_16",
+ "aliases": [
+ "JS_16"
+ ]
+ },
+ "0x7411": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_17",
+ "aliases": [
+ "JS_17"
+ ]
+ },
+ "0x7412": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_18",
+ "aliases": [
+ "JS_18"
+ ]
+ },
+ "0x7413": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_19",
+ "aliases": [
+ "JS_19"
+ ]
+ },
+ "0x7414": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_20",
+ "aliases": [
+ "JS_20"
+ ]
+ },
+ "0x7415": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_21",
+ "aliases": [
+ "JS_21"
+ ]
+ },
+ "0x7416": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_22",
+ "aliases": [
+ "JS_22"
+ ]
+ },
+ "0x7417": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_23",
+ "aliases": [
+ "JS_23"
+ ]
+ },
+ "0x7418": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_24",
+ "aliases": [
+ "JS_24"
+ ]
+ },
+ "0x7419": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_25",
+ "aliases": [
+ "JS_25"
+ ]
+ },
+ "0x741A": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_26",
+ "aliases": [
+ "JS_26"
+ ]
+ },
+ "0x741B": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_27",
+ "aliases": [
+ "JS_27"
+ ]
+ },
+ "0x741C": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_28",
+ "aliases": [
+ "JS_28"
+ ]
+ },
+ "0x741D": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_29",
+ "aliases": [
+ "JS_29"
+ ]
+ },
+ "0x741E": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_30",
+ "aliases": [
+ "JS_30"
+ ]
+ },
+ "0x741F": {
+ "group": "joystick",
+ "key": "QK_JOYSTICK_BUTTON_31",
+ "aliases": [
+ "JS_31"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/data/constants/keycodes/keycodes_0.0.1_lighting.hjson b/data/constants/keycodes/keycodes_0.0.1_lighting.hjson
new file mode 100644
index 0000000000..77275cec29
--- /dev/null
+++ b/data/constants/keycodes/keycodes_0.0.1_lighting.hjson
@@ -0,0 +1,175 @@
+{
+ "keycodes": {
+ "0x7800": {
+ "group": "backlight",
+ "key": "QK_BACKLIGHT_ON",
+ "aliases": [
+ "BL_ON"
+ ]
+ },
+ "0x7801": {
+ "group": "backlight",
+ "key": "QK_BACKLIGHT_OFF",
+ "aliases": [
+ "BL_OFF"
+ ]
+ },
+ "0x7802": {
+ "group": "backlight",
+ "key": "QK_BACKLIGHT_TOGGLE",
+ "aliases": [
+ "BL_TOGG"
+ ]
+ },
+ "0x7803": {
+ "group": "backlight",
+ "key": "QK_BACKLIGHT_DOWN",
+ "aliases": [
+ "BL_DOWN"
+ ]
+ },
+ "0x7804": {
+ "group": "backlight",
+ "key": "QK_BACKLIGHT_UP",
+ "aliases": [
+ "BL_UP"
+ ]
+ },
+ "0x7805": {
+ "group": "backlight",
+ "key": "QK_BACKLIGHT_STEP",
+ "aliases": [
+ "BL_STEP"
+ ]
+ },
+ "0x7806": {
+ "group": "backlight",
+ "key": "QK_BACKLIGHT_TOGGLE_BREATHING",
+ "aliases": [
+ "BL_BRTG"
+ ]
+ },
+
+ "0x7820": {
+ "group": "rgb",
+ "key": "RGB_TOG"
+ },
+ "0x7821": {
+ "group": "rgb",
+ "key": "RGB_MODE_FORWARD",
+ "aliases": [
+ "RGB_MOD"
+ ]
+ },
+ "0x7822": {
+ "group": "rgb",
+ "key": "RGB_MODE_REVERSE",
+ "aliases": [
+ "RGB_RMOD"
+ ]
+ },
+ "0x7823": {
+ "group": "rgb",
+ "key": "RGB_HUI"
+ },
+ "0x7824": {
+ "group": "rgb",
+ "key": "RGB_HUD"
+ },
+ "0x7825": {
+ "group": "rgb",
+ "key": "RGB_SAI"
+ },
+ "0x7826": {
+ "group": "rgb",
+ "key": "RGB_SAD"
+ },
+ "0x7827": {
+ "group": "rgb",
+ "key": "RGB_VAI"
+ },
+ "0x7828": {
+ "group": "rgb",
+ "key": "RGB_VAD"
+ },
+ "0x7829": {
+ "group": "rgb",
+ "key": "RGB_SPI"
+ },
+ "0x782A": {
+ "group": "rgb",
+ "key": "RGB_SPD"
+ },
+
+ "0x782B": {
+ "group": "rgb",
+ "key": "RGB_MODE_PLAIN",
+ "aliases": [
+ "RGB_M_P"
+ ]
+ },
+ "0x782C": {
+ "group": "rgb",
+ "key": "RGB_MODE_BREATHE",
+ "aliases": [
+ "RGB_M_B"
+ ]
+ },
+ "0x782D": {
+ "group": "rgb",
+ "key": "RGB_MODE_RAINBOW",
+ "aliases": [
+ "RGB_M_R"
+ ]
+ },
+ "0x782E": {
+ "group": "rgb",
+ "key": "RGB_MODE_SWIRL",
+ "aliases": [
+ "RGB_M_SW"
+ ]
+ },
+ "0x782F": {
+ "group": "rgb",
+ "key": "RGB_MODE_SNAKE",
+ "aliases": [
+ "RGB_M_SN"
+ ]
+ },
+ "0x7830": {
+ "group": "rgb",
+ "key": "RGB_MODE_KNIGHT",
+ "aliases": [
+ "RGB_M_K"
+ ]
+ },
+ "0x7831": {
+ "group": "rgb",
+ "key": "RGB_MODE_XMAS",
+ "aliases": [
+ "RGB_M_X"
+ ]
+ },
+ "0x7832": {
+ "group": "rgb",
+ "key": "RGB_MODE_GRADIENT",
+ "aliases": [
+ "RGB_M_G"
+ ]
+ },
+ "0x7833": {
+ "group": "rgb",
+ "key": "RGB_MODE_RGBTEST",
+ "aliases": [
+ "RGB_M_T"
+ ]
+ },
+ "0x7834": {
+ "group": "rgb",
+ "key": "RGB_MODE_TWINKLE",
+ "aliases": [
+ "RGB_M_TW"
+ ]
+ }
+ }
+}
diff --git a/data/constants/keycodes/keycodes_0.0.1_macro.hjson b/data/constants/keycodes/keycodes_0.0.1_macro.hjson
new file mode 100644
index 0000000000..409853fed9
--- /dev/null
+++ b/data/constants/keycodes/keycodes_0.0.1_macro.hjson
@@ -0,0 +1,229 @@
+{
+ "keycodes": {
+
+ "0x7700": {
+ "group": "macro",
+ "key": "QK_MACRO_0",
+ "aliases": [
+ "MC_0"
+ ]
+ },
+ "0x7701": {
+ "group": "macro",
+ "key": "QK_MACRO_1",
+ "aliases": [
+ "MC_1"
+ ]
+ },
+ "0x7702": {
+ "group": "macro",
+ "key": "QK_MACRO_2",
+ "aliases": [
+ "MC_2"
+ ]
+ },
+ "0x7703": {
+ "group": "macro",
+ "key": "QK_MACRO_3",
+ "aliases": [
+ "MC_3"
+ ]
+ },
+ "0x7704": {
+ "group": "macro",
+ "key": "QK_MACRO_4",
+ "aliases": [
+ "MC_4"
+ ]
+ },
+ "0x7705": {
+ "group": "macro",
+ "key": "QK_MACRO_5",
+ "aliases": [
+ "MC_5"
+ ]
+ },
+ "0x7706": {
+ "group": "macro",
+ "key": "QK_MACRO_6",
+ "aliases": [
+ "MC_6"
+ ]
+ },
+ "0x7707": {
+ "group": "macro",
+ "key": "QK_MACRO_7",
+ "aliases": [
+ "MC_7"
+ ]
+ },
+ "0x7708": {
+ "group": "macro",
+ "key": "QK_MACRO_8",
+ "aliases": [
+ "MC_8"
+ ]
+ },
+ "0x7709": {
+ "group": "macro",
+ "key": "QK_MACRO_9",
+ "aliases": [
+ "MC_9"
+ ]
+ },
+ "0x770A": {
+ "group": "macro",
+ "key": "QK_MACRO_10",
+ "aliases": [
+ "MC_10"
+ ]
+ },
+ "0x770B": {
+ "group": "macro",
+ "key": "QK_MACRO_11",
+ "aliases": [
+ "MC_11"
+ ]
+ },
+ "0x770C": {
+ "group": "macro",
+ "key": "QK_MACRO_12",
+ "aliases": [
+ "MC_12"
+ ]
+ },
+ "0x770D": {
+ "group": "macro",
+ "key": "QK_MACRO_13",
+ "aliases": [
+ "MC_13"
+ ]
+ },
+ "0x770E": {
+ "group": "macro",
+ "key": "QK_MACRO_14",
+ "aliases": [
+ "MC_14"
+ ]
+ },
+ "0x770F": {
+ "group": "macro",
+ "key": "QK_MACRO_15",
+ "aliases": [
+ "MC_15"
+ ]
+ },
+ "0x7710": {
+ "group": "macro",
+ "key": "QK_MACRO_16",
+ "aliases": [
+ "MC_16"
+ ]
+ },
+ "0x7711": {
+ "group": "macro",
+ "key": "QK_MACRO_17",
+ "aliases": [
+ "MC_17"
+ ]
+ },
+ "0x7712": {
+ "group": "macro",
+ "key": "QK_MACRO_18",
+ "aliases": [
+ "MC_18"
+ ]
+ },
+ "0x7713": {
+ "group": "macro",
+ "key": "QK_MACRO_19",
+ "aliases": [
+ "MC_19"
+ ]
+ },
+ "0x7714": {
+ "group": "macro",
+ "key": "QK_MACRO_20",
+ "aliases": [
+ "MC_20"
+ ]
+ },
+ "0x7715": {
+ "group": "macro",
+ "key": "QK_MACRO_21",
+ "aliases": [
+ "MC_21"
+ ]
+ },
+ "0x7716": {
+ "group": "macro",
+ "key": "QK_MACRO_22",
+ "aliases": [
+ "MC_22"
+ ]
+ },
+ "0x7717": {
+ "group": "macro",
+ "key": "QK_MACRO_23",
+ "aliases": [
+ "MC_23"
+ ]
+ },
+ "0x7718": {
+ "group": "macro",
+ "key": "QK_MACRO_24",
+ "aliases": [
+ "MC_24"
+ ]
+ },
+ "0x7719": {
+ "group": "macro",
+ "key": "QK_MACRO_25",
+ "aliases": [
+ "MC_25"
+ ]
+ },
+ "0x771A": {
+ "group": "macro",
+ "key": "QK_MACRO_26",
+ "aliases": [
+ "MC_26"
+ ]
+ },
+ "0x771B": {
+ "group": "macro",
+ "key": "QK_MACRO_27",
+ "aliases": [
+ "MC_27"
+ ]
+ },
+ "0x771C": {
+ "group": "macro",
+ "key": "QK_MACRO_28",
+ "aliases": [
+ "MC_28"
+ ]
+ },
+ "0x771D": {
+ "group": "macro",
+ "key": "QK_MACRO_29",
+ "aliases": [
+ "MC_29"
+ ]
+ },
+ "0x771E": {
+ "group": "macro",
+ "key": "QK_MACRO_30",
+ "aliases": [
+ "MC_30"
+ ]
+ },
+ "0x771F": {
+ "group": "macro",
+ "key": "QK_MACRO_31",
+ "aliases": [
+ "MC_31"
+ ]
+ }
+ }
+}
diff --git a/data/constants/keycodes/keycodes_0.0.1_magic.hjson b/data/constants/keycodes/keycodes_0.0.1_magic.hjson
new file mode 100644
index 0000000000..7ee1f2bce9
--- /dev/null
+++ b/data/constants/keycodes/keycodes_0.0.1_magic.hjson
@@ -0,0 +1,249 @@
+{
+ "keycodes": {
+ "0x7000": {
+ "group": "magic",
+ "key": "MAGIC_SWAP_CONTROL_CAPSLOCK",
+ "aliases": [
+ "CL_SWAP"
+ ]
+ },
+ "0x7001": {
+ "group": "magic",
+ "key": "MAGIC_UNSWAP_CONTROL_CAPSLOCK",
+ "aliases": [
+ "CL_NORM"
+ ]
+ },
+ "0x7002": {
+ "group": "magic",
+ "key": "MAGIC_TOGGLE_CONTROL_CAPSLOCK",
+ "aliases": [
+ "CL_TOGG"
+ ]
+ },
+ "0x7003": {
+ "group": "magic",
+ "key": "MAGIC_UNCAPSLOCK_TO_CONTROL",
+ "aliases": [
+ "CL_CAPS"
+ ]
+ },
+ "0x7004": {
+ "group": "magic",
+ "key": "MAGIC_CAPSLOCK_TO_CONTROL",
+ "aliases": [
+ "CL_CTRL"
+ ]
+ },
+ "0x7005": {
+ "group": "magic",
+ "key": "MAGIC_SWAP_LALT_LGUI",
+ "aliases": [
+ "LAG_SWP"
+ ]
+ },
+ "0x7006": {
+ "group": "magic",
+ "key": "MAGIC_UNSWAP_LALT_LGUI",
+ "aliases": [
+ "LAG_NRM"
+ ]
+ },
+ "0x7007": {
+ "group": "magic",
+ "key": "MAGIC_SWAP_RALT_RGUI",
+ "aliases": [
+ "RAG_SWP"
+ ]
+ },
+ "0x7008": {
+ "group": "magic",
+ "key": "MAGIC_UNSWAP_RALT_RGUI",
+ "aliases": [
+ "RAG_NRM"
+ ]
+ },
+ "0x7009": {
+ "group": "magic",
+ "key": "MAGIC_UNNO_GUI",
+ "aliases": [
+ "GUI_ON"
+ ]
+ },
+ "0x700A": {
+ "group": "magic",
+ "key": "MAGIC_NO_GUI",
+ "aliases": [
+ "GUI_OFF"
+ ]
+ },
+ "0x700B": {
+ "group": "magic",
+ "key": "MAGIC_TOGGLE_GUI",
+ "aliases": [
+ "GUI_TOG"
+ ]
+ },
+ "0x700C": {
+ "group": "magic",
+ "key": "MAGIC_SWAP_GRAVE_ESC",
+ "aliases": [
+ "GE_SWAP"
+ ]
+ },
+ "0x700D": {
+ "group": "magic",
+ "key": "MAGIC_UNSWAP_GRAVE_ESC",
+ "aliases": [
+ "GE_NORM"
+ ]
+ },
+ "0x700E": {
+ "group": "magic",
+ "key": "MAGIC_SWAP_BACKSLASH_BACKSPACE",
+ "aliases": [
+ "BS_SWAP"
+ ]
+ },
+ "0x700F": {
+ "group": "magic",
+ "key": "MAGIC_UNSWAP_BACKSLASH_BACKSPACE",
+ "aliases": [
+ "BS_NORM"
+ ]
+ },
+ "0x7010": {
+ "group": "magic",
+ "key": "MAGIC_TOGGLE_BACKSLASH_BACKSPACE",
+ "aliases": [
+ "BS_TOGG"
+ ]
+ },
+ "0x7011": {
+ "group": "magic",
+ "key": "MAGIC_HOST_NKRO",
+ "aliases": [
+ "NK_ON"
+ ]
+ },
+ "0x7012": {
+ "group": "magic",
+ "key": "MAGIC_UNHOST_NKRO",
+ "aliases": [
+ "NK_OFF"
+ ]
+ },
+ "0x7013": {
+ "group": "magic",
+ "key": "MAGIC_TOGGLE_NKRO",
+ "aliases": [
+ "NK_TOGG"
+ ]
+ },
+ "0x7014": {
+ "group": "magic",
+ "key": "MAGIC_SWAP_ALT_GUI",
+ "aliases": [
+ "AG_SWAP"
+ ]
+ },
+ "0x7015": {
+ "group": "magic",
+ "key": "MAGIC_UNSWAP_ALT_GUI",
+ "aliases": [
+ "AG_NORM"
+ ]
+ },
+ "0x7016": {
+ "group": "magic",
+ "key": "MAGIC_TOGGLE_ALT_GUI",
+ "aliases": [
+ "AG_TOGG"
+ ]
+ },
+ "0x7017": {
+ "group": "magic",
+ "key": "MAGIC_SWAP_LCTL_LGUI",
+ "aliases": [
+ "LCG_SWP"
+ ]
+ },
+ "0x7018": {
+ "group": "magic",
+ "key": "MAGIC_UNSWAP_LCTL_LGUI",
+ "aliases": [
+ "LCG_NRM"
+ ]
+ },
+ "0x7019": {
+ "group": "magic",
+ "key": "MAGIC_SWAP_RCTL_RGUI",
+ "aliases": [
+ "RCG_SWP"
+ ]
+ },
+ "0x701A": {
+ "group": "magic",
+ "key": "MAGIC_UNSWAP_RCTL_RGUI",
+ "aliases": [
+ "RCG_NRM"
+ ]
+ },
+ "0x701B": {
+ "group": "magic",
+ "key": "MAGIC_SWAP_CTL_GUI",
+ "aliases": [
+ "CG_SWAP"
+ ]
+ },
+ "0x701C": {
+ "group": "magic",
+ "key": "MAGIC_UNSWAP_CTL_GUI",
+ "aliases": [
+ "CG_NORM"
+ ]
+ },
+ "0x701D": {
+ "group": "magic",
+ "key": "MAGIC_TOGGLE_CTL_GUI",
+ "aliases": [
+ "CG_TOGG"
+ ]
+ },
+ "0x701E": {
+ "group": "magic",
+ "key": "MAGIC_EE_HANDS_LEFT",
+ "aliases": [
+ "EH_LEFT"
+ ]
+ },
+ "0x701F": {
+ "group": "magic",
+ "key": "MAGIC_EE_HANDS_RIGHT",
+ "aliases": [
+ "EH_RGHT"
+ ]
+ },
+ "0x7020": {
+ "group": "magic",
+ "key": "MAGIC_SWAP_ESCAPE_CAPSLOCK",
+ "aliases": [
+ "EC_SWAP"
+ ]
+ },
+ "0x7021": {
+ "group": "magic",
+ "key": "MAGIC_UNSWAP_ESCAPE_CAPSLOCK",
+ "aliases": [
+ "EC_NORM"
+ ]
+ },
+ "0x7022": {
+ "group": "magic",
+ "key": "MAGIC_TOGGLE_ESCAPE_CAPSLOCK",
+ "aliases": [
+ "EC_TOGG"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/data/constants/keycodes/keycodes_0.0.1_midi.hjson b/data/constants/keycodes/keycodes_0.0.1_midi.hjson
new file mode 100644
index 0000000000..b9826f92c9
--- /dev/null
+++ b/data/constants/keycodes/keycodes_0.0.1_midi.hjson
@@ -0,0 +1,1042 @@
+{
+ "keycodes": {
+ "0x7100": {
+ "group": "midi",
+ "key": "QK_MIDI_ON",
+ "aliases": [
+ "MI_ON"
+ ]
+ },
+ "0x7101": {
+ "group": "midi",
+ "key": "QK_MIDI_OFF",
+ "aliases": [
+ "MI_OFF"
+ ]
+ },
+ "0x7102": {
+ "group": "midi",
+ "key": "QK_MIDI_TOGGLE",
+ "aliases": [
+ "MI_TOGG"
+ ]
+ },
+ "0x7110": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_C_0",
+ "aliases": [
+ "MI_C"
+ ]
+ },
+ "0x7111": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_C_SHARP_0",
+ "aliases": [
+ "MI_Cs",
+ "MI_Db"
+ ]
+ },
+ "0x7112": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_D_0",
+ "aliases": [
+ "MI_D"
+ ]
+ },
+ "0x7113": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_D_SHARP_0",
+ "aliases": [
+ "MI_Ds",
+ "MI_Eb"
+ ]
+ },
+ "0x7114": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_E_0",
+ "aliases": [
+ "MI_E"
+ ]
+ },
+ "0x7115": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_F_0",
+ "aliases": [
+ "MI_F"
+ ]
+ },
+ "0x7116": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_F_SHARP_0",
+ "aliases": [
+ "MI_Fs",
+ "MI_Gb"
+ ]
+ },
+ "0x7117": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_G_0",
+ "aliases": [
+ "MI_G"
+ ]
+ },
+ "0x7118": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_G_SHARP_0",
+ "aliases": [
+ "MI_Gs"
+ "MI_Ab"
+ ]
+ },
+ "0x7119": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_A_0",
+ "aliases": [
+ "MI_A"
+ ]
+ },
+ "0x711A": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_A_SHARP_0",
+ "aliases": [
+ "MI_As"
+ "MI_Bb"
+ ]
+ },
+ "0x711B": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_B_0",
+ "aliases": [
+ "MI_B"
+ ]
+ },
+ "0x7120": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_C_1",
+ "aliases": [
+ "MI_C1"
+ ]
+ },
+ "0x7121": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_C_SHARP_1",
+ "aliases": [
+ "MI_Cs1",
+ "MI_Db1"
+ ]
+ },
+ "0x7122": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_D_1",
+ "aliases": [
+ "MI_D1"
+ ]
+ },
+ "0x7123": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_D_SHARP_1",
+ "aliases": [
+ "MI_Ds1",
+ "MI_Eb1"
+ ]
+ },
+ "0x7124": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_E_1",
+ "aliases": [
+ "MI_E1"
+ ]
+ },
+ "0x7125": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_F_1",
+ "aliases": [
+ "MI_F1"
+ ]
+ },
+ "0x7126": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_F_SHARP_1",
+ "aliases": [
+ "MI_Fs1",
+ "MI_Gb1"
+ ]
+ },
+ "0x7127": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_G_1",
+ "aliases": [
+ "MI_G1"
+ ]
+ },
+ "0x7128": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_G_SHARP_1",
+ "aliases": [
+ "MI_Gs1",
+ "MI_Ab1"
+ ]
+ },
+ "0x7129": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_A_1",
+ "aliases": [
+ "MI_A1"
+ ]
+ },
+ "0x712A": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_A_SHARP_1",
+ "aliases": [
+ "MI_As1",
+ "MI_Bb1"
+ ]
+ },
+ "0x712B": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_B_1",
+ "aliases": [
+ "MI_B1"
+ ]
+ },
+ "0x7130": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_C_2",
+ "aliases": [
+ "MI_C2"
+ ]
+ },
+ "0x7131": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_C_SHARP_2",
+ "aliases": [
+ "MI_Cs2",
+ "MI_Db2"
+ ]
+ },
+ "0x7132": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_D_2",
+ "aliases": [
+ "MI_D2"
+ ]
+ },
+ "0x7133": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_D_SHARP_2",
+ "aliases": [
+ "MI_Ds2",
+ "MI_Eb2"
+ ]
+ },
+ "0x7134": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_E_2",
+ "aliases": [
+ "MI_E2"
+ ]
+ },
+ "0x7135": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_F_2",
+ "aliases": [
+ "MI_F2"
+ ]
+ },
+ "0x7136": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_F_SHARP_2",
+ "aliases": [
+ "MI_Fs2",
+ "MI_Gb2"
+ ]
+ },
+ "0x7137": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_G_2",
+ "aliases": [
+ "MI_G2"
+ ]
+ },
+ "0x7138": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_G_SHARP_2",
+ "aliases": [
+ "MI_Gs2",
+ "MI_Ab2"
+ ]
+ },
+ "0x7139": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_A_2",
+ "aliases": [
+ "MI_A2"
+ ]
+ },
+ "0x713A": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_A_SHARP_2",
+ "aliases": [
+ "MI_As2",
+ "MI_Bb2"
+ ]
+ },
+ "0x713B": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_B_2",
+ "aliases": [
+ "MI_B2"
+ ]
+ },
+ "0x7140": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_C_3",
+ "aliases": [
+ "MI_C3"
+ ]
+ },
+ "0x7141": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_C_SHARP_3",
+ "aliases": [
+ "MI_Cs3",
+ "MI_Db3"
+ ]
+ },
+ "0x7142": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_D_3",
+ "aliases": [
+ "MI_D3"
+ ]
+ },
+ "0x7143": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_D_SHARP_3",
+ "aliases": [
+ "MI_Ds3",
+ "MI_Eb3"
+ ]
+ },
+ "0x7144": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_E_3",
+ "aliases": [
+ "MI_E3"
+ ]
+ },
+ "0x7145": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_F_3",
+ "aliases": [
+ "MI_F3"
+ ]
+ },
+ "0x7146": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_F_SHARP_3",
+ "aliases": [
+ "MI_Fs3",
+ "MI_Gb3"
+ ]
+ },
+ "0x7147": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_G_3",
+ "aliases": [
+ "MI_G3"
+ ]
+ },
+ "0x7148": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_G_SHARP_3",
+ "aliases": [
+ "MI_Gs3",
+ "MI_Ab3"
+ ]
+ },
+ "0x7149": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_A_3",
+ "aliases": [
+ "MI_A3"
+ ]
+ },
+ "0x714A": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_A_SHARP_3",
+ "aliases": [
+ "MI_As3",
+ "MI_Bb3"
+ ]
+ },
+ "0x714B": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_B_3",
+ "aliases": [
+ "MI_B3"
+ ]
+ },
+ "0x7150": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_C_4",
+ "aliases": [
+ "MI_C4"
+ ]
+ },
+ "0x7151": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_C_SHARP_4",
+ "aliases": [
+ "MI_Cs4",
+ "MI_Db4"
+ ]
+ },
+ "0x7152": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_D_4",
+ "aliases": [
+ "MI_D4"
+ ]
+ },
+ "0x7153": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_D_SHARP_4",
+ "aliases": [
+ "MI_Ds4",
+ "MI_Eb4"
+ ]
+ },
+ "0x7154": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_E_4",
+ "aliases": [
+ "MI_E4"
+ ]
+ },
+ "0x7155": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_F_4",
+ "aliases": [
+ "MI_F4"
+ ]
+ },
+ "0x7156": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_F_SHARP_4",
+ "aliases": [
+ "MI_Fs4",
+ "MI_Gb4"
+ ]
+ },
+ "0x7157": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_G_4",
+ "aliases": [
+ "MI_G4"
+ ]
+ },
+ "0x7158": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_G_SHARP_4",
+ "aliases": [
+ "MI_Gs4",
+ "MI_Ab4"
+ ]
+ },
+ "0x7159": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_A_4",
+ "aliases": [
+ "MI_A4"
+ ]
+ },
+ "0x715A": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_A_SHARP_4",
+ "aliases": [
+ "MI_As4",
+ "MI_Bb4"
+ ]
+ },
+ "0x715B": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_B_4",
+ "aliases": [
+ "MI_B4"
+ ]
+ },
+ "0x7160": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_C_5",
+ "aliases": [
+ "MI_C5"
+ ]
+ },
+ "0x7161": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_C_SHARP_5",
+ "aliases": [
+ "MI_Cs5",
+ "MI_Db5"
+ ]
+ },
+ "0x7162": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_D_5",
+ "aliases": [
+ "MI_D5"
+ ]
+ },
+ "0x7163": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_D_SHARP_5",
+ "aliases": [
+ "MI_Ds5",
+ "MI_Eb5"
+ ]
+ },
+ "0x7164": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_E_5",
+ "aliases": [
+ "MI_E5"
+ ]
+ },
+ "0x7165": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_F_5",
+ "aliases": [
+ "MI_F5"
+ ]
+ },
+ "0x7166": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_F_SHARP_5",
+ "aliases": [
+ "MI_Fs5",
+ "MI_Gb5"
+ ]
+ },
+ "0x7167": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_G_5",
+ "aliases": [
+ "MI_G5"
+ ]
+ },
+ "0x7168": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_G_SHARP_5",
+ "aliases": [
+ "MI_Gs5",
+ "MI_Ab5"
+ ]
+ },
+ "0x7169": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_A_5",
+ "aliases": [
+ "MI_A5"
+ ]
+ },
+ "0x716A": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_A_SHARP_5",
+ "aliases": [
+ "MI_As5",
+ "MI_Bb5"
+ ]
+ },
+ "0x716B": {
+ "group": "midi",
+ "key": "QK_MIDI_NOTE_B_5",
+ "aliases": [
+ "MI_B5"
+ ]
+ },
+ "0x7170": {
+ "group": "midi",
+ "key": "QK_MIDI_OCTAVE_N2",
+ "aliases": [
+ "MI_OCN2"
+ ]
+ },
+ "0x7171": {
+ "group": "midi",
+ "key": "QK_MIDI_OCTAVE_N1",
+ "aliases": [
+ "MI_OCN1"
+ ]
+ },
+ "0x7172": {
+ "group": "midi",
+ "key": "QK_MIDI_OCTAVE_0",
+ "aliases": [
+ "MI_OC0"
+ ]
+ },
+ "0x7173": {
+ "group": "midi",
+ "key": "QK_MIDI_OCTAVE_1",
+ "aliases": [
+ "MI_OC1"
+ ]
+ },
+ "0x7174": {
+ "group": "midi",
+ "key": "QK_MIDI_OCTAVE_2",
+ "aliases": [
+ "MI_OC2"
+ ]
+ },
+ "0x7175": {
+ "group": "midi",
+ "key": "QK_MIDI_OCTAVE_3",
+ "aliases": [
+ "MI_OC3"
+ ]
+ },
+ "0x7176": {
+ "group": "midi",
+ "key": "QK_MIDI_OCTAVE_4",
+ "aliases": [
+ "MI_OC4"
+ ]
+ },
+ "0x7177": {
+ "group": "midi",
+ "key": "QK_MIDI_OCTAVE_5",
+ "aliases": [
+ "MI_OC5"
+ ]
+ },
+ "0x7178": {
+ "group": "midi",
+ "key": "QK_MIDI_OCTAVE_6",
+ "aliases": [
+ "MI_OC6"
+ ]
+ },
+ "0x7179": {
+ "group": "midi",
+ "key": "QK_MIDI_OCTAVE_7",
+ "aliases": [
+ "MI_OC7"
+ ]
+ },
+ "0x717A": {
+ "group": "midi",
+ "key": "QK_MIDI_OCTAVE_DOWN",
+ "aliases": [
+ "MI_OCTD"
+ ]
+ },
+ "0x717B": {
+ "group": "midi",
+ "key": "QK_MIDI_OCTAVE_UP",
+ "aliases": [
+ "MI_OCTU"
+ ]
+ },
+ "0x7180": {
+ "group": "midi",
+ "key": "QK_MIDI_TRANSPOSE_N6",
+ "aliases": [
+ "MI_TRN6"
+ ]
+ },
+ "0x7181": {
+ "group": "midi",
+ "key": "QK_MIDI_TRANSPOSE_N5",
+ "aliases": [
+ "MI_TRN5"
+ ]
+ },
+ "0x7182": {
+ "group": "midi",
+ "key": "QK_MIDI_TRANSPOSE_N4",
+ "aliases": [
+ "MI_TRN4"
+ ]
+ },
+ "0x7183": {
+ "group": "midi",
+ "key": "QK_MIDI_TRANSPOSE_N3",
+ "aliases": [
+ "MI_TRN3"
+ ]
+ },
+ "0x7184": {
+ "group": "midi",
+ "key": "QK_MIDI_TRANSPOSE_N2",
+ "aliases": [
+ "MI_TRN2"
+ ]
+ },
+ "0x7185": {
+ "group": "midi",
+ "key": "QK_MIDI_TRANSPOSE_N1",
+ "aliases": [
+ "MI_TRN1"
+ ]
+ },
+ "0x7186": {
+ "group": "midi",
+ "key": "QK_MIDI_TRANSPOSE_0",
+ "aliases": [
+ "MI_TR0"
+ ]
+ },
+ "0x7187": {
+ "group": "midi",
+ "key": "QK_MIDI_TRANSPOSE_1",
+ "aliases": [
+ "MI_TR1"
+ ]
+ },
+ "0x7188": {
+ "group": "midi",
+ "key": "QK_MIDI_TRANSPOSE_2",
+ "aliases": [
+ "MI_TR2"
+ ]
+ },
+ "0x7189": {
+ "group": "midi",
+ "key": "QK_MIDI_TRANSPOSE_3",
+ "aliases": [
+ "MI_TR3"
+ ]
+ },
+ "0x718A": {
+ "group": "midi",
+ "key": "QK_MIDI_TRANSPOSE_4",
+ "aliases": [
+ "MI_TR4"
+ ]
+ },
+ "0x718B": {
+ "group": "midi",
+ "key": "QK_MIDI_TRANSPOSE_5",
+ "aliases": [
+ "MI_TR5"
+ ]
+ },
+ "0x718C": {
+ "group": "midi",
+ "key": "QK_MIDI_TRANSPOSE_6",
+ "aliases": [
+ "MI_TR6"
+ ]
+ },
+ "0x718D": {
+ "group": "midi",
+ "key": "QK_MIDI_TRANSPOSE_DOWN",
+ "aliases": [
+ "MI_TRSD"
+ ]
+ },
+ "0x718E": {
+ "group": "midi",
+ "key": "QK_MIDI_TRANSPOSE_UP",
+ "aliases": [
+ "MI_TRSU"
+ ]
+ },
+ "0x7190": {
+ "group": "midi",
+ "key": "QK_MIDI_VELOCITY_0",
+ "aliases": [
+ "MI_VL0"
+ ]
+ },
+ "0x7191": {
+ "group": "midi",
+ "key": "QK_MIDI_VELOCITY_1",
+ "aliases": [
+ "MI_VL1"
+ ]
+ },
+ "0x7192": {
+ "group": "midi",
+ "key": "QK_MIDI_VELOCITY_2",
+ "aliases": [
+ "MI_VL2"
+ ]
+ },
+ "0x7193": {
+ "group": "midi",
+ "key": "QK_MIDI_VELOCITY_3",
+ "aliases": [
+ "MI_VL3"
+ ]
+ },
+ "0x7194": {
+ "group": "midi",
+ "key": "QK_MIDI_VELOCITY_4",
+ "aliases": [
+ "MI_VL4"
+ ]
+ },
+ "0x7195": {
+ "group": "midi",
+ "key": "QK_MIDI_VELOCITY_5",
+ "aliases": [
+ "MI_VL5"
+ ]
+ },
+ "0x7196": {
+ "group": "midi",
+ "key": "QK_MIDI_VELOCITY_6",
+ "aliases": [
+ "MI_VL6"
+ ]
+ },
+ "0x7197": {
+ "group": "midi",
+ "key": "QK_MIDI_VELOCITY_7",
+ "aliases": [
+ "MI_VL7"
+ ]
+ },
+ "0x7198": {
+ "group": "midi",
+ "key": "QK_MIDI_VELOCITY_8",
+ "aliases": [
+ "MI_VL8"
+ ]
+ },
+ "0x7199": {
+ "group": "midi",
+ "key": "QK_MIDI_VELOCITY_9",
+ "aliases": [
+ "MI_VL9"
+ ]
+ },
+ "0x719A": {
+ "group": "midi",
+ "key": "QK_MIDI_VELOCITY_10",
+ "aliases": [
+ "MI_VL10"
+ ]
+ },
+ "0x719B": {
+ "group": "midi",
+ "key": "QK_MIDI_VELOCITY_DOWN",
+ "aliases": [
+ "MI_VELD"
+ ]
+ },
+ "0x719C": {
+ "group": "midi",
+ "key": "QK_MIDI_VELOCITY_UP",
+ "aliases": [
+ "MI_VELU"
+ ]
+ },
+ "0x71A0": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_1",
+ "aliases": [
+ "MI_CH1"
+ ]
+ },
+ "0x71A1": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_2",
+ "aliases": [
+ "MI_CH2"
+ ]
+ },
+ "0x71A2": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_3",
+ "aliases": [
+ "MI_CH3"
+ ]
+ },
+ "0x71A3": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_4",
+ "aliases": [
+ "MI_CH4"
+ ]
+ },
+ "0x71A4": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_5",
+ "aliases": [
+ "MI_CH5"
+ ]
+ },
+ "0x71A5": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_6",
+ "aliases": [
+ "MI_CH6"
+ ]
+ },
+ "0x71A6": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_7",
+ "aliases": [
+ "MI_CH7"
+ ]
+ },
+ "0x71A7": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_8",
+ "aliases": [
+ "MI_CH8"
+ ]
+ },
+ "0x71A8": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_9",
+ "aliases": [
+ "MI_CH9"
+ ]
+ },
+ "0x71A9": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_10",
+ "aliases": [
+ "MI_CH10"
+ ]
+ },
+ "0x71AA": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_11",
+ "aliases": [
+ "MI_CH11"
+ ]
+ },
+ "0x71AB": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_12",
+ "aliases": [
+ "MI_CH12"
+ ]
+ },
+ "0x71AC": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_13",
+ "aliases": [
+ "MI_CH13"
+ ]
+ },
+ "0x71AD": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_14",
+ "aliases": [
+ "MI_CH14"
+ ]
+ },
+ "0x71AE": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_15",
+ "aliases": [
+ "MI_CH15"
+ ]
+ },
+ "0x71AF": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_16",
+ "aliases": [
+ "MI_CH16"
+ ]
+ },
+ "0x71B0": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_DOWN",
+ "aliases": [
+ "MI_CHND"
+ ]
+ },
+ "0x71B1": {
+ "group": "midi",
+ "key": "QK_MIDI_CHANNEL_UP",
+ "aliases": [
+ "MI_CHNU"
+ ]
+ },
+ "0x71C0": {
+ "group": "midi",
+ "key": "QK_MIDI_ALL_NOTES_OFF",
+ "aliases": [
+ "MI_AOFF"
+ ]
+ },
+ "0x71C1": {
+ "group": "midi",
+ "key": "QK_MIDI_SUSTAIN",
+ "aliases": [
+ "MI_SUST"
+ ]
+ },
+ "0x71C2": {
+ "group": "midi",
+ "key": "QK_MIDI_PORTAMENTO",
+ "aliases": [
+ "MI_PORT"
+ ]
+ },
+ "0x71C3": {
+ "group": "midi",
+ "key": "QK_MIDI_SOSTENUTO",
+ "aliases": [
+ "MI_SOST"
+ ]
+ },
+ "0x71C4": {
+ "group": "midi",
+ "key": "QK_MIDI_SOFT",
+ "aliases": [
+ "MI_SOFT"
+ ]
+ },
+ "0x71C5": {
+ "group": "midi",
+ "key": "QK_MIDI_LEGATO",
+ "aliases": [
+ "MI_LEG"
+ ]
+ },
+ "0x71C6": {
+ "group": "midi",
+ "key": "QK_MIDI_MODULATION",
+ "aliases": [
+ "MI_MOD"
+ ]
+ },
+ "0x71C7": {
+ "group": "midi",
+ "key": "QK_MIDI_MODULATION_SPEED_DOWN",
+ "aliases": [
+ "MI_MODD"
+ ]
+ },
+ "0x71C8": {
+ "group": "midi",
+ "key": "QK_MIDI_MODULATION_SPEED_UP",
+ "aliases": [
+ "MI_MODU"
+ ]
+ },
+ "0x71C9": {
+ "group": "midi",
+ "key": "QK_MIDI_PITCH_BEND_DOWN",
+ "aliases": [
+ "MI_BNDD"
+ ]
+ },
+ "0x71CA": {
+ "group": "midi",
+ "key": "QK_MIDI_PITCH_BEND_UP",
+ "aliases": [
+ "MI_BNDU"
+ ]
+ }
+ }
+}
diff --git a/data/constants/keycodes/keycodes_0.0.1_programmable_button.hjson b/data/constants/keycodes/keycodes_0.0.1_programmable_button.hjson
new file mode 100644
index 0000000000..645bcd6a39
--- /dev/null
+++ b/data/constants/keycodes/keycodes_0.0.1_programmable_button.hjson
@@ -0,0 +1,228 @@
+{
+ "keycodes": {
+ "0x7440": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_1",
+ "aliases": [
+ "PB_1"
+ ]
+ },
+ "0x7441": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_2",
+ "aliases": [
+ "PB_2"
+ ]
+ },
+ "0x7442": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_3",
+ "aliases": [
+ "PB_3"
+ ]
+ },
+ "0x7443": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_4",
+ "aliases": [
+ "PB_4"
+ ]
+ },
+ "0x7444": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_5",
+ "aliases": [
+ "PB_5"
+ ]
+ },
+ "0x7445": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_6",
+ "aliases": [
+ "PB_6"
+ ]
+ },
+ "0x7446": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_7",
+ "aliases": [
+ "PB_7"
+ ]
+ },
+ "0x7447": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_8",
+ "aliases": [
+ "PB_8"
+ ]
+ },
+ "0x7448": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_9",
+ "aliases": [
+ "PB_9"
+ ]
+ },
+ "0x7449": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_10",
+ "aliases": [
+ "PB_10"
+ ]
+ },
+ "0x744A": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_11",
+ "aliases": [
+ "PB_11"
+ ]
+ },
+ "0x744B": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_12",
+ "aliases": [
+ "PB_12"
+ ]
+ },
+ "0x744C": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_13",
+ "aliases": [
+ "PB_13"
+ ]
+ },
+ "0x744D": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_14",
+ "aliases": [
+ "PB_14"
+ ]
+ },
+ "0x744E": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_15",
+ "aliases": [
+ "PB_15"
+ ]
+ },
+ "0x744F": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_16",
+ "aliases": [
+ "PB_16"
+ ]
+ },
+ "0x7450": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_17",
+ "aliases": [
+ "PB_17"
+ ]
+ },
+ "0x7451": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_18",
+ "aliases": [
+ "PB_18"
+ ]
+ },
+ "0x7452": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_19",
+ "aliases": [
+ "PB_19"
+ ]
+ },
+ "0x7453": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_20",
+ "aliases": [
+ "PB_20"
+ ]
+ },
+ "0x7454": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_21",
+ "aliases": [
+ "PB_21"
+ ]
+ },
+ "0x7455": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_22",
+ "aliases": [
+ "PB_22"
+ ]
+ },
+ "0x7456": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_23",
+ "aliases": [
+ "PB_23"
+ ]
+ },
+ "0x7457": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_24",
+ "aliases": [
+ "PB_24"
+ ]
+ },
+ "0x7458": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_25",
+ "aliases": [
+ "PB_25"
+ ]
+ },
+ "0x7459": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_26",
+ "aliases": [
+ "PB_26"
+ ]
+ },
+ "0x745A": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_27",
+ "aliases": [
+ "PB_27"
+ ]
+ },
+ "0x745B": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_28",
+ "aliases": [
+ "PB_28"
+ ]
+ },
+ "0x745C": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_29",
+ "aliases": [
+ "PB_29"
+ ]
+ },
+ "0x745D": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_30",
+ "aliases": [
+ "PB_30"
+ ]
+ },
+ "0x745E": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_31",
+ "aliases": [
+ "PB_31"
+ ]
+ },
+ "0x745F": {
+ "group": "programmable_button",
+ "key": "QK_PROGRAMMABLE_BUTTON_32",
+ "aliases": [
+ "PB_32"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/data/constants/keycodes/keycodes_0.0.1_quantum.hjson b/data/constants/keycodes/keycodes_0.0.1_quantum.hjson
new file mode 100644
index 0000000000..a623bd678d
--- /dev/null
+++ b/data/constants/keycodes/keycodes_0.0.1_quantum.hjson
@@ -0,0 +1,512 @@
+{
+ "keycodes": {
+ "0x7C00": {
+ "group": "quantum",
+ "key": "QK_BOOTLOADER",
+ "aliases": [
+ "QK_BOOT"
+ ]
+ },
+ "0x7C01": {
+ "group": "quantum",
+ "key": "QK_REBOOT",
+ "aliases": [
+ "QK_RBT"
+ ]
+ },
+ "0x7C02": {
+ "group": "quantum",
+ "key": "QK_DEBUG_TOGGLE",
+ "aliases": [
+ "DB_TOGG"
+ ]
+ },
+ "0x7C03": {
+ "group": "quantum",
+ "key": "QK_CLEAR_EEPROM",
+ "aliases": [
+ "EE_CLR"
+ ]
+ },
+ "0x7C04": {
+ "group": "quantum",
+ "key": "QK_MAKE"
+ },
+
+ "0x7C10": {
+ "group": "quantum",
+ "key": "QK_AUTO_SHIFT_DOWN",
+ "aliases": [
+ "AS_DOWN"
+ ]
+ },
+ "0x7C11": {
+ "group": "quantum",
+ "key": "QK_AUTO_SHIFT_UP",
+ "aliases": [
+ "AS_UP"
+ ]
+ },
+ "0x7C12": {
+ "group": "quantum",
+ "key": "QK_AUTO_SHIFT_REPORT",
+ "aliases": [
+ "AS_RPT"
+ ]
+ },
+ "0x7C13": {
+ "group": "quantum",
+ "key": "QK_AUTO_SHIFT_ON",
+ "aliases": [
+ "AS_ON"
+ ]
+ },
+ "0x7C14": {
+ "group": "quantum",
+ "key": "QK_AUTO_SHIFT_OFF",
+ "aliases": [
+ "AS_OFF"
+ ]
+ },
+ "0x7C15": {
+ "group": "quantum",
+ "key": "QK_AUTO_SHIFT_TOGGLE",
+ "aliases": [
+ "AS_TOGG"
+ ]
+ },
+
+ "0x7C16": {
+ "group": "quantum",
+ "key": "QK_GRAVE_ESCAPE",
+ "aliases": [
+ "QK_GESC"
+ ]
+ },
+
+ "0x7C17": {
+ "group": "quantum",
+ "key": "QK_VELOCIKEY_TOGGLE",
+ "aliases": [
+ "VK_TOGG"
+ ]
+ },
+
+ "0x7C18": {
+ "group": "quantum",
+ "key": "QK_SPACE_CADET_LEFT_CTRL_PARENTHESIS_OPEN",
+ "aliases": [
+ "SC_LCPO"
+ ]
+ },
+ "0x7C19": {
+ "group": "quantum",
+ "key": "QK_SPACE_CADET_RIGHT_CTRL_PARENTHESIS_CLOSE",
+ "aliases": [
+ "SC_RCPC"
+ ]
+ },
+ "0x7C1A": {
+ "group": "quantum",
+ "key": "QK_SPACE_CADET_LEFT_SHIFT_PARENTHESIS_OPEN",
+ "aliases": [
+ "SC_LSPO"
+ ]
+ },
+ "0x7C1B": {
+ "group": "quantum",
+ "key": "QK_SPACE_CADET_RIGHT_SHIFT_PARENTHESIS_CLOSE",
+ "aliases": [
+ "SC_RSPC"
+ ]
+ },
+ "0x7C1C": {
+ "group": "quantum",
+ "key": "QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN",
+ "aliases": [
+ "SC_LAPO"
+ ]
+ },
+ "0x7C1D": {
+ "group": "quantum",
+ "key": "QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE",
+ "aliases": [
+ "SC_RAPC"
+ ]
+ },
+ "0x7C1E": {
+ "group": "quantum",
+ "key": "QK_SPACE_CADET_RIGHT_SHIFT_ENTER",
+ "aliases": [
+ "SC_SENT"
+ ]
+ },
+
+ "0x7C20": {
+ "group": "quantum",
+ "key": "QK_OUTPUT_AUTO",
+ "aliases": [
+ "OU_AUTO"
+ ]
+ },
+ "0x7C21": {
+ "group": "quantum",
+ "key": "QK_OUTPUT_USB",
+ "aliases": [
+ "OU_USB"
+ ]
+ },
+ "0x7C22": {
+ "group": "quantum",
+ "key": "QK_OUTPUT_BLUETOOTH",
+ "aliases": [
+ "OU_BT"
+ ]
+ },
+
+ "0x7C30": {
+ "group": "quantum",
+ "key": "QK_UNICODE_MODE_NEXT",
+ "aliases": [
+ "UC_NEXT"
+ ]
+ },
+ "0x7C31": {
+ "group": "quantum",
+ "key": "QK_UNICODE_MODE_PREVIOUS",
+ "aliases": [
+ "UC_PREV"
+ ]
+ },
+ "0x7C32": {
+ "group": "quantum",
+ "key": "QK_UNICODE_MODE_MACOS",
+ "aliases": [
+ "UC_MAC"
+ ]
+ },
+ "0x7C33": {
+ "group": "quantum",
+ "key": "QK_UNICODE_MODE_LINUX",
+ "aliases": [
+ "UC_LINX"
+ ]
+ },
+ "0x7C34": {
+ "group": "quantum",
+ "key": "QK_UNICODE_MODE_WINDOWS",
+ "aliases": [
+ "UC_WIN"
+ ]
+ },
+ "0x7C35": {
+ "group": "quantum",
+ "key": "QK_UNICODE_MODE_BSD",
+ "aliases": [
+ "UC_BSD"
+ ]
+ },
+ "0x7C36": {
+ "group": "quantum",
+ "key": "QK_UNICODE_MODE_WINCOMPOSE",
+ "aliases": [
+ "UC_WINC"
+ ]
+ },
+ "0x7C37": {
+ "group": "quantum",
+ "key": "QK_UNICODE_MODE_EMACS",
+ "aliases": [
+ "UC_EMAC"
+ ]
+ },
+
+ "0x7C40": {
+ "group": "quantum",
+ "key": "QK_HAPTIC_ON",
+ "aliases": [
+ "HF_ON"
+ ]
+ },
+ "0x7C41": {
+ "group": "quantum",
+ "key": "QK_HAPTIC_OFF",
+ "aliases": [
+ "HF_OFF"
+ ]
+ },
+ "0x7C42": {
+ "group": "quantum",
+ "key": "QK_HAPTIC_TOGGLE",
+ "aliases": [
+ "HF_TOGG"
+ ]
+ },
+ "0x7C43": {
+ "group": "quantum",
+ "key": "QK_HAPTIC_RESET",
+ "aliases": [
+ "HF_RST"
+ ]
+ },
+ "0x7C44": {
+ "group": "quantum",
+ "key": "QK_HAPTIC_FEEDBACK_TOGGLE",
+ "aliases": [
+ "HF_FDBK"
+ ]
+ },
+ "0x7C45": {
+ "group": "quantum",
+ "key": "QK_HAPTIC_BUZZ_TOGGLE",
+ "aliases": [
+ "HF_BUZZ"
+ ]
+ },
+ "0x7C46": {
+ "group": "quantum",
+ "key": "QK_HAPTIC_MODE_NEXT",
+ "aliases": [
+ "HF_NEXT"
+ ]
+ },
+ "0x7C47": {
+ "group": "quantum",
+ "key": "QK_HAPTIC_MODE_PREVIOUS",
+ "aliases": [
+ "HF_PREV"
+ ]
+ },
+ "0x7C48": {
+ "group": "quantum",
+ "key": "QK_HAPTIC_CONTINUOUS_TOGGLE",
+ "aliases": [
+ "HF_CONT"
+ ]
+ },
+ "0x7C49": {
+ "group": "quantum",
+ "key": "QK_HAPTIC_CONTINUOUS_UP",
+ "aliases": [
+ "HF_CONU"
+ ]
+ },
+ "0x7C4A": {
+ "group": "quantum",
+ "key": "QK_HAPTIC_CONTINUOUS_DOWN",
+ "aliases": [
+ "HF_COND"
+ ]
+ },
+ "0x7C4B": {
+ "group": "quantum",
+ "key": "QK_HAPTIC_DWELL_UP",
+ "aliases": [
+ "HF_DWLU"
+ ]
+ },
+ "0x7C4C": {
+ "group": "quantum",
+ "key": "QK_HAPTIC_DWELL_DOWN",
+ "aliases": [
+ "HF_DWLD"
+ ]
+ },
+
+ "0x7C50": {
+ "group": "quantum",
+ "key": "QK_COMBO_ON",
+ "aliases": [
+ "CM_ON"
+ ]
+ },
+ "0x7C51": {
+ "group": "quantum",
+ "key": "QK_COMBO_OFF",
+ "aliases": [
+ "CM_OFF"
+ ]
+ },
+ "0x7C52": {
+ "group": "quantum",
+ "key": "QK_COMBO_TOGGLE",
+ "aliases": [
+ "CM_TOGG"
+ ]
+ },
+
+ "0x7C53": {
+ "group": "quantum",
+ "key": "QK_DYNAMIC_MACRO_RECORD_START_1",
+ "aliases": [
+ "DM_REC1"
+ ]
+ },
+ "0x7C54": {
+ "group": "quantum",
+ "key": "QK_DYNAMIC_MACRO_RECORD_START_2",
+ "aliases": [
+ "DM_REC2"
+ ]
+ },
+ "0x7C55": {
+ "group": "quantum",
+ "key": "QK_DYNAMIC_MACRO_RECORD_STOP",
+ "aliases": [
+ "DM_RSTP"
+ ]
+ },
+ "0x7C56": {
+ "group": "quantum",
+ "key": "QK_DYNAMIC_MACRO_PLAY_1",
+ "aliases": [
+ "DM_PLY1"
+ ]
+ },
+ "0x7C57": {
+ "group": "quantum",
+ "key": "QK_DYNAMIC_MACRO_PLAY_2",
+ "aliases": [
+ "DM_PLY2"
+ ]
+ },
+
+ "0x7C58": {
+ "group": "quantum",
+ "key": "QK_LEADER",
+ "aliases": [
+ "QK_LEAD"
+ ]
+ },
+
+ "0x7C59": {
+ "group": "quantum",
+ "key": "QK_LOCK"
+ },
+
+ "0x7C5A": {
+ "group": "quantum",
+ "key": "QK_ONE_SHOT_ON",
+ "aliases": [
+ "OS_ON"
+ ]
+ },
+ "0x7C5B": {
+ "group": "quantum",
+ "key": "QK_ONE_SHOT_OFF",
+ "aliases": [
+ "OS_OFF"
+ ]
+ },
+ "0x7C5C": {
+ "group": "quantum",
+ "key": "QK_ONE_SHOT_TOGGLE",
+ "aliases": [
+ "OS_TOGG"
+ ]
+ },
+
+ "0x7C5D": {
+ "group": "quantum",
+ "key": "QK_KEY_OVERRIDE_TOGGLE",
+ "aliases": [
+ "KO_TOGG"
+ ]
+ },
+ "0x7C5E": {
+ "group": "quantum",
+ "key": "QK_KEY_OVERRIDE_ON",
+ "aliases": [
+ "KO_ON"
+ ]
+ },
+ "0x7C5F": {
+ "group": "quantum",
+ "key": "QK_KEY_OVERRIDE_OFF",
+ "aliases": [
+ "KO_OFF"
+ ]
+ },
+
+ "0x7C60": {
+ "group": "quantum",
+ "key": "QK_SECURE_LOCK",
+ "aliases": [
+ "SE_LOCK"
+ ]
+ },
+ "0x7C61": {
+ "group": "quantum",
+ "key": "QK_SECURE_UNLOCK",
+ "aliases": [
+ "SE_UNLK"
+ ]
+ },
+ "0x7C62": {
+ "group": "quantum",
+ "key": "QK_SECURE_TOGGLE",
+ "aliases": [
+ "SE_TOGG"
+ ]
+ },
+ "0x7C63": {
+ "group": "quantum",
+ "key": "QK_SECURE_REQUEST",
+ "aliases": [
+ "SE_REQ"
+ ]
+ },
+
+ "0x7C70": {
+ "group": "quantum",
+ "key": "QK_DYNAMIC_TAPPING_TERM_PRINT",
+ "aliases": [
+ "DT_PRNT"
+ ]
+ },
+ "0x7C71": {
+ "group": "quantum",
+ "key": "QK_DYNAMIC_TAPPING_TERM_UP",
+ "aliases": [
+ "DT_UP"
+ ]
+ },
+ "0x7C72": {
+ "group": "quantum",
+ "key": "QK_DYNAMIC_TAPPING_TERM_DOWN",
+ "aliases": [
+ "DT_DOWN"
+ ]
+ },
+
+ "0x7C73": {
+ "group": "quantum",
+ "key": "QK_CAPS_WORD_TOGGLE",
+ "aliases": [
+ "CW_TOGG"
+ ]
+ },
+
+ "0x7C74": {
+ "group": "quantum",
+ "key": "QK_AUTOCORRECT_ON",
+ "aliases": [
+ "AC_ON"
+ ]
+ },
+ "0x7C75": {
+ "group": "quantum",
+ "key": "QK_AUTOCORRECT_OFF",
+ "aliases": [
+ "AC_OFF"
+ ]
+ },
+ "0x7C76": {
+ "group": "quantum",
+ "key": "QK_AUTOCORRECT_TOGGLE",
+ "aliases": [
+ "AC_TOGG"
+ ]
+ }
+ }
+}
diff --git a/data/constants/keycodes/keycodes_0.0.1_sequencer.hjson b/data/constants/keycodes/keycodes_0.0.1_sequencer.hjson
new file mode 100644
index 0000000000..039d09b2fa
--- /dev/null
+++ b/data/constants/keycodes/keycodes_0.0.1_sequencer.hjson
@@ -0,0 +1,40 @@
+{
+ "keycodes": {
+ "0x7200": {
+ "group": "sequencer",
+ "key": "SQ_ON"
+ },
+ "0x7201": {
+ "group": "sequencer",
+ "key": "SQ_OFF"
+ },
+ "0x7202": {
+ "group": "sequencer",
+ "key": "SQ_TOG"
+ },
+ "0x7203": {
+ "group": "sequencer",
+ "key": "SQ_TMPD"
+ },
+ "0x7204": {
+ "group": "sequencer",
+ "key": "SQ_TMPU"
+ },
+ "0x7205": {
+ "group": "sequencer",
+ "key": "SQ_RESD"
+ },
+ "0x7206": {
+ "group": "sequencer",
+ "key": "SQ_RESU"
+ },
+ "0x7207": {
+ "group": "sequencer",
+ "key": "SQ_SALL"
+ },
+ "0x7208": {
+ "group": "sequencer",
+ "key": "SQ_SCLR"
+ }
+ }
+}
\ No newline at end of file
diff --git a/data/constants/keycodes/keycodes_0.0.1_steno.hjson b/data/constants/keycodes/keycodes_0.0.1_steno.hjson
new file mode 100644
index 0000000000..cd19fdcde5
--- /dev/null
+++ b/data/constants/keycodes/keycodes_0.0.1_steno.hjson
@@ -0,0 +1,20 @@
+{
+ "keycodes": {
+ "0x74F0": {
+ "group": "steno",
+ "key": "QK_STENO_BOLT"
+ },
+ "0x74F1": {
+ "group": "steno",
+ "key": "QK_STENO_GEMINI"
+ },
+ "0x74F2": {
+ "group": "steno",
+ "key": "QK_STENO_COMB"
+ },
+ "0x74FC": {
+ "group": "steno",
+ "key": "QK_STENO_COMB_MAX"
+ }
+ }
+}
diff --git a/data/constants/keycodes/keycodes_0.0.1_swap_hands.hjson b/data/constants/keycodes/keycodes_0.0.1_swap_hands.hjson
new file mode 100644
index 0000000000..c800baef35
--- /dev/null
+++ b/data/constants/keycodes/keycodes_0.0.1_swap_hands.hjson
@@ -0,0 +1,32 @@
+{
+ "keycodes": {
+ "0x56F0": {
+ "group": "swap_hands",
+ "key": "SH_TG"
+ },
+ "0x56F1": {
+ "group": "swap_hands",
+ "key": "SH_TT"
+ },
+ "0x56F2": {
+ "group": "swap_hands",
+ "key": "SH_MON"
+ },
+ "0x56F3": {
+ "group": "swap_hands",
+ "key": "SH_MOFF"
+ },
+ "0x56F4": {
+ "group": "swap_hands",
+ "key": "SH_OFF"
+ },
+ "0x56F5": {
+ "group": "swap_hands",
+ "key": "SH_ON"
+ },
+ "0x56F6": {
+ "group": "swap_hands",
+ "key": "SH_OS"
+ }
+ }
+}
diff --git a/data/mappings/defaults.hjson b/data/mappings/defaults.hjson
new file mode 100644
index 0000000000..10657e5aa0
--- /dev/null
+++ b/data/mappings/defaults.hjson
@@ -0,0 +1,77 @@
+{
+ "development_board": {
+ "promicro": {
+ "processor": "atmega32u4",
+ "bootloader": "caterina",
+ "pin_compatible": "promicro"
+ },
+ "elite_c": {
+ "processor": "atmega32u4",
+ "bootloader": "atmel-dfu",
+ "pin_compatible": "promicro"
+ },
+ "elite_pi": {
+ "processor": "RP2040",
+ "bootloader": "rp2040",
+ "board": "QMK_PM2040",
+ "pin_compatible": "promicro"
+ },
+ "proton_c": {
+ "processor": "STM32F303",
+ "bootloader": "stm32-dfu",
+ "board": "QMK_PROTON_C",
+ "pin_compatible": "promicro"
+ },
+ "kb2040": {
+ "processor": "RP2040",
+ "bootloader": "rp2040",
+ "board": "QMK_PM2040",
+ "pin_compatible": "promicro"
+ },
+ "promicro_rp2040": {
+ "processor": "RP2040",
+ "bootloader": "rp2040",
+ "board": "QMK_PM2040",
+ "pin_compatible": "promicro"
+ },
+ "blok": {
+ "processor": "RP2040",
+ "bootloader": "rp2040",
+ "board": "QMK_PM2040",
+ "pin_compatible": "promicro"
+ },
+ "bit_c_pro": {
+ "processor": "RP2040",
+ "bootloader": "rp2040",
+ "board": "QMK_PM2040",
+ "pin_compatible": "promicro"
+ },
+ "bluepill": {
+ "processor": "STM32F103",
+ "bootloader": "stm32duino",
+ "board": "STM32_F103_STM32DUINO"
+ },
+ "blackpill_f401": {
+ "processor": "STM32F401",
+ "bootloader": "stm32-dfu",
+ "board": "BLACKPILL_STM32_F401"
+ },
+ "blackpill_f411": {
+ "processor": "STM32F411",
+ "bootloader": "stm32-dfu",
+ "board": "BLACKPILL_STM32_F411"
+ },
+ "stemcell": {
+ "processor": "STM32F411",
+ "bootloader": "tinyuf2",
+ "board": "STEMCELL",
+ "pin_compatible": "promicro"
+ },
+ "bonsai_c4": {
+ "processor": "STM32F411",
+ "bootloader": "stm32-dfu",
+ "board": "BONSAI_C4",
+ "pin_compatible": "promicro"
+ }
+ }
+}
diff --git a/data/mappings/defaults.json b/data/mappings/defaults.json
deleted file mode 100644
index e62ab688d6..0000000000
--- a/data/mappings/defaults.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "development_board": {
- "promicro": {
- "processor": "atmega32u4",
- "bootloader": "caterina",
- "pin_compatible": "promicro"
- },
- "elite_c": {
- "processor": "atmega32u4",
- "bootloader": "atmel-dfu",
- "pin_compatible": "promicro"
- },
- "proton_c": {
- "processor": "STM32F303",
- "bootloader": "stm32-dfu",
- "board": "QMK_PROTON_C",
- "pin_compatible": "promicro"
- },
- "bluepill": {
- "processor": "STM32F103",
- "bootloader": "stm32duino",
- "board": "STM32_F103_STM32DUINO"
- },
- "blackpill_f401": {
- "processor": "STM32F401",
- "bootloader": "stm32-dfu",
- "board": "BLACKPILL_STM32_F401"
- },
- "blackpill_f411": {
- "processor": "STM32F411",
- "bootloader": "stm32-dfu",
- "board": "BLACKPILL_STM32_F411"
- }
- }
-}
\ No newline at end of file
diff --git a/data/mappings/info_config.hjson b/data/mappings/info_config.hjson
new file mode 100644
index 0000000000..c1c01ff70f
--- /dev/null
+++ b/data/mappings/info_config.hjson
@@ -0,0 +1,134 @@
+// This file maps keys between `config.h` and `info.json`. It is used by QMK
+// to correctly and consistently map back and forth between the two systems.
+{
+ // Format:
+ // : {"info_key": , ["value_type": ], ["to_json": ], ["to_c": ]}
+ // value_type: one of "array", "array.int", "bool", "int", "hex", "list", "mapping", "str", "raw"
+ // to_json: Default `true`. Set to `false` to exclude this mapping from info.json
+ // to_c: Default `true`. Set to `false` to exclude this mapping from config.h
+ // warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places
+ // deprecated: Default `false`. Set to `true` to turn on warning when a value exists
+ // invalid: Default `false`. Set to `true` to generate errors when a value exists
+ // replace_with: use with a key marked deprecated or invalid to designate a replacement
+ "AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "bool"},
+ "BACKLIGHT_BREATHING": {"info_key": "backlight.breathing", "value_type": "bool"},
+ "BREATHING_PERIOD": {"info_key": "backlight.breathing_period", "value_type": "int"},
+ "BACKLIGHT_LEVELS": {"info_key": "backlight.levels", "value_type": "int"},
+ "BACKLIGHT_LIMIT_VAL": {"info_key": "backlight.max_brightness", "value_type": "int"},
+ "BACKLIGHT_ON_STATE": {"info_key": "backlight.on_state", "value_type": "int"},
+ "BACKLIGHT_PIN": {"info_key": "backlight.pin"},
+ "BACKLIGHT_PINS": {"info_key": "backlight.pins", "value_type": "array"},
+ "BOTH_SHIFTS_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.both_shifts_turns_on", "value_type": "bool"},
+ "CAPS_WORD_IDLE_TIMEOUT": {"info_key": "caps_word.idle_timeout", "value_type": "int"},
+ "COMBO_COUNT": {"info_key": "combo.count", "value_type": "int"},
+ "COMBO_TERM": {"info_key": "combo.term", "value_type": "int"},
+ "DEBOUNCE": {"info_key": "debounce", "value_type": "int"},
+ "DIODE_DIRECTION": {"info_key": "diode_direction"},
+ "DOUBLE_TAP_SHIFT_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.double_tap_shift_turns_on", "value_type": "bool"},
+ "FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "bool"},
+ "DYNAMIC_KEYMAP_EEPROM_MAX_ADDR": {"info_key": "dynamic_keymap.eeprom_max_addr", "value_type": "int"},
+ "DYNAMIC_KEYMAP_LAYER_COUNT": {"info_key": "dynamic_keymap.layer_count", "value_type": "int"},
+ "IGNORE_MOD_TAP_INTERRUPT": {"info_key": "tapping.ignore_mod_tap_interrupt", "value_type": "bool"},
+ "IGNORE_MOD_TAP_INTERRUPT_PER_KEY": {"info_key": "tapping.ignore_mod_tap_interrupt_per_key", "value_type": "bool"},
+ "HOLD_ON_OTHER_KEY_PRESS": {"info_key": "tapping.hold_on_other_key_press", "value_type": "bool"},
+ "HOLD_ON_OTHER_KEY_PRESS_PER_KEY": {"info_key": "tapping.hold_on_other_key_press_per_key", "value_type": "bool"},
+ "LAYOUTS": {"info_key": "layout_aliases", "value_type": "mapping"},
+ "LEADER_PER_KEY_TIMING": {"info_key": "leader_key.timing", "value_type": "bool"},
+ "LEADER_KEY_STRICT_KEY_PROCESSING": {"info_key": "leader_key.strict_processing", "value_type": "bool"},
+ "LEADER_TIMEOUT": {"info_key": "leader_key.timeout", "value_type": "int"},
+ "LED_CAPS_LOCK_PIN": {"info_key": "indicators.caps_lock"},
+ "LED_NUM_LOCK_PIN": {"info_key": "indicators.num_lock"},
+ "LED_SCROLL_LOCK_PIN": {"info_key": "indicators.scroll_lock"},
+ "LED_COMPOSE_PIN": {"info_key": "indicators.compose"},
+ "LED_KANA_PIN": {"info_key": "indicators.kana"},
+ "LED_PIN_ON_STATE": {"info_key": "indicators.on_state", "value_type": "int"},
+ "LED_MATRIX_CENTER": {"info_key": "led_matrix.center_point", "value_type": "array.int"},
+ "LED_MATRIX_MAXIMUM_BRIGHTNESS": {"info_key": "led_matrix.max_brightness", "value_type": "int"},
+ "LED_MATRIX_SPLIT": {"info_key": "led_matrix.split_count", "value_type": "array.int"},
+ "LED_MATRIX_TIMEOUT": {"info_key": "led_matrix.timeout", "value_type": "int"},
+ "LED_MATRIX_HUE_STEP": {"info_key": "led_matrix.hue_steps", "value_type": "int"},
+ "LED_MATRIX_SAT_STEP": {"info_key": "led_matrix.sat_steps", "value_type": "int"},
+ "LED_MATRIX_VAL_STEP": {"info_key": "led_matrix.val_steps", "value_type": "int"},
+ "LED_MATRIX_SPD_STEP": {"info_key": "led_matrix.speed_steps", "value_type": "int"},
+ "MATRIX_HAS_GHOST": {"info_key": "matrix_pins.ghost", "value_type": "bool"},
+ "MATRIX_IO_DELAY": {"info_key": "matrix_pins.io_delay", "value_type": "int"},
+ "MOUSEKEY_DELAY": {"info_key": "mousekey.delay", "value_type": "int"},
+ "MOUSEKEY_INTERVAL": {"info_key": "mousekey.interval", "value_type": "int"},
+ "MOUSEKEY_MAX_SPEED": {"info_key": "mousekey.max_speed", "value_type": "int"},
+ "MOUSEKEY_TIME_TO_MAX": {"info_key": "mousekey.time_to_max", "value_type": "int"},
+ "MOUSEKEY_WHEEL_DELAY": {"info_key": "mousekey.wheel_delay", "value_type": "int"},
+ "ONESHOT_TIMEOUT": {"info_key": "oneshot.timeout", "value_type": "int"},
+ "ONESHOT_TAP_TOGGLE": {"info_key": "oneshot.tap_toggle", "value_type": "int"},
+ "PERMISSIVE_HOLD": {"info_key": "tapping.permissive_hold", "value_type": "bool"},
+ "PERMISSIVE_HOLD_PER_KEY": {"info_key": "tapping.permissive_hold_per_key", "value_type": "bool"},
+ "PS2_CLOCK_PIN": {"info_key": "ps2.clock_pin"},
+ "PS2_DATA_PIN": {"info_key": "ps2.data_pin"},
+ "RETRO_TAPPING": {"info_key": "tapping.retro", "value_type": "bool"},
+ "RETRO_TAPPING_PER_KEY": {"info_key": "tapping.retro_per_key", "value_type": "bool"},
+ "RGB_DI_PIN": {"info_key": "rgblight.pin"},
+ "RGBLED_NUM": {"info_key": "rgblight.led_count", "value_type": "int"},
+ "RGBLED_SPLIT": {"info_key": "rgblight.split_count", "value_type": "array.int"},
+ "RGBLIGHT_LAYER_BLINK": {"info_key": "rgblight.layers.blink", "value_type": "bool"},
+ "RGBLIGHT_LAYERS": {"info_key": "rgblight.layers.enabled", "value_type": "bool"},
+ "RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF": {"info_key": "rgblight.layers.override_rgb", "value_type": "bool"},
+ "RGBLIGHT_LIMIT_VAL": {"info_key": "rgblight.max_brightness", "value_type": "int"},
+ "RGBLIGHT_MAX_LAYERS": {"info_key": "rgblight.layers.max", "value_type": "int"},
+ "RGBLIGHT_HUE_STEP": {"info_key": "rgblight.hue_steps", "value_type": "int"},
+ "RGBLIGHT_SAT_STEP": {"info_key": "rgblight.saturation_steps", "value_type": "int"},
+ "RGBLIGHT_VAL_STEP": {"info_key": "rgblight.brightness_steps", "value_type": "int"},
+ "RGBLIGHT_SLEEP": {"info_key": "rgblight.sleep", "value_type": "bool"},
+ "RGBLIGHT_SPLIT": {"info_key": "rgblight.split", "value_type": "bool"},
+ "RGB_MATRIX_CENTER": {"info_key": "rgb_matrix.center_point", "value_type": "array.int"},
+ "RGB_MATRIX_MAXIMUM_BRIGHTNESS": {"info_key": "rgb_matrix.max_brightness", "value_type": "int"},
+ "RGB_MATRIX_SPLIT": {"info_key": "rgb_matrix.split_count", "value_type": "array.int"},
+ "RGB_MATRIX_TIMEOUT": {"info_key": "rgb_matrix.timeout", "value_type": "int"},
+ "RGB_MATRIX_HUE_STEP": {"info_key": "rgb_matrix.hue_steps", "value_type": "int"},
+ "RGB_MATRIX_SAT_STEP": {"info_key": "rgb_matrix.sat_steps", "value_type": "int"},
+ "RGB_MATRIX_VAL_STEP": {"info_key": "rgb_matrix.val_steps", "value_type": "int"},
+ "RGB_MATRIX_SPD_STEP": {"info_key": "rgb_matrix.speed_steps", "value_type": "int"},
+ "RGBW": {"info_key": "rgblight.rgbw", "value_type": "bool"},
+ "QMK_ESC_OUTPUT": {"info_key": "qmk_lufa_bootloader.esc_output"},
+ "QMK_ESC_INPUT": {"info_key": "qmk_lufa_bootloader.esc_input"},
+ "QMK_LED": {"info_key": "qmk_lufa_bootloader.led"},
+ "QMK_SPEAKER": {"info_key": "qmk_lufa_bootloader.speaker"},
+ "SECURE_UNLOCK_SEQUENCE": {"info_key": "secure.unlock_sequence", "value_type": "array.array.int", "to_json": false},
+ "SECURE_UNLOCK_TIMEOUT": {"info_key": "secure.unlock_timeout", "value_type": "int"},
+ "SECURE_IDLE_TIMEOUT": {"info_key": "secure.idle_timeout", "value_type": "int"},
+ "SENDSTRING_BELL": {"info_key": "audio.macro_beep", "value_type": "bool"},
+ "SPLIT_MODS_ENABLE": {"info_key": "split.transport.sync_modifiers", "value_type": "bool"},
+ "SPLIT_TRANSPORT_MIRROR": {"info_key": "split.transport.sync_matrix_state", "value_type": "bool"},
+ "SPLIT_USB_DETECT": {"info_key": "split.usb_detect.enabled", "value_type": "bool"},
+ "SPLIT_USB_TIMEOUT": {"info_key": "split.usb_detect.timeout", "value_type": "int"},
+ "SPLIT_USB_TIMEOUT_POLL": {"info_key": "split.usb_detect.polling_interval", "value_type": "int"},
+ "SPLIT_WATCHDOG_ENABLE": {"info_key": "split.transport.watchdog", "value_type": "bool"},
+ "SPLIT_WATCHDOG_TIMEOUT": {"info_key": "split.transport.watchdog_timeout", "value_type": "int"},
+ "SOFT_SERIAL_PIN": {"info_key": "split.soft_serial_pin"},
+ "SOFT_SERIAL_SPEED": {"info_key": "split.soft_serial_speed"},
+ "TAP_CODE_DELAY": {"info_key": "qmk.tap_keycode_delay", "value_type": "int"},
+ "TAP_HOLD_CAPS_DELAY": {"info_key": "qmk.tap_capslock_delay", "value_type": "int"},
+ "TAPPING_FORCE_HOLD": {"info_key": "tapping.force_hold", "value_type": "bool"},
+ "TAPPING_FORCE_HOLD_PER_KEY": {"info_key": "tapping.force_hold_per_key", "value_type": "bool"},
+ "TAPPING_TERM": {"info_key": "tapping.term", "value_type": "int"},
+ "TAPPING_TERM_PER_KEY": {"info_key": "tapping.term_per_key", "value_type": "bool"},
+ "TAPPING_TOGGLE": {"info_key": "tapping.toggle", "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_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"},
+
+ // Items we want flagged in lint
+ "NO_ACTION_MACRO": {"info_key": "_invalid.no_action_macro", "invalid": true},
+ "NO_ACTION_FUNCTION": {"info_key": "_invalid.no_action_function", "invalid": true},
+ "DESCRIPTION": {"info_key": "_invalid.usb_description", "invalid": true},
+ "DEBOUNCING_DELAY": {"info_key": "_invalid.debouncing_delay", "invalid": true, "replace_with": "DEBOUNCE"},
+ "PREVENT_STUCK_MODIFIERS": {"info_key": "_invalid.prevent_stuck_mods", "invalid": true},
+ "UNUSED_PINS": {"info_key": "_invalid.unused_pins", "deprecated": true},
+ "RGBLIGHT_ANIMATIONS": {"info_key": "rgblight.animations.all", "value_type": "bool", "deprecated": true},
+ "QMK_KEYS_PER_SCAN": {"info_key": "qmk.keys_per_scan", "value_type": "int", "deprecated": true},
+
+ // USB params, need to mark as failure when specified in config.h, rather than deprecated
+ "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"},
+ "PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str", "deprecated": true, "replace_with": "`keyboard_name` in info.json"},
+ "MANUFACTURER": {"info_key": "manufacturer", "value_type": "str", "deprecated": true, "replace_with": "`manufacturer` in info.json"},
+ "DEVICE_VER": {"info_key": "usb.device_version", "value_type": "bcd_version", "deprecated": true, "replace_with": "`usb.device_version` in info.json"}
+}
diff --git a/data/mappings/info_config.json b/data/mappings/info_config.json
deleted file mode 100644
index 7ff05918e9..0000000000
--- a/data/mappings/info_config.json
+++ /dev/null
@@ -1,114 +0,0 @@
-# This file maps keys between `config.h` and `info.json`. It is used by QMK
-# to correctly and consistently map back and forth between the two systems.
-{
- # Format:
- # : {"info_key": , ["value_type": ], ["to_json": ], ["to_c": ]}
- # value_type: one of "array", "array.int", "bool", "int", "hex", "list", "mapping", "str", "raw"
- # to_json: Default `true`. Set to `false` to exclude this mapping from info.json
- # to_c: Default `true`. Set to `false` to exclude this mapping from config.h
- # warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places
- # deprecated: Default `false`. Set to `true` to turn on warning when a value exists
- # invalid: Default `false`. Set to `true` to generate errors when a value exists
- # replace_with: use with a key marked deprecated or invalid to designate a replacement
- "AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "bool"},
- "BACKLIGHT_BREATHING": {"info_key": "backlight.breathing", "value_type": "bool"},
- "BREATHING_PERIOD": {"info_key": "backlight.breathing_period", "value_type": "int"},
- "BACKLIGHT_PIN": {"info_key": "backlight.pin"},
- "BOTH_SHIFTS_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.both_shifts_turns_on", "value_type": "bool"},
- "CAPS_WORD_IDLE_TIMEOUT": {"info_key": "caps_word.idle_timeout", "value_type": "int"},
- "COMBO_COUNT": {"info_key": "combo.count", "value_type": "int"},
- "COMBO_TERM": {"info_key": "combo.term", "value_type": "int"},
- "DEBOUNCE": {"info_key": "debounce", "value_type": "int"},
- "DEVICE_VER": {"info_key": "usb.device_ver", "value_type": "hex"},
- # TODO: Replace ^^^ with vvv
- #"DEVICE_VER": {"info_key": "usb.device_version", "value_type": "bcd_version"},
- "DIODE_DIRECTION": {"info_key": "diode_direction"},
- "DOUBLE_TAP_SHIFT_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.double_tap_shift_turns_on", "value_type": "bool"},
- "FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "bool"},
- "DYNAMIC_KEYMAP_EEPROM_MAX_ADDR": {"info_key": "dynamic_keymap.eeprom_max_addr", "value_type": "int"},
- "DYNAMIC_KEYMAP_LAYER_COUNT": {"info_key": "dynamic_keymap.layer_count", "value_type": "int"},
- "IGNORE_MOD_TAP_INTERRUPT": {"info_key": "tapping.ignore_mod_tap_interrupt", "value_type": "bool"},
- "IGNORE_MOD_TAP_INTERRUPT_PER_KEY": {"info_key": "tapping.ignore_mod_tap_interrupt_per_key", "value_type": "bool"},
- "LAYOUTS": {"info_key": "layout_aliases", "value_type": "mapping"},
- "LEADER_PER_KEY_TIMING": {"info_key": "leader_key.timing", "value_type": "bool"},
- "LEADER_KEY_STRICT_KEY_PROCESSING": {"info_key": "leader_key.strict_processing", "value_type": "bool"},
- "LEADER_TIMEOUT": {"info_key": "leader_key.timeout", "value_type": "int"},
- "LED_CAPS_LOCK_PIN": {"info_key": "indicators.caps_lock"},
- "LED_NUM_LOCK_PIN": {"info_key": "indicators.num_lock"},
- "LED_SCROLL_LOCK_PIN": {"info_key": "indicators.scroll_lock"},
- "MANUFACTURER": {"info_key": "manufacturer"},
- "MATRIX_HAS_GHOST": {"info_key": "matrix_pins.ghost", "value_type": "bool"},
- "MATRIX_IO_DELAY": {"info_key": "matrix_pins.io_delay", "value_type": "int"},
- "MOUSEKEY_DELAY": {"info_key": "mousekey.delay", "value_type": "int"},
- "MOUSEKEY_INTERVAL": {"info_key": "mousekey.interval", "value_type": "int"},
- "MOUSEKEY_MAX_SPEED": {"info_key": "mousekey.max_speed", "value_type": "int"},
- "MOUSEKEY_TIME_TO_MAX": {"info_key": "mousekey.time_to_max", "value_type": "int"},
- "MOUSEKEY_WHEEL_DELAY": {"info_key": "mousekey.wheel_delay", "value_type": "int"},
- "ONESHOT_TIMEOUT": {"info_key": "oneshot.timeout", "value_type": "int"},
- "ONESHOT_TAP_TOGGLE": {"info_key": "oneshot.tap_toggle", "value_type": "int"},
- "PERMISSIVE_HOLD": {"info_key": "tapping.permissive_hold", "value_type": "bool"},
- "PERMISSIVE_HOLD_PER_KEY": {"info_key": "tapping.permissive_hold_per_key", "value_type": "bool"},
- "RETRO_TAPPING": {"info_key": "tapping.retro", "value_type": "bool"},
- "RETRO_TAPPING_PER_KEY": {"info_key": "tapping.retro_per_key", "value_type": "bool"},
- "RGB_DI_PIN": {"info_key": "rgblight.pin"},
- "RGBLED_NUM": {"info_key": "rgblight.led_count", "value_type": "int"},
- "RGBLED_SPLIT": {"info_key": "rgblight.split_count", "value_type": "array.int"},
- "RGBLIGHT_ANIMATIONS": {"info_key": "rgblight.animations.all", "value_type": "bool"},
- "RGBLIGHT_EFFECT_ALTERNATING": {"info_key": "rgblight.animations.alternating", "value_type": "bool"},
- "RGBLIGHT_EFFECT_BREATHING": {"info_key": "rgblight.animations.breathing", "value_type": "bool"},
- "RGBLIGHT_EFFECT_CHRISTMAS": {"info_key": "rgblight.animations.christmas", "value_type": "bool"},
- "RGBLIGHT_EFFECT_KNIGHT": {"info_key": "rgblight.animations.knight", "value_type": "bool"},
- "RGBLIGHT_EFFECT_RAINBOW_MOOD": {"info_key": "rgblight.animations.rainbow_mood", "value_type": "bool"},
- "RGBLIGHT_EFFECT_RAINBOW_SWIRL": {"info_key": "rgblight.animations.rainbow_swirl", "value_type": "bool"},
- "RGBLIGHT_EFFECT_RGB_TEST": {"info_key": "rgblight.animations.rgb_test", "value_type": "bool"},
- "RGBLIGHT_EFFECT_SNAKE": {"info_key": "rgblight.animations.snake", "value_type": "bool"},
- "RGBLIGHT_EFFECT_STATIC_GRADIENT": {"info_key": "rgblight.animations.static_gradient", "value_type": "bool"},
- "RGBLIGHT_EFFECT_TWINKLE": {"info_key": "rgblight.animations.twinkle"},
- "RGBLIGHT_LAYER_BLINK": {"info_key": "rgblight.layers.blink", "value_type": "bool"},
- "RGBLIGHT_LAYERS": {"info_key": "rgblight.layers.enabled", "value_type": "bool"},
- "RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF": {"info_key": "rgblight.layers.override_rgb", "value_type": "bool"},
- "RGBLIGHT_LIMIT_VAL": {"info_key": "rgblight.max_brightness", "value_type": "int"},
- "RGBLIGHT_MAX_LAYERS": {"info_key": "rgblight.layers.max", "value_type": "int"},
- "RGBLIGHT_HUE_STEP": {"info_key": "rgblight.hue_steps", "value_type": "int"},
- "RGBLIGHT_SAT_STEP": {"info_key": "rgblight.saturation_steps", "value_type": "int"},
- "RGBLIGHT_VAL_STEP": {"info_key": "rgblight.brightness_steps", "value_type": "int"},
- "RGBLIGHT_SLEEP": {"info_key": "rgblight.sleep", "value_type": "bool"},
- "RGBLIGHT_SPLIT": {"info_key": "rgblight.split", "value_type": "bool"},
- "RGBW": {"info_key": "rgblight.rgbw", "value_type": "bool"},
- "PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false},
- "PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex"},
- "VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex"},
- "QMK_ESC_OUTPUT": {"info_key": "qmk_lufa_bootloader.esc_output"},
- "QMK_ESC_INPUT": {"info_key": "qmk_lufa_bootloader.esc_input"},
- "QMK_KEYS_PER_SCAN": {"info_key": "qmk.keys_per_scan", "value_type": "int"},
- "QMK_LED": {"info_key": "qmk_lufa_bootloader.led"},
- "QMK_SPEAKER": {"info_key": "qmk_lufa_bootloader.speaker"},
- "SECURE_UNLOCK_SEQUENCE": {"info_key": "secure.unlock_sequence", "value_type": "array.array.int", "to_json": false},
- "SECURE_UNLOCK_TIMEOUT": {"info_key": "secure.unlock_timeout", "value_type": "int"},
- "SECURE_IDLE_TIMEOUT": {"info_key": "secure.idle_timeout", "value_type": "int"},
- "SENDSTRING_BELL": {"info_key": "audio.macro_beep", "value_type": "bool"},
- "SPLIT_MODS_ENABLE": {"info_key": "split.transport.sync_modifiers", "value_type": "bool"},
- "SPLIT_TRANSPORT_MIRROR": {"info_key": "split.transport.sync_matrix_state", "value_type": "bool"},
- "SPLIT_USB_DETECT": {"info_key": "split.usb_detect.enabled", "value_type": "bool"},
- "SPLIT_USB_TIMEOUT": {"info_key": "split.usb_detect.timeout", "value_type": "int"},
- "SPLIT_USB_TIMEOUT_POLL": {"info_key": "split.usb_detect.polling_interval", "value_type": "int"},
- "SOFT_SERIAL_PIN": {"info_key": "split.soft_serial_pin"},
- "SOFT_SERIAL_SPEED": {"info_key": "split.soft_serial_speed"},
- "TAP_CODE_DELAY": {"info_key": "qmk.tap_keycode_delay", "value_type": "int"},
- "TAP_HOLD_CAPS_DELAY": {"info_key": "qmk.tap_capslock_delay", "value_type": "int"},
- "TAPPING_FORCE_HOLD": {"info_key": "tapping.force_hold", "value_type": "bool"},
- "TAPPING_FORCE_HOLD_PER_KEY": {"info_key": "tapping.force_hold_per_key", "value_type": "bool"},
- "TAPPING_TERM": {"info_key": "tapping.term", "value_type": "int"},
- "TAPPING_TERM_PER_KEY": {"info_key": "tapping.term_per_key", "value_type": "bool"},
- "TAPPING_TOGGLE": {"info_key": "tapping.toggle", "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_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"},
-
- # Items we want flagged in lint
- "NO_ACTION_MACRO": {"info_key": "_invalid.no_action_macro", "invalid": true},
- "NO_ACTION_FUNCTION": {"info_key": "_invalid.no_action_function", "invalid": true},
- "DESCRIPTION": {"info_key": "_invalid.usb_description", "invalid": true},
- "DEBOUNCING_DELAY": {"info_key": "_invalid.debouncing_delay", "invalid": true, replace_with: "DEBOUNCE"},
- "PREVENT_STUCK_MODIFIERS": {"info_key": "_invalid.prevent_stuck_mods", "invalid": true},
-}
diff --git a/data/mappings/info_rules.hjson b/data/mappings/info_rules.hjson
new file mode 100644
index 0000000000..2f8656c4bf
--- /dev/null
+++ b/data/mappings/info_rules.hjson
@@ -0,0 +1,44 @@
+// This file maps keys between `rules.mk` and `info.json`. It is used by QMK
+// to correctly and consistently map back and forth between the two systems.
+{
+ // Format:
+ // : {"info_key": , ["value_type": ], ["to_json": ], ["to_c": ]}
+ // value_type: one of "array", "array.int", "bool", "int", "list", "hex", "mapping", "str", "raw"
+ // to_json: Default `true`. Set to `false` to exclude this mapping from info.json
+ // to_c: Default `true`. Set to `false` to exclude this mapping from rules.mk
+ // warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places
+ // deprecated: Default `false`. Set to `true` to turn on warning when a value exists
+ // invalid: Default `false`. Set to `true` to generate errors when a value exists
+ // replace_with: use with a key marked deprecated or invalid to designate a replacement
+ "BOARD": {"info_key": "board"},
+ "BOOTLOADER": {"info_key": "bootloader", "warn_duplicate": false},
+ "BLUETOOTH_DRIVER": {"info_key": "bluetooth.driver"},
+ "CAPS_WORD_ENABLE": {"info_key": "caps_word.enabled", "value_type": "bool"},
+ "DEBOUNCE_TYPE": {"info_key": "build.debounce_type"},
+ "ENCODER_ENABLE": {"info_key": "encoder.enabled", "value_type": "bool"},
+ "FIRMWARE_FORMAT": {"info_key": "build.firmware_format"},
+ "KEYBOARD_SHARED_EP": {"info_key": "usb.shared_endpoint.keyboard", "value_type": "bool"},
+ "MOUSE_SHARED_EP": {"info_key": "usb.shared_endpoint.mouse", "value_type": "bool"},
+ "LAYOUTS": {"info_key": "community_layouts", "value_type": "list"},
+ "LED_MATRIX_DRIVER": {"info_key": "led_matrix.driver"},
+ "RGB_MATRIX_DRIVER": {"info_key": "rgb_matrix.driver"},
+ "LTO_ENABLE": {"info_key": "build.lto", "value_type": "bool"},
+ "MCU": {"info_key": "processor", "warn_duplicate": false},
+ "MOUSEKEY_ENABLE": {"info_key": "mouse_key.enabled", "value_type": "bool"},
+ "NO_USB_STARTUP_CHECK": {"info_key": "usb.no_startup_check", "value_type": "bool"},
+ "PIN_COMPATIBLE": {"info_key": "pin_compatible"},
+ "SECURE_ENABLE": {"info_key": "secure.enabled", "value_type": "bool"},
+ "SPLIT_KEYBOARD": {"info_key": "split.enabled", "value_type": "bool"},
+ "SPLIT_TRANSPORT": {"info_key": "split.transport.protocol", "to_c": false},
+ "WAIT_FOR_USB": {"info_key": "usb.wait_for", "value_type": "bool"},
+ "STENO_ENABLE": {"info_key": "stenography.enabled", "value_type": "bool"},
+ "STENO_PROTOCOL": {"info_key": "stenography.protocol"},
+ "PS2_ENABLE": {"info_key": "ps2.enabled", "value_type": "bool"},
+ "PS2_MOUSE_ENABLE": {"info_key": "ps2.mouse_enabled", "value_type": "bool"},
+ "PS2_DRIVER": {"info_key": "ps2.driver"},
+
+ // Items we want flagged in lint
+ "CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"},
+ "CONVERT_TO_PROTON_C": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"},
+ "VIAL_ENABLE": {"info_key": "_invalid.vial", "invalid": true}
+}
diff --git a/data/mappings/info_rules.json b/data/mappings/info_rules.json
deleted file mode 100644
index 93de321ab1..0000000000
--- a/data/mappings/info_rules.json
+++ /dev/null
@@ -1,36 +0,0 @@
-# This file maps keys between `rules.mk` and `info.json`. It is used by QMK
-# to correctly and consistently map back and forth between the two systems.
-{
- # Format:
- # : {"info_key": , ["value_type": ], ["to_json": ], ["to_c": ]}
- # value_type: one of "array", "array.int", "bool", "int", "list", "hex", "mapping", "str", "raw"
- # to_json: Default `true`. Set to `false` to exclude this mapping from info.json
- # to_c: Default `true`. Set to `false` to exclude this mapping from rules.mk
- # warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places
- # deprecated: Default `false`. Set to `true` to turn on warning when a value exists
- # invalid: Default `false`. Set to `true` to generate errors when a value exists
- # replace_with: use with a key marked deprecated or invalid to designate a replacement
- "BOARD": {"info_key": "board"},
- "BOOTLOADER": {"info_key": "bootloader", "warn_duplicate": false},
- "BLUETOOTH": {"info_key": "bluetooth.driver"},
- "CAPS_WORD_ENABLE": {"info_key": "caps_word.enabled", "value_type": "bool"},
- "FIRMWARE_FORMAT": {"info_key": "build.firmware_format"},
- "KEYBOARD_SHARED_EP": {"info_key": "usb.shared_endpoint.keyboard", "value_type": "bool"},
- "MOUSE_SHARED_EP": {"info_key": "usb.shared_endpoint.mouse", "value_type": "bool"},
- "LAYOUTS": {"info_key": "community_layouts", "value_type": "list"},
- "LED_MATRIX_DRIVER": {"info_key": "led_matrix.driver"},
- "LTO_ENABLE": {"info_key": "build.lto", "value_type": "bool"},
- "MCU": {"info_key": "processor", "warn_duplicate": false},
- "MOUSEKEY_ENABLE": {"info_key": "mouse_key.enabled", "value_type": "bool"},
- "NO_USB_STARTUP_CHECK": {"info_key": "usb.no_startup_check", "value_type": "bool"},
- "PIN_COMPATIBLE": {"info_key": "pin_compatible"},
- "SECURE_ENABLE": {"info_key": "secure.enabled", "value_type": "bool"},
- "SPLIT_KEYBOARD": {"info_key": "split.enabled", "value_type": "bool"},
- "SPLIT_TRANSPORT": {"info_key": "split.transport.protocol", "to_c": false},
- "WAIT_FOR_USB": {"info_key": "usb.wait_for", "value_type": "bool"},
-
- # Items we want flagged in lint
- "CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"},
- "CONVERT_TO_PROTON_C": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"},
- "VIAL_ENABLE": {"info_key": "_invalid.vial", "invalid": true},
-}
diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson
new file mode 100644
index 0000000000..78a85ef6e7
--- /dev/null
+++ b/data/mappings/keyboard_aliases.hjson
@@ -0,0 +1,1252 @@
+{
+ // Format for each entry:
+ // "": {
+ // "target": "",
+ // "layouts": {
+ // "": ""
+ // }
+ // }
+ //
+ // Both target and layouts are optional.
+ "2_milk": {
+ "target": "spaceman/2_milk"
+ },
+ "absinthe": {
+ "target": "keyhive/absinthe"
+ },
+ "aeboards/constellation": {
+ "target": "aeboards/constellation/rev1"
+ },
+ "aeboards/ext65": {
+ "target": "aeboards/ext65/rev1"
+ },
+ "ai03/equinox": {
+ "target": "ai03/equinox/rev1"
+ },
+ "alice": {
+ "target": "tgr/alice"
+ },
+ "amj40": {
+ "target": "amjkeyboard/amj40"
+ },
+ "amj60": {
+ "target": "amjkeyboard/amj60"
+ },
+ "amj96": {
+ "target": "amjkeyboard/amj96"
+ },
+ "amjpad": {
+ "target": "amjkeyboard/amjpad"
+ },
+ "angel64": {
+ "target": "angel64/alpha"
+ },
+ "at101_blackheart": {
+ "target": "viktus/at101_bh"
+ },
+ "at101_bh": {
+ "target": "viktus/at101_bh"
+ },
+ "atom47/rev2": {
+ "target": "maartenwut/atom47/rev2"
+ },
+ "atom47/rev3": {
+ "target": "maartenwut/atom47/rev3"
+ },
+ "bakeneko60": {
+ "target": "kkatano/bakeneko60"
+ },
+ "bakeneko65": {
+ "target": "kkatano/bakeneko65/rev2"
+ },
+ "bakeneko80": {
+ "target": "kkatano/bakeneko80"
+ },
+ "bear_face": {
+ "target": "bear_face/v1"
+ },
+ "bm16a": {
+ "target": "kprepublic/bm16a"
+ },
+ "bm16s": {
+ "target": "kprepublic/bm16s"
+ },
+ "bm40hsrgb": {
+ "target": "kprepublic/bm40hsrgb"
+ },
+ "bm43a": {
+ "target": "kprepublic/bm43a"
+ },
+ "bm60poker": {
+ "target": "kprepublic/bm60poker"
+ },
+ "bm60rgb": {
+ "target": "kprepublic/bm60rgb"
+ },
+ "bm60rgb_iso": {
+ "target": "kprepublic/bm60rgb_iso"
+ },
+ "bm68rgb": {
+ "target": "kprepublic/bm68rgb"
+ },
+ "bpiphany/pegasushoof": {
+ "target": "bpiphany/pegasushoof/2013"
+ },
+ "chavdai40": {
+ "target": "chavdai40/rev1"
+ },
+ "candybar/lefty": {
+ "target": "tkc/candybar/lefty"
+ },
+ "candybar/righty": {
+ "target": "tkc/candybar/righty"
+ },
+ "canoe": {
+ "target": "percent/canoe"
+ },
+ "clawsome/gamebuddy": {
+ "target": "clawsome/gamebuddy/v1_0"
+ },
+ "cmm_studio/saka68": {
+ "target": "cmm_studio/saka68/solder"
+ },
+ "cospad": {
+ "target": "kprepublic/cospad"
+ },
+ "crkbd/rev1/legacy": {
+ "target": "crkbd/rev1"
+ },
+ "crkbd/rev1/common": {
+ "target": "crkbd/rev1"
+ },
+ "custommk/genesis": {
+ "target": "custommk/genesis/rev1"
+ },
+ "daisy": {
+ "target": "ktec/daisy"
+ },
+ "doro67/multi": {
+ "layouts": {
+ "LAYOUT_ansi": "LAYOUT_65_ansi_blocker"
+ }
+ },
+ "doro67/regular": {
+ "layouts": {
+ "LAYOUT": "LAYOUT_65_ansi_blocker"
+ }
+ },
+ "doro67/rgb": {
+ "layouts": {
+ "LAYOUT": "LAYOUT_65_ansi_blocker"
+ }
+ },
+ "drakon": {
+ "target": "jagdpietr/drakon"
+ },
+ "durgod/k320": {
+ "target": "durgod/k3x0/k320"
+ },
+ "dztech/dz60rgb": {
+ "target": "dztech/dz60rgb/v1"
+ },
+ "dztech/dz60rgb_ansi": {
+ "target": "dztech/dz60rgb_ansi/v1"
+ },
+ "dztech/dz60rgb_wkl": {
+ "target": "dztech/dz60rgb_wkl/v1"
+ },
+ "dztech/dz65rgb": {
+ "target": "dztech/dz65rgb/v1"
+ },
+ "dztech/volcano660": {
+ "target": "ilumkb/volcano660"
+ },
+ "eek": {
+ "target": "eek/silk_down"
+ },
+ "ergodone": {
+ "target": "ktec/ergodone"
+ },
+ "ergoinu": {
+ "target": "dm9records/ergoinu"
+ },
+ "ergosaurus": {
+ "target": "keyhive/ergosaurus"
+ },
+ "exclusive/e85": {
+ "target": "exclusive/e85/hotswap"
+ },
+ "gh60": {
+ "target": "gh60/revc"
+ },
+ "gmmk/pro": {
+ "target": "gmmk/pro/rev1/ansi"
+ },
+ "gmmk/pro/ansi": {
+ "target": "gmmk/pro/rev1/ansi"
+ },
+ "gmmk/pro/iso": {
+ "target": "gmmk/pro/rev1/iso"
+ },
+ "handwired/ferris": {
+ "target": "ferris/0_1"
+ },
+ "handwired/p1800fl": {
+ "target": "team0110/p1800fl"
+ },
+ "helix/pico/sc/back": {
+ "target": "helix/pico/sc"
+ },
+ "helix/pico/sc/under": {
+ "target": "helix/pico/sc"
+ },
+ "helix/rev2/back/oled": {
+ "target": "helix/rev2/back"
+ },
+ "helix/rev2/oled": {
+ "target": "helix/rev2"
+ },
+ "helix/rev2/oled/back": {
+ "target": "helix/rev2/back"
+ },
+ "helix/rev2/oled/under": {
+ "target": "helix/rev2/under"
+ },
+ "helix/rev2/sc/back": {
+ "target": "helix/rev2/sc"
+ },
+ "helix/rev2/sc/oled": {
+ "target": "helix/rev2/sc"
+ },
+ "helix/rev2/sc/oledback": {
+ "target": "helix/rev2/sc"
+ },
+ "helix/rev2/sc/oledunder": {
+ "target": "helix/rev2/sc"
+ },
+ "helix/rev2/sc/under": {
+ "target": "helix/rev2/sc"
+ },
+ "helix/rev2/under": {
+ "target": "helix/rev2/sc"
+ },
+ "helix/rev2/under/oled": {
+ "target": "helix/rev2/under"
+ },
+ "honeycomb": {
+ "target": "keyhive/honeycomb"
+ },
+ "idb_60": {
+ "target": "idb/idb_60",
+ "layouts": {
+ "LAYOUT": "LAYOUT_all"
+ }
+ },
+ "idobo": {
+ "target": "idobao/id75"
+ },
+ "jj40": {
+ "target": "kprepublic/jj40"
+ },
+ "jj4x4": {
+ "target": "kprepublic/jj4x4"
+ },
+ "jj50": {
+ "target": "kprepublic/jj50"
+ },
+ "jones": {
+ "target": "jones/v03_1"
+ },
+ "katana60": {
+ "target": "rominronin/katana60/rev1"
+ },
+ "kbdfans/kbd67mkiirgb": {
+ "target": "kbdfans/kbd67/mkiirgb",
+ "layouts": {
+ "LAYOUT": "LAYOUT_65_ansi_blocker"
+ }
+ },
+ "kbdfans/kbd67/mkiirgb": {
+ "target": "kbdfans/kbd67/mkiirgb/v1"
+ },
+ "keebio/dsp40": {
+ "target": "keebio/dsp40/rev1"
+ },
+ "keycapsss/plaid_pad": {
+ "target": "keycapsss/plaid_pad/rev1"
+ },
+ "kudox": {
+ "target": "kudox/rev1"
+ },
+ "kyria": {
+ "target": "splitkb/kyria"
+ },
+ "lattice60": {
+ "target": "keyhive/lattice60"
+ },
+ "lazydesigners/the60": {
+ "target": "lazydesigners/the60/rev1"
+ },
+ "lfkeyboards/lfk78": {
+ "target": "lfkeyboards/lfk78/revj"
+ },
+ "lfkeyboards/smk65": {
+ "target": "lfkeyboards/smk65/revb"
+ },
+ "m3v3van": {
+ "target": "matthewdias/m3n3van"
+ },
+ "maartenwut/atom47/rev2": {
+ "target": "evyd13/atom47/rev2"
+ },
+ "maartenwut/atom47/rev3": {
+ "target": "evyd13/atom47/rev3"
+ },
+ "maartenwut/eon40": {
+ "target": "evyd13/eon40"
+ },
+ "maartenwut/eon65": {
+ "target": "evyd13/eon65"
+ },
+ "maartenwut/eon75": {
+ "target": "evyd13/eon75"
+ },
+ "maartenwut/eon87": {
+ "target": "evyd13/eon87"
+ },
+ "maartenwut/eon95": {
+ "target": "evyd13/eon95"
+ },
+ "maartenwut/gh80_1800": {
+ "target": "evyd13/gh80_1800"
+ },
+ "maartenwut/gh80_3700": {
+ "target": "evyd13/gh80_3700"
+ },
+ "maartenwut/minitomic": {
+ "target": "evyd13/minitomic"
+ },
+ "maartenwut/mx5160": {
+ "target": "evyd13/mx5160"
+ },
+ "maartenwut/nt660": {
+ "target": "evyd13/nt660"
+ },
+ "maartenwut/omrontkl": {
+ "target": "evyd13/omrontkl"
+ },
+ "maartenwut/plain60": {
+ "target": "evyd13/plain60"
+ },
+ "maartenwut/pockettype": {
+ "target": "evyd13/pockettype"
+ },
+ "maartenwut/quackfire": {
+ "target": "evyd13/quackfire"
+ },
+ "maartenwut/solheim68": {
+ "target": "evyd13/solheim68"
+ },
+ "maartenwut/ta65": {
+ "target": "evyd13/ta65"
+ },
+ "maartenwut/wasdat": {
+ "target": "evyd13/wasdat"
+ },
+ "maartenwut/wasdat_code": {
+ "target": "evyd13/wasdat_code"
+ },
+ "maartenwut/wonderland": {
+ "target": "evyd13/wonderland"
+ },
+ "matrix/m12og": {
+ "target": "matrix/m12og/rev1"
+ },
+ "mechlovin/hannah910": {
+ "target": "mechlovin/hannah910/rev1"
+ },
+ "mechlovin/adelais/rgb_led": {
+ "target": "mechlovin/adelais/rgb_led/rev1"
+ },
+ "mechlovin/adelais/standard_led": {
+ "target": "mechlovin/adelais/standard_led/rev2"
+ },
+ "mechlovin/delphine": {
+ "target": "mechlovin/delphine/mono_led"
+ },
+ "mechlovin/hannah60rgb": {
+ "target": "mechlovin/hannah60rgb/rev1"
+ },
+ "mechlovin/hannah65/mechlovin9": {
+ "target": "mechlovin/mechlovin9/rev1"
+ },
+ "mechlovin/hex4b": {
+ "target": "mechlovin/hex4b/rev1"
+ },
+ "melgeek/z70ultra": {
+ "target": "melgeek/z70ultra/rev1"
+ },
+ "mechlovin/hannah65": {
+ "target": "mechlovin/hannah65/rev1"
+ },
+ "minim": {
+ "target": "matthewdias/minim"
+ },
+ "model01": {
+ "target": "keyboardio/model01"
+ },
+ "model_v": {
+ "target": "matthewdias/model_v"
+ },
+ "m0lly": {
+ "target": "tkc/m0lly"
+ },
+ "montsinger/rebound": {
+ "target": "montsinger/rebound/rev1"
+ },
+ "noxary/268_2": {
+ "layouts": {
+ "LAYOUT": "LAYOUT_65_ansi_blocker"
+ }
+ },
+ "oddball": {
+ "target": "oddball/v1"
+ },
+ "omnikey_blackheart": {
+ "target": "viktus/omnikey_bh"
+ },
+ "omnikey_bh": {
+ "target": "viktus/omnikey_bh"
+ },
+ "opus": {
+ "target": "keyhive/opus"
+ },
+ "pabile/p20": {
+ "target": "pabile/p20/ver1"
+ },
+ "pancake/feather": {
+ "target": "spaceman/pancake/feather"
+ },
+ "pancake/promicro": {
+ "target": "spaceman/pancake/promicro"
+ },
+ "peiorisboards/ixora": {
+ "target": "coarse/ixora"
+ },
+ "percent/canoe": {
+ "layouts": {
+ "LAYOUT_iso": "LAYOUT_65_iso_blocker"
+ }
+ },
+ "plaid": {
+ "target": "dm9records/plaid"
+ },
+ "plain60": {
+ "target": "maartenwut/plain60"
+ },
+ "ploopyco/trackball": {
+ "target": "ploopyco/trackball/rev1_005"
+ },
+ "polilla": {
+ "target": "polilla/rev1"
+ },
+ "preonic/rev1": {
+ "layouts": {
+ "LAYOUT_preonic_grid": "LAYOUT_ortho_5x12"
+ }
+ },
+ "preonic/rev2": {
+ "layouts": {
+ "LAYOUT_preonic_grid": "LAYOUT_ortho_5x12"
+ }
+ },
+ "preonic/rev3": {
+ "layouts": {
+ "LAYOUT_preonic_grid": "LAYOUT_ortho_5x12"
+ }
+ },
+ "primekb/prime_l": {
+ "target": "primekb/prime_l/v1"
+ },
+ "primekb/prime_l_v2": {
+ "target": "primekb/prime_l/v2"
+ },
+ "projectkb/alice": {
+ "target": "projectkb/alice/rev1"
+ },
+ "rama/koyu": {
+ "target": "wilba_tech/rama_works_koyu"
+ },
+ "rama/m6_a": {
+ "target": "wilba_tech/rama_works_m6_a"
+ },
+ "rama/m6_b": {
+ "target": "wilba_tech/rama_works_m6_b"
+ },
+ "rama/m10_b": {
+ "target": "wilba_tech/rama_works_m10_b"
+ },
+ "rama/m60_a": {
+ "target": "wilba_tech/rama_works_m60_a"
+ },
+ "rama/u80_a": {
+ "target": "wilba_tech/rama_works_u80_a"
+ },
+ "ramonimbao/herringbone": {
+ "target": "ramonimbao/herringbone/v1"
+ },
+ "ramonimbao/mona": {
+ "target": "ramonimbao/mona/v1"
+ },
+ "rgbkb/pan": {
+ "target": "rgbkb/pan/rev1/32a"
+ },
+ "rgbkb/pan/rev1": {
+ "target": "rgbkb/pan/rev1/32a"
+ },
+ "romac": {
+ "target": "kingly_keys/romac"
+ },
+ "ropro": {
+ "target": "kingly_keys/ropro"
+ },
+ "satan": {
+ "target": "gh60/satan"
+ },
+ "skog": {
+ "target": "percent/skog"
+ },
+ "smallice": {
+ "target": "keyhive/smallice"
+ },
+ "southpole": {
+ "target": "keyhive/southpole"
+ },
+ "speedo": {
+ "target": "cozykeys/speedo/v2"
+ },
+ "staryu": {
+ "target": "ktec/staryu"
+ },
+ "stoutgat": {
+ "target": "tkw/stoutgat/v1"
+ },
+ "suihankey": {
+ "target": "suihankey/split/alpha"
+ },
+ "ta65": {
+ "target": "maartenwut/ta65"
+ },
+ "tartan": {
+ "target": "dm9records/tartan"
+ },
+ "tkc1800": {
+ "target": "tkc/tkc1800"
+ },
+ "tkw/stoutgat/v2": {
+ "target": "tkw/stoutgat/v2/f411"
+ },
+ "tokyo60": {
+ "target": "tokyokeyboard/tokyo60"
+ },
+ "txuu": {
+ "target": "matthewdias/txuu"
+ },
+ "underscore33": {
+ "target": "underscore33/rev1"
+ },
+ "vinta": {
+ "target": "coarse/vinta",
+ "layouts": {
+ "LAYOUT_67_ansi": "LAYOUT_65_ansi_blocker"
+ }
+ },
+ "wasdat": {
+ "target": "maartenwut/wasdat"
+ },
+ "westfoxtrot/cypher": {
+ "target": "westfoxtrot/cypher/rev1"
+ },
+ "whale/sk": {
+ "target": "whale/sk/v3"
+ },
+ "xd002": {
+ "target": "xiudi/xd002"
+ },
+ "xd004": {
+ "target": "xiudi/xd004"
+ },
+ "xd60": {
+ "target": "xiudi/xd60"
+ },
+ "xd68": {
+ "target": "xiudi/xd68"
+ },
+ "xd75": {
+ "target": "xiudi/xd75"
+ },
+ "xd84": {
+ "target": "xiudi/xd84"
+ },
+ "xd84pro": {
+ "target": "xiudi/xd84pro"
+ },
+ "xd87": {
+ "target": "xiudi/xd87"
+ },
+ "xd96": {
+ "target": "xiudi/xd96"
+ },
+ "xelus/dawn60": {
+ "target": "xelus/dawn60/rev1"
+ },
+ "xelus/valor": {
+ "target": "xelus/valor/rev1"
+ },
+ "z150_blackheart": {
+ "target": "viktus/z150_bh"
+ },
+ "z150_bh":{
+ "target": "viktus/z150_bh"
+ },
+ "zeal60": {
+ "target": "wilba_tech/zeal60"
+ },
+ "zeal65": {
+ "target": "wilba_tech/zeal65"
+ },
+ // Moved during 2022 Q1 cycle
+ "6ball": {
+ "target": "maple_computing/6ball"
+ },
+ "7skb": {
+ "target": "salicylic_acid3/7skb"
+ },
+ "7splus": {
+ "target": "salicylic_acid3/7splus"
+ },
+ "acr60": {
+ "target": "mechkeys/acr60"
+ },
+ "adalyn": {
+ "target": "tominabox1/adalyn"
+ },
+ "ajisai74": {
+ "target": "salicylic_acid3/ajisai74"
+ },
+ "aleth42": {
+ "target": "25keys/aleth42"
+ },
+ "alicia_cook": {
+ "target": "ibnuda/alicia_cook"
+ },
+ "allison": {
+ "target": "prototypist/allison"
+ },
+ "allison_numpad": {
+ "target": "prototypist/allison_numpad"
+ },
+ "alu84": {
+ "target": "mechkeys/alu84"
+ },
+ "angel17": {
+ "target": "kakunpc/angel17"
+ },
+ "angel64/alpha": {
+ "target": "kakunpc/angel64/alpha"
+ },
+ "angel64/rev1": {
+ "target": "kakunpc/angel64/rev1"
+ },
+ "arch_36": {
+ "target": "obosob/arch_36"
+ },
+ "bakeneko65/rev2": {
+ "target": "kkatano/bakeneko65/rev2"
+ },
+ "bakeneko65/rev3": {
+ "target": "kkatano/bakeneko65/rev3"
+ },
+ "barleycorn": {
+ "target": "yiancardesigns/barleycorn"
+ },
+ "bat43/rev1": {
+ "target": "dailycraft/bat43/rev1"
+ },
+ "bat43/rev2": {
+ "target": "dailycraft/bat43/rev2"
+ },
+ "bigseries/1key": {
+ "target": "woodkeys/bigseries/1key"
+ },
+ "bigseries/2key": {
+ "target": "woodkeys/bigseries/2key"
+ },
+ "bigseries/3key": {
+ "target": "woodkeys/bigseries/3key"
+ },
+ "bigseries/4key": {
+ "target": "woodkeys/bigseries/4key"
+ },
+ "bkf": {
+ "target": "drhigsby/bkf"
+ },
+ "business_card/alpha": {
+ "target": "kakunpc/business_card/alpha"
+ },
+ "business_card/beta": {
+ "target": "kakunpc/business_card/beta"
+ },
+ "butterstick": {
+ "target": "gboards/butterstick"
+ },
+ "c39": {
+ "target": "maple_computing/c39"
+ },
+ "cassette42": {
+ "target": "25keys/cassette42"
+ },
+ "chidori": {
+ "target": "kagizaraya/chidori"
+ },
+ "chili": {
+ "target": "ydkb/chili"
+ },
+ "chimera_ergo": {
+ "target": "glenpickle/chimera_ergo"
+ },
+ "chimera_ls": {
+ "target": "glenpickle/chimera_ls"
+ },
+ "chimera_ortho": {
+ "target": "glenpickle/chimera_ortho"
+ },
+ "chimera_ortho_plus": {
+ "target": "glenpickle/chimera_ortho_plus"
+ },
+ "choc_taro": {
+ "target": "kakunpc/choc_taro"
+ },
+ "choco60": {
+ "target": "recompile_keys/choco60"
+ },
+ "christmas_tree": {
+ "target": "maple_computing/christmas_tree"
+ },
+ "claw44/rev1": {
+ "target": "dailycraft/claw44/rev1"
+ },
+ "cocoa40": {
+ "target": "recompile_keys/cocoa40"
+ },
+ "comet46": {
+ "target": "satt/comet46"
+ },
+ "cu24": {
+ "target": "capsunlocked/cu24"
+ },
+ "cu75": {
+ "target": "capsunlocked/cu75"
+ },
+ "cu80": {
+ "target": "capsunlocked/cu80/v1"
+ },
+ "delilah": {
+ "target": "rainkeebs/delilah"
+ },
+ "diverge3": {
+ "target": "unikeyboard/diverge3"
+ },
+ "divergetm2": {
+ "target": "unikeyboard/divergetm2"
+ },
+ "dozen0": {
+ "target": "yynmt/dozen0"
+ },
+ "dubba175": {
+ "target": "drhigsby/dubba175"
+ },
+ "eggman": {
+ "target": "qpockets/eggman"
+ },
+ "ergo42": {
+ "target": "biacco42/ergo42"
+ },
+ "ergoarrows": {
+ "target": "salicylic_acid3/ergoarrows"
+ },
+ "ergodash/mini": {
+ "target": "omkbd/ergodash/mini"
+ },
+ "ergodash/rev1": {
+ "target": "omkbd/ergodash/rev1"
+ },
+ "ergodox_infinity": {
+ "target": "input_club/ergodox_infinity"
+ },
+ "ergotaco": {
+ "target": "gboards/ergotaco"
+ },
+ "espectro": {
+ "target": "mechkeys/espectro"
+ },
+ "felix": {
+ "target": "unikeyboard/felix"
+ },
+ "four_banger": {
+ "target": "bpiphany/four_banger"
+ },
+ "freyr": {
+ "target": "hnahkb/freyr"
+ },
+ "geminate60": {
+ "target": "weirdo/geminate60"
+ },
+ "gentleman65": {
+ "target": "jkeys_design/gentleman65"
+ },
+ "georgi": {
+ "target": "gboards/georgi"
+ },
+ "gergo": {
+ "target": "gboards/gergo"
+ },
+ "getta25": {
+ "target": "salicylic_acid3/getta25"
+ },
+ "gingham": {
+ "target": "yiancardesigns/gingham"
+ },
+ "gurindam": {
+ "target": "ibnuda/gurindam"
+ },
+ "halberd": {
+ "target": "kagizaraya/halberd"
+ },
+ "handwired/hillside/0_1": {
+ "target": "handwired/hillside/48"
+ },
+ "hecomi/alpha": {
+ "target": "takashiski/hecomi/alpha"
+ },
+ "hid_liber": {
+ "target": "bpiphany/hid_liber"
+ },
+ "id67/default_rgb": {
+ "target": "idobao/id67/default_rgb"
+ },
+ "id67/rgb": {
+ "target": "idobao/id67/rgb"
+ },
+ "id80": {
+ "target": "idobao/id80/v2/ansi"
+ },
+ "idobao/id80/v1/ansi": {
+ "target": "idobao/id80/v2/ansi"
+ },
+ "idobao/id80/v1/iso": {
+ "target": "idobao/id80/v2/iso"
+ },
+ "id87": {
+ "target": "idobao/id87/v1"
+ },
+ "infinity60": {
+ "target": "input_club/infinity60"
+ },
+ "ivy/rev1": {
+ "target": "maple_computing/ivy/rev1"
+ },
+ "jisplit89": {
+ "target": "salicylic_acid3/jisplit89"
+ },
+ "jnao": {
+ "target": "maple_computing/jnao"
+ },
+ "just60": {
+ "target": "ydkb/just60"
+ },
+ "k_type": {
+ "target": "input_club/k_type"
+ },
+ "kagamidget": {
+ "target": "yynmt/kagamidget"
+ },
+ "kelowna/rgb64": {
+ "target": "weirdo/kelowna/rgb64"
+ },
+ "kprepublic/bm65hsrgb_iso": {
+ "target": "kprepublic/bm65hsrgb_iso/rev1"
+ },
+ "kprepublic/bm68hsrgb": {
+ "target": "kprepublic/bm68hsrgb/rev1"
+ },
+ "latin17rgb": {
+ "target": "latincompass/latin17rgb"
+ },
+ "latin47ble": {
+ "target": "latincompass/latin47ble"
+ },
+ "latin60rgb": {
+ "target": "latincompass/latin60rgb"
+ },
+ "latin64ble": {
+ "target": "latincompass/latin64ble"
+ },
+ "latin6rgb": {
+ "target": "latincompass/latin6rgb"
+ },
+ "latinpad": {
+ "target": "latincompass/latinpad"
+ },
+ "latinpadble": {
+ "target": "latincompass/latinpadble"
+ },
+ "launchpad/rev1": {
+ "target": "maple_computing/launchpad/rev1"
+ },
+ "lck75": {
+ "target": "lyso1/lck75"
+ },
+ "le_chiffre": {
+ "target": "tominabox1/le_chiffre"
+ },
+ "lefishe": {
+ "target": "lyso1/lefishe"
+ },
+ "lets_split_eh/eh": {
+ "target": "maple_computing/lets_split_eh/eh"
+ },
+ "ls_60": {
+ "target": "weirdo/ls_60"
+ },
+ "m3n3van": {
+ "target": "matthewdias/m3n3van"
+ },
+ "mechmini/v1": {
+ "target": "mechkeys/mechmini/v1"
+ },
+ "mechmini/v2": {
+ "target": "mechkeys/mechmini/v2"
+ },
+ "meira": {
+ "target": "woodkeys/meira"
+ },
+ "meishi": {
+ "target": "biacco42/meishi"
+ },
+ "meishi2": {
+ "target": "biacco42/meishi2"
+ },
+ "melody96": {
+ "target": "ymdk/melody96"
+ },
+ "minidox/rev1": {
+ "target": "maple_computing/minidox/rev1"
+ },
+ "mio": {
+ "target": "recompile_keys/mio"
+ },
+ "montex": {
+ "target": "idobao/montex/v1"
+ },
+ "mt40": {
+ "target": "mt/mt40"
+ },
+ "mt64rgb": {
+ "target": "mt/mt64rgb"
+ },
+ "mt84": {
+ "target": "mt/mt84"
+ },
+ "mt980": {
+ "target": "mt/mt980"
+ },
+ "nafuda": {
+ "target": "salicylic_acid3/nafuda"
+ },
+ "naiping/np64": {
+ "target": "weirdo/naiping/np64"
+ },
+ "naiping/nphhkb": {
+ "target": "weirdo/naiping/nphhkb"
+ },
+ "naiping/npminila": {
+ "target": "weirdo/naiping/npminila"
+ },
+ "naked48": {
+ "target": "salicylic_acid3/naked48"
+ },
+ "naked60": {
+ "target": "salicylic_acid3/naked60"
+ },
+ "naked64": {
+ "target": "salicylic_acid3/naked64"
+ },
+ "namecard2x4": {
+ "target": "takashiski/namecard2x4"
+ },
+ "navi10": {
+ "target": "keyhive/navi10"
+ },
+ "nebula12": {
+ "target": "spaceholdings/nebula12"
+ },
+ "nebula68": {
+ "target": "spaceholdings/nebula68"
+ },
+ "nebula68b": {
+ "target": "spaceholdings/nebula68b"
+ },
+ "niu_mini": {
+ "target": "kbdfans/niu_mini"
+ },
+ "nk1": {
+ "target": "novelkeys/nk1"
+ },
+ "nk65": {
+ "target": "novelkeys/nk65"
+ },
+ "nk87": {
+ "target": "novelkeys/nk87"
+ },
+ "nknl7en": {
+ "target": "salicylic_acid3/nknl7en"
+ },
+ "nknl7jp": {
+ "target": "salicylic_acid3/nknl7jp"
+ },
+ "nomu30": {
+ "target": "recompile_keys/nomu30"
+ },
+ "novelpad": {
+ "target": "novelkeys/novelpad"
+ },
+ "ogurec": {
+ "target": "drhigsby/ogurec"
+ },
+ "otaku_split/rev0": {
+ "target": "takashiski/otaku_split/rev0"
+ },
+ "otaku_split/rev1": {
+ "target": "takashiski/otaku_split/rev1"
+ },
+ "owl8": {
+ "target": "dailycraft/owl8"
+ },
+ "packrat": {
+ "target": "drhigsby/packrat"
+ },
+ "pistachio": {
+ "target": "rate/pistachio"
+ },
+ "pistachio_mp": {
+ "target": "rate/pistachio_mp"
+ },
+ "pistachio_pro": {
+ "target": "rate/pistachio_pro"
+ },
+ "plexus75": {
+ "target": "checkerboards/plexus75"
+ },
+ "pursuit40": {
+ "target": "checkerboards/pursuit40"
+ },
+ "qaz": {
+ "target": "tominabox1/qaz"
+ },
+ "quark": {
+ "target": "checkerboards/quark"
+ },
+ "rabbit_capture_plan": {
+ "target": "kakunpc/rabbit_capture_plan"
+ },
+ "rainkeeb": {
+ "target": "rainkeebs/rainkeeb"
+ },
+ "reviung33": {
+ "target": "reviung/reviung33"
+ },
+ "reviung34": {
+ "target": "reviung/reviung34"
+ },
+ "reviung39": {
+ "target": "reviung/reviung39"
+ },
+ "reviung41": {
+ "target": "reviung/reviung41"
+ },
+ "reviung5": {
+ "target": "reviung/reviung5"
+ },
+ "reviung53": {
+ "target": "reviung/reviung53"
+ },
+ "reviung61": {
+ "target": "reviung/reviung61"
+ },
+ "runner3680/3x6": {
+ "target": "omkbd/runner3680/3x6"
+ },
+ "runner3680/3x7": {
+ "target": "omkbd/runner3680/3x7"
+ },
+ "runner3680/3x8": {
+ "target": "omkbd/runner3680/3x8"
+ },
+ "runner3680/4x6": {
+ "target": "omkbd/runner3680/4x6"
+ },
+ "runner3680/4x7": {
+ "target": "omkbd/runner3680/4x7"
+ },
+ "runner3680/4x8": {
+ "target": "omkbd/runner3680/4x8"
+ },
+ "runner3680/5x6": {
+ "target": "omkbd/runner3680/5x6"
+ },
+ "runner3680/5x6_5x8": {
+ "target": "omkbd/runner3680/5x6_5x8"
+ },
+ "runner3680/5x7": {
+ "target": "omkbd/runner3680/5x7"
+ },
+ "runner3680/5x8": {
+ "target": "omkbd/runner3680/5x8"
+ },
+ "scarletbandana": {
+ "target": "woodkeys/scarletbandana"
+ },
+ "scythe": {
+ "target": "kagizaraya/scythe"
+ },
+ "seigaiha": {
+ "target": "yiancardesigns/seigaiha"
+ },
+ "setta21": {
+ "target": "salicylic_acid3/setta21"
+ },
+ "space_space/rev1": {
+ "target": "qpockets/space_space/rev1"
+ },
+ "space_space/rev2": {
+ "target": "qpockets/space_space/rev2"
+ },
+ "spiderisland/winry25tc": {
+ "target": "winry/winry25tc"
+ },
+ "splitreus62": {
+ "target": "nacly/splitreus62"
+ },
+ "squiggle/rev1": {
+ "target": "ibnuda/squiggle/rev1"
+ },
+ "standaside": {
+ "target": "edi/standaside"
+ },
+ "steal_this_keyboard": {
+ "target": "obosob/steal_this_keyboard"
+ },
+ "stella": {
+ "target": "hnahkb/stella"
+ },
+ "suihankey/alpha": {
+ "target": "kakunpc/suihankey/alpha"
+ },
+ "suihankey/rev1": {
+ "target": "kakunpc/suihankey/rev1"
+ },
+ "suihankey/split": {
+ "target": "kakunpc/suihankey/split"
+ },
+ "the_ruler": {
+ "target": "maple_computing/the_ruler"
+ },
+ "thedogkeyboard": {
+ "target": "kakunpc/thedogkeyboard"
+ },
+ "tiger910": {
+ "target": "weirdo/tiger910"
+ },
+ "treadstone32": {
+ "target": "marksard/treadstone32"
+ },
+ "treadstone48/rev1": {
+ "target": "marksard/treadstone48/rev1"
+ },
+ "treadstone48/rev2": {
+ "target": "marksard/treadstone48/rev2"
+ },
+ "ua62": {
+ "target": "nacly/ua62"
+ },
+ "underscore33/rev1": {
+ "target": "tominabox1/underscore33/rev1"
+ },
+ "underscore33/rev2": {
+ "target": "tominabox1/underscore33/rev2"
+ },
+ "uno": {
+ "target": "keyhive/uno"
+ },
+ "ut472": {
+ "target": "keyhive/ut472"
+ },
+ "vn66": {
+ "target": "hnahkb/vn66"
+ },
+ "wallaby": {
+ "target": "kkatano/wallaby"
+ },
+ "wanten": {
+ "target": "qpockets/wanten"
+ },
+ "wheatfield/blocked65": {
+ "target": "mt/blocked65"
+ },
+ "wheatfield/split75": {
+ "target": "mt/split75"
+ },
+ "whitefox": {
+ "target": "input_club/whitefox"
+ },
+ "wings42/rev1": {
+ "target": "dailycraft/wings42/rev1"
+ },
+ "wings42/rev1_extkeys": {
+ "target": "dailycraft/wings42/rev1_extkeys"
+ },
+ "wings42/rev2": {
+ "target": "dailycraft/wings42/rev2"
+ },
+ "yasui": {
+ "target": "rainkeebs/yasui"
+ },
+ "yd60mq": {
+ "target": "ymdk/yd60mq"
+ },
+ "yd68": {
+ "target": "ydkb/yd68"
+ },
+ "ymd75": {
+ "target": "ymdk/ymd75"
+ },
+ "ymd96": {
+ "target": "ymdk/ymd96"
+ },
+ "ymdk_np21": {
+ "target": "ymdk/np21"
+ },
+ "yurei": {
+ "target": "kkatano/yurei"
+ },
+ "zinc": {
+ "target": "25keys/zinc"
+ },
+ "zinc/rev1": {
+ "target": "25keys/zinc/rev1"
+ },
+ "zinc/reva": {
+ "target": "25keys/zinc/reva"
+ }
+}
diff --git a/data/mappings/keyboard_aliases.json b/data/mappings/keyboard_aliases.json
deleted file mode 100644
index 93be17cf81..0000000000
--- a/data/mappings/keyboard_aliases.json
+++ /dev/null
@@ -1,1276 +0,0 @@
-{
- # Format for each entry:
- # : {
- # target: ,
- # layouts: {
- # :
- # }
- # }
- #
- # Both target and layouts are optional.
- '2_milk': {
- target: 'spaceman/2_milk'
- },
- 'absinthe': {
- target: 'keyhive/absinthe'
- },
- 'aeboards/constellation': {
- target: 'aeboards/constellation/rev1'
- },
- 'aeboards/ext65': {
- target: 'aeboards/ext65/rev1'
- },
- 'ai03/equinox': {
- target: 'ai03/equinox/rev1'
- },
- aleth42: {
- target: 'aleth42/rev1'
- },
- alice: {
- target: 'tgr/alice'
- },
- amj40: {
- target: 'amjkeyboard/amj40'
- },
- amj60: {
- target: 'amjkeyboard/amj60'
- },
- amj96: {
- target: 'amjkeyboard/amj96'
- },
- amjpad: {
- target: 'amjkeyboard/amjpad'
- },
- angel17: {
- target: 'angel17/alpha'
- },
- angel64: {
- target: 'angel64/alpha'
- },
- at101_blackheart: {
- target: 'viktus/at101_bh'
- },
- at101_bh: {
- target: 'viktus/at101_bh'
- },
- 'atom47/rev2': {
- target: 'maartenwut/atom47/rev2'
- },
- 'atom47/rev3': {
- target: 'maartenwut/atom47/rev3'
- },
- bakeneko60: {
- target: 'kkatano/bakeneko60'
- },
- bakeneko65: {
- target: 'kkatano/bakeneko65/rev2'
- },
- bakeneko80: {
- target: 'kkatano/bakeneko80'
- },
- bear_face: {
- target: 'bear_face/v1'
- },
- bm16a: {
- target: 'kprepublic/bm16a'
- },
- bm16s: {
- target: 'kprepublic/bm16s'
- },
- bm40hsrgb: {
- target: 'kprepublic/bm40hsrgb'
- },
- bm43a: {
- target: 'kprepublic/bm43a'
- },
- bm60poker: {
- target: 'kprepublic/bm60poker'
- },
- bm60rgb: {
- target: 'kprepublic/bm60rgb'
- },
- bm60rgb_iso: {
- target: 'kprepublic/bm60rgb_iso'
- },
- bm68rgb: {
- target: 'kprepublic/bm68rgb'
- },
- 'bpiphany/pegasushoof': {
- target: 'bpiphany/pegasushoof/2013'
- },
- chavdai40: {
- target: 'chavdai40/rev1'
- },
- 'candybar/lefty': {
- target: 'tkc/candybar/lefty'
- },
- 'candybar/righty': {
- target: 'tkc/candybar/righty'
- },
- canoe: {
- target: 'percent/canoe'
- },
- 'clawsome/gamebuddy': {
- target: 'clawsome/gamebuddy/v1_0'
- },
- 'cmm_studio/saka68': {
- target: 'cmm_studio/saka68/solder'
- },
- 'cospad': {
- target: 'kprepublic/cospad'
- },
- 'crkbd/rev1/legacy': {
- target: 'crkbd/rev1'
- },
- 'crkbd/rev1/common': {
- target: 'crkbd/rev1'
- },
- 'custommk/genesis': {
- target: 'custommk/genesis/rev1'
- },
- 'daisy': {
- target: 'ktec/daisy'
- },
- 'doro67/multi': {
- layouts: {
- LAYOUT_ansi: 'LAYOUT_65_ansi_blocker'
- }
- },
- 'doro67/regular': {
- layouts: {
- LAYOUT: 'LAYOUT_65_ansi_blocker'
- }
- },
- 'doro67/rgb': {
- layouts: {
- LAYOUT: 'LAYOUT_65_ansi_blocker'
- }
- },
- drakon: {
- target: 'jagdpietr/drakon'
- },
- 'durgod/k320': {
- target: 'durgod/k3x0/k320'
- },
- 'dztech/dz60rgb': {
- target: 'dztech/dz60rgb/v1'
- },
- 'dztech/dz60rgb_ansi': {
- target: 'dztech/dz60rgb_ansi/v1'
- },
- 'dztech/dz60rgb_wkl': {
- target: 'dztech/dz60rgb_wkl/v1'
- },
- 'dztech/dz65rgb': {
- target: 'dztech/dz65rgb/v1'
- },
- 'dztech/volcano660': {
- target: 'ilumkb/volcano660'
- },
- eek: {
- target: 'eek/silk_down'
- },
- 'ergodone': {
- target: 'ktec/ergodone'
- },
- ergoinu: {
- target: 'dm9records/ergoinu'
- },
- ergosaurus: {
- target: 'keyhive/ergosaurus'
- },
- 'exclusive/e85': {
- target: 'exclusive/e85/hotswap'
- },
- gh60: {
- target: 'gh60/revc'
- },
- 'gmmk/pro': {
- target: 'gmmk/pro/rev1/ansi'
- },
- 'gmmk/pro/ansi': {
- target: 'gmmk/pro/rev1/ansi'
- },
- 'gmmk/pro/iso': {
- target: 'gmmk/pro/rev1/iso'
- },
- 'handwired/ferris': {
- target: 'ferris/0_1'
- },
- 'handwired/p1800fl': {
- target: 'team0110/p1800fl'
- },
- 'helix/pico/sc/back': {
- target: 'helix/pico/sc'
- },
- 'helix/pico/sc/under': {
- target: 'helix/pico/sc'
- },
- 'helix/rev2/back/oled': {
- target: 'helix/rev2/back'
- },
- 'helix/rev2/oled': {
- target: 'helix/rev2'
- },
- 'helix/rev2/oled/back': {
- target: 'helix/rev2/back'
- },
- 'helix/rev2/oled/under': {
- target: 'helix/rev2/under'
- },
- 'helix/rev2/sc/back': {
- target: 'helix/rev2/sc'
- },
- 'helix/rev2/sc/oled': {
- target: 'helix/rev2/sc'
- },
- 'helix/rev2/sc/oledback': {
- target: 'helix/rev2/sc'
- },
- 'helix/rev2/sc/oledunder': {
- target: 'helix/rev2/sc'
- },
- 'helix/rev2/sc/under': {
- target: 'helix/rev2/sc'
- },
- 'helix/rev2/under': {
- target: 'helix/rev2/sc'
- },
- 'helix/rev2/under/oled': {
- target: 'helix/rev2/under'
- },
- honeycomb: {
- target: 'keyhive/honeycomb'
- },
- id80: {
- target: 'id80/ansi'
- },
- idb_60: {
- target: 'idb/idb_60',
- layouts: {
- LAYOUT: 'LAYOUT_all'
- }
- },
- idobo: {
- target: 'idobao/id75'
- },
- 'jj40': {
- target: 'kprepublic/jj40'
- },
- 'jj4x4': {
- target: 'kprepublic/jj4x4'
- },
- 'jj50': {
- target: 'kprepublic/jj50'
- },
- jones: {
- target: 'jones/v03_1'
- },
- katana60: {
- target: 'rominronin/katana60/rev1'
- },
- 'kbdfans/kbd67mkiirgb': {
- target: 'kbdfans/kbd67/mkiirgb',
- layouts: {
- LAYOUT: 'LAYOUT_65_ansi_blocker'
- }
- },
- 'kbdfans/kbd67/mkiirgb': {
- target: 'kbdfans/kbd67/mkiirgb/v1'
- },
- 'keebio/dsp40': {
- target: 'keebio/dsp40/rev1'
- },
- 'keycapsss/plaid_pad': {
- target: 'keycapsss/plaid_pad/rev1'
- },
- kudox: {
- target: 'kudox/rev1'
- },
- 'kyria': {
- target: 'splitkb/kyria'
- },
- lattice60: {
- target: 'keyhive/lattice60'
- },
- 'lazydesigners/the60': {
- target: 'lazydesigners/the60/rev1'
- },
- 'lfkeyboards/lfk78': {
- target: 'lfkeyboards/lfk78/revj'
- },
- 'lfkeyboards/smk65': {
- target: 'lfkeyboards/smk65/revb'
- },
- m3v3van: {
- target: 'matthewdias/m3n3van'
- },
- 'maartenwut/atom47/rev2': {
- target: 'evyd13/atom47/rev2'
- },
- 'maartenwut/atom47/rev3': {
- target: 'evyd13/atom47/rev3'
- },
- 'maartenwut/eon40': {
- target: 'evyd13/eon40'
- },
- 'maartenwut/eon65': {
- target: 'evyd13/eon65'
- },
- 'maartenwut/eon75': {
- target: 'evyd13/eon75'
- },
- 'maartenwut/eon87': {
- target: 'evyd13/eon87'
- },
- 'maartenwut/eon95': {
- target: 'evyd13/eon95'
- },
- 'maartenwut/gh80_1800': {
- target: 'evyd13/gh80_1800'
- },
- 'maartenwut/gh80_3700': {
- target: 'evyd13/gh80_3700'
- },
- 'maartenwut/minitomic': {
- target: 'evyd13/minitomic'
- },
- 'maartenwut/mx5160': {
- target: 'evyd13/mx5160'
- },
- 'maartenwut/nt660': {
- target: 'evyd13/nt660'
- },
- 'maartenwut/omrontkl': {
- target: 'evyd13/omrontkl'
- },
- 'maartenwut/plain60': {
- target: 'evyd13/plain60'
- },
- 'maartenwut/pockettype': {
- target: 'evyd13/pockettype'
- },
- 'maartenwut/quackfire': {
- target: 'evyd13/quackfire'
- },
- 'maartenwut/solheim68': {
- target: 'evyd13/solheim68'
- },
- 'maartenwut/ta65': {
- target: 'evyd13/ta65'
- },
- 'maartenwut/wasdat': {
- target: 'evyd13/wasdat'
- },
- 'maartenwut/wasdat_code': {
- target: 'evyd13/wasdat_code'
- },
- 'maartenwut/wonderland': {
- target: 'evyd13/wonderland'
- },
- 'matrix/m12og': {
- target: 'matrix/m12og/rev1'
- },
- 'mechlovin/hannah910': {
- target: 'mechlovin/hannah910/rev1'
- },
- 'mechlovin/adelais/rgb_led': {
- target: 'mechlovin/adelais/rgb_led/rev1'
- },
- 'mechlovin/adelais/standard_led': {
- target: 'mechlovin/adelais/standard_led/rev2'
- },
- 'mechlovin/delphine': {
- target: 'mechlovin/delphine/mono_led'
- },
- 'mechlovin/hannah60rgb': {
- target: 'mechlovin/hannah60rgb/rev1'
- },
- 'mechlovin/hannah65/mechlovin9': {
- target: 'mechlovin/mechlovin9/rev1'
- },
- 'mechlovin/hex4b': {
- target: 'mechlovin/hex4b/rev1'
- },
- 'melgeek/z70ultra': {
- target: 'melgeek/z70ultra/rev1'
- },
- 'mechlovin/hannah65': {
- target: 'mechlovin/hannah65/rev1'
- },
- minim: {
- target: 'matthewdias/minim'
- },
- model01: {
- target: 'keyboardio/model01'
- },
- model_v: {
- target: 'matthewdias/model_v'
- },
- m0lly: {
- target: 'tkc/m0lly'
- },
- 'montsinger/rebound': {
- target: 'montsinger/rebound/rev1'
- },
- nomu30: {
- target: 'nomu30/rev1'
- },
- 'noxary/268_2': {
- layouts: {
- LAYOUT: 'LAYOUT_65_ansi_blocker'
- }
- },
- oddball: {
- target: 'oddball/v1'
- },
- omnikey_blackheart: {
- target: 'viktus/omnikey_bh'
- },
- omnikey_bh: {
- target: 'viktus/omnikey_bh'
- },
- opus: {
- target: 'keyhive/opus'
- },
- 'pabile/p20': {
- target: 'pabile/p20/ver1'
- },
- 'pancake/feather': {
- target: 'spaceman/pancake/feather'
- },
- 'pancake/promicro': {
- target: 'spaceman/pancake/promicro'
- },
- 'peiorisboards/ixora': {
- target: 'coarse/ixora'
- },
- 'percent/canoe': {
- layouts: {
- LAYOUT_iso: 'LAYOUT_65_iso_blocker'
- }
- },
- plaid: {
- target: 'dm9records/plaid'
- },
- plain60: {
- target: 'maartenwut/plain60'
- },
- 'ploopyco/trackball': {
- target: 'ploopyco/trackball/rev1_005'
- },
- polilla: {
- target: 'polilla/rev1'
- },
- 'preonic/rev1': {
- layouts: {
- LAYOUT_preonic_grid: 'LAYOUT_ortho_5x12'
- }
- },
- 'preonic/rev2': {
- layouts: {
- LAYOUT_preonic_grid: 'LAYOUT_ortho_5x12'
- }
- },
- 'preonic/rev3': {
- layouts: {
- LAYOUT_preonic_grid: 'LAYOUT_ortho_5x12'
- }
- },
- 'primekb/prime_l': {
- target: 'primekb/prime_l/v1'
- },
- 'primekb/prime_l_v2': {
- target: 'primekb/prime_l/v2'
- },
- 'projectkb/alice': {
- target: 'projectkb/alice/rev1'
- },
- 'rama/koyu': {
- target: 'wilba_tech/rama_works_koyu'
- },
- 'rama/m6_a': {
- target: 'wilba_tech/rama_works_m6_a'
- },
- 'rama/m6_b': {
- target: 'wilba_tech/rama_works_m6_b'
- },
- 'rama/m10_b': {
- target: 'wilba_tech/rama_works_m10_b'
- },
- 'rama/m60_a': {
- target: 'wilba_tech/rama_works_m60_a'
- },
- 'rama/u80_a': {
- target: 'wilba_tech/rama_works_u80_a'
- },
- 'ramonimbao/herringbone': {
- target: 'ramonimbao/herringbone/v1'
- },
- 'ramonimbao/mona': {
- target: 'ramonimbao/mona/v1'
- },
- 'rgbkb/pan': {
- target: 'rgbkb/pan/rev1/32a'
- },
- 'rgbkb/pan/rev1': {
- target: 'rgbkb/pan/rev1/32a'
- },
- romac: {
- target: 'kingly_keys/romac'
- },
- ropro: {
- target: 'kingly_keys/ropro'
- },
- satan: {
- target: 'gh60/satan'
- },
- skog: {
- target: 'percent/skog'
- },
- smallice: {
- target: 'keyhive/smallice'
- },
- southpole: {
- target: 'keyhive/southpole'
- },
- speedo: {
- target: 'cozykeys/speedo/v2'
- },
- 'staryu': {
- target: 'ktec/staryu'
- },
- stoutgat: {
- target: 'tkw/stoutgat/v1'
- },
- suihankey: {
- target: 'suihankey/split/alpha'
- },
- ta65: {
- target: 'maartenwut/ta65'
- },
- tartan: {
- target: 'dm9records/tartan'
- },
- tkc1800: {
- target: 'tkc/tkc1800'
- },
- 'tkw/stoutgat/v2': {
- target: 'tkw/stoutgat/v2/f411'
- },
- 'tokyo60': {
- target: 'tokyokeyboard/tokyo60'
- },
- 'txuu': {
- target: 'matthewdias/txuu'
- },
- underscore33: {
- target: 'underscore33/rev1'
- },
- vinta: {
- target: 'coarse/vinta',
- layouts: {
- LAYOUT_67_ansi: 'LAYOUT_65_ansi_blocker'
- }
- },
- wasdat: {
- target: 'maartenwut/wasdat'
- },
- 'westfoxtrot/cypher': {
- target: 'westfoxtrot/cypher/rev1'
- },
- 'whale/sk': {
- target: 'whale/sk/v3'
- },
- 'xd002': {
- target: 'xiudi/xd002'
- },
- 'xd004': {
- target: 'xiudi/xd004'
- },
- 'xd60': {
- target: 'xiudi/xd60'
- },
- 'xd68': {
- target: 'xiudi/xd68'
- },
- 'xd75': {
- target: 'xiudi/xd75'
- },
- 'xd84': {
- target: 'xiudi/xd84'
- },
- 'xd84pro': {
- target: 'xiudi/xd84pro'
- },
- 'xd87': {
- target: 'xiudi/xd87'
- },
- 'xd96': {
- target: 'xiudi/xd96'
- },
- 'xelus/dawn60': {
- target: 'xelus/dawn60/rev1'
- },
- 'xelus/valor': {
- target: 'xelus/valor/rev1'
- },
- yd60mq: {
- target: 'ymdk/yd60mq/12led'
- },
- ymd75: {
- target: 'ymd75/rev1'
- },
- z150_blackheart: {
- target: 'viktus/z150_bh'
- },
- z150_bh:{
- target: 'viktus/z150_bh'
- },
- zeal60: {
- target: 'wilba_tech/zeal60'
- },
- zeal65: {
- target: 'wilba_tech/zeal65'
- },
- # Moved during 2022 Q1 cycle
- 6ball: {
- target: 'maple_computing/6ball'
- },
- 7skb: {
- target: 'salicylic_acid3/7skb'
- },
- 7splus: {
- target: 'salicylic_acid3/7splus'
- },
- acr60: {
- target: 'mechkeys/acr60'
- },
- adalyn: {
- target: 'tominabox1/adalyn'
- },
- ajisai74: {
- target: 'salicylic_acid3/ajisai74'
- },
- aleth42: {
- target: '25keys/aleth42'
- },
- alicia_cook: {
- target: 'ibnuda/alicia_cook'
- },
- allison: {
- target: 'prototypist/allison'
- },
- allison_numpad: {
- target: 'prototypist/allison_numpad'
- },
- alu84: {
- target: 'mechkeys/alu84'
- },
- angel17: {
- target: 'kakunpc/angel17'
- },
- angel64/alpha: {
- target: 'kakunpc/angel64/alpha'
- },
- angel64/rev1: {
- target: 'kakunpc/angel64/rev1'
- },
- arch_36: {
- target: 'obosob/arch_36'
- },
- bakeneko60: {
- target: 'kkatano/bakeneko60'
- },
- bakeneko65/rev2: {
- target: 'kkatano/bakeneko65/rev2'
- },
- bakeneko65/rev3: {
- target: 'kkatano/bakeneko65/rev3'
- },
- bakeneko80: {
- target: 'kkatano/bakeneko80'
- },
- barleycorn: {
- target: 'yiancardesigns/barleycorn'
- },
- bat43/rev1: {
- target: 'dailycraft/bat43/rev1'
- },
- bat43/rev2: {
- target: 'dailycraft/bat43/rev2'
- },
- bigseries/1key: {
- target: 'woodkeys/bigseries/1key'
- },
- bigseries/2key: {
- target: 'woodkeys/bigseries/2key'
- },
- bigseries/3key: {
- target: 'woodkeys/bigseries/3key'
- },
- bigseries/4key: {
- target: 'woodkeys/bigseries/4key'
- },
- bkf: {
- target: 'drhigsby/bkf'
- },
- business_card/alpha: {
- target: 'kakunpc/business_card/alpha'
- },
- business_card/beta: {
- target: 'kakunpc/business_card/beta'
- },
- butterstick: {
- target: 'gboards/butterstick'
- },
- c39: {
- target: 'maple_computing/c39'
- },
- cassette42: {
- target: '25keys/cassette42'
- },
- chidori: {
- target: 'kagizaraya/chidori'
- },
- chili: {
- target: 'ydkb/chili'
- },
- chimera_ergo: {
- target: 'glenpickle/chimera_ergo'
- },
- chimera_ls: {
- target: 'glenpickle/chimera_ls'
- },
- chimera_ortho: {
- target: 'glenpickle/chimera_ortho'
- },
- chimera_ortho_plus: {
- target: 'glenpickle/chimera_ortho_plus'
- },
- choc_taro: {
- target: 'kakunpc/choc_taro'
- },
- choco60: {
- target: 'recompile_keys/choco60'
- },
- christmas_tree: {
- target: 'maple_computing/christmas_tree'
- },
- claw44/rev1: {
- target: 'dailycraft/claw44/rev1'
- },
- cocoa40: {
- target: 'recompile_keys/cocoa40'
- },
- comet46: {
- target: 'satt/comet46'
- },
- cu24: {
- target: 'capsunlocked/cu24'
- },
- cu75: {
- target: 'capsunlocked/cu75'
- },
- cu80: {
- target: 'capsunlocked/cu80/v1'
- },
- delilah: {
- target: 'rainkeebs/delilah'
- },
- diverge3: {
- target: 'unikeyboard/diverge3'
- },
- divergetm2: {
- target: 'unikeyboard/divergetm2'
- },
- dozen0: {
- target: 'yynmt/dozen0'
- },
- dubba175: {
- target: 'drhigsby/dubba175'
- },
- eggman: {
- target: 'qpockets/eggman'
- },
- ergo42: {
- target: 'biacco42/ergo42'
- },
- ergoarrows: {
- target: 'salicylic_acid3/ergoarrows'
- },
- ergodash/mini: {
- target: 'omkbd/ergodash/mini'
- },
- ergodash/rev1: {
- target: 'omkbd/ergodash/rev1'
- },
- ergodox_infinity: {
- target: 'input_club/ergodox_infinity'
- },
- ergotaco: {
- target: 'gboards/ergotaco'
- },
- espectro: {
- target: 'mechkeys/espectro'
- },
- felix: {
- target: 'unikeyboard/felix'
- },
- four_banger: {
- target: 'bpiphany/four_banger'
- },
- freyr: {
- target: 'hnahkb/freyr'
- },
- geminate60: {
- target: 'weirdo/geminate60'
- },
- georgi: {
- target: 'gboards/georgi'
- },
- gergo: {
- target: 'gboards/gergo'
- },
- getta25: {
- target: 'salicylic_acid3/getta25'
- },
- gingham: {
- target: 'yiancardesigns/gingham'
- },
- gurindam: {
- target: 'ibnuda/gurindam'
- },
- halberd: {
- target: 'kagizaraya/halberd'
- },
- hecomi/alpha: {
- target: 'takashiski/hecomi/alpha'
- },
- hid_liber: {
- target: 'bpiphany/hid_liber'
- },
- id67/default_rgb: {
- target: 'idobao/id67/default_rgb'
- },
- id67/rgb: {
- target: 'idobao/id67/rgb'
- },
- id80: {
- target: 'idobao/id80/v1'
- },
- id87: {
- target: 'idobao/id87/v1'
- },
- idobo: {
- target: 'idobao/id75/v1'
- },
- infinity60: {
- target: 'input_club/infinity60'
- },
- ivy/rev1: {
- target: 'maple_computing/ivy/rev1'
- },
- jisplit89: {
- target: 'salicylic_acid3/jisplit89'
- },
- jnao: {
- target: 'maple_computing/jnao'
- },
- just60: {
- target: 'ydkb/just60'
- },
- k_type: {
- target: 'input_club/k_type'
- },
- kagamidget: {
- target: 'yynmt/kagamidget'
- },
- kelowna/rgb64: {
- target: 'weirdo/kelowna/rgb64'
- },
- kprepublic/bm65hsrgb_iso: {
- target: 'kprepublic/bm65hsrgb_iso/rev1'
- },
- kprepublic/bm68hsrgb: {
- target: 'kprepublic/bm68hsrgb/rev1'
- },
- latin17rgb: {
- target: 'latincompass/latin17rgb'
- },
- latin47ble: {
- target: 'latincompass/latin47ble'
- },
- latin60rgb: {
- target: 'latincompass/latin60rgb'
- },
- latin64ble: {
- target: 'latincompass/latin64ble'
- },
- latin6rgb: {
- target: 'latincompass/latin6rgb'
- },
- latinpad: {
- target: 'latincompass/latinpad'
- },
- latinpadble: {
- target: 'latincompass/latinpadble'
- },
- launchpad/rev1: {
- target: 'maple_computing/launchpad/rev1'
- },
- lck75: {
- target: 'lyso1/lck75'
- },
- le_chiffre: {
- target: 'tominabox1/le_chiffre'
- },
- lefishe: {
- target: 'lyso1/lefishe'
- },
- lets_split_eh/eh: {
- target: 'maple_computing/lets_split_eh/eh'
- },
- ls_60: {
- target: 'weirdo/ls_60'
- },
- m3n3van: {
- target: 'matthewdias/m3n3van'
- },
- mechmini/v1: {
- target: 'mechkeys/mechmini/v1'
- },
- mechmini/v2: {
- target: 'mechkeys/mechmini/v2'
- },
- meira: {
- target: 'woodkeys/meira'
- },
- meishi: {
- target: 'biacco42/meishi'
- },
- meishi2: {
- target: 'biacco42/meishi2'
- },
- melody96: {
- target: 'ymdk/melody96'
- },
- minidox/rev1: {
- target: 'maple_computing/minidox/rev1'
- },
- minim: {
- target: 'matthewdias/minim'
- },
- mio: {
- target: 'recompile_keys/mio'
- },
- model_v: {
- target: 'matthewdias/model_v'
- },
- montex: {
- target: 'idobao/montex/v1'
- },
- mt40: {
- target: 'mt/mt40'
- },
- mt64rgb: {
- target: 'mt/mt64rgb'
- },
- mt84: {
- target: 'mt/mt84'
- },
- mt980: {
- target: 'mt/mt980'
- },
- nafuda: {
- target: 'salicylic_acid3/nafuda'
- },
- naiping/np64: {
- target: 'weirdo/naiping/np64'
- },
- naiping/nphhkb: {
- target: 'weirdo/naiping/nphhkb'
- },
- naiping/npminila: {
- target: 'weirdo/naiping/npminila'
- },
- naked48: {
- target: 'salicylic_acid3/naked48'
- },
- naked60: {
- target: 'salicylic_acid3/naked60'
- },
- naked64: {
- target: 'salicylic_acid3/naked64'
- },
- namecard2x4: {
- target: 'takashiski/namecard2x4'
- },
- navi10: {
- target: 'keyhive/navi10'
- },
- nebula12: {
- target: 'spaceholdings/nebula12'
- },
- nebula68: {
- target: 'spaceholdings/nebula68'
- },
- nebula68b: {
- target: 'spaceholdings/nebula68b'
- },
- niu_mini: {
- target: 'kbdfans/niu_mini'
- },
- nk1: {
- target: 'novelkeys/nk1'
- },
- nk65: {
- target: 'novelkeys/nk65'
- },
- nk87: {
- target: 'novelkeys/nk87'
- },
- nknl7en: {
- target: 'salicylic_acid3/nknl7en'
- },
- nknl7jp: {
- target: 'salicylic_acid3/nknl7jp'
- },
- nomu30: {
- target: 'recompile_keys/nomu30'
- },
- novelpad: {
- target: 'novelkeys/novelpad'
- },
- ogurec: {
- target: 'drhigsby/ogurec'
- },
- otaku_split/rev0: {
- target: 'takashiski/otaku_split/rev0'
- },
- otaku_split/rev1: {
- target: 'takashiski/otaku_split/rev1'
- },
- owl8: {
- target: 'dailycraft/owl8'
- },
- packrat: {
- target: 'drhigsby/packrat'
- },
- pistachio: {
- target: 'rate/pistachio'
- },
- pistachio_mp: {
- target: 'rate/pistachio_mp'
- },
- pistachio_pro: {
- target: 'rate/pistachio_pro'
- },
- plexus75: {
- target: 'checkerboards/plexus75'
- },
- pursuit40: {
- target: 'checkerboards/pursuit40'
- },
- qaz: {
- target: 'tominabox1/qaz'
- },
- quark: {
- target: 'checkerboards/quark'
- },
- rabbit_capture_plan: {
- target: 'kakunpc/rabbit_capture_plan'
- },
- rainkeeb: {
- target: 'rainkeebs/rainkeeb'
- },
- reviung33: {
- target: 'reviung/reviung33'
- },
- reviung34: {
- target: 'reviung/reviung34'
- },
- reviung39: {
- target: 'reviung/reviung39'
- },
- reviung41: {
- target: 'reviung/reviung41'
- },
- reviung5: {
- target: 'reviung/reviung5'
- },
- reviung53: {
- target: 'reviung/reviung53'
- },
- reviung61: {
- target: 'reviung/reviung61'
- },
- runner3680/3x6: {
- target: 'omkbd/runner3680/3x6'
- },
- runner3680/3x7: {
- target: 'omkbd/runner3680/3x7'
- },
- runner3680/3x8: {
- target: 'omkbd/runner3680/3x8'
- },
- runner3680/4x6: {
- target: 'omkbd/runner3680/4x6'
- },
- runner3680/4x7: {
- target: 'omkbd/runner3680/4x7'
- },
- runner3680/4x8: {
- target: 'omkbd/runner3680/4x8'
- },
- runner3680/5x6: {
- target: 'omkbd/runner3680/5x6'
- },
- runner3680/5x6_5x8: {
- target: 'omkbd/runner3680/5x6_5x8'
- },
- runner3680/5x7: {
- target: 'omkbd/runner3680/5x7'
- },
- runner3680/5x8: {
- target: 'omkbd/runner3680/5x8'
- },
- scarletbandana: {
- target: 'woodkeys/scarletbandana'
- },
- scythe: {
- target: 'kagizaraya/scythe'
- },
- seigaiha: {
- target: 'yiancardesigns/seigaiha'
- },
- setta21: {
- target: 'salicylic_acid3/setta21'
- },
- space_space/rev1: {
- target: 'qpockets/space_space/rev1'
- },
- space_space/rev2: {
- target: 'qpockets/space_space/rev2'
- },
- spiderisland/winry25tc: {
- target: 'winry/winry25tc'
- },
- splitreus62: {
- target: 'nacly/splitreus62'
- },
- squiggle/rev1: {
- target: 'ibnuda/squiggle/rev1'
- },
- standaside: {
- target: 'edi/standaside'
- },
- steal_this_keyboard: {
- target: 'obosob/steal_this_keyboard'
- },
- stella: {
- target: 'hnahkb/stella'
- },
- suihankey/alpha: {
- target: 'kakunpc/suihankey/alpha'
- },
- suihankey/rev1: {
- target: 'kakunpc/suihankey/rev1'
- },
- suihankey/split: {
- target: 'kakunpc/suihankey/split'
- },
- the_ruler: {
- target: 'maple_computing/the_ruler'
- },
- thedogkeyboard: {
- target: 'kakunpc/thedogkeyboard'
- },
- tiger910: {
- target: 'weirdo/tiger910'
- },
- treadstone32: {
- target: 'marksard/treadstone32'
- },
- treadstone48/rev1: {
- target: 'marksard/treadstone48/rev1'
- },
- treadstone48/rev2: {
- target: 'marksard/treadstone48/rev2'
- },
- txuu: {
- target: 'matthewdias/txuu'
- },
- ua62: {
- target: 'nacly/ua62'
- },
- underscore33/rev1: {
- target: 'tominabox1/underscore33/rev1'
- },
- underscore33/rev2: {
- target: 'tominabox1/underscore33/rev2'
- },
- uno: {
- target: 'keyhive/uno'
- },
- ut472: {
- target: 'keyhive/ut472'
- },
- vn66: {
- target: 'hnahkb/vn66'
- },
- wallaby: {
- target: 'kkatano/wallaby'
- },
- wanten: {
- target: 'qpockets/wanten'
- },
- 'wheatfield/blocked65': {
- target: 'mt/blocked65'
- },
- 'wheatfield/split75': {
- target: 'mt/split75'
- },
- whitefox: {
- target: 'input_club/whitefox'
- },
- wings42/rev1: {
- target: 'dailycraft/wings42/rev1'
- },
- wings42/rev1_extkeys: {
- target: 'dailycraft/wings42/rev1_extkeys'
- },
- wings42/rev2: {
- target: 'dailycraft/wings42/rev2'
- },
- yasui: {
- target: 'rainkeebs/yasui'
- },
- yd60mq: {
- target: 'ymdk/yd60mq'
- },
- yd68: {
- target: 'ydkb/yd68'
- },
- ymd75: {
- target: 'ymdk/ymd75'
- },
- ymd96: {
- target: 'ymdk/ymd96'
- },
- ymdk_np21: {
- target: 'ymdk/np21'
- },
- yurei: {
- target: 'kkatano/yurei'
- },
- zinc: {
- target: '25keys/zinc'
- },
- zinc/rev1: {
- target: '25keys/zinc/rev1'
- },
- zinc/reva: {
- target: '25keys/zinc/reva'
- }
-}
diff --git a/data/schemas/api_keyboard.jsonschema b/data/schemas/api_keyboard.jsonschema
index d638658a1d..6a30b5d990 100644
--- a/data/schemas/api_keyboard.jsonschema
+++ b/data/schemas/api_keyboard.jsonschema
@@ -9,7 +9,6 @@
"properties": {
"url": {"type": "string"}
}
-
},
"parse_errors": {"$ref": "qmk.definitions.v1#/string_array"},
"parse_warnings": {"$ref": "qmk.definitions.v1#/string_array"},
diff --git a/data/schemas/definitions.jsonschema b/data/schemas/definitions.jsonschema
index 1bdfbbeb03..94a94157c0 100644
--- a/data/schemas/definitions.jsonschema
+++ b/data/schemas/definitions.jsonschema
@@ -1,5 +1,5 @@
{
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema#",
"$id": "qmk.definitions.v1",
"title": "Common definitions used across QMK's jsonschemas.",
"type": "object",
@@ -65,24 +65,11 @@
]
},
"key_unit": {
- "type": "number",
- "min": 0.25
+ "type": "number"
},
"keyboard": {
- "oneOf": [
- {
- "type": "string",
- "enum": [
- "converter/numeric_keypad_IIe",
- "emptystring/NQG",
- "maple_computing/christmas_tree/V2017"
- ]
- },
- {
- "type": "string",
- "pattern": "^[0-9a-z][0-9a-z_/]*$"
- }
- ]
+ "type": "string",
+ "pattern": "^[0-9a-z][0-9a-z_/]*$"
},
"mcu_pin_array": {
"type": "array",
@@ -103,8 +90,11 @@
"pattern": "^LINE_PIN\\d{1,2}$"
},
{
- "type": "number",
- "multipleOf": 1
+ "type": "string",
+ "pattern": "^GP\\d{1,2}$"
+ },
+ {
+ "type": "integer"
},
{
"type": "null"
@@ -115,14 +105,12 @@
"type": "number"
},
"signed_int": {
- "type": "number",
- "multipleOf": 1
+ "type": "integer"
},
"signed_int_8": {
- "type": "number",
- "min": -127,
- "max": 127,
- "multipleOf": 1
+ "type": "integer",
+ "minimum": -127,
+ "maximum": 127
},
"string_array": {
"type": "array",
@@ -138,17 +126,20 @@
},
"unsigned_decimal": {
"type": "number",
- "min": 0
+ "minimum": 0
},
"unsigned_int": {
- "type": "number",
- "min": 0,
- "multipleOf": 1
+ "type": "integer",
+ "minimum": 0
},
"unsigned_int_8": {
- "type": "number",
- "min": 0,
- "max": 255,
- "multipleOf": 1
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 255
+ },
+ "bit": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 1
}
}
diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema
index fd60920578..91110b06a0 100644
--- a/data/schemas/keyboard.jsonschema
+++ b/data/schemas/keyboard.jsonschema
@@ -1,7 +1,27 @@
{
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema#",
"$id": "qmk.keyboard.v1",
"title": "Keyboard Information",
+ "definitions": {
+ "encoder_config": {
+ "type": "object",
+ "properties": {
+ "rotary": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["pin_a", "pin_b"],
+ "properties": {
+ "pin_a": {"$ref": "qmk.definitions.v1#/mcu_pin"},
+ "pin_b": {"$ref": "qmk.definitions.v1#/mcu_pin"},
+ "resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"}
+ }
+ }
+ }
+ }
+ }
+ },
"type": "object",
"properties": {
"keyboard_name": {"$ref": "qmk.definitions.v1#/text_identifier"},
@@ -14,15 +34,66 @@
},
"development_board": {
"type": "string",
- "enum": ["promicro", "elite_c", "proton_c", "bluepill", "blackpill_f401", "blackpill_f411"]
+ "enum": ["promicro", "elite_c", "elite_pi", "proton_c", "kb2040", "promicro_rp2040", "blok", "bit_c_pro", "stemcell", "bluepill", "blackpill_f401", "blackpill_f411", "bonsai_c4"]
},
"pin_compatible": {
"type": "string",
- "enum": ["promicro"]
+ "enum": ["promicro", "elite_c"]
},
"processor": {
"type": "string",
- "enum": ["cortex-m0", "cortex-m0plus", "cortex-m3", "cortex-m4", "MKL26Z64", "MK20DX128", "MK20DX256", "MK66FX1M0", "STM32F042", "STM32F072", "STM32F103", "STM32F303", "STM32F401", "STM32F405", "STM32F407", "STM32F411", "STM32F446", "STM32G431", "STM32G474", "STM32L412", "STM32L422", "STM32L432", "STM32L433", "STM32L442", "STM32L443", "GD32VF103", "WB32F3G71", "WB32FQ95", "atmega16u2", "atmega32u2", "atmega16u4", "atmega32u4", "at90usb162", "at90usb646", "at90usb647", "at90usb1286", "at90usb1287", "atmega32a", "atmega328p", "atmega328", "attiny85", "unknown"]
+ "enum": [
+ "cortex-m0",
+ "cortex-m0plus",
+ "cortex-m3",
+ "cortex-m4",
+ "cortex-m7",
+ "cortex-m23",
+ "cortex-m33",
+ "cortex-m35p",
+ "cortex-m55",
+ "cortex-m85",
+ "MKL26Z64",
+ "MK20DX128",
+ "MK20DX256",
+ "MK64FX512",
+ "MK66FX1M0",
+ "RP2040",
+ "STM32F042",
+ "STM32F072",
+ "STM32F103",
+ "STM32F303",
+ "STM32F401",
+ "STM32F405",
+ "STM32F407",
+ "STM32F411",
+ "STM32F446",
+ "STM32G431",
+ "STM32G474",
+ "STM32L412",
+ "STM32L422",
+ "STM32L432",
+ "STM32L433",
+ "STM32L442",
+ "STM32L443",
+ "GD32VF103",
+ "WB32F3G71",
+ "WB32FQ95",
+ "atmega16u2",
+ "atmega32u2",
+ "atmega16u4",
+ "atmega32u4",
+ "at90usb162",
+ "at90usb646",
+ "at90usb647",
+ "at90usb1286",
+ "at90usb1287",
+ "atmega32a",
+ "atmega328p",
+ "atmega328",
+ "attiny85",
+ "unknown"
+ ]
},
"audio": {
"type": "object",
@@ -40,12 +111,14 @@
"breathing": {"type": "boolean"},
"breathing_period": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"levels": {
- "type": "number",
- "min": 1,
- "max": 31,
- "multipleOf": 1
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 31
},
- "pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}
+ "max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
+ "pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
+ "pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
+ "on_state": {"$ref": "qmk.definitions.v1#/bit"}
}
},
"bluetooth": {
@@ -55,8 +128,7 @@
"driver": {
"type": "string",
"enum": ["BluefruitLE", "RN42"]
- },
- "lto": {"type": "boolean"},
+ }
}
},
"board": {
@@ -66,7 +138,27 @@
},
"bootloader": {
"type": "string",
- "enum": ["atmel-dfu", "bootloadhid", "bootloadHID", "custom", "caterina", "halfkay", "kiibohd", "lufa-dfu", "lufa-ms", "md-boot", "qmk-dfu", "qmk-hid", "stm32-dfu", "stm32duino", "gd32v-dfu", "wb32-dfu", "unknown", "usbasploader", "USBasp", "tinyuf2"],
+ "enum": [
+ "atmel-dfu",
+ "bootloadhid",
+ "caterina",
+ "custom",
+ "gd32v-dfu",
+ "halfkay",
+ "kiibohd",
+ "lufa-dfu",
+ "lufa-ms",
+ "md-boot",
+ "qmk-dfu",
+ "qmk-hid",
+ "rp2040",
+ "stm32-dfu",
+ "stm32duino",
+ "tinyuf2",
+ "unknown",
+ "usbasploader",
+ "wb32-dfu"
+ ]
},
"bootloader_instructions": {
"type": "string",
@@ -78,13 +170,13 @@
"properties": {
"debounce_type": {
"type": "string",
- "enum": ["custom", "eager_pk", "eager_pr", "sym_defer_pk", "sym_defer_pr", "sym_eager_pk"]
+ "enum": ["asym_eager_defer_pk", "custom", "sym_defer_g", "sym_defer_pk", "sym_defer_pr", "sym_eager_pk", "sym_eager_pr"]
},
"firmware_format": {
"type": "string",
"enum": ["bin", "hex", "uf2"]
},
- "lto": {"type": "boolean"},
+ "lto": {"type": "boolean"}
}
},
"diode_direction": {
@@ -99,8 +191,8 @@
"enabled": {"type": "boolean"},
"both_shifts_turns_on": {"type": "boolean"},
"double_tap_shift_turns_on": {"type": "boolean"},
- "idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
- },
+ "idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
+ }
},
"combo": {
"type": "object",
@@ -113,13 +205,22 @@
"type": "array",
"items": {"$ref": "qmk.definitions.v1#/filename"}
},
+ "encoder": {
+ "$ref": "#/definitions/encoder_config",
+ "properties": {
+ "enabled": {"type": "boolean"}
+ }
+ },
"features": {"$ref": "qmk.definitions.v1#/boolean_array"},
"indicators": {
"type": "object",
"properties": {
"caps_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"num_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
- "scroll_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"}
+ "scroll_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
+ "compose": {"$ref": "qmk.definitions.v1#/mcu_pin"},
+ "kana": {"$ref": "qmk.definitions.v1#/mcu_pin"},
+ "on_state": {"$ref": "qmk.definitions.v1#/bit"}
}
},
"layout_aliases": {
@@ -154,12 +255,11 @@
"minItems": 2,
"maxItems": 2,
"items": {
- "type": "number",
- "min": 0,
- "multipleOf": 1
+ "type": "integer",
+ "minimum": 0
}
},
- "r": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
+ "r": {"$ref": "qmk.definitions.v1#/signed_decimal"},
"rx": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
"ry": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
"h": {"$ref": "qmk.definitions.v1#/key_unit"},
@@ -193,18 +293,17 @@
"items": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
},
"cols": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
- "rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
- "unused": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
+ "rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
}
},
"mouse_key": {
"type": "object",
"properties": {
"enabled": {"type": "boolean"},
- "delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
- "interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
- "max_speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
- "time_to_max": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
+ "delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
+ "interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
+ "max_speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
+ "time_to_max": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"wheel_delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
}
},
@@ -218,7 +317,31 @@
"led_matrix": {
"type": "object",
"properties": {
+ "animations": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "boolean"
+ }
+ },
"driver": {"type": "string"},
+ "center_point": {
+ "type": "array",
+ "minItems": 2,
+ "maxItems": 2,
+ "items": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
+ },
+ "max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
+ "timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
+ "hue_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
+ "sat_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
+ "val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
+ "speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
+ "split_count": {
+ "type": "array",
+ "minItems": 2,
+ "maxItems": 2,
+ "items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
+ },
"layout": {
"type": "array",
"items": {
@@ -230,14 +353,13 @@
"minItems": 2,
"maxItems": 2,
"items": {
- "type": "number",
- "min": 0,
- "multipleOf": 1
+ "type": "integer",
+ "minimum": 0
}
},
"x": {"$ref": "qmk.definitions.v1#/key_unit"},
"y": {"$ref": "qmk.definitions.v1#/key_unit"},
- "flags": {"$ref": "qmk.definitions.v1#/unsigned_decimal"}
+ "flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
}
}
}
@@ -246,7 +368,31 @@
"rgb_matrix": {
"type": "object",
"properties": {
+ "animations": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "boolean"
+ }
+ },
"driver": {"type": "string"},
+ "center_point": {
+ "type": "array",
+ "minItems": 2,
+ "maxItems": 2,
+ "items": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
+ },
+ "max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
+ "timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
+ "hue_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
+ "sat_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
+ "val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
+ "speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
+ "split_count": {
+ "type": "array",
+ "minItems": 2,
+ "maxItems": 2,
+ "items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
+ },
"layout": {
"type": "array",
"items": {
@@ -258,14 +404,13 @@
"minItems": 2,
"maxItems": 2,
"items": {
- "type": "number",
- "min": 0,
- "multipleOf": 1
+ "type": "integer",
+ "minimum": 0
}
},
"x": {"$ref": "qmk.definitions.v1#/key_unit"},
"y": {"$ref": "qmk.definitions.v1#/key_unit"},
- "flags": {"$ref": "qmk.definitions.v1#/unsigned_decimal"}
+ "flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
}
}
}
@@ -290,10 +435,9 @@
"blink": {"type": "boolean"},
"enabled": {"type": "boolean"},
"max": {
- "type": "number",
- "min": 1,
- "max": 32,
- "multipleOf": 1
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 32
},
"override_rgb": {"type": "boolean"}
}
@@ -307,8 +451,8 @@
"split": {"type": "boolean"},
"split_count": {
"type": "array",
- "minLength": 2,
- "maxLength": 2,
+ "minItems": 2,
+ "maxItems": 2,
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
}
}
@@ -322,21 +466,45 @@
"idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"unlock_sequence": {
"type": "array",
- "minLength": 1,
- "maxLength": 5,
+ "minItems": 1,
+ "maxItems": 5,
"items": {
"type": "array",
"minItems": 2,
"maxItems": 2,
"items": {
- "type": "number",
- "min": 0,
- "multipleOf": 1
+ "type": "integer",
+ "minimum": 0
}
}
}
}
},
+ "stenography": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "enabled": {"type": "boolean"},
+ "protocol": {
+ "type": "string",
+ "enum": ["all", "geminipr", "txbolt"]
+ }
+ }
+ },
+ "ps2": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "enabled": {"type": "boolean"},
+ "mouse_enabled": {"type": "boolean"},
+ "clock_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
+ "data_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
+ "driver": {
+ "type": "string",
+ "enum": ["busywait", "interrupt", "usart", "vendor"]
+ }
+ }
+ },
"split": {
"type": "object",
"additionalProperties": false,
@@ -365,16 +533,24 @@
}
}
},
+ "encoder": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "right": {
+ "$ref": "#/definitions/encoder_config"
+ }
+ }
+ },
"main": {
"type": "string",
"enum": ["eeprom", "left", "matrix_grid", "pin", "right"]
},
"soft_serial_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"soft_serial_speed": {
- "type": "number",
- "min": 0,
- "max": 5,
- "multipleOf": 1
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 5
},
"transport": {
"type": "object",
@@ -385,7 +561,9 @@
"enum": ["custom", "i2c", "serial", "serial_usart"]
},
"sync_matrix_state": {"type": "boolean"},
- "sync_modifiers": {"type": "boolean"}
+ "sync_modifiers": {"type": "boolean"},
+ "watchdog": {"type": "boolean"},
+ "watchdog_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
}
},
"usb_detect": {
@@ -410,25 +588,30 @@
"force_hold_per_key": {"type": "boolean"},
"ignore_mod_tap_interrupt": {"type": "boolean"},
"ignore_mod_tap_interrupt_per_key": {"type": "boolean"},
+ "hold_on_other_key_press": {"type": "boolean"},
+ "hold_on_other_key_press_per_key": {"type": "boolean"},
"permissive_hold": {"type": "boolean"},
"permissive_hold_per_key": {"type": "boolean"},
"retro": {"type": "boolean"},
"retro_per_key": {"type": "boolean"},
"term": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"term_per_key": {"type": "boolean"},
- "toggle": {"$ref": "qmk.definitions.v1#/unsigned_int"},
+ "toggle": {"$ref": "qmk.definitions.v1#/unsigned_int"}
}
},
"usb": {
"type": "object",
"additionalProperties": false,
"properties": {
- "device_ver": {"$ref": "qmk.definitions.v1#/hex_number_4d"}, # Deprecated
+ "device_ver": {
+ "$ref": "qmk.definitions.v1#/hex_number_4d",
+ "$comment": "Deprecated: use device_version instead"
+ },
"device_version": {"$ref": "qmk.definitions.v1#/bcd_version"},
"force_nkro": {"type": "boolean"},
"pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
"vid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
- "max_power": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
+ "max_power": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"no_startup_check": {"type": "boolean"},
"polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"shared_endpoint": {
@@ -439,8 +622,8 @@
"mouse": {"type": "boolean"}
}
},
- "suspend_wakeup_delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
- "wait_for": {"type": "boolean"},
+ "suspend_wakeup_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
+ "wait_for": {"type": "boolean"}
}
},
"qmk": {
@@ -448,8 +631,8 @@
"additionalProperties": false,
"properties": {
"keys_per_scan": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
- "tap_keycode_delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
- "tap_capslock_delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
+ "tap_keycode_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
+ "tap_capslock_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"}
}
},
"qmk_lufa_bootloader": {
diff --git a/data/schemas/keycodes.jsonschema b/data/schemas/keycodes.jsonschema
new file mode 100644
index 0000000000..77a8347b3b
--- /dev/null
+++ b/data/schemas/keycodes.jsonschema
@@ -0,0 +1,57 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema#",
+ "$id": "qmk.keycodes.v1",
+ "title": "Keycode Information",
+ "type": "object",
+ "definitions": {
+ "define": {
+ "type": "string",
+ "minLength": 2,
+ "maxLength": 50,
+ "pattern": "^[A-Zs_0-9]*$"
+ },
+ "hex_number_4d": {
+ "type": "string",
+ "pattern": "^0x[0-9A-F]{4}$"
+ }
+ },
+ "properties": {
+ "ranges": {
+ "type": "object",
+ "propertyNames": {
+ "type": "string"
+ },
+ "additionalProperties": {
+ "type": "object",
+ "required": [
+ "define"
+ ],
+ "properties": {
+ "define": {"$ref": "#/definitions/define"}
+ }
+ }
+ },
+ "keycodes": {
+ "type": "object",
+ "propertyNames": {
+ "$ref": "#/definitions/hex_number_4d"
+ },
+ "additionalProperties": {
+ "type": "object",
+ "required": [
+ "key"
+ ],
+ "properties": {
+ "key": {"$ref": "#/definitions/define"},
+ "aliases": {
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/data/schemas/keymap.jsonschema b/data/schemas/keymap.jsonschema
index 3803301a66..1b8d01bcc6 100644
--- a/data/schemas/keymap.jsonschema
+++ b/data/schemas/keymap.jsonschema
@@ -1,10 +1,14 @@
{
- "$schema": "http://json-schema.org/draft-07/schema#",
+ "$schema": "https://json-schema.org/draft/2020-12/schema#",
"$id": "qmk.keymap.v1",
"title": "Keymap Information",
"type": "object",
"properties": {
"author": {"type": "string"},
+ "converter": {
+ "type": "string",
+ "enum": ["elite_pi", "proton_c", "kb2040", "promicro_rp2040", "blok", "bit_c_pro", "stemcell", "bonsai_c4"]
+ },
"host_language": {"$ref": "qmk.definitions.v1#/text_identifier"},
"keyboard": {"$ref": "qmk.definitions.v1#/text_identifier"},
"keymap": {"$ref": "qmk.definitions.v1#/text_identifier"},
@@ -31,7 +35,7 @@
"properties": {
"action": {
"type": "string",
- "enum": ['beep', 'delay', 'down', 'tap', 'up']
+ "enum": ["beep", "delay", "down", "tap", "up"]
},
"keycodes": {
"type": "array",
@@ -50,8 +54,7 @@
},
"config": {"$ref": "qmk.keyboard.v1"},
"notes": {
- "type": "string",
- "description": "asdf"
+ "type": "string"
}
},
"required": [
diff --git a/docs/ChangeLog/20211127.md b/docs/ChangeLog/20211127.md
index d954bb9f61..0780ab6a44 100644
--- a/docs/ChangeLog/20211127.md
+++ b/docs/ChangeLog/20211127.md
@@ -56,19 +56,19 @@ You can now define up to 32 macros in your `keymap.json` file, as used by [QMK C
"keyboard": "handwired/my_macropad",
"keymap": "my_keymap",
"macros": [
- [ // first listed is MACRO_0...
+ [ // first listed is QK_MACRO_0...
{"action":"down", "keycodes": ["LSFT"]},
"hello world1",
{"action": "up","keycodes": ["LSFT"]}
],
- [ // ...then MACRO_1...
+ [ // ...then QK_MACRO_1...
{"action":"tap", "keycodes": ["LCTL", "LALT", "DEL"]}
],
- [ // ...then MACRO_2...
+ [ // ...then QK_MACRO_2...
"ding!",
{"action":"beep"}
],
- [ // ...and MACRO_3.
+ [ // ...and QK_MACRO_3.
{"action":"tap", "keycodes": ["F1"]},
{"action":"delay", "duration": "1000"},
{"action":"tap", "keycodes": ["PGDN"]}
@@ -76,7 +76,7 @@ You can now define up to 32 macros in your `keymap.json` file, as used by [QMK C
],
"layout": "LAYOUT_all",
"layers": [
- ["MACRO_0", "MACRO_1", "MACRO_2", "MACRO_3"]
+ ["QK_MACRO_0", "QK_MACRO_1", "QK_MACRO_2", "QK_MACRO_3"]
]
}
```
diff --git a/docs/ChangeLog/20220827.md b/docs/ChangeLog/20220827.md
new file mode 100644
index 0000000000..b672b57cb8
--- /dev/null
+++ b/docs/ChangeLog/20220827.md
@@ -0,0 +1,343 @@
+# QMK Breaking Changes - 2022 August 27 Changelog
+
+## Notable Features :id=notable-features
+
+### Add Raspberry Pi RP2040 support ([#14877](https://github.com/qmk/qmk_firmware/pull/14877), [#17514](https://github.com/qmk/qmk_firmware/pull/17514), [#17516](https://github.com/qmk/qmk_firmware/pull/17516), [#17519](https://github.com/qmk/qmk_firmware/pull/17519), [#17612](https://github.com/qmk/qmk_firmware/pull/17612), [#17512](https://github.com/qmk/qmk_firmware/pull/17512), [#17557](https://github.com/qmk/qmk_firmware/pull/17557), [#17817](https://github.com/qmk/qmk_firmware/pull/17817), [#17839](https://github.com/qmk/qmk_firmware/pull/17839), [#18100](https://github.com/qmk/qmk_firmware/pull/18100)) :id=rp2040-support
+
+QMK _finally_ picked up support for RP2040-based boards, such as the Raspberry Pi Pico, the Sparkfun Pro Micro RP2040, and the Adafruit KB2040. One of QMK's newest collaborators, _@KarlK90_, effectively did `/micdrop` with RP2040, with a massive set of changes to both QMK and the repository QMK uses for the base platform support, ChibiOS[-Contrib]. There has been a flurry of development this breaking changes cycle related to RP2040 from a large number of contributors -- so much so that almost all standard QMK hardware subsystems are supported.
+
+Check the [RP2040 platform development page](platformdev_rp2040.md) for all supported peripherals and other hardware implementation details.
+
+### Allow `qmk flash` to use prebuilt firmware binaries ([#16584](https://github.com/qmk/qmk_firmware/pull/16584)) :id=cli-flash-binaries
+
+A long-requested capability of the QMK CLI has been the ability to flash binaries directly, without needing to build a firmware. QMK provides prebuilt `develop`-based default firmwares on our [CI page](https://qmk.tzarc.io/) -- normally people would need [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases/latest) to flash them. This new functionality written by _@Erovia_ allows `qmk flash` to be provided the prebuilt file instead, simplifying the workflow for people who haven't got Toolbox available.
+
+## Changes Requiring User Action :id=changes-requiring-user-action
+
+### Default layers dropped from 32 to 16 ([#15286](https://github.com/qmk/qmk_firmware/pull/15286))
+
+QMK allows for controlling the maximum number of layers it supports through `LAYER_STATE_(8|16|32)BIT`. Each definition allows for the same number of maximum layers -- `LAYER_STATE_8BIT` => 8 layers. There is also a corresponding firmware size decrease that goes along with smaller numbers -- given the vast majority of users don't use more than 16 layers the default has been swapped to 16. AVR users who were not previously specifying their max layer count may see some space freed up as a result.
+
+### `RESET` => `QK_BOOT` ([#17940](https://github.com/qmk/qmk_firmware/pull/17940)) :id=reset-2-qk_boot
+
+Following the last breaking changes cycle, QMK has been migrating usages of `RESET` to `QK_BOOT` due to naming collisions with our upstream board support packages. [#17940](https://github.com/qmk/qmk_firmware/pull/17940) converts user keymaps across to use the new keycode name. `RESET` should also move to `QK_BOOT`.
+
+### Updated Keyboard Codebases :id=updated-keyboard-codebases
+
+The following keyboards have had their source moved within QMK:
+
+| Old Keyboard Name | New Keyboard Name |
+|------------------------|--------------------------|
+| gentleman65 | jkeys_design/gentleman65 |
+| handwired/hillside/0_1 | handwired/hillside/48 |
+| idobao/id80/v1/ansi | idobao/id80/v2/ansi |
+| idobao/id80/v1/iso | idobao/id80/v2/iso |
+
+### Data-driven USB IDs Refactoring ([#18152](https://github.com/qmk/qmk_firmware/pull/18152)) :id=usb-ids-Refactoring
+
+QMK has decided to deprecate the specification of USB IDs inside `config.h` in favour of `info.json`, eventually leaving data-driven as the only method to specify USB information.
+
+A significant number of keyboards have already been changed on `master` in a like-for-like fashion, and [#18152](https://github.com/qmk/qmk_firmware/pull/18152) performs the same transformations for keyboards already on `develop`.
+
+Previously in `config.h`:
+```c
+#define VENDOR_ID 0x1234
+#define PRODUCT_ID 0x5678
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Me
+#define PRODUCT MyKeyboard
+```
+
+Replaced by `info.json`:
+```json
+{
+ "keyboard_name": "MyKeyboard",
+ "manufacturer": "Me",
+ "usb": {
+ "vid": "0x1234",
+ "pid": "0x5678",
+ "device_version": "0.0.1"
+ },
+ // ... layouts, etc. ...
+}
+```
+
+#### Deprecation Schedule
+
+- From 2022 Aug 27, specifying USB information in `config.h` will produce warnings during build but will still function as previously.
+- From 2022 Nov 26, specifying USB information in `config.h` will cause compilation to fail.
+
+## Notable core changes :id=notable-core
+
+### Board converters ([#17514](https://github.com/qmk/qmk_firmware/pull/17514), [#17603](https://github.com/qmk/qmk_firmware/pull/17603), [#17711](https://github.com/qmk/qmk_firmware/pull/17711), [#17827](https://github.com/qmk/qmk_firmware/pull/17827), [#17593](https://github.com/qmk/qmk_firmware/pull/17593), [#17652](https://github.com/qmk/qmk_firmware/pull/17652), [#17595](https://github.com/qmk/qmk_firmware/pull/17595)) :id=board-converters
+
+Historically QMK had a `CONVERT_TO_PROTON_C` directive for `rules.mk` to allow people to replace an AVR-based Pro Micro with a QMK Proton C. Global parts shortages have prompted people to create their own pin-compatible boards -- QMK has made this conversion generic and now allows for drop-in replacements for a lot more boards. see the [Converters Feature](feature_converters.md) documentation for the full list of supported replacement boards -- in this breaking changes cycle we've gone from 1 to 7.
+
+### Add cli command to import keyboard|keymap|kbfirmware ([#16668](https://github.com/qmk/qmk_firmware/pull/16668)) :id=cli-import
+
+To help with importing keyboards and keymaps from other sources, _@zvecr_ added [#16668](https://github.com/qmk/qmk_firmware/pull/16668) which adds a new set of commands to the CLI to automatically import keyboards (`qmk import-keyboard -h`), keymaps (`qmk import-keymap -h`), and kbfirmware definitions (`qmk import-kbfirmware -h`) into QMK.
+
+The now-EOL kbfirmware allowed people who aren't set up with QMK the ability to create keyboard firmwares without requiring a full installation of QMK. Unfortunately, it targets a 7-year-old version of QMK -- adding frustration for users who want the newest features, as well as for QMK maintainers who have to spend time explaining why QMK can't just accept a drive-by code drop from kbfirmware. With any luck, this new command helps both camps!
+
+### Generic wear-leveling for EEPROM emulation ([#16996](https://github.com/qmk/qmk_firmware/pull/16996), [#17376](https://github.com/qmk/qmk_firmware/pull/17376), [#18102](https://github.com/qmk/qmk_firmware/pull/18102)) :id=wear-leveling
+
+QMK has had the ability to write to internal MCU flash in order to emulate EEPROM for some time now, but it was only limited to a small number of MCUs. The base HAL used by QMK for a large number of ARM devices provides a "proper" embedded MCU flash driver, so _@tzarc_ decoupled the wear-leveling algorithm from the old flash writing code, improved it, wrote some tests, and enabled its use for a much larger number of other devices... including RP2040's XIP flash, and external SPI NOR Flash.
+
+See the [EEPROM Driver](eeprom_driver.md) documentation for more information.
+
+### Pointing Device Improvements ([#16371](https://github.com/qmk/qmk_firmware/pull/16371), [#17111](https://github.com/qmk/qmk_firmware/pull/17111), [#17176](https://github.com/qmk/qmk_firmware/pull/17176), [#17482](https://github.com/qmk/qmk_firmware/pull/17482), [#17776](https://github.com/qmk/qmk_firmware/pull/17776), [#17613](https://github.com/qmk/qmk_firmware/pull/17613)) :id=pointing-device-improvements
+
+Ever since Pointing Device Driver support and Split Pointing Device support were added by _@drashna_ and _@daskygit_, there has been increased interest in the development of the pointing device subsystem and its associated code.
+
+Both the PMW33xx and the Cirque Pinnacle implementations have seen a lot of improvement to their code, as has the mouse code in general. Features like circular/edge scrolling for the Cirque, and Kinetic movement for any sensor with "lift detection" ([#17482](https://github.com/qmk/qmk_firmware/pull/17482)). Additionally, for those that make fast motions with their pointing devices, support for much larger mouse movement reports has been added ([#16371](https://github.com/qmk/qmk_firmware/pull/16371)).
+
+Other related changes:
+
+* Add support for large Mouse Reports ([#16371](https://github.com/qmk/qmk_firmware/pull/16371))
+* Improve PS/2 mouse performance ([#17111](https://github.com/qmk/qmk_firmware/pull/17111))
+* Mouse key kinetic mode fix ([#17176](https://github.com/qmk/qmk_firmware/pull/17176))
+* Circular scroll, inertial cursor ([#17482](https://github.com/qmk/qmk_firmware/pull/17482))
+* Create generic Pointing Device Pin defines ([#17776](https://github.com/qmk/qmk_firmware/pull/17776))
+* PMW33XX drivers overhaul ([#17613](https://github.com/qmk/qmk_firmware/pull/17613))
+
+---
+
+## Full changelist :id=full-changelist
+
+Core:
+* Tentative Teensy 3.5 support ([#14420](https://github.com/qmk/qmk_firmware/pull/14420))
+* Make default layer size 16-bit ([#15286](https://github.com/qmk/qmk_firmware/pull/15286))
+* Process all changed keys in one scan loop, deprecate `QMK_KEYS_PER_SCAN` ([#15292](https://github.com/qmk/qmk_firmware/pull/15292))
+* Do not enable PERMISSIVE_HOLD when TAPPING_TERM exceeds 500ms ([#15674](https://github.com/qmk/qmk_firmware/pull/15674))
+* Allow usage of ChibiOS's SIO driver for split keyboards ([#15907](https://github.com/qmk/qmk_firmware/pull/15907))
+* [Controller] Added board config for custom controller STeMCell ([#16287](https://github.com/qmk/qmk_firmware/pull/16287))
+* PoC: Swap Escape and Caps ([#16336](https://github.com/qmk/qmk_firmware/pull/16336))
+* Add support for large Mouse Reports ([#16371](https://github.com/qmk/qmk_firmware/pull/16371))
+* tap-dance: Restructure code and document in more detail ([#16394](https://github.com/qmk/qmk_firmware/pull/16394))
+* Teaching the CLI to flash binaries ([#16584](https://github.com/qmk/qmk_firmware/pull/16584))
+* Split ChibiOS usart split driver in protocol and hardware driver part ([#16669](https://github.com/qmk/qmk_firmware/pull/16669))
+* Added Wait time to sending each Keys for Dynamic Macros function ([#16800](https://github.com/qmk/qmk_firmware/pull/16800))
+* Added Delay time to sending each Keys for VIA Macros function feature ([#16810](https://github.com/qmk/qmk_firmware/pull/16810))
+* Improve avr wait_us() ([#16879](https://github.com/qmk/qmk_firmware/pull/16879))
+* Improve ENCODER_DEFAULT_POS to recognize lost ticks ([#16932](https://github.com/qmk/qmk_firmware/pull/16932))
+* Added emacs as an "operating system" for input mode. ([#16949](https://github.com/qmk/qmk_firmware/pull/16949))
+* 24LC32A EEPROM addition ([#16990](https://github.com/qmk/qmk_firmware/pull/16990))
+* Refactor steno and add `STENO_PROTOCOL = [all|txbolt|geminipr]` ([#17065](https://github.com/qmk/qmk_firmware/pull/17065))
+* improvements for Cirque Pinnacle trackpads ([#17091](https://github.com/qmk/qmk_firmware/pull/17091))
+* Use TAP_HOLD_CAPS_DELAY for KC_LOCKING_CAPS_LOCK ([#17099](https://github.com/qmk/qmk_firmware/pull/17099))
+* Improve PS/2 mouse performance ([#17111](https://github.com/qmk/qmk_firmware/pull/17111))
+* Update C standard to GNU11, C++ to GNU++14 ([#17114](https://github.com/qmk/qmk_firmware/pull/17114))
+* Added ws2812_pwm support for WB32 MCU. ([#17142](https://github.com/qmk/qmk_firmware/pull/17142))
+* Added ws2812_spi support for WB32 MCU ([#17143](https://github.com/qmk/qmk_firmware/pull/17143))
+* Make bootloader_jump for dualbank STM32 respect STM32_BOOTLOADER_DUAL_BANK_DELAY ([#17178](https://github.com/qmk/qmk_firmware/pull/17178))
+* Expose the time of the last change to the LED state ([#17222](https://github.com/qmk/qmk_firmware/pull/17222))
+* [Code] Add solid reactive gradient mode ([#17228](https://github.com/qmk/qmk_firmware/pull/17228))
+* Add keymap wrappers for introspection into the keymap. ([#17229](https://github.com/qmk/qmk_firmware/pull/17229))
+* Ensure eeconfig initialised before reading EEPROM handedness. ([#17256](https://github.com/qmk/qmk_firmware/pull/17256))
+* Add uf2-split-* make targets. ([#17257](https://github.com/qmk/qmk_firmware/pull/17257))
+* Removes terminal from QMK. ([#17258](https://github.com/qmk/qmk_firmware/pull/17258))
+* Make SPI Mode configurable for AW20216 and change default mode to 3 ([#17263](https://github.com/qmk/qmk_firmware/pull/17263))
+* Move SPLIT_HAND_PIN setup to split_pre_init ([#17271](https://github.com/qmk/qmk_firmware/pull/17271))
+* Allow larger SPLIT_USB_TIMEOUT with default SPLIT_USB_TIMEOUT_POLL ([#17272](https://github.com/qmk/qmk_firmware/pull/17272))
+* Feature-ify Send String ([#17275](https://github.com/qmk/qmk_firmware/pull/17275))
+* Rework paths for eeprom locations. ([#17326](https://github.com/qmk/qmk_firmware/pull/17326))
+* Pca9505/6 driver ([#17333](https://github.com/qmk/qmk_firmware/pull/17333))
+* Cirque Attenuation Setting ([#17342](https://github.com/qmk/qmk_firmware/pull/17342))
+* Scale brigthness for VIA ([#17352](https://github.com/qmk/qmk_firmware/pull/17352))
+* Ensure that rgb+via compiles in all cases ([#17355](https://github.com/qmk/qmk_firmware/pull/17355))
+* Wear-leveling EEPROM drivers: `embedded_flash`, `spi_flash`, `legacy` ([#17376](https://github.com/qmk/qmk_firmware/pull/17376))
+* In honor of king terry ([#17387](https://github.com/qmk/qmk_firmware/pull/17387))
+* tap-dance: Rename tests so that tap_dance is used consistently ([#17396](https://github.com/qmk/qmk_firmware/pull/17396))
+* IS31FL3737 Global Current Setting ([#17420](https://github.com/qmk/qmk_firmware/pull/17420))
+* [QP] Add ILI9488 support. ([#17438](https://github.com/qmk/qmk_firmware/pull/17438))
+* Mark GD32VF103 as ChibiOS-Contrib ([#17444](https://github.com/qmk/qmk_firmware/pull/17444))
+* ISSI Drivers Global Current Option ([#17448](https://github.com/qmk/qmk_firmware/pull/17448))
+* [Split] pointing transport check ([#17481](https://github.com/qmk/qmk_firmware/pull/17481))
+* Cirque trackpad features: circular scroll, inertial cursor ([#17482](https://github.com/qmk/qmk_firmware/pull/17482))
+* RGB heatmap skip NO_LED ([#17488](https://github.com/qmk/qmk_firmware/pull/17488))
+* Add kb2040 and sparkfun rp2040 converters ([#17514](https://github.com/qmk/qmk_firmware/pull/17514))
+* [style] rp2040 stage2 formatting ([#17516](https://github.com/qmk/qmk_firmware/pull/17516))
+* Also check /run/media/ for uf2 drives ([#17517](https://github.com/qmk/qmk_firmware/pull/17517))
+* RP2040 emulated EEPROM. ([#17519](https://github.com/qmk/qmk_firmware/pull/17519))
+* Make debounce algorithms signal matrix changes ([#17554](https://github.com/qmk/qmk_firmware/pull/17554))
+* Update PM2040 I2C pins ([#17578](https://github.com/qmk/qmk_firmware/pull/17578))
+* Added implementation of WB32 MCU wear_leveling_efl. ([#17579](https://github.com/qmk/qmk_firmware/pull/17579))
+* Use Pro Micro SDA/SCL pinout for PM2040 ([#17595](https://github.com/qmk/qmk_firmware/pull/17595))
+* Refactor Pixel Fractal effect ([#17602](https://github.com/qmk/qmk_firmware/pull/17602))
+* Add Blok RP2040 converter ([#17603](https://github.com/qmk/qmk_firmware/pull/17603))
+* Use polled waiting on ChibiOS platforms that support it ([#17607](https://github.com/qmk/qmk_firmware/pull/17607))
+* Stabilize Half-duplex RP2040 PIO split comms ([#17612](https://github.com/qmk/qmk_firmware/pull/17612))
+* PMW33XX drivers overhaul ([#17613](https://github.com/qmk/qmk_firmware/pull/17613))
+* Include stdint.h in avr/i2c_master.h ([#17639](https://github.com/qmk/qmk_firmware/pull/17639))
+* Add led matrix support for CKLED2001 ([#17643](https://github.com/qmk/qmk_firmware/pull/17643))
+* `STM32_USB_USE_OTG1` => `USB_ENDPOINTS_ARE_REORDERABLE` ([#17647](https://github.com/qmk/qmk_firmware/pull/17647))
+* Allow MCU-specific overrides for SPI flags. ([#17650](https://github.com/qmk/qmk_firmware/pull/17650))
+* Update LED/RGB Matrix flag function behavior ([#17651](https://github.com/qmk/qmk_firmware/pull/17651))
+* Cirque circular scroll: Support POINTING_DEVICE_COMBINED ([#17654](https://github.com/qmk/qmk_firmware/pull/17654))
+* Add support for PAW3204 Optical Sensor ([#17669](https://github.com/qmk/qmk_firmware/pull/17669))
+* Add LED limits call ([#17679](https://github.com/qmk/qmk_firmware/pull/17679))
+* Move Pointing Device code to a subdirectory ([#17684](https://github.com/qmk/qmk_firmware/pull/17684))
+* Avoid OOB in dynamic_keymap_reset ([#17695](https://github.com/qmk/qmk_firmware/pull/17695))
+* Allow dynamic keymap to compile without `via.h` ([#17703](https://github.com/qmk/qmk_firmware/pull/17703))
+* Use correct angle tune range of +/-127 on PMW33XX ([#17708](https://github.com/qmk/qmk_firmware/pull/17708))
+* Add Bonsai C4 converter ([#17711](https://github.com/qmk/qmk_firmware/pull/17711))
+* VIA Encoder Map Support ([#17734](https://github.com/qmk/qmk_firmware/pull/17734))
+* Move Pointing Device Initialization to after Split Post Initialization ([#17740](https://github.com/qmk/qmk_firmware/pull/17740))
+* Add ability to enter bootloader mode from `QK_MAKE` ([#17745](https://github.com/qmk/qmk_firmware/pull/17745))
+* Add `tap_code16_delay` ([#17748](https://github.com/qmk/qmk_firmware/pull/17748))
+* Implement relative mode for Cirque trackpad ([#17760](https://github.com/qmk/qmk_firmware/pull/17760))
+* Create generic Pointing Device Pin defines ([#17776](https://github.com/qmk/qmk_firmware/pull/17776))
+* Constrain Cirque Pinnacle coordinates ([#17803](https://github.com/qmk/qmk_firmware/pull/17803))
+* Refactor/rename postprocess_steno_user → post_process_steno_user ([#17823](https://github.com/qmk/qmk_firmware/pull/17823))
+* Add Bit-C PRO converter ([#17827](https://github.com/qmk/qmk_firmware/pull/17827))
+* guard RPC invocation by checking RPC info against crc checksum ([#17840](https://github.com/qmk/qmk_firmware/pull/17840))
+* Add ST7735 driver to Quantum Painter ([#17848](https://github.com/qmk/qmk_firmware/pull/17848))
+* Add minimal STM32F103C6 support ([#17853](https://github.com/qmk/qmk_firmware/pull/17853))
+* Remove legacy AVR ssd1306 driver ([#17864](https://github.com/qmk/qmk_firmware/pull/17864))
+* Remove tmk_core 'serial' code ([#17866](https://github.com/qmk/qmk_firmware/pull/17866))
+* Use LT_ZCAR in place of LT_PLUS for modded kc definitions of keymap_lithuanian_qwerty.h ([#18000](https://github.com/qmk/qmk_firmware/pull/18000))
+* Remove invisible variation selector-15 from keymap_japanese.h ([#18007](https://github.com/qmk/qmk_firmware/pull/18007))
+* define CZ_PERC S(CZ_PLUS) → define CZ_PERC S(CZ_EQL) ([#18008](https://github.com/qmk/qmk_firmware/pull/18008))
+* KR_DQUO S(KR_COLN) → KR_DQUO S(KR_QUOT) in keymap_korean.h ([#18011](https://github.com/qmk/qmk_firmware/pull/18011))
+* Replace ; by : in the shifted symbols ASCII art of keymap_norman ([#18029](https://github.com/qmk/qmk_firmware/pull/18029))
+* Add eeprom defaults for tinyuf2 bootloader ([#18042](https://github.com/qmk/qmk_firmware/pull/18042))
+* Remove duplicate COMBINING HORN in keymap_us_extended.h ([#18045](https://github.com/qmk/qmk_firmware/pull/18045))
+* Nix shell updates for `develop` ([#18131](https://github.com/qmk/qmk_firmware/pull/18131))
+
+CLI:
+* Add cli command to import keyboard|keymap|kbfirmware ([#16668](https://github.com/qmk/qmk_firmware/pull/16668))
+* Publish data as part of API generation ([#17020](https://github.com/qmk/qmk_firmware/pull/17020))
+* Allow encoder config from info.json ([#17295](https://github.com/qmk/qmk_firmware/pull/17295))
+* `qmk doctor`: show arch for macOS ([#17356](https://github.com/qmk/qmk_firmware/pull/17356))
+* Use --exclude-from=.gitignore in place of --exclude-standard ([#17399](https://github.com/qmk/qmk_firmware/pull/17399))
+* Improve importer workflow ([#17707](https://github.com/qmk/qmk_firmware/pull/17707))
+* Remove legacy bootmagic cli parsing ([#18099](https://github.com/qmk/qmk_firmware/pull/18099))
+* Align CLI requirements ([#18117](https://github.com/qmk/qmk_firmware/pull/18117))
+
+Submodule updates:
+* Add Raspberry Pi RP2040 support ([#14877](https://github.com/qmk/qmk_firmware/pull/14877))
+* Update mpaland/printf to eyalroz/printf fork ([#16163](https://github.com/qmk/qmk_firmware/pull/16163))
+* Generic wear-leveling algorithm ([#16996](https://github.com/qmk/qmk_firmware/pull/16996))
+* Update LUFA submodule ([#17368](https://github.com/qmk/qmk_firmware/pull/17368))
+* Update V-USB submodule ([#17385](https://github.com/qmk/qmk_firmware/pull/17385))
+* Update ChibiOS-Contrib ([#17540](https://github.com/qmk/qmk_firmware/pull/17540))
+* Update to latest ChibiOS-Contrib. ([#18016](https://github.com/qmk/qmk_firmware/pull/18016))
+* Update LUFA submodule ([#18168](https://github.com/qmk/qmk_firmware/pull/18168))
+
+Keyboards:
+* GMMK 2 WBG7 MCU compatibility ([#16436](https://github.com/qmk/qmk_firmware/pull/16436))
+* bastardkb: restructure folder hierarchy ([#16778](https://github.com/qmk/qmk_firmware/pull/16778))
+* Add Gentleman 65 SE Solderd PCB support ([#16992](https://github.com/qmk/qmk_firmware/pull/16992))
+* Move/Rename to Hillside48, simplify default keymap ([#17210](https://github.com/qmk/qmk_firmware/pull/17210))
+* IDOBAO ID67 code touch-ups and include factory keymap ([#17231](https://github.com/qmk/qmk_firmware/pull/17231))
+* IDOBAO ID87v2 code rewrite and include factory keymap ([#17232](https://github.com/qmk/qmk_firmware/pull/17232))
+* IDOBAO ID80v3 code rewrite and include factory keymap ([#17234](https://github.com/qmk/qmk_firmware/pull/17234))
+* IDOBAO ID80v1 folder rename ([#17265](https://github.com/qmk/qmk_firmware/pull/17265))
+* Fine!40 PCB Support ([#17426](https://github.com/qmk/qmk_firmware/pull/17426))
+* Update Charybdis code for Extended Mouse reports ([#17435](https://github.com/qmk/qmk_firmware/pull/17435))
+* (develop)AP2: Enable support for WL EEPROM Driver ([#17506](https://github.com/qmk/qmk_firmware/pull/17506))
+* (develop)Keychron Q2: Enable support for WL EEPROM Driver ([#17507](https://github.com/qmk/qmk_firmware/pull/17507))
+* Add Adafruit Macropad RP2040 ([#17512](https://github.com/qmk/qmk_firmware/pull/17512))
+* Add RP2040 config defaults ([#17557](https://github.com/qmk/qmk_firmware/pull/17557))
+* Add support keyboard Feker IK75 ([#17611](https://github.com/qmk/qmk_firmware/pull/17611))
+* boardsource/holiday/spooky data driven ([#17632](https://github.com/qmk/qmk_firmware/pull/17632))
+* boardsource/lulu data driven ([#17638](https://github.com/qmk/qmk_firmware/pull/17638))
+* Added support for gmmk pro rev2 keyboard. ([#17655](https://github.com/qmk/qmk_firmware/pull/17655))
+* boardsource/microdox data driven ([#17675](https://github.com/qmk/qmk_firmware/pull/17675))
+* Remove full bootmagic config from user files ([#17702](https://github.com/qmk/qmk_firmware/pull/17702))
+* (develop) Update bootmagic for Adafruit Macropad ([#17755](https://github.com/qmk/qmk_firmware/pull/17755))
+* Add a kb2040 version of the onkey keyboard that works with the oled keymap ([#17786](https://github.com/qmk/qmk_firmware/pull/17786))
+* Enable mousekeys by default for RGBKB Sol3 ([#17842](https://github.com/qmk/qmk_firmware/pull/17842))
+* More glyph transformations for spidey3 userspace ([#17854](https://github.com/qmk/qmk_firmware/pull/17854))
+* Default rgblight ([#17855](https://github.com/qmk/qmk_firmware/pull/17855))
+* Refactor satt/comet46 to use core OLED driver ([#17856](https://github.com/qmk/qmk_firmware/pull/17856))
+* Convert yosino58 to use split common ([#17861](https://github.com/qmk/qmk_firmware/pull/17861))
+* Migrate crkbd keymaps to oled driver ([#17863](https://github.com/qmk/qmk_firmware/pull/17863))
+* Overhaul uzu42 ([#17868](https://github.com/qmk/qmk_firmware/pull/17868))
+* Update ginkgo65hot to allow use of community layouts ([#17911](https://github.com/qmk/qmk_firmware/pull/17911))
+* Remove `UNUSED_PINS` ([#17931](https://github.com/qmk/qmk_firmware/pull/17931))
+* RESET -> QK_BOOT user keymaps ([#17940](https://github.com/qmk/qmk_firmware/pull/17940))
+* Add cursor layer to DMQ Spin ([#17996](https://github.com/qmk/qmk_firmware/pull/17996))
+* add new keyboard 'soda/cherish' ([#18057](https://github.com/qmk/qmk_firmware/pull/18057))
+* Move keyboard USB IDs and strings to data driven: develop ([#18152](https://github.com/qmk/qmk_firmware/pull/18152))
+
+Keyboard fixes:
+* Fixup SPI mode 3 => 0 on tzarc/djinn, `develop`. ([#17440](https://github.com/qmk/qmk_firmware/pull/17440))
+* Fixup doio/kb16 ([#17545](https://github.com/qmk/qmk_firmware/pull/17545))
+* Adafruit Macropad: Add VIA keymap, fix default km ([#17735](https://github.com/qmk/qmk_firmware/pull/17735))
+* Fix compilation issues for Charybdis/Dilemma ([#17791](https://github.com/qmk/qmk_firmware/pull/17791))
+* bastardkb: fix info.json changes that got reverted during the last merge from `master` to `develop` ([#17800](https://github.com/qmk/qmk_firmware/pull/17800))
+* Fixup uzu42 ([#17867](https://github.com/qmk/qmk_firmware/pull/17867))
+* use correct function in Dilemma splinky ([#17923](https://github.com/qmk/qmk_firmware/pull/17923))
+* Fix compilation issues for Boardsource Microdox ([#18037](https://github.com/qmk/qmk_firmware/pull/18037))
+* Fixup gmmk/pro/rev2 USB Data ([#18056](https://github.com/qmk/qmk_firmware/pull/18056))
+
+Others:
+* backlight|led 'on state' for DD configuration ([#17383](https://github.com/qmk/qmk_firmware/pull/17383))
+* Dump out the largest symbols in flash and in RAM. ([#17397](https://github.com/qmk/qmk_firmware/pull/17397))
+* Re-order user space rules inclusion ([#17459](https://github.com/qmk/qmk_firmware/pull/17459))
+* Update feature_split_keyboard.md to add extra detail about left and right matrices. ([#17492](https://github.com/qmk/qmk_firmware/pull/17492))
+* Swap F4x1 default board files away from blackpill ([#17522](https://github.com/qmk/qmk_firmware/pull/17522))
+* Add converter docs ([#17593](https://github.com/qmk/qmk_firmware/pull/17593))
+* Updates to Pointing Device Docs ([#17777](https://github.com/qmk/qmk_firmware/pull/17777))
+* Add deprecated check for RGBLIGHT_ANIMATIONS ([#17832](https://github.com/qmk/qmk_firmware/pull/17832))
+* Remove OLED driver Split Common warning ([#17862](https://github.com/qmk/qmk_firmware/pull/17862))
+* Revert " Re-order user space rules inclusion (#17459)" ([#18032](https://github.com/qmk/qmk_firmware/pull/18032))
+
+Bugs:
+* Minor schema fixes ([#14200](https://github.com/qmk/qmk_firmware/pull/14200))
+* Fix buffer size for WS2812 PWM driver ([#17046](https://github.com/qmk/qmk_firmware/pull/17046))
+* Fix AVR I2C master 1ms timeout ([#17174](https://github.com/qmk/qmk_firmware/pull/17174))
+* Mouse key kinetic mode fix ([#17176](https://github.com/qmk/qmk_firmware/pull/17176))
+* Fix RGB heatmap to use XY positions and use correct led limits. ([#17184](https://github.com/qmk/qmk_firmware/pull/17184))
+* Fix keys being discarded after using the leader key ([#17287](https://github.com/qmk/qmk_firmware/pull/17287))
+* Fixup pimoroni trackball ([#17335](https://github.com/qmk/qmk_firmware/pull/17335))
+* Fix via builds broken by brightness scaling ([#17354](https://github.com/qmk/qmk_firmware/pull/17354))
+* SPI Bugfix for ChibiOS `21.11.1` => `21.11.2` ([#17371](https://github.com/qmk/qmk_firmware/pull/17371))
+* Additional schema fixes ([#17414](https://github.com/qmk/qmk_firmware/pull/17414))
+* Fix deadlocks on disconnected secondary half ([#17423](https://github.com/qmk/qmk_firmware/pull/17423))
+* [Fix] Fix compilation warning for non-split keebs after #17423 ([#17439](https://github.com/qmk/qmk_firmware/pull/17439))
+* Fix Caps Word to treat mod-taps more consistently. ([#17463](https://github.com/qmk/qmk_firmware/pull/17463))
+* Fix docs regarding `USB_SUSPEND_WAKEUP_DELAY` ([#17501](https://github.com/qmk/qmk_firmware/pull/17501))
+* Fixup SSD1351 build after #17438 ([#17533](https://github.com/qmk/qmk_firmware/pull/17533))
+* Fixup SPI init procedure, SPI EEPROM sequencing ([#17534](https://github.com/qmk/qmk_firmware/pull/17534))
+* Fix Caps Word capitalization when used with Combos + Auto Shift. ([#17549](https://github.com/qmk/qmk_firmware/pull/17549))
+* Allow for `keymaps` array to be implemented in a file other than `$(KEYMAP_C)` ([#17559](https://github.com/qmk/qmk_firmware/pull/17559))
+* [Fix] printf update aftermath ([#17584](https://github.com/qmk/qmk_firmware/pull/17584))
+* Fix rgbkb/sol/rev2 build issues ([#17601](https://github.com/qmk/qmk_firmware/pull/17601))
+* More DD encoder fixes ([#17615](https://github.com/qmk/qmk_firmware/pull/17615))
+* [Fix] Make ChibiOS `_wait.h` independent of `quantum.h` ([#17645](https://github.com/qmk/qmk_firmware/pull/17645))
+* Grammar fixes for docs/feature_converters.md ([#17652](https://github.com/qmk/qmk_firmware/pull/17652))
+* Fix compilation issue with Cirque Guestures file ([#17656](https://github.com/qmk/qmk_firmware/pull/17656))
+* Fix compile issue with LED Matrix ([#17658](https://github.com/qmk/qmk_firmware/pull/17658))
+* Post-bootloader EFL/SPI fixes. ([#17661](https://github.com/qmk/qmk_firmware/pull/17661))
+* Fix LED limit loop ([#17678](https://github.com/qmk/qmk_firmware/pull/17678))
+* [Fix] Use correct angle tune range of +/-30 on PMW33XX ([#17693](https://github.com/qmk/qmk_firmware/pull/17693))
+* Fix AVR compilation of FNV by using standard integer typenames. ([#17716](https://github.com/qmk/qmk_firmware/pull/17716))
+* fix syntax error in header file ([#17732](https://github.com/qmk/qmk_firmware/pull/17732))
+* Fix custom debug function and sample output ([#17790](https://github.com/qmk/qmk_firmware/pull/17790))
+* Fix QK_MAKE's reboot check ([#17795](https://github.com/qmk/qmk_firmware/pull/17795))
+* Chibios: Stop I2C peripheral on transaction error ([#17798](https://github.com/qmk/qmk_firmware/pull/17798))
+* Fix ChibiOS `i2c_master` error codes ([#17808](https://github.com/qmk/qmk_firmware/pull/17808))
+* Update ChibiOS Contrib for RP2040 fixes ([#17817](https://github.com/qmk/qmk_firmware/pull/17817))
+* RP2040 disable PIO IRQs on serial timeout ([#17839](https://github.com/qmk/qmk_firmware/pull/17839))
+* Fix POINTING_DEVICE_GESTURES_SCROLL_ENABLE typo ([#17850](https://github.com/qmk/qmk_firmware/pull/17850))
+* Fixup compilation of printf-like functions with uint32_t args. ([#17904](https://github.com/qmk/qmk_firmware/pull/17904))
+* Fix issue with #17904. ([#17905](https://github.com/qmk/qmk_firmware/pull/17905))
+* Always run pointing device init ([#17936](https://github.com/qmk/qmk_firmware/pull/17936))
+* Align TO() max layers with other keycodes ([#17989](https://github.com/qmk/qmk_firmware/pull/17989))
+* Fix Bépo's BP_NNBS (narrow non-breaking space) ([#17999](https://github.com/qmk/qmk_firmware/pull/17999))
+* Move Encoder+Encoder Map from generic features ([#18018](https://github.com/qmk/qmk_firmware/pull/18018))
+* Fix wrong varaible in encoder block ([#18020](https://github.com/qmk/qmk_firmware/pull/18020))
+* Fix LV_CCAR and LV_NCED in keymap_latvian.h ([#18025](https://github.com/qmk/qmk_firmware/pull/18025))
+* Use ANSI ASCII art and fix comments for LT_COLN and LT_UNDS in keymap_lithuanian_qwerty.h ([#18028](https://github.com/qmk/qmk_firmware/pull/18028))
+* Partially revert some WB32 specific changes ([#18038](https://github.com/qmk/qmk_firmware/pull/18038))
+* Fix Emulated EEPROM issue with F466 ([#18039](https://github.com/qmk/qmk_firmware/pull/18039))
+* Fix DV_SCLN and DV_COLN in keymap_spanish_dvorak.h ([#18043](https://github.com/qmk/qmk_firmware/pull/18043))
+* Fix missing development_board schema entry ([#18050](https://github.com/qmk/qmk_firmware/pull/18050))
+* Add key event check to `is_tap_record` and remove `is_tap_key` ([#18063](https://github.com/qmk/qmk_firmware/pull/18063))
+* Fix GD32VF103 WS2812 PWM driver ([#18067](https://github.com/qmk/qmk_firmware/pull/18067))
+* Fix new-keyboard default for RP2040 bootloader ([#18100](https://github.com/qmk/qmk_firmware/pull/18100))
+* Fixup F4xx wear-leveling bootloader check ([#18102](https://github.com/qmk/qmk_firmware/pull/18102))
+* Fix PID value for the Keyboardio Atreus 2 bootloader ([#18116](https://github.com/qmk/qmk_firmware/pull/18116))
+* Add missing SS_LOPT and SS_ROPT defines ([#18175](https://github.com/qmk/qmk_firmware/pull/18175))
diff --git a/docs/ChangeLog/20221126.md b/docs/ChangeLog/20221126.md
new file mode 100644
index 0000000000..82aa4a499e
--- /dev/null
+++ b/docs/ChangeLog/20221126.md
@@ -0,0 +1,510 @@
+# QMK Breaking Changes - 2022 November 26 Changelog
+
+## Notable Features :id=notable-features
+
+### Autocorrect ([#15699](https://github.com/qmk/qmk_firmware/pull/15699)) :id=autocorrect
+
+_@getreuer_ in their infinite wisdom decided that autocorrect was a feature needed by QMK. As is customary, _@drashna_ adapted it to core and got it into a state that everyone else can use it. See [Feature: Autocorrect](feature_autocorrect.md) for more ifnormation (grin).
+
+## Changes Requiring User Action :id=changes-requiring-user-action
+
+### Updated Keyboard Codebases :id=updated-keyboard-codebases
+
+The following keyboards have had their source moved within QMK:
+
+| Old Keyboard Name | New Keyboard Name |
+|--------------------------------------|--------------------------------------|
+| converter/numeric_keypad_IIe | converter/numeric_keypad_iie |
+| durgod/k3x0/k310 | durgod/k310 |
+| durgod/k3x0/k320 | durgod/k320 |
+| emptystring/NQG | emptystring/nqg |
+| handwired/hillside/46 | hillside/46 |
+| handwired/hillside/48 | hillside/48 |
+| handwired/hillside/52 | hillside/52 |
+| maple_computing/christmas_tree/V2017 | maple_computing/christmas_tree/v2017 |
+
+### Keycodes refactoring :id=keycodes-overhaul-user-action
+
+QMK's keycodes got a very significant overhaul this breaking changes cycle, with the bulk of the work done by _@zvecr_ and _@fauxpark_ -- renaming, reordering, removing has been their focus in this area. In an attempt to standardise interoperation with host applications, keycode values now have strong versioning so that any connected application has confidence that the keys it thinks exist on the board actually match up with what's compiled in. These strongly-versioned keycode definitions are now published online and will not change, so tools that remap keycodes have a reference to work with. In future versions of QMK, any new or changed keycodes will result in a new version specification. See [API docs](api_docs.md#qmk-constants) for more information on the published versions if you're writing a tool to manage keycodes.
+
+In most cases user keymaps in the repository have already been updated to reflect the new naming scheme. In some cases user keymaps outside the repository may strike a missing keycode with the old name -- it's highly likely that the name had already been deprecated for some time, and should have been updated previously.
+
+See below for the full list of changesets.
+
+!> Keycode aliases have been put in place in most cases to cater for "old names" being mapped to "new names" -- the documentation already reflects all the new naming of keys.
+
+### Configuration Item Refactoring :id=config-refactoring
+
+A number of configuration items have been renamed for consistency.
+
+RGB Matrix configuration:
+
+| Old Config | New Config |
+|-------------------------|-------------------------|
+| DRIVER_LED_COUNT | RGB_MATRIX_LED_COUNT |
+| RGB_DISABLE_TIMEOUT | RGB_MATRIX_TIMEOUT |
+| RGB_MATRIX_STARTUP_HUE | RGB_MATRIX_DEFAULT_HUE |
+| RGB_MATRIX_STARTUP_MODE | RGB_MATRIX_DEFAULT_MODE |
+| RGB_MATRIX_STARTUP_SAT | RGB_MATRIX_DEFAULT_SAT |
+| RGB_MATRIX_STARTUP_SPD | RGB_MATRIX_DEFAULT_SPD |
+| RGB_MATRIX_STARTUP_VAL | RGB_MATRIX_DEFAULT_VAL |
+
+LED Matrix configuration:
+
+| Old Config | New Config |
+|-------------------------|-------------------------|
+| DRIVER_LED_COUNT | LED_MATRIX_LED_COUNT |
+| LED_DISABLE_TIMEOUT | LED_MATRIX_TIMEOUT |
+| LED_MATRIX_STARTUP_MODE | LED_MATRIX_DEFAULT_MODE |
+| LED_MATRIX_STARTUP_SPD | LED_MATRIX_DEFAULT_SPD |
+| LED_MATRIX_STARTUP_VAL | LED_MATRIX_DEFAULT_VAL |
+
+Joystick configuration:
+
+| Old Config | New Config |
+|--------------------------|--------------------------|
+| JOYSTICK_AXES_COUNT | JOYSTICK_AXIS_COUNT |
+| JOYSTICK_AXES_RESOLUTION | JOYSTICK_AXIS_RESOLUTION |
+
+### Data-driven USB IDs Refactoring ([#18152](https://github.com/qmk/qmk_firmware/pull/18152)) :id=usb-ids-Refactoring
+
+QMK has decided to deprecate the specification of USB IDs inside `config.h` in favour of `info.json`, leaving data-driven as the only method to specify USB information. As per the deprecation schedule put forward last breaking changes cycle, USB information must be specified in `info.json` instead.
+
+Previously in `config.h`:
+```c
+#define VENDOR_ID 0x1234
+#define PRODUCT_ID 0x5678
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Me
+#define PRODUCT MyKeyboard
+```
+
+Replaced by `info.json`:
+```json
+{
+ "keyboard_name": "MyKeyboard",
+ "manufacturer": "Me",
+ "usb": {
+ "vid": "0x1234",
+ "pid": "0x5678",
+ "device_version": "0.0.1"
+ }
+}
+```
+
+### LED Indicator callback refactoring ([#14864](https://github.com/qmk/qmk_firmware/pull/18450)) :id=led-callback-refactor
+
+_RGB Matrix_ and _LED Matrix_ Indicator display code was traditionally difficult to override in keymaps as they did not follow the standard pattern of `bool *_kb()` deferring to `bool *_user()` functions, allowing signalling to the higher level that processing had already been done.
+
+This changes the standard callback model to allow for a base implementation to be provided by a keyboard, but also still allow for keymap-level overrides without needing to modify the keyboard's code.
+
+The old RGB Matrix keymap code went something like this:
+
+```c
+void rgb_matrix_indicators_user(void) {
+ // keymap LED code
+}
+```
+
+...but the new RGB Matrix keymap code looks like this:
+```c
+bool rgb_matrix_indicators_user(void) {
+ // keymap LED code
+ return false;
+}
+```
+
+Keyboard designers should now structure their keyboard-level routines like the following, in order to allow for keymap overrides:
+
+```c
+bool rgb_matrix_indicators_kb(void) {
+ // Defer to the keymap if they want to override
+ if (!rgb_matrix_indicators_user()) { return false; }
+
+ // keyboard LED code
+ return true;
+}
+```
+
+The equivalent transformations should be done for LED Matrix boards.
+
+### Unicode mode refactoring :id=unicode-mode-renaming
+
+Unicode modes were renamed in order to prevent collision with equivalent keycodes. The available values for `UNICODE_SELECTED_MODES` changed -- see [Feature: Unicode](feature_unicode.md#setting-the-input-mode) for the new list of values and how to configure them.
+
+## Notable core changes :id=notable-core
+
+This breaking changes cycle, a lot of the core changes are related to cleanup and refactoring -- commonly called "tech debt".
+
+### Keycodes refactoring :id=keycodes-overhaul-core-changes
+
+We aren't going to list each and every change -- they're far too numerous -- instead, we'll just list the related PRs in order to convey just how wide-reaching these changes were:
+
+* Align audio keycode names ([#18962](https://github.com/qmk/qmk_firmware/pull/18962))
+* Align dynamic tapping term keycode names ([#18963](https://github.com/qmk/qmk_firmware/pull/18963))
+* Align haptic feedback keycode names ([#18964](https://github.com/qmk/qmk_firmware/pull/18964))
+* Deprecate `CAPS_WORD`/`CAPSWRD` for `CW_TOGG` ([#18834](https://github.com/qmk/qmk_firmware/pull/18834))
+* Deprecate `KC_LEAD` for `QK_LEAD` ([#18792](https://github.com/qmk/qmk_firmware/pull/18792))
+* Deprecate `KC_LOCK` for `QK_LOCK` ([#18796](https://github.com/qmk/qmk_firmware/pull/18796))
+* Deprecate `KEY_OVERRIDE_*` keycodes for `KO_*` ([#18843](https://github.com/qmk/qmk_firmware/pull/18843))
+* Deprecate `ONESHOT_*` keycodes for `QK_ONE_SHOT_*` ([#18844](https://github.com/qmk/qmk_firmware/pull/18844))
+* Deprecate `SECURE_*` keycodes for `QK_SECURE_*` ([#18847](https://github.com/qmk/qmk_firmware/pull/18847))
+* Deprecate `VLK_TOG` for `VK_TOGG` ([#18807](https://github.com/qmk/qmk_firmware/pull/18807))
+* Initial DD keycode migration ([#18643](https://github.com/qmk/qmk_firmware/pull/18643))
+* Macro keycode name refactoring ([#18958](https://github.com/qmk/qmk_firmware/pull/18958))
+* Move mousekey keycodes into newly freed up keycode block ([#16076](https://github.com/qmk/qmk_firmware/pull/16076))
+* Normalise Auto Shift keycodes ([#18892](https://github.com/qmk/qmk_firmware/pull/18892))
+* Normalise Autocorrect keycodes ([#18893](https://github.com/qmk/qmk_firmware/pull/18893))
+* Normalise Combo keycodes ([#18877](https://github.com/qmk/qmk_firmware/pull/18877))
+* Normalise Dynamic Macro keycodes ([#18939](https://github.com/qmk/qmk_firmware/pull/18939))
+* Normalise Joystick and Programmable Button keycodes ([#18832](https://github.com/qmk/qmk_firmware/pull/18832))
+* Normalise MIDI keycodes ([#18972](https://github.com/qmk/qmk_firmware/pull/18972))
+* Normalise output selection (Bluetooth) keycodes ([#19004](https://github.com/qmk/qmk_firmware/pull/19004))
+* Normalise Space Cadet keycodes ([#18864](https://github.com/qmk/qmk_firmware/pull/18864))
+* Normalise Unicode keycodes ([#18898](https://github.com/qmk/qmk_firmware/pull/18898))
+* Publish constants metadata to API ([#19143](https://github.com/qmk/qmk_firmware/pull/19143))
+* Relocate US ANSI shifted keycode aliases ([#18634](https://github.com/qmk/qmk_firmware/pull/18634))
+* Remove `KC_DELT` ([#18882](https://github.com/qmk/qmk_firmware/pull/18882))
+* Remove `UNICODE_KEY_OSX` and `UC_OSX` ([#18290](https://github.com/qmk/qmk_firmware/pull/18290))
+* Remove deprecated RESET keycode alias ([#18271](https://github.com/qmk/qmk_firmware/pull/18271))
+* Remove legacy Debug keycode ([#18769](https://github.com/qmk/qmk_firmware/pull/18769))
+* Remove legacy EEPROM clear keycodes ([#18782](https://github.com/qmk/qmk_firmware/pull/18782))
+* Remove legacy fauxclicky and unicode keycodes ([#18800](https://github.com/qmk/qmk_firmware/pull/18800))
+* Remove legacy Grave Escape keycodes ([#18787](https://github.com/qmk/qmk_firmware/pull/18787))
+* Remove legacy international keycodes ([#18588](https://github.com/qmk/qmk_firmware/pull/18588))
+* Remove legacy keycodes, part 2 ([#18660](https://github.com/qmk/qmk_firmware/pull/18660))
+* Remove legacy keycodes, part 3 ([#18669](https://github.com/qmk/qmk_firmware/pull/18669))
+* Remove legacy keycodes, part 4 ([#18683](https://github.com/qmk/qmk_firmware/pull/18683))
+* Remove legacy keycodes, part 5 ([#18710](https://github.com/qmk/qmk_firmware/pull/18710))
+* Remove legacy keycodes, part 6 ([#18740](https://github.com/qmk/qmk_firmware/pull/18740))
+* Remove legacy locking caps/num/scroll keycodes ([#18601](https://github.com/qmk/qmk_firmware/pull/18601))
+* Remove legacy sendstring keycodes ([#18749](https://github.com/qmk/qmk_firmware/pull/18749))
+* Reworked backlight keycodes. ([#18961](https://github.com/qmk/qmk_firmware/pull/18961))
+
+### Board Converters :id=board-converters
+
+There was additional work in the space of board converters -- historically QMK allowed for "converting" a Pro Micro build to a QMK Proton-C build. The last few versions of QMK have added support for replacement boards much like the Proton-C, and this quarter was no exception:
+
+* Add Bonsai C4 as a platform board file ([#18901](https://github.com/qmk/qmk_firmware/pull/18901))
+* Add converter support to keymap.json ([#18776](https://github.com/qmk/qmk_firmware/pull/18776))
+* Add Elite-C to converters ([#18309](https://github.com/qmk/qmk_firmware/pull/18309))
+* Add Elite-Pi converter ([#18236](https://github.com/qmk/qmk_firmware/pull/18236))
+* Allow QK_MAKE to work with converters ([#18637](https://github.com/qmk/qmk_firmware/pull/18637))
+
+See [Feature: Converters](feature_converters.md) for the full list of board conversions available.
+
+### Pointing and Digitizer device updates :id=pointing-and-digitizer
+
+Both pointing devices and digitizer got a host of updates this cycle. Inertia, automatic mouse layers, fixes for preventing sleep... you even get more buttons with digitizers!
+
+* add "inertia" mode for mouse keys ([#18774](https://github.com/qmk/qmk_firmware/pull/18774))
+* Digitizer feature improvements ([#19034](https://github.com/qmk/qmk_firmware/pull/19034))
+* Enabling Pointing Device support in register code functions ([#18363](https://github.com/qmk/qmk_firmware/pull/18363))
+* Feature: pointing device automatic mouse layer ([#17962](https://github.com/qmk/qmk_firmware/pull/17962))
+* Fix mouse report comparison failing on shared EP (fixes KB preventing sleep) ([#18060](https://github.com/qmk/qmk_firmware/pull/18060))
+* Fix mouse use within send_string ([#18659](https://github.com/qmk/qmk_firmware/pull/18659))
+* Handle mouse keys more consistently ([#18513](https://github.com/qmk/qmk_firmware/pull/18513))
+* Invert pointing device motion pin for cirque touchpads ([#18404](https://github.com/qmk/qmk_firmware/pull/18404))
+* Refactor more host code (programmable button & digitizer) ([#18565](https://github.com/qmk/qmk_firmware/pull/18565))
+
+## Full changelist :id=full-changelist
+
+Core:
+* quantum: led: split out led_update_ports() for customization of led behaviour ([#14452](https://github.com/qmk/qmk_firmware/pull/14452))
+* Add getreuer's Autocorrect feature to core ([#15699](https://github.com/qmk/qmk_firmware/pull/15699))
+* Move mousekey keycodes into newly freed up keycode block ([#16076](https://github.com/qmk/qmk_firmware/pull/16076))
+* Introduce pointing device specific debug messages ([#17663](https://github.com/qmk/qmk_firmware/pull/17663))
+* PWM Backlight for RP2040 ([#17706](https://github.com/qmk/qmk_firmware/pull/17706))
+* Adjust PWM hardware audio driver for RP2040 ([#17723](https://github.com/qmk/qmk_firmware/pull/17723))
+* Prevent tap dance from wiping dynamic macros ([#17880](https://github.com/qmk/qmk_firmware/pull/17880))
+* Feature: pointing device automatic mouse layer ([#17962](https://github.com/qmk/qmk_firmware/pull/17962))
+* Allow custom timings for WS2812 PIO driver ([#18006](https://github.com/qmk/qmk_firmware/pull/18006))
+* Use `TAP_CODE_DELAY` for encoder mapping by default. Add docs. ([#18098](https://github.com/qmk/qmk_firmware/pull/18098))
+* Move Oneshot mod callbacks to after mods are set ([#18101](https://github.com/qmk/qmk_firmware/pull/18101))
+* mcp23018: add return status to init ([#18178](https://github.com/qmk/qmk_firmware/pull/18178))
+* Switch over MANUFACTURER and PRODUCT to string literals ([#18183](https://github.com/qmk/qmk_firmware/pull/18183))
+* Remove deprecated USBasp and bootloadHID bootloader types ([#18195](https://github.com/qmk/qmk_firmware/pull/18195))
+* Chromeos keycodes ([#18212](https://github.com/qmk/qmk_firmware/pull/18212))
+* VIA V3 - The Custom UI Update ([#18222](https://github.com/qmk/qmk_firmware/pull/18222))
+* Move bootloader.mk to platforms ([#18228](https://github.com/qmk/qmk_firmware/pull/18228))
+* Simplify extrakeys sending at the host driver level ([#18230](https://github.com/qmk/qmk_firmware/pull/18230))
+* Add unicode mode change callbacks ([#18235](https://github.com/qmk/qmk_firmware/pull/18235))
+* Add Elite-Pi converter ([#18236](https://github.com/qmk/qmk_firmware/pull/18236))
+* Better handle EEPROM reset keycode ([#18244](https://github.com/qmk/qmk_firmware/pull/18244))
+* Work around WinCompose issue for U+Axxx or U+Exxx ([#18260](https://github.com/qmk/qmk_firmware/pull/18260))
+* Remove deprecated RESET keycode alias ([#18271](https://github.com/qmk/qmk_firmware/pull/18271))
+* Move Bluetooth-related function calls up to host/keyboard level ([#18274](https://github.com/qmk/qmk_firmware/pull/18274))
+* Added analog support for WB32 MCU. ([#18289](https://github.com/qmk/qmk_firmware/pull/18289))
+* Remove `UNICODE_KEY_OSX` and `UC_OSX` ([#18290](https://github.com/qmk/qmk_firmware/pull/18290))
+* Add Elite-C to converters ([#18309](https://github.com/qmk/qmk_firmware/pull/18309))
+* RN42 driver: small cleanups ([#18310](https://github.com/qmk/qmk_firmware/pull/18310))
+* Reboot wb32 devices after flashing ([#18323](https://github.com/qmk/qmk_firmware/pull/18323))
+* Refactor Unicode feature ([#18333](https://github.com/qmk/qmk_firmware/pull/18333))
+* Move fake EE_HANDS from EEPROM init. ([#18352](https://github.com/qmk/qmk_firmware/pull/18352))
+* Enabling Pointing Device support in register code functions ([#18363](https://github.com/qmk/qmk_firmware/pull/18363))
+* Start Bluetooth API ([#18366](https://github.com/qmk/qmk_firmware/pull/18366))
+* Add UART support for Kinetis boards ([#18370](https://github.com/qmk/qmk_firmware/pull/18370))
+* [QP] Add RGB565 surface. Docs clarification, cleanup, tabsification, and reordering. ([#18396](https://github.com/qmk/qmk_firmware/pull/18396))
+* Change `DRIVER_LED_COUNT` to `{LED,RGB}_MATRIX_LED_COUNT` ([#18399](https://github.com/qmk/qmk_firmware/pull/18399))
+* Invert pointing device motion pin for cirque touchpads ([#18404](https://github.com/qmk/qmk_firmware/pull/18404))
+* Change `{LED,RGB}_DISABLE_TIMEOUT` to `{LED,RGB}_MATRIX_TIMEOUT` ([#18415](https://github.com/qmk/qmk_firmware/pull/18415))
+* rewrite locking in split transaction handlers ([#18417](https://github.com/qmk/qmk_firmware/pull/18417))
+* remove busy waiting from rgblight functions ([#18418](https://github.com/qmk/qmk_firmware/pull/18418))
+* Serial-protocol: always clear receive queue on main half of split keyboard ([#18419](https://github.com/qmk/qmk_firmware/pull/18419))
+* Stabilize RP2040 Half-duplex PIO split comms take 2 ([#18421](https://github.com/qmk/qmk_firmware/pull/18421))
+* Copy RP2040 vector table to RAM on startup ([#18424](https://github.com/qmk/qmk_firmware/pull/18424))
+* Further refactoring of joystick feature ([#18437](https://github.com/qmk/qmk_firmware/pull/18437))
+* Start moving towards introspection-based data retrieval ([#18441](https://github.com/qmk/qmk_firmware/pull/18441))
+* RP2040: use built-in integer hardware divider and optimized i64 multiplication ([#18464](https://github.com/qmk/qmk_firmware/pull/18464))
+* Only trigger encoder callbacks on primary side ([#18467](https://github.com/qmk/qmk_firmware/pull/18467))
+* Handle mouse keys more consistently ([#18513](https://github.com/qmk/qmk_firmware/pull/18513))
+* Gentoo install script — build newlib with `nano` USE flag ([#18527](https://github.com/qmk/qmk_firmware/pull/18527))
+* Small un/register_code() cleanups ([#18544](https://github.com/qmk/qmk_firmware/pull/18544))
+* Refactor more host code (programmable button & digitizer) ([#18565](https://github.com/qmk/qmk_firmware/pull/18565))
+* Don't clear keys on layer change unless STRICT_LAYER_RELEASE is enabled ([#18577](https://github.com/qmk/qmk_firmware/pull/18577))
+* Remove legacy international keycodes ([#18588](https://github.com/qmk/qmk_firmware/pull/18588))
+* onekey: Enable ADC for STM32F072 Discovery ([#18592](https://github.com/qmk/qmk_firmware/pull/18592))
+* Implement split comms watchdog ([#18599](https://github.com/qmk/qmk_firmware/pull/18599))
+* Remove legacy locking caps/num/scroll keycodes ([#18601](https://github.com/qmk/qmk_firmware/pull/18601))
+* Use `get_u16_str` instead of `snprintf` in `autoshift_timer_report` ([#18606](https://github.com/qmk/qmk_firmware/pull/18606))
+* Refactor `send_extra` ([#18615](https://github.com/qmk/qmk_firmware/pull/18615))
+* LUFA: Consolidate report sending code ([#18629](https://github.com/qmk/qmk_firmware/pull/18629))
+* Relocate US ANSI shifted keycode aliases ([#18634](https://github.com/qmk/qmk_firmware/pull/18634))
+* Allow QK_MAKE to work with converters ([#18637](https://github.com/qmk/qmk_firmware/pull/18637))
+* Programmable Button API refactor and improve docs ([#18641](https://github.com/qmk/qmk_firmware/pull/18641))
+* Initial DD keycode migration ([#18643](https://github.com/qmk/qmk_firmware/pull/18643))
+* Remove legacy keycodes, part 2 ([#18660](https://github.com/qmk/qmk_firmware/pull/18660))
+* Remove legacy keycodes, part 3 ([#18669](https://github.com/qmk/qmk_firmware/pull/18669))
+* Remove legacy keycodes, part 4 ([#18683](https://github.com/qmk/qmk_firmware/pull/18683))
+* Revert "mcp23018: add return status to init" ([#18709](https://github.com/qmk/qmk_firmware/pull/18709))
+* Remove legacy keycodes, part 5 ([#18710](https://github.com/qmk/qmk_firmware/pull/18710))
+* Make QP driver init functions weak. ([#18717](https://github.com/qmk/qmk_firmware/pull/18717))
+* Add unit tests for HOLD_ON_OTHER_KEY_PRESS ([#18721](https://github.com/qmk/qmk_firmware/pull/18721))
+* Remove legacy keycodes, part 6 ([#18740](https://github.com/qmk/qmk_firmware/pull/18740))
+* Remove legacy sendstring keycodes ([#18749](https://github.com/qmk/qmk_firmware/pull/18749))
+* 4 Driver support for IS31FL3737 ([#18750](https://github.com/qmk/qmk_firmware/pull/18750))
+* Remove quantum/audio from global VPATH ([#18753](https://github.com/qmk/qmk_firmware/pull/18753))
+* Widen the ARM Cortex-M family support. Allow USB peripheral change. ([#18767](https://github.com/qmk/qmk_firmware/pull/18767))
+* Remove legacy Debug keycode ([#18769](https://github.com/qmk/qmk_firmware/pull/18769))
+* add "inertia" mode for mouse keys ([#18774](https://github.com/qmk/qmk_firmware/pull/18774))
+* Remove legacy EEPROM clear keycodes ([#18782](https://github.com/qmk/qmk_firmware/pull/18782))
+* Remove legacy Grave Escape keycodes ([#18787](https://github.com/qmk/qmk_firmware/pull/18787))
+* Deprecate `KC_LEAD` for `QK_LEAD` ([#18792](https://github.com/qmk/qmk_firmware/pull/18792))
+* Deprecate `KC_LOCK` for `QK_LOCK` ([#18796](https://github.com/qmk/qmk_firmware/pull/18796))
+* Remove legacy fauxclicky and unicode keycodes ([#18800](https://github.com/qmk/qmk_firmware/pull/18800))
+* Generalise CTPC logic from common_features ([#18803](https://github.com/qmk/qmk_firmware/pull/18803))
+* Deprecate `VLK_TOG` for `VK_TOGG` ([#18807](https://github.com/qmk/qmk_firmware/pull/18807))
+* ChibiOS USB: Add a dummy IN callback to work around LLD bugs ([#18811](https://github.com/qmk/qmk_firmware/pull/18811))
+* Normalise Joystick and Programmable Button keycodes ([#18832](https://github.com/qmk/qmk_firmware/pull/18832))
+* Deprecate `CAPS_WORD`/`CAPSWRD` for `CW_TOGG` ([#18834](https://github.com/qmk/qmk_firmware/pull/18834))
+* added BS_TOGG so BS_SWAP and BS_NORM can be on a single key ([#18837](https://github.com/qmk/qmk_firmware/pull/18837))
+* Remove some assumptions on sequential keycode ranges ([#18838](https://github.com/qmk/qmk_firmware/pull/18838))
+* Deprecate `KEY_OVERRIDE_*` keycodes for `KO_*` ([#18843](https://github.com/qmk/qmk_firmware/pull/18843))
+* Deprecate `ONESHOT_*` keycodes for `QK_ONE_SHOT_*` ([#18844](https://github.com/qmk/qmk_firmware/pull/18844))
+* Deprecate `SECURE_*` keycodes for `QK_SECURE_*` ([#18847](https://github.com/qmk/qmk_firmware/pull/18847))
+* Normalise Space Cadet keycodes ([#18864](https://github.com/qmk/qmk_firmware/pull/18864))
+* Allow overriding of dynamic keymap start address. ([#18867](https://github.com/qmk/qmk_firmware/pull/18867))
+* Formalise keyboard- and user-specific EEPROM blocks ([#18874](https://github.com/qmk/qmk_firmware/pull/18874))
+* Normalise Combo keycodes ([#18877](https://github.com/qmk/qmk_firmware/pull/18877))
+* Remove rgblight_list.h ([#18878](https://github.com/qmk/qmk_firmware/pull/18878))
+* Remove `KC_DELT` ([#18882](https://github.com/qmk/qmk_firmware/pull/18882))
+* Simplify Keymap Config EEPROM ([#18886](https://github.com/qmk/qmk_firmware/pull/18886))
+* Normalise Auto Shift keycodes ([#18892](https://github.com/qmk/qmk_firmware/pull/18892))
+* Normalise Autocorrect keycodes ([#18893](https://github.com/qmk/qmk_firmware/pull/18893))
+* Normalise Unicode keycodes ([#18898](https://github.com/qmk/qmk_firmware/pull/18898))
+* Add Bonsai C4 as a platform board file ([#18901](https://github.com/qmk/qmk_firmware/pull/18901))
+* Normalise Dynamic Macro keycodes ([#18939](https://github.com/qmk/qmk_firmware/pull/18939))
+* Reduce includes for sequencer header ([#18946](https://github.com/qmk/qmk_firmware/pull/18946))
+* Reduce includes for crc header ([#18947](https://github.com/qmk/qmk_firmware/pull/18947))
+* Reduce includes for caps_word header ([#18948](https://github.com/qmk/qmk_firmware/pull/18948))
+* Reduce includes for wpm header ([#18949](https://github.com/qmk/qmk_firmware/pull/18949))
+* Reduce includes for dip_switch header ([#18951](https://github.com/qmk/qmk_firmware/pull/18951))
+* Reduce includes for send_string header ([#18952](https://github.com/qmk/qmk_firmware/pull/18952))
+* Macro keycode name refactoring ([#18958](https://github.com/qmk/qmk_firmware/pull/18958))
+* Remove thermal printer. ([#18959](https://github.com/qmk/qmk_firmware/pull/18959))
+* Reworked backlight keycodes. ([#18961](https://github.com/qmk/qmk_firmware/pull/18961))
+* Align audio keycode names ([#18962](https://github.com/qmk/qmk_firmware/pull/18962))
+* Align dynamic tapping term keycode names ([#18963](https://github.com/qmk/qmk_firmware/pull/18963))
+* Align haptic feedback keycode names ([#18964](https://github.com/qmk/qmk_firmware/pull/18964))
+* NVRAM refactor, phase 1. ([#18969](https://github.com/qmk/qmk_firmware/pull/18969))
+* Normalise MIDI keycodes ([#18972](https://github.com/qmk/qmk_firmware/pull/18972))
+* Normalise output selection (Bluetooth) keycodes ([#19004](https://github.com/qmk/qmk_firmware/pull/19004))
+* Move EFL wear-leveling driver to be default for F1, F3, F4, L4, G4, WB32, GD32V. ([#19020](https://github.com/qmk/qmk_firmware/pull/19020))
+* Digitizer feature improvements ([#19034](https://github.com/qmk/qmk_firmware/pull/19034))
+* Joystick feature improvements ([#19052](https://github.com/qmk/qmk_firmware/pull/19052))
+* Add default limit to OLED dirty processing ([#19068](https://github.com/qmk/qmk_firmware/pull/19068))
+* Change `RGB_MATRIX_STARTUP_*` defines to `RGB_MATRIX_DEFAULT_*` ([#19079](https://github.com/qmk/qmk_firmware/pull/19079))
+* Change `LED_MATRIX_STARTUP_*` defines to `LED_MATRIX_DEFAULT_*` ([#19080](https://github.com/qmk/qmk_firmware/pull/19080))
+* Extend eeconfig kb/user datablock API ([#19094](https://github.com/qmk/qmk_firmware/pull/19094))
+* Remove .noci functionality ([#19122](https://github.com/qmk/qmk_firmware/pull/19122))
+
+CLI:
+* Reject json with duplicate keys ([#18108](https://github.com/qmk/qmk_firmware/pull/18108))
+* Add pointing device support to data driven config ([#18215](https://github.com/qmk/qmk_firmware/pull/18215))
+* Disconnect `usb.device_ver` ([#18259](https://github.com/qmk/qmk_firmware/pull/18259))
+* Normalise info_config.h define generation ([#18439](https://github.com/qmk/qmk_firmware/pull/18439))
+* Generate DD RGBLight/LED/RGB Matrix animation defines ([#18459](https://github.com/qmk/qmk_firmware/pull/18459))
+* Add converter support to keymap.json ([#18776](https://github.com/qmk/qmk_firmware/pull/18776))
+* Ensure consistent clean behaviour ([#18781](https://github.com/qmk/qmk_firmware/pull/18781))
+* Format DD mappings and schemas ([#18924](https://github.com/qmk/qmk_firmware/pull/18924))
+* Publish hjson files as json ([#18996](https://github.com/qmk/qmk_firmware/pull/18996))
+* Add raw output option for QGF/QFF files. ([#18998](https://github.com/qmk/qmk_firmware/pull/18998))
+* Improve LED config parsing error messages ([#19007](https://github.com/qmk/qmk_firmware/pull/19007))
+* Revert "Add pointing device support to data driven config (#18215)" ([#19063](https://github.com/qmk/qmk_firmware/pull/19063))
+* Additional DD backlight config ([#19124](https://github.com/qmk/qmk_firmware/pull/19124))
+* Publish constants metadata to API ([#19143](https://github.com/qmk/qmk_firmware/pull/19143))
+
+Submodule updates:
+* Use a macro to compute the size of arrays at compile time ([#18044](https://github.com/qmk/qmk_firmware/pull/18044))
+* Update pico-sdk to version 1.4.0 ([#18423](https://github.com/qmk/qmk_firmware/pull/18423))
+
+Keyboards:
+* Rework PS/2 driver selection ([#17892](https://github.com/qmk/qmk_firmware/pull/17892))
+* Durgod K310/K320 Refactor ([#18224](https://github.com/qmk/qmk_firmware/pull/18224))
+* Optimise LAYOUT macro generation ([#18262](https://github.com/qmk/qmk_firmware/pull/18262))
+* Rename keyboards with uppercase letters ([#18268](https://github.com/qmk/qmk_firmware/pull/18268))
+* Remove legacy USE_SERIAL define ([#18292](https://github.com/qmk/qmk_firmware/pull/18292))
+* Resolve conflict merging master to develop ([#18297](https://github.com/qmk/qmk_firmware/pull/18297))
+* Remove legacy define USE_SERIAL_PD2 ([#18298](https://github.com/qmk/qmk_firmware/pull/18298))
+* Remove legacy define SERIAL_USE_MULTI_TRANSACTION ([#18299](https://github.com/qmk/qmk_firmware/pull/18299))
+* Adapt spidey3 userspace to recent unicode refactoring ([#18345](https://github.com/qmk/qmk_firmware/pull/18345))
+* Remove remaining use of terminal keys and related comment labels ([#18402](https://github.com/qmk/qmk_firmware/pull/18402))
+* Add DD mapping for LED/RGB Matrix center ([#18432](https://github.com/qmk/qmk_firmware/pull/18432))
+* develop updates for Drashna Keymaps ([#18472](https://github.com/qmk/qmk_firmware/pull/18472))
+* Remove lingering `DRIVER_LED_TOTAL` references ([#18475](https://github.com/qmk/qmk_firmware/pull/18475))
+* Remove lingering `DRIVER_LED_TOTAL` references ([#18594](https://github.com/qmk/qmk_firmware/pull/18594))
+* update andrebrait GMMK Pro keymap ([#18608](https://github.com/qmk/qmk_firmware/pull/18608))
+* AnnePro2: Adjust RGB flushing ([#18640](https://github.com/qmk/qmk_firmware/pull/18640))
+* Remove lingering `DRIVER_LED_TOTAL` references ([#18662](https://github.com/qmk/qmk_firmware/pull/18662))
+* Update snowe's KC_RESET to use QK_BOOT ([#18667](https://github.com/qmk/qmk_firmware/pull/18667))
+* Remove some .gitignore files ([#18689](https://github.com/qmk/qmk_firmware/pull/18689))
+* Remove keymaps that still reference legacy macros ([#18690](https://github.com/qmk/qmk_firmware/pull/18690))
+* Remove keymaps that still reference legacy macros ([#18693](https://github.com/qmk/qmk_firmware/pull/18693))
+* Remove stale userspace/keymaps ([#18700](https://github.com/qmk/qmk_firmware/pull/18700))
+* Update keyboards readme ([#18714](https://github.com/qmk/qmk_firmware/pull/18714))
+* Allow changes to the moonlander default music map ([#18715](https://github.com/qmk/qmk_firmware/pull/18715))
+* led_update_kb -> led_update_ports where appropriate ([#18716](https://github.com/qmk/qmk_firmware/pull/18716))
+* Update converter/usb_usb user keymaps to use LAYOUT_fullsize ([#18720](https://github.com/qmk/qmk_firmware/pull/18720))
+* Remove RGBLIGHT_ANIMATION and clean up effect defines for G-K ([#18726](https://github.com/qmk/qmk_firmware/pull/18726))
+* Remove RGBLIGHT_ANIMATION and clean up effect defines for L-Q ([#18727](https://github.com/qmk/qmk_firmware/pull/18727))
+* Remove RGBLIGHT_ANIMATION and clean up effect defines for R-Z ([#18728](https://github.com/qmk/qmk_firmware/pull/18728))
+* Remove RGBLIGHT_ANIMATION and clean up effect defines for layouts+users ([#18729](https://github.com/qmk/qmk_firmware/pull/18729))
+* Update info.json configs to explicitly list RGBLIGHT animations ([#18730](https://github.com/qmk/qmk_firmware/pull/18730))
+* A little personal cleanup after #18726 and #18729 ([#18734](https://github.com/qmk/qmk_firmware/pull/18734))
+* Move Hillside out of handwired ([#18751](https://github.com/qmk/qmk_firmware/pull/18751))
+* wilba_tech: allow keymaps to override backlight_effect_indicators() ([#18791](https://github.com/qmk/qmk_firmware/pull/18791))
+* Remove broken userspace and keymaps ([#18806](https://github.com/qmk/qmk_firmware/pull/18806))
+* Add support for KBDfans Odin V2 ([#18910](https://github.com/qmk/qmk_firmware/pull/18910))
+* Remove more `UNUSED_PINS` defines ([#18940](https://github.com/qmk/qmk_firmware/pull/18940))
+* Remove hardcoded VIA keycode range ([#18956](https://github.com/qmk/qmk_firmware/pull/18956))
+* KC_GESC -> QK_GESC, better alignment for OCD ([#19018](https://github.com/qmk/qmk_firmware/pull/19018))
+* Add missing `manufacturer` fields ([#19065](https://github.com/qmk/qmk_firmware/pull/19065))
+* Update use of legacy keycodes ([#19120](https://github.com/qmk/qmk_firmware/pull/19120))
+
+Keyboard fixes:
+* [GMMK Pro] Fix unintentional taps to the volume keys when using the encoder ([#17129](https://github.com/qmk/qmk_firmware/pull/17129))
+* Luna keyboard pet OLED timeout fix ([#17189](https://github.com/qmk/qmk_firmware/pull/17189))
+* Handle escaping of manufacturer/product strings ([#18194](https://github.com/qmk/qmk_firmware/pull/18194))
+* kegen/gboy: add manufacturer string ([#18196](https://github.com/qmk/qmk_firmware/pull/18196))
+* Ensure all keyboards have a bootloader set ([#18234](https://github.com/qmk/qmk_firmware/pull/18234))
+* Reverse keymap search order ([#18449](https://github.com/qmk/qmk_firmware/pull/18449))
+* Fixup cradio bootloader/processor ([#18477](https://github.com/qmk/qmk_firmware/pull/18477))
+* onekey: enable ADC for Bluepill and Blackpill ([#18545](https://github.com/qmk/qmk_firmware/pull/18545))
+* Fixup controllerworks/mini42 ([#18553](https://github.com/qmk/qmk_firmware/pull/18553))
+* RESET -> QK_BOOT user keymaps ([#18560](https://github.com/qmk/qmk_firmware/pull/18560))
+* Fixup linworks/fave84h ([#18593](https://github.com/qmk/qmk_firmware/pull/18593))
+* Fix compilation of 1upkeyboards on develop ([#18618](https://github.com/qmk/qmk_firmware/pull/18618))
+* Various keyboard fixes ([#18649](https://github.com/qmk/qmk_firmware/pull/18649))
+* Fixup twig50 ([#18651](https://github.com/qmk/qmk_firmware/pull/18651))
+* Fixup handwired/jopr — remove deprecated keycode ([#18668](https://github.com/qmk/qmk_firmware/pull/18668))
+* Fixup keychron/q3 ([#18687](https://github.com/qmk/qmk_firmware/pull/18687))
+* Fixup dumbpad/v3x ([#18692](https://github.com/qmk/qmk_firmware/pull/18692))
+* Fix aurora/sweep ([#18701](https://github.com/qmk/qmk_firmware/pull/18701))
+* Fix build failures uncovered by #18753 ([#18789](https://github.com/qmk/qmk_firmware/pull/18789))
+* Fixup emptystring/nqg ([#18804](https://github.com/qmk/qmk_firmware/pull/18804))
+* Fixup controllerwords/mini36 ([#18840](https://github.com/qmk/qmk_firmware/pull/18840))
+* Fixup 1upkeyboards/pi60_rgb ([#18858](https://github.com/qmk/qmk_firmware/pull/18858))
+* Fixup doio/kb16 ([#18859](https://github.com/qmk/qmk_firmware/pull/18859))
+* Fixup keebio/sinc/rev3 ([#18866](https://github.com/qmk/qmk_firmware/pull/18866))
+* elephant42: fix default keymap ([#18884](https://github.com/qmk/qmk_firmware/pull/18884))
+* Properly fix elephant42 ([#18908](https://github.com/qmk/qmk_firmware/pull/18908))
+* Fix syntax error introduced in #18800 ([#18933](https://github.com/qmk/qmk_firmware/pull/18933))
+* Resolve info.json/rules.mk feature conflicts in three boards ([#18942](https://github.com/qmk/qmk_firmware/pull/18942))
+* Fix DD warnings for RGBKB boards ([#18944](https://github.com/qmk/qmk_firmware/pull/18944))
+* Fix "no matrix definition" errors for some boards ([#18954](https://github.com/qmk/qmk_firmware/pull/18954))
+* LED config fixes ([#18973](https://github.com/qmk/qmk_firmware/pull/18973))
+* `handwired/swiftrax/walter`: fix layout mismatch ([#18974](https://github.com/qmk/qmk_firmware/pull/18974))
+* Fix use of shifted custom keycode ([#18978](https://github.com/qmk/qmk_firmware/pull/18978))
+* `pizzakeyboards/pizza65`: fix layouts ([#18979](https://github.com/qmk/qmk_firmware/pull/18979))
+* `cannonkeys/db60/hotswap`: fix layouts ([#18982](https://github.com/qmk/qmk_firmware/pull/18982))
+* `handwired/swiftrax/cowfish`: fix layouts ([#18984](https://github.com/qmk/qmk_firmware/pull/18984))
+* Fixup hotdox76v2 on develop ([#18991](https://github.com/qmk/qmk_firmware/pull/18991))
+* `mechlovin/adelais/standard_led/avr/rev1`: fix layout ([#18997](https://github.com/qmk/qmk_firmware/pull/18997))
+* `gboards/gergoplex`: fix matrix pins ([#18999](https://github.com/qmk/qmk_firmware/pull/18999))
+* Fixup keychron/q1/iso_encoder ([#19006](https://github.com/qmk/qmk_firmware/pull/19006))
+* Rollback unrelated changes from previous PR. ([#19015](https://github.com/qmk/qmk_firmware/pull/19015))
+* Fixup bn006 on develop ([#19029](https://github.com/qmk/qmk_firmware/pull/19029))
+* onekey: disable NKRO and mousekeys by default ([#19038](https://github.com/qmk/qmk_firmware/pull/19038))
+* Fix up laser_ninja/pumpkin_pad ([#19060](https://github.com/qmk/qmk_firmware/pull/19060))
+* Fixup keychron/q6 ([#19066](https://github.com/qmk/qmk_firmware/pull/19066))
+* Fixup handwired/alcor_dactyl ([#19072](https://github.com/qmk/qmk_firmware/pull/19072))
+* Fix some old keycodes ([#19086](https://github.com/qmk/qmk_firmware/pull/19086))
+* Update more `DRIVER_LED_TOTAL` defines to `RGB_MATRIX_LED_COUNT` ([#19089](https://github.com/qmk/qmk_firmware/pull/19089))
+* Fix references to `mouse_report_t` (which doesnt exist) ([#19107](https://github.com/qmk/qmk_firmware/pull/19107))
+* Fixup keychron/q5 ([#19119](https://github.com/qmk/qmk_firmware/pull/19119))
+* Fixup aeboards/satellite ([#19137](https://github.com/qmk/qmk_firmware/pull/19137))
+* Fixup aurora/corne on develop ([#19144](https://github.com/qmk/qmk_firmware/pull/19144))
+* Minor lint fixes for various info.json ([#19146](https://github.com/qmk/qmk_firmware/pull/19146))
+
+Others:
+* Add DD mapping for LED/RGB Matrix max brightness ([#18403](https://github.com/qmk/qmk_firmware/pull/18403))
+* Add DD mapping for LED/RGB Matrix split count ([#18408](https://github.com/qmk/qmk_firmware/pull/18408))
+* Add DD mapping for LED/RGB Matrix HSVS steps ([#18414](https://github.com/qmk/qmk_firmware/pull/18414))
+* Remove RGBLIGHT_ANIMTION and clean up effect defines for 0-F ([#18725](https://github.com/qmk/qmk_firmware/pull/18725))
+* Merge API update workflow ([#19121](https://github.com/qmk/qmk_firmware/pull/19121))
+
+Bugs:
+* Fix layer switching from tap dances by redoing the keymap lookup ([#17935](https://github.com/qmk/qmk_firmware/pull/17935))
+* ws2812: replace RGBLED_NUM with driver-owned constant to decouple driver from RGBLEDs/RGBMATRIX defines ([#18036](https://github.com/qmk/qmk_firmware/pull/18036))
+* Prevent USB peripheral fault when restarting USB on WB32 MCUs ([#18058](https://github.com/qmk/qmk_firmware/pull/18058))
+* Fix mouse report comparison failing on shared EP (fixes KB preventing sleep) ([#18060](https://github.com/qmk/qmk_firmware/pull/18060))
+* Fix incorrect `bluetooth.driver` rules.mk mapping ([#18205](https://github.com/qmk/qmk_firmware/pull/18205))
+* Adjust `EXTRAKEY_ENABLE` ifdefs for `send_extra()` ([#18249](https://github.com/qmk/qmk_firmware/pull/18249))
+* Fix docs regarding cirque pinnacle attenuation ([#18279](https://github.com/qmk/qmk_firmware/pull/18279))
+* Avoid repeated calls to rgblight_set() in tight succession when setting lighting layers ([#18338](https://github.com/qmk/qmk_firmware/pull/18338))
+* Fix cirque tap from secondary side of split keyboard ([#18351](https://github.com/qmk/qmk_firmware/pull/18351))
+* Fix EECONFIG_KEYMAP_UPPER_BYTE init ([#18394](https://github.com/qmk/qmk_firmware/pull/18394))
+* Fix retain brightness when val is changed while a layer is active ([#18426](https://github.com/qmk/qmk_firmware/pull/18426))
+* Update Chibios to latest 21.11.2 changes for RP2040 XIP deadlock mitigation ([#18428](https://github.com/qmk/qmk_firmware/pull/18428))
+* Fix incorrect g_led_config generation ([#18431](https://github.com/qmk/qmk_firmware/pull/18431))
+* Fix Per Key LED Indicator Callbacks ([#18450](https://github.com/qmk/qmk_firmware/pull/18450))
+* Update chibios-contrib for RP2040 i2c fixes take 2 ([#18455](https://github.com/qmk/qmk_firmware/pull/18455))
+* Fix comment of CM_QUES (Colemak question mark) ([#18557](https://github.com/qmk/qmk_firmware/pull/18557))
+* ChibiOS: Fix USB bus disconnect handling ([#18566](https://github.com/qmk/qmk_firmware/pull/18566))
+* Update ChibiOS-Contrib for USB IRQ and bus handling fixes ([#18574](https://github.com/qmk/qmk_firmware/pull/18574))
+* RP2040: only clear RX FIFO for serial pio driver clear ([#18581](https://github.com/qmk/qmk_firmware/pull/18581))
+* Fix ST7565 handler deadlock ([#18609](https://github.com/qmk/qmk_firmware/pull/18609))
+* Fix/Update ChibiOS hardware ID ([#18613](https://github.com/qmk/qmk_firmware/pull/18613))
+* Fix some rp2040 hardware ID errors ([#18617](https://github.com/qmk/qmk_firmware/pull/18617))
+* Fix joystick functionality for ChibiOS and OTG (Blackpill) ([#18631](https://github.com/qmk/qmk_firmware/pull/18631))
+* fix typo in solenoid.h ([#18635](https://github.com/qmk/qmk_firmware/pull/18635))
+* Fix boundary in `RGB_MATRIX_INDICATOR_SET_COLOR` ([#18650](https://github.com/qmk/qmk_firmware/pull/18650))
+* Fix MIDI output endpoint to use the out direction ([#18654](https://github.com/qmk/qmk_firmware/pull/18654))
+* Fix mouse use within send_string ([#18659](https://github.com/qmk/qmk_firmware/pull/18659))
+* Correctly build keymap.json containing additional config ([#18766](https://github.com/qmk/qmk_firmware/pull/18766))
+* Correctly build out of tree keymap.json containing additional config ([#18775](https://github.com/qmk/qmk_firmware/pull/18775))
+* Fix garbled test output ([#18822](https://github.com/qmk/qmk_firmware/pull/18822))
+* Fix rgb_matrix_set_flags_noeeprom declaration ([#18860](https://github.com/qmk/qmk_firmware/pull/18860))
+* Add missing Space Cadet alias ([#18876](https://github.com/qmk/qmk_firmware/pull/18876))
+* Fix oled_render to render all dirty blocks. ([#18887](https://github.com/qmk/qmk_firmware/pull/18887))
+* compiler.txt: ensure file exists before comparison ([#18921](https://github.com/qmk/qmk_firmware/pull/18921))
+* Fix compilation issue with WPM ([#18965](https://github.com/qmk/qmk_firmware/pull/18965))
+* Fix keycode parameter extraction to match the new DD keycodes ([#18977](https://github.com/qmk/qmk_firmware/pull/18977))
+* Fix jump in mouse_report value when scale changes during cirque get report ([#18992](https://github.com/qmk/qmk_firmware/pull/18992))
+* Fixup WS2812 vendor driver ([#19028](https://github.com/qmk/qmk_firmware/pull/19028))
+* Add missing prototype for get_hold_on_other_key_press to resolve #18855 ([#19056](https://github.com/qmk/qmk_firmware/pull/19056))
+* Fix duplicate key in keyboard.jsonschema ([#19058](https://github.com/qmk/qmk_firmware/pull/19058))
+* Fixup `keyboard.jsonschema`. ([#19059](https://github.com/qmk/qmk_firmware/pull/19059))
+* fixed MOUSEKEY_INERTIA on AVR ([#19096](https://github.com/qmk/qmk_firmware/pull/19096))
+* Fix encoder_init call order in keyboard_init ([#19140](https://github.com/qmk/qmk_firmware/pull/19140))
+* Fixup installation procedure for different Fedora versions. ([#19159](https://github.com/qmk/qmk_firmware/pull/19159))
diff --git a/docs/_summary.md b/docs/_summary.md
index b60eb1b23d..738c24ee42 100644
--- a/docs/_summary.md
+++ b/docs/_summary.md
@@ -76,21 +76,22 @@
* Software Features
* [Auto Shift](feature_auto_shift.md)
+ * [Autocorrect](feature_autocorrect.md)
* [Caps Word](feature_caps_word.md)
* [Combos](feature_combo.md)
* [Debounce API](feature_debounce_type.md)
+ * [EEPROM](feature_eeprom.md)
* [Key Lock](feature_key_lock.md)
* [Key Overrides](feature_key_overrides.md)
* [Layers](feature_layers.md)
* [One Shot Keys](one_shot_keys.md)
- * [Pointing Device](feature_pointing_device.md)
* [Raw HID](feature_rawhid.md)
* [Secure](feature_secure.md)
+ * [Send String](feature_send_string.md)
* [Sequencer](feature_sequencer.md)
* [Swap Hands](feature_swap_hands.md)
* [Tap Dance](feature_tap_dance.md)
* [Tap-Hold Configuration](tap_hold.md)
- * [Terminal](feature_terminal.md)
* [Unicode](feature_unicode.md)
* [Userspace](feature_userspace.md)
* [WPM Calculation](feature_wpm.md)
@@ -109,6 +110,7 @@
* [Audio](feature_audio.md)
* [Bluetooth](feature_bluetooth.md)
* [Bootmagic Lite](feature_bootmagic.md)
+ * [Converters](feature_converters.md)
* [Custom Matrix](custom_matrix.md)
* [Digitizer](feature_digitizer.md)
* [DIP Switch](feature_dip_switch.md)
@@ -117,11 +119,10 @@
* [Joystick](feature_joystick.md)
* [LED Indicators](feature_led_indicators.md)
* [MIDI](feature_midi.md)
- * [Proton C Conversion](proton_c_conversion.md)
+ * [Pointing Device](feature_pointing_device.md)
* [PS/2 Mouse](feature_ps2_mouse.md)
* [Split Keyboard](feature_split_keyboard.md)
* [Stenography](feature_stenography.md)
- * [Thermal Printer](feature_thermal_printer.md)
* [Velocikey](feature_velocikey.md)
* Keyboard Building
@@ -135,7 +136,7 @@
* Breaking Changes
* [Overview](breaking_changes.md)
* [My Pull Request Was Flagged](breaking_changes_instructions.md)
- * [Most Recent ChangeLog](ChangeLog/20220528.md "QMK v0.17.0 - 2022 May 28")
+ * [Most Recent ChangeLog](ChangeLog/20221126.md "QMK v0.19.0 - 2022 Nov 26")
* [Past Breaking Changes](breaking_changes_history.md)
* C Development
@@ -149,6 +150,7 @@
* [SPI Driver](spi_driver.md)
* [WS2812 Driver](ws2812_driver.md)
* [EEPROM Driver](eeprom_driver.md)
+ * [Flash Driver](flash_driver.md)
* ['serial' Driver](serial_driver.md)
* [UART Driver](uart_driver.md)
* [GPIO Controls](gpio_control.md)
@@ -167,7 +169,9 @@
* Arm/ChibiOS
* [Selecting an MCU](platformdev_selecting_arm_mcu.md)
* [Early initialization](platformdev_chibios_earlyinit.md)
- * [WeAct Blackpill F411](platformdev_blackpill_f411.md)
+ * [Raspberry Pi RP2040](platformdev_rp2040.md)
+ * [Proton C](platformdev_proton_c.md)
+ * [WeAct Blackpill F4x1](platformdev_blackpill_f4x1.md)
* QMK Reference
* [Contributing to QMK](contributing.md)
diff --git a/docs/api_docs.md b/docs/api_docs.md
index eefb61a54d..3324bc545b 100644
--- a/docs/api_docs.md
+++ b/docs/api_docs.md
@@ -14,14 +14,14 @@ This service is an asynchronous API for compiling custom keymaps. You POST some
"keymap": "my_awesome_keymap",
"layout": "LAYOUT_all",
"layers": [
- ["KC_GRV","KC_1","KC_2","KC_3","KC_4","KC_5","KC_6","KC_7","KC_8","KC_9","KC_0","KC_MINS","KC_EQL","KC_GRV","KC_BSPC","KC_PGUP","KC_TAB","KC_Q","KC_W","KC_E","KC_R","KC_T","KC_Y","KC_U","KC_I","KC_O","KC_P","KC_LBRC","KC_RBRC","KC_BSLS","KC_PGDN","KC_CAPS","KC_A","KC_S","KC_D","KC_F","KC_G","KC_H","KC_J","KC_K","KC_L","KC_SCLN","KC_QUOT","KC_NUHS","KC_ENT","KC_LSFT","KC_NUBS","KC_Z","KC_X","KC_C","KC_V","KC_B","KC_N","KC_M","KC_COMM","KC_DOT","KC_SLSH","KC_RO","KC_RSFT","KC_UP","KC_LCTL","KC_LGUI","KC_LALT","KC_MHEN","KC_SPC","KC_SPC","KC_HENK","KC_RALT","KC_RCTL","MO(1)","KC_LEFT","KC_DOWN","KC_RIGHT"],
- ["KC_ESC","KC_F1","KC_F2","KC_F3","KC_F4","KC_F5","KC_F6","KC_F7","KC_F8","KC_F9","KC_F10","KC_F11","KC_F12","KC_TRNS","KC_DEL","BL_STEP","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","_______","KC_TRNS","KC_PSCR","KC_SLCK","KC_PAUS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(2)","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_PGUP","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(1)","KC_LEFT","KC_PGDN","KC_RGHT"],
- ["KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","RESET","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(2)","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(1)","KC_TRNS","KC_TRNS","KC_TRNS"]
+ ["KC_GRV","KC_1","KC_2","KC_3","KC_4","KC_5","KC_6","KC_7","KC_8","KC_9","KC_0","KC_MINS","KC_EQL","KC_GRV","KC_BSPC","KC_PGUP","KC_TAB","KC_Q","KC_W","KC_E","KC_R","KC_T","KC_Y","KC_U","KC_I","KC_O","KC_P","KC_LBRC","KC_RBRC","KC_BSLS","KC_PGDN","KC_CAPS","KC_A","KC_S","KC_D","KC_F","KC_G","KC_H","KC_J","KC_K","KC_L","KC_SCLN","KC_QUOT","KC_NUHS","KC_ENT","KC_LSFT","KC_NUBS","KC_Z","KC_X","KC_C","KC_V","KC_B","KC_N","KC_M","KC_COMM","KC_DOT","KC_SLSH","KC_INT1","KC_RSFT","KC_UP","KC_LCTL","KC_LGUI","KC_LALT","KC_INT5","KC_SPC","KC_SPC","KC_INT4","KC_RALT","KC_RCTL","MO(1)","KC_LEFT","KC_DOWN","KC_RIGHT"],
+ ["KC_ESC","KC_F1","KC_F2","KC_F3","KC_F4","KC_F5","KC_F6","KC_F7","KC_F8","KC_F9","KC_F10","KC_F11","KC_F12","KC_TRNS","KC_DEL","BL_STEP","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","_______","KC_TRNS","KC_PSCR","KC_SCRL","KC_PAUS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(2)","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_PGUP","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(1)","KC_LEFT","KC_PGDN","KC_RGHT"],
+ ["KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","QK_BOOT","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(2)","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(1)","KC_TRNS","KC_TRNS","KC_TRNS"]
]
}
```
-As you can see the payload describes all aspects of a keyboard necessary to create and generate a firmware. Each layer is a single list of QMK keycodes the same length as the keyboard's `LAYOUT` macro. If a keyboard supports mulitple `LAYOUT` macros you can specify which macro to use.
+As you can see the payload describes all aspects of a keyboard necessary to create and generate a firmware. Each layer is a single list of QMK keycodes the same length as the keyboard's `LAYOUT` macro. If a keyboard supports multiple `LAYOUT` macros you can specify which macro to use.
## Submitting a Compile Job
@@ -66,3 +66,41 @@ Once your compile job has finished you'll check the `result` key. The value of t
* `firmware_keymap_url`: A list of URLs for the `keymap.c`
* `firmware_source_url`: A list of URLs for the full firmware source code
* `output`: The stdout and stderr for this compile job. Errors will be found here.
+
+## Constants :id=qmk-constants
+
+If you're writing a tool that leverages constants used within QMK, the API is used to publish "locked-in" versions of those constants in order to ensure that any third-party tooling has a canonical set of information to work with.
+
+The list of available constants can be retrieved by accessing one of the following endpoints:
+
+```
+$ curl https://keyboards.qmk.fm/v1/constants_metadata.json # For `master`
+{"last_updated": "2022-11-26 00:00:00 GMT", "constants": {"keycodes": ["0.0.1"]}}
+
+$ curl https://keyboards.develop.qmk.fm/v1/constants_metadata.json # For `develop`
+{"last_updated": "2022-11-26 12:00:00 GMT", "constants": {"keycodes": ["0.0.1", "0.0.2"]}}
+```
+
+!> Versions exported by the `master` endpoint are locked-in. Any extra versions that exist on the `develop` endpoint which don't exist in `master` are subject to change.
+
+?> Only keycodes are currently published, but over time all other "externally visible" IDs are expected to appear on these endpoints.
+
+To retrieve the constants associated with a subsystem, the endpoint format is as follows:
+```
+# https://keyboards.qmk.fm/v1/constants/{subsystem}_{version}.json
+```
+Which, for the metadata endpoint above results in a request of:
+```
+$ curl https://keyboards.qmk.fm/v1/constants/keycodes_0.0.1.json
+{
+ "ranges": {
+ "0x0000/0x00FF": {
+ "define": "QK_BASIC"
+ },
+ "0x0100/0x1EFF": {
+ "define": "QK_MODS"
+ },
+ "0x2000/0x1FFF": {
+ "define": "QK_MOD_TAP"
+
+```
diff --git a/docs/audio_driver.md b/docs/audio_driver.md
index ffd9c8d5ad..a0bbb22e19 100644
--- a/docs/audio_driver.md
+++ b/docs/audio_driver.md
@@ -159,7 +159,6 @@ A configuration example for the STM32F103C8 would be:
//halconf.h:
#define HAL_USE_PWM TRUE
#define HAL_USE_PAL TRUE
-#define HAL_USE_GPT TRUE
#include_next
```
@@ -168,8 +167,6 @@ A configuration example for the STM32F103C8 would be:
#include_next
#undef STM32_PWM_USE_TIM1
#define STM32_PWM_USE_TIM1 TRUE
-#undef STM32_GPT_USE_TIM4
-#define STM32_GPT_USE_TIM4 TRUE
```
If we now target pin A8, looking through the data-sheet of the STM32F103C8, for the timers and alternate functions
@@ -184,7 +181,6 @@ with all this information, the configuration would contain these lines:
#define AUDIO_PIN A8
#define AUDIO_PWM_DRIVER PWMD1
#define AUDIO_PWM_CHANNEL 1
-#define AUDIO_STATE_TIMER GPTD4
```
ChibiOS uses GPIOv1 for the F103, which only knows of one alternate function.
@@ -207,15 +203,15 @@ You can also change the timer used for software PWM by defining the driver. For
While not an exhaustive list, the following table provides the scenarios that have been partially validated:
-| | DAC basic | DAC additive | PWM hardware | PWM software |
-|--------------------------|--------------------|--------------------|--------------------|--------------------|
+| | DAC basic | DAC additive | PWM hardware | PWM software |
+| ------------------------ | ------------------ | ------------------ | ------------------ | ------------------ |
| Atmega32U4 | :o: | :o: | :heavy_check_mark: | :o: |
+| RP2040 | :x: | :x: | :heavy_check_mark: | ? |
| STM32F103C8 (bluepill) | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: |
| STM32F303CCT6 (proton-c) | :heavy_check_mark: | :heavy_check_mark: | ? | :heavy_check_mark: |
| STM32F405VG | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| L0xx | :x: (no Tim8) | ? | ? | ? |
-
:heavy_check_mark: : works and was tested
:o: : does not apply
:x: : not supported by MCU
diff --git a/docs/breaking_changes.md b/docs/breaking_changes.md
index cae6bf49d0..6233d5a392 100644
--- a/docs/breaking_changes.md
+++ b/docs/breaking_changes.md
@@ -8,6 +8,8 @@ The breaking change period is when we will merge PR's that change QMK in dangero
## What has been included in past Breaking Changes?
+* [2022 Nov 26](ChangeLog/20221126.md)
+* [2022 Aug 27](ChangeLog/20220827.md)
* [2022 May 28](ChangeLog/20220528.md)
* [2022 Feb 26](ChangeLog/20220226.md)
* [2021 Nov 27](ChangeLog/20211127.md)
@@ -22,18 +24,18 @@ The breaking change period is when we will merge PR's that change QMK in dangero
## When is the next Breaking Change?
-The next Breaking Change is scheduled for August 27, 2022.
+The next Breaking Change is scheduled for February 26, 2023.
### Important Dates
-* 2022 May 28 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
-* 2022 Jul 31 - `develop` closed to new PR's.
-* 2022 Jul 31 - Call for testers.
-* 2022 Aug 13 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
-* 2022 Aug 20 - `develop` is locked, only critical bugfix PR's merged.
-* 2022 Aug 25 - `master` is locked, no PR's merged.
-* 2022 Aug 27 - Merge `develop` to `master`.
-* 2022 Aug 27 - `master` is unlocked. PR's can be merged again.
+* 2022 Nov 26 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
+* 2022 Jan 29 - `develop` closed to new PR's.
+* 2022 Jan 29 - Call for testers.
+* 2022 Feb 12 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
+* 2022 Feb 19 - `develop` is locked, only critical bugfix PR's merged.
+* 2022 Feb 24 - `master` is locked, no PR's merged.
+* 2022 Feb 26 - Merge `develop` to `master`.
+* 2023 Feb 26 - `master` is unlocked. PR's can be merged again.
## What changes will be included?
@@ -44,7 +46,7 @@ If you want your breaking change to be included in this round you need to create
Criteria for acceptance:
* The PR is complete and ready to merge
-* The PR has a ChangeLog file describing the changes under `/docs/Changelog/20220827`.
+* The PR has a ChangeLog file describing the changes under `/docs/Changelog/20221126`.
* This should be in Markdown format, with a name in the format `PR12345.md`, substituting the digits for your PR's ID.
* One strong recommendation that the ChangeLog document matches the PR description on GitHub, so as to ensure traceability.
@@ -110,7 +112,7 @@ This happens immediately after the previous `develop` branch is merged to `maste
* `git pull --ff-only`
* `git merge --no-ff master`
* Edit `readme.md`
- * Add a big notice at the top that this is a testing branch.
+ * Add a big notice at the top that this is a testing branch. See previous revisions of the `develop` branch.
* Include a link to this document
* `git commit -m 'Branch point for Breaking Change'`
* `git tag breakpoint___`
@@ -121,15 +123,19 @@ This happens immediately after the previous `develop` branch is merged to `maste
* Validate each submodule SHA1 matches the qmk fork, e.g. for ChibiOS:
* Go to [qmk/ChibiOS](https://github.com/qmk/ChibiOS)
* Compare the commit hash in the above output to the commit hash in the repository
- * If there's a mismatch:
+ * If there's a mismatch, that repository needs to have its `master` branch updated to match (otherwise Configurator won't work):
* `cd lib/chibios`
* `git fetch --all`
* `git checkout master`
* `git reset --hard `
* `git push origin master --force-with-lease`
+* Announce that both `master` and `develop` are now unlocked -- message `@Breaking Changes Updates` on `#qmk_firmware` in Discord:
+ * `@Breaking Changes Updates -- Hey folks, develop has now been merged into master -- newest batch of changes are now available for everyone to use!`
+
* (Optional) [update ChibiOS + ChibiOS-Contrib on `develop`](chibios_upgrade_instructions.md)
+
### Set up Discord events for the next cycle
* Update this file with the new dates: `docs/breaking_changes.md`
diff --git a/docs/breaking_changes_history.md b/docs/breaking_changes_history.md
index 4c38456e94..df94b81e04 100644
--- a/docs/breaking_changes_history.md
+++ b/docs/breaking_changes_history.md
@@ -2,6 +2,8 @@
This page links to all previous changelogs from the QMK Breaking Changes process.
+* [2022 Nov 26](ChangeLog/20221126.md) - version 0.19.0
+* [2022 Aug 27](ChangeLog/20220827.md) - version 0.18.0
* [2022 May 28](ChangeLog/20220528.md) - version 0.17.0
* [2022 Feb 26](ChangeLog/20220226.md) - version 0.16.0
* [2021 Nov 27](ChangeLog/20211127.md) - version 0.15.0
diff --git a/docs/cli_commands.md b/docs/cli_commands.md
index a380d3eb2f..019447075b 100644
--- a/docs/cli_commands.md
+++ b/docs/cli_commands.md
@@ -90,6 +90,8 @@ This command is similar to `qmk compile`, but can also target a bootloader. The
This command is directory aware. It will automatically fill in KEYBOARD and/or KEYMAP if you are in a keyboard or keymap directory.
+This command can also flash binary firmware files (hex or bin) such as the ones produced by [Configurator](https://config.qmk.fm).
+
**Usage for Configurator Exports**:
```
@@ -102,6 +104,21 @@ qmk flash [-bl ] [-c] [-e =] [-j ] -km [-bl ] [-c] [-e =] [-j ]
```
+**Usage for pre-compiled firmwares**:
+
+**Note**: The microcontroller needs to be specified (`-m` argument) for keyboards with the following bootloaders:
+* HalfKay
+* QMK HID
+* USBaspLoader
+
+ISP flashing is also supported with the following flashers and require the microcontroller to be specified:
+* USBasp
+* USBtinyISP
+
+```
+qmk flash [-m ]
+```
+
**Listing the Bootloaders**
```
@@ -206,7 +223,7 @@ Check your environment and report problems only:
## `qmk format-json`
-Formats a JSON file in a (mostly) human-friendly way. Will usually correctly detect the format of the JSON (info.json or keymap.json) but you can override this with `--format` if neccesary.
+Formats a JSON file in a (mostly) human-friendly way. Will usually correctly detect the format of the JSON (info.json or keymap.json) but you can override this with `--format` if necessary.
**Usage**:
@@ -352,6 +369,73 @@ $ qmk via2json -kb ai03/polaris -o polaris_keymap.json polaris_via_backup.json
Ψ Wrote keymap to /home/you/qmk_firmware/polaris_keymap.json
```
+## `qmk import-keyboard`
+
+This command imports a data-driven `info.json` keyboard into the repo.
+
+**Usage**:
+
+```
+usage: qmk import-keyboard [-h] filename
+```
+
+**Example:**
+
+```
+$ qmk import-keyboard ~/Downloads/forever60.json
+Ψ Importing forever60.json.
+
+Ψ Imported a new keyboard named forever60.
+Ψ To start working on things, `cd` into keyboards/forever60,
+Ψ or open the directory in your preferred text editor.
+Ψ And build with qmk compile -kb forever60 -km default.
+```
+
+## `qmk import-keymap`
+
+This command imports a data-driven `keymap.json` keymap into the repo.
+
+**Usage**:
+
+```
+usage: qmk import-keymap [-h] filename
+```
+
+**Example:**
+
+```
+qmk import-keymap ~/Downloads/asdf2.json
+Ψ Importing asdf2.json.
+
+Ψ Imported a new keymap named asdf2.
+Ψ To start working on things, `cd` into keyboards/takashicompany/dogtag/keymaps/asdf2,
+Ψ or open the directory in your preferred text editor.
+Ψ And build with qmk compile -kb takashicompany/dogtag -km asdf2.
+```
+
+## `qmk import-kbfirmware`
+
+This command creates a new keyboard based on a [Keyboard Firmware Builder](https://kbfirmware.com/) export.
+
+**Usage**:
+
+```
+usage: qmk import-kbfirmware [-h] filename
+```
+
+**Example:**
+
+```
+$ qmk import-kbfirmware ~/Downloads/gh62.json
+Ψ Importing gh62.json.
+
+⚠ Support here is basic - Consider using 'qmk new-keyboard' instead
+Ψ Imported a new keyboard named gh62.
+Ψ To start working on things, `cd` into keyboards/gh62,
+Ψ or open the directory in your preferred text editor.
+Ψ And build with qmk compile -kb gh62 -km default.
+```
+
---
# Developer Commands
@@ -527,3 +611,4 @@ This command converts a TTF font to an intermediate format for editing, before c
## `qmk painter-convert-font-image`
This command converts an intermediate font image to the QFF File Format. See the [Quantum Painter](quantum_painter.md?id=quantum-painter-cli) documentation for more information on this command.
+
diff --git a/docs/cli_development.md b/docs/cli_development.md
index 17370a732a..d878deff17 100644
--- a/docs/cli_development.md
+++ b/docs/cli_development.md
@@ -162,7 +162,7 @@ del(cli.config..)
## Writing The Configuration File
-The configuration is not written out when it is changed. Most commands do not need to do this. We prefer to have the user change their configuration deliberitely using `qmk config`.
+The configuration is not written out when it is changed. Most commands do not need to do this. We prefer to have the user change their configuration deliberately using `qmk config`.
You can use `cli.save_config()` to write out the configuration.
diff --git a/docs/coding_conventions_c.md b/docs/coding_conventions_c.md
index c4bace66cc..3f44da713d 100644
--- a/docs/coding_conventions_c.md
+++ b/docs/coding_conventions_c.md
@@ -24,7 +24,7 @@ Most of our style is pretty easy to pick up on, but right now it's not entirely
* Readability is more important than consistency.
* Follow the file's existing style. If the file is mixed, follow the style that makes sense for the section you are modifying.
* When indenting, keep the hash at the start of the line and add whitespace between `#` and `if`, starting with 4 spaces after the `#`.
- * You can follow the indention level of the surrounding C code, or preprocessor directives can have their own indentation levels. Choose the style that best communicates the intent of your code.
+ * You can follow the indentation level of the surrounding C code, or preprocessor directives can have their own indentation levels. Choose the style that best communicates the intent of your code.
Here is an example for easy reference:
diff --git a/docs/coding_conventions_python.md b/docs/coding_conventions_python.md
index 960b9cb49e..2b68703448 100644
--- a/docs/coding_conventions_python.md
+++ b/docs/coding_conventions_python.md
@@ -2,7 +2,7 @@
Most of our style follows PEP8 with some local modifications to make things less nit-picky.
-* We target Python 3.7 for compatability with all supported platforms.
+* We target Python 3.7 for compatibility with all supported platforms.
* We indent using four (4) spaces (soft tabs)
* We encourage liberal use of comments
* Think of them as a story describing the feature
@@ -21,7 +21,7 @@ You can use [yapf](https://github.com/google/yapf) to style your code. We provid
We don't have a hard and fast rule for when to use `import ...` vs `from ... import ...`. Understandability and maintainability is our ultimate goal.
-Generally we prefer to import specific function and class names from a module to keep code shorter and easier to understand. Sometimes this results in a name that is ambiguous, and in such cases we prefer to import the module instead. You should avoid using the "as" keyword when importing, unless you are importing a compatability module.
+Generally we prefer to import specific function and class names from a module to keep code shorter and easier to understand. Sometimes this results in a name that is ambiguous, and in such cases we prefer to import the module instead. You should avoid using the "as" keyword when importing, unless you are importing a compatibility module.
Imports should be one line per module. We group import statements together using the standard python rules- system, 3rd party, local.
diff --git a/docs/compatible_microcontrollers.md b/docs/compatible_microcontrollers.md
index cee8986829..cc9c0b7f92 100644
--- a/docs/compatible_microcontrollers.md
+++ b/docs/compatible_microcontrollers.md
@@ -62,9 +62,17 @@ You can also use any ARM chip with USB that [ChibiOS](https://www.chibios.org) s
* [MK20DX128](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k2x-usb/kinetis-k20-50-mhz-full-speed-usb-mixed-signal-integration-microcontrollers-based-on-arm-cortex-m4-core:K20_50)
* [MK20DX256](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k2x-usb/kinetis-k20-72-mhz-full-speed-usb-mixed-signal-integration-microcontrollers-mcus-based-on-arm-cortex-m4-core:K20_72)
* PJRC Teensy 3.2
+ * [MK64FX512](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k6x-ethernet/kinetis-k64-120-mhz-256-kb-sram-microcontrollers-mcus-based-on-arm-cortex-m4-core:K64_120)
+ * PJRC Teensy 3.5
* [MK66FX1M0](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k6x-ethernet/kinetis-k66-180-mhz-dual-high-speed-full-speed-usbs-2mb-flash-microcontrollers-mcus-based-on-arm-cortex-m4-core:K66_180)
* PJRC Teensy 3.6
+### Raspberry Pi
+
+* [RP2040](https://www.raspberrypi.com/documentation/microcontrollers/rp2040.html)
+
+For a detailed overview about the RP2040 support by QMK see the [dedicated RP2040 page](platformdev_rp2040.md).
+
## 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.
diff --git a/docs/config_options.md b/docs/config_options.md
index 8227a0e074..6b1f83214c 100644
--- a/docs/config_options.md
+++ b/docs/config_options.md
@@ -2,7 +2,17 @@
QMK is nearly infinitely configurable. Wherever possible we err on the side of allowing users to customize their keyboard, even at the expense of code size. That level of flexibility makes for a daunting configuration experience, however.
-There are two main types of configuration files in QMK- `config.h` and `rules.mk`. These files exist at various levels in QMK and all files of the same type are combined to build the final configuration. The levels, from lowest priority to highest priority, are:
+There are three main types of configuration files in QMK:
+
+* `config.h`, which contains various preprocessor directives (`#define`, `#ifdef`)
+* `rules.mk`, which contains additional variables
+* `info.json`, which is utilized for [data-driven configuration](https://docs.qmk.fm/#/data_driven_config)
+
+This page will only discuss the first two types, `config.h` and `rules.mk`.
+
+?> While not all settings have data-driven equivalents yet, keyboard makers are encouraged to utilize the `info.json` file to set the metadata for their boards when possible. See the [`info.json` Format](https://docs.qmk.fm/#/reference_info_json) page for more details.
+
+These files exist at various levels in QMK and all files of the same type are combined to build the final configuration. The levels, from lowest priority to highest priority, are:
* QMK Default
* Keyboard
@@ -39,11 +49,11 @@ This is a C header file that is one of the first things included, and will persi
* defines your VID, and for most DIY projects, can be whatever you want
* `#define PRODUCT_ID 0x5678`
* defines your PID, and for most DIY projects, can be whatever you want
-* `#define DEVICE_VER 0`
+* `#define DEVICE_VER 0x0100`
* defines the device version (often used for revisions)
-* `#define MANUFACTURER Me`
+* `#define MANUFACTURER "Me"`
* generally who/whatever brand produced the board
-* `#define PRODUCT Board`
+* `#define PRODUCT "Board"`
* the name of the keyboard
* `#define MATRIX_ROWS 5`
* the number of rows in your keyboard's matrix
@@ -57,8 +67,6 @@ This is a C header file that is one of the first things included, and will persi
* may be omitted by the keyboard designer if matrix reads are handled in an alternate manner. See [low-level matrix overrides](custom_quantum_functions.md?id=low-level-matrix-overrides) for more information.
* `#define MATRIX_IO_DELAY 30`
* the delay in microseconds when between changing matrix pin state and reading values
-* `#define UNUSED_PINS { D1, D2, D3, B1, B2, B3 }`
- * pins unused by the keyboard for reference
* `#define MATRIX_HAS_GHOST`
* define is matrix has ghost (unlikely)
* `#define MATRIX_UNSELECT_DRIVE_HIGH`
@@ -107,8 +115,10 @@ This is a C header file that is one of the first things included, and will persi
* sets the maximum power (in mA) over USB for the device (default: 500)
* `#define USB_POLLING_INTERVAL_MS 10`
* sets the USB polling rate in milliseconds for the keyboard, mouse, and shared (NKRO/media keys) interfaces
-* `#define USB_SUSPEND_WAKEUP_DELAY 200`
- * set the number of milliseconde to pause after sending a wakeup packet
+* `#define USB_SUSPEND_WAKEUP_DELAY 0`
+ * sets the number of milliseconds to pause after sending a wakeup packet.
+ Disabled by default, you might want to set this to 200 (or higher) if the
+ keyboard does not wake up properly after suspending.
* `#define F_SCL 100000L`
* sets the I2C clock rate speed for keyboards using I2C. The default is `400000L`, except for keyboards using `split_common`, where the default is `100000L`.
@@ -141,7 +151,7 @@ If you define these options you will enable the associated feature, which may in
## Behaviors That Can Be Configured
* `#define TAPPING_TERM 200`
- * how long before a tap becomes a hold, if set above 500, a key tapped during the tapping term will turn it into a hold too
+ * how long before a key press becomes a hold
* `#define TAPPING_TERM_PER_KEY`
* enables handling for per key `TAPPING_TERM` settings
* `#define RETRO_TAPPING`
@@ -174,27 +184,20 @@ If you define these options you will enable the associated feature, which may in
* sets the timer for leader key chords to run on each key press rather than overall
* `#define LEADER_KEY_STRICT_KEY_PROCESSING`
* Disables keycode filtering for Mod-Tap and Layer-Tap keycodes. Eg, if you enable this, you would need to specify `MT(MOD_CTL, KC_A)` if you want to use `KC_A`.
+* `#define MOUSE_EXTENDED_REPORT`
+ * Enables support for extended reports (-32767 to 32767, instead of -127 to 127), which may allow for smoother reporting, and prevent maxing out of the reports. Applies to both Pointing Device and Mousekeys.
* `#define ONESHOT_TIMEOUT 300`
* how long before oneshot times out
* `#define ONESHOT_TAP_TOGGLE 2`
* how many taps before oneshot toggle is triggered
-* `#define QMK_KEYS_PER_SCAN 4`
- * Allows sending more than one key per scan. By default, only one key event gets
- sent via `process_record()` per scan. This has little impact on most typing, but
- if you're doing a lot of chords, or your scan rate is slow to begin with, you can
- have some delay in processing key events. Each press and release is a separate
- event. For a keyboard with 1ms or so scan times, even a very fast typist isn't
- going to produce the 500 keystrokes a second needed to actually get more than a
- few ms of delay from this. But if you're doing chording on something with 3-4ms
- scan times? You probably want this.
* `#define COMBO_COUNT 2`
* Set this to the number of combos that you're using in the [Combo](feature_combo.md) feature. Or leave it undefined and programmatically set the count.
* `#define COMBO_TERM 200`
* how long for the Combo keys to be detected. Defaults to `TAPPING_TERM` if not defined.
* `#define COMBO_MUST_HOLD_MODS`
- * Flag for enabling extending timeout on Combos containing modifers
+ * Flag for enabling extending timeout on Combos containing modifiers
* `#define COMBO_MOD_TERM 200`
- * Allows for extending COMBO_TERM for mod keys while mid-combo.
+ * Allows for extending COMBO_TERM for mod keys while mid-combo.
* `#define COMBO_MUST_HOLD_PER_COMBO`
* Flag to enable per-combo COMBO_TERM extension and `get_combo_must_hold()` function
* `#define COMBO_TERM_PER_COMBO`
@@ -204,7 +207,7 @@ If you define these options you will enable the associated feature, which may in
* `#define COMBO_NO_TIMER`
* Disable the combo timer completely for relaxed combos.
* `#define TAP_CODE_DELAY 100`
- * Sets the delay between `register_code` and `unregister_code`, if you're having issues with it registering properly (common on VUSB boards). The value is in milliseconds.
+ * Sets the delay between `register_code` and `unregister_code`, if you're having issues with it registering properly (common on VUSB boards). The value is in milliseconds and defaults to `0`.
* `#define TAP_HOLD_CAPS_DELAY 80`
* Sets the delay for Tap Hold keys (`LT`, `MT`) when using `KC_CAPS_LOCK` keycode, as this has some special handling on MacOS. The value is in milliseconds, and defaults to 80 ms if not defined. For macOS, you may want to set this to 200 or higher.
* `#define KEY_OVERRIDE_REPEAT_DELAY 500`
@@ -214,14 +217,12 @@ If you define these options you will enable the associated feature, which may in
* `#define RGB_DI_PIN D7`
* pin the DI on the WS2812 is hooked-up to
-* `#define RGBLIGHT_ANIMATIONS`
- * run RGB animations
* `#define RGBLIGHT_LAYERS`
* Lets you define [lighting layers](feature_rgblight.md?id=lighting-layers) that can be toggled on or off. Great for showing the current keyboard layer or caps lock state.
* `#define RGBLIGHT_MAX_LAYERS`
* Defaults to 8. Can be expanded up to 32 if more [lighting layers](feature_rgblight.md?id=lighting-layers) are needed.
* Note: Increasing the maximum will increase the firmware size and slow sync on split keyboards.
-* `#define RGBLIGHT_LAYER_BLINK`
+* `#define RGBLIGHT_LAYER_BLINK`
* Adds ability to [blink](feature_rgblight.md?id=lighting-layer-blink) a lighting layer for a specified number of milliseconds (e.g. to acknowledge an action).
* `#define RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF`
* If defined, then [lighting layers](feature_rgblight?id=overriding-rgb-lighting-onoff-status) will be shown even if RGB Light is off.
@@ -324,6 +325,13 @@ There are a few different ways to set handedness for split keyboards (listed in
* `#define SPLIT_USB_TIMEOUT_POLL 10`
* Poll frequency when detecting master/slave when using `SPLIT_USB_DETECT`
+
+* `#define SPLIT_WATCHDOG_ENABLE`
+ * Reboot slave if no communication from master within timeout.
+ * Helps resolve issue where both sides detect as slave using `SPLIT_USB_DETECT`
+
+* `#define SPLIT_WATCHDOG_TIMEOUT 3000`
+ * Maximum slave timeout when waiting for communication from master when using `SPLIT_WATCHDOG_ENABLE`
* `#define FORCED_SYNC_THROTTLE_MS 100`
* Deadline for synchronizing data from master to slave when using the QMK-provided split transport.
@@ -366,8 +374,8 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i
* `SRC`
* Used to add files to the compilation/linking list.
* `LIB_SRC`
- * Used to add files as a library to the compilation/linking list.
- The files specified by `LIB_SRC` is linked after the files specified by `SRC`.
+ * Used to add files as a library to the compilation/linking list.
+ The files specified by `LIB_SRC` is linked after the files specified by `SRC`.
For example, if you specify:
```
SRC += a.c
@@ -420,7 +428,7 @@ Use these to enable or disable building certain features. The more you have enab
* `NKRO_ENABLE`
* 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.
+ * 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`
* Enable the audio subsystem.
* `KEY_OVERRIDE_ENABLE`
diff --git a/docs/configurator_default_keymaps.md b/docs/configurator_default_keymaps.md
index d2b14ec411..d08ec29539 100644
--- a/docs/configurator_default_keymaps.md
+++ b/docs/configurator_default_keymaps.md
@@ -56,7 +56,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[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_DEC, BL_INC,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_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, RESET, 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, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
@@ -84,7 +84,7 @@ The default keymap uses the `LAYOUT_all` macro, so that will be the value of the
[
"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_DEC", "BL_INC",
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_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", "RESET", "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", "KC_TRNS",
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS"
@@ -122,26 +122,26 @@ There is a way to support custom keycodes: if the logic for a custom keycode is
```c
enum custom_keycodes {
- MACRO_1 = SAFE_RANGE,
- MACRO_2,
- MACRO_3
+ CUSTOM_1 = SAFE_RANGE,
+ CUSTOM_2,
+ CUSTOM_3
};
...
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch(keycode) {
- case MACRO_1:
+ case CUSTOM_1:
if (record->event.pressed) {
- SEND_STRING("This is macro #1.");
+ SEND_STRING("This is custom keycode #1.");
}
return false;
- case MACRO_2:
+ case CUSTOM_2:
if (record->event.pressed) {
- SEND_STRING("This is macro #2.");
+ SEND_STRING("This is custom keycode #2.");
}
return false;
- case MACRO_3:
+ case CUSTOM_3:
if (record->event.pressed) {
- SEND_STRING("This is macro #3.");
+ SEND_STRING("This is custom keycode #3.");
}
return false;
}
@@ -153,9 +153,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
```c
enum keyboard_keycodes {
- MACRO_1 = SAFE_RANGE,
- MACRO_2,
- MACRO_3,
+ CUSTOM_1 = SAFE_RANGE,
+ CUSTOM_2,
+ CUSTOM_3,
NEW_SAFE_RANGE // Important!
};
```
@@ -165,19 +165,19 @@ enum keyboard_keycodes {
```c
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
switch(keycode) {
- case MACRO_1:
+ case CUSTOM_1:
if (record->event.pressed) {
- SEND_STRING("This is macro #1.");
+ SEND_STRING("This is custom keycode #1.");
}
return false;
- case MACRO_2:
+ case CUSTOM_2:
if (record->event.pressed) {
- SEND_STRING("This is macro #2.");
+ SEND_STRING("This is custom keycode #2.");
}
return false;
- case MACRO_3:
+ case CUSTOM_3:
if (record->event.pressed) {
- SEND_STRING("This is macro #3.");
+ SEND_STRING("This is custom keycode #3.");
}
return false;
}
diff --git a/docs/custom_matrix.md b/docs/custom_matrix.md
index 8f6878f94a..6d6ae5e972 100644
--- a/docs/custom_matrix.md
+++ b/docs/custom_matrix.md
@@ -81,17 +81,17 @@ void matrix_init(void) {
}
uint8_t matrix_scan(void) {
- bool matrix_has_changed = false;
+ bool changed = false;
// TODO: add matrix scanning routine here
// Unless hardware debouncing - use the configured debounce routine
- debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
+ changed = debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
// This *must* be called for correct keyboard behavior
matrix_scan_quantum();
- return matrix_has_changed;
+ return changed;
}
```
diff --git a/docs/custom_quantum_functions.md b/docs/custom_quantum_functions.md
index 7b7849ad07..2917fbad26 100644
--- a/docs/custom_quantum_functions.md
+++ b/docs/custom_quantum_functions.md
@@ -102,11 +102,11 @@ These are the three main initialization functions, listed in the order that they
## Keyboard Pre Initialization code
-This runs very early during startup, even before the USB has been started.
+This runs very early during startup, even before the USB has been started.
Shortly after this, the matrix is initialized.
-For most users, this shouldn't be used, as it's primarily for hardware oriented initialization.
+For most users, this shouldn't be used, as it's primarily for hardware oriented initialization.
However, if you have hardware stuff that you need initialized, this is the best place for it (such as initializing LED pins).
@@ -134,9 +134,9 @@ void keyboard_pre_init_user(void) {
## Matrix Initialization Code
-This is called when the matrix is initialized, and after some of the hardware has been set up, but before many of the features have been initialized.
+This is called when the matrix is initialized, and after some of the hardware has been set up, but before many of the features have been initialized.
-This is useful for setting up stuff that you may need elsewhere, but isn't hardware related nor is dependant on where it's started.
+This is useful for setting up stuff that you may need elsewhere, but isn't hardware related nor is dependant on where it's started.
### `matrix_init_*` Function Documentation
@@ -227,185 +227,6 @@ void suspend_wakeup_init_user(void) {
* Keyboard/Revision: `void suspend_power_down_kb(void)` and `void suspend_wakeup_init_user(void)`
* Keymap: `void suspend_power_down_kb(void)` and `void suspend_wakeup_init_user(void)`
-# Layer Change Code :id=layer-change-code
-
-This runs code every time that the layers get changed. This can be useful for layer indication, or custom layer handling.
-
-### Example `layer_state_set_*` Implementation
-
-This example shows how to set the [RGB Underglow](feature_rgblight.md) lights based on the layer, using the Planck as an example.
-
-```c
-layer_state_t layer_state_set_user(layer_state_t state) {
- switch (get_highest_layer(state)) {
- case _RAISE:
- rgblight_setrgb (0x00, 0x00, 0xFF);
- break;
- case _LOWER:
- rgblight_setrgb (0xFF, 0x00, 0x00);
- break;
- case _PLOVER:
- rgblight_setrgb (0x00, 0xFF, 0x00);
- break;
- case _ADJUST:
- rgblight_setrgb (0x7A, 0x00, 0xFF);
- break;
- default: // for any other layers, or the default layer
- rgblight_setrgb (0x00, 0xFF, 0xFF);
- break;
- }
- return state;
-}
-```
-
-Use the `IS_LAYER_ON_STATE(state, layer)` and `IS_LAYER_OFF_STATE(state, layer)` macros to check the status of a particular layer.
-
-Outside of `layer_state_set_*` functions, you can use the `IS_LAYER_ON(layer)` and `IS_LAYER_OFF(layer)` macros to check global layer state.
-
-### `layer_state_set_*` Function Documentation
-
-* Keyboard/Revision: `layer_state_t layer_state_set_kb(layer_state_t state)`
-* Keymap: `layer_state_t layer_state_set_user(layer_state_t state)`
-
-
-The `state` is the bitmask of the active layers, as explained in the [Keymap Overview](keymap.md#keymap-layer-status)
-
-
-# Persistent Configuration (EEPROM)
-
-This allows you to configure persistent settings for your keyboard. These settings are stored in the EEPROM of your controller, and are retained even after power loss. The settings can be read with `eeconfig_read_kb` and `eeconfig_read_user`, and can be written to using `eeconfig_update_kb` and `eeconfig_update_user`. This is useful for features that you want to be able to toggle (like toggling rgb layer indication). Additionally, you can use `eeconfig_init_kb` and `eeconfig_init_user` to set the default values for the EEPROM.
-
-The complicated part here, is that there are a bunch of ways that you can store and access data via EEPROM, and there is no "correct" way to do this. However, you only have a DWORD (4 bytes) for each function.
-
-Keep in mind that EEPROM has a limited number of writes. While this is very high, it's not the only thing writing to the EEPROM, and if you write too often, you can potentially drastically shorten the life of your MCU.
-
-* If you don't understand the example, then you may want to avoid using this feature, as it is rather complicated.
-
-### Example Implementation
-
-This is an example of how to add settings, and read and write it. We're using the user keymap for the example here. This is a complex function, and has a lot going on. In fact, it uses a lot of the above functions to work!
-
-
-In your keymap.c file, add this to the top:
-```c
-typedef union {
- uint32_t raw;
- struct {
- bool rgb_layer_change :1;
- };
-} user_config_t;
-
-user_config_t user_config;
-```
-
-This sets up a 32 bit structure that we can store settings with in memory, and write to the EEPROM. Using this removes the need to define variables, since they're defined in this structure. Remember that `bool` (boolean) values use 1 bit, `uint8_t` uses 8 bits, `uint16_t` uses up 16 bits. You can mix and match, but changing the order can cause issues, as it will change the values that are read and written.
-
-We're using `rgb_layer_change`, for the `layer_state_set_*` function, and use `keyboard_post_init_user` and `process_record_user` to configure everything.
-
-Now, using the `keyboard_post_init_user` code above, you want to add `eeconfig_read_user()` to it, to populate the structure you've just created. And you can then immediately use this structure to control functionality in your keymap. And It should look like:
-```c
-void keyboard_post_init_user(void) {
- // Call the keymap level matrix init.
-
- // Read the user config from EEPROM
- user_config.raw = eeconfig_read_user();
-
- // Set default layer, if enabled
- if (user_config.rgb_layer_change) {
- rgblight_enable_noeeprom();
- rgblight_sethsv_noeeprom_cyan();
- rgblight_mode_noeeprom(1);
- }
-}
-```
-The above function will use the EEPROM config immediately after reading it, to set the default layer's RGB color. The "raw" value of it is converted in a usable structure based on the "union" that you created above.
-
-```c
-layer_state_t layer_state_set_user(layer_state_t state) {
- switch (get_highest_layer(state)) {
- case _RAISE:
- if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_magenta(); rgblight_mode_noeeprom(1); }
- break;
- case _LOWER:
- if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_red(); rgblight_mode_noeeprom(1); }
- break;
- case _PLOVER:
- if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_green(); rgblight_mode_noeeprom(1); }
- break;
- case _ADJUST:
- if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_white(); rgblight_mode_noeeprom(1); }
- break;
- default: // for any other layers, or the default layer
- if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_cyan(); rgblight_mode_noeeprom(1); }
- break;
- }
- return state;
-}
-```
-This will cause the RGB underglow to be changed ONLY if the value was enabled. Now to configure this value, create a new keycode for `process_record_user` called `RGB_LYR`. Additionally, we want to make sure that if you use the normal RGB codes, that it turns off Using the example above, make it look this:
-```c
-
-bool process_record_user(uint16_t keycode, keyrecord_t *record) {
- switch (keycode) {
- case FOO:
- if (record->event.pressed) {
- // Do something when pressed
- } else {
- // Do something else when release
- }
- return false; // Skip all further processing of this key
- case KC_ENTER:
- // Play a tone when enter is pressed
- if (record->event.pressed) {
- PLAY_SONG(tone_qwerty);
- }
- return true; // Let QMK send the enter press/release events
- case RGB_LYR: // This allows me to use underglow as layer indication, or as normal
- if (record->event.pressed) {
- user_config.rgb_layer_change ^= 1; // Toggles the status
- eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
- if (user_config.rgb_layer_change) { // if layer state indication is enabled,
- layer_state_set(layer_state); // then immediately update the layer color
- }
- }
- return false;
- case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // For any of the RGB codes (see quantum_keycodes.h, L400 for reference)
- if (record->event.pressed) { //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled
- if (user_config.rgb_layer_change) { // only if this is enabled
- user_config.rgb_layer_change = false; // disable it, and
- eeconfig_update_user(user_config.raw); // write the setings to EEPROM
- }
- }
- return true; break;
- default:
- return true; // Process all other keycodes normally
- }
-}
-```
-And lastly, you want to add the `eeconfig_init_user` function, so that when the EEPROM is reset, you can specify default values, and even custom actions. To force an EEPROM reset, use the `EEP_RST` keycode or [Bootmagic Lite](feature_bootmagic.md) functionallity. For example, if you want to set rgb layer indication by default, and save the default valued.
-
-```c
-void eeconfig_init_user(void) { // EEPROM is getting reset!
- user_config.raw = 0;
- user_config.rgb_layer_change = true; // We want this enabled by default
- eeconfig_update_user(user_config.raw); // Write default value to EEPROM now
-
- // use the non noeeprom versions, to write these values to EEPROM too
- rgblight_enable(); // Enable RGB by default
- rgblight_sethsv_cyan(); // Set it to CYAN by default
- rgblight_mode(1); // set to solid by default
-}
-```
-
-And you're done. The RGB layer indication will only work if you want it to. And it will be saved, even after unplugging the board. And if you use any of the RGB codes, it will disable the layer indication, so that it stays on the mode and color that you set it to.
-
-### 'EECONFIG' Function Documentation
-
-* Keyboard/Revision: `void eeconfig_init_kb(void)`, `uint32_t eeconfig_read_kb(void)` and `void eeconfig_update_kb(uint32_t val)`
-* Keymap: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)` and `void eeconfig_update_user(uint32_t val)`
-
-The `val` is the value of the data that you want to write to EEPROM. And the `eeconfig_read_*` function return a 32 bit (DWORD) value from the EEPROM.
-
# Deferred Execution :id=deferred-execution
QMK has the ability to execute a callback after a specified period of time, rather than having to manually manage timers. To enable this functionality, set `DEFERRED_EXEC_ENABLE = yes` in rules.mk.
@@ -471,3 +292,15 @@ If registrations fail, then you can increase this value in your keyboard or keym
```c
#define MAX_DEFERRED_EXECUTORS 16
```
+
+# Advanced topics :id=advanced-topics
+
+This page used to encompass a large set of features. We have moved many sections that used to be part of this page to their own pages. Everything below this point is simply a redirect so that people following old links on the web find what they're looking for.
+
+## Layer Change Code :id=layer-change-code
+
+[Layer change code](feature_layers.md#layer-change-code)
+
+## Persistent Configuration (EEPROM) :id=persistent-configuration-eeprom
+
+[Persistent Configuration (EEPROM)](feature_eeprom.md)
diff --git a/docs/data_driven_config.md b/docs/data_driven_config.md
index 1a2e4ca54a..ba287f5688 100644
--- a/docs/data_driven_config.md
+++ b/docs/data_driven_config.md
@@ -41,7 +41,7 @@ In other cases you should group like options together in an `object`. This is pa
### Add a mapping
-In most cases you can add a simple mapping. These are maintained as JSON files in `data/mappings/info_config.json` and `data/mappings/info_rules.json`, and control mapping for `config.h` and `rules.mk`, respectively. Each mapping is keyed by the `config.h` or `rules.mk` variable, and the value is a hash with the following keys:
+In most cases you can add a simple mapping. These are maintained as JSON files in `data/mappings/info_config.hjson` and `data/mappings/info_rules.hjson`, and control mapping for `config.h` and `rules.mk`, respectively. Each mapping is keyed by the `config.h` or `rules.mk` variable, and the value is a hash with the following keys:
* `info_key`: (required) The location within `info.json` for this value. See below.
* `value_type`: (optional) Default `raw`. The format for this variable's value. See below.
diff --git a/docs/documentation_templates.md b/docs/documentation_templates.md
index e22dbf2387..91ad801662 100644
--- a/docs/documentation_templates.md
+++ b/docs/documentation_templates.md
@@ -4,7 +4,7 @@ This page documents the templates you should use when submitting new Keymaps and
## Keymap `readme.md` Template :id=keyboard-readmemd-template
-Most keymaps have an image depicting the layout. You can use [Keyboard Layout Editor](https://keyboard-layout-editor.com) to create an image. Upload it to [Imgur](https://imgur.com) or another hosting service, please do not include images in your Pull Request.
+Most keymaps have an image depicting the layout. You can use [Keyboard Layout Editor](http://keyboard-layout-editor.com) to create an image. Upload it to [Imgur](https://imgur.com) or another hosting service, please do not include images in your Pull Request.
Below the image you should write a short description to help people understand your keymap.
diff --git a/docs/driver_installation_zadig.md b/docs/driver_installation_zadig.md
index 003629ba9a..3b2c0b74dc 100644
--- a/docs/driver_installation_zadig.md
+++ b/docs/driver_installation_zadig.md
@@ -8,7 +8,7 @@ We recommend the use of the [Zadig](https://zadig.akeo.ie/) utility. If you have
## Installation
-Put your keyboard into bootloader mode, either by hitting the `RESET` keycode (which may be on a different layer), or by pressing the reset switch that's usually located on the underside of the board. If your keyboard has neither, try holding Escape or Space+`B` as you plug it in (see the [Bootmagic Lite](feature_bootmagic.md) docs for more details). Some boards use [Command](feature_command.md) instead of Bootmagic; in this case, you can enter bootloader mode by hitting Left Shift+Right Shift+`B` or Left Shift+Right Shift+Escape at any point while the keyboard is plugged in.
+Put your keyboard into bootloader mode, either by hitting the `QK_BOOT` keycode (which may be on a different layer), or by pressing the reset switch that's usually located on the underside of the board. If your keyboard has neither, try holding Escape or Space+`B` as you plug it in (see the [Bootmagic Lite](feature_bootmagic.md) docs for more details). Some boards use [Command](feature_command.md) instead of Bootmagic; in this case, you can enter bootloader mode by hitting Left Shift+Right Shift+`B` or Left Shift+Right Shift+Escape at any point while the keyboard is plugged in.
Some keyboards may have specific instructions for entering the bootloader. For example, the [Bootmagic Lite](feature_bootmagic.md) key (default: Escape) might be on a different key, e.g. Left Control; or the magic combination for Command (default: Left Shift+Right Shift) might require you to hold something else, e.g. Left Control+Right Control. Refer to the board's README file if you are unsure.
To put a device in bootloader mode with USBaspLoader, tap the `RESET` button while holding down the `BOOT` button.
diff --git a/docs/eeprom_driver.md b/docs/eeprom_driver.md
index 6dcf10c04d..50d8bcb7b3 100644
--- a/docs/eeprom_driver.md
+++ b/docs/eeprom_driver.md
@@ -2,12 +2,15 @@
The EEPROM driver can be swapped out depending on the needs of the keyboard, or whether extra hardware is present.
+Selecting the EEPROM driver is done in your keyboard's `rules.mk`:
+
Driver | Description
-----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
`EEPROM_DRIVER = vendor` (default) | Uses the on-chip driver provided by the chip manufacturer. For AVR, this is provided by avr-libc. This is supported on ARM for a subset of chips -- STM32F3xx, STM32F1xx, and STM32F072xB will be emulated by writing to flash. STM32L0xx and STM32L1xx will use the onboard dedicated true EEPROM. Other chips will generally act as "transient" below.
`EEPROM_DRIVER = i2c` | Supports writing to I2C-based 24xx EEPROM chips. See the driver section below.
`EEPROM_DRIVER = spi` | Supports writing to SPI-based 25xx EEPROM chips. See the driver section below.
`EEPROM_DRIVER = transient` | Fake EEPROM driver -- supports reading/writing to RAM, and will be discarded when power is lost.
+`EEPROM_DRIVER = wear_leveling` | Frontend driver for the wear_leveling system, allowing for EEPROM emulation on top of flash -- both in-MCU and external SPI NOR flash.
## Vendor Driver Configuration :id=vendor-eeprom-driver-configuration
@@ -43,8 +46,9 @@ Module | Equivalent `#define` | Source
-----------------|---------------------------------|------------------------------------------
CAT24C512 EEPROM | `#define EEPROM_I2C_CAT24C512` |
RM24C512C EEPROM | `#define EEPROM_I2C_RM24C512C` |
-24LC64 EEPROM | `#define EEPROM_I2C_24LC64` |
-24LC128 EEPROM | `#define EEPROM_I2C_24LC128` |
+24LC32A EEPROM | `#define EEPROM_I2C_24LC32A` |
+24LC64 EEPROM | `#define EEPROM_I2C_24LC64` |
+24LC128 EEPROM | `#define EEPROM_I2C_24LC128` |
24LC256 EEPROM | `#define EEPROM_I2C_24LC256` |
MB85RC256V FRAM | `#define EEPROM_I2C_MB85RC256V` |
@@ -54,13 +58,13 @@ MB85RC256V FRAM | `#define EEPROM_I2C_MB85RC256V` | There's no way to determine if there is an SPI EEPROM actually responding. Generally, this will result in reads of nothing but zero.
@@ -73,3 +77,84 @@ The only configurable item for the transient EEPROM driver is its size:
`#define TRANSIENT_EEPROM_SIZE` | Total size of the EEPROM storage in bytes | 64
Default values and extended descriptions can be found in `drivers/eeprom/eeprom_transient.h`.
+
+## Wear-leveling Driver Configuration :id=wear_leveling-eeprom-driver-configuration
+
+The wear-leveling driver uses an algorithm to minimise the number of erase cycles on the underlying MCU flash memory.
+
+There is no specific configuration for this driver, but the wear-leveling system used by this driver may need configuration. See the [wear-leveling configuration](#wear_leveling-configuration) section for more information.
+
+# Wear-leveling Configuration :id=wear_leveling-configuration
+
+The wear-leveling driver has a few possible _backing stores_ that may be used by adding to your keyboard's `rules.mk` file:
+
+Driver | Description
+----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+`WEAR_LEVELING_DRIVER = embedded_flash` | This driver is used for emulating EEPROM by writing to embedded flash on the MCU.
+`WEAR_LEVELING_DRIVER = spi_flash` | This driver is used to address external SPI NOR Flash peripherals.
+`WEAR_LEVELING_DRIVER = rp2040_flash` | This driver is used to write to the same storage the RP2040 executes code from.
+`WEAR_LEVELING_DRIVER = legacy` | This driver is the "legacy" emulated EEPROM provided in historical revisions of QMK. Currently used for STM32F0xx and STM32F4x1, but slated for deprecation and removal once `embedded_flash` support for those MCU families is complete.
+
+!> All wear-leveling drivers require an amount of RAM equivalent to the selected logical EEPROM size. Increasing the size to 32kB of EEPROM requires 32kB of RAM, which a significant number of MCUs simply do not have.
+
+## Wear-leveling Embedded Flash Driver Configuration :id=wear_leveling-efl-driver-configuration
+
+This driver performs writes to the embedded flash storage embedded in the MCU. In most circumstances, the last few of sectors of flash are used in order to minimise the likelihood of collision with program code.
+
+Configurable options in your keyboard's `config.h`:
+
+`config.h` override | Default | Description
+-----------------------------------------|-------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+`#define WEAR_LEVELING_EFL_FIRST_SECTOR` | _unset_ | The first sector on the MCU to use. By default this is not defined and calculated at runtime based on the MCU. However, different flash sizes on MCUs may require custom configuration.
+`#define WEAR_LEVELING_EFL_FLASH_SIZE` | _unset_ | Allows overriding the flash size available for use for wear-leveling. Under normal circumstances this is automatically calculated and should not need to be overridden. Specifying a size larger than the amount actually available in flash will usually prevent the MCU from booting.
+`#define WEAR_LEVELING_LOGICAL_SIZE` | `1024` | Number of bytes "exposed" to the rest of QMK and denotes the size of the usable EEPROM.
+`#define WEAR_LEVELING_BACKING_SIZE` | `2048` | Number of bytes used by the wear-leveling algorithm for its underlying storage, and needs to be a multiple of the logical size.
+`#define BACKING_STORE_WRITE_SIZE` | _automatic_ | The byte width of the underlying write used on the MCU, and is usually automatically determined from the selected MCU family. If an error occurs in the auto-detection, you'll need to consult the MCU's datasheet and determine this value, specifying it directly.
+
+!> If your MCU does not boot after swapping to the EFL wear-leveling driver, it's likely that the flash size is incorrectly detected, usually as an MCU with larger flash and may require overriding.
+
+## Wear-leveling SPI Flash Driver Configuration :id=wear_leveling-flash_spi-driver-configuration
+
+This driver performs writes to an external SPI NOR Flash peripheral. It also requires a working configuration for the SPI NOR Flash peripheral -- see the [flash driver](flash_driver.md) documentation for more information.
+
+Configurable options in your keyboard's `config.h`:
+
+`config.h` override | Default | Description
+----------------------------------------------------|--------------------------------|--------------------------------------------------------------------------------------------------------------------------------
+`#define WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_COUNT` | `1` | Number of blocks in the external flash used by the wear-leveling algorithm.
+`#define WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_OFFSET` | `0` | The index first block in the external flash used by the wear-leveling algorithm.
+`#define WEAR_LEVELING_LOGICAL_SIZE` | `((block_count*block_size)/2)` | Number of bytes "exposed" to the rest of QMK and denotes the size of the usable EEPROM. Result must be <= 64kB.
+`#define WEAR_LEVELING_BACKING_SIZE` | `(block_count*block_size)` | Number of bytes used by the wear-leveling algorithm for its underlying storage, and needs to be a multiple of the logical size.
+`#define BACKING_STORE_WRITE_SIZE` | `8` | The write width used whenever a write is performed on the external flash peripheral.
+
+!> There is currently a limit of 64kB for the EEPROM subsystem within QMK, so using a larger flash is not going to be beneficial as the logical size cannot be increased beyond 65536. The backing size may be increased to a larger value, but erase timing may suffer as a result.
+
+## Wear-leveling RP2040 Driver Configuration :id=wear_leveling-rp2040-driver-configuration
+
+This driver performs writes to the same underlying storage that the RP2040 executes its code.
+
+Configurable options in your keyboard's `config.h`:
+
+`config.h` override | Default | Description
+------------------------------------------|----------------------------|--------------------------------------------------------------------------------------------------------------------------------
+`#define WEAR_LEVELING_RP2040_FLASH_SIZE` | `PICO_FLASH_SIZE_BYTES` | Number of bytes of flash on the board.
+`#define WEAR_LEVELING_RP2040_FLASH_BASE` | `(flash_size-sector_size)` | The byte-wise location that the backing storage should be located.
+`#define WEAR_LEVELING_LOGICAL_SIZE` | `4096` | Number of bytes "exposed" to the rest of QMK and denotes the size of the usable EEPROM.
+`#define WEAR_LEVELING_BACKING_SIZE` | `8192` | Number of bytes used by the wear-leveling algorithm for its underlying storage, and needs to be a multiple of the logical size as well as the sector size.
+`#define BACKING_STORE_WRITE_SIZE` | `2` | The write width used whenever a write is performed on the external flash peripheral.
+
+## Wear-leveling Legacy EEPROM Emulation Driver Configuration :id=wear_leveling-legacy-driver-configuration
+
+This driver performs writes to the embedded flash storage embedded in the MCU much like the normal Embedded Flash Driver, and is only for use with STM32F0xx and STM32F4x1 devices. This flash implementation is still currently provided as the EFL driver is currently non-functional for the previously mentioned families.
+
+By default, `1024` bytes of emulated EEPROM is provided:
+
+MCU | EEPROM Provided | Flash Used
+----------|-----------------|--------------
+STM32F042 | `1024` bytes | `2048` bytes
+STM32F070 | `1024` bytes | `2048` bytes
+STM32F072 | `1024` bytes | `2048` bytes
+STM32F401 | `1024` bytes | `16384` bytes
+STM32F411 | `1024` bytes | `16384` bytes
+
+Under normal circumstances configuration of this driver requires intimate knowledge of the MCU's flash structure -- reconfiguration is at your own risk and will require referring to the code.
diff --git a/docs/faq_debug.md b/docs/faq_debug.md
index fba27c5f68..cad98bc331 100644
--- a/docs/faq_debug.md
+++ b/docs/faq_debug.md
@@ -4,7 +4,7 @@ This page details various common questions people have about troubleshooting the
## Debugging :id=debugging
-Your keyboard will output debug information if you have `CONSOLE_ENABLE = yes` in your `rules.mk`. By default the output is very limited, but you can turn on debug mode to increase the amount of debug output. Use the `DEBUG` keycode in your keymap, use the [Command](feature_command.md) feature to enable debug mode, or add the following code to your keymap.
+Your keyboard will output debug information if you have `CONSOLE_ENABLE = yes` in your `rules.mk`. By default the output is very limited, but you can turn on debug mode to increase the amount of debug output. Use the `DB_TOGG` keycode in your keymap, use the [Command](feature_command.md) feature to enable debug mode, or add the following code to your keymap.
```c
void keyboard_post_init_user(void) {
@@ -59,7 +59,7 @@ When porting, or when attempting to diagnose pcb issues, it can be useful to kno
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
// If console is enabled, it will print the matrix position and status of each key pressed
#ifdef CONSOLE_ENABLE
- uprintf("KL: kc: 0x%04X, col: %u, row: %u, pressed: %b, time: %u, interrupt: %b, count: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed, record->event.time, record->tap.interrupted, record->tap.count);
+ uprintf("KL: kc: 0x%04X, col: %2u, row: %2u, pressed: %u, time: %5u, int: %u, count: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed, record->event.time, record->tap.interrupted, record->tap.count);
#endif
return true;
}
@@ -69,12 +69,12 @@ Example output
```
Waiting for device:.......
Listening:
-KL: kc: 169, col: 0, row: 0, pressed: 1
-KL: kc: 169, col: 0, row: 0, pressed: 0
-KL: kc: 174, col: 1, row: 0, pressed: 1
-KL: kc: 174, col: 1, row: 0, pressed: 0
-KL: kc: 172, col: 2, row: 0, pressed: 1
-KL: kc: 172, col: 2, row: 0, pressed: 0
+KL: kc: 169, col: 0, row: 0, pressed: 1, time: 15505, int: 0, count: 0
+KL: kc: 169, col: 0, row: 0, pressed: 0, time: 15510, int: 0, count: 0
+KL: kc: 174, col: 1, row: 0, pressed: 1, time: 15703, int: 0, count: 0
+KL: kc: 174, col: 1, row: 0, pressed: 0, time: 15843, int: 0, count: 0
+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
```
### How long did it take to scan for a keypress?
@@ -133,3 +133,4 @@ Check:
- Set `debug_enable=true`. See [Debugging](#debugging)
- Try using `print` function instead of debug print. See **common/print.h**.
- Disconnect other devices with console function. See [Issue #97](https://github.com/tmk/tmk_keyboard/issues/97).
+- Ensure all strings end with a newline character (`\n`). QMK Toolbox prints console output on a per-line basis.
diff --git a/docs/faq_misc.md b/docs/faq_misc.md
index 9e34a04815..287ca7711d 100644
--- a/docs/faq_misc.md
+++ b/docs/faq_misc.md
@@ -10,7 +10,7 @@ You probably don't want to "brick" your keyboard, making it impossible
to rewrite firmware onto it. Here are some of the parameters to show
what things are (and likely aren't) too risky.
-- If your keyboard map does not include RESET, then, to get into DFU
+- If your keyboard map does not include QK_BOOT, then, to get into DFU
mode, you will need to press the reset button on the PCB, which
requires unscrewing the bottom.
- Messing with tmk_core / common files might make the keyboard
diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md
index 83066187c7..b04721b23a 100644
--- a/docs/feature_advanced_keycodes.md
+++ b/docs/feature_advanced_keycodes.md
@@ -161,7 +161,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
};
```
-# Legacy Content :id=legacy-content
+# Advanced topics :id=advanced-topics
This page used to encompass a large set of features. We have moved many sections that used to be part of this page to their own pages. Everything below this point is simply a redirect so that people following old links on the web find what they're looking for.
diff --git a/docs/feature_audio.md b/docs/feature_audio.md
index 5b84dc7747..5227d063c3 100644
--- a/docs/feature_audio.md
+++ b/docs/feature_audio.md
@@ -114,7 +114,7 @@ The audio core offers interface functions to get/set/change the tone multiplexin
There's a couple of different sounds that will automatically be enabled without any other configuration:
```
STARTUP_SONG // plays when the keyboard starts up (audio.c)
-GOODBYE_SONG // plays when you press the RESET key (quantum.c)
+GOODBYE_SONG // plays when you press the QK_BOOT key (quantum.c)
AG_NORM_SONG // plays when you press AG_NORM (quantum.c)
AG_SWAP_SONG // plays when you press AG_SWAP (quantum.c)
CG_NORM_SONG // plays when you press CG_NORM (quantum.c)
@@ -161,9 +161,11 @@ It's advised that you wrap all audio features in `#ifdef AUDIO_ENABLE` / `#endif
The available keycodes for audio are:
-* `AU_ON` - Turn Audio Feature on
-* `AU_OFF` - Turn Audio Feature off
-* `AU_TOG` - Toggle Audio Feature state
+|Key |Aliases |Description |
+|-------------------------|---------|-------------------------------------------|
+|`QK_AUDIO_ON` |`AU_ON` |Turns on Audio Feature |
+|`QK_AUDIO_OFF` |`AU_OFF` |Turns off Audio Feature |
+|`QK_AUDIO_TOGGLE` |`AU_TOGG`|Toggles Audio state |
!> These keycodes turn all of the audio functionality on and off. Turning it off means that audio feedback, audio clicky, music mode, etc. are disabled, completely.
@@ -177,7 +179,7 @@ The available keycodes for audio are:
|`AUDIO_INIT_DELAY` | *Not defined* |Enables delay during startup song to accomidate for USB startup issues. |
|`AUDIO_ENABLE_TONE_MULTIPLEXING` | *Not defined* |Enables time splicing/multiplexing to create multiple tones simutaneously. |
|`STARTUP_SONG` | `STARTUP_SOUND` |Plays when the keyboard starts up (audio.c) |
-|`GOODBYE_SONG` | `GOODBYE_SOUND` |Plays when you press the RESET key (quantum.c) |
+|`GOODBYE_SONG` | `GOODBYE_SOUND` |Plays when you press the QK_BOOT key (quantum.c) |
|`AG_NORM_SONG` | `AG_NORM_SOUND` |Plays when you press AG_NORM (process_magic.c) |
|`AG_SWAP_SONG` | `AG_SWAP_SOUND` |Plays when you press AG_SWAP (process_magic.c) |
|`CG_NORM_SONG` | `AG_NORM_SOUND` |Plays when you press CG_NORM (process_magic.c) |
@@ -219,6 +221,12 @@ Aka "audio effects", different ones can be enabled by setting in `config.h` thes
`#define AUDIO_VOICES` to enable the feature, and `#define AUDIO_VOICE_DEFAULT something` to select a specific effect
for details see quantum/audio/voices.h and .c
+Keycodes available:
+
+|Key |Aliases |Description |
+|-------------------------|---------|-------------------------------------------|
+|`QK_AUDIO_VOICE_NEXT` |`AU_NEXT`|Cycles through the audio voices |
+|`QK_AUDIO_VOICE_PREVIOUS`|`AU_PREV`|Cycles through the audio voices in reverse |
## Music Mode
@@ -228,10 +236,14 @@ Recording is experimental due to some memory issues - if you experience some wei
Keycodes available:
-* `MU_ON` - Turn music mode on
-* `MU_OFF` - Turn music mode off
-* `MU_TOG` - Toggle music mode
-* `MU_MOD` - Cycle through the music modes:
+|Key |Aliases |Description |
+|-------------------------|---------|-------------------------------------------|
+|`QK_MUSIC_ON` |`MU_ON` |Turns on Music Mode |
+|`QK_MUSIC_OFF` |`MU_OFF` |Turns off Music Mode |
+|`QK_MUSIC_TOGGLE` |`MU_TOGG`|Toggles Music Mode |
+|`QK_MUSIC_MODE_NEXT` |`MU_NEXT`|Cycles through the music modes |
+
+Available Modes:
* `CHROMATIC_MODE` - Chromatic scale, row changes the octave
* `GUITAR_MODE` - Chromatic scale, but the row changes the string (+5 st)
* `VIOLIN_MODE` - Chromatic scale, but the row changes the string (+7 st)
@@ -300,13 +312,16 @@ You can look at the [Planck Keyboard](https://github.com/qmk/qmk_firmware/blob/e
This adds a click sound each time you hit a button, to simulate click sounds from the keyboard. And the sounds are slightly different for each keypress, so it doesn't sound like a single long note, if you type rapidly.
-* `CK_TOGG` - Toggles the status (will play sound if enabled)
-* `CK_ON` - Turns on Audio Click (plays sound)
-* `CK_OFF` - Turns off Audio Click (doesn't play sound)
-* `CK_RST` - Resets the frequency to the default state (plays sound at default frequency)
-* `CK_UP` - Increases the frequency of the clicks (plays sound at new frequency)
-* `CK_DOWN` - Decreases the frequency of the clicks (plays sound at new frequency)
+Keycodes available:
+|Key |Aliases |Description |
+|-------------------------|---------|-------------------------------------------|
+|`QK_AUDIO_CLICKY_TOGGLE` |`CK_TOGG`|Toggles Audio clicky mode |
+|`QK_AUDIO_CLICKY_ON` |`CK_ON` |Turns on Audio clicky mode |
+|`QK_AUDIO_CLICKY_OFF` |`CK_OFF` |Turns on Audio clicky mode |
+|`QK_AUDIO_CLICKY_UP` |`CK_UP` |Increases frequency of the clicks |
+|`QK_AUDIO_CLICKY_DOWN` |`CK_DOWN`|Decreases frequency of the clicks |
+|`QK_AUDIO_CLICKY_RESET` |`CK_RST` |Resets frequency to default |
The feature is disabled by default, to save space. To enable it, add this to your `config.h`:
@@ -333,16 +348,20 @@ See [MIDI](feature_midi.md)
## Audio Keycodes
-|Key |Aliases |Description |
-|----------------|---------|----------------------------------|
-|`AU_ON` | |Audio mode on |
-|`AU_OFF` | |Audio mode off |
-|`AU_TOG` | |Toggles Audio mode |
-|`CLICKY_TOGGLE` |`CK_TOGG`|Toggles Audio clicky mode |
-|`CLICKY_UP` |`CK_UP` |Increases frequency of the clicks |
-|`CLICKY_DOWN` |`CK_DOWN`|Decreases frequency of the clicks |
-|`CLICKY_RESET` |`CK_RST` |Resets frequency to default |
-|`MU_ON` | |Turns on Music Mode |
-|`MU_OFF` | |Turns off Music Mode |
-|`MU_TOG` | |Toggles Music Mode |
-|`MU_MOD` | |Cycles through the music modes |
+|Key |Aliases |Description |
+|-------------------------|---------|-------------------------------------------|
+|`QK_AUDIO_ON` |`AU_ON` |Turns on Audio Feature |
+|`QK_AUDIO_OFF` |`AU_OFF` |Turns off Audio Feature |
+|`QK_AUDIO_TOGGLE` |`AU_TOGG`|Toggles Audio state |
+|`QK_AUDIO_CLICKY_TOGGLE` |`CK_TOGG`|Toggles Audio clicky mode |
+|`QK_AUDIO_CLICKY_ON` |`CK_ON` |Turns on Audio clicky mode |
+|`QK_AUDIO_CLICKY_OFF` |`CK_OFF` |Turns on Audio clicky mode |
+|`QK_AUDIO_CLICKY_UP` |`CK_UP` |Increases frequency of the clicks |
+|`QK_AUDIO_CLICKY_DOWN` |`CK_DOWN`|Decreases frequency of the clicks |
+|`QK_AUDIO_CLICKY_RESET` |`CK_RST` |Resets frequency to default |
+|`QK_MUSIC_ON` |`MU_ON` |Turns on Music Mode |
+|`QK_MUSIC_OFF` |`MU_OFF` |Turns off Music Mode |
+|`QK_MUSIC_TOGGLE` |`MU_TOGG`|Toggles Music Mode |
+|`QK_MUSIC_MODE_NEXT` |`MU_NEXT`|Cycles through the music modes |
+|`QK_AUDIO_VOICE_NEXT` |`AU_NEXT`|Cycles through the audio voices |
+|`QK_AUDIO_VOICE_PREVIOUS`|`AU_PREV`|Cycles through the audio voices in reverse |
diff --git a/docs/feature_auto_shift.md b/docs/feature_auto_shift.md
index 99b0ca3c8a..d3437a9c60 100644
--- a/docs/feature_auto_shift.md
+++ b/docs/feature_auto_shift.md
@@ -300,14 +300,14 @@ This will enable you to define three keys temporarily to increase, decrease and
Map three keys temporarily in your keymap:
-| Key Name | Description |
-|----------|-----------------------------------------------------|
-| KC_ASDN | Lower the Auto Shift timeout variable (down) |
-| KC_ASUP | Raise the Auto Shift timeout variable (up) |
-| KC_ASRP | Report your current Auto Shift timeout value |
-| KC_ASON | Turns on the Auto Shift Function |
-| KC_ASOFF | Turns off the Auto Shift Function |
-| KC_ASTG | Toggles the state of the Auto Shift feature |
+|Keycode |Aliases |Description |
+|----------------------|---------|--------------------------------------------|
+|`QK_AUTO_SHIFT_DOWN` |`AS_DOWN`|Lower the Auto Shift timeout variable (down)|
+|`QK_AUTO_SHIFT_UP` |`AS_UP` |Raise the Auto Shift timeout variable (up) |
+|`QK_AUTO_SHIFT_REPORT`|`AS_RPT` |Report your current Auto Shift timeout value|
+|`QK_AUTO_SHIFT_ON` |`AS_ON` |Turns on the Auto Shift Function |
+|`QK_AUTO_SHIFT_OFF` |`AS_OFF` |Turns off the Auto Shift Function |
+|`QK_AUTO_SHIFT_TOGGLE`|`AS_TOGG`|Toggles the state of the Auto Shift feature |
Compile and upload your new firmware.
@@ -318,18 +318,18 @@ completely normal and with no intention of shifted keys.
1. Type multiple sentences of alphabetical letters.
2. Observe any upper case letters.
-3. If there are none, press the key you have mapped to `KC_ASDN` to decrease
+3. If there are none, press the key you have mapped to `AS_DOWN` to decrease
time Auto Shift timeout value and go back to step 1.
4. If there are some upper case letters, decide if you need to work on tapping
those keys with less down time, or if you need to increase the timeout.
5. If you decide to increase the timeout, press the key you have mapped to
- `KC_ASUP` and go back to step 1.
+ `AS_UP` and go back to step 1.
6. Once you are happy with your results, press the key you have mapped to
- `KC_ASRP`. The keyboard will type by itself the value of your
+ `AS_RPT`. The keyboard will type by itself the value of your
`AUTO_SHIFT_TIMEOUT`.
7. Update `AUTO_SHIFT_TIMEOUT` in your `config.h` with the value reported.
8. Add `AUTO_SHIFT_NO_SETUP` to your `config.h`.
-9. Remove the key bindings `KC_ASDN`, `KC_ASUP` and `KC_ASRP`.
+9. Remove the key bindings `AS_DOWN`, `AS_UP` and `AS_RPT`.
10. Compile and upload your new firmware.
#### An Example Run
@@ -337,17 +337,17 @@ completely normal and with no intention of shifted keys.
hello world. my name is john doe. i am a computer programmer playing with
keyboards right now.
- [PRESS KC_ASDN quite a few times]
+ [PRESS AS_DOWN quite a few times]
heLLo woRLd. mY nAMe is JOHn dOE. i AM A compUTeR proGRaMMER PlAYiNG witH
KEYboArDS RiGHT NOw.
- [PRESS KC_ASUP a few times]
+ [PRESS AS_UP a few times]
hello world. my name is john Doe. i am a computer programmer playing with
keyboarDs right now.
- [PRESS KC_ASRP]
+ [PRESS AS_RPT]
115
diff --git a/docs/feature_autocorrect.md b/docs/feature_autocorrect.md
new file mode 100644
index 0000000000..e042027c0f
--- /dev/null
+++ b/docs/feature_autocorrect.md
@@ -0,0 +1,295 @@
+# Autocorrect
+
+There are a lot of words that are prone to being typed incorrectly, due to habit, sequence or just user error. This feature leverages your firmware to automatically correct these errors, to help reduce typos.
+
+## How does it work? :id=how-does-it-work
+
+The feature maintains a small buffer of recent key presses. On each key press, it checks whether the buffer ends in a recognized typo, and if so, automatically sends keystrokes to correct it.
+
+The tricky part is how to efficiently check the buffer for typos. We don’t want to spend too much memory or time on storing or searching the typos. A good solution is to represent the typos with a trie data structure. A trie is a tree data structure where each node is a letter, and words are formed by following a path to one of the leaves.
+
+![An example trie](https://i.imgur.com/HL5DP8H.png)
+
+Since we search whether the buffer ends in a typo, we store the trie writing in reverse. The trie is queried starting from the last letter, then second to last letter, and so on, until either a letter doesn’t match or we reach a leaf, meaning a typo was found.
+
+## How do I enable Autocorrection :id=how-do-i-enable-autocorrection
+
+In your `rules.mk`, add this:
+
+```make
+AUTOCORRECT_ENABLE = yes
+```
+
+Additionally, you will need a library for autocorrection. A small sample library is included by default, so that you can get up and running right away, but you can provide a customized library.
+
+By default, autocorrect is disabled. To enable it, you need to use the `AC_TOGG` keycode to enable it. The status is stored in persistent memory, so you shouldn't need to enabled it again.
+
+## Customizing autocorrect library :id=customizing-autocorrect-library
+
+To provide a custom library, you need to create a text file with the corrections. For instance:
+
+```text
+:thier -> their
+fitler -> filter
+lenght -> length
+ouput -> output
+widht -> width
+```
+
+The syntax is `typo -> correction`. Typos and corrections are case insensitive, and any whitespace before or after the typo and correction is ignored. The typo must be only the letters a–z, or the special character : representing a word break. The correction may have any non-unicode characters.
+
+Then, run:
+
+```sh
+qmk generate-autocorrect-data autocorrect_dictionary.txt
+```
+
+This will process the file and produce an `autocorrect_data.h` file with the trie library, in the folder that you are at. You can specify the keyboard and keymap (eg `-kb planck/rev6 -km jackhumbert`), and it will place the file in that folder instead. But as long as the file is located in your keymap folder, or user folder, it should be picked up automatically.
+
+This file will look like this:
+
+```c
+// :thier -> their
+// fitler -> filter
+// lenght -> length
+// ouput -> output
+// widht -> width
+
+#define AUTOCORRECT_MIN_LENGTH 5 // "ouput"
+#define AUTOCORRECT_MAX_LENGTH 6 // ":thier"
+
+#define DICTIONARY_SIZE 74
+
+static const uint8_t autocorrect_data[DICTIONARY_SIZE] PROGMEM = {85, 7, 0, 23, 35, 0, 0, 8, 0, 76, 16, 0, 15, 25, 0, 0,
+ 11, 23, 44, 0, 130, 101, 105, 114, 0, 23, 12, 9, 0, 131, 108, 116, 101, 114, 0, 75, 42, 0, 24, 64, 0, 0, 71, 49, 0,
+ 10, 56, 0, 0, 12, 26, 0, 129, 116, 104, 0, 17, 8, 15, 0, 129, 116, 104, 0, 19, 24, 18, 0, 130, 116, 112, 117, 116,
+ 0};
+```
+
+### Avoiding false triggers :id=avoiding-false-triggers
+
+By default, typos are searched within words, to find typos within longer identifiers like maxFitlerOuput. While this is useful, a consequence is that autocorrection will falsely trigger when a typo happens to be a substring of a correctly-spelled word. For instance, if we had thier -> their as an entry, it would falsely trigger on (correct, though relatively uncommon) words like “wealthier” and “filthier.”
+
+The solution is to set a word break : before and/or after the typo to constrain matching. : matches space, period, comma, underscore, digits, and most other non-alpha characters.
+
+|Text |thier |:thier |thier: |:thier: |
+|-----------------|:------:|:------:|:------:|:------:|
+|see `thier` typo |matches |matches |matches |matches |
+|it’s `thiers` |matches |matches |no |no |
+|wealthier words |matches |no |matches |no |
+
+:thier: is most restrictive, matching only when thier is a whole word.
+
+The `qmk generate-autocorrect-data` commands can make an effort to check for entries that would false trigger as substrings of correct words. It searches each typo against a dictionary of 25K English words from the english_words Python package, provided it’s installed. (run `python3 -m pip install english_words` to install it.)
+
+?> Unfortunately, this is limited to just english words, at this point.
+
+## Overriding Autocorrect
+
+Occasionally you might actually want to type a typo (for instance, while editing autocorrection_dict.txt) without being autocorrected. There are a couple of ways to do this:
+
+1. Begin typing the typo.
+2. Before typing the last letter, press and release the Ctrl or Alt key.
+3. Type the remaining letters.
+
+This works because the autocorrection implementation doesn’t understand hotkeys, so it resets itself whenever a modifier other than shift is held.
+
+Additionally, you can use the `AC_TOGG` keycode to toggle the on/off status for Autocorrect.
+
+### Keycodes :id=keycodes
+
+|Keycode |Aliases |Description |
+|-----------------------|---------|----------------------------------------------|
+|`QK_AUTOCORRECT_ON` |`AC_ON` |Turns on the Autocorrect feature. |
+|`QK_AUTOCORRECT_OFF` |`AC_OFF` |Turns off the Autocorrect feature. |
+|`QK_AUTOCORRECT_TOGGLE`|`AC_TOGG`|Toggles the status of the Autocorrect feature.|
+
+## User Callback Functions
+
+### Process Autocorrect
+
+Callback function `bool process_autocorrect_user(uint16_t *keycode, keyrecord_t *record, uint8_t *typo_buffer_size, uint8_t *mods)` is available to customise incoming keycodes and handle exceptions. You can use this function to sanitise input before they are passed onto the autocorrect engine
+
+?> Sanitisation of input is required because autocorrect will only match 8-bit [basic keycodes](keycodes_basic.md) for typos. If valid modifier keys or 16-bit keycodes that are part of a user's word input (such as Shift + A) is passed through, they will fail typo letter detection. For example a [Mod-Tap](mod_tap.md) key such as `LCTL_T(KC_A)` is 16-bit and should be masked for the 8-bit `KC_A`.
+
+The default user callback function is found inside `quantum/process_keycode/process_autocorrect.c`. It covers most use-cases for QMK special functions and quantum keycodes, including [overriding autocorrect](#overriding-autocorrect) with a modifier other than shift. The `process_autocorrect_user` function is `weak` defined to allow user's copy inside `keymap.c` (or code files) to overwrite it.
+
+#### Process Autocorrect Example
+
+If you have a custom keycode `QMKBEST` that should be ignored as part of a word, and another custom keycode `QMKLAYER` that should override autocorrect, both can be added to the bottom of the `process_autocorrect_user` `switch` statement in your source code:
+
+```c
+bool process_autocorrect_user(uint16_t *keycode, keyrecord_t *record, uint8_t *typo_buffer_size, uint8_t *mods) {
+ // See quantum_keycodes.h for reference on these matched ranges.
+ switch (*keycode) {
+ // Exclude these keycodes from processing.
+ case KC_LSFT:
+ case KC_RSFT:
+ case KC_CAPS:
+ case QK_TO ... QK_ONE_SHOT_LAYER_MAX:
+ case QK_LAYER_TAP_TOGGLE ... QK_LAYER_MOD_MAX:
+ case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX:
+ return false;
+
+ // Mask for base keycode from shifted keys.
+ case QK_LSFT ... QK_LSFT + 255:
+ case QK_RSFT ... QK_RSFT + 255:
+ if (*keycode >= QK_LSFT && *keycode <= (QK_LSFT + 255)) {
+ *mods |= MOD_LSFT;
+ } else {
+ *mods |= MOD_RSFT;
+ }
+ *keycode &= 0xFF; // Get the basic keycode.
+ return true;
+#ifndef NO_ACTION_TAPPING
+ // Exclude tap-hold keys when they are held down
+ // and mask for base keycode when they are tapped.
+ case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
+# ifdef NO_ACTION_LAYER
+ // Exclude Layer Tap, if layers are disabled
+ // but action tapping is still enabled.
+ return false;
+# endif
+ case QK_MOD_TAP ... QK_MOD_TAP_MAX:
+ // Exclude hold if mods other than Shift is not active
+ if (!record->tap.count) {
+ return false;
+ }
+ *keycode &= 0xFF;
+ break;
+#else
+ case QK_MOD_TAP ... QK_MOD_TAP_MAX:
+ case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
+ // Exclude if disabled
+ return false;
+#endif
+ // Exclude swap hands keys when they are held down
+ // and mask for base keycode when they are tapped.
+ case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX:
+#ifdef SWAP_HANDS_ENABLE
+ if (*keycode >= 0x56F0 || !record->tap.count) {
+ return false;
+ }
+ *keycode &= 0xFF;
+ break;
+#else
+ // Exclude if disabled
+ return false;
+#endif
+ // Handle custom keycodes
+ case QMKBEST:
+ return false;
+ case QMKLAYER:
+ *typo_buffer_size = 0;
+ return false;
+ }
+
+ // Disable autocorrect while a mod other than shift is active.
+ if ((*mods & ~MOD_MASK_SHIFT) != 0) {
+ *typo_buffer_size = 0;
+ return false;
+ }
+
+ return true;
+}
+```
+
+?> In this callback function, `return false` will skip processing of that keycode for autocorrect. Adding `*typo_buffer_size = 0` will also reset the autocorrect buffer at the same time, cancelling any current letters already stored in the buffer.
+
+### Apply Autocorrect
+
+Additionally, `apply_autocorrect(uint8_t backspaces, const char *str)` allows for users to add additional handling to the autocorrection, or replace the functionality entirely. This passes on the number of backspaces needed to replace the words, as well as the replacement string (partial word, not the full word).
+
+#### Apply Autocorrect Example
+
+This following example will play a sound when a typo is autocorrected and execute the autocorrection itself:
+
+```c
+#ifdef AUDIO_ENABLE
+float autocorrect_song[][2] = SONG(TERMINAL_SOUND);
+#endif
+
+bool apply_autocorrect(uint8_t backspaces, const char *str) {
+#ifdef AUDIO_ENABLE
+ PLAY_SONG(autocorrect_song);
+#endif
+ for (uint8_t i = 0; i < backspaces; ++i) {
+ tap_code(KC_BSPC);
+ }
+ send_string_P(str);
+ return false;
+}
+```
+
+?> In this callback function, `return false` will stop the normal processing of autocorrect, which requires manually handling of removing the "bad" characters and typing the new characters.
+
+!> ***IMPORTANT***: `str` is a pointer to `PROGMEM` data for the autocorrection. If you return false, and want to send the string, this needs to use `send_string_P` and not `send_string` or `SEND_STRING`.
+
+You can also use `apply_autocorrect` to detect and display the event but allow internal code to execute the autocorrection with `return true`:
+
+```c
+bool apply_autocorrect(uint8_t backspaces, const char *str) {
+#ifdef OLED_ENABLE
+ oled_write_P(PSTR("Auto-corrected"), false);
+#endif
+ return true;
+}
+```
+
+## Appendix: Trie binary data format :id=appendix
+
+This section details how the trie is serialized to byte data in autocorrection_data. You don’t need to care about this to use this autocorrection implementation. But it is documented for the record in case anyone is interested in modifying the implementation, or just curious how it works.
+
+What I did here is fairly arbitrary, but it is simple to decode and gets the job done.
+
+### Encoding :id=encoding
+
+All autocorrection data is stored in a single flat array autocorrection_data. Each trie node is associated with a byte offset into this array, where data for that node is encoded, beginning with root at offset 0. There are three kinds of nodes. The highest two bits of the first byte of the node indicate what kind:
+
+* 00 ⇒ chain node: a trie node with a single child.
+* 01 ⇒ branching node: a trie node with multiple children.
+* 10 ⇒ leaf node: a leaf, corresponding to a typo and storing its correction.
+
+![An example trie](https://i.imgur.com/HL5DP8H.png)
+
+**Branching node**. Each branch is encoded with one byte for the keycode (KC_A–KC_Z) followed by a link to the child node. Links between nodes are 16-bit byte offsets relative to the beginning of the array, serialized in little endian order.
+
+All branches are serialized this way, one after another, and terminated with a zero byte. As described above, the node is identified as a branch by setting the two high bits of the first byte to 01, done by bitwise ORing the first keycode with 64. keycode. The root node for the above figure would be serialized like:
+
+```
++-------+-------+-------+-------+-------+-------+-------+
+| R|64 | node 2 | T | node 3 | 0 |
++-------+-------+-------+-------+-------+-------+-------+
+```
+
+**Chain node**. Tries tend to have long chains of single-child nodes, as seen in the example above with f-i-t-l in fitler. So to save space, we use a different format to encode chains than branching nodes. A chain is encoded as a string of keycodes, beginning with the node closest to the root, and terminated with a zero byte. The child of the last node in the chain is encoded immediately after. That child could be either a branching node or a leaf.
+
+In the figure above, the f-i-t-l chain is encoded as
+
+```
++-------+-------+-------+-------+-------+
+| L | T | I | F | 0 |
++-------+-------+-------+-------+-------+
+```
+
+If we were to encode this chain using the same format used for branching nodes, we would encode a 16-bit node link with every node, costing 8 more bytes in this example. Across the whole trie, this adds up. Conveniently, we can point to intermediate points in the chain and interpret the bytes in the same way as before. E.g. starting at the i instead of the l, and the subchain has the same format.
+
+**Leaf node**. A leaf node corresponds to a particular typo and stores data to correct the typo. The leaf begins with a byte for the number of backspaces to type, and is followed by a null-terminated ASCII string of the replacement text. The idea is, after tapping backspace the indicated number of times, we can simply pass this string to the `send_string_P` function. For fitler, we need to tap backspace 3 times (not 4, because we catch the typo as the final ‘r’ is pressed) and replace it with lter. To identify the node as a leaf, the two high bits are set to 10 by ORing the backspace count with 128:
+
+```
++-------+-------+-------+-------+-------+-------+
+| 3|128 | 'l' | 't' | 'e' | 'r' | 0 |
++-------+-------+-------+-------+-------+-------+
+```
+
+### Decoding :id=decoding
+
+This format is by design decodable with fairly simple logic. A 16-bit variable state represents our current position in the trie, initialized with 0 to start at the root node. Then, for each keycode, test the highest two bits in the byte at state to identify the kind of node.
+
+* 00 ⇒ **chain node**: If the node’s byte matches the keycode, increment state by one to go to the next byte. If the next byte is zero, increment again to go to the following node.
+* 01 ⇒ **branching node**: Search the branches for one that matches the keycode, and follow its node link.
+* 10 ⇒ **leaf node**: a typo has been found! We read its first byte for the number of backspaces to type, then pass its following bytes to send_string_P to type the correction.
+
+## Credits
+
+Credit goes to [getreuer](https://github.com/getreuer) for originally implementing this [here](https://getreuer.info/posts/keyboards/autocorrection/#how-does-it-work). As well as to [filterpaper](https://github.com/filterpaper) for converting the code to use PROGMEM, and additional improvements.
diff --git a/docs/feature_backlight.md b/docs/feature_backlight.md
index 79782cf564..24057c608f 100644
--- a/docs/feature_backlight.md
+++ b/docs/feature_backlight.md
@@ -16,15 +16,15 @@ BACKLIGHT_ENABLE = yes
Once enabled, the following keycodes below can be used to change the backlight level.
-|Key |Description |
-|---------|-----------------------------------|
-|`BL_TOGG`|Turn the backlight on or off |
-|`BL_STEP`|Cycle through backlight levels |
-|`BL_ON` |Set the backlight to max brightness|
-|`BL_OFF` |Turn the backlight off |
-|`BL_INC` |Increase the backlight level |
-|`BL_DEC` |Decrease the backlight level |
-|`BL_BRTG`|Toggle backlight breathing |
+| Key | Aliases | Description |
+|---------------------------------|-----------|-------------------------------------|
+| `QK_BACKLIGHT_TOGGLE` | `BL_TOGG` | Turn the backlight on or off |
+| `QK_BACKLIGHT_STEP` | `BL_STEP` | Cycle through backlight levels |
+| `QK_BACKLIGHT_ON` | `BL_ON` | Set the backlight to max brightness |
+| `QK_BACKLIGHT_OFF` | `BL_OFF` | Turn the backlight off |
+| `QK_BACKLIGHT_UP` | `BL_UP` | Increase the backlight level |
+| `QK_BACKLIGHT_DOWN` | `BL_DOWN` | Decrease the backlight level |
+| `QK_BACKLIGHT_TOGGLE_BREATHING` | `BL_BRTG` | Toggle backlight breathing |
## Functions :id=functions
diff --git a/docs/feature_bluetooth.md b/docs/feature_bluetooth.md
index d4ed494053..f7ded84d86 100644
--- a/docs/feature_bluetooth.md
+++ b/docs/feature_bluetooth.md
@@ -39,8 +39,8 @@ BLUETOOTH_DRIVER = BluefruitLE # or RN42
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.
-|Name |Description |
-|----------|----------------------------------------------|
-|`OUT_AUTO`|Automatically switch between USB and Bluetooth|
-|`OUT_USB` |USB only |
-|`OUT_BT` |Bluetooth only |
+|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 |
diff --git a/docs/feature_caps_word.md b/docs/feature_caps_word.md
index 0b71119917..c58d1a56e2 100644
--- a/docs/feature_caps_word.md
+++ b/docs/feature_caps_word.md
@@ -4,11 +4,14 @@ It is often useful to type a single word in all capitals, for instance
abbreviations like "QMK", or in code, identifiers like `KC_SPC`. "Caps Word" is
a modern alternative to Caps Lock:
-* Letters are capitalized while active, and Caps Word automatically disables
+* While active, letters are capitalized and `-` becomes `_`. The `_` makes it easier
+ to type constant names (eg 'PROGRAM\_CONSTANTS').
+
+* Caps Word automatically disables
itself at the end of the word. That is, it stops by default once a space or
- any key other than `a`--`z`, `0`--`9`, `-`, `_`, delete, or backspace is
- pressed. Caps Word also disables itself if the keyboard is idle for 5 seconds.
- This is configurable, see below.
+ any key other than `KC_A`--`KC_Z`, `KC_0`--`KC_9`, `KC_MINS`, `KC_UNDS`,
+ `KC_DELETE`, or `KC_BACKSPACE` is pressed. Caps Word also disables itself if
+ the keyboard is idle for 5 seconds. This is configurable, see below.
* To avoid requiring a dedicated key for Caps Word, there is an option
(`BOTH_SHIFTS_TURNS_ON_CAPS_WORD`) to activate Caps Word by simultaneously
@@ -16,7 +19,17 @@ a modern alternative to Caps Lock:
* The implementation does not use the Caps Lock (`KC_CAPS`) keycode. Caps Word
works even if you're remapping Caps Lock at the OS level to Ctrl or something
- else, as Emacs and Vim users often do.
+ else, as Emacs and Vim users often do. As a consequence, Caps Word does not
+ follow the typical Caps Lock behaviour and may thus act in potentially
+ unexpected ways, especially when using an *OS* keyboard layout other than US
+ or UK. For example, Dvorak's , < key (`DV_COMM` aka `KC_W`) will
+ get shifted because Caps Word interprets that keycode as the letter 'W' by
+ default, the Spanish Ñ key (`ES_NTIL` aka `KC_SCLN`) will not get
+ capitalized because Caps Word interprets it as the semicolon ';' punctuation
+ character, and the US hyphen key (`KC_MINS`), while unaffected by Caps Lock,
+ is shifted by Caps Word. However, this is not really a problem because you can
+ [configure which keys should Caps Word
+ shift](#configure-which-keys-are-word-breaking).
## How do I enable Caps Word :id=how-do-i-enable-caps-word
@@ -29,8 +42,8 @@ CAPS_WORD_ENABLE = yes
Next, use one the following methods to activate Caps Word:
-* **Activate by pressing a key**: Use the `CAPS_WORD` keycode (short
- alias `CAPSWRD`) in your keymap.
+* **Activate by pressing a key**: Use the `QK_CAPS_WORD_TOGGLE` keycode (short
+ alias `CW_TOGG`) in your keymap.
* **Activate by pressing Left Shift + Right Shift**: Add `#define
BOTH_SHIFTS_TURNS_ON_CAPS_WORD` to config.h. You may also need to disable or
@@ -60,7 +73,7 @@ time, since both use the Left Shift + Right Shift key combination."**
Many keyboards enable the [Command feature](feature_command.md), which by
default is also activated using the Left Shift + Right Shift key combination. To
-fix this conflict, please disable Command by adding in rules.mk:
+fix this conflict, please disable Command by adding in rules.mk:
```make
COMMAND_ENABLE = no
@@ -81,7 +94,7 @@ by defining `IS_COMMAND()` in config.h:
Caps Word turns off automatically if no keys are pressed for
`CAPS_WORD_IDLE_TIMEOUT` milliseconds. The default is 5000 (5 seconds).
-Configure the timeout duration in config.h, for instance
+Configure the timeout duration in config.h, for instance
```c
#define CAPS_WORD_IDLE_TIMEOUT 3000 // 3 seconds.
diff --git a/docs/feature_combo.md b/docs/feature_combo.md
index 42d965509b..2696ff6833 100644
--- a/docs/feature_combo.md
+++ b/docs/feature_combo.md
@@ -105,11 +105,11 @@ It is worth noting that `COMBO_ACTION`s are not needed anymore. As of [PR#8591](
## Keycodes
You can enable, disable and toggle the Combo feature on the fly. This is useful if you need to disable them temporarily, such as for a game. The following keycodes are available for use in your `keymap.c`
-|Keycode |Description |
-|----------|---------------------------------|
-|`CMB_ON` |Turns on Combo feature |
-|`CMB_OFF` |Turns off Combo feature |
-|`CMB_TOG` |Toggles Combo feature on and off |
+|Keycode |Aliases |Description |
+|-----------------|---------|--------------------------------|
+|`QK_COMBO_ON` |`CM_ON` |Turns on Combo feature |
+|`QK_COMBO_OFF` |`CM_OFF` |Turns off Combo feature |
+|`QK_COMBO_TOGGLE`|`CM_TOGG`|Toggles Combo feature on and off|
# Advanced Configuration
These configuration settings can be set in your `config.h` file.
@@ -255,7 +255,7 @@ bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode
```
## Variable Length Combos
-If you leave `COMBO_COUNT` undefined in `config.h`, it allows you to programmatically declare the size of the Combo data structure and avoid updating `COMBO_COUNT`. Instead a variable called `COMBO_LEN` has to be set. It can be set with something similar to the following in `keymap.c`: `uint16_t COMBO_LEN = sizeof(key_combos) / sizeof(key_combos[0]);` or by adding `COMBO_LENGTH` as the *last* entry in the combo enum and then `uint16_t COMBO_LEN = COMBO_LENGTH;` as such:
+If you leave `COMBO_COUNT` undefined in `config.h`, it allows you to programmatically declare the size of the Combo data structure and avoid updating `COMBO_COUNT`. Instead a variable called `COMBO_LEN` has to be set. It can be set with something similar to the following in `keymap.c`: `uint16_t COMBO_LEN = ARRAY_SIZE(key_combos);` or by adding `COMBO_LENGTH` as the *last* entry in the combo enum and then `uint16_t COMBO_LEN = COMBO_LENGTH;` as such:
```c
enum myCombos {
...,
diff --git a/docs/feature_converters.md b/docs/feature_converters.md
new file mode 100644
index 0000000000..0fa677f873
--- /dev/null
+++ b/docs/feature_converters.md
@@ -0,0 +1,182 @@
+# Converters
+
+Since many drop-in replacement controllers now exist, we've done our best to make them easy to use in existing designs.
+
+This page documents the handy automated process for converting keyboards.
+
+### Supported Converters
+
+Currently the following converters are available:
+
+| From | To |
+|------------|-------------------|
+| `promicro` | `proton_c` |
+| `promicro` | `kb2040` |
+| `promicro` | `promicro_rp2040` |
+| `promicro` | `blok` |
+| `promicro` | `bit_c_pro` |
+| `promicro` | `stemcell` |
+| `promicro` | `bonsai_c4` |
+| `promicro` | `elite_pi` |
+| `elite_c` | `stemcell` |
+| `elite_c` | `elite_pi` |
+
+See below for more in depth information on each converter.
+
+## Overview
+
+Each converter category is broken down by its declared `pin compatibility`.
+This ensures that only valid combinations are attempted.
+
+You can generate the firmware by appending `-e CONVERT_TO=` to your compile/flash command. For example:
+
+```sh
+qmk flash -c -kb keebio/bdn9/rev1 -km default -e CONVERT_TO=proton_c
+```
+
+You can also add the same `CONVERT_TO=` to your keymap's `rules.mk`, which will accomplish the same thing.
+
+?> If you get errors about `PORTB/DDRB`, etc not being defined, you'll need to convert the keyboard's code to use the [GPIO Controls](gpio_control.md) that will work for both ARM and AVR. This shouldn't affect the AVR builds at all.
+
+### Conditional Configuration
+
+Once a converter is enabled, it exposes the `CONVERT_TO_` flag that you can use in your code with `#ifdef`s, For example:
+
+```c
+#ifdef CONVERT_TO_PROTON_C
+ // Proton C code
+#else
+ // Pro Micro code
+#endif
+```
+
+### Pin Compatibility
+
+To ensure compatibility, provide validation, and power future workflows, a keyboard should declare its `pin compatibility`. For legacy reasons, this is currently assumed to be `promicro`.
+
+Currently the following pin compatibility interfaces are defined:
+
+| Pinout | Notes |
+|------------|-----------------------------------|
+| `promicro` | Includes RX/TX LEDs |
+| `elite_c` | Includes bottom row pins, no LEDs |
+
+To declare the base for conversions, add this line to your keyboard's `rules.mk`:
+
+```makefile
+PIN_COMPATIBLE = elite_c
+```
+
+## Pro Micro
+
+If a board currently supported in QMK uses a [Pro Micro](https://www.sparkfun.com/products/12640) (or compatible board), the supported alternative controllers are:
+
+| Device | Target |
+|------------------------------------------------------------------------------------------|-------------------|
+| [Proton C](https://qmk.fm/proton-c/) | `proton_c` |
+| [Adafruit KB2040](https://learn.adafruit.com/adafruit-kb2040) | `kb2040` |
+| [SparkFun Pro Micro - RP2040](https://www.sparkfun.com/products/18288) | `promicro_rp2040` |
+| [Blok](https://boardsource.xyz/store/628b95b494dfa308a6581622) | `blok` |
+| [Bit-C PRO](https://nullbits.co/bit-c-pro) | `bit_c_pro` |
+| [STeMCell](https://github.com/megamind4089/STeMCell) | `stemcell` |
+| [customMK Bonsai C4](https://shop.custommk.com/products/bonsai-c4-microcontroller-board) | `bonsai_c4` |
+| [Elite-Pi](https://keeb.io/products/elite-pi-usb-c-pro-micro-replacement-rp2040) | `elite_pi` |
+
+Converter summary:
+
+| Target | Argument | `rules.mk` | Condition |
+|-------------------|---------------------------------|------------------------------|-------------------------------------|
+| `proton_c` | `-e CONVERT_TO=proton_c` | `CONVERT_TO=proton_c` | `#ifdef CONVERT_TO_PROTON_C` |
+| `kb2040` | `-e CONVERT_TO=kb2040` | `CONVERT_TO=kb2040` | `#ifdef CONVERT_TO_KB2040` |
+| `promicro_rp2040` | `-e CONVERT_TO=promicro_rp2040` | `CONVERT_TO=promicro_rp2040` | `#ifdef CONVERT_TO_PROMICRO_RP2040` |
+| `blok` | `-e CONVERT_TO=blok` | `CONVERT_TO=blok` | `#ifdef CONVERT_TO_BLOK` |
+| `bit_c_pro` | `-e CONVERT_TO=bit_c_pro` | `CONVERT_TO=bit_c_pro` | `#ifdef CONVERT_TO_BIT_C_PRO` |
+| `stemcell` | `-e CONVERT_TO=stemcell` | `CONVERT_TO=stemcell` | `#ifdef CONVERT_TO_STEMCELL` |
+| `bonsai_c4` | `-e CONVERT_TO=bonsai_c4` | `CONVERT_TO=bonsai_c4` | `#ifdef CONVERT_TO_BONSAI_C4` |
+| `elite_pi` | `-e CONVERT_TO=elite_pi` | `CONVERT_TO=elite_pi` | `#ifdef CONVERT_TO_ELITE_PI` |
+
+### Proton C :id=proton_c
+
+The Proton C only has one on-board LED (C13), and by default, the TXLED (D5) is mapped to it. If you want the RXLED (B0) mapped to it instead, add this line to your `config.h`:
+
+```c
+#define CONVERT_TO_PROTON_C_RXLED
+```
+
+The following defaults are based on what has been implemented for STM32 boards.
+
+| Feature | Notes |
+|----------------------------------------------|------------------------------------------------------------------------------------------------------------------|
+| [Audio](feature_audio.md) | Enabled |
+| [RGB Lighting](feature_rgblight.md) | Disabled |
+| [Backlight](feature_backlight.md) | Forces [task driven PWM](feature_backlight.md#software-pwm-driver) until ARM can provide automatic configuration |
+| USB Host (e.g. USB-USB converter) | Not supported (USB host code is AVR specific and is not currently supported on ARM) |
+| [Split keyboards](feature_split_keyboard.md) | Partial - heavily dependent on enabled features |
+
+### Adafruit KB2040 :id=kb2040
+
+The following defaults are based on what has been implemented for [RP2040](platformdev_rp2040.md) boards.
+
+| Feature | Notes |
+|----------------------------------------------|------------------------------------------------------------------------------------------------------------------|
+| [RGB Lighting](feature_rgblight.md) | Enabled via `PIO` vendor driver |
+| [Backlight](feature_backlight.md) | Forces [task driven PWM](feature_backlight.md#software-pwm-driver) until ARM can provide automatic configuration |
+| USB Host (e.g. USB-USB converter) | Not supported (USB host code is AVR specific and is not currently supported on ARM) |
+| [Split keyboards](feature_split_keyboard.md) | Partial via `PIO` vendor driver - heavily dependent on enabled features |
+
+### SparkFun Pro Micro - RP2040, Blok, Bit-C PRO, and Elite-Pi :id=promicro_rp2040
+
+Currently identical to [Adafruit KB2040](#kb2040).
+
+### STeMCell :id=stemcell
+
+Feature set currently identical to [Proton C](#proton_c).
+There are two versions of STeMCell available, with different pinouts:
+ - v1.0.0
+ - v2.0.0 (pre-release v1.0.1, v1.0.2)
+Default official firmware only supports v2.0.0 STeMCell.
+
+STeMCell has support to swap UART and I2C pins, to enable single-wire uart communication in STM chips.
+
+The following additional flags has to be used while compiling, based on the pin used for split communication.
+
+| Split Pin | Compile flags |
+|-----------|---------------|
+| D3 | -e STMC_US=yes|
+| D2 | Not needed |
+| D1 | -e STMC_IS=yes|
+| D0 | Not needed |
+
+### Bonsai C4 :id=bonsai_c4
+
+The Bonsai C4 only has one on-board LED (B2), and by default, both the Pro Micro TXLED (D5) and RXLED (B0) are mapped to it. If you want only one of them mapped, you can undefine one and redefine it to another pin by adding these line to your `config.h`:
+
+```c
+#undef B0
+// If Vbus detection is unused, we can send RXLED to the Vbus detect pin instead
+#define B0 PAL_LINE(GPIOA, 9)
+```
+
+## Elite-C
+
+If a board currently supported in QMK uses an [Elite-C](https://keeb.io/products/elite-c-low-profile-version-usb-c-pro-micro-replacement-atmega32u4), the supported alternative controllers are:
+
+| Device | Target |
+|----------------------------------------------------------------------------------|-------------------|
+| [STeMCell](https://github.com/megamind4089/STeMCell) | `stemcell` |
+| [Elite-Pi](https://keeb.io/products/elite-pi-usb-c-pro-micro-replacement-rp2040) | `elite_pi` |
+
+Converter summary:
+
+| Target | Argument | `rules.mk` | Condition |
+|-------------------|---------------------------------|------------------------------|-------------------------------------|
+| `stemcell` | `-e CONVERT_TO=stemcell` | `CONVERT_TO=stemcell` | `#ifdef CONVERT_TO_STEMCELL` |
+| `elite_pi` | `-e CONVERT_TO=elite_pi` | `CONVERT_TO=elite_pi` | `#ifdef CONVERT_TO_ELITE_PI` |
+
+### STeMCell :id=stemcell_elite
+
+Currently identical to [STeMCell](#stemcell) with support for the additional bottom row of pins.
+
+### Elite-Pi :id=elite_pi
+
+Currently identical to [Adafruit KB2040](#kb2040), with support for the additional bottom row of pins.
diff --git a/docs/feature_digitizer.md b/docs/feature_digitizer.md
index ac2d64f977..2e9e37cd5f 100644
--- a/docs/feature_digitizer.md
+++ b/docs/feature_digitizer.md
@@ -1,35 +1,117 @@
-## Digitizer
+# Digitizer :id=digitizer
-The digitizer HID interface allows setting the mouse cursor position at absolute coordinates, unlike the Pointing Device feature that applies relative displacements.
+Digitizers allow the mouse cursor to be placed at absolute coordinates, unlike the [Pointing Device](feature_pointing_device.md) feature which applies relative displacements.
-To enable the digitizer interface, add the following line to your rules.mk:
+This feature implements a stylus device with a tip switch and barrel switch (generally equivalent to the primary and secondary mouse buttons respectively). Tip pressure is not currently implemented.
+
+## Usage :id=usage
+
+Add the following to your `rules.mk`:
```make
DIGITIZER_ENABLE = yes
```
-In order to change the mouse cursor position from your keymap.c file, include the digitizer header :
+## Positioning :id=positioning
+
+The X and Y coordinates are normalized, meaning their value must be set between 0 and 1. For the X component, the value `0` is the leftmost position, whereas the value `1` is the rightmost position. Similarly for the Y component, `0` is at the top and `1` at the bottom.
+
+?> Since there is no display attached, the OS will likely map these coordinates to the virtual desktop. This may be important to know if you have multiple monitors.
+
+## Examples :id=examples
+
+This example simply places the cursor in the middle of the screen:
```c
-#include "digitizer.h"
+digitizer_in_range_on();
+digitizer_set_position(0.5, 0.5);
```
-This gives you access to the `digitizer` structure which members allow you to change the cursor position.
+The "in range" indicator is required to be on for the change in coordinates to be taken. It can then be turned off again to signal the end of the digitizer interaction, but it is not strictly required.
-The coordinates are normalized, meaning there value must be set between 0 and 1. For the `x` coordinate, the value `0` is the leftmost position, whereas the value `1` is the rightmost position.
-For the `y` coordinate, `0` is at the top and `1` at the bottom.
-
-Here is an example setting the cursor in the middle of the screen:
+You can also modify the digitizer state directly, if you need to change multiple fields in a single report:
```c
-digitizer_t digitizer;
-digitizer.x = 0.5;
-digitizer.y = 0.5;
-digitizer.tipswitch = 0;
-digitizer.inrange = 1;
-digitizer_set_report(digitizer);
+digitizer_state.in_range = true;
+digitizer_state.dirty = true;
+digitizer_flush();
```
-The `tipswitch` member triggers what equates to a click when set to `1`. The `inrange` member is required for the change in coordinates to be taken. It can then be set to `0` in a new report to signal the end of the digitizer interaction, but it is not strictly required.
+`digitizer_state` is a struct of type `digitizer_t`.
-Once all members are set to the desired value, the `status` member needs its bitmask `DZ_UPDATED` to be set so the report is sent during the next main loop iteration.
+
+## API :id=api
+
+### `struct digitizer_t` :id=api-digitizer-t
+
+Contains the state of the digitizer.
+
+#### Members :id=api-digitizer-t-members
+
+ - `bool in_range`
+ Indicates to the host that the contact is within range (ie. close to or in contact with the digitizer surface).
+ - `bool tip`
+ The state of the tip switch.
+ - `bool barrel`
+ The state of the barrel switch.
+ - `float x`
+ The X coordinate of the digitizer contact.
+ - `float y`
+ The Y coordinate of the digitizer contact.
+ - `bool dirty`
+ Whether the current state needs to be sent to the host.
+
+---
+
+### `void digitizer_flush(void)` :id=api-digitizer-flush
+
+Send the digitizer report to the host if it is marked as dirty.
+
+---
+
+### `void digitizer_in_range_on(void)` :api-digitizer-in-range-on
+
+Assert the "in range" indicator, and flush the report.
+
+---
+
+### `void digitizer_in_range_off(void)` :api-digitizer-in-range-off
+
+Deassert the "in range" indicator, and flush the report.
+
+---
+
+### `void digitizer_tip_switch_on(void)` :api-digitizer-tip-switch-on
+
+Assert the tip switch, and flush the report.
+
+---
+
+### `void digitizer_tip_switch_off(void)` :api-digitizer-tip-switch-off
+
+Deassert the tip switch, and flush the report.
+
+---
+
+### `void digitizer_barrel_switch_on(void)` :api-digitizer-barrel-switch-on
+
+Assert the barrel switch, and flush the report.
+
+---
+
+### `void digitizer_barrel_switch_off(void)` :api-digitizer-barrel-switch-off
+
+Deassert the barrel switch, and flush the report.
+
+---
+
+### `void digitizer_set_position(float x, float y)` :api-digitizer-set-position
+
+Set the absolute X and Y position of the digitizer contact, and flush the report.
+
+#### Arguments :id=api-digitizer-set-position-arguments
+
+ - `float x`
+ The X value of the contact position, from 0 to 1.
+ - `float y`
+ The Y value of the contact position, from 0 to 1.
diff --git a/docs/feature_dynamic_macros.md b/docs/feature_dynamic_macros.md
index 01f2a0ca40..f5a6952b6b 100644
--- a/docs/feature_dynamic_macros.md
+++ b/docs/feature_dynamic_macros.md
@@ -6,21 +6,21 @@ You can store one or two macros and they may have a combined total of 128 keypre
To enable them, first include `DYNAMIC_MACRO_ENABLE = yes` in your `rules.mk`. Then, add the following keys to your keymap:
-|Key |Alias |Description |
-|------------------|----------|---------------------------------------------------|
-|`DYN_REC_START1` |`DM_REC1` |Start recording Macro 1 |
-|`DYN_REC_START2` |`DM_REC2` |Start recording Macro 2 |
-|`DYN_MACRO_PLAY1` |`DM_PLY1` |Replay Macro 1 |
-|`DYN_MACRO_PLAY2` |`DM_PLY2` |Replay Macro 2 |
-|`DYN_REC_STOP` |`DM_RSTP` |Finish the macro that is currently being recorded. |
+|Key |Alias |Description |
+|---------------------------------|---------|--------------------------------------------------|
+|`QK_DYNAMIC_MACRO_RECORD_START_1`|`DM_REC1`|Start recording Macro 1 |
+|`QK_DYNAMIC_MACRO_RECORD_START_2`|`DM_REC2`|Start recording Macro 2 |
+|`QK_DYNAMIC_MACRO_PLAY_1` |`DM_PLY1`|Replay Macro 1 |
+|`QK_DYNAMIC_MACRO_PLAY_2` |`DM_PLY2`|Replay Macro 2 |
+|`QK_DYNAMIC_MACRO_RECORD_STOP` |`DM_RSTP`|Finish the macro that is currently being recorded.|
That should be everything necessary.
-To start recording the macro, press either `DYN_REC_START1` or `DYN_REC_START2`.
+To start recording the macro, press either `DM_REC1` or `DM_REC2`.
-To finish the recording, press the `DYN_REC_STOP` layer button. You can also press `DYN_REC_START1` or `DYN_REC_START2` again to stop the recording.
+To finish the recording, press the `DM_RSTP` layer button. You can also press `DM_REC1` or `DM_REC2` again to stop the recording.
-To replay the macro, press either `DYN_MACRO_PLAY1` or `DYN_MACRO_PLAY2`.
+To replay the macro, press either `DM_PLY1` or `DM_PLY2`.
It is possible to replay a macro as part of a macro. It's ok to replay macro 2 while recording macro 1 and vice versa but never create recursive macros i.e. macro 1 that replays macro 1. If you do so and the keyboard will get unresponsive, unplug the keyboard and plug it again. You can disable this completely by defining `DYNAMIC_MACRO_NO_NESTING` in your `config.h` file.
@@ -35,6 +35,7 @@ There are a number of options added that should allow some additional degree of
|`DYNAMIC_MACRO_SIZE` |128 |Sets the amount of memory that Dynamic Macros can use. This is a limited resource, dependent on the controller. |
|`DYNAMIC_MACRO_USER_CALL` |*Not defined* |Defining this falls back to using the user `keymap.c` file to trigger the macro behavior. |
|`DYNAMIC_MACRO_NO_NESTING` |*Not Defined* |Defining this disables the ability to call a macro from another macro (nested macros). |
+|`DYNAMIC_MACRO_DELAY` |*Not Defined* |Sets the waiting time (ms unit) when sending each key. |
If the LEDs start blinking during the recording with each keypress, it means there is no more space for the macro in the macro buffer. To fit the macro in, either make the other macro shorter (they share the same buffer) or increase the buffer size by adding the `DYNAMIC_MACRO_SIZE` define in your `config.h` (default value: 128; please read the comments for it in the header).
@@ -42,10 +43,10 @@ If the LEDs start blinking during the recording with each keypress, it means the
### DYNAMIC_MACRO_USER_CALL
-For users of the earlier versions of dynamic macros: It is still possible to finish the macro recording using just the layer modifier used to access the dynamic macro keys, without a dedicated `DYN_REC_STOP` key. If you want this behavior back, add `#define DYNAMIC_MACRO_USER_CALL` to your `config.h` and insert the following snippet at the beginning of your `process_record_user()` function:
+For users of the earlier versions of dynamic macros: It is still possible to finish the macro recording using just the layer modifier used to access the dynamic macro keys, without a dedicated `DM_RSTP` key. If you want this behavior back, add `#define DYNAMIC_MACRO_USER_CALL` to your `config.h` and insert the following snippet at the beginning of your `process_record_user()` function:
```c
- uint16_t macro_kc = (keycode == MO(_DYN) ? DYN_REC_STOP : keycode);
+ uint16_t macro_kc = (keycode == MO(_DYN) ? DM_RSTP : keycode);
if (!process_record_dynamic_macro(macro_kc, record)) {
return false;
diff --git a/docs/feature_eeprom.md b/docs/feature_eeprom.md
new file mode 100644
index 0000000000..088f4f36ff
--- /dev/null
+++ b/docs/feature_eeprom.md
@@ -0,0 +1,134 @@
+# Persistent Configuration (EEPROM)
+
+This allows you to configure persistent settings for your keyboard. These settings are stored in the EEPROM of your controller, and are retained even after power loss. The settings can be read with `eeconfig_read_kb` and `eeconfig_read_user`, and can be written to using `eeconfig_update_kb` and `eeconfig_update_user`. This is useful for features that you want to be able to toggle (like toggling rgb layer indication). Additionally, you can use `eeconfig_init_kb` and `eeconfig_init_user` to set the default values for the EEPROM.
+
+The complicated part here, is that there are a bunch of ways that you can store and access data via EEPROM, and there is no "correct" way to do this. However, you only have a DWORD (4 bytes) for each function.
+
+Keep in mind that EEPROM has a limited number of writes. While this is very high, it's not the only thing writing to the EEPROM, and if you write too often, you can potentially drastically shorten the life of your MCU.
+
+* If you don't understand the example, then you may want to avoid using this feature, as it is rather complicated.
+
+## Example Implementation
+
+This is an example of how to add settings, and read and write it. We're using the user keymap for the example here. This is a complex function, and has a lot going on. In fact, it uses a lot of the above functions to work!
+
+
+In your keymap.c file, add this to the top:
+```c
+typedef union {
+ uint32_t raw;
+ struct {
+ bool rgb_layer_change :1;
+ };
+} user_config_t;
+
+user_config_t user_config;
+```
+
+This sets up a 32 bit structure that we can store settings with in memory, and write to the EEPROM. Using this removes the need to define variables, since they're defined in this structure. Remember that `bool` (boolean) values use 1 bit, `uint8_t` uses 8 bits, `uint16_t` uses up 16 bits. You can mix and match, but changing the order can cause issues, as it will change the values that are read and written.
+
+We're using `rgb_layer_change`, for the `layer_state_set_*` function, and use `keyboard_post_init_user` and `process_record_user` to configure everything.
+
+Now, using the `keyboard_post_init_user` code above, you want to add `eeconfig_read_user()` to it, to populate the structure you've just created. And you can then immediately use this structure to control functionality in your keymap. And It should look like:
+```c
+void keyboard_post_init_user(void) {
+ // Call the keymap level matrix init.
+
+ // Read the user config from EEPROM
+ user_config.raw = eeconfig_read_user();
+
+ // Set default layer, if enabled
+ if (user_config.rgb_layer_change) {
+ rgblight_enable_noeeprom();
+ rgblight_sethsv_noeeprom(HSV_CYAN);
+ rgblight_mode_noeeprom(1);
+ }
+}
+```
+The above function will use the EEPROM config immediately after reading it, to set the default layer's RGB color. The "raw" value of it is converted in a usable structure based on the "union" that you created above.
+
+```c
+layer_state_t layer_state_set_user(layer_state_t state) {
+ switch (get_highest_layer(state)) {
+ case _RAISE:
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom(HSV_MAGENTA); rgblight_mode_noeeprom(1); }
+ break;
+ case _LOWER:
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom(HSV_RED); rgblight_mode_noeeprom(1); }
+ break;
+ case _PLOVER:
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom(HSV_GREEN); rgblight_mode_noeeprom(1); }
+ break;
+ case _ADJUST:
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom(HSV_WHITE); rgblight_mode_noeeprom(1); }
+ break;
+ default: // for any other layers, or the default layer
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom(HSV_CYAN); rgblight_mode_noeeprom(1); }
+ break;
+ }
+ return state;
+}
+```
+This will cause the RGB underglow to be changed ONLY if the value was enabled. Now to configure this value, create a new keycode for `process_record_user` called `RGB_LYR`. Additionally, we want to make sure that if you use the normal RGB codes, that it turns off Using the example above, make it look this:
+```c
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case FOO:
+ if (record->event.pressed) {
+ // Do something when pressed
+ } else {
+ // Do something else when release
+ }
+ return false; // Skip all further processing of this key
+ case KC_ENTER:
+ // Play a tone when enter is pressed
+ if (record->event.pressed) {
+ PLAY_SONG(tone_qwerty);
+ }
+ return true; // Let QMK send the enter press/release events
+ case RGB_LYR: // This allows me to use underglow as layer indication, or as normal
+ if (record->event.pressed) {
+ user_config.rgb_layer_change ^= 1; // Toggles the status
+ eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
+ if (user_config.rgb_layer_change) { // if layer state indication is enabled,
+ layer_state_set(layer_state); // then immediately update the layer color
+ }
+ }
+ return false;
+ case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // For any of the RGB codes (see quantum_keycodes.h, L400 for reference)
+ if (record->event.pressed) { //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled
+ if (user_config.rgb_layer_change) { // only if this is enabled
+ user_config.rgb_layer_change = false; // disable it, and
+ eeconfig_update_user(user_config.raw); // write the setings to EEPROM
+ }
+ }
+ return true; break;
+ default:
+ return true; // Process all other keycodes normally
+ }
+}
+```
+And lastly, you want to add the `eeconfig_init_user` function, so that when the EEPROM is reset, you can specify default values, and even custom actions. To force an EEPROM reset, use the `EE_CLR` keycode or [Bootmagic Lite](feature_bootmagic.md) functionallity. For example, if you want to set rgb layer indication by default, and save the default valued.
+
+```c
+void eeconfig_init_user(void) { // EEPROM is getting reset!
+ user_config.raw = 0;
+ user_config.rgb_layer_change = true; // We want this enabled by default
+ eeconfig_update_user(user_config.raw); // Write default value to EEPROM now
+
+ // use the non noeeprom versions, to write these values to EEPROM too
+ rgblight_enable(); // Enable RGB by default
+ rgblight_sethsv(HSV_CYAN); // Set it to CYAN by default
+ rgblight_mode(1); // set to solid by default
+}
+```
+
+And you're done. The RGB layer indication will only work if you want it to. And it will be saved, even after unplugging the board. And if you use any of the RGB codes, it will disable the layer indication, so that it stays on the mode and color that you set it to.
+
+## 'EECONFIG' Function Documentation
+
+* Keyboard/Revision: `void eeconfig_init_kb(void)`, `uint32_t eeconfig_read_kb(void)` and `void eeconfig_update_kb(uint32_t val)`
+* Keymap: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)` and `void eeconfig_update_user(uint32_t val)`
+
+The `val` is the value of the data that you want to write to EEPROM. And the `eeconfig_read_*` function return a 32 bit (DWORD) value from the EEPROM.
diff --git a/docs/feature_encoders.md b/docs/feature_encoders.md
index fdde03ac23..60b613d6a5 100644
--- a/docs/feature_encoders.md
+++ b/docs/feature_encoders.md
@@ -69,7 +69,7 @@ Additionally, if one side does not have an encoder, you can specify `{}` for the
## Encoder map :id=encoder-map
-Encoder mapping may be added to your `keymap.c`, which replicates the normal keyswitch layer handling functionality, but with encoders. Add this to your `rules.mk`:
+Encoder mapping may be added to your `keymap.c`, which replicates the normal keyswitch layer handling functionality, but with encoders. Add this to your keymap's `rules.mk`:
```make
ENCODER_MAP_ENABLE = yes
@@ -88,6 +88,16 @@ const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
#endif
```
+?> This should only be enabled at the keymap level.
+
+Using encoder mapping pumps events through the normal QMK keycode processing pipeline, resulting in a _keydown/keyup_ combination pushed through `process_record_xxxxx()`. To configure the amount of time between the encoder "keyup" and "keydown", you can add the following to your `config.h`:
+
+```c
+#define ENCODER_MAP_KEY_DELAY 10
+```
+
+?> By default, the encoder map delay matches the value of `TAP_CODE_DELAY`.
+
## Callbacks
When not using `ENCODER_MAP_ENABLE = yes`, the callback functions can be inserted into your `.c`:
@@ -119,7 +129,7 @@ bool encoder_update_user(uint8_t index, bool clockwise) {
}
```
-!> If you return `true`, it will allow the keyboard level code to run as well. Returning `false` will override the keyboard level code, depending on how the keyboard function is set up.
+!> If you return `true`, it will allow the keyboard level code to run as well. Returning `false` will override the keyboard level code, depending on how the keyboard function is set up.
Layer conditions can also be used with the callback function like the following:
@@ -172,7 +182,7 @@ The A an B lines of the encoders should be wired directly to the MCU, and the C/
Multiple encoders may share pins so long as each encoder has a distinct pair of pins when the following conditions are met:
- using detent encoders
- pads must be high at the detent stability point which is called 'default position' in QMK
-- no more than two encoders sharing a pin can be turned at the same time
+- no more than two encoders sharing a pin can be turned at the same time
For example you can support two encoders using only 3 pins like this
```
@@ -185,4 +195,4 @@ You could even support three encoders using only three pins (one per encoder) ho
#define ENCODERS_PAD_A { B1, B1, B2 }
#define ENCODERS_PAD_B { B2, B3, B3 }
```
-Here rotating Encoder 0 `B1 B2` and Encoder 1 `B1 B3` could be interpreted as rotating Encoder 2 `B2 B3` or `B3 B2` depending on the timing. This may still be a useful configuration depending on your use case
+Here rotating Encoder 0 `B1 B2` and Encoder 1 `B1 B3` could be interpreted as rotating Encoder 2 `B2 B3` or `B3 B2` depending on the timing. This may still be a useful configuration depending on your use case
diff --git a/docs/feature_haptic_feedback.md b/docs/feature_haptic_feedback.md
index f4546b6914..b456bad736 100644
--- a/docs/feature_haptic_feedback.md
+++ b/docs/feature_haptic_feedback.md
@@ -32,21 +32,21 @@ The following `config.h` settings are available for all types of haptic feedback
Not all keycodes below will work depending on which haptic mechanism you have chosen.
-| Name | Description |
-|-----------|-------------------------------------------------------|
-|`HPT_ON` | Turn haptic feedback on |
-|`HPT_OFF` | Turn haptic feedback off |
-|`HPT_TOG` | Toggle haptic feedback on/off |
-|`HPT_RST` | Reset haptic feedback config to default |
-|`HPT_FBK` | Toggle feedback to occur on keypress, release or both |
-|`HPT_BUZ` | Toggle solenoid buzz on/off |
-|`HPT_MODI` | Go to next DRV2605L waveform |
-|`HPT_MODD` | Go to previous DRV2605L waveform |
-|`HPT_CONT` | Toggle continuous haptic mode on/off |
-|`HPT_CONI` | Increase DRV2605L continous haptic strength |
-|`HPT_COND` | Decrease DRV2605L continous haptic strength |
-|`HPT_DWLI` | Increase Solenoid dwell time |
-|`HPT_DWLD` | Decrease Solenoid dwell time |
+| Key | Aliases | Description |
+|-----------------------------|---------|-------------------------------------------------------|
+|`QK_HAPTIC_ON` |`HF_ON` | Turn haptic feedback on |
+|`QK_HAPTIC_OFF` |`HF_OFF` | Turn haptic feedback off |
+|`QK_HAPTIC_TOGGLE` |`HF_TOGG`| Toggle haptic feedback on/off |
+|`QK_HAPTIC_RESET` |`HF_RST` | Reset haptic feedback config to default |
+|`QK_HAPTIC_FEEDBACK_TOGGLE` |`HF_FDBK`| Toggle feedback to occur on keypress, release or both |
+|`QK_HAPTIC_BUZZ_TOGGLE` |`HF_BUZZ`| Toggle solenoid buzz on/off |
+|`QK_HAPTIC_MODE_NEXT` |`HF_NEXT`| Go to next DRV2605L waveform |
+|`QK_HAPTIC_MODE_PREVIOUS` |`HF_PREV`| Go to previous DRV2605L waveform |
+|`QK_HAPTIC_CONTINUOUS_TOGGLE`|`HF_CONT`| Toggle continuous haptic mode on/off |
+|`QK_HAPTIC_CONTINUOUS_UP` |`HF_CONU`| Increase DRV2605L continous haptic strength |
+|`QK_HAPTIC_CONTINUOUS_DOWN` |`HF_COND`| Decrease DRV2605L continous haptic strength |
+|`QK_HAPTIC_DWELL_UP` |`HF_DWLU`| Increase Solenoid dwell time |
+|`QK_HAPTIC_DWELL_DOWN` |`HF_DWLD`| Decrease Solenoid dwell time |
### Solenoids
@@ -68,8 +68,8 @@ For relay switches, the hardware may already contain all of that ciruitry, and j
|`SOLENOID_DEFAULT_DWELL` | `12` ms |Configures the default dwell time for the switch. |
|`SOLENOID_MIN_DWELL` | `4` ms |Sets the lower limit for the dwell. |
|`SOLENOID_MAX_DWELL` | `100` ms |Sets the upper limit for the dwell. |
-|`SOLENOID_DWELL_STEP_SIZE` | `1` ms |The step size to use when `HPT_DWL*` keycodes are sent. |
-|`SOLENOID_DEFAULT_BUZZ` | `0` (disabled) |On HPT_RST buzz is set "on" if this is "1" |
+|`SOLENOID_DWELL_STEP_SIZE` | `1` ms |The step size to use when `HF_DWL*` keycodes are sent. |
+|`SOLENOID_DEFAULT_BUZZ` | `0` (disabled) |On `HF_RST` buzz is set "on" if this is "1" |
|`SOLENOID_BUZZ_ACTUATED` | `SOLENOID_MIN_DWELL` |Actuated-time when the switch is in buzz mode. |
|`SOLENOID_BUZZ_NONACTUATED` | `SOLENOID_MIN_DWELL` |Non-Actuated-time when the switch is in buzz mode. |
@@ -178,7 +178,7 @@ If haptic feedback is enabled, the keyboard will vibrate to a specific sequence
```
#define DRV_MODE_DEFAULT *sequence name or number*
```
-This will set what sequence HPT_RST will set as the active mode. If not defined, mode will be set to 1 when HPT_RST is pressed.
+This will set what sequence `HF_RST` will set as the active mode. If not defined, mode will be set to 1 when `HF_RST` is pressed.
### DRV2605L Continuous Haptic Mode
diff --git a/docs/feature_joystick.md b/docs/feature_joystick.md
index 2635298587..e60046a3c3 100644
--- a/docs/feature_joystick.md
+++ b/docs/feature_joystick.md
@@ -1,154 +1,228 @@
-## Joystick
+# Joystick :id=joystick
-The keyboard can be made to be recognized as a joystick HID device by the operating system.
+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](adc_driver.md), or can be virtual, so that its value is provided by your code.
-!> Joystick support is not currently available on V-USB devices.
+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.
-The joystick feature provides two services:
- * reading analog input devices (eg. potentiometers)
- * sending gamepad HID reports
+## Usage :id=usage
-Both services can be used without the other, depending on whether you just want to read a device but not send gamepad reports (for volume control for instance)
-or send gamepad reports based on values computed by the keyboard.
-
-### Analog Input
-
-To use analog input you must first enable it in `rules.mk`:
+Add the following to your `rules.mk`:
```make
JOYSTICK_ENABLE = yes
-JOYSTICK_DRIVER = analog # or 'digital'
```
-An analog device such as a potentiometer found on a gamepad's analog axes is based on a [voltage divider](https://en.wikipedia.org/wiki/Voltage_divider).
-It is composed of three connectors linked to the ground, the power input and power output (usually the middle one). The power output holds the voltage that varies based on the position of the cursor,
-which value will be read using your MCU's [ADC](https://en.wikipedia.org/wiki/Analog-to-digital_converter).
-Depending on which pins are already used by your keyboard's matrix, the rest of the circuit can get a little bit more complicated,
-feeding the power input and ground connection through pins and using diodes to avoid bad interactions with the matrix scanning procedures.
+By default the joystick driver is `analog`, but you can change this with:
-### Configuring the Joystick
+```make
+JOYSTICK_DRIVER = digital
+```
-By default, two axes and eight buttons are defined. This can be changed in your `config.h`:
+## Configuration :id=configuration
+
+By default, two axes and eight buttons are defined, with a reported resolution of 8 bits (-127 to +127). This can be changed in your `config.h`:
```c
-// Max 32
+// Min 0, max 32
#define JOYSTICK_BUTTON_COUNT 16
-// Max 6: X, Y, Z, Rx, Ry, Rz
-#define JOYSTICK_AXES_COUNT 3
+// Min 0, max 6: X, Y, Z, Rx, Ry, Rz
+#define JOYSTICK_AXIS_COUNT 3
+// Min 8, max 16
+#define JOYSTICK_AXIS_RESOLUTION 10
```
-When defining axes for your joystick, you have to provide a definition array. You can do this from your keymap.c file.
-A joystick will either be read from an input pin that allows the use of the ADC, or can be virtual, so that its value is provided by your code.
-You have to define an array of type ''joystick_config_t'' and of proper size.
+?> 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.
-There are three ways for your circuit to work with the ADC, that relies on the use of 1, 2 or 3 pins of the MCU:
- * 1 pin: your analog device is directly connected to your device GND and VCC. The only pin used is the ADC pin of your choice.
- * 2 pins: your analog device is powered through a pin that allows toggling it on or off. The other pin is used to read the input value through the ADC.
- * 3 pins: both the power input and ground are connected to pins that must be set to a proper state before reading and restored afterwards.
+### Axes :id=axes
-The configuration of each axis is performed using one of four macros:
- * `JOYSTICK_AXIS_VIRTUAL`: no ADC reading must be performed, that value will be provided by keyboard/keymap-level code
- * `JOYSTICK_AXIS_IN(INPUT_PIN, LOW, REST, HIGH)`: a voltage will be read on the provided pin, which must be an ADC-capable pin.
- * `JOYSTICK_AXIS_IN_OUT(INPUT_PIN, OUTPUT_PIN, LOW, REST, HIGH)`: the provided `OUTPUT_PIN` will be set high before `INPUT_PIN` is read.
- * `JOYSTICK_AXIS_IN_OUT_GROUND(INPUT_PIN, OUTPUT_PIN, GROUND_PIN, LOW, REST, HIGH)`: the `OUTPUT_PIN` will be set high and `GROUND_PIN` will be set low before reading from `INPUT_PIN`.
+When defining axes for your joystick, you must provide a definition array typically in your `keymap.c`.
-In any case where an ADC reading takes place (when `INPUT_PIN` is provided), additional `LOW`, `REST` and `HIGH` parameters are used.
-These implement the calibration of the analog device by defining the range of read values that will be mapped to the lowest, resting position and highest possible value for the axis (-127 to 127).
-In practice, you have to provide the lowest/highest raw ADC reading, and the raw reading at resting position, when no deflection is applied. You can provide inverted `LOW` and `HIGH` to invert the axis.
-
-For instance, an axes configuration can be defined in the following way:
+For instance, the below example configures two axes. The X axis is read from the `A4` pin. With the default axis resolution of 8 bits, the range of values between 900 and 575 are scaled to -127 through 0, and values 575 to 285 are scaled to 0 through 127. The Y axis is configured as a virtual axis, and its value is not read from any pin. Instead, the user must update the axis value programmatically.
```c
-//joystick config
joystick_config_t joystick_axes[JOYSTICK_AXES_COUNT] = {
- [0] = JOYSTICK_AXIS_IN_OUT_GROUND(A4, B0, A7, 900, 575, 285),
- [1] = JOYSTICK_AXIS_VIRTUAL
+ JOYSTICK_AXIS_IN(A4, 900, 575, 285),
+ JOYSTICK_AXIS_VIRTUAL
};
```
-When the ADC reads 900 or higher, the returned axis value will be -127, whereas it will be 127 when the ADC reads 285 or lower. Zero is returned when 575 is read.
+Axes can be configured using one of the following macros:
-In this example, the first axis will be read from the `A4` pin while `B0` is set high and `A7` is set low, using `analogReadPin()`, whereas the second axis will not be read.
+ * `JOYSTICK_AXIS_IN(input_pin, low, rest, high)`
+ The ADC samples the provided pin. `low`, `high` and `rest` correspond to the minimum, maximum, and resting (or centered) analog values of the axis, respectively.
+ * `JOYSTICK_AXIS_IN_OUT(input_pin, output_pin, low, rest, high)`
+ Same as `JOYSTICK_AXIS_IN()`, but the provided `output_pin` will be pulled high before `input_pin` is read.
+ * `JOYSTICK_AXIS_IN_OUT_GROUND(input_pin, output_pin, ground_pin, low, rest, high)`
+ Same as `JOYSTICK_AXIS_IN_OUT()`, but the provided `ground_pin` will be pulled low before reading from `input_pin`.
+ * `JOYSTICK_AXIS_VIRTUAL`
+ No ADC reading is performed. The value should be provided by user code.
-In order to give a value to the second axis, you can do so in any customizable entry point: as an action, in `process_record_user()` or in `matrix_scan_user()`, or even in `joystick_task()` which is called even when no key has been pressed.
-You assign a value by writing to `joystick_status.axes[axis_index]` a signed 8-bit value (ranging from -127 to 127). Then it is necessary to assign the flag `JS_UPDATED` to `joystick_status.status` in order for an updated HID report to be sent.
+The `low` and `high` values can be swapped to effectively invert the axis.
-The following example writes two axes based on keypad presses, with `KC_P5` as a precision modifier:
+#### Virtual Axes :id=virtual-axes
+
+The following example adjusts two virtual axes (X and Y) based on keypad presses, with `KC_P0` as a precision modifier:
```c
-#ifdef ANALOG_JOYSTICK_ENABLE
-static uint8_t precision_val = 70;
-static uint8_t axesFlags = 0;
-enum axes {
- Precision = 1,
- Axis1High = 2,
- Axis1Low = 4,
- Axis2High = 8,
- Axis2Low = 16
+joystick_config_t joystick_axes[JOYSTICK_AXES_COUNT] = {
+ JOYSTICK_AXIS_VIRTUAL, // x
+ JOYSTICK_AXIS_VIRTUAL // y
};
-#endif
+
+static bool precision = false;
+static uint16_t precision_mod = 64;
+static uint16_t axis_val = 127;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
- switch(keycode) {
-#ifdef ANALOG_JOYSTICK_ENABLE
- // virtual joystick
-# if JOYSTICK_AXES_COUNT > 1
+ int16_t precision_val = axis_val;
+ if (precision) {
+ precision_val -= precision_mod;
+ }
+
+ switch (keycode) {
case KC_P8:
- if (record->event.pressed) {
- axesFlags |= Axis2Low;
- } else {
- axesFlags &= ~Axis2Low;
- }
- joystick_status.status |= JS_UPDATED;
- break;
+ joystick_set_axis(1, record->event.pressed ? -precision_val : 0);
+ return false;
case KC_P2:
- if (record->event.pressed) {
- axesFlags |= Axis2High;
- } else {
- axesFlags &= ~Axis2High;
- }
- joystick_status.status |= JS_UPDATED;
- break;
-# endif
+ joystick_set_axis(1, record->event.pressed ? precision_val : 0);
+ return false;
case KC_P4:
- if (record->event.pressed) {
- axesFlags |= Axis1Low;
- } else {
- axesFlags &= ~Axis1Low;
- }
- joystick_status.status |= JS_UPDATED;
- break;
+ joystick_set_axis(0, record->event.pressed ? -precision_val : 0);
+ return false;
case KC_P6:
- if (record->event.pressed) {
- axesFlags |= Axis1High;
- } else {
- axesFlags &= ~Axis1High;
- }
- joystick_status.status |= JS_UPDATED;
- break;
- case KC_P5:
- if (record->event.pressed) {
- axesFlags |= Precision;
- } else {
- axesFlags &= ~Precision;
- }
- joystick_status.status |= JS_UPDATED;
- break;
-#endif
+ joystick_set_axis(0, record->event.pressed ? precision_val : 0);
+ return false;
+ case KC_P0:
+ precision = record->event.pressed;
+ return false;
}
return true;
}
```
-### Axis Resolution
+## Keycodes :id=keycodes
-By default, the resolution of each axis is 8 bit, giving a range of -127 to +127. If you need higher precision, you can increase it by defining eg. `JOYSTICK_AXES_RESOLUTION 12` in your `config.h`. The resolution must be between 8 and 16.
+|Key |Aliases|Description|
+|-----------------------|-------|-----------|
+|`QK_JOYSTICK_BUTTON_0` |`JS_0` |Button 0 |
+|`QK_JOYSTICK_BUTTON_1` |`JS_1` |Button 1 |
+|`QK_JOYSTICK_BUTTON_2` |`JS_2` |Button 2 |
+|`QK_JOYSTICK_BUTTON_3` |`JS_3` |Button 3 |
+|`QK_JOYSTICK_BUTTON_4` |`JS_4` |Button 4 |
+|`QK_JOYSTICK_BUTTON_5` |`JS_5` |Button 5 |
+|`QK_JOYSTICK_BUTTON_6` |`JS_6` |Button 6 |
+|`QK_JOYSTICK_BUTTON_7` |`JS_7` |Button 7 |
+|`QK_JOYSTICK_BUTTON_8` |`JS_8` |Button 8 |
+|`QK_JOYSTICK_BUTTON_9` |`JS_9` |Button 9 |
+|`QK_JOYSTICK_BUTTON_10`|`JS_10`|Button 10 |
+|`QK_JOYSTICK_BUTTON_11`|`JS_11`|Button 11 |
+|`QK_JOYSTICK_BUTTON_12`|`JS_12`|Button 12 |
+|`QK_JOYSTICK_BUTTON_13`|`JS_13`|Button 13 |
+|`QK_JOYSTICK_BUTTON_14`|`JS_14`|Button 14 |
+|`QK_JOYSTICK_BUTTON_15`|`JS_15`|Button 15 |
+|`QK_JOYSTICK_BUTTON_16`|`JS_16`|Button 16 |
+|`QK_JOYSTICK_BUTTON_17`|`JS_17`|Button 17 |
+|`QK_JOYSTICK_BUTTON_18`|`JS_18`|Button 18 |
+|`QK_JOYSTICK_BUTTON_19`|`JS_19`|Button 19 |
+|`QK_JOYSTICK_BUTTON_20`|`JS_20`|Button 20 |
+|`QK_JOYSTICK_BUTTON_21`|`JS_21`|Button 21 |
+|`QK_JOYSTICK_BUTTON_22`|`JS_22`|Button 22 |
+|`QK_JOYSTICK_BUTTON_23`|`JS_23`|Button 23 |
+|`QK_JOYSTICK_BUTTON_24`|`JS_24`|Button 24 |
+|`QK_JOYSTICK_BUTTON_25`|`JS_25`|Button 25 |
+|`QK_JOYSTICK_BUTTON_26`|`JS_26`|Button 26 |
+|`QK_JOYSTICK_BUTTON_27`|`JS_27`|Button 27 |
+|`QK_JOYSTICK_BUTTON_28`|`JS_28`|Button 28 |
+|`QK_JOYSTICK_BUTTON_29`|`JS_29`|Button 29 |
+|`QK_JOYSTICK_BUTTON_30`|`JS_30`|Button 30 |
+|`QK_JOYSTICK_BUTTON_31`|`JS_31`|Button 31 |
-Note that the supported AVR MCUs have a 10-bit ADC, and 12-bit for most STM32 MCUs.
+## API :id=api
-### Triggering Joystick Buttons
+### `struct joystick_t` :id=api-joystick-t
-Joystick buttons are normal Quantum keycodes, defined as `JS_BUTTON0` to `JS_BUTTON31`, depending on the number of buttons you have configured.
-To trigger a joystick button, just add the corresponding keycode to your keymap.
+Contains the state of the joystick.
-You can also trigger joystick buttons in code with `register_joystick_button(button)` and `unregister_joystick_button(button)`, where `button` is the 0-based button index (0 = button 1).
+#### Members :id=api-joystick-t-members
+
+ - `uint8_t buttons[]`
+ A bit-packed array containing the joystick button states. The size is calculated as `(JOYSTICK_BUTTON_COUNT - 1) / 8 + 1`.
+ - `int16_t axes[]`
+ An array of analog values for each defined axis.
+ - `bool dirty`
+ Whether the current state needs to be sent to the host.
+
+---
+
+### `struct joystick_config_t` :id=api-joystick-config-t
+
+Describes a single axis.
+
+#### Members :id=api-joystick-config-t-members
+
+ - `pin_t output_pin`
+ A pin to set as output high when reading the analog value, or `JS_VIRTUAL_AXIS`.
+ - `pin_t input_pin`
+ The pin to read the analog value from, or `JS_VIRTUAL_AXIS`.
+ - `pin_t ground_pin`
+ A pin to set as output low when reading the analog value, or `JS_VIRTUAL_AXIS`.
+ - `uint16_t min_digit`
+ The minimum analog value.
+ - `uint16_t mid_digit`
+ The resting or midpoint analog value.
+ - `uint16_t max_digit`
+ The maximum analog value.
+
+---
+
+### `void joystick_flush(void)` :id=api-joystick-flush
+
+Send the joystick report to the host, if it has been marked as dirty.
+
+---
+
+### `void register_joystick_button(uint8_t button)` :id=api-register-joystick-button
+
+Set the state of a button, and flush the report.
+
+#### Arguments :id=api-register-joystick-button-arguments
+
+ - `uint8_t button`
+ The index of the button to press, from 0 to 31.
+
+---
+
+### `void register_joystick_button(uint8_t button)` :id=api-unregister-joystick-button
+
+Reset the state of a button, and flush the report.
+
+#### Arguments :id=api-unregister-joystick-button-arguments
+
+ - `uint8_t button`
+ The index of the button to release, from 0 to 31.
+
+---
+
+### `int16_t joystick_read_axis(uint8_t axis)` :id=api-joystick-read-axis
+
+Sample and process the analog value of the given axis.
+
+#### Arguments :id=api-joystick-read-axis-arguments
+
+ - `uint8_t axis`
+ The axis to read.
+
+#### Return Value :id=api-joystick-read-axis-return
+
+A signed 16-bit integer, where 0 is the resting or mid point.
+
+### `void joystick_set_axis(uint8_t axis, int16_t value)` :id=api-joystick-set-axis
+
+Set the value of the given axis.
+
+#### Arguments :id=api-joystick-set-axis-arguments
+
+ - `uint8_t axis`
+ The axis to set the value of.
+ - `int16_t value`
+ The value to set.
diff --git a/docs/feature_key_lock.md b/docs/feature_key_lock.md
index 7681394229..1acee524da 100644
--- a/docs/feature_key_lock.md
+++ b/docs/feature_key_lock.md
@@ -2,21 +2,21 @@
Sometimes you may find yourself needing to hold down a specific key for a long period of time. Key Lock holds down the next key you press for you. Press it again, and it will be released.
-Let's say you need to type in ALL CAPS for a few sentences. Hit `KC_LOCK`, and then Shift. Now, Shift will be considered held until you tap it again. You can think of Key Lock as Caps Lock, but supercharged.
+Let's say you need to type in ALL CAPS for a few sentences. Hit `QK_LOCK`, and then Shift. Now, Shift will be considered held until you tap it again. You can think of Key Lock as Caps Lock, but supercharged.
## Usage
-First, enable Key Lock by setting `KEY_LOCK_ENABLE = yes` in your `rules.mk`. Then pick a key in your keymap and assign it the keycode `KC_LOCK`.
+First, enable Key Lock by setting `KEY_LOCK_ENABLE = yes` in your `rules.mk`. Then pick a key in your keymap and assign it the keycode `QK_LOCK`.
## Keycodes
|Keycode |Description |
|---------|--------------------------------------------------------------|
-|`KC_LOCK`|Hold down the next key pressed, until the key is pressed again|
+|`QK_LOCK`|Hold down the next key pressed, until the key is pressed again|
## Caveats
-Key Lock is only able to hold standard action keys and [One Shot modifier](one_shot_keys.md) keys (for example, if you have your Shift defined as `OSM(KC_LSFT)`).
+Key Lock is only able to hold standard action keys and [One Shot modifier](one_shot_keys.md) keys (for example, if you have your Shift defined as `OSM(MOD_LSFT)`).
This does not include any of the QMK special functions (except One Shot modifiers), or shifted versions of keys such as `KC_LPRN`. If it's in the [Basic Keycodes](keycodes_basic.md) list, it can be held.
Switching layers will not cancel the Key Lock. The Key Lock can be cancelled by calling the `cancel_key_lock()` function.
diff --git a/docs/feature_key_overrides.md b/docs/feature_key_overrides.md
index 2417fcf594..36fd383cd4 100644
--- a/docs/feature_key_overrides.md
+++ b/docs/feature_key_overrides.md
@@ -150,15 +150,13 @@ const key_override_t fn_override = {.trigger_mods = MOD_BIT(KC_RGUI) |
.enabled = NULL};
```
-## Keycodes
+## Keycodes
-You can enable, disable and toggle all key overrides on the fly.
-
-|Keycode |Description |Function Equivalent|
-|----------|---------------------------------|--------|
-|`KEY_OVERRIDE_ON` |Turns on Key Override feature | `key_override_on(void)`|
-|`KEY_OVERRIDE_OFF` |Turns off Key Override feature |`key_override_off(void)`|
-|`KEY_OVERRIDE_TOGGLE` |Toggles Key Override feature on and off |`key_override_toggle(void)`|
+|Keycode |Aliases |Description |
+|------------------------|---------|----------------------|
+|`QK_KEY_OVERRIDE_TOGGLE`|`KO_TOGG`|Toggle key overrides |
+|`QK_KEY_OVERRIDE_ON` |`KO_ON` |Turn on key overrides |
+|`QK_KEY_OVERRIDE_OFF` |`KO_OFF` |Turn off key overrides|
## Reference for `key_override_t`
diff --git a/docs/feature_layers.md b/docs/feature_layers.md
index e30c540a79..5ad4005f5d 100644
--- a/docs/feature_layers.md
+++ b/docs/feature_layers.md
@@ -1,6 +1,6 @@
# Layers :id=layers
-One of the most powerful and well used features of QMK Firmware is the ability to use layers. For most people, this amounts to a function key that allows for different keys, much like what you would see on a laptop or tablet keyboard.
+One of the most powerful and well used features of QMK Firmware is the ability to use layers. For most people, this amounts to a function key that allows for different keys, much like what you would see on a laptop or tablet keyboard.
For a detailed explanation of how the layer stack works, checkout [Keymap Overview](keymap.md#keymap-and-layers).
@@ -9,7 +9,7 @@ For a detailed explanation of how the layer stack works, checkout [Keymap Overvi
These functions allow you to activate layers in various ways. Note that layers are not generally independent layouts -- multiple layers can be activated at once, and it's typical for layers to use `KC_TRNS` to allow keypresses to pass through to lower layers. When using momentary layer switching with MO(), LM(), TT(), or LT(), make sure to leave the key on the above layers transparent or it may not work as intended.
* `DF(layer)` - switches the default layer. The default layer is the always-active base layer that other layers stack on top of. See below for more about the default layer. This might be used to switch from QWERTY to Dvorak layout. (Note that this is a temporary switch that only persists until the keyboard loses power. To modify the default layer in a persistent way requires deeper customization, such as calling the `set_single_persistent_default_layer` function inside of [process_record_user](custom_quantum_functions.md#programming-the-behavior-of-any-keycode).)
-* `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 and the left modifiers: `MOD_LCTL`, `MOD_LSFT`, `MOD_LALT`, `MOD_LGUI` (note the use of `MOD_` constants instead of `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.
* `OSL(layer)` - momentarily activates *layer* until the next key is pressed. See [One Shot Keys](one_shot_keys.md) for details and additional functionality.
@@ -31,7 +31,7 @@ Care must be taken when switching layers, it's possible to lock yourself into a
If you are just getting started with QMK you will want to keep everything simple. Follow these guidelines when setting up your layers:
-* Setup layer 0 as your default, "base" layer. This is your normal typing layer, and could be whatever layout you want (qwerty, dvorak, colemak, etc.). It's important to set this as the lowest layer since it will typically have most or all of the keyboard's keys defined, so would block other layers from having any effect if it were above them (i.e., had a higher layer number).
+* Setup layer 0 as your default, "base" layer. This is your normal typing layer, and could be whatever layout you want (qwerty, dvorak, colemak, etc.). It's important to set this as the lowest layer since it will typically have most or all of the keyboard's keys defined, so would block other layers from having any effect if it were above them (i.e., had a higher layer number).
* Arrange your layers in a "tree" layout, with layer 0 as the root. Do not try to enter the same layer from more than one other layer.
* In a layer's keymap, only reference higher-numbered layers. Because layers are processed from the highest-numbered (topmost) active layer down, modifying the state of lower layers can be tricky and error-prone.
@@ -89,3 +89,46 @@ It is also possible to check the state of a particular layer using the following
|---------------------------------|-------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------|
| `layer_state_is(layer)` | Checks if the specified `layer` is enabled globally. | `IS_LAYER_ON(layer)`, `IS_LAYER_OFF(layer)` |
| `layer_state_cmp(state, layer)` | Checks `state` to see if the specified `layer` is enabled. Intended for use in layer callbacks. | `IS_LAYER_ON_STATE(state, layer)`, `IS_LAYER_OFF_STATE(state, layer)` |
+
+## Layer Change Code :id=layer-change-code
+
+This runs code every time that the layers get changed. This can be useful for layer indication, or custom layer handling.
+
+### Example `layer_state_set_*` Implementation
+
+This example shows how to set the [RGB Underglow](feature_rgblight.md) lights based on the layer, using the Planck as an example.
+
+```c
+layer_state_t layer_state_set_user(layer_state_t state) {
+ switch (get_highest_layer(state)) {
+ case _RAISE:
+ rgblight_setrgb (0x00, 0x00, 0xFF);
+ break;
+ case _LOWER:
+ rgblight_setrgb (0xFF, 0x00, 0x00);
+ break;
+ case _PLOVER:
+ rgblight_setrgb (0x00, 0xFF, 0x00);
+ break;
+ case _ADJUST:
+ rgblight_setrgb (0x7A, 0x00, 0xFF);
+ break;
+ default: // for any other layers, or the default layer
+ rgblight_setrgb (0x00, 0xFF, 0xFF);
+ break;
+ }
+ return state;
+}
+```
+
+Use the `IS_LAYER_ON_STATE(state, layer)` and `IS_LAYER_OFF_STATE(state, layer)` macros to check the status of a particular layer.
+
+Outside of `layer_state_set_*` functions, you can use the `IS_LAYER_ON(layer)` and `IS_LAYER_OFF(layer)` macros to check global layer state.
+
+### `layer_state_set_*` Function Documentation
+
+* Keyboard/Revision: `layer_state_t layer_state_set_kb(layer_state_t state)`
+* Keymap: `layer_state_t layer_state_set_user(layer_state_t state)`
+
+
+The `state` is the bitmask of the active layers, as explained in the [Keymap Overview](keymap.md#keymap-layer-status)
diff --git a/docs/feature_leader_key.md b/docs/feature_leader_key.md
index e5b1e7a4d9..e285d10597 100644
--- a/docs/feature_leader_key.md
+++ b/docs/feature_leader_key.md
@@ -2,11 +2,11 @@
If you've ever used Vim, you know what a Leader key is. If not, you're about to discover a wonderful concept. :) Instead of hitting Alt+Shift+W for example (holding down three keys at the same time), what if you could hit a _sequence_ of keys instead? So you'd hit our special modifier (the Leader key), followed by W and then C (just a rapid succession of keys), and something would happen.
-That's what `KC_LEAD` does. Here's an example:
+That's what `QK_LEAD` does. Here's an example:
-1. Pick a key on your keyboard you want to use as the Leader key. Assign it the keycode `KC_LEAD`. This key would be dedicated just for this -- it's a single action key, can't be used for anything else.
-2. Include the line `#define LEADER_TIMEOUT 300` in your `config.h`. This sets the timeout for the `KC_LEAD` key. Specifically, when you press the `KC_LEAD` key, you only have a certain amount of time to complete the Leader Key sequence. The `300` here sets that to 300ms, and you can increase this value to give you more time to hit the sequence. But any keys pressed during this timeout are intercepted and not sent, so you may want to keep this value low.
- * By default, this timeout is how long after pressing `KC_LEAD` to complete your entire sequence. This may be very low for some people. So you may want to increase this timeout. Optionally, you may want to enable the `LEADER_PER_KEY_TIMING` option, which resets the timeout after each key is tapped. This allows you to maintain a low value here, but still be able to use the longer sequences. To enable this option, add `#define LEADER_PER_KEY_TIMING` to your `config.h`.
+1. Pick a key on your keyboard you want to use as the Leader key. Assign it the keycode `QK_LEAD`. This key would be dedicated just for this -- it's a single action key, can't be used for anything else.
+2. Include the line `#define LEADER_TIMEOUT 300` in your `config.h`. This sets the timeout for the `QK_LEAD` key. Specifically, when you press the `QK_LEAD` key, you only have a certain amount of time to complete the Leader Key sequence. The `300` here sets that to 300ms, and you can increase this value to give you more time to hit the sequence. But any keys pressed during this timeout are intercepted and not sent, so you may want to keep this value low.
+ * By default, this timeout is how long after pressing `QK_LEAD` to complete your entire sequence. This may be very low for some people. So you may want to increase this timeout. Optionally, you may want to enable the `LEADER_PER_KEY_TIMING` option, which resets the timeout after each key is tapped. This allows you to maintain a low value here, but still be able to use the longer sequences. To enable this option, add `#define LEADER_PER_KEY_TIMING` to your `config.h`.
3. Within your `matrix_scan_user` function, add something like this:
```c
@@ -95,7 +95,7 @@ While, this may be fine for most, if you want to specify the whole keycode (eg,
The Leader Key feature has some additional customization to how the Leader Key feature works. It has two functions that can be called at certain parts of the process. Namely `leader_start()` and `leader_end()`.
-The `leader_start()` function is called when you tap the `KC_LEAD` key, and the `leader_end()` function is called when either the leader sequence is completed, or the leader timeout is hit.
+The `leader_start()` function is called when you tap the `QK_LEAD` key, and the `leader_end()` function is called when either the leader sequence is completed, or the leader timeout is hit.
You can add these functions to your code (`keymap.c` usually) to add feedback to the Leader sequences (such as beeping or playing music).
@@ -111,7 +111,7 @@ void leader_end(void) {
### Example
-This example will play the Mario "One Up" sound when you hit `KC_LEAD` to start the Leader Sequence, and will play "All Star" if it completes successfully or "Rick Roll" you if it fails.
+This example will play the Mario "One Up" sound when you hit `QK_LEAD` to start the Leader Sequence, and will play "All Star" if it completes successfully or "Rick Roll" you if it fails.
```c
bool did_leader_succeed;
diff --git a/docs/feature_led_indicators.md b/docs/feature_led_indicators.md
index a2a2e17c6f..d89562a377 100644
--- a/docs/feature_led_indicators.md
+++ b/docs/feature_led_indicators.md
@@ -101,6 +101,13 @@ The `host_keyboard_led_state()` function will report the LED state returned from
bool caps = host_keyboard_led_state().caps_lock;
```
+## `led_update_ports()`
+
+This function writes the LED state to the actual hardware. Call it manually
+from your `led_update_*()` callbacks to modify the handling of the standard
+keyboard LEDs.
+For example when repurposing a standard LED indicator as layer indicator.
+
## Setting Physical LED State
Some keyboard implementations provide convenient methods for setting the state of the physical LEDs.
diff --git a/docs/feature_led_matrix.md b/docs/feature_led_matrix.md
index 563fa149a2..b91a47ae43 100644
--- a/docs/feature_led_matrix.md
+++ b/docs/feature_led_matrix.md
@@ -22,7 +22,7 @@ You can use between 1 and 4 IS31FL3731 IC's. Do not specify `LED_DRIVER_ADDR_
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
| `LED_DRIVER_COUNT` | (Required) How many LED driver IC's are present | |
-| `DRIVER_LED_TOTAL` | (Required) How many LED lights are present across all drivers | |
+| `LED_MATRIX_LED_COUNT` | (Required) How many LED lights are present across all drivers | |
| `LED_DRIVER_ADDR_1` | (Required) Address for the first LED driver | |
| `LED_DRIVER_ADDR_2` | (Optional) Address for the second LED driver | |
| `LED_DRIVER_ADDR_3` | (Optional) Address for the third LED driver | |
@@ -44,17 +44,17 @@ Here is an example using 2 drivers.
#define LED_DRIVER_COUNT 2
#define LED_DRIVER_1_LED_TOTAL 25
#define LED_DRIVER_2_LED_TOTAL 24
-#define DRIVER_LED_TOTAL (LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL)
+#define LED_MATRIX_LED_COUNT (LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL)
```
-!> Note the parentheses, this is so when `LED_DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL)` will give very different results than `rand() % LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL`.
+!> Note the parentheses, this is so when `LED_MATRIX_LED_COUNT` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL)` will give very different results than `rand() % LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL`.
For split keyboards using `LED_MATRIX_SPLIT` with an LED driver, you can either have the same driver address or different driver addresses. If using different addresses, use `DRIVER_ADDR_1` for one and `DRIVER_ADDR_2` for the other one. Then, in `g_is31_leds`, fill out the correct driver index (0 or 1). If using one address, use `DRIVER_ADDR_1` for both, and use index 0 for `g_is31_leds`.
Define these arrays listing all the LEDs in your `.c`:
```c
-const is31_led PROGMEM g_is31_leds[DRIVER_LED_TOTAL] = {
+const is31_led PROGMEM g_is31_leds[LED_MATRIX_LED_COUNT] = {
/* Refer to IS31 manual for these locations
* driver
* | LED address
@@ -95,7 +95,7 @@ Configure the hardware via your `config.h`:
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
| `DRIVER_COUNT` | (Required) How many LED driver IC's are present | |
-| `DRIVER_LED_TOTAL` | (Required) How many LED lights are present across all drivers | |
+| `LED_MATRIX_LED_COUNT` | (Required) How many LED lights are present across all drivers | |
| `DRIVER_ADDR_1` | (Optional) Address for the first LED driver | |
| `DRIVER_ADDR_` | (Required) Address for the additional LED drivers | |
| `ISSI_SSR_` | (Optional) Configuration for the Spread Spectrum Register | |
@@ -130,16 +130,16 @@ Here is an example using 2 drivers.
#define DRIVER_COUNT 2
#define DRIVER_1_LED_TOTAL 66
#define DRIVER_2_LED_TOTAL 42
-#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
+#define LED_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
```
-!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
+!> Note the parentheses, this is so when `LED_MATRIX_LED_COUNT` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
Currently only 4 drivers are supported, but it would be trivial to support for more. Note that using a combination of different drivers is not supported. All drivers must be of the same model.
Define these arrays listing all the LEDs in your `.c`:
```c
-const is31_led __flash g_is31_leds[DRIVER_LED_TOTAL] = {
+const is31_led __flash g_is31_leds[LED_MATRIX_LED_COUNT] = {
/* Refer to IS31 manual for these locations
* driver
* | LED address
@@ -199,7 +199,7 @@ x = 224 / (NUMBER_OF_COLS - 1) * COL_POSITION
y = 64 / (NUMBER_OF_ROWS - 1) * ROW_POSITION
```
-Where NUMBER_OF_COLS, NUMBER_OF_ROWS, COL_POSITION, & ROW_POSITION are all based on the physical layout of your keyboard, not the electrical layout.
+Where NUMBER_OF_COLS, NUMBER_OF_ROWS, COL_POSITION, & ROW_POSITION are all based on the physical layout of your keyboard, not the electrical layout.
As mentioned earlier, the center of the keyboard by default is expected to be `{ 112, 32 }`, but this can be changed if you want to more accurately calculate the LED's physical `{ x, y }` positions. Keyboard designers can implement `#define LED_MATRIX_CENTER { 112, 32 }` in their config.h file with the new center point of the keyboard, or where they want it to be allowing more possibilities for the `{ x, y }` values. Do note that the maximum value for x or y is 255, and the recommended maximum is 224 as this gives animations runoff room before they reset.
@@ -221,14 +221,14 @@ As mentioned earlier, the center of the keyboard by default is expected to be `{
All LED matrix keycodes are currently shared with the [Backlight feature](feature_backlight.md).
-|Key |Description |
-|---------|-----------------------------|
-|`BL_TOGG`|Toggle LED Matrix on or off |
-|`BL_STEP`|Cycle through modes |
-|`BL_ON` |Turn on LED Matrix |
-|`BL_OFF` |Turn off LED Matrix |
-|`BL_INC` |Increase the brightness level|
-|`BL_DEC` |Decrease the brightness level|
+| Key | Aliases | Description |
+|-------------------------|-----------|-------------------------------|
+| `QK_BACKLIGHT_TOGGLE` | `BL_TOGG` | Toggle LED Matrix on or off |
+| `QK_BACKLIGHT_STEP` | `BL_STEP` | Cycle through modes |
+| `QK_BACKLIGHT_ON` | `BL_ON` | Turn on LED Matrix |
+| `QK_BACKLIGHT_OFF` | `BL_OFF` | Turn off LED Matrix |
+| `QK_BACKLIGHT_UP` | `BL_UP` | Increase the brightness level |
+| `QK_BACKLIGHT_DOWN` | `BL_DOWN` | Decrease the brightness level |
## LED Matrix Effects :id=led-matrix-effects
@@ -364,15 +364,14 @@ For inspiration and examples, check out the built-in effects under `quantum/led_
#define LED_MATRIX_KEYPRESSES // reacts to keypresses
#define LED_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
#define LED_MATRIX_FRAMEBUFFER_EFFECTS // enable framebuffer effects
-#define LED_DISABLE_TIMEOUT 0 // number of milliseconds to wait until led automatically turns off
-#define LED_DISABLE_AFTER_TIMEOUT 0 // OBSOLETE: number of ticks to wait until disabling effects
+#define LED_MATRIX_TIMEOUT 0 // number of milliseconds to wait until led automatically turns off
#define LED_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
-#define LED_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
+#define LED_MATRIX_LED_PROCESS_LIMIT (LED_MATRIX_LED_COUNT + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
#define LED_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
#define LED_MATRIX_MAXIMUM_BRIGHTNESS 255 // limits maximum brightness of LEDs
-#define LED_MATRIX_STARTUP_MODE LED_MATRIX_SOLID // Sets the default mode, if none has been set
-#define LED_MATRIX_STARTUP_VAL LED_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set
-#define LED_MATRIX_STARTUP_SPD 127 // Sets the default animation speed, 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_SPD 127 // Sets the default animation speed, if none has been set
#define LED_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
// If LED_MATRIX_KEYPRESSES or LED_MATRIX_KEYRELEASES is enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
```
@@ -391,7 +390,7 @@ Where `28` is an unused index from `eeconfig.h`.
|Function |Description |
|--------------------------------------------|-------------|
|`led_matrix_set_value_all(v)` |Set all of the LEDs to the given value, where `v` is between 0 and 255 (not written to EEPROM) |
-|`led_matrix_set_value(index, v)` |Set a single LED to the given value, where `v` is between 0 and 255, and `index` is between 0 and `DRIVER_LED_TOTAL` (not written to EEPROM) |
+|`led_matrix_set_value(index, v)` |Set a single LED to the given value, where `v` is between 0 and 255, and `index` is between 0 and `LED_MATRIX_LED_COUNT` (not written to EEPROM) |
### Disable/Enable Effects :id=disable-enable-effects
|Function |Description |
@@ -440,10 +439,14 @@ Where `28` is an unused index from `eeconfig.h`.
### Indicators :id=indicators
-If you want to set custom indicators, such as an LED for Caps Lock, or layer indication, you can use the `led_matrix_indicators_kb` or `led_matrix_indicators_user` function for that:
+If you want to set custom indicators, such as an LED for Caps Lock, or layer indication, you can use the `led_matrix_indicators_kb` or `led_matrix_indicators_user` function for that:
```c
-void led_matrix_indicators_kb(void) {
+bool led_matrix_indicators_kb(void) {
+ if (!led_matrix_indicators_user()) {
+ return false;
+ }
led_matrix_set_value(index, value);
+ return true;
}
```
@@ -452,5 +455,6 @@ In addition, there are the advanced indicator functions. These are aimed at tho
```c
void led_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
LED_MATRIX_INDICATOR_SET_VALUE(index, value);
+ return false;
}
```
diff --git a/docs/feature_macros.md b/docs/feature_macros.md
index 78bc4ba0a5..08310555fb 100644
--- a/docs/feature_macros.md
+++ b/docs/feature_macros.md
@@ -33,7 +33,7 @@ You can define up to 32 macros in a `keymap.json` file, as used by [Configurator
],
"layout": "LAYOUT_all",
"layers": [
- ["MACRO_0", "MACRO_1", "MACRO_2", "MACRO_3"]
+ ["QK_MACRO_0", "QK_MACRO_1", "QK_MACRO_2", "QK_MACRO_3"]
]
}
```
@@ -52,7 +52,7 @@ If you type in a language other than English, or use a non-QWERTY layout like Co
],
"layout": "LAYOUT_all",
"layers": [
- ["MACRO_0"]
+ ["QK_MACRO_0"]
]
}
```
@@ -106,6 +106,8 @@ Only basic keycodes (prefixed by `KC_`) are supported. Do not include the `KC_`
### `SEND_STRING()` & `process_record_user`
+See also: [Send String](feature_send_string.md)
+
Sometimes you want a key to type out words or phrases. For the most common situations, we've provided `SEND_STRING()`, which will type out a string (i.e. a sequence of characters) for you. All ASCII characters that are easily translatable to a keycode are supported (e.g. `qmk 123\n\t`).
Here is an example `keymap.c` for a two-key keyboard:
@@ -197,7 +199,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
#### Advanced Macros
-In addition to the `process_record_user()` function, is the `post_process_record_user()` function. This runs after `process_record` and can be used to do things after a keystroke has been sent. This is useful if you want to have a key pressed before and released after a normal key, for instance.
+In addition to the `process_record_user()` function, is the `post_process_record_user()` function. This runs after `process_record` and can be used to do things after a keystroke has been sent. This is useful if you want to have a key pressed before and released after a normal key, for instance.
In this example, we modify most normal keypresses so that `F22` is pressed before the keystroke is normally sent, and release it __only after__ it's been released.
@@ -347,7 +349,7 @@ If the keycode is `KC_CAPS`, it waits `TAP_HOLD_CAPS_DELAY` milliseconds instead
Like `tap_code()`, but with a `delay` parameter for specifying arbitrary intervals before sending the unregister event.
-#### `register_code16();`, `unregister_code16();` and `tap_code16();`
+#### `register_code16();`, `unregister_code16();`, `tap_code16();` and `tap_code16_delay(, );`
These functions work similar to their regular counterparts, but allow you to use modded keycodes (with Shift, Alt, Control, and/or GUI applied to them).
@@ -372,7 +374,7 @@ This will clear all keys besides the mods currently pressed.
This macro will register `KC_LALT` and tap `KC_TAB`, then wait for 1000ms. If the key is tapped again, it will send another `KC_TAB`; if there is no tap, `KC_LALT` will be unregistered, thus allowing you to cycle through windows.
```c
-bool is_alt_tab_active = false; // ADD this near the begining of keymap.c
+bool is_alt_tab_active = false; // ADD this near the beginning of keymap.c
uint16_t alt_tab_timer = 0; // we will be using them soon.
enum custom_keycodes { // Make sure have the awesome keycode ready
diff --git a/docs/feature_midi.md b/docs/feature_midi.md
index 7823b66113..1f0809ef14 100644
--- a/docs/feature_midi.md
+++ b/docs/feature_midi.md
@@ -80,164 +80,164 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
### Keycodes
-|Keycode |Aliases |Description |
-|------------|---------|---------------------------------|
-|`MI_ON` | |Turn MIDI on |
-|`MI_OFF` | |Turn MIDI off |
-|`MI_TOG` | |Toggle MIDI enabled |
-|`MI_C` | |C octave 0 |
-|`MI_Cs` |`MI_Db` |C♯/D♭ octave 0 |
-|`MI_D` | |D octave 0 |
-|`MI_Ds` |`MI_Eb` |D♯/E♭ octave 0 |
-|`MI_E` | |E octave 0 |
-|`MI_F` | |F octave 0 |
-|`MI_Fs` |`MI_Gb` |F♯/G♭ octave 0 |
-|`MI_G` | |G octave 0 |
-|`MI_Gs` |`MI_Gs` |G♯/A♭ octave 0 |
-|`MI_A` | |A octave 0 |
-|`MI_As` |`MI_Bb` |A♯/B♭ octave 0 |
-|`MI_B` | |B octave 0 |
-|`MI_C_1` | |C octave 1 |
-|`MI_Cs_1` |`MI_Db_1`|C♯/D♭ octave 1 |
-|`MI_D_1` | |D octave 1 |
-|`MI_Ds_1` |`MI_Eb_1`|D♯/E♭ octave 1 |
-|`MI_E_1` | |E octave 1 |
-|`MI_F_1` | |F octave 1 |
-|`MI_Fs_1` |`MI_Gb_1`|F♯/G♭ octave 1 |
-|`MI_G_1` | |G octave 1 |
-|`MI_Gs_1` |`MI_Ab_1`|G♯/A♭ octave 1 |
-|`MI_A_1` | |A octave 1 |
-|`MI_As_1` |`MI_Bb_1`|A♯/B♭ octave 1 |
-|`MI_B_1` | |B octave 1 |
-|`MI_C_2` | |C octave 2 |
-|`MI_Cs_2` |`MI_Db_2`|C♯/D♭ octave 2 |
-|`MI_D_2` | |D octave 2 |
-|`MI_Ds_2` |`MI_Eb_2`|D♯/E♭ octave 2 |
-|`MI_E_2` | |E octave 2 |
-|`MI_F_2` | |F octave 2 |
-|`MI_Fs_2` |`MI_Gb_2`|F♯/G♭ octave 2 |
-|`MI_G_2` | |G octave 2 |
-|`MI_Gs_2` |`MI_Ab_2`|G♯/A♭ octave 2 |
-|`MI_A_2` | |A octave 2 |
-|`MI_As_2` |`MI_Bb_2`|A♯/B♭ octave 2 |
-|`MI_B_2` | |B octave 2 |
-|`MI_C_3` | |C octave 3 |
-|`MI_Cs_3` |`MI_Db_3`|C♯/D♭ octave 3 |
-|`MI_D_3` | |D octave 3 |
-|`MI_Ds_3` |`MI_Eb_3`|D♯/E♭ octave 3 |
-|`MI_E_3` | |E octave 3 |
-|`MI_F_3` | |F octave 3 |
-|`MI_Fs_3` |`MI_Gb_3`|F♯/G♭ octave 3 |
-|`MI_G_3` | |G octave 3 |
-|`MI_Gs_3` |`MI_Ab_3`|G♯/A♭ octave 3 |
-|`MI_A_3` | |A octave 3 |
-|`MI_As_3` |`MI_Bb_3`|A♯/B♭ octave 3 |
-|`MI_B_3` | |B octave 3 |
-|`MI_C_4` | |C octave 4 |
-|`MI_Cs_4` |`MI_Db_4`|C♯/D♭ octave 4 |
-|`MI_D_4` | |D octave 4 |
-|`MI_Ds_4` |`MI_Eb_4`|D♯/E♭ octave 4 |
-|`MI_E_4` | |E octave 4 |
-|`MI_F_4` | |F octave 4 |
-|`MI_Fs_4` |`MI_Gb_4`|F♯/G♭ octave 4 |
-|`MI_G_4` | |G octave 4 |
-|`MI_Gs_4` |`MI_Ab_4`|G♯/A♭ octave 4 |
-|`MI_A_4` | |A octave 4 |
-|`MI_As_4` |`MI_Bb_4`|A♯/B♭ octave 4 |
-|`MI_B_4` | |B octave 4 |
-|`MI_C_5` | |C octave 5 |
-|`MI_Cs_5` |`MI_Db_5`|C♯/D♭ octave 5 |
-|`MI_D_5` | |D octave 5 |
-|`MI_Ds_5` |`MI_Eb_5`|D♯/E♭ octave 5 |
-|`MI_E_5` | |E octave 5 |
-|`MI_F_5` | |F octave 5 |
-|`MI_Fs_5` |`MI_Gb_5`|F♯/G♭ octave 5 |
-|`MI_G_5` | |G octave 5 |
-|`MI_Gs_5` |`MI_Ab_5`|G♯/A♭ octave 5 |
-|`MI_A_5` | |A octave 5 |
-|`MI_As_5` |`MI_Bb_5`|A♯/B♭ octave 5 |
-|`MI_B_5` | |B octave 5 |
-|`MI_OCT_N2` | |Set octave to -2 |
-|`MI_OCT_N1` | |Set octave to -1 |
-|`MI_OCT_0` | |Set octave to 0 |
-|`MI_OCT_1` | |Set octave to 1 |
-|`MI_OCT_2` | |Set octave to 2 |
-|`MI_OCT_3` | |Set octave to 3 |
-|`MI_OCT_4` | |Set octave to 4 |
-|`MI_OCT_5` | |Set octave to 5 |
-|`MI_OCT_6` | |Set octave to 6 |
-|`MI_OCT_7` | |Set octave to 7 |
-|`MI_OCTD` | |Move down an octave |
-|`MI_OCTU` | |Move up an octave |
-|`MI_TRNS_N6`| |Set transposition to -6 semitones|
-|`MI_TRNS_N5`| |Set transposition to -5 semitones|
-|`MI_TRNS_N4`| |Set transposition to -4 semitones|
-|`MI_TRNS_N3`| |Set transposition to -3 semitones|
-|`MI_TRNS_N2`| |Set transposition to -2 semitones|
-|`MI_TRNS_N1`| |Set transposition to -1 semitone |
-|`MI_TRNS_0` | |No transposition |
-|`MI_TRNS_1` | |Set transposition to +1 semitone |
-|`MI_TRNS_2` | |Set transposition to +2 semitones|
-|`MI_TRNS_3` | |Set transposition to +3 semitones|
-|`MI_TRNS_4` | |Set transposition to +4 semitones|
-|`MI_TRNS_5` | |Set transposition to +5 semitones|
-|`MI_TRNS_6` | |Set transposition to +6 semitones|
-|`MI_TRNSD` | |Decrease transposition |
-|`MI_TRNSU` | |Increase transposition |
-|`MI_VEL_0` | |Set velocity to 0 |
-|`MI_VEL_1` | |Set velocity to 12 |
-|`MI_VEL_2` | |Set velocity to 25 |
-|`MI_VEL_3` | |Set velocity to 38 |
-|`MI_VEL_4` | |Set velocity to 51 |
-|`MI_VEL_5` | |Set velocity to 64 |
-|`MI_VEL_6` | |Set velocity to 76 |
-|`MI_VEL_7` | |Set velocity to 89 |
-|`MI_VEL_8` | |Set velocity to 102 |
-|`MI_VEL_9` | |Set velocity to 114 |
-|`MI_VEL_10` | |Set velocity to 127 |
-|`MI_VELD` | |Decrease velocity |
-|`MI_VELU` | |Increase velocity |
-|`MI_CH1` | |Set channel to 1 |
-|`MI_CH2` | |Set channel to 2 |
-|`MI_CH3` | |Set channel to 3 |
-|`MI_CH4` | |Set channel to 4 |
-|`MI_CH5` | |Set channel to 5 |
-|`MI_CH6` | |Set channel to 6 |
-|`MI_CH7` | |Set channel to 7 |
-|`MI_CH8` | |Set channel to 8 |
-|`MI_CH9` | |Set channel to 9 |
-|`MI_CH10` | |Set channel to 10 |
-|`MI_CH11` | |Set channel to 11 |
-|`MI_CH12` | |Set channel to 12 |
-|`MI_CH13` | |Set channel to 13 |
-|`MI_CH14` | |Set channel to 14 |
-|`MI_CH15` | |Set channel to 15 |
-|`MI_CH16` | |Set channel to 16 |
-|`MI_CHD` | |Decrease channel |
-|`MI_CHU` | |Increase channel |
-|`MI_ALLOFF` | |Stop all notes |
-|`MI_SUS` | |Sustain |
-|`MI_PORT` | |Portmento |
-|`MI_SOST` | |Sostenuto |
-|`MI_SOFT` | |Soft Pedal |
-|`MI_LEG` | |Legato |
-|`MI_MOD` | |Modulation |
-|`MI_MODSD` | |Decrease modulation speed |
-|`MI_MODSU` | |Increase modulation speed |
-|`MI_BENDD` | |Bend pitch down |
-|`MI_BENDU` | |Bend pitch up |
+|Keycode |Aliases |Description |
+|-------------------------------|------------------|---------------------------------|
+|`QK_MIDI_ON` |`MI_ON` |Turn MIDI on |
+|`QK_MIDI_OFF` |`MI_OFF` |Turn MIDI off |
+|`QK_MIDI_TOGGLE` |`MI_TOGG` |Toggle MIDI enabled |
+|`QK_MIDI_NOTE_C_0` |`MI_C` |C octave 0 |
+|`QK_MIDI_NOTE_C_SHARP_0` |`MI_Cs`, `MI_Db` |C♯/D♭ octave 0 |
+|`QK_MIDI_NOTE_D_0` |`MI_D` |D octave 0 |
+|`QK_MIDI_NOTE_D_SHARP_0` |`MI_Ds`, `MI_Eb` |D♯/E♭ octave 0 |
+|`QK_MIDI_NOTE_E_0` |`MI_E` |E octave 0 |
+|`QK_MIDI_NOTE_F_0` |`MI_F` |F octave 0 |
+|`QK_MIDI_NOTE_F_SHARP_0` |`MI_Fs`, `MI_Gb` |F♯/G♭ octave 0 |
+|`QK_MIDI_NOTE_G_0` |`MI_G` |G octave 0 |
+|`QK_MIDI_NOTE_G_SHARP_0` |`MI_Gs`, `MI_Ab` |G♯/A♭ octave 0 |
+|`QK_MIDI_NOTE_A_0` |`MI_A` |A octave 0 |
+|`QK_MIDI_NOTE_A_SHARP_0` |`MI_As`, `MI_Bb` |A♯/B♭ octave 0 |
+|`QK_MIDI_NOTE_B_0` |`MI_B` |B octave 0 |
+|`QK_MIDI_NOTE_C_1` |`MI_C1` |C octave 1 |
+|`QK_MIDI_NOTE_C_SHARP_1` |`MI_Cs1`, `MI_Db1`|C♯/D♭ octave 1 |
+|`QK_MIDI_NOTE_D_1` |`MI_D1` |D octave 1 |
+|`QK_MIDI_NOTE_D_SHARP_1` |`MI_Ds1`, `MI_Eb1`|D♯/E♭ octave 1 |
+|`QK_MIDI_NOTE_E_1` |`MI_E1` |E octave 1 |
+|`QK_MIDI_NOTE_F_1` |`MI_F1` |F octave 1 |
+|`QK_MIDI_NOTE_F_SHARP_1` |`MI_Fs1`, `MI_Gb1`|F♯/G♭ octave 1 |
+|`QK_MIDI_NOTE_G_1` |`MI_G1` |G octave 1 |
+|`QK_MIDI_NOTE_G_SHARP_1` |`MI_Gs1`, `MI_Ab1`|G♯/A♭ octave 1 |
+|`QK_MIDI_NOTE_A_1` |`MI_A1` |A octave 1 |
+|`QK_MIDI_NOTE_A_SHARP_1` |`MI_As1`, `MI_Bb1`|A♯/B♭ octave 1 |
+|`QK_MIDI_NOTE_B_1` |`MI_B1` |B octave 1 |
+|`QK_MIDI_NOTE_C_2` |`MI_C2` |C octave 2 |
+|`QK_MIDI_NOTE_C_SHARP_2` |`MI_Cs2`, `MI_Db2`|C♯/D♭ octave 2 |
+|`QK_MIDI_NOTE_D_2` |`MI_D2` |D octave 2 |
+|`QK_MIDI_NOTE_D_SHARP_2` |`MI_Ds2`, `MI_Eb2`|D♯/E♭ octave 2 |
+|`QK_MIDI_NOTE_E_2` |`MI_E2` |E octave 2 |
+|`QK_MIDI_NOTE_F_2` |`MI_F2` |F octave 2 |
+|`QK_MIDI_NOTE_F_SHARP_2` |`MI_Fs2`, `MI_Gb2`|F♯/G♭ octave 2 |
+|`QK_MIDI_NOTE_G_2` |`MI_G2` |G octave 2 |
+|`QK_MIDI_NOTE_G_SHARP_2` |`MI_Gs2`, `MI_Ab2`|G♯/A♭ octave 2 |
+|`QK_MIDI_NOTE_A_2` |`MI_A2` |A octave 2 |
+|`QK_MIDI_NOTE_A_SHARP_2` |`MI_As2`, `MI_Bb2`|A♯/B♭ octave 2 |
+|`QK_MIDI_NOTE_B_2` |`MI_B2` |B octave 2 |
+|`QK_MIDI_NOTE_C_3` |`MI_C3` |C octave 3 |
+|`QK_MIDI_NOTE_C_SHARP_3` |`MI_Cs3`, `MI_Db3`|C♯/D♭ octave 3 |
+|`QK_MIDI_NOTE_D_3` |`MI_D3` |D octave 3 |
+|`QK_MIDI_NOTE_D_SHARP_3` |`MI_Ds3`, `MI_Eb3`|D♯/E♭ octave 3 |
+|`QK_MIDI_NOTE_E_3` |`MI_E3` |E octave 3 |
+|`QK_MIDI_NOTE_F_3` |`MI_F3` |F octave 3 |
+|`QK_MIDI_NOTE_F_SHARP_3` |`MI_Fs3`, `MI_Gb3`|F♯/G♭ octave 3 |
+|`QK_MIDI_NOTE_G_3` |`MI_G3` |G octave 3 |
+|`QK_MIDI_NOTE_G_SHARP_3` |`MI_Gs3`, `MI_Ab3`|G♯/A♭ octave 3 |
+|`QK_MIDI_NOTE_A_3` |`MI_A3` |A octave 3 |
+|`QK_MIDI_NOTE_A_SHARP_3` |`MI_As3`, `MI_Bb3`|A♯/B♭ octave 3 |
+|`QK_MIDI_NOTE_B_3` |`MI_B3` |B octave 3 |
+|`QK_MIDI_NOTE_C_4` |`MI_C4` |C octave 4 |
+|`QK_MIDI_NOTE_C_SHARP_4` |`MI_Cs4`, `MI_Db4`|C♯/D♭ octave 4 |
+|`QK_MIDI_NOTE_D_4` |`MI_D4` |D octave 4 |
+|`QK_MIDI_NOTE_D_SHARP_4` |`MI_Ds4`, `MI_Eb4`|D♯/E♭ octave 4 |
+|`QK_MIDI_NOTE_E_4` |`MI_E4` |E octave 4 |
+|`QK_MIDI_NOTE_F_4` |`MI_F4` |F octave 4 |
+|`QK_MIDI_NOTE_F_SHARP_4` |`MI_Fs4`, `MI_Gb4`|F♯/G♭ octave 4 |
+|`QK_MIDI_NOTE_G_4` |`MI_G4` |G octave 4 |
+|`QK_MIDI_NOTE_G_SHARP_4` |`MI_Gs4`, `MI_Ab4`|G♯/A♭ octave 4 |
+|`QK_MIDI_NOTE_A_4` |`MI_A4` |A octave 4 |
+|`QK_MIDI_NOTE_A_SHARP_4` |`MI_As4`, `MI_Bb4`|A♯/B♭ octave 4 |
+|`QK_MIDI_NOTE_B_4` |`MI_B4` |B octave 4 |
+|`QK_MIDI_NOTE_C_5` |`MI_C5` |C octave 5 |
+|`QK_MIDI_NOTE_C_SHARP_5` |`MI_Cs5`, `MI_Db5`|C♯/D♭ octave 5 |
+|`QK_MIDI_NOTE_D_5` |`MI_D5` |D octave 5 |
+|`QK_MIDI_NOTE_D_SHARP_5` |`MI_Ds5`, `MI_Eb5`|D♯/E♭ octave 5 |
+|`QK_MIDI_NOTE_E_5` |`MI_E5` |E octave 5 |
+|`QK_MIDI_NOTE_F_5` |`MI_F5` |F octave 5 |
+|`QK_MIDI_NOTE_F_SHARP_5` |`MI_Fs5`, `MI_Gb5`|F♯/G♭ octave 5 |
+|`QK_MIDI_NOTE_G_5` |`MI_G5` |G octave 5 |
+|`QK_MIDI_NOTE_G_SHARP_5` |`MI_Gs5`, `MI_Ab5`|G♯/A♭ octave 5 |
+|`QK_MIDI_NOTE_A_5` |`MI_A5` |A octave 5 |
+|`QK_MIDI_NOTE_A_SHARP_5` |`MI_As5`, `MI_Bb5`|A♯/B♭ octave 5 |
+|`QK_MIDI_NOTE_B_5` |`MI_B5` |B octave 5 |
+|`QK_MIDI_OCTAVE_N2` |`MI_OCN2` |Set octave to -2 |
+|`QK_MIDI_OCTAVE_N1` |`MI_OCN1` |Set octave to -1 |
+|`QK_MIDI_OCTAVE_0` |`MI_OC0` |Set octave to 0 |
+|`QK_MIDI_OCTAVE_1` |`MI_OC1` |Set octave to 1 |
+|`QK_MIDI_OCTAVE_2` |`MI_OC2` |Set octave to 2 |
+|`QK_MIDI_OCTAVE_3` |`MI_OC3` |Set octave to 3 |
+|`QK_MIDI_OCTAVE_4` |`MI_OC4` |Set octave to 4 |
+|`QK_MIDI_OCTAVE_5` |`MI_OC5` |Set octave to 5 |
+|`QK_MIDI_OCTAVE_6` |`MI_OC6` |Set octave to 6 |
+|`QK_MIDI_OCTAVE_7` |`MI_OC7` |Set octave to 7 |
+|`QK_MIDI_OCTAVE_DOWN` |`MI_OCTD` |Move down an octave |
+|`QK_MIDI_OCTAVE_UP` |`MI_OCTU` |Move up an octave |
+|`QK_MIDI_TRANSPOSE_N6` |`MI_TRN6` |Set transposition to -6 semitones|
+|`QK_MIDI_TRANSPOSE_N5` |`MI_TRN5` |Set transposition to -5 semitones|
+|`QK_MIDI_TRANSPOSE_N4` |`MI_TRN4` |Set transposition to -4 semitones|
+|`QK_MIDI_TRANSPOSE_N3` |`MI_TRN3` |Set transposition to -3 semitones|
+|`QK_MIDI_TRANSPOSE_N2` |`MI_TRN2` |Set transposition to -2 semitones|
+|`QK_MIDI_TRANSPOSE_N1` |`MI_TRN1` |Set transposition to -1 semitone |
+|`QK_MIDI_TRANSPOSE_0` |`MI_TR0` |No transposition |
+|`QK_MIDI_TRANSPOSE_1` |`MI_TR1` |Set transposition to +1 semitone |
+|`QK_MIDI_TRANSPOSE_2` |`MI_TR2` |Set transposition to +2 semitones|
+|`QK_MIDI_TRANSPOSE_3` |`MI_TR3` |Set transposition to +3 semitones|
+|`QK_MIDI_TRANSPOSE_4` |`MI_TR4` |Set transposition to +4 semitones|
+|`QK_MIDI_TRANSPOSE_5` |`MI_TR5` |Set transposition to +5 semitones|
+|`QK_MIDI_TRANSPOSE_6` |`MI_TR6` |Set transposition to +6 semitones|
+|`QK_MIDI_TRANSPOSE_DOWN` |`MI_TRSD` |Decrease transposition |
+|`QK_MIDI_TRANSPOSE_UP` |`MI_TRSU` |Increase transposition |
+|`QK_MIDI_VELOCITY_0` |`MI_VL0` |Set velocity to 0 |
+|`QK_MIDI_VELOCITY_1` |`MI_VL1` |Set velocity to 12 |
+|`QK_MIDI_VELOCITY_2` |`MI_VL2` |Set velocity to 25 |
+|`QK_MIDI_VELOCITY_3` |`MI_VL3` |Set velocity to 38 |
+|`QK_MIDI_VELOCITY_4` |`MI_VL4` |Set velocity to 51 |
+|`QK_MIDI_VELOCITY_5` |`MI_VL5` |Set velocity to 64 |
+|`QK_MIDI_VELOCITY_6` |`MI_VL6` |Set velocity to 76 |
+|`QK_MIDI_VELOCITY_7` |`MI_VL7` |Set velocity to 89 |
+|`QK_MIDI_VELOCITY_8` |`MI_VL8` |Set velocity to 102 |
+|`QK_MIDI_VELOCITY_9` |`MI_VL9` |Set velocity to 114 |
+|`QK_MIDI_VELOCITY_10` |`MI_VL10` |Set velocity to 127 |
+|`QK_MIDI_VELOCITY_DOWN` |`MI_VELD` |Decrease velocity |
+|`QK_MIDI_VELOCITY_UP` |`MI_VELU` |Increase velocity |
+|`QK_MIDI_CHANNEL_1` |`MI_CH1` |Set channel to 1 |
+|`QK_MIDI_CHANNEL_2` |`MI_CH2` |Set channel to 2 |
+|`QK_MIDI_CHANNEL_3` |`MI_CH3` |Set channel to 3 |
+|`QK_MIDI_CHANNEL_4` |`MI_CH4` |Set channel to 4 |
+|`QK_MIDI_CHANNEL_5` |`MI_CH5` |Set channel to 5 |
+|`QK_MIDI_CHANNEL_6` |`MI_CH6` |Set channel to 6 |
+|`QK_MIDI_CHANNEL_7` |`MI_CH7` |Set channel to 7 |
+|`QK_MIDI_CHANNEL_8` |`MI_CH8` |Set channel to 8 |
+|`QK_MIDI_CHANNEL_9` |`MI_CH9` |Set channel to 9 |
+|`QK_MIDI_CHANNEL_10` |`MI_CH10` |Set channel to 10 |
+|`QK_MIDI_CHANNEL_11` |`MI_CH11` |Set channel to 11 |
+|`QK_MIDI_CHANNEL_12` |`MI_CH12` |Set channel to 12 |
+|`QK_MIDI_CHANNEL_13` |`MI_CH13` |Set channel to 13 |
+|`QK_MIDI_CHANNEL_14` |`MI_CH14` |Set channel to 14 |
+|`QK_MIDI_CHANNEL_15` |`MI_CH15` |Set channel to 15 |
+|`QK_MIDI_CHANNEL_16` |`MI_CH16` |Set channel to 16 |
+|`QK_MIDI_CHANNEL_DOWN` |`MI_CHND` |Decrease channel |
+|`QK_MIDI_CHANNEL_UP` |`MI_CHNU` |Increase channel |
+|`QK_MIDI_ALL_NOTES_OFF` |`MI_AOFF` |Stop all notes |
+|`QK_MIDI_SUSTAIN` |`MI_SUST` |Sustain |
+|`QK_MIDI_PORTAMENTO` |`MI_PORT` |Portmento |
+|`QK_MIDI_SOSTENUTO` |`MI_SOST` |Sostenuto |
+|`QK_MIDI_SOFT` |`MI_SOFT` |Soft Pedal |
+|`QK_MIDI_LEGATO` |`MI_LEG` |Legato |
+|`QK_MIDI_MODULATION` |`MI_MOD` |Modulation |
+|`QK_MIDI_MODULATION_SPEED_DOWN`|`MI_MODD` |Decrease modulation speed |
+|`QK_MIDI_MODULATION_SPEED_UP` |`MI_MODU` |Increase modulation speed |
+|`QK_MIDI_PITCH_BEND_DOWN` |`MI_BNDD` |Bend pitch down |
+|`QK_MIDI_PITCH_BEND_UP` |`MI_BNDU` |Bend pitch up |
### Configuration
Certain values are stored in the `midi_config` struct. This configuration is not persisted to EEPROM. By default, these values are:
-|Configuration |Value|Comments |
-|-------------------|-----|-------------------------|
-|Octave |`4` |Corresponds to `MI_OCT_2`|
-|Transposition |`0` | |
-|Velocity |`127`| |
-|Channel |`0` | |
-|Modulation Interval|`8` | |
+|Configuration |Value|Comments |
+|-------------------|-----|-----------------------|
+|Octave |`4` |Corresponds to `MI_OC2`|
+|Transposition |`0` | |
+|Velocity |`127`| |
+|Channel |`0` | |
+|Modulation Interval|`8` | |
For the above, the `MI_C` keycode will produce a C3 (note number 48), and so on.
diff --git a/docs/feature_mouse_keys.md b/docs/feature_mouse_keys.md
index 905da36e43..eed4f4f4aa 100644
--- a/docs/feature_mouse_keys.md
+++ b/docs/feature_mouse_keys.md
@@ -48,8 +48,9 @@ Mouse keys supports three different modes to move the cursor:
* **Kinetic:** Holding movement keys accelerates the cursor with its speed following a quadratic curve until it reaches its maximum speed.
* **Constant:** Holding movement keys moves the cursor at constant speeds.
* **Combined:** Holding movement keys accelerates the cursor until it reaches its maximum speed, but holding acceleration and movement keys simultaneously moves the cursor at constant speeds.
+* **Inertia:** Cursor accelerates when key held, and decelerates after key release. Tracks X and Y velocity separately for more nuanced movements. Applies to cursor only, not scrolling.
-The same principle applies to scrolling.
+The same principle applies to scrolling, in most modes.
Configuration options that are times, intervals or delays are given in milliseconds. Scroll speed is given as multiples of the default scroll step. For example, a scroll speed of 8 means that each scroll action covers 8 times the length of the default scroll step as defined by your operating system or application.
@@ -87,9 +88,9 @@ This is an extension of the accelerated mode. The kinetic mode uses a quadratic
|`MK_KINETIC_SPEED` |undefined|Enable kinetic mode |
|`MOUSEKEY_DELAY` |5 |Delay between pressing a movement key and cursor movement |
|`MOUSEKEY_INTERVAL` |10 |Time between cursor movements in milliseconds |
-|`MOUSEKEY_MOVE_DELTA` |5 |Step size for accelerating from initial to base speed |
+|`MOUSEKEY_MOVE_DELTA` |16 |Step size for accelerating from initial to base speed |
|`MOUSEKEY_INITIAL_SPEED` |100 |Initial speed of the cursor in pixel per second |
-|`MOUSEKEY_BASE_SPEED` |1000 |Maximum cursor speed at which acceleration stops |
+|`MOUSEKEY_BASE_SPEED` |5000 |Maximum cursor speed at which acceleration stops |
|`MOUSEKEY_DECELERATED_SPEED` |400 |Decelerated cursor speed |
|`MOUSEKEY_ACCELERATED_SPEED` |3000 |Accelerated cursor speed |
|`MOUSEKEY_WHEEL_INITIAL_MOVEMENTS` |16 |Initial number of movements of the mouse wheel |
@@ -100,7 +101,7 @@ This is an extension of the accelerated mode. The kinetic mode uses a quadratic
Tips:
* The smoothness of the cursor movement depends on the `MOUSEKEY_INTERVAL` setting. The shorter the interval is set the smoother the movement will be. Setting the value too low makes the cursor unresponsive. Lower settings are possible if the micro processor is fast enough. For example: At an interval of `8` milliseconds, `125` movements per second will be initiated. With a base speed of `1000` each movement will move the cursor by `8` pixels.
-* Mouse wheel movements are implemented differently from cursor movements. While it's okay for the cursor to move multiple pixels at once for the mouse wheel this would lead to jerky movements. Instead, the mouse wheel operates at step size `1`. Setting mouse wheel speed is done by adjusting the number of wheel movements per second.
+* Mouse wheel movements are implemented differently from cursor movements. While it's okay for the cursor to move multiple pixels at once for the mouse wheel this would lead to jerky movements. Instead, the mouse wheel operates at step size `2`. Setting mouse wheel speed is done by adjusting the number of wheel movements per second.
### Constant mode
@@ -170,6 +171,37 @@ To use combined speed mode, you must at least define `MK_COMBINED` in your keyma
#define MK_COMBINED
```
+### Inertia mode
+
+This mode provides smooth motion, like sliding on ice. The cursor accelerates
+along a quadratic curve while a key is held, then glides to a stop after the
+key is released. Vertical and horizontal movements are tracked independently,
+so the cursor can move in many directions and make curves.
+
+Cannot be used at the same time as Kinetic mode, Constant mode, or Combined mode.
+
+Recommended settings in your keymap’s `config.h` file:
+
+|Define |Default |Description |
+|----------------------------|---------|-----------------------------------------------------------|
+|`MOUSEKEY_INERTIA` |undefined|Enable Inertia mode |
+|`MOUSEKEY_DELAY` |150 |Delay between pressing a movement key and cursor movement |
+|`MOUSEKEY_INTERVAL` |16 |Time between cursor movements in milliseconds (16 = 60fps) |
+|`MOUSEKEY_MAX_SPEED` |32 |Maximum cursor speed at which acceleration stops |
+|`MOUSEKEY_TIME_TO_MAX` |32 |Number of frames until maximum cursor speed is reached |
+|`MOUSEKEY_FRICTION` |24 |How quickly the cursor stops after releasing a key |
+|`MOUSEKEY_MOVE_DELTA` |1 |How much to move on first frame (1 strongly recommended) |
+
+Tips:
+
+* Set `MOUSEKEY_DELAY` to roughly the same value as your host computer's key repeat delay, in ms. Recommended values are 100 to 300.
+* Set `MOUSEKEY_INTERVAL` to a value of 1000 / your monitor's FPS. For 60 FPS, 1000/60 = 16.
+* Set `MOUSEKEY_MAX_SPEED` based on your screen resolution and refresh rate, like Width / FPS. For example, 1920 pixels / 60 FPS = 32 pixels per frame.
+* Set `MOUSEKEY_TIME_TO_MAX` to a value of approximately FPS / 2, to make it reach full speed in half a second (or so).
+* Set `MOUSEKEY_FRICTION` to something between 1 and 255. Lower makes the cursor glide longer. Values from 8 to 40 are the most effective.
+* Keep `MOUSEKEY_MOVE_DELTA` at 1. This allows precise movements before the gliding effect starts.
+* Mouse wheel options are the same as the default accelerated mode, and do not use inertia.
+
## Use with PS/2 Mouse and Pointing Device
Mouse keys button state is shared with [PS/2 mouse](feature_ps2_mouse.md) and [pointing device](feature_pointing_device.md) so mouse keys button presses can be used for clicks and drags.
diff --git a/docs/feature_oled_driver.md b/docs/feature_oled_driver.md
index 0d04f007f8..dea9cb8074 100644
--- a/docs/feature_oled_driver.md
+++ b/docs/feature_oled_driver.md
@@ -14,8 +14,6 @@ Tested combinations:
Hardware configurations using Arm-based microcontrollers or different sizes of OLED modules may be compatible, but are untested.
-!> Warning: This OLED driver currently uses the new i2c_master driver from Split Common code. If your split keyboard uses I2C to communicate between sides, this driver could cause an address conflict (serial is fine). Please contact your keyboard vendor and ask them to migrate to the latest Split Common code to fix this. In addition, the display timeout system to reduce OLED burn-in also uses Split Common to detect keypresses, so you will need to implement custom timeout logic for non-Split Common keyboards.
-
## Usage
To enable the OLED feature, there are two steps. First, when compiling your keyboard, you'll need to add the following to your `rules.mk`:
@@ -82,6 +80,11 @@ static void render_logo(void) {
oled_write_P(qmk_logo, false);
}
+
+bool oled_task_user(void) {
+ render_logo();
+ return false;
+}
```
?> The default font file is located at `drivers/oled/glcdfont.c` and its location can be overwritten with the `OLED_FONT_H` configuration option. Font file content can be edited with external tools such as [Helix Font Editor](https://helixfonteditor.netlify.app/) and [Logo Editor](https://joric.github.io/qle/).
@@ -261,12 +264,12 @@ void oled_render(void);
void oled_set_cursor(uint8_t col, uint8_t line);
// Advances the cursor to the next page, writing ' ' if true
-// Wraps to the begining when out of bounds
+// Wraps to the beginning when out of bounds
void oled_advance_page(bool clearPageRemainder);
// Moves the cursor forward 1 character length
// Advance page if there is not enough room for the next character
-// Wraps to the begining when out of bounds
+// Wraps to the beginning when out of bounds
void oled_advance_char(void);
// Writes a single character to the buffer at current cursor position
diff --git a/docs/feature_pointing_device.md b/docs/feature_pointing_device.md
index 02c1e64a31..be984dd5a5 100644
--- a/docs/feature_pointing_device.md
+++ b/docs/feature_pointing_device.md
@@ -10,7 +10,7 @@ POINTING_DEVICE_ENABLE = yes
## Sensor Drivers
-There are a number of sensors that are supported by default. Note that only one sensor can be enabled by `POINTING_DEVICE_DRIVER` at a time. If you need to enable more than one sensor, then you need to implement it manually.
+There are a number of sensors that are supported by default. Note that only one sensor can be enabled by `POINTING_DEVICE_DRIVER` at a time. If you need to enable more than one sensor, then you need to implement it manually, using the `custom` driver.
### ADNS 5050 Sensor
@@ -22,11 +22,13 @@ POINTING_DEVICE_DRIVER = adns5050
The ADNS 5050 sensor uses a serial type protocol for communication, and requires an additional light source.
-| Setting | Description |
-|--------------------|---------------------------------------------------------------------|
-|`ADNS5050_SCLK_PIN` | (Required) The pin connected to the clock pin of the sensor. |
-|`ADNS5050_SDIO_PIN` | (Required) The pin connected to the data pin of the sensor. |
-|`ADNS5050_CS_PIN` | (Required) The pin connected to the cable select pin of the sensor. |
+| Setting | Description | Default |
+| ------------------- | ------------------------------------------------------------------- | -------------------------- |
+| `ADNS5050_SCLK_PIN` | (Required) The pin connected to the clock pin of the sensor. | `POINTING_DEVICE_SCLK_PIN` |
+| `ADNS5050_SDIO_PIN` | (Required) The pin connected to the data pin of the sensor. | `POINTING_DEVICE_SDIO_PIN` |
+| `ADNS5050_CS_PIN` | (Required) The pin connected to the cable select pin of the sensor. | `POINTING_DEVICE_CS_PIN` |
+
+
The CPI range is 125-1375, in increments of 125. Defaults to 500 CPI.
@@ -40,13 +42,13 @@ POINTING_DEVICE_DRIVER = adns9800
The ADNS 9800 is an SPI driven optical sensor, that uses laser output for surface tracking.
-| Setting | Description | Default |
-|--------------------------------|------------------------------------------------------------------------|---------------|
-|`ADNS9800_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
-|`ADNS9800_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
-|`ADNS9800_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
-|`ADNS9800_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
-|`ADNS9800_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
+| Setting | Description | Default |
+| ----------------------- | ---------------------------------------------------------------------- | ------------------------ |
+| `ADNS9800_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
+| `ADNS9800_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
+| `ADNS9800_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
+| `ADNS9800_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
+| `ADNS9800_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | `POINTING_DEVICE_CS_PIN` |
The CPI range is 800-8200, in increments of 200. Defaults to 1800 CPI.
@@ -61,17 +63,16 @@ POINTING_DEVICE_DRIVER = analog_joystick
The Analog Joystick is an analog (ADC) driven sensor. There are a variety of joysticks that you can use for this.
-| Setting | Description | Default |
-|----------------------------------|----------------------------------------------------------------------------|---------------|
-|`ANALOG_JOYSTICK_X_AXIS_PIN` | (Required) The pin used for the vertical/X axis. | _not defined_ |
-|`ANALOG_JOYSTICK_Y_AXIS_PIN` | (Required) The pin used for the horizontal/Y axis. | _not defined_ |
-|`ANALOG_JOYSTICK_AXIS_MIN` | (Optional) Sets the lower range to be considered movement. | `0` |
-|`ANALOG_JOYSTICK_AXIS_MAX` | (Optional) Sets the upper range to be considered movement. | `1023` |
-|`ANALOG_JOYSTICK_SPEED_REGULATOR` | (Optional) The divisor used to slow down movement. (lower makes it faster) | `20` |
-|`ANALOG_JOYSTICK_READ_INTERVAL` | (Optional) The interval in milliseconds between reads. | `10` |
-|`ANALOG_JOYSTICK_SPEED_MAX` | (Optional) The maximum value used for motion. | `2` |
-|`ANALOG_JOYSTICK_CLICK_PIN` | (Optional) The pin wired up to the press switch of the analog stick. | _not defined_ |
-
+| Setting | Description | Default |
+| --------------------------------- | -------------------------------------------------------------------------- | ------------- |
+| `ANALOG_JOYSTICK_X_AXIS_PIN` | (Required) The pin used for the vertical/X axis. | _not defined_ |
+| `ANALOG_JOYSTICK_Y_AXIS_PIN` | (Required) The pin used for the horizontal/Y axis. | _not defined_ |
+| `ANALOG_JOYSTICK_AXIS_MIN` | (Optional) Sets the lower range to be considered movement. | `0` |
+| `ANALOG_JOYSTICK_AXIS_MAX` | (Optional) Sets the upper range to be considered movement. | `1023` |
+| `ANALOG_JOYSTICK_SPEED_REGULATOR` | (Optional) The divisor used to slow down movement. (lower makes it faster) | `20` |
+| `ANALOG_JOYSTICK_READ_INTERVAL` | (Optional) The interval in milliseconds between reads. | `10` |
+| `ANALOG_JOYSTICK_SPEED_MAX` | (Optional) The maximum value used for motion. | `2` |
+| `ANALOG_JOYSTICK_CLICK_PIN` | (Optional) The pin wired up to the press switch of the analog stick. | _not defined_ |
### Cirque Trackpad
@@ -90,29 +91,93 @@ POINTING_DEVICE_DRIVER = cirque_pinnacle_spi
This supports the Cirque Pinnacle 1CA027 Touch Controller, which is used in the TM040040, TM035035 and the TM023023 trackpads. These are I2C or SPI compatible, and both configurations are supported.
-| Setting | Description | Default |
-|---------------------------------|---------------------------------------------------------------------------------|-----------------------|
-|`CIRQUE_PINNACLE_X_LOWER` | (Optional) The minimum reachable X value on the sensor. | `127` |
-|`CIRQUE_PINNACLE_X_UPPER` | (Optional) The maximum reachable X value on the sensor. | `1919` |
-|`CIRQUE_PINNACLE_Y_LOWER` | (Optional) The minimum reachable Y value on the sensor. | `63` |
-|`CIRQUE_PINNACLE_Y_UPPER` | (Optional) The maximum reachable Y value on the sensor. | `1471` |
-|`CIRQUE_PINNACLE_TAPPING_TERM` | (Optional) Length of time that a touch can be to be considered a tap. | `TAPPING_TERM`/`200` |
-|`CIRQUE_PINNACLE_TOUCH_DEBOUNCE` | (Optional) Length of time that a touch can be to be considered a tap. | `TAPPING_TERM`/`200` |
+#### Common settings
-| I2C Setting | Description | Default |
-|--------------------------|---------------------------------------------------------------------------------|---------|
-|`CIRQUE_PINNACLE_ADDR` | (Required) Sets the I2C Address for the Cirque Trackpad | `0x2A` |
-|`CIRQUE_PINNACLE_TIMEOUT` | (Optional) The timeout for i2c communication with the trackpad in milliseconds. | `20` |
+| Setting | Description | Default |
+| -------------------------------- | ---------------------------------------------------------- | ------------------------------------------- |
+| `CIRQUE_PINNACLE_DIAMETER_MM` | (Optional) Diameter of the trackpad sensor in millimeters. | `40` |
+| `CIRQUE_PINNACLE_ATTENUATION` | (Optional) Sets the attenuation of the sensor data. | `EXTREG__TRACK_ADCCONFIG__ADC_ATTENUATE_4X` |
+| `CIRQUE_PINNACLE_CURVED_OVERLAY` | (Optional) Applies settings tuned for curved overlay. | _not defined_ |
+| `CIRQUE_PINNACLE_POSITION_MODE` | (Optional) Mode of operation. | _not defined_ |
-| SPI Setting | Description | Default |
-|-------------------------------|------------------------------------------------------------------------|---------------|
-|`CIRQUE_PINNACLE_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `1000000` |
-|`CIRQUE_PINNACLE_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
-|`CIRQUE_PINNACLE_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `1` |
-|`CIRQUE_PINNACLE_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
-|`CIRQUE_PINNACLE_SPI_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
+**`CIRQUE_PINNACLE_ATTENUATION`** is a measure of how much data is suppressed in regards to sensitivity. The higher the attenuation, the less sensitive the touchpad will be.
-Default Scaling/CPI is 1024.
+Default attenuation is set to 4X, although if you are using a thicker overlay (such as the curved overlay) you will want a lower attenuation such as 2X. The possible values are:
+* `EXTREG__TRACK_ADCCONFIG__ADC_ATTENUATE_4X`: Least sensitive
+* `EXTREG__TRACK_ADCCONFIG__ADC_ATTENUATE_3X`
+* `EXTREG__TRACK_ADCCONFIG__ADC_ATTENUATE_2X`
+* `EXTREG__TRACK_ADCCONFIG__ADC_ATTENUATE_1X`: Most sensitive
+
+**`CIRQUE_PINNACLE_POSITION_MODE`** can be `CIRQUE_PINNACLE_ABSOLUTE_MODE` or `CIRQUE_PINNACLE_RELATIVE_MODE`. Modes differ in supported features/gestures.
+
+* `CIRQUE_PINNACLE_ABSOLUTE_MODE`: Reports absolute x, y, z (touch pressure) coordinates and up to 5 hw buttons connected to the trackpad
+* `CIRQUE_PINNACLE_RELATIVE_MODE`: Reports x/y deltas, scroll and up to 3 buttons (2 of them can be from taps, see gestures) connected to trackpad. Supports taps on secondary side of split. Saves about 2k of flash compared to absolute mode with all features.
+
+| I2C Setting | Description | Default |
+| ------------------------- | ------------------------------------------------------------------------------- | ------- |
+| `CIRQUE_PINNACLE_ADDR` | (Required) Sets the I2C Address for the Cirque Trackpad | `0x2A` |
+| `CIRQUE_PINNACLE_TIMEOUT` | (Optional) The timeout for i2c communication with the trackpad in milliseconds. | `20` |
+
+| SPI Setting | Description | Default |
+| ------------------------------ | ---------------------------------------------------------------------- | ------------------------ |
+| `CIRQUE_PINNACLE_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `1000000` |
+| `CIRQUE_PINNACLE_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
+| `CIRQUE_PINNACLE_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `1` |
+| `CIRQUE_PINNACLE_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
+| `CIRQUE_PINNACLE_SPI_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | `POINTING_DEVICE_CS_PIN` |
+
+Default Scaling is 1024. Actual CPI depends on trackpad diameter.
+
+Also see the `POINTING_DEVICE_TASK_THROTTLE_MS`, which defaults to 10ms when using Cirque Pinnacle, which matches the internal update rate of the position registers (in standard configuration). Advanced configuration for pen/stylus usage might require lower values.
+
+#### Absolute mode settings
+
+| Setting | Description | Default |
+| -------------------------------- | ---------------------------------------------------------- | ------------------ |
+| `CIRQUE_PINNACLE_X_LOWER` | (Optional) The minimum reachable X value on the sensor. | `127` |
+| `CIRQUE_PINNACLE_X_UPPER` | (Optional) The maximum reachable X value on the sensor. | `1919` |
+| `CIRQUE_PINNACLE_Y_LOWER` | (Optional) The minimum reachable Y value on the sensor. | `63` |
+| `CIRQUE_PINNACLE_Y_UPPER` | (Optional) The maximum reachable Y value on the sensor. | `1471` |
+
+#### Absolute mode gestures
+
+| Gesture Setting | Description | Default |
+| ---------------------------------------------- | ------------------------------------------------------------------------------ | -------------------- |
+| `CIRQUE_PINNACLE_TAP_ENABLE` | (Optional) Enable tap to click. This currently only works on the master side. | _not defined_ |
+| `CIRQUE_PINNACLE_TAPPING_TERM` | (Optional) Length of time that a touch can be to be considered a tap. | `TAPPING_TERM`/`200` |
+| `CIRQUE_PINNACLE_TOUCH_DEBOUNCE` | (Optional) Length of time that a touch can be to be considered a tap. | `TAPPING_TERM`/`200` |
+
+`POINTING_DEVICE_GESTURES_SCROLL_ENABLE` in this mode enables circular scroll. Touch originating in outer ring can trigger scroll by moving along the perimeter. Near side triggers vertical scroll and far side triggers horizontal scroll.
+
+Additionally, `POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE` is supported in this mode.
+
+#### Relative mode gestures
+
+| Gesture Setting | Description | Default |
+| -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- |
+| `CIRQUE_PINNACLE_TAP_ENABLE` | (Optional) Enable tap to "left click". Works on both sides of a split keyboard. | _not defined_ |
+| `CIRQUE_PINNACLE_SECONDARY_TAP_ENABLE` | (Optional) Tap in upper right corner (half of the finger needs to be outside of the trackpad) of the trackpad will result in "right click". `CIRQUE_PINNACLE_TAP_ENABLE` must be enabled. | _not defined_ |
+
+Tapping term and debounce are not configurable in this mode since it's handled by trackpad internally.
+
+`POINTING_DEVICE_GESTURES_SCROLL_ENABLE` in this mode enables side scroll. Touch originating on the right side can trigger vertical scroll (IntelliSense trackpad style).
+
+### PAW 3204 Sensor
+
+To use the paw 3204 sensor, add this to your `rules.mk`
+
+```make
+POINTING_DEVICE_DRIVER = paw3204
+```
+
+The paw 3204 sensor uses a serial type protocol for communication, and requires an additional light source.
+
+| Setting | Description | Default |
+| ------------------ |--------------------------------------------------------------- | -------------------------- |
+| `PAW3204_SCLK_PIN` | (Required) The pin connected to the clock pin of the sensor. | `POINTING_DEVICE_SCLK_PIN` |
+| `PAW3204_SDIO_PIN` | (Required) The pin connected to the data pin of the sensor. | `POINTING_DEVICE_SDIO_PIN` |
+
+The CPI range is 400-1600, with supported values of (400, 500, 600, 800, 1000, 1200 and 1600). Defaults to 1000 CPI.
### Pimoroni Trackball
@@ -124,62 +189,69 @@ POINTING_DEVICE_DRIVER = pimoroni_trackball
The Pimoroni Trackball module is a I2C based breakout board with an RGB enable trackball.
-| Setting | Description | Default |
-|-------------------------------------|------------------------------------------------------------------------------------|---------|
-|`PIMORONI_TRACKBALL_ADDRESS` | (Required) Sets the I2C Address for the Pimoroni Trackball. | `0x0A` |
-|`PIMORONI_TRACKBALL_TIMEOUT` | (Optional) The timeout for i2c communication with the trackball in milliseconds. | `100` |
-|`PIMORONI_TRACKBALL_SCALE` | (Optional) The multiplier used to generate reports from the sensor. | `5` |
-|`PIMORONI_TRACKBALL_DEBOUNCE_CYCLES` | (Optional) The number of scan cycles used for debouncing on the ball press. | `20` |
-|`PIMORONI_TRACKBALL_ERROR_COUNT` | (Optional) Specifies the number of read/write errors until the sensor is disabled. | `10` |
+| Setting | Description | Default |
+| ------------------------------------ | ---------------------------------------------------------------------------------- | ------- |
+| `PIMORONI_TRACKBALL_ADDRESS` | (Required) Sets the I2C Address for the Pimoroni Trackball. | `0x0A` |
+| `PIMORONI_TRACKBALL_TIMEOUT` | (Optional) The timeout for i2c communication with the trackball in milliseconds. | `100` |
+| `PIMORONI_TRACKBALL_SCALE` | (Optional) The multiplier used to generate reports from the sensor. | `5` |
+| `PIMORONI_TRACKBALL_DEBOUNCE_CYCLES` | (Optional) The number of scan cycles used for debouncing on the ball press. | `20` |
+| `PIMORONI_TRACKBALL_ERROR_COUNT` | (Optional) Specifies the number of read/write errors until the sensor is disabled. | `10` |
-### PMW 3360 Sensor
+### PMW 3360 and PMW 3389 Sensor
-This drivers supports multiple sensors _per_ controller, so 2 can be attached at the same side for split keyboards (or unsplit keyboards).
-To use the PMW 3360 sensor, add this to your `rules.mk`
+This drivers supports both the PMW 3360 and PMW 3389 sensor as well as multiple sensors of the same type _per_ controller, so 2 can be attached at the same side for split keyboards (or unsplit keyboards).
+
+To use the **PMW 3360** sensor, add this to your `rules.mk`
```make
POINTING_DEVICE_DRIVER = pmw3360
```
-The PMW 3360 is an SPI driven optical sensor, that uses a built in IR LED for surface tracking.
-
-| Setting | Description | Default |
-|-----------------------------|--------------------------------------------------------------------------------------------|---------------|
-|`PMW3360_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
-|`PMW3360_CS_PINS` | (Alternative) Sets the Cable Select pins connected to multiple sensors. | _not defined_ |
-|`PMW3360_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
-|`PMW3360_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
-|`PMW3360_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
-|`PMW3360_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
-|`PMW3360_LIFTOFF_DISTANCE` | (Optional) Sets the lift off distance at run time | `0x02` |
-|`ROTATIONAL_TRANSFORM_ANGLE` | (Optional) Allows for the sensor data to be rotated +/- 127 degrees directly in the sensor.| `0` |
-|`PMW3360_FIRMWARE_UPLOAD_FAST` | (Optional) Skips the 15us wait between firmware blocks. | _not defined_ |
-
The CPI range is 100-12000, in increments of 100. Defaults to 1600 CPI.
-To use multiple sensors, instead of setting `PMW3360_CS_PIN` you need to set `PMW3360_CS_PINS` and also handle and merge the read from this sensor in user code.
+To use the **PMW 3389** sensor, add this to your `rules.mk`
+
+```make
+POINTING_DEVICE_DRIVER = pmw3389
+```
+
+The CPI range is 50-16000, in increments of 50. Defaults to 2000 CPI.
+
+Both PMW 3360 and PMW 3389 are SPI driven optical sensors, that use a built in IR LED for surface tracking.
+
+| Setting | Description | Default |
+| ---------------------------- | ------------------------------------------------------------------------------------------- | ------------------------ |
+| `PMW33XX_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | `POINTING_DEVICE_CS_PIN` |
+| `PMW33XX_CS_PINS` | (Alternative) Sets the Cable Select pins connected to multiple sensors. | _not defined_ |
+| `PMW33XX_CPI` | (Optional) Sets counts per inch sensitivity of the sensor. | _varies_ |
+| `PMW33XX_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
+| `PMW33XX_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
+| `PMW33XX_LIFTOFF_DISTANCE` | (Optional) Sets the lift off distance at run time | `0x02` |
+| `ROTATIONAL_TRANSFORM_ANGLE` | (Optional) Allows for the sensor data to be rotated +/- 127 degrees directly in the sensor. | `0` |
+
+To use multiple sensors, instead of setting `PMW33XX_CS_PIN` you need to set `PMW33XX_CS_PINS` and also handle and merge the read from this sensor in user code.
Note that different (per sensor) values of CPI, speed liftoff, rotational angle or flipping of X/Y is not currently supported.
```c
// in config.h:
-#define PMW3360_CS_PINS { B5, B6 }
-
+#define PMW33XX_CS_PINS { B5, B6 }
// in keyboard.c:
#ifdef POINTING_DEVICE_ENABLE
void pointing_device_init_kb(void) {
- pmw3360_init(1); // index 1 is the second device.
- pointing_device_set_cpi(800); // applies to both sensors
+ pmw33xx_init(1); // index 1 is the second device.
+ pmw33xx_set_cpi(0, 800); // applies to first sensor
+ pmw33xx_set_cpi(1, 800); // applies to second sensor
pointing_device_init_user();
}
// Contains report from sensor #0 already, need to merge in from sensor #1
report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
- report_pmw3360_t data = pmw3360_read_burst(1);
- if (data.isOnSurface && data.isMotion) {
+ pmw33xx_report_t report = pmw33xx_read_burst(1);
+ if (!report.motion.b.is_lifted && report.motion.b.is_motion) {
// From quantum/pointing_device_drivers.c
#define constrain_hid(amt) ((amt) < -127 ? -127 : ((amt) > 127 ? 127 : (amt)))
- mouse_report.x = constrain_hid(mouse_report.x + data.dx);
- mouse_report.y = constrain_hid(mouse_report.y + data.dy);
+ mouse_report.x = constrain_hid(mouse_report.x + report.delta_x);
+ mouse_report.y = constrain_hid(mouse_report.y + report.delta_y);
}
return pointing_device_task_user(mouse_report);
}
@@ -187,30 +259,6 @@ report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
```
-### PMW 3389 Sensor
-
-To use the PMW 3389 sensor, add this to your `rules.mk`
-
-```make
-POINTING_DEVICE_DRIVER = pmw3389
-```
-
-The PMW 3389 is an SPI driven optical sensor, that uses a built in IR LED for surface tracking.
-
-| Setting | Description | Default |
-|---------------------------------|--------------------------------------------------------------------------------------------|---------------|
-|`PMW3389_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
-|`PMW3389_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
-|`PMW3389_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
-|`PMW3389_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
-|`PMW3389_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
-|`PMW3389_LIFTOFF_DISTANCE` | (Optional) Sets the lift off distance at run time | `0x02` |
-|`ROTATIONAL_TRANSFORM_ANGLE` | (Optional) Allows for the sensor data to be rotated +/- 30 degrees directly in the sensor. | `0` |
-|`PMW3389_FIRMWARE_UPLOAD_FAST` | (Optional) Skips the 15us wait between firmware blocks. | _not defined_ |
-
-The CPI range is 50-16000, in increments of 50. Defaults to 2000 CPI.
-
-
### Custom Driver
If you have a sensor type that isn't supported above, a custom option is available by adding the following to your `rules.mk`
@@ -232,41 +280,51 @@ void pointing_device_driver_set_cpi(uint16_t cpi) {}
## Common Configuration
-| Setting | Description | Default |
-|----------------------------------|-----------------------------------------------------------------------|-------------------|
-|`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_270` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ |
-|`POINTING_DEVICE_INVERT_X` | (Optional) Inverts the X axis report. | _not defined_ |
-|`POINTING_DEVICE_INVERT_Y` | (Optional) Inverts the Y axis report. | _not defined_ |
-|`POINTING_DEVICE_MOTION_PIN` | (Optional) If supported, will only read from sensor if pin is active. | _not defined_ |
-|`POINTING_DEVICE_TASK_THROTTLE_MS` | (Optional) Limits the frequency that the sensor is polled for motion. | _not defined_ |
+| Setting | Description | Default |
+| ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------- |
+| `MOUSE_EXTENDED_REPORT` | (Optional) Enables support for extended mouse 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_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_INVERT_X` | (Optional) Inverts the X axis report. | _not defined_ |
+| `POINTING_DEVICE_INVERT_Y` | (Optional) Inverts the Y axis report. | _not defined_ |
+| `POINTING_DEVICE_MOTION_PIN` | (Optional) If supported, will only read from sensor if pin is active. | _not defined_ |
+| `POINTING_DEVICE_MOTION_PIN_ACTIVE_LOW` | (Optional) If defined then the motion pin is active-low. | _varies_ |
+| `POINTING_DEVICE_TASK_THROTTLE_MS` | (Optional) Limits the frequency that the sensor is polled for motion. | _not defined_ |
+| `POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE` | (Optional) Enable inertial cursor. Cursor continues moving after a flick gesture and slows down by kinetic friction. | _not defined_ |
+| `POINTING_DEVICE_GESTURES_SCROLL_ENABLE` | (Optional) Enable scroll gesture. The gesture that activates the scroll is device dependent. | _not defined_ |
+| `POINTING_DEVICE_CS_PIN` | (Optional) Provides a default CS pin, useful for supporting multiple sensor configs. | _not defined_ |
+| `POINTING_DEVICE_SDIO_PIN` | (Optional) Provides a default SDIO pin, useful for supporting multiple sensor configs. | _not defined_ |
+| `POINTING_DEVICE_SCLK_PIN` | (Optional) Provides a default SCLK pin, useful for supporting multiple sensor configs. | _not defined_ |
!> When using `SPLIT_POINTING_ENABLE` the `POINTING_DEVICE_MOTION_PIN` functionality is not supported and `POINTING_DEVICE_TASK_THROTTLE_MS` will default to `1`. Increasing this value will increase transport performance at the cost of possible mouse responsiveness.
+The `POINTING_DEVICE_CS_PIN`, `POINTING_DEVICE_SDIO_PIN`, and `POINTING_DEVICE_SCLK_PIN` provide a convenient way to define a single pin that can be used for an interchangeable sensor config. This allows you to have a single config, without defining each device. Each sensor allows for this to be overridden with their own defines.
+
+!> 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.
## Split Keyboard Configuration
The following configuration options are only available when using `SPLIT_POINTING_ENABLE` see [data sync options](feature_split_keyboard.md?id=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.
-| Setting | Description | Default |
-|----------------------------------------|-----------------------------------------------------------------------|---------------|
-|`POINTING_DEVICE_LEFT` | Pointing device on the left side (Required - pick one only) | _not defined_ |
-|`POINTING_DEVICE_RIGHT` | Pointing device on the right side (Required - pick one only) | _not defined_ |
-|`POINTING_DEVICE_COMBINED` | Pointing device on both sides (Required - pick one only) | _not defined_ |
-|`POINTING_DEVICE_ROTATION_90_RIGHT` | (Optional) Rotates the X and Y data by 90 degrees. | _not defined_ |
-|`POINTING_DEVICE_ROTATION_180_RIGHT` | (Optional) Rotates the X and Y data by 180 degrees. | _not defined_ |
-|`POINTING_DEVICE_ROTATION_270_RIGHT` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ |
-|`POINTING_DEVICE_INVERT_X_RIGHT` | (Optional) Inverts the X axis report. | _not defined_ |
-|`POINTING_DEVICE_INVERT_Y_RIGHT` | (Optional) Inverts the Y axis report. | _not defined_ |
+| Setting | Description | Default |
+| ------------------------------------ | ----------------------------------------------------------------------------------------------------- | ------------- |
+| `POINTING_DEVICE_LEFT` | Pointing device on the left side (Required - pick one only) | _not defined_ |
+| `POINTING_DEVICE_RIGHT` | Pointing device on the right side (Required - pick one only) | _not defined_ |
+| `POINTING_DEVICE_COMBINED` | Pointing device on both sides (Required - pick one only) | _not defined_ |
+| `POINTING_DEVICE_ROTATION_90_RIGHT` | (Optional) Rotates the X and Y data by 90 degrees. | _not defined_ |
+| `POINTING_DEVICE_ROTATION_180_RIGHT` | (Optional) Rotates the X and Y data by 180 degrees. | _not defined_ |
+| `POINTING_DEVICE_ROTATION_270_RIGHT` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ |
+| `POINTING_DEVICE_INVERT_X_RIGHT` | (Optional) Inverts the X axis report. | _not defined_ |
+| `POINTING_DEVICE_INVERT_Y_RIGHT` | (Optional) Inverts the Y axis report. | _not defined_ |
!> If there is a `_RIGHT` configuration option or callback, the [common configuration](feature_pointing_device.md?id=common-configuration) option will work for the left. For correct left/right detection you should setup a [handedness option](feature_split_keyboard?id=setting-handedness), `EE_HANDS` is usually a good option for an existing board that doesn't do handedness by hardware.
## Callbacks and Functions
-| Function | Description |
-|-----------------------------------|----------------------------------------------------------------------------------------------------------------------------------------|
+| Function | Description |
+| ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| `pointing_device_init_kb(void)` | Callback to allow for keyboard level initialization. Useful for additional hardware sensors. |
| `pointing_device_init_user(void)` | Callback to allow for user level initialization. Useful for additional hardware sensors. |
| `pointing_device_task_kb(mouse_report)` | Callback that sends sensor data, so keyboard code can intercept and modify the data. Returns a mouse report. |
@@ -274,11 +332,11 @@ The following configuration options are only available when using `SPLIT_POINTIN
| `pointing_device_handle_buttons(buttons, pressed, button)` | Callback to handle hardware button presses. Returns a `uint8_t`. |
| `pointing_device_get_cpi(void)` | Gets the current CPI/DPI setting from the sensor, if supported. |
| `pointing_device_set_cpi(uint16_t)` | Sets the CPI/DPI, if supported. |
-| `pointing_device_get_report(void)` | Returns the current mouse report (as a `mouse_report_t` data structure). |
-| `pointing_device_set_report(mouse_report)` | Sets the mouse report to the assigned `mouse_report_t` data structured passed to the function. |
-| `pointing_device_send(void)` | Sends the current mouse report to the host system. Function can be replaced. |
-| `has_mouse_report_changed(new_report, old_report)` | Compares the old and new `mouse_report_t` data and returns true only if it has changed. |
-| `pointing_device_adjust_by_defines(mouse_report)` | Applies rotations and invert configurations to a raw mouse report. |
+| `pointing_device_get_report(void)` | Returns the current mouse report (as a `report_mouse_t` data structure). |
+| `pointing_device_set_report(mouse_report)` | Sets the mouse report to the assigned `report_mouse_t` data structured passed to the function. |
+| `pointing_device_send(void)` | Sends the current mouse report to the host system. Function can be replaced. |
+| `has_mouse_report_changed(new_report, old_report)` | Compares the old and new `report_mouse_t` data and returns true only if it has changed. |
+| `pointing_device_adjust_by_defines(mouse_report)` | Applies rotations and invert configurations to a raw mouse report. |
## Split Keyboard Callbacks and Functions
@@ -286,10 +344,10 @@ The following configuration options are only available when using `SPLIT_POINTIN
The combined functions below are only available when using `SPLIT_POINTING_ENABLE` and `POINTING_DEVICE_COMBINED`. The 2 callbacks `pointing_device_task_combined_*` replace the single sided equivalents above. See the [combined pointing devices example](feature_pointing_device.md?id=combined-pointing-devices)
| Function | Description |
-|-----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------|
-| `pointing_device_set_shared_report(mouse_report)` | Sets the shared mouse report to the assigned `mouse_report_t` data structured passed to the function. |
-| `pointing_device_set_cpi_on_side(bool, uint16_t)` | Sets the CPI/DPI of one side, if supported. Passing `true` will set the left and `false` the right` |
-| `pointing_device_combine_reports(left_report, right_report)` | Returns a combined mouse_report of left_report and right_report (as a `mouse_report_t` data structure) |
+| --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
+| `pointing_device_set_shared_report(mouse_report)` | Sets the shared mouse report to the assigned `report_mouse_t` data structured passed to the function. |
+| `pointing_device_set_cpi_on_side(bool, uint16_t)` | Sets the CPI/DPI of one side, if supported. Passing `true` will set the left and `false` the right |
+| `pointing_device_combine_reports(left_report, right_report)` | Returns a combined mouse_report of left_report and right_report (as a `report_mouse_t` data structure) |
| `pointing_device_task_combined_kb(left_report, right_report)` | Callback, so keyboard code can intercept and modify the data. Returns a combined mouse report. |
| `pointing_device_task_combined_user(left_report, right_report)` | Callback, so user code can intercept and modify. Returns a combined mouse report using `pointing_device_combine_reports` |
| `pointing_device_adjust_by_defines_right(mouse_report)` | Applies right side rotations and invert configurations to a raw mouse report. |
@@ -430,4 +488,243 @@ report_mouse_t pointing_device_task_combined_user(report_mouse_t left_report, re
return pointing_device_combine_reports(left_report, right_report);
}
```
-=======
+
+# Troubleshooting
+
+If you are having issues with pointing device drivers debug messages can be enabled that will give you insights in the inner workings. To enable these add to your keyboards `config.h` file:
+
+```c
+#define POINTING_DEVICE_DEBUG
+```
+
+?> The messages will be printed out to the `CONSOLE` output. For additional information, refer to [Debugging/Troubleshooting QMK](faq_debug.md).
+
+
+---
+# Automatic Mouse Layer :id=pointing-device-auto-mouse
+
+When using a pointing device combined with a keyboard the mouse buttons are often kept on a separate layer from the default keyboard layer, which requires pressing or holding a key to change layers before using the mouse. To make this easier and more efficient an additional pointing device feature may be enabled that will automatically activate a target layer as soon as the pointing device is active _(in motion, mouse button pressed etc.)_ and deactivate the target layer after a set time.
+
+Additionally if any key that is defined as a mouse key is pressed then the layer will be held as long as the key is pressed and the timer will be reset on key release. When a non-mouse key is pressed then the layer is deactivated early _(with some exceptions see below)_. Mod, mod tap, and one shot mod keys are ignored _(i.e. don't hold or activate layer but do not deactivate the layer either)_ when sending a modifier keycode _(e.g. hold for mod tap)_ allowing for mod keys to be used with the mouse without activating the target layer when typing.
+
+All of the standard layer keys (tap toggling, toggle, toggle on, one_shot, layer tap, layer mod) that activate the current target layer are uniquely handled to ensure they behave as expected _(see layer key table below)_. The target layer that can be changed at any point during by calling the `set_auto_mouse_layer();` function.
+
+### Behaviour of Layer keys that activate the target layer
+| Layer key as in `keymap.c` | Auto Mouse specific behaviour |
+| -------------------------- | --------------------------------------------------------------------------------------------------------------------- |
+| `MO()` | Treated as a mouse key holding the layer while pressed |
+| `LT()` | When tapped will be treated as non mouse key and mouse key when held |
+| `LM()` | Treated as a mouse key |
+| `TG()` | Will set flag preventing target layer deactivation or removal until pressed again |
+| `TO()` | Same as `TG()` |
+| `TT()` | Treated as a mouse key when `tap.count < TAPPING_TOGGLE` and as `TG` when `tap.count == TAPPING_TOGGLE` |
+| `DF()` | Skips auto mouse key processing similar to mod keys |
+| `OSL()` | Skips, but if current one shot layer is the target layer then it will prevent target layer deactivation or removal |
+
+
+## How to enable:
+
+```c
+// in config.h:
+#define POINTING_DEVICE_AUTO_MOUSE_ENABLE
+// only required if not setting mouse layer elsewhere
+#define AUTO_MOUSE_DEFAULT_LAYER
+
+// in keymap.c:
+void pointing_device_init_user(void) {
+ set_auto_mouse_layer(); // only required if AUTO_MOUSE_DEFAULT_LAYER is not set to index of
+ set_auto_mouse_enable(true); // always required before the auto mouse feature will work
+}
+```
+
+Because the auto mouse feature can be disabled/enabled during runtime and starts as disabled by default it must be enabled by calling `set_auto_mouse_enable(true);` somewhere in firmware before the feature will work.
+_Note: for setting the target layer during initialization either setting `AUTO_MOUSE_DEFAULT_LAYER` in `config.h` or calling `set_auto_mouse_layer()` can be used._
+
+
+## How to Customize:
+
+There are a few ways to control the auto mouse feature with both `config.h` options and functions for controlling it during runtime.
+
+### `config.h` Options:
+| Define | Description | Range | Units | Default |
+| ----------------------------------- | --------------------------------------------------------------------- | :------------------: | :---------: | -------------------------: |
+| `POINTING_DEVICE_AUTO_MOUSE_ENABLE` | (Required) Enables auto mouse layer feature | | _None_ | _Not defined_ |
+| `AUTO_MOUSE_DEFAULT_LAYER` | (Optional) Index of layer to use as default target layer | 0 - `LAYER_MAX` | _`uint8_t`_ | `1` |
+| `AUTO_MOUSE_TIME` | (Optional) Time layer remains active after activation | _ideally_ (250-1000) | _ms_ | `650 ms` |
+| `AUTO_MOUSE_DELAY` | (Optional) Lockout time after non-mouse key is pressed | _ideally_ (100-1000) | _ms_ | `TAPPING_TERM` or `200 ms` |
+| `AUTO_MOUSE_DEBOUNCE` | (Optional) Time delay from last activation to next update | _ideally_ (10 - 100) | _ms_ | `25 ms` |
+
+### Adding mouse keys
+
+While all default mouse keys and layer keys(for current mouse layer) are treated as mouse keys, additional Keyrecords can be added to mouse keys by adding them to the is_mouse_record_* stack.
+
+#### Callbacks for setting up additional key codes as mouse keys:
+| Callback | Description |
+| -------------------------------------------------------------------- | -------------------------------------------------- |
+| `bool is_mouse_record_kb(uint16_t keycode, keyrecord_t* record)` | keyboard level callback for adding mouse keys |
+| `bool is_mouse_record_user(uint16_t keycode, keyrecord_t* record)` | user/keymap level callback for adding mouse keys |
+
+##### To use the callback function to add mouse keys:
+
+The following code will cause the enter key and all of the arrow keys to be treated as mouse keys (hold target layer while they are pressed and reset active layer timer).
+```c
+
+// in .c:
+bool is_mouse_record_kb(uint16_t keycode, keyrecord_t* record) {
+ switch(keycode) {
+ case KC_ENT:
+ return true;
+ case KC_RIGHT ... KC_UP:
+ return true;
+ default:
+ return false;
+ }
+ return is_mouse_record_user(keycode, record);
+}
+```
+
+
+## Advanced control
+
+There are several functions that allow for more advanced interaction with the auto mouse feature allowing for greater control.
+
+### Functions to control auto mouse enable and target layer:
+| Function | Description | Aliases | Return type |
+| :--------------------------------------------------------- | ------------------------------------------------------------------------------------ | ------------------------- | --------------: |
+| `set_auto_mouse_enable(bool enable)` | Enable or disable auto mouse (true:enable, false:disable) | | `void`(None) |
+| `get_auto_mouse_enable(void)` | Return auto mouse enable state (true:enabled, false:disabled) | `AUTO_MOUSE_ENABLED` | `bool` |
+| `set_auto_mouse_layer(uint8_t LAYER)` | Change/set the target layer for auto mouse | | `void`(None) |
+| `get_auto_mouse_layer(void)` | Return auto mouse target layer index | `AUTO_MOUSE_TARGET_LAYER` | `uint8_t` |
+| `remove_auto_mouse_layer(layer_state_t state, bool force)` | Return `state` with target layer removed if appropriate (ignore criteria if `force`) | | `layer_state_t` |
+| `auto_mouse_layer_off(void)` | Disable target layer if appropriate will call (makes call to `layer_state_set`) | | `void`(None) |
+| `auto_mouse_toggle(void)` | Toggle on/off target toggle state (disables layer deactivation when true) | | `void`(None) |
+| `get_auto_mouse_toggle(void)` | Return value of toggling state variable | | `bool` |
+
+_NOTES:_
+ - _Due to the nature of how some functions work, the `auto_mouse_trigger_reset`, and `auto_mouse_layer_off` functions should never be called in the `layer_state_set_*` stack as this can cause indefinite loops._
+ - _It is recommended that `remove_auto_mouse_layer` is used in the `layer_state_set_*` stack of functions and `auto_mouse_layer_off` is used everywhere else_
+ - _`remove_auto_mouse_layer(state, false)` or `auto_mouse_layer_off()` should be called before any instance of `set_auto_mouse_enabled(false)` or `set_auto_mouse_layer(layer)` to ensure that the target layer will be removed appropriately before disabling auto mouse or changing target to avoid a stuck layer_
+
+### Functions for handling custom key events:
+| Function | Description | Return type |
+| :--------------------------------------------------------- | -------------------------------------------------------------------------------- | --------------: |
+| `auto_mouse_keyevent(bool pressed)` | Auto mouse mouse key event (true: key down, false: key up) | `void`(None) |
+| `auto_mouse_trigger_reset(bool pressed)` | Reset auto mouse status on key down and start delay timer (non-mouse key event) | `void`(None) |
+| `auto_mouse_toggle(void)` | Toggle on/off target toggle state (disables layer deactivation when true) | `void`(None) |
+| `get_auto_mouse_toggle(void)` | Return value of toggling state variable | `bool` |
+_NOTE: Generally it would be preferable to use the `is_mouse_record_*` functions to add any additional keys that should act as mouse keys rather than adding `auto_mouse_keyevent(record.event->pressed)` to `process_records_*`_
+
+### Advanced control examples
+
+#### Disable auto mouse on certain layers:
+
+The auto mouse feature can be disabled any time and this can be helpful if you want to disable the auto mouse feature under certain circumstances such as when particular layers are active. One issue however is the handling of the target layer, it needs to be removed appropriately **before** disabling auto mouse _(see notes under control functions above)_. The following function would disable the auto_mouse feature whenever the layers `_LAYER5` through `_LAYER7` are active as the top most layer _(ignoring target layer)_.
+
+```c
+// in keymap.c:
+layer_state_t layer_state_set_user(layer_state_t state) {
+ // checks highest layer other than target layer
+ switch(get_highest_layer(remove_auto_mouse_layer(state, true))) {
+ case _LAYER5 ... _LAYER7:
+ // remove_auto_mouse_target must be called to adjust state *before* setting enable
+ state = remove_auto_mouse_layer(state, false);
+ set_auto_mouse_enable(false);
+ break;
+ default:
+ set_auto_mouse_enable(true);
+ break;
+ }
+ // recommend that any code that makes adjustment based on auto mouse layer state would go here
+ return state;
+}
+```
+
+#### Set different target layer when a particular layer is active:
+
+The below code will change the auto mouse layer target to `_MOUSE_LAYER_2` when `_DEFAULT_LAYER_2` is highest default layer state.
+*NOTE: that `auto_mouse_layer_off` is used here instead of `remove_auto_mouse_layer` as `default_layer_state_set_*` stack is separate from the `layer_state_set_*` stack* if something similar was to be done in `layer_state_set_user `state = remove_auto_mouse_layer(state, false)` should be used instead
+*ADDITIONAL NOTE: `AUTO_MOUSE_TARGET_LAYER` is checked if already set to avoid deactivating the target layer unless needed*
+
+```c
+// in keymap.c
+layer_state_t default_layer_state_set_user(layer_state_t state) {
+ // switch on change in default layer need to check if target layer already set to avoid turning off layer needlessly
+ switch(get_highest_layer(state)) {
+ case _DEFAULT_LAYER_2:
+ if ((AUTO_MOUSE_TARGET_LAYER) == _MOUSE_LAYER_2) break;
+ auto_mouse_layer_off();
+ set_auto_mouse_layer(_MOUSE_LAYER_2);
+ break;
+
+ default:
+ if((AUTO_MOUSE_TARGET_LAYER) == _MOUSE_LAYER_1) break;
+ auto_mouse_layer_off();
+ set_auto_mouse_layer(_MOUSE_LAYER_1);
+ }
+ return state;
+}
+```
+
+### Use custom keys to control auto mouse:
+Custom key records could also be created that control the auto mouse feature.
+The code example below would create a custom key that would toggle the auto mouse feature on and off when pressed while also setting a bool that could be used to disable other code that may turn it on such as the layer code above.
+
+```c
+// in config.h:
+enum user_custom_keycodes {
+ AM_Toggle = SAFE_RANGE
+};
+
+// in keymap.c:
+// set up global bool to adjust other user code
+bool auto_mouse_tg_off = !AUTO_MOUSE_ENABLED;
+
+bool process_record_user(uint16_t keycode, keyrecord_t* record) {
+ switch (keycode) {
+ // toggle auto mouse enable key
+ case AM_Toggle:
+ if(record->event.pressed) { // key down
+ auto_mouse_layer_off(); // disable target layer if needed
+ set_auto_mouse_enabled((AUTO_MOUSE_ENABLED) ^ 1);
+ auto_mouse_tg_off = !get_auto_mouse_enabled();
+ } // do nothing on key up
+ return false; // prevent further processing of keycode
+ }
+}
+```
+
+
+## Customize Target Layer Activation
+
+Layer activation can be customized by overwriting the `auto_mouse_activation` function. This function is checked every time `pointing_device_task` is called when inactive and every `AUTO_MOUSE_DEBOUNCE` ms when active, and will evaluate pointing device level conditions that trigger target layer activation. When it returns true, the target layer will be activated barring the usual exceptions _(e.g. delay time has not expired)_.
+
+By default it will return true if any of the `mouse_report` axes `x`,`y`,`h`,`v` are non zero, or if there is any mouse buttons active in `mouse_report`.
+_Note: The Cirque pinnacle track pad already implements a custom activation function that will activate on touchdown as well as movement all of the default conditions, currently this only works for the master side of split keyboards._
+
+| Function | Description | Return type |
+| :--------------------------------------------------------- | -------------------------------------------------------------------------------- | --------------: |
+| `auto_mouse_activation(report_mouse_t mouse_report)` | Overwritable function that controls target layer activation (when true) | `bool` |
+
+## Auto Mouse for Custom Pointing Device Task
+
+When using a custom pointing device (overwriting `pointing_device_task`) the following code should be somewhere in the `pointing_device_task_*` stack:
+
+```c
+void pointing_device_task(void) {
+ //...Custom pointing device task code
+
+ // handle automatic mouse layer (needs report_mouse_t as input)
+ pointing_device_task_auto_mouse(local_mouse_report);
+
+ //...More custom pointing device task code
+
+ pointing_device_send();
+}
+```
+
+In general the following two functions must be implemented in appropriate locations for auto mouse to function:
+
+| Function | Description | Suggested location |
+| -------------------------------------------------------------- | ------------------------------------------------------------ | ---------------------------: |
+| `pointing_device_task_auto_mouse(report_mouse_t mouse_report)` | handles target layer activation and is_active status updates | `pointing_device_task` stack |
+| `process_auto_mouse(uint16_t keycode, keyrecord_t* record)` | Keycode processing for auto mouse | `process_record` stack |
diff --git a/docs/feature_programmable_button.md b/docs/feature_programmable_button.md
index b1ef555d16..43a9e7fc16 100644
--- a/docs/feature_programmable_button.md
+++ b/docs/feature_programmable_button.md
@@ -1,74 +1,144 @@
-## Programmable Button
+# Programmable Button :id=programmable-button
-Programmable button is a feature that can be used to send keys that have no
-predefined meaning.
-This means they can be processed on the host side by custom software without
-colliding without the operating system trying to interpret these keys.
+Programmable Buttons are keys that have no predefined meaning. This means they can be processed on the host side by custom software without the operating system trying to interpret them.
-The keycodes are emitted according to the HID usage
-"Telephony Device Page" (0x0B), "Programmable button usage" (0x07).
-On Linux (> 5.14) they are handled automatically and translated to `KEY_MACRO#`
-keycodes.
-(Up to `KEY_MACRO30`)
+The keycodes are emitted according to the HID Telephony Device page (`0x0B`), Programmable Button usage (`0x07`). On Linux (> 5.14) they are handled automatically and translated to `KEY_MACRO#` keycodes (up to `KEY_MACRO30`).
-### Enabling Programmable Button support
+?> Currently there is no known support in Windows or macOS. It may be possible to write a custom HID driver to receive these usages, but this is out of the scope of the QMK documentation.
-To enable Programmable Button, add the following line to your keymap’s `rules.mk`:
+## Usage :id=usage
-```c
+Add the following to your `rules.mk`:
+
+```make
PROGRAMMABLE_BUTTON_ENABLE = yes
```
-### Mapping
+## Keycodes :id=keycodes
-In your keymap you can use the following keycodes to map key presses to Programmable Buttons:
+|Key |Aliases|Description |
+|---------------------------|-------|----------------------|
+|`QK_PROGRAMMABLE_BUTTON_1` |`PB_1` |Programmable button 1 |
+|`QK_PROGRAMMABLE_BUTTON_2` |`PB_2` |Programmable button 2 |
+|`QK_PROGRAMMABLE_BUTTON_3` |`PB_3` |Programmable button 3 |
+|`QK_PROGRAMMABLE_BUTTON_4` |`PB_4` |Programmable button 4 |
+|`QK_PROGRAMMABLE_BUTTON_5` |`PB_5` |Programmable button 5 |
+|`QK_PROGRAMMABLE_BUTTON_6` |`PB_6` |Programmable button 6 |
+|`QK_PROGRAMMABLE_BUTTON_7` |`PB_7` |Programmable button 7 |
+|`QK_PROGRAMMABLE_BUTTON_8` |`PB_8` |Programmable button 8 |
+|`QK_PROGRAMMABLE_BUTTON_9` |`PB_9` |Programmable button 9 |
+|`QK_PROGRAMMABLE_BUTTON_10`|`PB_10`|Programmable button 10|
+|`QK_PROGRAMMABLE_BUTTON_11`|`PB_11`|Programmable button 11|
+|`QK_PROGRAMMABLE_BUTTON_12`|`PB_12`|Programmable button 12|
+|`QK_PROGRAMMABLE_BUTTON_13`|`PB_13`|Programmable button 13|
+|`QK_PROGRAMMABLE_BUTTON_14`|`PB_14`|Programmable button 14|
+|`QK_PROGRAMMABLE_BUTTON_15`|`PB_15`|Programmable button 15|
+|`QK_PROGRAMMABLE_BUTTON_16`|`PB_16`|Programmable button 16|
+|`QK_PROGRAMMABLE_BUTTON_17`|`PB_17`|Programmable button 17|
+|`QK_PROGRAMMABLE_BUTTON_18`|`PB_18`|Programmable button 18|
+|`QK_PROGRAMMABLE_BUTTON_19`|`PB_19`|Programmable button 19|
+|`QK_PROGRAMMABLE_BUTTON_20`|`PB_20`|Programmable button 20|
+|`QK_PROGRAMMABLE_BUTTON_21`|`PB_21`|Programmable button 21|
+|`QK_PROGRAMMABLE_BUTTON_22`|`PB_22`|Programmable button 22|
+|`QK_PROGRAMMABLE_BUTTON_23`|`PB_23`|Programmable button 23|
+|`QK_PROGRAMMABLE_BUTTON_24`|`PB_24`|Programmable button 24|
+|`QK_PROGRAMMABLE_BUTTON_25`|`PB_25`|Programmable button 25|
+|`QK_PROGRAMMABLE_BUTTON_26`|`PB_26`|Programmable button 26|
+|`QK_PROGRAMMABLE_BUTTON_27`|`PB_27`|Programmable button 27|
+|`QK_PROGRAMMABLE_BUTTON_28`|`PB_28`|Programmable button 28|
+|`QK_PROGRAMMABLE_BUTTON_29`|`PB_29`|Programmable button 29|
+|`QK_PROGRAMMABLE_BUTTON_30`|`PB_30`|Programmable button 30|
+|`QK_PROGRAMMABLE_BUTTON_31`|`PB_31`|Programmable button 31|
+|`QK_PROGRAMMABLE_BUTTON_32`|`PB_32`|Programmable button 32|
-|Key |Description |
-|------------------------|----------------------|
-|`PROGRAMMABLE_BUTTON_1` |Programmable button 1 |
-|`PROGRAMMABLE_BUTTON_2` |Programmable button 2 |
-|`PROGRAMMABLE_BUTTON_3` |Programmable button 3 |
-|`PROGRAMMABLE_BUTTON_4` |Programmable button 4 |
-|`PROGRAMMABLE_BUTTON_5` |Programmable button 5 |
-|`PROGRAMMABLE_BUTTON_6` |Programmable button 6 |
-|`PROGRAMMABLE_BUTTON_7` |Programmable button 7 |
-|`PROGRAMMABLE_BUTTON_8` |Programmable button 8 |
-|`PROGRAMMABLE_BUTTON_9` |Programmable button 9 |
-|`PROGRAMMABLE_BUTTON_10`|Programmable button 10|
-|`PROGRAMMABLE_BUTTON_11`|Programmable button 11|
-|`PROGRAMMABLE_BUTTON_12`|Programmable button 12|
-|`PROGRAMMABLE_BUTTON_13`|Programmable button 13|
-|`PROGRAMMABLE_BUTTON_14`|Programmable button 14|
-|`PROGRAMMABLE_BUTTON_15`|Programmable button 15|
-|`PROGRAMMABLE_BUTTON_16`|Programmable button 16|
-|`PROGRAMMABLE_BUTTON_17`|Programmable button 17|
-|`PROGRAMMABLE_BUTTON_18`|Programmable button 18|
-|`PROGRAMMABLE_BUTTON_19`|Programmable button 19|
-|`PROGRAMMABLE_BUTTON_20`|Programmable button 20|
-|`PROGRAMMABLE_BUTTON_21`|Programmable button 21|
-|`PROGRAMMABLE_BUTTON_22`|Programmable button 22|
-|`PROGRAMMABLE_BUTTON_23`|Programmable button 23|
-|`PROGRAMMABLE_BUTTON_24`|Programmable button 24|
-|`PROGRAMMABLE_BUTTON_25`|Programmable button 25|
-|`PROGRAMMABLE_BUTTON_26`|Programmable button 26|
-|`PROGRAMMABLE_BUTTON_27`|Programmable button 27|
-|`PROGRAMMABLE_BUTTON_28`|Programmable button 28|
-|`PROGRAMMABLE_BUTTON_29`|Programmable button 29|
-|`PROGRAMMABLE_BUTTON_30`|Programmable button 30|
-|`PROGRAMMABLE_BUTTON_31`|Programmable button 31|
-|`PROGRAMMABLE_BUTTON_32`|Programmable button 32|
-|`PB_1` to `PB_32` |Aliases for keymaps |
+## API :id=api
-### API
+### `void programmable_button_clear(void)` :id=api-programmable-button-clear
-You can also use a dedicated API defined in `programmable_button.h` to interact with this feature:
+Clear the programmable button report.
-```
-void programmable_button_clear(void);
-void programmable_button_send(void);
-void programmable_button_on(uint8_t code);
-void programmable_button_off(uint8_t code);
-bool programmable_button_is_on(uint8_t code);
-uint32_t programmable_button_get_report(void);
-void programmable_button_set_report(uint32_t report);
-```
+---
+
+### `void programmable_button_add(uint8_t index)` :id=api-programmable-button-add
+
+Set the state of a button.
+
+#### Arguments :id=api-programmable-button-add-arguments
+
+ - `uint8_t index`
+ The index of the button to press, from 0 to 31.
+
+---
+
+### `void programmable_button_remove(uint8_t index)` :id=api-programmable-button-remove
+
+Reset the state of a button.
+
+#### Arguments :id=api-programmable-button-remove-arguments
+
+ - `uint8_t index`
+ The index of the button to release, from 0 to 31.
+
+---
+
+### `void programmable_button_register(uint8_t index)` :id=api-programmable-button-register
+
+Set the state of a button, and flush the report.
+
+#### Arguments :id=api-programmable-button-register-arguments
+
+ - `uint8_t index`
+ The index of the button to press, from 0 to 31.
+
+---
+
+### `void programmable_button_unregister(uint8_t index)` :id=api-programmable-button-unregister
+
+Reset the state of a button, and flush the report.
+
+#### Arguments :id=api-programmable-button-unregister-arguments
+
+ - `uint8_t index`
+ The index of the button to release, from 0 to 31.
+
+---
+
+### `bool programmable_button_is_on(uint8_t index)` :id=api-programmable-button-is-on
+
+Get the state of a button.
+
+#### Arguments :id=api-programmable-button-is-on-arguments
+
+ - `uint8_t index`
+ The index of the button to check, from 0 to 31.
+
+#### Return Value :id=api-programmable-button-is-on-return
+
+`true` if the button is pressed.
+
+---
+
+### `void programmable_button_flush(void)` :id=api-programmable-button-flush
+
+Send the programmable button report to the host.
+
+---
+
+### `uint32_t programmable_button_get_report(void)` :id=api-programmable-button-get-report
+
+Get the programmable button report.
+
+#### Return Value :id=api-programmable-button-get-report-return
+
+The bitmask of programmable button states.
+
+---
+
+### `void programmable_button_set_report(uint32_t report)` :id=api-programmable-button-set-report
+
+Set the programmable button report.
+
+#### Arguments :id=api-programmable-button-set-report-arguments
+
+ - `uint32_t report`
+ A bitmask of programmable button states.
diff --git a/docs/feature_ps2_mouse.md b/docs/feature_ps2_mouse.md
index c980705ae7..e714d9b867 100644
--- a/docs/feature_ps2_mouse.md
+++ b/docs/feature_ps2_mouse.md
@@ -32,13 +32,14 @@ In rules.mk:
```make
PS2_MOUSE_ENABLE = yes
-PS2_USE_BUSYWAIT = yes
+PS2_ENABLE = yes
+PS2_DRIVER = busywait
```
In your keyboard config.h:
```c
-#ifdef PS2_USE_BUSYWAIT
+#ifdef PS2_DRIVER_BUSYWAIT
# define PS2_CLOCK_PIN D1
# define PS2_DATA_PIN D2
#endif
@@ -52,13 +53,14 @@ In rules.mk:
```make
PS2_MOUSE_ENABLE = yes
-PS2_USE_INT = yes
+PS2_ENABLE = yes
+PS2_DRIVER = interrupt
```
In your keyboard config.h:
```c
-#ifdef PS2_USE_INT
+#ifdef PS2_DRIVER_INTERRUPT
#define PS2_CLOCK_PIN D2
#define PS2_DATA_PIN D5
@@ -84,7 +86,8 @@ In rules.mk:
```
PS2_MOUSE_ENABLE = yes
-PS2_USE_INT = yes
+PS2_ENABLE = yes
+PS2_DRIVER = interrupt
```
In your keyboard config.h:
@@ -108,13 +111,14 @@ In rules.mk:
```make
PS2_MOUSE_ENABLE = yes
-PS2_USE_USART = yes
+PS2_ENABLE = yes
+PS2_DRIVER = usart
```
In your keyboard config.h:
```c
-#ifdef PS2_USE_USART
+#ifdef PS2_DRIVER_USART
#define PS2_CLOCK_PIN D5
#define PS2_DATA_PIN D2
diff --git a/docs/feature_rgb_matrix.md b/docs/feature_rgb_matrix.md
index 5cdb4dac08..f5653b99e0 100644
--- a/docs/feature_rgb_matrix.md
+++ b/docs/feature_rgb_matrix.md
@@ -23,7 +23,7 @@ You can use between 1 and 4 IS31FL3731 IC's. Do not specify `DRIVER_ADDR_` de
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
| `ISSI_3731_DEGHOST` | (Optional) Set this define to enable de-ghosting by halving Vcc during blanking time | |
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
-| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
+| `RGB_MATRIX_LED_COUNT` | (Required) How many RGB lights are present across all drivers | |
| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | |
| `DRIVER_ADDR_2` | (Optional) Address for the second RGB driver | |
| `DRIVER_ADDR_3` | (Optional) Address for the third RGB driver | |
@@ -45,17 +45,17 @@ Here is an example using 2 drivers.
#define DRIVER_COUNT 2
#define DRIVER_1_LED_TOTAL 25
#define DRIVER_2_LED_TOTAL 24
-#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
+#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
```
-!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
+!> Note the parentheses, this is so when `RGB_MATRIX_LED_COUNT` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
For split keyboards using `RGB_MATRIX_SPLIT` with an LED driver, you can either have the same driver address or different driver addresses. If using different addresses, use `DRIVER_ADDR_1` for one and `DRIVER_ADDR_2` for the other one. Then, in `g_is31_leds`, fill out the correct driver index (0 or 1). If using one address, use `DRIVER_ADDR_1` for both, and use index 0 for `g_is31_leds`.
Define these arrays listing all the LEDs in your `.c`:
```c
-const is31_led PROGMEM g_is31_leds[DRIVER_LED_TOTAL] = {
+const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = {
/* Refer to IS31 manual for these locations
* driver
* | R location
@@ -86,10 +86,11 @@ You can use between 1 and 4 IS31FL3733 IC's. Do not specify `DRIVER_ADDR_` de
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
| `ISSI_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3733B only | 0 |
+| `ISSI_GLOBALCURRENT` | (Optional) Configuration for the Global Current Register | 0xFF |
| `ISSI_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
| `ISSI_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
-| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
+| `RGB_MATRIX_LED_COUNT` | (Required) How many RGB lights are present across all drivers | |
| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | |
| `DRIVER_ADDR_2` | (Optional) Address for the second RGB driver | |
| `DRIVER_ADDR_3` | (Optional) Address for the third RGB driver | |
@@ -130,17 +131,17 @@ Here is an example using 2 drivers.
#define DRIVER_COUNT 2
#define DRIVER_1_LED_TOTAL 58
#define DRIVER_2_LED_TOTAL 10
-#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
+#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
```
-!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
+!> Note the parentheses, this is so when `RGB_MATRIX_LED_COUNT` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
Currently only 4 drivers are supported, but it would be trivial to support all 8 combinations.
Define these arrays listing all the LEDs in your `.c`:
```c
-const is31_led PROGMEM g_is31_leds[DRIVER_LED_TOTAL] = {
+const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = {
/* Refer to IS31 manual for these locations
* driver
* | R location
@@ -163,7 +164,7 @@ There is basic support for addressable RGB matrix lighting with the I2C IS31FL37
RGB_MATRIX_ENABLE = yes
RGB_MATRIX_DRIVER = IS31FL3737
```
-You can use between 1 and 2 IS31FL3737 IC's. Do not specify `DRIVER_ADDR_2` define for second IC if not present on your keyboard.
+You can use between 1 and 4 IS31FL3737 IC's. Do not specify `DRIVER_ADDR_` defines for IC's that are not present on your keyboard.
Configure the hardware via your `config.h`:
@@ -172,12 +173,15 @@ Configure the hardware via your `config.h`:
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
| `ISSI_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3737B only | 0 |
+| `ISSI_GLOBALCURRENT` | (Optional) Configuration for the Global Current Register | 0xFF |
| `ISSI_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
| `ISSI_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
-| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
+| `RGB_MATRIX_LED_COUNT` | (Required) How many RGB lights are present across all drivers | |
| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | |
| `DRIVER_ADDR_2` | (Optional) Address for the second RGB driver | |
+| `DRIVER_ADDR_3` | (Optional) Address for the third RGB driver | |
+| `DRIVER_ADDR_4` | (Optional) Address for the fourth RGB driver | |
The IS31FL3737 IC's have on-chip resistors that can be enabled to allow for de-ghosting of the RGB matrix. By default these resistors are not enabled (`ISSI_SWPULLUP`/`ISSI_CSPULLUP` are given the value of`PUR_0R`), the values that can be set to enable de-ghosting are as follows:
@@ -210,16 +214,16 @@ Here is an example using 2 drivers.
#define DRIVER_COUNT 2
#define DRIVER_1_LED_TOTAL 30
#define DRIVER_2_LED_TOTAL 36
-#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
+#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
```
-!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
+!> Note the parentheses, this is so when `RGB_MATRIX_LED_COUNT` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
Currently only 2 drivers are supported, but it would be trivial to support all 4 combinations.
Define these arrays listing all the LEDs in your `.c`:
```c
-const is31_led PROGMEM g_is31_leds[DRIVER_LED_TOTAL] = {
+const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = {
/* Refer to IS31 manual for these locations
* driver
* | R location
@@ -231,7 +235,7 @@ const is31_led PROGMEM g_is31_leds[DRIVER_LED_TOTAL] = {
}
```
-Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3737.pdf) and the header file `drivers/led/issi/is31fl3737.h`. The `driver` is the index of the driver you defined in your `config.h` (Only `0`, `1` for now).
+Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3737.pdf) and the header file `drivers/led/issi/is31fl3737.h`. The `driver` is the index of the driver you defined in your `config.h` (Only `0`, `1`, `2`, or `3` for now).
---
### IS31FLCOMMON :id=is31flcommon
@@ -261,14 +265,14 @@ Configure the hardware via your `config.h`:
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
-| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
+| `RGB_MATRIX_LED_COUNT` | (Required) How many RGB lights are present across all drivers | |
| `DRIVER_ADDR_1` | (Optional) Address for the first RGB driver | |
| `DRIVER_ADDR_` | (Required) Address for the additional RGB drivers | |
| `ISSI_SSR_` | (Optional) Configuration for the Spread Spectrum Register | |
| `ISSI_CONFIGURATION` | (Optional) Configuration for the Configuration Register | |
| `ISSI_GLOBALCURRENT` | (Optional) Configuration for the Global Current Register | 0xFF |
| `ISSI_PULLDOWNUP` | (Optional) Configuration for the Pull Up & Pull Down Register | |
-| `ISSI_TEMP` | (Optional) Configuration for the Tempature Register | |
+| `ISSI_TEMP` | (Optional) Configuration for the Temperature Register | |
| `ISSI_PWM_ENABLE` | (Optional) Configuration for the PWM Enable Register | |
| `ISSI_PWM_SET` | (Optional) Configuration for the PWM Setting Register | |
| `ISSI_SCAL_RED` | (Optional) Configuration for the RED LEDs in Scaling Registers | 0xFF |
@@ -298,17 +302,17 @@ Here is an example using 2 drivers.
#define DRIVER_COUNT 2
#define DRIVER_1_LED_TOTAL 66
#define DRIVER_2_LED_TOTAL 42
-#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
+#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
```
-!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
+!> Note the parentheses, this is so when `RGB_MATRIX_LED_COUNT` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
Currently only 4 drivers are supported, but it would be trivial to support for more. Note that using a combination of different drivers is not supported. All drivers must be of the same model.
Define these arrays listing all the LEDs in your `.c`:
```c
-const is31_led __flash g_is31_leds[DRIVER_LED_TOTAL] = {
+const is31_led __flash g_is31_leds[RGB_MATRIX_LED_COUNT] = {
/* Refer to IS31 manual for these locations
* driver
* | R location
@@ -359,7 +363,7 @@ Configure the hardware via your `config.h`:
// The pin connected to the data pin of the LEDs
#define RGB_DI_PIN D7
// The number of LEDs connected
-#define DRIVER_LED_TOTAL 70
+#define RGB_MATRIX_LED_COUNT 70
```
?> There are additional configuration options for ARM controllers that offer increased performance over the default bitbang driver. Please see [WS2812 Driver](ws2812_driver.md) for more information.
@@ -383,7 +387,7 @@ Configure the hardware via your `config.h`:
// The pin connected to the clock pin of the LEDs
#define RGB_CI_PIN D6
// The number of LEDs connected
-#define DRIVER_LED_TOTAL 70
+#define RGB_MATRIX_LED_COUNT 70
```
---
@@ -406,9 +410,10 @@ You can use up to 2 AW20216 IC's. Do not specify `DRIVER__xxx` defines for IC
| `DRIVER_1_LED_TOTAL` | (Required) How many RGB lights are connected to first RGB driver | |
| `DRIVER_2_LED_TOTAL` | (Optional) How many RGB lights are connected to second RGB driver | |
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
-| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
+| `RGB_MATRIX_LED_COUNT` | (Required) How many RGB lights are present across all drivers | |
| `AW_SCALING_MAX` | (Optional) LED current scaling value (0-255, higher values mean LED is brighter at full PWM) | 150 |
| `AW_GLOBAL_CURRENT_MAX` | (Optional) Driver global current limit (0-255, higher values means the driver may consume more power) | 150 |
+| `AW_SPI_MODE` | (Optional) Mode for SPI communication (0-3, defines polarity and phase of the clock) | 3 |
| `AW_SPI_DIVISOR` | (Optional) Clock divisor for SPI communication (powers of 2, smaller numbers means faster communication, should not be less than 4) | 4 |
Here is an example using 2 drivers.
@@ -423,15 +428,15 @@ Here is an example using 2 drivers.
#define DRIVER_COUNT 2
#define DRIVER_1_LED_TOTAL 66
#define DRIVER_2_LED_TOTAL 32
-#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
+#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
```
-!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
+!> Note the parentheses, this is so when `RGB_MATRIX_LED_COUNT` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
Define these arrays listing all the LEDs in your `.c`:
```c
-const aw_led PROGMEM g_aw_leds[DRIVER_LED_TOTAL] = {
+const aw_led PROGMEM g_aw_leds[RGB_MATRIX_LED_COUNT] = {
/* Each AW20216 channel is controlled by a register at some offset between 0x00
* and 0xD7 inclusive.
* See drivers/awinic/aw20216.h for the mapping between register offsets and
@@ -557,7 +562,7 @@ enum rgb_matrix_effects {
RGB_MATRIX_CYCLE_UP_DOWN, // Full gradient scrolling top to bottom
RGB_MATRIX_CYCLE_OUT_IN, // Full gradient scrolling out to in
RGB_MATRIX_CYCLE_OUT_IN_DUAL, // Full dual gradients scrolling out to in
- RGB_MATRIX_RAINBOW_MOVING_CHEVRON, // Full gradent Chevron shapped scrolling left to right
+ RGB_MATRIX_RAINBOW_MOVING_CHEVRON, // Full gradient Chevron shapped scrolling left to right
RGB_MATRIX_CYCLE_PINWHEEL, // Full gradient spinning pinwheel around center of keyboard
RGB_MATRIX_CYCLE_SPIRAL, // Full gradient spinning spiral around center of keyboard
RGB_MATRIX_DUAL_BEACON, // Full gradient spinning around center of keyboard
@@ -665,11 +670,36 @@ In order to change the delay of temperature decrease define `RGB_MATRIX_TYPING_H
#define RGB_MATRIX_TYPING_HEATMAP_DECREASE_DELAY_MS 50
```
-Heatmap effect may not light up the correct adjacent LEDs for certain key matrix layout such as split keyboards. The following define will limit the effect to pressed keys only:
+As heatmap uses the physical position of the leds set in the g_led_config, you may need to tweak the following options to get the best effect for your keyboard. Note the size of this grid is `224x64`.
+
+Limit the distance the effect spreads to surrounding keys.
+
+```c
+#define RGB_MATRIX_TYPING_HEATMAP_SPREAD 40
+```
+
+Limit how hot surrounding keys get from each press.
+
+```c
+#define RGB_MATRIX_TYPING_HEATMAP_AREA_LIMIT 16
+```
+
+Remove the spread effect entirely.
+
```c
#define RGB_MATRIX_TYPING_HEATMAP_SLIM
```
+### RGB Matrix Effect Solid Reactive :id=rgb-matrix-effect-solid-reactive
+
+Solid reactive effects will pulse RGB light on key presses with user configurable hues. To enable gradient mode that will automatically change reactive color, add the following define:
+
+```c
+#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`).
+
## Custom RGB Matrix Effects :id=custom-rgb-matrix-effects
By setting `RGB_MATRIX_CUSTOM_USER = yes` in `rules.mk`, new effects can be defined directly from your keymap or userspace, without having to edit any QMK core files. To declare new effects, create a `rgb_matrix_user.inc` file in the user keymap directory or userspace folder.
@@ -763,17 +793,16 @@ These are defined in [`color.h`](https://github.com/qmk/qmk_firmware/blob/master
#define RGB_MATRIX_KEYPRESSES // reacts to keypresses
#define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS // enable framebuffer effects
-#define RGB_DISABLE_TIMEOUT 0 // number of milliseconds to wait until rgb automatically turns off
-#define RGB_DISABLE_AFTER_TIMEOUT 0 // OBSOLETE: number of ticks to wait until disabling effects
+#define RGB_MATRIX_TIMEOUT 0 // number of milliseconds to wait until rgb automatically turns off
#define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
-#define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
+#define RGB_MATRIX_LED_PROCESS_LIMIT (RGB_MATRIX_LED_COUNT + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
#define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255
-#define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT // Sets the default mode, if none has been set
-#define RGB_MATRIX_STARTUP_HUE 0 // Sets the default hue value, if none has been set
-#define RGB_MATRIX_STARTUP_SAT 255 // Sets the default saturation value, if none has been set
-#define RGB_MATRIX_STARTUP_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set
-#define RGB_MATRIX_STARTUP_SPD 127 // Sets the default animation speed, if none has been set
+#define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT // Sets the default mode, if none has been set
+#define RGB_MATRIX_DEFAULT_HUE 0 // Sets the default hue 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_SPD 127 // Sets the default animation speed, 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.
// If RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
@@ -796,7 +825,7 @@ Where `28` is an unused index from `eeconfig.h`.
|Function |Description |
|--------------------------------------------|-------------|
|`rgb_matrix_set_color_all(r, g, b)` |Set all of the LEDs to the given RGB value, where `r`/`g`/`b` are between 0 and 255 (not written to EEPROM) |
-|`rgb_matrix_set_color(index, r, g, b)` |Set a single LED to the given RGB value, where `r`/`g`/`b` are between 0 and 255, and `index` is between 0 and `DRIVER_LED_TOTAL` (not written to EEPROM) |
+|`rgb_matrix_set_color(index, r, g, b)` |Set a single LED to the given RGB value, where `r`/`g`/`b` are between 0 and 255, and `index` is between 0 and `RGB_MATRIX_LED_COUNT` (not written to EEPROM) |
### Disable/Enable Effects :id=disable-enable-effects
|Function |Description |
@@ -861,16 +890,21 @@ Where `28` is an unused index from `eeconfig.h`.
If you want to set custom indicators, such as an LED for Caps Lock, or layer indication, you can use the `rgb_matrix_indicators_kb` or `rgb_matrix_indicators_user` function for that:
```c
-void rgb_matrix_indicators_kb(void) {
+bool rgb_matrix_indicators_kb(void) {
+ if (!rgb_matrix_indicators_user()) {
+ return false;
+ }
rgb_matrix_set_color(index, red, green, blue);
+ return true;
}
```
In addition, there are the advanced indicator functions. These are aimed at those with heavily customized displays, where rendering every LED per cycle is expensive. Such as some of the "drashna" layouts. This includes a special macro to help make this easier to use: `RGB_MATRIX_INDICATOR_SET_COLOR(i, r, g, b)`.
```c
-void 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) {
RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue);
+ return false;
}
```
@@ -878,21 +912,22 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
Caps Lock indicator on alphanumeric flagged keys:
```c
-void 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) {
if (host_keyboard_led_state().caps_lock) {
- for (uint8_t i = led_min; i <= led_max; i++) {
+ for (uint8_t i = led_min; i < led_max; i++) {
if (g_led_config.flags[i] & LED_FLAG_KEYLIGHT) {
rgb_matrix_set_color(i, RGB_RED);
}
}
}
+ return false;
}
```
Layer indicator on all keys:
```c
-void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
- for (uint8_t i = led_min; i <= led_max; i++) {
+bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
+ for (uint8_t i = led_min; i < led_max; i++) {
switch(get_highest_layer(layer_state|default_layer_state)) {
case 2:
rgb_matrix_set_color(i, RGB_BLUE);
@@ -904,12 +939,13 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
break;
}
}
+ return false;
}
```
Layer indicator only on keys with configured keycodes:
```c
-void 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) {
if (get_highest_layer(layer_state) > 0) {
uint8_t layer = get_highest_layer(layer_state);
@@ -917,13 +953,14 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
for (uint8_t col = 0; col < MATRIX_COLS; ++col) {
uint8_t index = g_led_config.matrix_co[row][col];
- if (index >= led_min && index <= led_max && index != NO_LED &&
+ if (index >= led_min && index < led_max && index != NO_LED &&
keymap_key_to_keycode(layer, (keypos_t){col,row}) > KC_TRNS) {
rgb_matrix_set_color(index, RGB_GREEN);
}
}
}
}
+ return false;
}
```
@@ -934,7 +971,7 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
This example sets the modifiers to be a specific color based on the layer state. You can use a switch case here, instead, if you would like. This uses HSV and then converts to RGB, because this allows the brightness to be limited (important when using the WS2812 driver).
```c
-void 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};
if (layer_state_is(layer_state, 2)) {
@@ -948,23 +985,25 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
}
RGB 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
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
}
}
+ return false;
}
```
If you want to indicate a Host LED status (caps lock, num lock, etc), you can use something like this to light up the caps lock key:
```c
-void 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) {
if (host_keyboard_led_state().caps_lock) {
RGB_MATRIX_INDICATOR_SET_COLOR(5, 255, 255, 255); // assuming caps lock is at led #5
} else {
RGB_MATRIX_INDICATOR_SET_COLOR(5, 0, 0, 0);
}
+ return false;
}
```
diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md
index 11d4f89950..1159347112 100644
--- a/docs/feature_rgblight.md
+++ b/docs/feature_rgblight.md
@@ -105,7 +105,7 @@ Your RGB lighting can be configured by placing these `#define`s in your `config.
## Effects and Animations
Not only can this lighting be whatever color you want,
-if `RGBLIGHT_EFFECT_xxxx` or `RGBLIGHT_ANIMATIONS` is defined, you also have a number of animation modes at your disposal:
+if `RGBLIGHT_EFFECT_xxxx` is defined, you also have a number of animation modes at your disposal:
|Mode number symbol |Additional number |Description |
|-----------------------------|-------------------|---------------------------------------|
@@ -125,13 +125,14 @@ Check out [this video](https://youtube.com/watch?v=VKrpPAHlisY) for a demonstrat
Note: For versions older than 0.6.117, The mode numbers were written directly. In `quantum/rgblight/rgblight.h` there is a contrast table between the old mode number and the current symbol.
+
### Effect and Animation Toggles
Use these defines to add or remove animations from the firmware. When you are running low on flash space, it can be helpful to disable animations you are not using.
|Define |Default |Description |
|------------------------------------|-------------|-------------------------------------------------------------------------|
-|`RGBLIGHT_ANIMATIONS` |*Not defined*|Enable all additional animation modes. |
+|`RGBLIGHT_ANIMATIONS` |*Not defined*|Enable all additional animation modes. (deprecated) |
|`RGBLIGHT_EFFECT_ALTERNATING` |*Not defined*|Enable alternating animation mode. |
|`RGBLIGHT_EFFECT_BREATHING` |*Not defined*|Enable breathing animation mode. |
|`RGBLIGHT_EFFECT_CHRISTMAS` |*Not defined*|Enable christmas animation mode. |
@@ -143,6 +144,8 @@ Use these defines to add or remove animations from the firmware. When you are ru
|`RGBLIGHT_EFFECT_STATIC_GRADIENT` |*Not defined*|Enable static gradient mode. |
|`RGBLIGHT_EFFECT_TWINKLE` |*Not defined*|Enable twinkle animation mode. |
+!> `RGBLIGHT_ANIMATIONS` is being deprecated and animation modes should be explicitly defined.
+
### Effect and Animation Settings
The following options are used to tweak the various animations:
@@ -162,14 +165,12 @@ The following options are used to tweak the various animations:
|`RGBLIGHT_EFFECT_TWINKLE_PROBABILITY`|`1/127` |Adjusts how likely each LED is to twinkle (on each animation step) |
### Example Usage to Reduce Memory Footprint
- 1. Remove `RGBLIGHT_ANIMATIONS` from `config.h`.
- 1. Selectively add the animations you want to enable. The following would enable two animations and save about 4KiB:
+ 1. Selectively disable the animations you want to enable. The following would enable two animations and save about 4KiB:
```diff
#undef RGBLED_NUM
--#define RGBLIGHT_ANIMATIONS
-+#define RGBLIGHT_EFFECT_STATIC_GRADIENT
-+#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
++#undef RGBLIGHT_EFFECT_STATIC_GRADIENT
++#undef RGBLIGHT_EFFECT_RAINBOW_SWIRL
#define RGBLED_NUM 12
#define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8
@@ -301,7 +302,7 @@ void keyboard_post_init_user(void) {
// after the flag has been flipped...
void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
- case DEBUG:
+ case QK_DEBUG_TOGGLE:
rgblight_blink_layer(debug_enable ? 0 : 1, 500);
break;
@@ -318,13 +319,13 @@ You can also use `rgblight_blink_layer_repeat` to specify the amount of times th
```c
void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
- case DEBUG:
+ case QK_DEBUG_TOGGLE:
rgblight_blink_layer_repeat(debug_enable ? 0 : 1, 200, 3);
break;
}
}
```
-would turn the layer 0 (or 1) on and off again three times when `DEBUG` is pressed.
+would turn the layer 0 (or 1) on and off again three times when `DB_TOGG` is pressed.
Blinking accumulates layers so if multiple layers are set blinking at the same time they will all blink for the duration and repeat times of the last layer to be blinked.
To stop these other layers from blinking use `rgblight_unblink_layer` or `rgblight_unblink_all_but_layer`:
diff --git a/docs/feature_secure.md b/docs/feature_secure.md
index ee774b05a8..eaa2b601ae 100644
--- a/docs/feature_secure.md
+++ b/docs/feature_secure.md
@@ -26,12 +26,12 @@ SECURE_ENABLE = yes
## Keycodes
-| Key | Description |
-|------------------|--------------------------------------------------------------------------------|
-| `SECURE_LOCK` | Revert back to a locked state |
-| `SECURE_UNLOCK` | Forces unlock without performing a unlock sequence |
-| `SECURE_TOGGLE` | Toggle directly between locked and unlock without performing a unlock sequence |
-| `SECURE_REQUEST` | Request that user perform the unlock sequence |
+| Key |Aliases | Description |
+|---------------------|---------|--------------------------------------------------------------------------------|
+| `QK_SECURE_LOCK` |`SE_LOCK`| Revert back to a locked state |
+| `QK_SECURE_UNLOCK` |`SE_UNLK`| Forces unlock without performing a unlock sequence |
+| `QK_SECURE_TOGGLE` |`SE_TOGG`| Toggle directly between locked and unlock without performing a unlock sequence |
+| `QK_SECURE_REQUEST` |`SE_REQ` | Request that user perform the unlock sequence |
## Configuration
diff --git a/docs/feature_send_string.md b/docs/feature_send_string.md
new file mode 100644
index 0000000000..67df0224e9
--- /dev/null
+++ b/docs/feature_send_string.md
@@ -0,0 +1,224 @@
+# Send String
+
+The Send String API is part of QMK's macro system. It allows for sequences of keystrokes to be sent automatically.
+
+The full ASCII character set is supported, along with all of the keycodes in the Basic Keycode range (as these are the only ones that will actually be sent to the host).
+
+?> Unicode characters are **not** supported with this API -- see the [Unicode](feature_unicode.md) feature instead.
+
+## Usage
+
+Send String is enabled by default, so there is usually no need for any special setup. However, if it is disabled, add the following to your `rules.mk`:
+
+```make
+SEND_STRING_ENABLE = yes
+```
+
+## Basic Configuration
+
+Add the following to your `config.h`:
+
+|Define |Default |Description |
+|-----------------|----------------|------------------------------------------------------------------------------------------------------------|
+|`SENDSTRING_BELL`|*Not defined* |If the [Audio](feature_audio.md) feature is enabled, the `\a` character (ASCII `BEL`) will beep the speaker.|
+|`BELL_SOUND` |`TERMINAL_SOUND`|The song to play when the `\a` character is encountered. By default, this is an eighth note of C5. |
+
+## Keycodes
+
+The Send String functions accept C string literals, but specific keycodes can be injected with the below macros. All of the keycodes in the [Basic Keycode range](keycodes_basic.md) are supported (as these are the only ones that will actually be sent to the host), but with an `X_` prefix instead of `KC_`.
+
+|Macro |Description |
+|--------------|-------------------------------------------------------------------|
+|`SS_TAP(x)` |Send a keydown, then keyup, event for the given Send String keycode|
+|`SS_DOWN(x)` |Send a keydown event for the given Send String keycode |
+|`SS_UP(x)` |Send a keyup event for the given Send String keycode |
+|`SS_DELAY(ms)`|Wait for `ms` milliseconds |
+
+The following characters are also mapped to their respective keycodes for convenience:
+
+|Character|Hex |ASCII|Keycode |
+|---------|------|-----|--------------|
+|`\b` |`\x08`|`BS` |`KC_BACKSPACE`|
+|`\e` |`\x09`|`ESC`|`KC_ESCAPE` |
+|`\n` |`\x0A`|`LF` |`KC_ENTER` |
+|`\t` |`\x1B`|`TAB`|`KC_TAB` |
+| |`\x7F`|`DEL`|`KC_DELETE` |
+
+### Language Support
+
+By default, Send String assumes your OS keyboard layout is set to US ANSI. If you are using a different keyboard layout, you can [override the lookup tables used to convert ASCII characters to keystrokes](reference_keymap_extras.md#sendstring-support).
+
+## Examples
+
+### Hello World
+
+A simple custom keycode which types out "Hello, world!" and the Enter key when pressed.
+
+Add the following to your `keymap.c`:
+
+```c
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case SS_HELLO:
+ if (record->event.pressed) {
+ SEND_STRING("Hello, world!\n");
+ }
+ return false;
+ }
+
+ return true;
+}
+```
+
+### Keycode Injection
+
+This example types out opening and closing curly braces, then taps the left arrow key to move the cursor between the two.
+
+```c
+SEND_STRING("{}" SS_TAP(X_LEFT));
+```
+
+This example types Ctrl+A, then Ctrl+C, without releasing Ctrl.
+
+```c
+SEND_STRING(SS_LCTL("ac"));
+```
+
+## API
+
+### `void send_string(const char *string)`
+
+Type out a string of ASCII characters.
+
+This function simply calls `send_string_with_delay(string, 0)`.
+
+#### Arguments
+
+ - `const char *string`
+ The string to type out.
+
+---
+
+### `void send_string_with_delay(const char *string, uint8_t interval)`
+
+Type out a string of ASCII characters, with a delay between each character.
+
+#### Arguments
+
+ - `const char *string`
+ The string to type out.
+ - `uint8_t interval`
+ The amount of time, in milliseconds, to wait before typing the next character.
+
+---
+
+### `void send_string_P(const char *string)`
+
+Type out a PROGMEM string of ASCII characters.
+
+On ARM devices, this function is simply an alias for `send_string_with_delay(string, 0)`.
+
+#### Arguments
+
+ - `const char *string`
+ The string to type out.
+
+---
+
+### `void send_string_with_delay_P(const char *string, uint8_t interval)`
+
+Type out a PROGMEM string of ASCII characters, with a delay between each character.
+
+On ARM devices, this function is simply an alias for `send_string_with_delay(string, interval)`.
+
+#### Arguments
+
+ - `const char *string`
+ The string to type out.
+ - `uint8_t interval`
+ The amount of time, in milliseconds, to wait before typing the next character.
+
+---
+
+### `void send_char(char ascii_code)`
+
+Type out an ASCII character.
+
+#### Arguments
+
+ - `char ascii_code`
+ The character to type.
+
+---
+
+### `void send_dword(uint32_t number)`
+
+Type out an eight digit (unsigned 32-bit) hexadecimal value.
+
+The format is `[0-9a-f]{8}`, eg. `00000000` through `ffffffff`.
+
+#### Arguments
+
+ - `uint32_t number`
+ The value to type, from 0 to 4,294,967,295.
+
+---
+
+### `void send_word(uint16_t number)`
+
+Type out a four digit (unsigned 16-bit) hexadecimal value.
+
+The format is `[0-9a-f]{4}`, eg. `0000` through `ffff`.
+
+#### Arguments
+
+ - `uint16_t number`
+ The value to type, from 0 to 65,535.
+
+---
+
+### `void send_byte(uint8_t number)`
+
+Type out a two digit (8-bit) hexadecimal value.
+
+The format is `[0-9a-f]{2}`, eg. `00` through `ff`.
+
+#### Arguments
+
+ - `uint8_t number`
+ The value to type, from 0 to 255.
+
+---
+
+### `void send_nibble(uint8_t number)`
+
+Type out a single hexadecimal digit.
+
+The format is `[0-9a-f]{1}`, eg. `0` through `f`.
+
+#### Arguments
+
+ - `uint8_t number`
+ The value to type, from 0 to 15.
+
+---
+
+### `void tap_random_base64(void)`
+
+Type a pseudorandom character from the set `A-Z`, `a-z`, `0-9`, `+` and `/`.
+
+---
+
+### `SEND_STRING(string)`
+
+Shortcut macro for `send_string_with_delay_P(PSTR(string), 0)`.
+
+On ARM devices, this define evaluates to `send_string_with_delay(string, 0)`.
+
+---
+
+### `SEND_STRING_DELAY(string, interval)`
+
+Shortcut macro for `send_string_with_delay_P(PSTR(string), interval)`.
+
+On ARM devices, this define evaluates to `send_string_with_delay(string, interval)`.
diff --git a/docs/feature_space_cadet.md b/docs/feature_space_cadet.md
index e290964241..63a3881da8 100644
--- a/docs/feature_space_cadet.md
+++ b/docs/feature_space_cadet.md
@@ -5,22 +5,22 @@ Steve Losh described the [Space Cadet Shift](https://stevelosh.com/blog/2012/10/
## Usage
Firstly, in your keymap, do one of the following:
-- Replace the Left Shift key with `KC_LSPO` (Left Shift, Parenthesis Open), and Right Shift with `KC_RSPC` (Right Shift, Parenthesis Close).
-- Replace the Left Control key with `KC_LCPO` (Left Control, Parenthesis Open), and Right Control with `KC_RCPC` (Right Control, Parenthesis Close).
-- Replace the Left Alt key with `KC_LAPO` (Left Alt, Parenthesis Open), and Right Alt with `KC_RAPC` (Right Alt, Parenthesis Close).
-- Replace any Shift key in your keymap with `KC_SFTENT` (Right Shift, Enter).
+- Replace the Left Shift key with `SC_LSPO` (Left Shift, Parenthesis Open), and Right Shift with `SC_RSPC` (Right Shift, Parenthesis Close).
+- Replace the Left Control key with `SC_LCPO` (Left Control, Parenthesis Open), and Right Control with `SC_RCPC` (Right Control, Parenthesis Close).
+- Replace the Left Alt key with `SC_LAPO` (Left Alt, Parenthesis Open), and Right Alt with `SC_RAPC` (Right Alt, Parenthesis Close).
+- Replace any Shift key in your keymap with `SC_SENT` (Right Shift, Enter).
## Keycodes
-|Keycode |Description |
-|-----------|-------------------------------------------|
-|`KC_LSPO` |Left Shift when held, `(` when tapped |
-|`KC_RSPC` |Right Shift when held, `)` when tapped |
-|`KC_LCPO` |Left Control when held, `(` when tapped |
-|`KC_RCPC` |Right Control when held, `)` when tapped |
-|`KC_LAPO` |Left Alt when held, `(` when tapped |
-|`KC_RAPC` |Right Alt when held, `)` when tapped |
-|`KC_SFTENT`|Right Shift when held, Enter when tapped |
+|Keycode |Aliases |Description |
+|----------------------------------------------|---------|----------------------------------------|
+|`QK_SPACE_CADET_LEFT_CTRL_PARENTHESIS_OPEN` |`SC_LCPO`|Left Control when held, `(` when tapped |
+|`QK_SPACE_CADET_RIGHT_CTRL_PARENTHESIS_CLOSE` |`SC_RCPC`|Right Control when held, `)` when tapped|
+|`QK_SPACE_CADET_LEFT_SHIFT_PARENTHESIS_OPEN` |`SC_LSPO`|Left Shift when held, `(` when tapped |
+|`QK_SPACE_CADET_RIGHT_SHIFT_PARENTHESIS_CLOSE`|`SC_RSPC`|Right Shift when held, `)` when tapped |
+|`QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN` |`SC_LAPO`|Left Alt when held, `(` when tapped |
+|`QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE` |`SC_RAPC`|Right Alt when held, `)` when tapped |
+|`QK_SPACE_CADET_RIGHT_SHIFT_ENTER` |`SC_SENT`|Right Shift when held, Enter when tapped|
## Caveats
@@ -32,7 +32,7 @@ COMMAND_ENABLE = no
## Configuration
-By default Space Cadet assumes a US ANSI layout, but if your layout uses different keys for parentheses, you can redefine them in your `config.h`. In addition, you can redefine the modifier to send on tap, or even send no modifier at all. The new configuration defines bundle all options up into a single define of 3 key codes in this order: the `Modifier` when held or when used with other keys, the `Tap Modifer` sent when tapped (no modifier if `KC_TRNS`), finally the `Keycode` sent when tapped. Now keep in mind, mods from other keys will still apply to the `Keycode` if say `KC_RSFT` is held while tapping `KC_LSPO` key with `KC_TRNS` as the `Tap Modifer`.
+By default Space Cadet assumes a US ANSI layout, but if your layout uses different keys for parentheses, you can redefine them in your `config.h`. In addition, you can redefine the modifier to send on tap, or even send no modifier at all. The new configuration defines bundle all options up into a single define of 3 key codes in this order: the `Modifier` when held or when used with other keys, the `Tap Modifer` sent when tapped (no modifier if `KC_TRNS`), finally the `Keycode` sent when tapped. Now keep in mind, mods from other keys will still apply to the `Keycode` if say `KC_RSFT` is held while tapping `SC_LSPO` key with `KC_TRNS` as the `Tap Modifer`.
|Define |Default |Description |
|----------------|-------------------------------|---------------------------------------------------------------------------------|
@@ -48,7 +48,7 @@ By default Space Cadet assumes a US ANSI layout, but if your layout uses differe
## Obsolete Configuration
-These defines are used in the above defines internally to support backwards compatibility, so you may continue to use them, however the above defines open up a larger range of flexibility than before. As an example, say you want to not send any modifier when you tap just `KC_LSPO`, with the old defines you had an all or nothing choice of using the `DISABLE_SPACE_CADET_MODIFIER` define. Now you can define that key as: `#define LSPO_KEYS KC_LSFT, KC_TRNS, KC_9`. This tells the system to set Left Shift if held or used with other keys, then on tap send no modifier (transparent) with the `KC_9`.
+These defines are used in the above defines internally to support backwards compatibility, so you may continue to use them, however the above defines open up a larger range of flexibility than before. As an example, say you want to not send any modifier when you tap just `SC_LSPO`, with the old defines you had an all or nothing choice of using the `DISABLE_SPACE_CADET_MODIFIER` define. Now you can define that key as: `#define LSPO_KEYS KC_LSFT, KC_TRNS, KC_9`. This tells the system to set Left Shift if held or used with other keys, then on tap send no modifier (transparent) with the `KC_9`.
|Define |Default |Description |
|------------------------------|-------------|------------------------------------------------------------------|
diff --git a/docs/feature_split_keyboard.md b/docs/feature_split_keyboard.md
index eefafdbf75..0b475cc63d 100644
--- a/docs/feature_split_keyboard.md
+++ b/docs/feature_split_keyboard.md
@@ -143,6 +143,9 @@ Next, you will have to flash the EEPROM files once for the correct hand to the c
* ARM controllers with a DFU compatible bootloader (e.g. Proton-C):
* `:dfu-util-split-left`
* `:dfu-util-split-right`
+* ARM controllers with a UF2 compatible bootloader:
+ * `:uf2-split-left`
+ * `:uf2-split-right`
Example:
@@ -150,11 +153,11 @@ Example:
make crkbd:default:avrdude-split-left
```
-?> ARM controllers using `dfu-util` will require an EEPROM reset after setting handedness. This can be done using the `EEP_RST` keycode or [Bootmagic Lite](feature_bootmagic.md). Controllers using emulated EEPROM will always require handedness parameter when flashing the firmware.
+?> ARM controllers using `dfu-util` will require an EEPROM reset after setting handedness. This can be done using the `EE_CLR` keycode or [Bootmagic Lite](feature_bootmagic.md). Controllers using emulated EEPROM will always require handedness parameter when flashing the firmware.
?> [QMK Toolbox]() can also be used to flash EEPROM handedness files. Place the controller in bootloader mode and select menu option Tools -> EEPROM -> Set Left/Right Hand
-This setting is not changed when re-initializing the EEPROM using the `EEP_RST` key, or using the `eeconfig_init()` function. However, if you reset the EEPROM outside of the firmware's built in options (such as flashing a file that overwrites the `EEPROM`, like how the [QMK Toolbox]()'s "Reset EEPROM" button works), you'll need to re-flash the controller with the `EEPROM` files.
+This setting is not changed when re-initializing the EEPROM using the `EE_CLR` key, or using the `eeconfig_init()` function. However, if you reset the EEPROM outside of the firmware's built in options (such as flashing a file that overwrites the `EEPROM`, like how the [QMK Toolbox]()'s "Reset EEPROM" button works), you'll need to re-flash the controller with the `EEPROM` files.
You can find the `EEPROM` files in the QMK firmware repo, [here](https://github.com/qmk/qmk_firmware/tree/master/quantum/split_common).
@@ -367,7 +370,7 @@ There are some settings that you may need to configure, based on how the hardwar
#define MATRIX_COL_PINS_RIGHT { }
```
-This allows you to specify a different set of pins for the matrix on the right side. This is useful if you have a board with differently-shaped halves that requires a different configuration (such as Keebio's Quefrency).
+This allows you to specify a different set of pins for the matrix on the right side. This is useful if you have a board with differently-shaped halves that requires a different configuration (such as Keebio's Quefrency). The number of pins in the right and left matrices must be the same, if you have a board with a different number of rows or columns on one side, pad out the extra spaces with `NO_PIN` and make sure you add the unused rows or columns to your matrix.
```c
#define DIRECT_PINS_RIGHT { { F1, F0, B0, C7 }, { F4, F5, F6, F7 } }
@@ -419,6 +422,17 @@ This sets the maximum timeout when detecting master/slave when using `SPLIT_USB_
```
This sets the poll frequency when detecting master/slave when using `SPLIT_USB_DETECT`
+```c
+#define SPLIT_WATCHDOG_ENABLE
+```
+
+This will enable a software watchdog on any side delegated as slave and will reboot the keyboard if no successful communication occurs within `SPLIT_WATCHDOG_TIMEOUT`. This can be particularly helpful when `SPLIT_USB_DETECT` delegates both sides as slave in some circumstances.
+
+```c
+#define SPLIT_WATCHDOG_TIMEOUT 3000
+```
+This set the maximum slave timeout when waiting for communication from master when using `SPLIT_WATCHDOG_ENABLE`
+
## Hardware Considerations and Mods
Master/slave delegation is made either by detecting voltage on VBUS connection or waiting for USB communication (`SPLIT_USB_DETECT`). Pro Micro boards can use VBUS detection out of the box and be used with or without `SPLIT_USB_DETECT`.
diff --git a/docs/feature_stenography.md b/docs/feature_stenography.md
index 2b52bb17a6..62d4dabf81 100644
--- a/docs/feature_stenography.md
+++ b/docs/feature_stenography.md
@@ -8,46 +8,107 @@ The [Open Steno Project](https://www.openstenoproject.org/) has built an open-so
Plover can work with any standard QWERTY keyboard, although it is more efficient if the keyboard supports NKRO (n-key rollover) to allow Plover to see all the pressed keys at once. An example keymap for Plover can be found in `planck/keymaps/default`. Switching to the `PLOVER` layer adjusts the position of the keyboard to support the number bar.
-To use Plover with QMK just enable NKRO and optionally adjust your layout if you have anything other than a standard layout. You may also want to purchase some steno-friendly keycaps to make it easier to hit multiple keys.
+To enable NKRO, add `NKRO_ENABLE = yes` in your `rules.mk` and make sure to press `NK_ON` to turn it on because `NKRO_ENABLE = yes` merely adds the possibility of switching to NKRO mode but it doesn't automatically switch to it. If you want to automatically switch, add `#define FORCE_NKRO` in your `config.h`.
+
+You may also need to adjust your layout, either in QMK or in Plover, if you have anything other than a standard layout. You may also want to purchase some steno-friendly keycaps to make it easier to hit multiple keys.
## Plover with Steno Protocol :id=plover-with-steno-protocol
-Plover also understands the language of several steno machines. QMK can speak a couple of these languages, TX Bolt and GeminiPR. An example layout can be found in `planck/keymaps/steno`.
+Plover also understands the language of several steno machines. QMK can speak a couple of these languages: TX Bolt and GeminiPR. An example layout can be found in `planck/keymaps/steno`.
-When QMK speaks to Plover over a steno protocol Plover will not use the keyboard as input. This means that you can switch back and forth between a standard keyboard and your steno keyboard, or even switch layers from Plover to standard and back without needing to activate/deactivate Plover.
+When QMK speaks to Plover over a steno protocol, Plover will not use the keyboard as input. This means that you can switch back and forth between a standard keyboard and your steno keyboard, or even switch layers from Plover to standard and back without needing to activate/deactivate Plover.
-In this mode Plover expects to speak with a steno machine over a serial port so QMK will present itself to the operating system as a virtual serial port in addition to a keyboard. By default QMK will speak the TX Bolt protocol but can be switched to GeminiPR; the last protocol used is stored in non-volatile memory so QMK will use the same protocol on restart.
+In this mode, Plover expects to speak with a steno machine over a serial port so QMK will present itself to the operating system as a virtual serial port in addition to a keyboard.
-> Note: Due to hardware limitations you may not be able to run both a virtual serial port and mouse emulation at the same time.
+> Note: Due to hardware limitations, you might not be able to run both a virtual serial port and mouse emulation at the same time.
+
+!> Serial stenography protocols are not supported on [V-USB keyboards](compatible_microcontrollers#atmel-avr).
+
+To enable stenography protocols, add the following lines to your `rules.mk`:
+```mk
+STENO_ENABLE = yes
+```
### TX Bolt :id=tx-bolt
-TX Bolt communicates the status of 24 keys over a very simple protocol in variable-sized (1-5 byte) packets.
+TX Bolt communicates the status of 24 keys over a simple protocol in variable-sized (1–4 bytes) packets.
+
+To select TX Bolt, add the following lines to your `rules.mk`:
+```mk
+STENO_ENABLE = yes
+STENO_PROTOCOL = txbolt
+```
+
+Each byte of the packet represents a different group of steno keys. Determining the group of a certain byte of the packet is done by checking the first two bits, the remaining bits are set if the corresponding steno key was pressed for the stroke. The last set of keys (as indicated by leading `11`) needs to keep track of less keys than there are bits so one of the bits is constantly 0.
+
+The start of a new packet can be detected by comparing the group “ID” (the two MSBs) of the current byte to that of the previously received byte. If the group “ID” of the current byte is smaller or equal to that of the previous byte, it means that the current byte is the beginning of a new packet.
+
+The format of TX Bolt packets is shown below.
+```
+00HWPKTS 01UE*OAR 10GLBPRF 110#ZDST
+```
+
+Examples of steno strokes and the associated packet:
+- `EUBG` = `01110000 10101000`
+- `WAZ` = `00010000 01000010 11001000`
+- `PHAPBGS` = `00101000 01000010 10101100 11000010`
### GeminiPR :id=geminipr
-GeminiPR encodes 42 keys into a 6-byte packet. While TX Bolt contains everything that is necessary for standard stenography, GeminiPR opens up many more options, including supporting non-English theories.
+GeminiPR encodes 42 keys into a 6-byte packet. While TX Bolt contains everything that is necessary for standard stenography, GeminiPR opens up many more options, including differentiating between top and bottom `S-`, and supporting non-English theories.
+
+To select GeminiPR, add the following lines to your `rules.mk`:
+```mk
+STENO_ENABLE = yes
+STENO_PROTOCOL = geminipr
+```
+
+All packets in the GeminiPR protocol consist of exactly six bytes, used as bit-arrays for different groups of keys. The beginning of a packet is indicated by setting the most significant bit (MSB) to 1 while setting the MSB of the remaining five bytes to 0.
+
+The format of GeminiPR packets is shown below.
+```
+1 Fn #1 #2 #3 #4 #5 #6
+0 S1- S2- T- K- P- W- H-
+0 R- A- O- *1 *2 res1 res2
+0 pwr *3 *4 -E -U -F -R
+0 -P -B -L -G -T -S -D
+0 #7 #8 #9 #A #B #C -Z
+```
+
+Examples of steno strokes and the associated packet:
+- `EUBG` = `10000000 00000000 00000000 00001100 00101000 00000000`
+- `WAZ` = `10000000 00000010 00100000 00000000 00000000 00000001`
+- `PHAPBGS` = `10000000 00000101 00100000 00000000 01101010 00000000`
+
+### Switching protocols on the fly :id=switching-protocols-on-the-fly
+
+If you wish to switch the serial protocol used to transfer the steno chords without having to recompile your keyboard firmware every time, you can press the `QK_STENO_BOLT` and `QK_STENO_GEMINI` keycodes in order to switch protocols on the fly.
+
+To enable these special keycodes, add the following lines to your `rules.mk`:
+```mk
+STENO_ENABLE = yes
+STENO_PROTOCOL = all
+```
+
+If you want to switch protocols programatically, as part of a custom macro for example, don't use `tap_code(QK_STENO_*)`, as `tap_code` only supports [basic keycodes](keycodes_basic). Instead, you should use `steno_set_mode(STENO_MODE_*)`, whose valid arguments are `STENO_MODE_BOLT` and `STENO_MODE_GEMINI`.
+
+The default protocol is Gemini PR but the last protocol used is stored in non-volatile memory so QMK will remember your choice between reboots of your keyboard — assuming that your keyboard features (emulated) EEPROM.
+
+Naturally, this option takes the most amount of firmware space as it needs to compile the code for all the available stenography protocols. In most cases, compiling a single stenography protocol is sufficient.
+
+The default value for `STENO_PROTOCOL` is `all`.
## Configuring QMK for Steno :id=configuring-qmk-for-steno
-Firstly, enable steno in your keymap's Makefile. You may also need disable mousekeys, extra keys, or another USB endpoint to prevent conflicts. The builtin USB stack for some processors only supports a certain number of USB endpoints and the virtual serial port needed for steno fills 3 of them.
+After enabling stenography and optionally selecting a protocol, you may also need disable mouse keys, extra keys, or another USB endpoint to prevent conflicts. The builtin USB stack for some processors only supports a certain number of USB endpoints and the virtual serial port needed for steno fills 3 of them.
-```make
-STENO_ENABLE = yes
-MOUSEKEY_ENABLE = no
-```
+!> If you had *explicitly* set `VIRSTER_ENABLE = no`, none of the serial stenography protocols (GeminiPR, TX Bolt) will work properly. You are expected to either set it to `yes`, remove the line from your `rules.mk` or send the steno chords yourself in an alternative way using the [provided interceptable hooks](#interfacing-with-the-code).
-In your keymap create a new layer for Plover. You will need to include `keymap_steno.h`. See `planck/keymaps/steno/keymap.c` for an example. Remember to create a key to switch to the layer as well as a key for exiting the layer. If you would like to switch modes on the fly you can use the keycodes `QK_STENO_BOLT` and `QK_STENO_GEMINI`. If you only want to use one of the protocols you may set it up in your initialization function:
+In your keymap, create a new layer for Plover, that you can fill in with the [steno keycodes](#keycode-reference) (you will need to include `keymap_steno.h`, see `planck/keymaps/steno/keymap.c` for an example). Remember to create a key to switch to the layer as well as a key for exiting the layer.
-```c
-void eeconfig_init_user() {
- steno_set_mode(STENO_MODE_GEMINI); // or STENO_MODE_BOLT
-}
-```
+Once you have your keyboard flashed, launch Plover. Click the 'Configure...' button. In the 'Machine' tab, select the Stenotype Machine that corresponds to your desired protocol. Click the 'Configure...' button on this tab and enter the serial port or click 'Scan'. Baud rate is fine at 9600 (although you should be able to set as high as 115200 with no issues). Use the default settings for everything else (Data Bits: 8, Stop Bits: 1, Parity: N, no flow control).
-Once you have your keyboard flashed launch Plover. Click the 'Configure...' button. In the 'Machine' tab select the Stenotype Machine that corresponds to your desired protocol. Click the 'Configure...' button on this tab and enter the serial port or click 'Scan'. Baud rate is fine at 9600 (although you should be able to set as high as 115200 with no issues). Use the default settings for everything else (Data Bits: 8, Stop Bits: 1, Parity: N, no flow control).
-
-On the display tab click 'Open stroke display'. With Plover disabled you should be able to hit keys on your keyboard and see them show up in the stroke display window. Use this to make sure you have set up your keymap correctly. You are now ready to steno!
+To test your keymap, you can chord keys on your keyboard and either look at the output of the 'paper tape' (Tools > Paper Tape) or that of the 'layout display' (Tools > Layout Display). If your strokes correctly show up, you are now ready to steno!
## Learning Stenography :id=learning-stenography
@@ -60,7 +121,7 @@ On the display tab click 'Open stroke display'. With Plover disabled you should
The steno code has three interceptable hooks. If you define these functions, they will be called at certain points in processing; if they return true, processing continues, otherwise it's assumed you handled things.
```c
-bool send_steno_chord_user(steno_mode_t mode, uint8_t chord[6]);
+bool send_steno_chord_user(steno_mode_t mode, uint8_t chord[MAX_STROKE_SIZE]);
```
This function is called when a chord is about to be sent. Mode will be one of `STENO_MODE_BOLT` or `STENO_MODE_GEMINI`. This represents the actual chord that would be sent via whichever protocol. You can modify the chord provided to alter what gets sent. Remember to return true if you want the regular sending process to happen.
@@ -72,15 +133,23 @@ bool process_steno_user(uint16_t keycode, keyrecord_t *record) { return true; }
This function is called when a keypress has come in, before it is processed. The keycode should be one of `QK_STENO_BOLT`, `QK_STENO_GEMINI`, or one of the `STN_*` key values.
```c
-bool postprocess_steno_user(uint16_t keycode, keyrecord_t *record, steno_mode_t mode, uint8_t chord[6], int8_t pressed);
+bool post_process_steno_user(uint16_t keycode, keyrecord_t *record, steno_mode_t mode, uint8_t chord[MAX_STROKE_SIZE], int8_t n_pressed_keys);
```
-This function is called after a key has been processed, but before any decision about whether or not to send a chord. If `IS_PRESSED(record->event)` is false, and `pressed` is 0 or 1, the chord will be sent shortly, but has not yet been sent. This is where to put hooks for things like, say, live displays of steno chords or keys.
+This function is called after a key has been processed, but before any decision about whether or not to send a chord. This is where to put hooks for things like, say, live displays of steno chords or keys.
+If `IS_PRESSED(record->event)` is false, and `n_pressed_keys` is 0 or 1, the chord will be sent shortly, but has not yet been sent. This relieves you of the need of keeping track of where a packet ends and another begins.
+
+The `chord` argument contains the packet of the current chord as specified by the protocol in use. This is *NOT* simply a list of chorded steno keys of the form `[STN_E, STN_U, STN_BR, STN_GR]`. Refer to the appropriate protocol section of this document to learn more about the format of the packets in your steno protocol/mode of choice.
+
+The `n_pressed_keys` argument is the number of physical keys actually being held down.
+This is not always equal to the number of bits set to 1 (aka the [Hamming weight](https://en.wikipedia.org/wiki/Hamming_weight)) in `chord` because it is possible to simultaneously press down four keys, then release three of those four keys and then press yet another key while the fourth finger is still holding down its key.
+At the end of this scenario given as an example, `chord` would have five bits set to 1 but
+`n_pressed_keys` would be set to 2 because there are only two keys currently being pressed down.
## Keycode Reference :id=keycode-reference
-As defined in `keymap_steno.h`.
+You must include `keymap_steno.h` to your `keymap.c` with `#include "keymap_steno.h"` before you can use these keycodes
> Note: TX Bolt does not support the full set of keys. The TX Bolt implementation in QMK will map the GeminiPR keys to the nearest TX Bolt key so that one key map will work for both.
@@ -124,10 +193,10 @@ As defined in `keymap_steno.h`.
|`STN_SR`|`STN_SR`| `-S`|
|`STN_DR`|`STN_DR`| `-D`|
|`STN_ZR`|`STN_ZR`| `-Z`|
-|`STN_FN`|| (GeminiPR only)|
-|`STN_RES1`||(GeminiPR only)|
-|`STN_RES2`||(GeminiPR only)|
-|`STN_PWR`||(GeminiPR only)|
+|`STN_FN`|| (Function)|
+|`STN_RES1`||(Reset 1)|
+|`STN_RES2`||(Reset 2)|
+|`STN_PWR`||(Power)|
If you do not want to hit two keys with one finger combined keycodes can be used. These are also defined in `keymap_steno.h`, and causes both keys to be reported as pressed or released. To use these keycodes define `STENO_COMBINEDMAP` in your `config.h` file.
diff --git a/docs/feature_tap_dance.md b/docs/feature_tap_dance.md
index 368b35617a..cbee4d0c34 100644
--- a/docs/feature_tap_dance.md
+++ b/docs/feature_tap_dance.md
@@ -14,55 +14,48 @@ Optionally, you might want to set a custom `TAPPING_TERM` time by adding somethi
```c
#define TAPPING_TERM 175
+#define TAPPING_TERM_PER_KEY
```
-The `TAPPING_TERM` time is the maximum time allowed between taps of your Tap Dance key, and is measured in milliseconds. For example, if you used the above `#define` statement and set up a Tap Dance key that sends `Space` on single-tap and `Enter` on double-tap, then this key will send `ENT` only if you tap this key twice in less than 175ms. If you tap the key, wait more than 175ms, and tap the key again you'll end up sending `SPC SPC` instead.
+The `TAPPING_TERM` time is the maximum time allowed between taps of your Tap Dance key, and is measured in milliseconds. For example, if you used the above `#define` statement and set up a Tap Dance key that sends `Space` on single-tap and `Enter` on double-tap, then this key will send `ENT` only if you tap this key twice in less than 175ms. If you tap the key, wait more than 175ms, and tap the key again you'll end up sending `SPC SPC` instead. The `TAPPING_TERM_PER_KEY` definition is only needed if you control the tapping term through a [custom `get_tapping_term` function](tap_hold.md#tapping_term), which may be needed because `TAPPING_TERM` affects not just tap-dance keys.
-Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro, that takes a number which will later be used as an index into the `tap_dance_actions` array.
+Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro. That macro takes a number which will later be used as an index into the `tap_dance_actions` array and turns it into a tap-dance keycode.
After this, you'll want to use the `tap_dance_actions` array to specify what actions shall be taken when a tap-dance key is in action. Currently, there are five possible options:
* `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held.
* `ACTION_TAP_DANCE_LAYER_MOVE(kc, layer)`: Sends the `kc` keycode when tapped once, or moves to `layer`. (this functions like the `TO` layer keycode).
- * This is the same as `ACTION_TAP_DANCE_DUAL_ROLE`, but renamed to something that is clearer about its functionality. Both names will work.
* `ACTION_TAP_DANCE_LAYER_TOGGLE(kc, layer)`: Sends the `kc` keycode when tapped once, or toggles the state of `layer`. (this functions like the `TG` layer keycode).
* `ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action.
* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
-* ~~`ACTION_TAP_DANCE_FN_ADVANCED_TIME(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn, tap_specific_tapping_term)`~~: This functions identically to the `ACTION_TAP_DANCE_FN_ADVANCED` function, but uses a custom tapping term for it, instead of the predefined `TAPPING_TERM`.
- * This is deprecated in favor of the Per Key Tapping Term functionality, as outlined [here](tap_hold.md#tapping-term). You'd want to check for the specific `TD()` macro that you want to use (such as `TD(TD_ESC_CAPS)`) instead of using this specific Tap Dance function.
The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise.
!> Keep in mind that only [basic keycodes](keycodes_basic.md) are supported here. Custom keycodes are not supported.
-Similar to the first option, the second option is good for simple layer-switching cases.
+Similar to the first option, the second and third option are good for simple layer-switching cases.
-For more complicated cases, use the third or fourth options (examples of each are listed below).
-
-Finally, the fifth option is particularly useful if your non-Tap-Dance keys start behaving weirdly after adding the code for your Tap Dance keys. The likely problem is that you changed the `TAPPING_TERM` time to make your Tap Dance keys easier for you to use, and that this has changed the way your other keys handle interrupts.
+For more complicated cases, like blink the LEDs, fiddle with the backlighting, and so on, use the fourth or fifth option. Examples of each are listed below.
## Implementation Details :id=implementation
Well, that's the bulk of it! You should now be able to work through the examples below, and to develop your own Tap Dance functionality. But if you want a deeper understanding of what's going on behind the scenes, then read on for the explanation of how it all works!
-The main entry point is `process_tap_dance()`, called from `process_record_quantum()`, which is run for every keypress, and our handler gets to run early. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. If it was the same, we increment the counter and reset the timer.
+Let's go over the three functions mentioned in `ACTION_TAP_DANCE_FN_ADVANCED` in a little more detail. They all receive the same two arguments: a pointer to a structure that holds all dance related state information, and a pointer to a use case specific state variable. The three functions differ in when they are called. The first, `on_each_tap_fn()`, is called every time the tap dance key is *pressed*. Before it is called, the counter is incremented and the timer is reset. The second function, `on_dance_finished_fn()`, is called when the tap dance is interrupted or ends because `TAPPING_TERM` milliseconds have passed since the last tap. When the `finished` field of the dance state structure is set to `true`, the `on_dance_finished_fn()` is skipped. After `on_dance_finished_fn()` was called or would have been called, but no sooner than when the tap dance key is *released*, `on_dance_reset_fn()` is called. It is possible to end a tap dance immediately, skipping `on_dance_finished_fn()`, but not `on_dance_reset_fn`, by calling `reset_tap_dance(state)`.
+
+To accomplish this logic, the tap dance mechanics use three entry points. The main entry point is `process_tap_dance()`, called from `process_record_quantum()` *after* `process_record_kb()` and `process_record_user()`. This function is responsible for calling `on_each_tap_fn()` and `on_dance_reset_fn()`. In order to handle interruptions of a tap dance, another entry point, `preprocess_tap_dance()` is run right at the beginning of `process_record_quantum()`. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. Finally, `tap_dance_task()` periodically checks whether `TAPPING_TERM` has passed since the last key press and finishes a tap dance if that is the case.
This means that you have `TAPPING_TERM` time to tap the key again; you do not have to input all the taps within a single `TAPPING_TERM` timeframe. This allows for longer tap counts, with minimal impact on responsiveness.
-Our next stop is `tap_dance_task()`. This handles the timeout of tap-dance keys.
-
-For the sake of flexibility, tap-dance actions can be either a pair of keycodes, or a user function. The latter allows one to handle higher tap counts, or do extra things, like blink the LEDs, fiddle with the backlighting, and so on. This is accomplished by using an union, and some clever macros.
-
## Examples :id=examples
-### Simple Example :id=simple-example
+### Simple Example: Send `ESC` on Single Tap, `CAPS_LOCK` on Double Tap :id=simple-example
Here's a simple example for a single definition:
1. In your `rules.mk`, add `TAP_DANCE_ENABLE = yes`
-2. In your `config.h` (which you can copy from `qmk_firmware/keyboards/planck/config.h` to your keymap directory), add `#define TAPPING_TERM 200`
-3. In your `keymap.c` file, define the variables and definitions, then add to your keymap:
+2. In your `keymap.c` file, define the variables and definitions, then add to your keymap:
```c
// Tap Dance declarations
@@ -92,40 +85,15 @@ All the enums used in the examples are declared like this:
```c
// Enums defined for all examples:
enum {
- CT_SE,
- CT_CLN,
+ TD_ESC_CAPS,
CT_EGG,
CT_FLSH,
- X_TAP_DANCE
+ CT_CLN,
+ X_CTL,
};
```
-#### Example 1: Send `:` on Single Tap, `;` on Double Tap :id=example-1
-
-```c
-void dance_cln_finished(qk_tap_dance_state_t *state, void *user_data) {
- if (state->count == 1) {
- register_code16(KC_COLN);
- } else {
- register_code(KC_SCLN);
- }
-}
-
-void dance_cln_reset(qk_tap_dance_state_t *state, void *user_data) {
- if (state->count == 1) {
- unregister_code16(KC_COLN);
- } else {
- unregister_code(KC_SCLN);
- }
-}
-
-// All tap dance functions would go here. Only showing this one.
-qk_tap_dance_action_t tap_dance_actions[] = {
- [CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_cln_finished, dance_cln_reset),
-};
-```
-
-#### Example 2: Send "Safety Dance!" After 100 Taps :id=example-2
+#### Example 1: Send "Safety Dance!" After 100 Taps :id=example-1
```c
void dance_egg(qk_tap_dance_state_t *state, void *user_data) {
@@ -140,7 +108,7 @@ qk_tap_dance_action_t tap_dance_actions[] = {
};
```
-#### Example 3: Turn LED Lights On Then Off, One at a Time :id=example-3
+#### Example 2: Turn LED Lights On Then Off, One at a Time :id=example-2
```c
// On each tap, light up one LED, from right to left
@@ -181,15 +149,74 @@ void dance_flsh_reset(qk_tap_dance_state_t *state, void *user_data) {
ergodox_right_led_3_off();
}
-// All tap dances now put together. Example 3 is "CT_FLASH"
+// All tap dances now put together. Example 2 is "CT_FLSH"
qk_tap_dance_action_t tap_dance_actions[] = {
- [CT_SE] = ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT),
- [CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_cln_finished, dance_cln_reset),
+ [TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS),
[CT_EGG] = ACTION_TAP_DANCE_FN(dance_egg),
[CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED(dance_flsh_each, dance_flsh_finished, dance_flsh_reset)
};
```
+#### Example 3: Send `:` on Tap, `;` on Hold :id=example-3
+
+With a little effort, powerful tap-hold configurations can be implemented as tap dances. To emit taps as early as possible, we need to act on releases of the tap dance key. There is no callback for this in the tap dance framework, so we use `process_record_user()`.
+
+```c
+typedef struct {
+ uint16_t tap;
+ uint16_t hold;
+ uint16_t held;
+} tap_dance_tap_hold_t;
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ qk_tap_dance_action_t *action;
+
+ switch (keycode) {
+ case TD(CT_CLN): // list all tap dance keycodes with tap-hold configurations
+ action = &tap_dance_actions[TD_INDEX(keycode)];
+ if (!record->event.pressed && action->state.count && !action->state.finished) {
+ tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)action->user_data;
+ tap_code16(tap_hold->tap);
+ }
+ }
+ return true;
+}
+
+void tap_dance_tap_hold_finished(qk_tap_dance_state_t *state, void *user_data) {
+ tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)user_data;
+
+ if (state->pressed) {
+ if (state->count == 1
+#ifndef PERMISSIVE_HOLD
+ && !state->interrupted
+#endif
+ ) {
+ register_code16(tap_hold->hold);
+ tap_hold->held = tap_hold->hold;
+ } else {
+ register_code16(tap_hold->tap);
+ tap_hold->held = tap_hold->tap;
+ }
+ }
+}
+
+void tap_dance_tap_hold_reset(qk_tap_dance_state_t *state, void *user_data) {
+ tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)user_data;
+
+ if (tap_hold->held) {
+ unregister_code16(tap_hold->held);
+ tap_hold->held = 0;
+ }
+}
+
+#define ACTION_TAP_DANCE_TAP_HOLD(tap, hold) \
+ { .fn = {NULL, tap_dance_tap_hold_finished, tap_dance_tap_hold_reset}, .user_data = (void *)&((tap_dance_tap_hold_t){tap, hold, 0}), }
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [CT_CLN] = ACTION_TAP_DANCE_TAP_HOLD(KC_COLN, KC_SCLN),
+};
+```
+
#### Example 4: 'Quad Function Tap-Dance' :id=example-4
By [DanielGGordon](https://github.com/danielggordon)
@@ -331,7 +358,7 @@ And then simply use `TD(X_CTL)` anywhere in your keymap.
If you want to implement this in your userspace, then you may want to check out how [DanielGGordon](https://github.com/qmk/qmk_firmware/tree/master/users/gordon) has implemented this in their userspace.
-> In this configuration "hold" takes place **after** tap dance timeout (see `ACTION_TAP_DANCE_FN_ADVANCED_TIME`). To achieve instant hold, remove `state->interrupted` checks in conditions. As a result you may use comfortable longer tapping periods to have more time for taps and not to wait too long for holds (try starting with doubled `TAPPING_TERM`).
+> In this configuration "hold" takes place **after** tap dance timeout. To achieve instant hold, remove `state->interrupted` checks in conditions. As a result you may use comfortable longer tapping periods to have more time for taps and not to wait too long for holds (try starting with doubled `TAPPING_TERM`).
#### Example 5: Using tap dance for advanced mod-tap and layer-tap keys :id=example-5
@@ -513,8 +540,18 @@ void ql_reset(qk_tap_dance_state_t *state, void *user_data) {
// Associate our tap dance key with its functionality
qk_tap_dance_action_t tap_dance_actions[] = {
- [QUOT_LAYR] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, ql_finished, ql_reset, 275)
+ [QUOT_LAYR] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ql_finished, ql_reset)
};
+
+// Set a long-ish tapping term for tap-dance keys
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case QK_TAP_DANCE ... QK_TAP_DANCE_MAX:
+ return 275;
+ default:
+ return TAPPING_TERM;
+ }
+}
```
The above code is similar to that used in previous examples. The one point to note is that we need to be able to check which layers are active at any time so we can toggle them if needed. To do this we use the `layer_state_is(layer)` function which returns `true` if the given `layer` is active.
@@ -523,6 +560,6 @@ The use of `cur_dance()` and `ql_tap_state` mirrors the above examples.
The `case: TD_SINGLE_TAP` in `ql_finished` is similar to the above examples. The `TD_SINGLE_HOLD` case works in conjunction with `ql_reset()` to switch to `_MY_LAYER` while the tap dance key is held, and to switch away from `_MY_LAYER` when the key is released. This mirrors the use of `MO(_MY_LAYER)`. The `TD_DOUBLE_TAP` case works by checking whether `_MY_LAYER` is the active layer, and toggling it on or off accordingly. This mirrors the use of `TG(_MY_LAYER)`.
-`tap_dance_actions[]` works similar to the above examples. Note that I used `ACTION_TAP_DANCE_FN_ADVANCED_TIME()` instead of `ACTION_TAP_DANCE_FN_ADVANCED()`. This is because I like my `TAPPING_TERM` to be short (\~175ms) for my non-tap-dance keys but find that this is too quick for me to reliably complete tap dance actions - thus the increased time of 275ms here.
+`tap_dance_actions[]` works similar to the above examples. Note that, additionally, I set a longer tapping term for the tap dance keys. This is because I like my `TAPPING_TERM` to be short (\~175ms) for my non-tap-dance keys but find that this is too quick for me to reliably complete tap dance actions - thus the increased time of 275ms here. In order for the per-key tapping terms to take effect, `TAPPING_TERM_PER_KEY` must be defined in your `config.h`.
Finally, to get this tap dance key working, be sure to include `TD(QUOT_LAYR)` in your `keymaps[]`.
diff --git a/docs/feature_terminal.md b/docs/feature_terminal.md
deleted file mode 100644
index f850622165..0000000000
--- a/docs/feature_terminal.md
+++ /dev/null
@@ -1,107 +0,0 @@
-# Terminal
-
-> This feature is currently *huge*, and should probably only be put on boards with a lot of memory, or for fun.
-
-The terminal feature is a command-line-like interface designed to communicate through a text editor with keystrokes. It's beneficial to turn off auto-indent features in your editor.
-
-To enable, stick this in your `rules.mk` or `Makefile`:
-
- TERMINAL_ENABLE = yes
-
-And use the `TERM_ON` and `TERM_OFF` keycodes to turn it on or off.
-
-When enabled, a `> ` prompt will appear, where you'll be able to type, backspace (a bell will ding if you reach the beginning and audio is enabled), and hit enter to send the command. Arrow keys are currently disabled so it doesn't get confused. Moving your cursor around with the mouse is discouraged.
-
-`#define TERMINAL_HELP` enables some other output helpers that aren't really needed with this page.
-
-Pressing "up" and "down" will allow you to cycle through the past 5 commands entered.
-
-## Future Ideas
-
-* Keyboard/user-extensible commands
-* Smaller footprint
-* Arrow key support
-* Command history - Done
-* SD card support
-* LCD support for buffer display
-* Keycode -> name string LUT
-* Layer status
-* *Analog/digital port read/write*
-* RGB mode stuff
-* Macro definitions
-* EEPROM read/write
-* Audio control
-
-## Current Commands
-
-### `about`
-
-Prints out the current version of QMK with a build date:
-
-```
-> about
-QMK Firmware
- v0.5.115-7-g80ed73-dirty
- Built: 2017-08-29-20:24:44
-```
-
-
-### `print-buffer`
-
-Outputs the last 5 commands entered
-
-```
-> print-buffer
-0. print-buffer
-1. help
-2. about
-3. keymap 0
-4. help
-5. flush-buffer
-```
-
-### `flush-buffer`
-
-Clears command buffer
-```
-> flush-buffer
-Buffer cleared!
-```
-
-
-### `help`
-
-
-Prints out the available commands:
-
-```
-> help
-commands available:
- about help keycode keymap exit print-buffer flush-buffer
-```
-
-### `keycode `
-
-Prints out the keycode value of a certain layer, row, and column:
-
-```
-> keycode 0 1 0
-0x29 (41)
-```
-
-### `keymap `
-
-Prints out the entire keymap for a certain layer
-
-```
-> keymap 0
-0x002b, 0x0014, 0x001a, 0x0008, 0x0015, 0x0017, 0x001c, 0x0018, 0x000c, 0x0012, 0x0013, 0x002a,
-0x0029, 0x0004, 0x0016, 0x0007, 0x0009, 0x000a, 0x000b, 0x000d, 0x000e, 0x000f, 0x0033, 0x0034,
-0x00e1, 0x001d, 0x001b, 0x0006, 0x0019, 0x0005, 0x0011, 0x0010, 0x0036, 0x0037, 0x0038, 0x0028,
-0x5cd6, 0x00e0, 0x00e2, 0x00e3, 0x5cd4, 0x002c, 0x002c, 0x5cd5, 0x0050, 0x0051, 0x0052, 0x004f,
->
-```
-
-### `exit`
-
-Exits the terminal - same as `TERM_OFF`.
diff --git a/docs/feature_thermal_printer.md b/docs/feature_thermal_printer.md
deleted file mode 100644
index 3f496646d4..0000000000
--- a/docs/feature_thermal_printer.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Thermal Printer
-
-
-
-## Thermal Printer Keycodes
-
-|Key |Description |
-|-----------|----------------------------------------|
-|`PRINT_ON` |Start printing everything the user types|
-|`PRINT_OFF`|Stop printing everything the user types |
diff --git a/docs/feature_unicode.md b/docs/feature_unicode.md
index bced419a03..a93e9ad2ba 100644
--- a/docs/feature_unicode.md
+++ b/docs/feature_unicode.md
@@ -112,30 +112,28 @@ Unicode input in QMK works by inputting a sequence of characters to the OS, sort
The following input modes are available:
-* **`UC_MAC`**: macOS built-in Unicode hex input. Supports code points up to `0x10FFFF` (all possible code points).
+* **`UNICODE_MODE_MACOS`**: macOS built-in Unicode hex input. Supports code points up to `0x10FFFF` (all possible code points).
To enable, go to _System Preferences > Keyboard > Input Sources_, add _Unicode Hex Input_ to the list (it's under _Other_), then activate it from the input dropdown in the Menu Bar.
By default, this mode uses the left Option key (`KC_LALT`) for Unicode input, but this can be changed by defining [`UNICODE_KEY_MAC`](#input-key-configuration) with a different keycode.
!> Using the _Unicode Hex Input_ input source may disable some Option-based shortcuts, such as Option+Left and Option+Right.
- !> `UC_OSX` is a deprecated alias of `UC_MAC` that will be removed in future versions of QMK. All new keymaps should use `UC_MAC`.
-
-* **`UC_LNX`**: Linux built-in IBus Unicode input. Supports code points up to `0x10FFFF` (all possible code points).
+* **`UNICODE_MODE_LINUX`**: Linux built-in IBus Unicode input. Supports code points up to `0x10FFFF` (all possible code points).
Enabled by default and works almost anywhere on IBus-enabled distros. Without IBus, this mode works under GTK apps, but rarely anywhere else.
By default, this mode uses Ctrl+Shift+U (`LCTL(LSFT(KC_U))`) to start Unicode input, but this can be changed by defining [`UNICODE_KEY_LNX`](#input-key-configuration) with a different keycode. This might be required for IBus versions ≥1.5.15, where Ctrl+Shift+U behavior is consolidated into Ctrl+Shift+E.
Users who wish support in non-GTK apps without IBus may need to resort to a more indirect method, such as creating a custom keyboard layout ([more on this method](#custom-linux-layout)).
-
-* **`UC_WIN`**: _(not recommended)_ Windows built-in hex numpad Unicode input. Supports code points up to `0xFFFF`.
+
+* **`UNICODE_MODE_WINDOWS`**: _(not recommended)_ Windows built-in hex numpad Unicode input. Supports code points up to `0xFFFF`.
To enable, create a registry key under `HKEY_CURRENT_USER\Control Panel\Input Method` of type `REG_SZ` called `EnableHexNumpad` and set its value to `1`. This can be done from the Command Prompt by running `reg add "HKCU\Control Panel\Input Method" -v EnableHexNumpad -t REG_SZ -d 1` with administrator privileges. Reboot afterwards.
- This mode is not recommended because of reliability and compatibility issues; use the `UC_WINC` mode instead.
+ This mode is not recommended because of reliability and compatibility issues; use the `UNICODE_MODE_WINCOMPOSE` mode instead.
-* **`UC_BSD`**: _(non implemented)_ Unicode input under BSD. Not implemented at this time. If you're a BSD user and want to help add support for it, please [open an issue on GitHub](https://github.com/qmk/qmk_firmware/issues).
+* **`UNICODE_MODE_BSD`**: _(non implemented)_ Unicode input under BSD. Not implemented at this time. If you're a BSD user and want to help add support for it, please [open an issue on GitHub](https://github.com/qmk/qmk_firmware/issues).
-* **`UC_WINC`**: Windows Unicode input using [WinCompose](https://github.com/samhocevar/wincompose). As of v0.9.0, supports code points up to `0x10FFFF` (all possible code points).
+* **`UNICODE_MODE_WINCOMPOSE`**: Windows Unicode input using [WinCompose](https://github.com/samhocevar/wincompose). As of v0.9.0, supports code points up to `0x10FFFF` (all possible code points).
To enable, install the [latest release](https://github.com/samhocevar/wincompose/releases/latest). Once installed, WinCompose will automatically run on startup. This mode works reliably under all version of Windows supported by the app.
By default, this mode uses right Alt (`KC_RALT`) as the Compose key, but this can be changed in the WinCompose settings and by defining [`UNICODE_KEY_WINC`](#input-key-configuration) with a different keycode.
@@ -146,15 +144,15 @@ The following input modes are available:
To set your desired input mode, add the following define to your `config.h`:
```c
-#define UNICODE_SELECTED_MODES UC_LNX
+#define UNICODE_SELECTED_MODES UNICODE_MODE_LINUX
```
-This example sets the board's default input mode to `UC_LNX`. You can replace this with `UC_MAC`, `UC_WINC`, or any of the other modes listed [above](#input-modes). The board will automatically use the selected mode on startup, unless you manually switch to another mode (see [below](#keycodes)).
+This example sets the board's default input mode to `UNICODE_MODE_LINUX`. You can replace this with `UNICODE_MODE_MACOS`, `UNICODE_MODE_WINCOMPOSE`, or any of the other modes listed [above](#input-modes). The board will automatically use the selected mode on startup, unless you manually switch to another mode (see [below](#keycodes)).
-You can also select multiple input modes, which allows you to easily cycle through them using the `UC_MOD`/`UC_RMOD` keycodes.
+You can also select multiple input modes, which allows you to easily cycle through them using the `UC_NEXT`/`UC_PREV` keycodes.
```c
-#define UNICODE_SELECTED_MODES UC_MAC, UC_LNX, UC_WINC
+#define UNICODE_SELECTED_MODES UNICODE_MODE_MACOS, UNICODE_MODE_LINUX, UNICODE_MODE_WINCOMPOSE
```
Note that the values are separated by commas. The board will remember the last used input mode and will continue using it on next power-up. You can disable this and force it to always start with the first mode in the list by adding `#define UNICODE_CYCLE_PERSIST false` to your `config.h`.
@@ -163,17 +161,18 @@ Note that the values are separated by commas. The board will remember the last u
You can switch the input mode at any time by using the following keycodes. Adding these to your keymap allows you to quickly switch to a specific input mode, including modes not listed in `UNICODE_SELECTED_MODES`.
-|Keycode |Alias |Input Mode |Description |
-|----------------------|---------|------------|-----------------------------------------------------------------------------|
-|`UNICODE_MODE_FORWARD`|`UC_MOD` |Next in list|Cycle through selected modes, reverse direction when Shift is held |
-|`UNICODE_MODE_REVERSE`|`UC_RMOD`|Prev in list|Cycle through selected modes in reverse, forward direction when Shift is held|
-|`UNICODE_MODE_MAC` |`UC_M_MA`|`UC_MAC` |Switch to macOS input |
-|`UNICODE_MODE_LNX` |`UC_M_LN`|`UC_LNX` |Switch to Linux input |
-|`UNICODE_MODE_WIN` |`UC_M_WI`|`UC_WIN` |Switch to Windows input |
-|`UNICODE_MODE_BSD` |`UC_M_BS`|`UC_BSD` |Switch to BSD input _(not implemented)_ |
-|`UNICODE_MODE_WINC` |`UC_M_WC`|`UC_WINC` |Switch to Windows input using WinCompose |
+|Keycode |Alias |Input Mode |Description |
+|----------------------------|---------|-------------------------|-----------------------------------------------------------------------------|
+|`QK_UNICODE_MODE_NEXT` |`UC_NEXT`|Next in list |Cycle through selected modes, reverse direction when Shift is held |
+|`QK_UNICODE_MODE_PREVIOUS` |`UC_PREV`|Prev in list |Cycle through selected modes in reverse, forward direction when Shift is held|
+|`QK_UNICODE_MODE_MACOS` |`UC_MAC` |`UNICODE_MODE_MACOS` |Switch to macOS input |
+|`QK_UNICODE_MODE_LINUX` |`UC_LINX`|`UNICODE_MODE_LINUX` |Switch to Linux input |
+|`QK_UNICODE_MODE_WINDOWS` |`UC_WIN` |`UNICODE_MODE_WINDOWS` |Switch to Windows input |
+|`QK_UNICODE_MODE_BSD` |`UC_BSD` |`UNICODE_MODE_BSD` |Switch to BSD input _(not implemented)_ |
+|`QK_UNICODE_MODE_WINCOMPOSE`|`UC_WINC`|`UNICODE_MODE_WINCOMPOSE`|Switch to Windows input using WinCompose |
+|`QK_UNICODE_MODE_EMACS` |`UC_EMAC`|`UNICODE_MODE_EMACS` |Switch to emacs (`C-x-8 RET`) |
-You can also switch the input mode by calling `set_unicode_input_mode(x)` in your code, where _x_ is one of the above input mode constants (e.g. `UC_LNX`).
+You can also switch the input mode by calling `set_unicode_input_mode(x)` in your code, where _x_ is one of the above input mode constants (e.g. `UNICODE_MODE_LINUX`).
?> Using `UNICODE_SELECTED_MODES` is preferable to calling `set_unicode_input_mode()` in `matrix_init_user()` or similar functions, since it's better integrated into the Unicode system and has the added benefit of avoiding unnecessary writes to EEPROM.
@@ -205,6 +204,17 @@ The functions for starting and finishing Unicode input on your platform can be o
You can find the default implementations of these functions in [`process_unicode_common.c`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_unicode_common.c).
+### Input Mode Callbacks
+
+There are callbacks functions available that are called whenever the unicode input mode changes. The new input mode is passed to the function.
+
+|Callback |Description |
+|---------------------------------------------------|-----------------------------------------------------|
+| `unicode_input_mode_set_kb(uint8_t input_mode)` | Callback for unicode input mode set, for keyboard. |
+| `unicode_input_mode_set_user(uint8_t input_mode)` | Callback for unicode input mode set, for users. |
+
+This feature can be used, for instance, to implement LED indicators for the current unicode input mode.
+
### Input Key Configuration
You can customize the keys used to trigger Unicode input for macOS, Linux and WinCompose by adding corresponding defines to your `config.h`. The default values match the platforms' default settings, so you shouldn't need to change this unless Unicode input isn't working, or you want to use a different key (e.g. in order to free up left or right Alt).
diff --git a/docs/feature_velocikey.md b/docs/feature_velocikey.md
index 14d4be314d..aeb1865e8a 100644
--- a/docs/feature_velocikey.md
+++ b/docs/feature_velocikey.md
@@ -12,7 +12,7 @@ EXTRAKEY_ENABLE = yes
VELOCIKEY_ENABLE = yes
```
-Then, while using your keyboard, you need to also turn it on with the `VLK_TOG` keycode, which toggles the feature on and off.
+Then, while using your keyboard, you need to also turn it on with the `VK_TOGG` keycode, which toggles the feature on and off.
The following light effects will all be controlled by Velocikey when it is enabled:
- RGB Breathing
diff --git a/docs/flashing.md b/docs/flashing.md
index 271e15b13c..b3f055f6cb 100644
--- a/docs/flashing.md
+++ b/docs/flashing.md
@@ -34,7 +34,7 @@ Compatible flashers:
Flashing sequence:
1. Enter the bootloader using any of the following methods:
- * Press the `RESET` keycode
+ * Press the `QK_BOOT` keycode
* Press the `RESET` button on the PCB if available
* Short RST to GND quickly
2. Wait for the OS to detect the device
@@ -87,7 +87,7 @@ Compatible flashers:
Flashing sequence:
1. Enter the bootloader using any of the following methods (you only have 7 seconds to flash once it enters; some variants may require you to reset twice within 750 milliseconds):
- * Press the `RESET` keycode
+ * Press the `QK_BOOT` keycode
* Press the `RESET` button on the PCB if available
* Short RST to GND quickly
2. Wait for the OS to detect the device
@@ -123,7 +123,7 @@ Compatible flashers:
Flashing sequence:
1. Enter the bootloader using any of the following methods (you only have 7 seconds to flash once it enters):
- * Press the `RESET` keycode
+ * Press the `QK_BOOT` keycode
* Press the `RESET` button on the Teensy or PCB if available
* short RST to GND quickly
2. Wait for the OS to detect the device
@@ -153,7 +153,7 @@ Compatible flashers:
Flashing sequence:
1. Enter the bootloader using any of the following methods:
- * Press the `RESET` keycode
+ * Press the `QK_BOOT` keycode
* Keep the `BOOT` button held while quickly tapping the `RESET` button on the PCB
2. Wait for the OS to detect the device
3. Flash a .hex file
@@ -182,7 +182,7 @@ Compatible flashers:
Flashing sequence:
1. Enter the bootloader using any of the following methods:
- * Tap the `RESET` keycode
+ * Tap the `QK_BOOT` keycode
* Hold the salt key while plugging the keyboard in - for PS2AVRGB boards, this is usually the key connected to MCU pins A0 and B0, otherwise it will be documented in your keyboard's readme
2. Wait for the OS to detect the device
3. Flash a .hex file
@@ -223,7 +223,7 @@ Compatible flashers:
Flashing sequence:
1. Enter the bootloader using any of the following methods:
- * Press the `RESET` keycode
+ * Press the `QK_BOOT` keycode
* Press the `RESET` button on the PCB if available
* short RST to GND quickly
2. Wait for the OS to detect the device
@@ -256,7 +256,7 @@ Compatible flashers:
Flashing sequence:
1. Enter the bootloader using any of the following methods:
- * Tap the `RESET` keycode (may not work on STM32F042 devices)
+ * Tap the `QK_BOOT` keycode (may not work on STM32F042 devices)
* If a reset circuit is present, tap the `RESET` button on the PCB; some boards may also have a toggle switch that must be flipped
* Otherwise, you need to bridge `BOOT0` to VCC (via `BOOT0` button or jumper), short `RESET` to GND (via `RESET` button or jumper), and then let go of the `BOOT0` bridge
2. Wait for the OS to detect the device
@@ -292,7 +292,7 @@ Compatible flashers:
Flashing sequence:
1. Enter the bootloader using any of the following methods:
- * Tap the `RESET` keycode
+ * Tap the `QK_BOOT` keycode
* If a reset circuit is present, tap the `RESET` button on the PCB
* Otherwise, you need to bridge `BOOT0` to VCC (via `BOOT0` button or jumper), short `RESET` to GND (via `RESET` button or jumper), and then let go of the `BOOT0` bridge
2. Wait for the OS to detect the device
@@ -316,7 +316,7 @@ Compatible flashers:
Flashing sequence:
1. Enter the bootloader using any of the following methods:
- * Tap the `RESET` keycode
+ * Tap the `QK_BOOT` keycode
* Press the `RESET` button on the PCB
2. Wait for the OS to detect the device
3. Flash a .bin file
@@ -342,7 +342,7 @@ Compatible flashers:
Flashing sequence:
1. Enter the bootloader using any of the following methods:
- * Tap the `RESET` keycode
+ * Tap the `QK_BOOT` keycode
* Double-tap the `nRST` button on the PCB.
2. Wait for the OS to detect the device
3. Copy the .uf2 file to the new USB disk
@@ -353,8 +353,51 @@ or
CLI Flashing sequence:
1. Enter the bootloader using any of the following methods:
- * Tap the `RESET` keycode
+ * Tap the `QK_BOOT` keycode
* Double-tap the `nRST` button on the PCB.
2. Wait for the OS to detect the device
3. Flash via QMK CLI eg. `qmk flash --keyboard handwired/onekey/blackpill_f411_tinyuf2 --keymap default`
4. Wait for the keyboard to become available
+
+### `make` Targets
+
+* `:uf2-split-left` and `:uf2-split-right`: Flashes the firmware but also sets the handedness setting in EEPROM by generating a side specific firmware.
+
+## Raspberry Pi RP2040 UF2
+
+The `rules.mk` setting for this bootloader is `rp2040`, and can be specified at the keymap or user level.
+
+To ensure compatibility with the rp2040 bootloader, make sure this block is present in your `rules.mk`:
+
+```make
+# Bootloader selection
+BOOTLOADER = rp2040
+```
+
+Compatible flashers:
+
+* Any application able to copy a file from one place to another, such as _macOS Finder_ or _Windows Explorer_.
+
+Flashing sequence:
+
+1. Enter the bootloader using any of the following methods:
+ * Tap the `QK_BOOT` keycode
+ * Hold the `BOOTSEL` button on the PCB while plugin in the usb cable.
+ * Double-tap the `RESET` button on the PCB1.
+2. Wait for the OS to detect the device
+3. Copy the .uf2 file to the new USB disk
+4. Wait for the keyboard to become available
+
+or
+
+CLI Flashing sequence:
+
+1. Enter the bootloader using any of the following methods:
+ * Tap the `QK_BOOT` keycode
+ * Hold the `BOOTSEL` button on the PCB while plugin in the usb cable.
+ * Double-tap the `RESET` button on the PCB1.
+2. Wait for the OS to detect the device
+3. Flash via QMK CLI eg. `qmk flash --keyboard handwired/onekey/rpi_pico --keymap default`
+4. Wait for the keyboard to become available
+
+1: This works only if QMK was compiled with `RP2040_BOOTLOADER_DOUBLE_TAP_RESET` defined.
diff --git a/docs/flashing_bootloadhid.md b/docs/flashing_bootloadhid.md
index 213c7c1321..aacf2cc2c4 100644
--- a/docs/flashing_bootloadhid.md
+++ b/docs/flashing_bootloadhid.md
@@ -5,7 +5,7 @@ ps2avr(GB) boards use an ATmega32A microcontroller and a different bootloader. I
General flashing sequence:
1. Enter the bootloader using any of the following methods:
- * Tap the `RESET` keycode (may not work on all devices)
+ * Tap the `QK_BOOT` keycode (may not work on all devices)
* Hold the salt key while plugging the keyboard in (usually documented within keyboard readme)
2. Wait for the OS to detect the device
3. Flash a .hex file
diff --git a/docs/hand_wire.md b/docs/hand_wire.md
index e79a80375a..06809254df 100644
--- a/docs/hand_wire.md
+++ b/docs/hand_wire.md
@@ -177,20 +177,25 @@ From here, you should have a working keyboard once you program a firmware.
Simple firmware can be created easily using the [Keyboard Firmware Builder](https://kbfirmware.com/) website. Recreate your layout using [Keyboard Layout Editor](https://www.keyboard-layout-editor.com), import it and recreate the matrix (if not already done as part of [planning the matrix](#planning-the-matrix).
-Go through the rest of the tabs, assigning keys until you get to the last one where you can compile and download your firmware. The .hex file can be flashed straight onto your keyboard, and the .zip of source files can be modified for advanced functionality and compiled locally using the method described in [Building Your First Firmware](newbs_building_firmware?id=build-your-firmware).
+Go through the rest of the tabs, assigning keys until you get to the last one where you can compile and download your firmware. The .hex file can be flashed straight onto your keyboard, or for advanced functionality, compiled locally after [Setting up Your Environment](newbs_getting_started.md).
-The source given by Keyboard Firmware Builder is QMK, but is based on a version of QMK from early 2017. To compile the code from your .zip file in a modern version of QMK Firmware, you'll need to open the .zip and follow these instructions:
+The source given by Keyboard Firmware Builder is QMK, but is based on a version of QMK from early 2017. To compile the firmware in a modern version of QMK Firmware, you'll need to export via the `Save Configuration` button, then run:
+
+ qmk import-kbfirmware /path/to/export.json
+
+For example:
+
+```
+$ qmk import-kbfirmware ~/Downloads/gh62.json
+Ψ Importing gh62.json.
+
+⚠ Support here is basic - Consider using 'qmk new-keyboard' instead
+Ψ Imported a new keyboard named gh62.
+Ψ To start working on things, `cd` into keyboards/gh62,
+Ψ or open the directory in your preferred text editor.
+Ψ And build with qmk compile -kb gh62 -km default.
+```
-1. Extract the `kb` folder to `qmk_firmware/keyboards/handwired/`.
-2. Open the extracted `kb` folder, then proceed to the `keymaps/default/` folder, and open `keymap.c`.
-3. Locate and delete the `action_get_macro` code block:
- ```
- const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
- ...
- return MACRO_NONE;
- }
- ```
-4. Save and close `keymap.c`.
## Flashing the Firmware
diff --git a/docs/ja/_summary.md b/docs/ja/_summary.md
index 81b5756c27..8516a5eaaa 100644
--- a/docs/ja/_summary.md
+++ b/docs/ja/_summary.md
@@ -85,7 +85,6 @@
* [スワップハンド](ja/feature_swap_hands.md)
* [タップダンス](ja/feature_tap_dance.md)
* [タップホールド設定](ja/tap_hold.md)
- * [ターミナル](ja/feature_terminal.md)
* [ユニコード](ja/feature_unicode.md)
* [ユーザスペース](ja/feature_userspace.md)
* [WPM 計算](ja/feature_wpm.md)
diff --git a/docs/ja/api_docs.md b/docs/ja/api_docs.md
index 34ed50c497..96ddbb5618 100644
--- a/docs/ja/api_docs.md
+++ b/docs/ja/api_docs.md
@@ -21,7 +21,7 @@
"layers": [
["KC_GRV","KC_1","KC_2","KC_3","KC_4","KC_5","KC_6","KC_7","KC_8","KC_9","KC_0","KC_MINS","KC_EQL","KC_GRV","KC_BSPC","KC_PGUP","KC_TAB","KC_Q","KC_W","KC_E","KC_R","KC_T","KC_Y","KC_U","KC_I","KC_O","KC_P","KC_LBRC","KC_RBRC","KC_BSLS","KC_PGDN","KC_CAPS","KC_A","KC_S","KC_D","KC_F","KC_G","KC_H","KC_J","KC_K","KC_L","KC_SCLN","KC_QUOT","KC_NUHS","KC_ENT","KC_LSFT","KC_NUBS","KC_Z","KC_X","KC_C","KC_V","KC_B","KC_N","KC_M","KC_COMM","KC_DOT","KC_SLSH","KC_RO","KC_RSFT","KC_UP","KC_LCTL","KC_LGUI","KC_LALT","KC_MHEN","KC_SPC","KC_SPC","KC_HENK","KC_RALT","KC_RCTL","MO(1)","KC_LEFT","KC_DOWN","KC_RIGHT"],
["KC_ESC","KC_F1","KC_F2","KC_F3","KC_F4","KC_F5","KC_F6","KC_F7","KC_F8","KC_F9","KC_F10","KC_F11","KC_F12","KC_TRNS","KC_DEL","BL_STEP","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","_______","KC_TRNS","KC_PSCR","KC_SLCK","KC_PAUS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(2)","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_PGUP","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(1)","KC_LEFT","KC_PGDN","KC_RGHT"],
- ["KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","RESET","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(2)","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(1)","KC_TRNS","KC_TRNS","KC_TRNS"]
+ ["KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","QK_BOOT","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(2)","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(1)","KC_TRNS","KC_TRNS","KC_TRNS"]
]
}
```
diff --git a/docs/ja/config_options.md b/docs/ja/config_options.md
index fb43d015f2..c95753bd5d 100644
--- a/docs/ja/config_options.md
+++ b/docs/ja/config_options.md
@@ -108,7 +108,7 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
* デバイスの USB 経由の最大電力(mA) を設定します (デフォルト: 500)
* `#define USB_POLLING_INTERVAL_MS 10`
* キーボード、マウス および 共有 (NKRO/メディアキー) インタフェースのための USB ポーリングレートをミリ秒で設定します
-* `#define USB_SUSPEND_WAKEUP_DELAY 200`
+* `#define USB_SUSPEND_WAKEUP_DELAY 0`
* ウェイクアップパケットを送信した後で一時停止するミリ秒を設定します
* `#define F_SCL 100000L`
* I2C を使用するキーボードのための I2C クロックレート速度を設定します。デフォルトは `400000L` ですが、`split_common` を使っているキーボードは別でデフォルトは `100000L` です。
@@ -144,7 +144,7 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
## 設定可能な挙動 :id=behaviors-that-can-be-configured
* `#define TAPPING_TERM 200`
- * タップがホールドになるまでの時間。500以上に設定された場合、タップ期間中にタップされたキーもホールドになります。(訳注: PERMISSIVE_HOLDも参照)
+ * タップがホールドになるまでの時間。
* `#define TAPPING_TERM_PER_KEY`
* キーごとの `TAPPING_TERM` 設定の処理を有効にします
* `#define RETRO_TAPPING`
@@ -181,8 +181,6 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
* ワンショットがタイムアウトするまでの時間
* `#define ONESHOT_TAP_TOGGLE 2`
* ワンショットトグルが引き起こされるまでのタップ数
-* `#define QMK_KEYS_PER_SCAN 4`
- * 走査ごとに1つ以上のキーを送信できるようにします。デフォルトでは、走査ごとに `process_record()` 経由で1つのキーイベントのみが送信されます。これはほとんどのタイピングにほとんど影響しませんが、多くのコードを入力しているか、走査レートが最初から遅い場合、キーイベントの処理に多少の遅延が生じる可能性があります。それぞれのプレスとリリースは別のイベントです。スキャン時間が 1ms 程度のキーボードの場合、とても高速なタイピストでさえ、実際にキーボードから数 ms 以上の遅延を発生させるのに必要な 500 キーストロークを1秒間に生成することはないでしょう。しかし、3~4ms の走査時間でコードを入力している場合はどうでしょうか?おそらくこれが必要です。
* `#define COMBO_COUNT 2`
* [コンボ](ja/feature_combo.md)機能で使っているコンボの数にこれを設定します。
* `#define COMBO_TERM 200`
@@ -196,8 +194,6 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
* `#define RGB_DI_PIN D7`
* WS2812 の DI 端子につなぐピン
-* `#define RGBLIGHT_ANIMATIONS`
- * RGB アニメーションを実行します
* `#define RGBLIGHT_LAYERS`
* オンとオフを切り替えることができる [ライトレイヤー](ja/feature_rgblight.md?id=lighting-layers) を定義できます。現在のキーボードレイヤーまたは Caps Lock 状態を表示するのに最適です。
* `#define RGBLIGHT_MAX_LAYERS`
diff --git a/docs/ja/custom_matrix.md b/docs/ja/custom_matrix.md
index 277fc658d3..2c697bb148 100644
--- a/docs/ja/custom_matrix.md
+++ b/docs/ja/custom_matrix.md
@@ -87,17 +87,17 @@ void matrix_init(void) {
}
uint8_t matrix_scan(void) {
- bool matrix_has_changed = false;
+ bool changed = false;
// TODO: ここにマトリックススキャンルーチンを追加します
// ハードウェアによるデバウンスがない場合 - 設定されているデバウンスルーチンを使用します
- debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
+ changed = debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
// 正しいキーボード動作のためにこれを呼び出す*必要があります*
matrix_scan_quantum();
- return matrix_has_changed;
+ return changed;
}
```
diff --git a/docs/ja/faq_misc.md b/docs/ja/faq_misc.md
index 38917df2ee..24a0e18235 100644
--- a/docs/ja/faq_misc.md
+++ b/docs/ja/faq_misc.md
@@ -13,7 +13,7 @@
あなたはおそらくキーボードを「文鎮化」したくないでしょう。文鎮化するとファームウェアを書き換えられないようになります。リスクがあまりに高い(そしてそうでないかもしれない)ものの一部のリストを示します。
-- キーボードマップに RESET が含まれない場合、DFU モードに入るには、PCB のリセットボタンを押す必要があります。底部のネジを外す必要があります。
+- キーボードマップに QK_BOOT が含まれない場合、DFU モードに入るには、PCB のリセットボタンを押す必要があります。底部のネジを外す必要があります。
- tmk_core / common にあるファイルを触るとキーボードが操作不能になるかもしれません。
- .hex ファイルが大きすぎると問題を引き起こします; `make dfu` コマンドはブロックを削除し、サイズを検査し(おっと、間違った順序です!)、エラーを出力し、
キーボードへの書き込みに失敗し、DFU モードのままになります。
diff --git a/docs/ja/feature_audio.md b/docs/ja/feature_audio.md
index ca7820e3c4..2d1fd8f78a 100644
--- a/docs/ja/feature_audio.md
+++ b/docs/ja/feature_audio.md
@@ -23,7 +23,7 @@ Timer 3:
```
STARTUP_SONG // キーボードの起動時に再生 (audio.c)
-GOODBYE_SONG // RESET キーを押すと再生 (quantum.c)
+GOODBYE_SONG // QK_BOOT キーを押すと再生 (quantum.c)
AG_NORM_SONG // AG_NORM キーを押すと再生 (quantum.c)
AG_SWAP_SONG // AG_SWAP キーを押すと再生 (quantum.c)
CG_NORM_SONG // CG_NORM キーを押すと再生 (quantum.c)
diff --git a/docs/ja/feature_dynamic_macros.md b/docs/ja/feature_dynamic_macros.md
index 951b903127..3cff788007 100644
--- a/docs/ja/feature_dynamic_macros.md
+++ b/docs/ja/feature_dynamic_macros.md
@@ -40,6 +40,7 @@ QMK はその場で作られた一時的なマクロをサポートします。
| `DYNAMIC_MACRO_SIZE` | 128 | 動的マクロが使用できるメモリ量を設定します。これは限られたリソースであり、コントローラに依存します。 |
| `DYNAMIC_MACRO_USER_CALL` | *定義なし* | これを定義すると、ユーザの `keymap.c` ファイルを使ってマクロが起動されます。 |
| `DYNAMIC_MACRO_NO_NESTING` | *定義なし* | これを定義すると、別のマクロからマクロを呼び出す(入れ子になったマクロ)機能を無効にします。 |
+| `DYNAMIC_MACRO_DELAY` | *定義なし* | 各キーを送信する時の待ち時間(ms単位)を設定します。 |
記録中にキーを押すたびに LED が点滅し始めた場合は、マクロバッファにマクロを入れるスペースがもう無いことを意味します。マクロを入れるには、他のマクロ(それらは同じバッファを共有します)を短くするか、`config.h` に `DYNAMIC_MACRO_SIZE` 定義を追加することでバッファを増やします(デフォルト値: 128; ヘッダ内のコメントを読んでください)。
diff --git a/docs/ja/feature_key_lock.md b/docs/ja/feature_key_lock.md
index b786fbb048..22cd9fb810 100644
--- a/docs/ja/feature_key_lock.md
+++ b/docs/ja/feature_key_lock.md
@@ -21,7 +21,7 @@
## 注意事項
-キーロックは、標準アクションキーと[ワンショットモディファイア](ja/one_shot_keys.md)キー (例えば、Shift を `OSM(KC_LSFT)` と定義した場合)のみを押し続けることができます。
+キーロックは、標準アクションキーと[ワンショットモディファイア](ja/one_shot_keys.md)キー (例えば、Shift を `OSM(MOD_LSFT)` と定義した場合)のみを押し続けることができます。
これは、QMK の特殊機能(ワンショットモディファイアを除く)、または `KC_LPRN` のような shift を押されたキーのバージョンは含みません。[基本的なキーコード](ja/keycodes_basic.md)リストにある場合、押したままにすることができます。
レイヤーの切り替えは、キーロックを解除しません。
diff --git a/docs/ja/feature_ps2_mouse.md b/docs/ja/feature_ps2_mouse.md
index 569934c187..2798f61283 100644
--- a/docs/ja/feature_ps2_mouse.md
+++ b/docs/ja/feature_ps2_mouse.md
@@ -36,13 +36,14 @@ rules.mk で:
```makefile
PS2_MOUSE_ENABLE = yes
-PS2_USE_BUSYWAIT = yes
+PS2_ENABLE = yes
+PS2_DRIVER = busywait
```
キーボードの config.h で:
```c
-#ifdef PS2_USE_BUSYWAIT
+#ifdef PS2_DRIVER_BUSYWAIT
# define PS2_CLOCK_PIN D1
# define PS2_DATA_PIN D2
#endif
@@ -56,13 +57,14 @@ rules.mk で:
```makefile
PS2_MOUSE_ENABLE = yes
-PS2_USE_INT = yes
+PS2_ENABLE = yes
+PS2_DRIVER = interrupt
```
キーボードの config.h で:
```c
-#ifdef PS2_USE_INT
+#ifdef PS2_DRIVER_INTERRUPT
#define PS2_CLOCK_PIN D2
#define PS2_DATA_PIN D5
@@ -88,14 +90,14 @@ rules.mk で:
```makefile
PS2_MOUSE_ENABLE = yes
-PS2_USE_USART = yes
+PS2_ENABLE = yes
+PS2_DRIVER = usart
```
キーボードの config.h で:
```c
-#ifdef PS2_USE_USART
-#ifdef PS2_USE_USART
+#ifdef PS2_DRIVER_USART
#define PS2_CLOCK_PIN D5
#define PS2_DATA_PIN D2
diff --git a/docs/ja/feature_stenography.md b/docs/ja/feature_stenography.md
index f8f7df11e1..b280084ae3 100644
--- a/docs/ja/feature_stenography.md
+++ b/docs/ja/feature_stenography.md
@@ -77,7 +77,7 @@ bool process_steno_user(uint16_t keycode, keyrecord_t *record) { return true; }
この関数はキーが押されるとキーが処理される前に呼び出されます。キーコードは `QK_STENO_BOLT`、`QK_STENO_GEMINI` あるいは `STN_*` キー値のいずれかでなければなりません。
```c
-bool postprocess_steno_user(uint16_t keycode, keyrecord_t *record, steno_mode_t mode, uint8_t chord[6], int8_t pressed);
+bool post_process_steno_user(uint16_t keycode, keyrecord_t *record, steno_mode_t mode, uint8_t chord[6], int8_t pressed);
```
この関数はキーが処理された後、ただしコードを送信するかどうかを決める前に呼び出されます。`IS_PRESSED(record->event)` が false で、`pressed` が 0 または 1 の場合は、コードはまもなく送信されますが、まだ送信されてはいません。ここが速記コードあるいはキーのライブ表示などのフックを配置する場所です。
diff --git a/docs/ja/feature_tap_dance.md b/docs/ja/feature_tap_dance.md
index a6d108f1e9..762816f21b 100644
--- a/docs/ja/feature_tap_dance.md
+++ b/docs/ja/feature_tap_dance.md
@@ -28,7 +28,6 @@
* `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: 1回タップすると `kc1` キーコードを送信し、2回タップすると `kc2` キーコードを送信します。キーを押し続けているときは、適切なキーコードが登録されます: キーを押し続けた場合は `kc1`、一度タップしてから続けてもう一度キーを押してそのまま押し続けたときは、 `kc2` が登録されます。
* `ACTION_TAP_DANCE_LAYER_MOVE(kc, layer)`: 1回タップすると `kc` キーコードが送信され、2回タップすると `layer` レイヤーに移動します(これは `TO` レイヤーキーコードのように機能します)。
- * この機能は `ACTION_TAP_DANCE_DUAL_ROLE` と同じですが、機能が明確になるように関数名を変更しました。どちらの関数名でも実行できます。
* `ACTION_TAP_DANCE_LAYER_TOGGLE(kc, layer)`: 1回タップすると `kc` キーコードが送信され、2回タップすると `layer` の状態をトグルします(これは `TG` レイヤーキーコードのように機能します)。
* `ACTION_TAP_DANCE_FN(fn)`: ユーザーキーマップに定義した指定の関数が呼び出されます。タップダンス実行の回数分タップすると、最後の時点で呼び出されます。
* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: タップする度にユーザーキーマップに定義した最初の関数が呼び出されます。タップダンスの実行が終わった時点で2番目の関数が呼び出され、タップダンスの実行をリセットするときに最後の関数が呼び出されます。
diff --git a/docs/ja/feature_terminal.md b/docs/ja/feature_terminal.md
deleted file mode 100644
index 8e125ecee0..0000000000
--- a/docs/ja/feature_terminal.md
+++ /dev/null
@@ -1,112 +0,0 @@
-# ターミナル
-
-
-
-> この機能は現在のところ*巨大*であり、おそらく大量のメモリを搭載したキーボード、または楽しみのためにのみ配置する必要があります。
-
-ターミナル機能はテキストエディタを介してキーストロークで通信するように設計されたコマンドラインのようなインタフェースです。エディタで自動インデント機能をオフにすることは有益です。
-
-有効にするには、以下を `rules.mk` または `Makefile` に貼り付けます:
-
- TERMINAL_ENABLE = yes
-
-そして、オンまたはオフにするために、`TERM_ON` および `TERM_OFF` キーコードを使います。
-
-有効な場合、`> ` プロンプトが現れ、ここでコマンドやバックスペース(オーディオが有効な場合は、先頭に到達するとベルが鳴ります)を入力することができ、エンターを入力するとコマンドを送信します。矢印キーは現在のところ無効なため、混乱することはありません。マウスでカーソルを移動することはお勧めしません。
-
-`#define TERMINAL_HELP` は、このページでは実際には必要のない他の出力ヘルパーを有効にします。
-
-"上矢印" および "下矢印" により、過去に入力した5つのコマンドを順に切り替えることができます。
-
-## 今後のアイデア
-
-* キーボード/ユーザ拡張可能なコマンド
-* より小さなフットプリント
-* 矢印キーのサポート
-* コマンド履歴 - 完了
-* SD カードのサポート
-* バッファディスプレイのための LCD サポート
-* キーコード -> 名称の対応表
-* レイヤー状態
-* *アナログ/デジタル ポートの読み込み/書き込み*
-* RGB モード関連機能
-* マクロ定義
-* EEPROM の読み込み/書き込み
-* オーディオ制御
-
-## 現在のコマンド
-
-### `about`
-
-現在の QMK のバージョンとビルドした日の出力:
-
-```
-> about
-QMK Firmware
- v0.5.115-7-g80ed73-dirty
- Built: 2017-08-29-20:24:44
-```
-
-
-### `print-buffer`
-
-最後に入力した5つのコマンドの出力
-
-```
-> print-buffer
-0. print-buffer
-1. help
-2. about
-3. keymap 0
-4. help
-5. flush-buffer
-```
-
-### `flush-buffer`
-
-コマンドバッファをクリア
-```
-> flush-buffer
-Buffer cleared!
-```
-
-
-### `help`
-
-
-利用可能なコマンドの出力:
-
-```
-> help
-commands available:
- about help keycode keymap exit print-buffer flush-buffer
-```
-
-### `keycode `
-
-特定のレイヤー、行および列のキーコード値の出力:
-
-```
-> keycode 0 1 0
-0x29 (41)
-```
-
-### `keymap `
-
-特定のレイヤーの全てのキーマップの出力
-
-```
-> keymap 0
-0x002b, 0x0014, 0x001a, 0x0008, 0x0015, 0x0017, 0x001c, 0x0018, 0x000c, 0x0012, 0x0013, 0x002a,
-0x0029, 0x0004, 0x0016, 0x0007, 0x0009, 0x000a, 0x000b, 0x000d, 0x000e, 0x000f, 0x0033, 0x0034,
-0x00e1, 0x001d, 0x001b, 0x0006, 0x0019, 0x0005, 0x0011, 0x0010, 0x0036, 0x0037, 0x0038, 0x0028,
-0x5cd6, 0x00e0, 0x00e2, 0x00e3, 0x5cd4, 0x002c, 0x002c, 0x5cd5, 0x0050, 0x0051, 0x0052, 0x004f,
->
-```
-
-### `exit`
-
-ターミナルの終了 - `TERM_OFF` と同じ。
diff --git a/docs/ja/flashing.md b/docs/ja/flashing.md
index 0245250cee..ce6646d4fe 100644
--- a/docs/ja/flashing.md
+++ b/docs/ja/flashing.md
@@ -34,7 +34,7 @@ BOOTLOADER = atmel-dfu
書き込み手順:
-1. `RESET` キーコードを押すか、RESET ボタンをタップします(または RST を GND にショートします)。
+1. `QK_BOOT` キーコードを押すか、RESET ボタンをタップします(または RST を GND にショートします)。
2. OS がデバイスを検知するのを待ちます。
3. メモリを消去します(自動的に実行されるかもしれません)
4. .hex ファイルを書き込みます
@@ -94,7 +94,7 @@ BOOTLOADER = caterina
書き込み手順:
-1. `RESET` キーコードを押すか、RST をすばやく GND にショートします (入力後7秒で書き込みます)
+1. `QK_BOOT` キーコードを押すか、RST をすばやく GND にショートします (入力後7秒で書き込みます)
2. OS がデバイスを検知するのを待ちます。
3. .hex ファイルを書き込みます
4. デバイスが自動的にリセットされるのを待ちます
@@ -141,7 +141,7 @@ BOOTLOADER = halfkay
書き込み手順:
-1. `RESET` キーコードを押すか、RST をすばやく GND にショートします (入力後7秒で書き込みます)
+1. `QK_BOOT` キーコードを押すか、RST をすばやく GND にショートします (入力後7秒で書き込みます)
2. OS がデバイスを検知するのを待ちます。
3. .hex ファイルを書き込みます
4. デバイスをアプリケーションモードにリセットします(自動的に実行されるかもしれません)
@@ -172,7 +172,7 @@ BOOTLOADER = USBasp
書き込み手順:
-1. `RESET` キーコードを押すか、RST を GND にすばやくショートしながら、ブートピンを GND にショートしたままにします。
+1. `QK_BOOT` キーコードを押すか、RST を GND にすばやくショートしながら、ブートピンを GND にショートしたままにします。
2. OS がデバイスを検知するのを待ちます。
3. .hex ファイルを書き込みます
4. デバイスをアプリケーションモードにリセットします(自動的に実行されるかもしれません)
@@ -203,7 +203,7 @@ BOOTLOADER = bootloadHID
書き込み手順:
1. 以下のいずれかの方法を使ってブートローダに入ります:
- * `RESET` キーコードをタップします (全てのデバイスでは動作しないかもしれません)
+ * `QK_BOOT` キーコードをタップします (全てのデバイスでは動作しないかもしれません)
* キーボードを接続しながらソルトキーを押し続けます (通常はキーボードの readme に書かれています)
2. OS がデバイスを検知するのを待ちます。
3. .hex ファイルを書き込みます
@@ -227,7 +227,7 @@ BOOTLOADER = bootloadHID
書き込み手順:
1. 以下のいずれかの方法を使ってブートローダに入ります:
- * `RESET` キーコードをタップします (STM32F042 デバイスでは動作しないかもしれません)
+ * `QK_BOOT` キーコードをタップします (STM32F042 デバイスでは動作しないかもしれません)
* リセット回路が存在する場合、RESET ボタンをタップします
* それ以外の場合は、(BOOT0 ボタンあるいはブリッジ経由で)BOOT0 を VCC にブリッジし、(REEST ボタンあるいはブリッジ経由で)RESET を GND にショートし、BOOT0 ブリッジを放す必要があります。
2. OS がデバイスを検知するのを待ちます。
diff --git a/docs/ja/flashing_bootloadhid.md b/docs/ja/flashing_bootloadhid.md
index ddcd776c24..5c67bd5f29 100644
--- a/docs/ja/flashing_bootloadhid.md
+++ b/docs/ja/flashing_bootloadhid.md
@@ -10,7 +10,7 @@ ps2avr(GB) キーボードは ATmega32A マイクロコントローラを使い
一般的な書き込みシーケンス:
1. 以下のいずれかの方法を使ってブートローダに入ります:
- * `RESET` キーコードをタップします (全てのデバイスでは動作しないかもしれません)
+ * `QK_BOOT` キーコードをタップします (全てのデバイスでは動作しないかもしれません)
* ソルトキーを押し続けながらキーボードを接続します (通常はキーボードの readme に書かれています)
2. OS がデバイスを検知するのを待ちます。
3. .hex ファイルを書き込みます
diff --git a/docs/ja/keycodes.md b/docs/ja/keycodes.md
index c5c075bb2b..aa8c722372 100644
--- a/docs/ja/keycodes.md
+++ b/docs/ja/keycodes.md
@@ -228,10 +228,10 @@
[Quantum キーコード](ja/quantum_keycodes.md#qmk-keycodes) も見てください。
|キー |エイリアス |説明 |
-|--------------|-----------|---------------------------------------------------------|
-|`RESET` | |ファームウエア書き込みのためにキーボードをブートローダーモードにします |
-|`DEBUG` | |デバッグモードを切り替えます |
-|`EEPROM_RESET`|`EEP_RST` |キーボードの EEPROM (不揮発メモリ) を再初期化します |
+|-----------------|---------|---------------------------------------------------------|
+|`QK_BOOTLOADER` |`QK_BOOT`|ファームウエア書き込みのためにキーボードをブートローダーモードにします |
+|`QK_DEBUG_TOGGLE`|`DB_TOGG`|デバッグモードを切り替えます |
+|`QK_CLEAR_EEPROM`|`EE_CLR` |キーボードの EEPROM (不揮発メモリ) を再初期化します |
## オーディオキー :id=audio-keys
diff --git a/docs/ja/quantum_keycodes.md b/docs/ja/quantum_keycodes.md
index ffcc494460..0795520c6e 100644
--- a/docs/ja/quantum_keycodes.md
+++ b/docs/ja/quantum_keycodes.md
@@ -14,7 +14,7 @@ quantum 内の全てのキーコードは `0x0000` と `0xFFFF` の間の数値
## QMK キーコード :id=qmk-keycodes
| キー | エイリアス | 説明 |
-|----------------|------------|--------------------------------------------------------|
-| `RESET` | | 書き込みのために、キーボードを bootloader モードにする |
-| `DEBUG` | | デバッグモードの切り替え |
-| `EEPROM_RESET` | `EEP_RST` | キーボードの EEPROM (永続化メモリ) を再初期化する |
+|-----------------|---------|--------------------------------------------------------|
+|`QK_BOOTLOADER` |`QK_BOOT`| 書き込みのために、キーボードを bootloader モードにする |
+|`QK_DEBUG_TOGGLE`|`DB_TOGG`| デバッグモードの切り替え |
+|`QK_CLEAR_EEPROM`|`EE_CLR` | キーボードの EEPROM (永続化メモリ) を再初期化する |
diff --git a/docs/ja/understanding_qmk.md b/docs/ja/understanding_qmk.md
index 1654f8e002..550ee3a7c0 100644
--- a/docs/ja/understanding_qmk.md
+++ b/docs/ja/understanding_qmk.md
@@ -161,7 +161,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_combo.c#L115)
* [`bool process_printer(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_printer.c#L77)
* [`bool process_auto_shift(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_auto_shift.c#L94)
- * [`bool process_terminal(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_terminal.c#L264)
* [Quantum 固有のキーコードを識別して処理する](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L291)
この一連のイベントの中の任意のステップで (`process_record_kb()` のような)関数は `false` を返して、以降の処理を停止することができます。
diff --git a/docs/keycodes.md b/docs/keycodes.md
index bd5af32dd3..f660c7f526 100644
--- a/docs/keycodes.md
+++ b/docs/keycodes.md
@@ -207,6 +207,8 @@ See also: [Basic Keycodes](keycodes_basic.md)
|`KC_MEDIA_REWIND` |`KC_MRWD` |Previous Track |✔6|✔5|✔ |
|`KC_BRIGHTNESS_UP` |`KC_BRIU` |Brightness Up |✔ |✔ |✔ |
|`KC_BRIGHTNESS_DOWN` |`KC_BRID` |Brightness Down |✔ |✔ |✔ |
+|`KC_CONTROL_PANEL` |`KC_CPNL` |Open Control Panel |✔ | | |
+|`KC_ASSISTANT` |`KC_ASST` |Launch Context-Aware Assistant |✔ | | |
1. The Linux kernel HID driver recognizes [nearly all keycodes](https://github.com/torvalds/linux/blob/master/drivers/hid/hid-input.c), but the default bindings depend on the DE/WM.
2. Treated as F13-F15.
@@ -219,75 +221,102 @@ See also: [Basic Keycodes](keycodes_basic.md)
See also: [Quantum Keycodes](quantum_keycodes.md#qmk-keycodes)
-|Key |Aliases |Description |
-|-----------------|---------|---------------------------------------------------------------------------------|
-|`QK_BOOTLOADER` |`QK_BOOT`|Put the keyboard into bootloader mode for flashing |
-|`QK_DEBUG_TOGGLE`|`DB_TOGG`|Toggle debug mode |
-|`QK_CLEAR_EEPROM`|`EE_CLR` |Reinitializes the keyboard's EEPROM (persistent memory) |
-|`QK_MAKE` | |Sends `qmk compile -kb (keyboard) -km (keymap)`, or `qmk flash` if shift is held |
-|`QK_REBOOT` |`QK_RBT` |Resets the keyboard. Does not load the bootloader |
+|Key |Aliases |Description |
+|-----------------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------|
+|`QK_BOOTLOADER` |`QK_BOOT`|Put the keyboard into bootloader mode for flashing |
+|`QK_DEBUG_TOGGLE`|`DB_TOGG`|Toggle debug mode |
+|`QK_CLEAR_EEPROM`|`EE_CLR` |Reinitializes the keyboard's EEPROM (persistent memory) |
+|`QK_MAKE` | |Sends `qmk compile -kb (keyboard) -km (keymap)`, or `qmk flash` if shift is held. Puts keyboard into bootloader mode if shift & control are held |
+|`QK_REBOOT` |`QK_RBT` |Resets the keyboard. Does not load the bootloader |
## Audio Keys :id=audio-keys
See also: [Audio](feature_audio.md)
-|Key |Aliases |Description |
-|----------------|---------|----------------------------------|
-|`AU_ON` | |Turns on Audio Feature |
-|`AU_OFF` | |Turns off Audio Feature |
-|`AU_TOG` | |Toggles Audio state |
-|`CLICKY_TOGGLE` |`CK_TOGG`|Toggles Audio clicky mode |
-|`CLICKY_UP` |`CK_UP` |Increases frequency of the clicks |
-|`CLICKY_DOWN` |`CK_DOWN`|Decreases frequency of the clicks |
-|`CLICKY_RESET` |`CK_RST` |Resets frequency to default |
-|`MU_ON` | |Turns on Music Mode |
-|`MU_OFF` | |Turns off Music Mode |
-|`MU_TOG` | |Toggles Music Mode |
-|`MU_MOD` | |Cycles through the music modes |
+|Key |Aliases |Description |
+|-------------------------|---------|-------------------------------------------|
+|`QK_AUDIO_ON` |`AU_ON` |Turns on Audio Feature |
+|`QK_AUDIO_OFF` |`AU_OFF` |Turns off Audio Feature |
+|`QK_AUDIO_TOGGLE` |`AU_TOGG`|Toggles Audio state |
+|`QK_AUDIO_CLICKY_TOGGLE` |`CK_TOGG`|Toggles Audio clicky mode |
+|`QK_AUDIO_CLICKY_ON` |`CK_ON` |Turns on Audio clicky mode |
+|`QK_AUDIO_CLICKY_OFF` |`CK_OFF` |Turns on Audio clicky mode |
+|`QK_AUDIO_CLICKY_UP` |`CK_UP` |Increases frequency of the clicks |
+|`QK_AUDIO_CLICKY_DOWN` |`CK_DOWN`|Decreases frequency of the clicks |
+|`QK_AUDIO_CLICKY_RESET` |`CK_RST` |Resets frequency to default |
+|`QK_MUSIC_ON` |`MU_ON` |Turns on Music Mode |
+|`QK_MUSIC_OFF` |`MU_OFF` |Turns off Music Mode |
+|`QK_MUSIC_TOGGLE` |`MU_TOGG`|Toggles Music Mode |
+|`QK_MUSIC_MODE_NEXT` |`MU_NEXT`|Cycles through the music modes |
+|`QK_AUDIO_VOICE_NEXT` |`AU_NEXT`|Cycles through the audio voices |
+|`QK_AUDIO_VOICE_PREVIOUS`|`AU_PREV`|Cycles through the audio voices in reverse |
+
+## Auto Shift :id=auto-shift
+
+See also: [Auto Shift](feature_auto_shift.md)
+
+|Key |Aliases |Description |
+|----------------------|---------|--------------------------------------------|
+|`QK_AUTO_SHIFT_DOWN` |`AS_DOWN`|Lower the Auto Shift timeout variable (down)|
+|`QK_AUTO_SHIFT_UP` |`AS_UP` |Raise the Auto Shift timeout variable (up) |
+|`QK_AUTO_SHIFT_REPORT`|`AS_RPT` |Report your current Auto Shift timeout value|
+|`QK_AUTO_SHIFT_ON` |`AS_ON` |Turns on the Auto Shift Function |
+|`QK_AUTO_SHIFT_OFF` |`AS_OFF` |Turns off the Auto Shift Function |
+|`QK_AUTO_SHIFT_TOGGLE`|`AS_TOGG`|Toggles the state of the Auto Shift feature |
+
+## Autocorrect :id=autocorrect
+
+See also: [Autocorrect](feature_autocorrect.md)
+
+|Key |Aliases |Description |
+|-----------------------|---------|----------------------------------------------|
+|`QK_AUTOCORRECT_ON` |`AC_ON` |Turns on the Autocorrect feature. |
+|`QK_AUTOCORRECT_OFF` |`AC_OFF` |Turns off the Autocorrect feature. |
+|`QK_AUTOCORRECT_TOGGLE`|`AC_TOGG`|Toggles the status of the Autocorrect feature.|
## Backlighting :id=backlighting
See also: [Backlighting](feature_backlight.md)
-|Key |Description |
-|---------|------------------------------------------|
-|`BL_TOGG`|Turn the backlight on or off |
-|`BL_STEP`|Cycle through backlight levels |
-|`BL_ON` |Set the backlight to max brightness |
-|`BL_OFF` |Turn the backlight off |
-|`BL_INC` |Increase the backlight level |
-|`BL_DEC` |Decrease the backlight level |
-|`BL_BRTG`|Toggle backlight breathing |
+| Key | Aliases | Description |
+|---------------------------------|-----------|-------------------------------------|
+| `QK_BACKLIGHT_TOGGLE` | `BL_TOGG` | Turn the backlight on or off |
+| `QK_BACKLIGHT_STEP` | `BL_STEP` | Cycle through backlight levels |
+| `QK_BACKLIGHT_ON` | `BL_ON` | Set the backlight to max brightness |
+| `QK_BACKLIGHT_OFF` | `BL_OFF` | Turn the backlight off |
+| `QK_BACKLIGHT_UP` | `BL_UP` | Increase the backlight level |
+| `QK_BACKLIGHT_DOWN` | `BL_DOWN` | Decrease the backlight level |
+| `QK_BACKLIGHT_TOGGLE_BREATHING` | `BL_BRTG` | Toggle backlight breathing |
## Bluetooth :id=bluetooth
See also: [Bluetooth](feature_bluetooth.md)
-|Key |Description |
-|----------|----------------------------------------------|
-|`OUT_AUTO`|Automatically switch between USB and Bluetooth|
-|`OUT_USB` |USB only |
-|`OUT_BT` |Bluetooth only |
+|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 |
## Caps Word :id=caps-word
See also: [Caps Word](feature_caps_word.md)
-|Key |Aliases |Description |
-|-----------|---------|------------------------------|
-|`CAPS_WORD`|`CAPSWRD`|Toggles Caps Word |
+|Key |Aliases |Description |
+|---------------------|---------|------------------------------|
+|`QK_CAPS_WORD_TOGGLE`|`CW_TOGG`|Toggles Caps Word |
## Dynamic Macros :id=dynamic-macros
See also: [Dynamic Macros](feature_dynamic_macros.md)
-|Key |Aliases |Description |
-|-----------------|---------|--------------------------------------------------|
-|`DYN_REC_START1` |`DM_REC1`|Start recording Macro 1 |
-|`DYN_REC_START2` |`DM_REC2`|Start recording Macro 2 |
-|`DYN_MACRO_PLAY1`|`DM_PLY1`|Replay Macro 1 |
-|`DYN_MACRO_PLAY2`|`DM_PLY2`|Replay Macro 2 |
-|`DYN_REC_STOP` |`DM_RSTP`|Finish the macro that is currently being recorded.|
+|Key |Aliases |Description |
+|---------------------------------|---------|--------------------------------------------------|
+|`QK_DYNAMIC_MACRO_RECORD_START_1`|`DM_REC1`|Start recording Macro 1 |
+|`QK_DYNAMIC_MACRO_RECORD_START_2`|`DM_REC2`|Start recording Macro 2 |
+|`QK_DYNAMIC_MACRO_PLAY_1` |`DM_PLY1`|Replay Macro 1 |
+|`QK_DYNAMIC_MACRO_PLAY_2` |`DM_PLY2`|Replay Macro 2 |
+|`QK_DYNAMIC_MACRO_RECORD_STOP` |`DM_RSTP`|Finish the macro that is currently being recorded.|
## Grave Escape :id=grave-escape
@@ -297,13 +326,52 @@ See also: [Grave Escape](feature_grave_esc.md)
|-----------------|---------|------------------------------------------------------------------|
|`QK_GRAVE_ESCAPE`|`QK_GESC`|Escape when pressed, `
when Shift or GUI are held|
+## Joystick :id=joystick
+
+See also: [Joystick](feature_joystick.md)
+
+|Key |Aliases|Description|
+|-----------------------|-------|-----------|
+|`QK_JOYSTICK_BUTTON_0` |`JS_0` |Button 0 |
+|`QK_JOYSTICK_BUTTON_1` |`JS_1` |Button 1 |
+|`QK_JOYSTICK_BUTTON_2` |`JS_2` |Button 2 |
+|`QK_JOYSTICK_BUTTON_3` |`JS_3` |Button 3 |
+|`QK_JOYSTICK_BUTTON_4` |`JS_4` |Button 4 |
+|`QK_JOYSTICK_BUTTON_5` |`JS_5` |Button 5 |
+|`QK_JOYSTICK_BUTTON_6` |`JS_6` |Button 6 |
+|`QK_JOYSTICK_BUTTON_7` |`JS_7` |Button 7 |
+|`QK_JOYSTICK_BUTTON_8` |`JS_8` |Button 8 |
+|`QK_JOYSTICK_BUTTON_9` |`JS_9` |Button 9 |
+|`QK_JOYSTICK_BUTTON_10`|`JS_10`|Button 10 |
+|`QK_JOYSTICK_BUTTON_11`|`JS_11`|Button 11 |
+|`QK_JOYSTICK_BUTTON_12`|`JS_12`|Button 12 |
+|`QK_JOYSTICK_BUTTON_13`|`JS_13`|Button 13 |
+|`QK_JOYSTICK_BUTTON_14`|`JS_14`|Button 14 |
+|`QK_JOYSTICK_BUTTON_15`|`JS_15`|Button 15 |
+|`QK_JOYSTICK_BUTTON_16`|`JS_16`|Button 16 |
+|`QK_JOYSTICK_BUTTON_17`|`JS_17`|Button 17 |
+|`QK_JOYSTICK_BUTTON_18`|`JS_18`|Button 18 |
+|`QK_JOYSTICK_BUTTON_19`|`JS_19`|Button 19 |
+|`QK_JOYSTICK_BUTTON_20`|`JS_20`|Button 20 |
+|`QK_JOYSTICK_BUTTON_21`|`JS_21`|Button 21 |
+|`QK_JOYSTICK_BUTTON_22`|`JS_22`|Button 22 |
+|`QK_JOYSTICK_BUTTON_23`|`JS_23`|Button 23 |
+|`QK_JOYSTICK_BUTTON_24`|`JS_24`|Button 24 |
+|`QK_JOYSTICK_BUTTON_25`|`JS_25`|Button 25 |
+|`QK_JOYSTICK_BUTTON_26`|`JS_26`|Button 26 |
+|`QK_JOYSTICK_BUTTON_27`|`JS_27`|Button 27 |
+|`QK_JOYSTICK_BUTTON_28`|`JS_28`|Button 28 |
+|`QK_JOYSTICK_BUTTON_29`|`JS_29`|Button 29 |
+|`QK_JOYSTICK_BUTTON_30`|`JS_30`|Button 30 |
+|`QK_JOYSTICK_BUTTON_31`|`JS_31`|Button 31 |
+
## Key Lock :id=key-lock
See also: [Key Lock](feature_key_lock.md)
|Key |Description |
|---------|--------------------------------------------------------------|
-|`KC_LOCK`|Hold down the next key pressed, until the key is pressed again|
+|`QK_LOCK`|Hold down the next key pressed, until the key is pressed again|
## Layer Switching :id=layer-switching
@@ -326,7 +394,7 @@ See also: [Leader Key](feature_leader_key.md)
|Key |Description |
|---------|------------------------|
-|`KC_LEAD`|Begins a leader sequence|
+|`QK_LEAD`|Begins a leader sequence|
## Magic Keycodes :id=magic-keycodes
@@ -337,6 +405,9 @@ See also: [Magic Keycodes](keycodes_magic.md)
|`MAGIC_SWAP_CONTROL_CAPSLOCK` |`CL_SWAP`|Swap Caps Lock and Left Control |
|`MAGIC_UNSWAP_CONTROL_CAPSLOCK` |`CL_NORM`|Unswap Caps Lock and Left Control |
|`MAGIC_TOGGLE_CONTROL_CAPSLOCK` |`CL_TOGG`|Toggle Caps Lock and Left Control swap |
+|`MAGIC_SWAP_ESCAPE_CAPSLOCK` |`EC_SWAP`|Swap Caps Lock and Escape |
+|`MAGIC_UNSWAP_ESCAPE_CAPSLOCK` |`EC_NORM`|Unswap Caps Lock and Escape |
+|`MAGIC_TOGGLE_ESCAPE_CAPSLOCK` |`EC_TOGG`|Toggle Caps Lock and Escape swap |
|`MAGIC_CAPSLOCK_TO_CONTROL` |`CL_CTRL`|Treat Caps Lock as Control |
|`MAGIC_UNCAPSLOCK_TO_CONTROL` |`CL_CAPS`|Stop treating Caps Lock as Control |
|`MAGIC_SWAP_LCTL_LGUI` |`LCG_SWP`|Swap Left Control and GUI |
@@ -360,6 +431,7 @@ See also: [Magic Keycodes](keycodes_magic.md)
|`MAGIC_UNSWAP_GRAVE_ESC` |`GE_NORM`|Unswap `
and Escape |
|`MAGIC_SWAP_BACKSLASH_BACKSPACE` |`BS_SWAP`|Swap `\` and Backspace |
|`MAGIC_UNSWAP_BACKSLASH_BACKSPACE`|`BS_NORM`|Unswap `\` and Backspace |
+|`MAGIC_TOGGLE_BACKSLASH_BACKSPACE`|`BS_TOGG`|Toggle `\` and Backspace swap state |
|`MAGIC_HOST_NKRO` |`NK_ON` |Enable N-key rollover |
|`MAGIC_UNHOST_NKRO` |`NK_OFF` |Disable N-key rollover |
|`MAGIC_TOGGLE_NKRO` |`NK_TOGG`|Toggle N-key rollover |
@@ -370,152 +442,152 @@ See also: [Magic Keycodes](keycodes_magic.md)
See also: [MIDI](feature_midi.md)
-|Key |Aliases |Description |
-|------------|---------|---------------------------------|
-|`MI_ON` | |Turn MIDI on |
-|`MI_OFF` | |Turn MIDI off |
-|`MI_TOG` | |Toggle MIDI enabled |
-|`MI_C` | |C octave 0 |
-|`MI_Cs` |`MI_Db` |C♯/D♭ octave 0 |
-|`MI_D` | |D octave 0 |
-|`MI_Ds` |`MI_Eb` |D♯/E♭ octave 0 |
-|`MI_E` | |E octave 0 |
-|`MI_F` | |F octave 0 |
-|`MI_Fs` |`MI_Gb` |F♯/G♭ octave 0 |
-|`MI_G` | |G octave 0 |
-|`MI_Gs` |`MI_Gs` |G♯/A♭ octave 0 |
-|`MI_A` | |A octave 0 |
-|`MI_As` |`MI_Bb` |A♯/B♭ octave 0 |
-|`MI_B` | |B octave 0 |
-|`MI_C_1` | |C octave 1 |
-|`MI_Cs_1` |`MI_Db_1`|C♯/D♭ octave 1 |
-|`MI_D_1` | |D octave 1 |
-|`MI_Ds_1` |`MI_Eb_1`|D♯/E♭ octave 1 |
-|`MI_E_1` | |E octave 1 |
-|`MI_F_1` | |F octave 1 |
-|`MI_Fs_1` |`MI_Gb_1`|F♯/G♭ octave 1 |
-|`MI_G_1` | |G octave 1 |
-|`MI_Gs_1` |`MI_Ab_1`|G♯/A♭ octave 1 |
-|`MI_A_1` | |A octave 1 |
-|`MI_As_1` |`MI_Bb_1`|A♯/B♭ octave 1 |
-|`MI_B_1` | |B octave 1 |
-|`MI_C_2` | |C octave 2 |
-|`MI_Cs_2` |`MI_Db_2`|C♯/D♭ octave 2 |
-|`MI_D_2` | |D octave 2 |
-|`MI_Ds_2` |`MI_Eb_2`|D♯/E♭ octave 2 |
-|`MI_E_2` | |E octave 2 |
-|`MI_F_2` | |F octave 2 |
-|`MI_Fs_2` |`MI_Gb_2`|F♯/G♭ octave 2 |
-|`MI_G_2` | |G octave 2 |
-|`MI_Gs_2` |`MI_Ab_2`|G♯/A♭ octave 2 |
-|`MI_A_2` | |A octave 2 |
-|`MI_As_2` |`MI_Bb_2`|A♯/B♭ octave 2 |
-|`MI_B_2` | |B octave 2 |
-|`MI_C_3` | |C octave 3 |
-|`MI_Cs_3` |`MI_Db_3`|C♯/D♭ octave 3 |
-|`MI_D_3` | |D octave 3 |
-|`MI_Ds_3` |`MI_Eb_3`|D♯/E♭ octave 3 |
-|`MI_E_3` | |E octave 3 |
-|`MI_F_3` | |F octave 3 |
-|`MI_Fs_3` |`MI_Gb_3`|F♯/G♭ octave 3 |
-|`MI_G_3` | |G octave 3 |
-|`MI_Gs_3` |`MI_Ab_3`|G♯/A♭ octave 3 |
-|`MI_A_3` | |A octave 3 |
-|`MI_As_3` |`MI_Bb_3`|A♯/B♭ octave 3 |
-|`MI_B_3` | |B octave 3 |
-|`MI_C_4` | |C octave 4 |
-|`MI_Cs_4` |`MI_Db_4`|C♯/D♭ octave 4 |
-|`MI_D_4` | |D octave 4 |
-|`MI_Ds_4` |`MI_Eb_4`|D♯/E♭ octave 4 |
-|`MI_E_4` | |E octave 4 |
-|`MI_F_4` | |F octave 4 |
-|`MI_Fs_4` |`MI_Gb_4`|F♯/G♭ octave 4 |
-|`MI_G_4` | |G octave 4 |
-|`MI_Gs_4` |`MI_Ab_4`|G♯/A♭ octave 4 |
-|`MI_A_4` | |A octave 4 |
-|`MI_As_4` |`MI_Bb_4`|A♯/B♭ octave 4 |
-|`MI_B_4` | |B octave 4 |
-|`MI_C_5` | |C octave 5 |
-|`MI_Cs_5` |`MI_Db_5`|C♯/D♭ octave 5 |
-|`MI_D_5` | |D octave 5 |
-|`MI_Ds_5` |`MI_Eb_5`|D♯/E♭ octave 5 |
-|`MI_E_5` | |E octave 5 |
-|`MI_F_5` | |F octave 5 |
-|`MI_Fs_5` |`MI_Gb_5`|F♯/G♭ octave 5 |
-|`MI_G_5` | |G octave 5 |
-|`MI_Gs_5` |`MI_Ab_5`|G♯/A♭ octave 5 |
-|`MI_A_5` | |A octave 5 |
-|`MI_As_5` |`MI_Bb_5`|A♯/B♭ octave 5 |
-|`MI_B_5` | |B octave 5 |
-|`MI_OCT_N2` | |Set octave to -2 |
-|`MI_OCT_N1` | |Set octave to -1 |
-|`MI_OCT_0` | |Set octave to 0 |
-|`MI_OCT_1` | |Set octave to 1 |
-|`MI_OCT_2` | |Set octave to 2 |
-|`MI_OCT_3` | |Set octave to 3 |
-|`MI_OCT_4` | |Set octave to 4 |
-|`MI_OCT_5` | |Set octave to 5 |
-|`MI_OCT_6` | |Set octave to 6 |
-|`MI_OCT_7` | |Set octave to 7 |
-|`MI_OCTD` | |Move down an octave |
-|`MI_OCTU` | |Move up an octave |
-|`MI_TRNS_N6`| |Set transposition to -6 semitones|
-|`MI_TRNS_N5`| |Set transposition to -5 semitones|
-|`MI_TRNS_N4`| |Set transposition to -4 semitones|
-|`MI_TRNS_N3`| |Set transposition to -3 semitones|
-|`MI_TRNS_N2`| |Set transposition to -2 semitones|
-|`MI_TRNS_N1`| |Set transposition to -1 semitone |
-|`MI_TRNS_0` | |No transposition |
-|`MI_TRNS_1` | |Set transposition to +1 semitone |
-|`MI_TRNS_2` | |Set transposition to +2 semitones|
-|`MI_TRNS_3` | |Set transposition to +3 semitones|
-|`MI_TRNS_4` | |Set transposition to +4 semitones|
-|`MI_TRNS_5` | |Set transposition to +5 semitones|
-|`MI_TRNS_6` | |Set transposition to +6 semitones|
-|`MI_TRNSD` | |Decrease transposition |
-|`MI_TRNSU` | |Increase transposition |
-|`MI_VEL_0` | |Set velocity to 0 |
-|`MI_VEL_1` | |Set velocity to 12 |
-|`MI_VEL_2` | |Set velocity to 25 |
-|`MI_VEL_3` | |Set velocity to 38 |
-|`MI_VEL_4` | |Set velocity to 51 |
-|`MI_VEL_5` | |Set velocity to 64 |
-|`MI_VEL_6` | |Set velocity to 76 |
-|`MI_VEL_7` | |Set velocity to 89 |
-|`MI_VEL_8` | |Set velocity to 102 |
-|`MI_VEL_9` | |Set velocity to 114 |
-|`MI_VEL_10` | |Set velocity to 127 |
-|`MI_VELD` | |Decrease velocity |
-|`MI_VELU` | |Increase velocity |
-|`MI_CH1` | |Set channel to 1 |
-|`MI_CH2` | |Set channel to 2 |
-|`MI_CH3` | |Set channel to 3 |
-|`MI_CH4` | |Set channel to 4 |
-|`MI_CH5` | |Set channel to 5 |
-|`MI_CH6` | |Set channel to 6 |
-|`MI_CH7` | |Set channel to 7 |
-|`MI_CH8` | |Set channel to 8 |
-|`MI_CH9` | |Set channel to 9 |
-|`MI_CH10` | |Set channel to 10 |
-|`MI_CH11` | |Set channel to 11 |
-|`MI_CH12` | |Set channel to 12 |
-|`MI_CH13` | |Set channel to 13 |
-|`MI_CH14` | |Set channel to 14 |
-|`MI_CH15` | |Set channel to 15 |
-|`MI_CH16` | |Set channel to 16 |
-|`MI_CHD` | |Decrease channel |
-|`MI_CHU` | |Increase channel |
-|`MI_ALLOFF` | |Stop all notes |
-|`MI_SUS` | |Sustain |
-|`MI_PORT` | |Portmento |
-|`MI_SOST` | |Sostenuto |
-|`MI_SOFT` | |Soft Pedal |
-|`MI_LEG` | |Legato |
-|`MI_MOD` | |Modulation |
-|`MI_MODSD` | |Decrease modulation speed |
-|`MI_MODSU` | |Increase modulation speed |
-|`MI_BENDD` | |Bend pitch down |
-|`MI_BENDU` | |Bend pitch up |
+|Key |Aliases |Description |
+|-------------------------------|------------------|---------------------------------|
+|`QK_MIDI_ON` |`MI_ON` |Turn MIDI on |
+|`QK_MIDI_OFF` |`MI_OFF` |Turn MIDI off |
+|`QK_MIDI_TOGGLE` |`MI_TOGG` |Toggle MIDI enabled |
+|`QK_MIDI_NOTE_C_0` |`MI_C` |C octave 0 |
+|`QK_MIDI_NOTE_C_SHARP_0` |`MI_Cs`, `MI_Db` |C♯/D♭ octave 0 |
+|`QK_MIDI_NOTE_D_0` |`MI_D` |D octave 0 |
+|`QK_MIDI_NOTE_D_SHARP_0` |`MI_Ds`, `MI_Eb` |D♯/E♭ octave 0 |
+|`QK_MIDI_NOTE_E_0` |`MI_E` |E octave 0 |
+|`QK_MIDI_NOTE_F_0` |`MI_F` |F octave 0 |
+|`QK_MIDI_NOTE_F_SHARP_0` |`MI_Fs`, `MI_Gb` |F♯/G♭ octave 0 |
+|`QK_MIDI_NOTE_G_0` |`MI_G` |G octave 0 |
+|`QK_MIDI_NOTE_G_SHARP_0` |`MI_Gs`, `MI_Ab` |G♯/A♭ octave 0 |
+|`QK_MIDI_NOTE_A_0` |`MI_A` |A octave 0 |
+|`QK_MIDI_NOTE_A_SHARP_0` |`MI_As`, `MI_Bb` |A♯/B♭ octave 0 |
+|`QK_MIDI_NOTE_B_0` |`MI_B` |B octave 0 |
+|`QK_MIDI_NOTE_C_1` |`MI_C1` |C octave 1 |
+|`QK_MIDI_NOTE_C_SHARP_1` |`MI_Cs1`, `MI_Db1`|C♯/D♭ octave 1 |
+|`QK_MIDI_NOTE_D_1` |`MI_D1` |D octave 1 |
+|`QK_MIDI_NOTE_D_SHARP_1` |`MI_Ds1`, `MI_Eb1`|D♯/E♭ octave 1 |
+|`QK_MIDI_NOTE_E_1` |`MI_E1` |E octave 1 |
+|`QK_MIDI_NOTE_F_1` |`MI_F1` |F octave 1 |
+|`QK_MIDI_NOTE_F_SHARP_1` |`MI_Fs1`, `MI_Gb1`|F♯/G♭ octave 1 |
+|`QK_MIDI_NOTE_G_1` |`MI_G1` |G octave 1 |
+|`QK_MIDI_NOTE_G_SHARP_1` |`MI_Gs1`, `MI_Ab1`|G♯/A♭ octave 1 |
+|`QK_MIDI_NOTE_A_1` |`MI_A1` |A octave 1 |
+|`QK_MIDI_NOTE_A_SHARP_1` |`MI_As1`, `MI_Bb1`|A♯/B♭ octave 1 |
+|`QK_MIDI_NOTE_B_1` |`MI_B1` |B octave 1 |
+|`QK_MIDI_NOTE_C_2` |`MI_C2` |C octave 2 |
+|`QK_MIDI_NOTE_C_SHARP_2` |`MI_Cs2`, `MI_Db2`|C♯/D♭ octave 2 |
+|`QK_MIDI_NOTE_D_2` |`MI_D2` |D octave 2 |
+|`QK_MIDI_NOTE_D_SHARP_2` |`MI_Ds2`, `MI_Eb2`|D♯/E♭ octave 2 |
+|`QK_MIDI_NOTE_E_2` |`MI_E2` |E octave 2 |
+|`QK_MIDI_NOTE_F_2` |`MI_F2` |F octave 2 |
+|`QK_MIDI_NOTE_F_SHARP_2` |`MI_Fs2`, `MI_Gb2`|F♯/G♭ octave 2 |
+|`QK_MIDI_NOTE_G_2` |`MI_G2` |G octave 2 |
+|`QK_MIDI_NOTE_G_SHARP_2` |`MI_Gs2`, `MI_Ab2`|G♯/A♭ octave 2 |
+|`QK_MIDI_NOTE_A_2` |`MI_A2` |A octave 2 |
+|`QK_MIDI_NOTE_A_SHARP_2` |`MI_As2`, `MI_Bb2`|A♯/B♭ octave 2 |
+|`QK_MIDI_NOTE_B_2` |`MI_B2` |B octave 2 |
+|`QK_MIDI_NOTE_C_3` |`MI_C3` |C octave 3 |
+|`QK_MIDI_NOTE_C_SHARP_3` |`MI_Cs3`, `MI_Db3`|C♯/D♭ octave 3 |
+|`QK_MIDI_NOTE_D_3` |`MI_D3` |D octave 3 |
+|`QK_MIDI_NOTE_D_SHARP_3` |`MI_Ds3`, `MI_Eb3`|D♯/E♭ octave 3 |
+|`QK_MIDI_NOTE_E_3` |`MI_E3` |E octave 3 |
+|`QK_MIDI_NOTE_F_3` |`MI_F3` |F octave 3 |
+|`QK_MIDI_NOTE_F_SHARP_3` |`MI_Fs3`, `MI_Gb3`|F♯/G♭ octave 3 |
+|`QK_MIDI_NOTE_G_3` |`MI_G3` |G octave 3 |
+|`QK_MIDI_NOTE_G_SHARP_3` |`MI_Gs3`, `MI_Ab3`|G♯/A♭ octave 3 |
+|`QK_MIDI_NOTE_A_3` |`MI_A3` |A octave 3 |
+|`QK_MIDI_NOTE_A_SHARP_3` |`MI_As3`, `MI_Bb3`|A♯/B♭ octave 3 |
+|`QK_MIDI_NOTE_B_3` |`MI_B3` |B octave 3 |
+|`QK_MIDI_NOTE_C_4` |`MI_C4` |C octave 4 |
+|`QK_MIDI_NOTE_C_SHARP_4` |`MI_Cs4`, `MI_Db4`|C♯/D♭ octave 4 |
+|`QK_MIDI_NOTE_D_4` |`MI_D4` |D octave 4 |
+|`QK_MIDI_NOTE_D_SHARP_4` |`MI_Ds4`, `MI_Eb4`|D♯/E♭ octave 4 |
+|`QK_MIDI_NOTE_E_4` |`MI_E4` |E octave 4 |
+|`QK_MIDI_NOTE_F_4` |`MI_F4` |F octave 4 |
+|`QK_MIDI_NOTE_F_SHARP_4` |`MI_Fs4`, `MI_Gb4`|F♯/G♭ octave 4 |
+|`QK_MIDI_NOTE_G_4` |`MI_G4` |G octave 4 |
+|`QK_MIDI_NOTE_G_SHARP_4` |`MI_Gs4`, `MI_Ab4`|G♯/A♭ octave 4 |
+|`QK_MIDI_NOTE_A_4` |`MI_A4` |A octave 4 |
+|`QK_MIDI_NOTE_A_SHARP_4` |`MI_As4`, `MI_Bb4`|A♯/B♭ octave 4 |
+|`QK_MIDI_NOTE_B_4` |`MI_B4` |B octave 4 |
+|`QK_MIDI_NOTE_C_5` |`MI_C5` |C octave 5 |
+|`QK_MIDI_NOTE_C_SHARP_5` |`MI_Cs5`, `MI_Db5`|C♯/D♭ octave 5 |
+|`QK_MIDI_NOTE_D_5` |`MI_D5` |D octave 5 |
+|`QK_MIDI_NOTE_D_SHARP_5` |`MI_Ds5`, `MI_Eb5`|D♯/E♭ octave 5 |
+|`QK_MIDI_NOTE_E_5` |`MI_E5` |E octave 5 |
+|`QK_MIDI_NOTE_F_5` |`MI_F5` |F octave 5 |
+|`QK_MIDI_NOTE_F_SHARP_5` |`MI_Fs5`, `MI_Gb5`|F♯/G♭ octave 5 |
+|`QK_MIDI_NOTE_G_5` |`MI_G5` |G octave 5 |
+|`QK_MIDI_NOTE_G_SHARP_5` |`MI_Gs5`, `MI_Ab5`|G♯/A♭ octave 5 |
+|`QK_MIDI_NOTE_A_5` |`MI_A5` |A octave 5 |
+|`QK_MIDI_NOTE_A_SHARP_5` |`MI_As5`, `MI_Bb5`|A♯/B♭ octave 5 |
+|`QK_MIDI_NOTE_B_5` |`MI_B5` |B octave 5 |
+|`QK_MIDI_OCTAVE_N2` |`MI_OCN2` |Set octave to -2 |
+|`QK_MIDI_OCTAVE_N1` |`MI_OCN1` |Set octave to -1 |
+|`QK_MIDI_OCTAVE_0` |`MI_OC0` |Set octave to 0 |
+|`QK_MIDI_OCTAVE_1` |`MI_OC1` |Set octave to 1 |
+|`QK_MIDI_OCTAVE_2` |`MI_OC2` |Set octave to 2 |
+|`QK_MIDI_OCTAVE_3` |`MI_OC3` |Set octave to 3 |
+|`QK_MIDI_OCTAVE_4` |`MI_OC4` |Set octave to 4 |
+|`QK_MIDI_OCTAVE_5` |`MI_OC5` |Set octave to 5 |
+|`QK_MIDI_OCTAVE_6` |`MI_OC6` |Set octave to 6 |
+|`QK_MIDI_OCTAVE_7` |`MI_OC7` |Set octave to 7 |
+|`QK_MIDI_OCTAVE_DOWN` |`MI_OCTD` |Move down an octave |
+|`QK_MIDI_OCTAVE_UP` |`MI_OCTU` |Move up an octave |
+|`QK_MIDI_TRANSPOSE_N6` |`MI_TRN6` |Set transposition to -6 semitones|
+|`QK_MIDI_TRANSPOSE_N5` |`MI_TRN5` |Set transposition to -5 semitones|
+|`QK_MIDI_TRANSPOSE_N4` |`MI_TRN4` |Set transposition to -4 semitones|
+|`QK_MIDI_TRANSPOSE_N3` |`MI_TRN3` |Set transposition to -3 semitones|
+|`QK_MIDI_TRANSPOSE_N2` |`MI_TRN2` |Set transposition to -2 semitones|
+|`QK_MIDI_TRANSPOSE_N1` |`MI_TRN1` |Set transposition to -1 semitone |
+|`QK_MIDI_TRANSPOSE_0` |`MI_TR0` |No transposition |
+|`QK_MIDI_TRANSPOSE_1` |`MI_TR1` |Set transposition to +1 semitone |
+|`QK_MIDI_TRANSPOSE_2` |`MI_TR2` |Set transposition to +2 semitones|
+|`QK_MIDI_TRANSPOSE_3` |`MI_TR3` |Set transposition to +3 semitones|
+|`QK_MIDI_TRANSPOSE_4` |`MI_TR4` |Set transposition to +4 semitones|
+|`QK_MIDI_TRANSPOSE_5` |`MI_TR5` |Set transposition to +5 semitones|
+|`QK_MIDI_TRANSPOSE_6` |`MI_TR6` |Set transposition to +6 semitones|
+|`QK_MIDI_TRANSPOSE_DOWN` |`MI_TRSD` |Decrease transposition |
+|`QK_MIDI_TRANSPOSE_UP` |`MI_TRSU` |Increase transposition |
+|`QK_MIDI_VELOCITY_0` |`MI_VL0` |Set velocity to 0 |
+|`QK_MIDI_VELOCITY_1` |`MI_VL1` |Set velocity to 12 |
+|`QK_MIDI_VELOCITY_2` |`MI_VL2` |Set velocity to 25 |
+|`QK_MIDI_VELOCITY_3` |`MI_VL3` |Set velocity to 38 |
+|`QK_MIDI_VELOCITY_4` |`MI_VL4` |Set velocity to 51 |
+|`QK_MIDI_VELOCITY_5` |`MI_VL5` |Set velocity to 64 |
+|`QK_MIDI_VELOCITY_6` |`MI_VL6` |Set velocity to 76 |
+|`QK_MIDI_VELOCITY_7` |`MI_VL7` |Set velocity to 89 |
+|`QK_MIDI_VELOCITY_8` |`MI_VL8` |Set velocity to 102 |
+|`QK_MIDI_VELOCITY_9` |`MI_VL9` |Set velocity to 114 |
+|`QK_MIDI_VELOCITY_10` |`MI_VL10` |Set velocity to 127 |
+|`QK_MIDI_VELOCITY_DOWN` |`MI_VELD` |Decrease velocity |
+|`QK_MIDI_VELOCITY_UP` |`MI_VELU` |Increase velocity |
+|`QK_MIDI_CHANNEL_1` |`MI_CH1` |Set channel to 1 |
+|`QK_MIDI_CHANNEL_2` |`MI_CH2` |Set channel to 2 |
+|`QK_MIDI_CHANNEL_3` |`MI_CH3` |Set channel to 3 |
+|`QK_MIDI_CHANNEL_4` |`MI_CH4` |Set channel to 4 |
+|`QK_MIDI_CHANNEL_5` |`MI_CH5` |Set channel to 5 |
+|`QK_MIDI_CHANNEL_6` |`MI_CH6` |Set channel to 6 |
+|`QK_MIDI_CHANNEL_7` |`MI_CH7` |Set channel to 7 |
+|`QK_MIDI_CHANNEL_8` |`MI_CH8` |Set channel to 8 |
+|`QK_MIDI_CHANNEL_9` |`MI_CH9` |Set channel to 9 |
+|`QK_MIDI_CHANNEL_10` |`MI_CH10` |Set channel to 10 |
+|`QK_MIDI_CHANNEL_11` |`MI_CH11` |Set channel to 11 |
+|`QK_MIDI_CHANNEL_12` |`MI_CH12` |Set channel to 12 |
+|`QK_MIDI_CHANNEL_13` |`MI_CH13` |Set channel to 13 |
+|`QK_MIDI_CHANNEL_14` |`MI_CH14` |Set channel to 14 |
+|`QK_MIDI_CHANNEL_15` |`MI_CH15` |Set channel to 15 |
+|`QK_MIDI_CHANNEL_16` |`MI_CH16` |Set channel to 16 |
+|`QK_MIDI_CHANNEL_DOWN` |`MI_CHND` |Decrease channel |
+|`QK_MIDI_CHANNEL_UP` |`MI_CHNU` |Increase channel |
+|`QK_MIDI_ALL_NOTES_OFF` |`MI_AOFF` |Stop all notes |
+|`QK_MIDI_SUSTAIN` |`MI_SUST` |Sustain |
+|`QK_MIDI_PORTAMENTO` |`MI_PORT` |Portmento |
+|`QK_MIDI_SOSTENUTO` |`MI_SOST` |Sostenuto |
+|`QK_MIDI_SOFT` |`MI_SOFT` |Soft Pedal |
+|`QK_MIDI_LEGATO` |`MI_LEG` |Legato |
+|`QK_MIDI_MODULATION` |`MI_MOD` |Modulation |
+|`QK_MIDI_MODULATION_SPEED_DOWN`|`MI_MODD` |Decrease modulation speed |
+|`QK_MIDI_MODULATION_SPEED_UP` |`MI_MODU` |Increase modulation speed |
+|`QK_MIDI_PITCH_BEND_DOWN` |`MI_BNDD` |Bend pitch down |
+|`QK_MIDI_PITCH_BEND_UP` |`MI_BNDU` |Bend pitch up |
## Mouse Keys :id=mouse-keys
@@ -553,7 +625,7 @@ See also: [Modifier Keys](feature_advanced_keycodes.md#modifier-keys)
|`RCTL(kc)`| |Hold Right Control and press `kc` |
|`RSFT(kc)`| |Hold Right Shift and press `kc` |
|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt (AltGr) and press `kc` |
-|`RGUI(kc)`|`RCMD(kc)`, `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 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` |
@@ -601,11 +673,11 @@ See also: [Mod-Tap](mod_tap.md)
See also: [Dynamic Tapping Term](tap_hold#dynamic-tapping-term)
-| Key | Description |
-|-------------|------------------------------------------------------------------------------------------------------------------------|
-| `DT_PRNT` | "Dynamic Tapping Term Print": Types the current tapping term, in milliseconds |
-| `DT_UP` | "Dynamic Tapping Term Up": Increases the current tapping term by `DYNAMIC_TAPPING_TERM_INCREMENT`ms (5ms by default) |
-| `DT_DOWN` | "Dynamic Tapping Term Down": Decreases the current tapping term by `DYNAMIC_TAPPING_TERM_INCREMENT`ms (5ms by default) |
+| Key | Aliases | Description |
+|-------------------------------|---------|-------------------------------------------------------------------------------------------|
+|`QK_DYNAMIC_TAPPING_TERM_PRINT`|`DT_PRNT`| Types the current tapping term, in milliseconds |
+|`QK_DYNAMIC_TAPPING_TERM_UP` |`DT_UP` | Increases the current tapping term by `DYNAMIC_TAPPING_TERM_INCREMENT`ms (5ms by default) |
+|`QK_DYNAMIC_TAPPING_TERM_DOWN` |`DT_DOWN`| Decreases the current tapping term by `DYNAMIC_TAPPING_TERM_INCREMENT`ms (5ms by default) |
## RGB Lighting :id=rgb-lighting
@@ -650,15 +722,6 @@ See also: [RGB Matrix Lighting](feature_rgb_matrix.md)
|`RGB_SPI` | |Increase effect speed (does not support eeprom yet), decrease speed when Shift is held|
|`RGB_SPD` | |Decrease effect speed (does not support eeprom yet), increase speed when Shift is held|
-## Thermal Printer :id=thermal-printer
-
-See also: [Thermal Printer](feature_thermal_printer.md)
-
-|Key |Description |
-|-----------|----------------------------------------|
-|`PRINT_ON` |Start printing everything the user types|
-|`PRINT_OFF`|Stop printing everything the user types |
-
## US ANSI Shifted Symbols :id=us-ansi-shifted-symbols
See also: [US ANSI Shifted Symbols](keycodes_us_ansi_shifted.md)
@@ -691,67 +754,66 @@ See also: [US ANSI Shifted Symbols](keycodes_us_ansi_shifted.md)
See also: [One Shot Keys](one_shot_keys.md)
-|Key |Description |
-|------------|----------------------------------|
-|`OSM(mod)` |Hold `mod` for one keypress |
-|`OSL(layer)`|Switch to `layer` for one keypress|
-|`OS_ON` |Turns One Shot keys on |
-|`OS_OFF` |Turns One Shot keys off |
-|`OS_TOGG` |Toggles One Shot keys status |
+|Key |Aliases |Description |
+|--------------------|---------|----------------------------------|
+|`OSM(mod)` | |Hold `mod` for one keypress |
+|`OSL(layer)` | |Switch to `layer` for one keypress|
+|`QK_ONE_SHOT_TOGGLE`|`OS_TOGG`|Toggles One Shot keys status |
+|`QK_ONE_SHOT_ON` |`OS_ON` |Turns One Shot keys on |
+|`QK_ONE_SHOT_OFF` |`OS_OFF` |Turns One Shot keys off |
## Programmable Button Support :id=programmable-button
See also: [Programmable Button](feature_programmable_button.md)
-|Key |Description |
-|------------------------|----------------------|
-|`PROGRAMMABLE_BUTTON_1` |Programmable button 1 |
-|`PROGRAMMABLE_BUTTON_2` |Programmable button 2 |
-|`PROGRAMMABLE_BUTTON_3` |Programmable button 3 |
-|`PROGRAMMABLE_BUTTON_4` |Programmable button 4 |
-|`PROGRAMMABLE_BUTTON_5` |Programmable button 5 |
-|`PROGRAMMABLE_BUTTON_6` |Programmable button 6 |
-|`PROGRAMMABLE_BUTTON_7` |Programmable button 7 |
-|`PROGRAMMABLE_BUTTON_8` |Programmable button 8 |
-|`PROGRAMMABLE_BUTTON_9` |Programmable button 9 |
-|`PROGRAMMABLE_BUTTON_10`|Programmable button 10|
-|`PROGRAMMABLE_BUTTON_11`|Programmable button 11|
-|`PROGRAMMABLE_BUTTON_12`|Programmable button 12|
-|`PROGRAMMABLE_BUTTON_13`|Programmable button 13|
-|`PROGRAMMABLE_BUTTON_14`|Programmable button 14|
-|`PROGRAMMABLE_BUTTON_15`|Programmable button 15|
-|`PROGRAMMABLE_BUTTON_16`|Programmable button 16|
-|`PROGRAMMABLE_BUTTON_17`|Programmable button 17|
-|`PROGRAMMABLE_BUTTON_18`|Programmable button 18|
-|`PROGRAMMABLE_BUTTON_19`|Programmable button 19|
-|`PROGRAMMABLE_BUTTON_20`|Programmable button 20|
-|`PROGRAMMABLE_BUTTON_21`|Programmable button 21|
-|`PROGRAMMABLE_BUTTON_22`|Programmable button 22|
-|`PROGRAMMABLE_BUTTON_23`|Programmable button 23|
-|`PROGRAMMABLE_BUTTON_24`|Programmable button 24|
-|`PROGRAMMABLE_BUTTON_25`|Programmable button 25|
-|`PROGRAMMABLE_BUTTON_26`|Programmable button 26|
-|`PROGRAMMABLE_BUTTON_27`|Programmable button 27|
-|`PROGRAMMABLE_BUTTON_28`|Programmable button 28|
-|`PROGRAMMABLE_BUTTON_29`|Programmable button 29|
-|`PROGRAMMABLE_BUTTON_30`|Programmable button 30|
-|`PROGRAMMABLE_BUTTON_31`|Programmable button 31|
-|`PROGRAMMABLE_BUTTON_32`|Programmable button 32|
-|`PB_1` to `PB_32` |Aliases for keymaps |
+|Key |Aliases|Description |
+|---------------------------|-------|----------------------|
+|`QK_PROGRAMMABLE_BUTTON_1` |`PB_1` |Programmable button 1 |
+|`QK_PROGRAMMABLE_BUTTON_2` |`PB_2` |Programmable button 2 |
+|`QK_PROGRAMMABLE_BUTTON_3` |`PB_3` |Programmable button 3 |
+|`QK_PROGRAMMABLE_BUTTON_4` |`PB_4` |Programmable button 4 |
+|`QK_PROGRAMMABLE_BUTTON_5` |`PB_5` |Programmable button 5 |
+|`QK_PROGRAMMABLE_BUTTON_6` |`PB_6` |Programmable button 6 |
+|`QK_PROGRAMMABLE_BUTTON_7` |`PB_7` |Programmable button 7 |
+|`QK_PROGRAMMABLE_BUTTON_8` |`PB_8` |Programmable button 8 |
+|`QK_PROGRAMMABLE_BUTTON_9` |`PB_9` |Programmable button 9 |
+|`QK_PROGRAMMABLE_BUTTON_10`|`PB_10`|Programmable button 10|
+|`QK_PROGRAMMABLE_BUTTON_11`|`PB_11`|Programmable button 11|
+|`QK_PROGRAMMABLE_BUTTON_12`|`PB_12`|Programmable button 12|
+|`QK_PROGRAMMABLE_BUTTON_13`|`PB_13`|Programmable button 13|
+|`QK_PROGRAMMABLE_BUTTON_14`|`PB_14`|Programmable button 14|
+|`QK_PROGRAMMABLE_BUTTON_15`|`PB_15`|Programmable button 15|
+|`QK_PROGRAMMABLE_BUTTON_16`|`PB_16`|Programmable button 16|
+|`QK_PROGRAMMABLE_BUTTON_17`|`PB_17`|Programmable button 17|
+|`QK_PROGRAMMABLE_BUTTON_18`|`PB_18`|Programmable button 18|
+|`QK_PROGRAMMABLE_BUTTON_19`|`PB_19`|Programmable button 19|
+|`QK_PROGRAMMABLE_BUTTON_20`|`PB_20`|Programmable button 20|
+|`QK_PROGRAMMABLE_BUTTON_21`|`PB_21`|Programmable button 21|
+|`QK_PROGRAMMABLE_BUTTON_22`|`PB_22`|Programmable button 22|
+|`QK_PROGRAMMABLE_BUTTON_23`|`PB_23`|Programmable button 23|
+|`QK_PROGRAMMABLE_BUTTON_24`|`PB_24`|Programmable button 24|
+|`QK_PROGRAMMABLE_BUTTON_25`|`PB_25`|Programmable button 25|
+|`QK_PROGRAMMABLE_BUTTON_26`|`PB_26`|Programmable button 26|
+|`QK_PROGRAMMABLE_BUTTON_27`|`PB_27`|Programmable button 27|
+|`QK_PROGRAMMABLE_BUTTON_28`|`PB_28`|Programmable button 28|
+|`QK_PROGRAMMABLE_BUTTON_29`|`PB_29`|Programmable button 29|
+|`QK_PROGRAMMABLE_BUTTON_30`|`PB_30`|Programmable button 30|
+|`QK_PROGRAMMABLE_BUTTON_31`|`PB_31`|Programmable button 31|
+|`QK_PROGRAMMABLE_BUTTON_32`|`PB_32`|Programmable button 32|
## Space Cadet :id=space-cadet
See also: [Space Cadet](feature_space_cadet.md)
-|Key |Description |
-|-----------|----------------------------------------|
-|`KC_LCPO` |Left Control when held, `(` when tapped |
-|`KC_RCPC` |Right Control when held, `)` when tapped|
-|`KC_LSPO` |Left Shift when held, `(` when tapped |
-|`KC_RSPC` |Right Shift when held, `)` when tapped |
-|`KC_LAPO` |Left Alt when held, `(` when tapped |
-|`KC_RAPC` |Right Alt when held, `)` when tapped |
-|`KC_SFTENT`|Right Shift when held, Enter when tapped|
+|Key |Aliases |Description |
+|----------------------------------------------|---------|----------------------------------------|
+|`QK_SPACE_CADET_LEFT_CTRL_PARENTHESIS_OPEN` |`SC_LCPO`|Left Control when held, `(` when tapped |
+|`QK_SPACE_CADET_RIGHT_CTRL_PARENTHESIS_CLOSE` |`SC_RCPC`|Right Control when held, `)` when tapped|
+|`QK_SPACE_CADET_LEFT_SHIFT_PARENTHESIS_OPEN` |`SC_LSPO`|Left Shift when held, `(` when tapped |
+|`QK_SPACE_CADET_RIGHT_SHIFT_PARENTHESIS_CLOSE`|`SC_RSPC`|Right Shift when held, `)` when tapped |
+|`QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN` |`SC_LAPO`|Left Alt when held, `(` when tapped |
+|`QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE` |`SC_RAPC`|Right Alt when held, `)` when tapped |
+|`QK_SPACE_CADET_RIGHT_SHIFT_ENTER` |`SC_SENT`|Right Shift when held, Enter when tapped|
## Swap Hands :id=swap-hands
@@ -760,8 +822,8 @@ See also: [Swap Hands](feature_swap_hands.md)
|Key |Description |
|-----------|-------------------------------------------------------------------------|
|`SH_T(key)`|Sends `key` with a tap; momentary swap when held. |
-|`SW_ON` |Turns on swapping and leaves it on. |
-|`SW_OFF` |Turn off swapping and leaves it off. Good for returning to a known state.|
+|`SH_ON` |Turns on swapping and leaves it on. |
+|`SH_OFF` |Turn off swapping and leaves it off. Good for returning to a known state.|
|`SH_MON` |Swaps hands when pressed, returns to normal when released (momentary). |
|`SH_MOFF` |Momentarily turns off swap. |
|`SH_TG` |Toggles swap on and off with every key press. |
@@ -772,15 +834,16 @@ See also: [Swap Hands](feature_swap_hands.md)
See also: [Unicode Support](feature_unicode.md)
-|Key |Aliases |Description |
-|----------------------|---------|----------------------------------------------------------------|
-|`UC(c)` | |Send Unicode code point `c`, up to `0x7FFF` |
-|`X(i)` | |Send Unicode code point at index `i` in `unicode_map` |
-|`XP(i, j)` | |Send Unicode code point at index `i`, or `j` if Shift/Caps is on|
-|`UNICODE_MODE_FORWARD`|`UC_MOD` |Cycle through selected input modes |
-|`UNICODE_MODE_REVERSE`|`UC_RMOD`|Cycle through selected input modes in reverse |
-|`UNICODE_MODE_MAC` |`UC_M_MA`|Switch to macOS input |
-|`UNICODE_MODE_LNX` |`UC_M_LN`|Switch to Linux input |
-|`UNICODE_MODE_WIN` |`UC_M_WI`|Switch to Windows input |
-|`UNICODE_MODE_BSD` |`UC_M_BS`|Switch to BSD input (not implemented) |
-|`UNICODE_MODE_WINC` |`UC_M_WC`|Switch to Windows input using WinCompose |
+|Key |Aliases |Description |
+|----------------------------|---------|----------------------------------------------------------------|
+|`UC(c)` | |Send Unicode code point `c`, up to `0x7FFF` |
+|`X(i)` | |Send Unicode code point at index `i` in `unicode_map` |
+|`XP(i, j)` | |Send Unicode code point at index `i`, or `j` if Shift/Caps is on|
+|`QK_UNICODE_MODE_NEXT` |`UC_NEXT`|Cycle through selected input modes |
+|`QK_UNICODE_MODE_PREVIOUS` |`UC_PREV`|Cycle through selected input modes in reverse |
+|`QK_UNICODE_MODE_MACOS` |`UC_MAC` |Switch to macOS input |
+|`QK_UNICODE_MODE_LINUX` |`UC_LINX`|Switch to Linux input |
+|`QK_UNICODE_MODE_WINDOWS` |`UC_WIN` |Switch to Windows input |
+|`QK_UNICODE_MODE_BSD` |`UC_BSD` |Switch to BSD input (not implemented) |
+|`QK_UNICODE_MODE_WINCOMPOSE`|`UC_WINC`|Switch to Windows input using WinCompose |
+|`QK_UNICODE_MODE_EMACS` |`UC_EMAC`|Switch to emacs (`C-x-8 RET`) |
diff --git a/docs/keycodes_basic.md b/docs/keycodes_basic.md
index 6f6ef7a3fd..d2a49100d1 100644
--- a/docs/keycodes_basic.md
+++ b/docs/keycodes_basic.md
@@ -221,6 +221,8 @@ These keycodes are not part of the Keyboard/Keypad usage page. The `SYSTEM_` key
|`KC_MEDIA_REWIND` |`KC_MRWD`|Previous Track |
|`KC_BRIGHTNESS_UP` |`KC_BRIU`|Brightness Up |
|`KC_BRIGHTNESS_DOWN` |`KC_BRID`|Brightness Down |
+|`KC_CONTROL_PANEL` |`KC_CPNL`|Open Control Panel |
+|`KC_ASSISTANT` |`KC_ASST`|Launch Assistant |
## Number Pad
diff --git a/docs/keycodes_magic.md b/docs/keycodes_magic.md
index 01eb69168e..982a301630 100644
--- a/docs/keycodes_magic.md
+++ b/docs/keycodes_magic.md
@@ -7,6 +7,9 @@
|`MAGIC_SWAP_CONTROL_CAPSLOCK` |`CL_SWAP`|Swap Caps Lock and Left Control |
|`MAGIC_UNSWAP_CONTROL_CAPSLOCK` |`CL_NORM`|Unswap Caps Lock and Left Control |
|`MAGIC_TOGGLE_CONTROL_CAPSLOCK` |`CL_TOGG`|Toggle Caps Lock and Left Control swap |
+|`MAGIC_SWAP_ESCAPE_CAPSLOCK` |`EC_SWAP`|Swap Caps Lock and Escape |
+|`MAGIC_UNSWAP_ESCAPE_CAPSLOCK` |`EC_NORM`|Unswap Caps Lock and Escape |
+|`MAGIC_TOGGLE_ESCAPE_CAPSLOCK` |`EC_TOGG`|Toggle Caps Lock and Escape swap |
|`MAGIC_CAPSLOCK_TO_CONTROL` |`CL_CTRL`|Treat Caps Lock as Control |
|`MAGIC_UNCAPSLOCK_TO_CONTROL` |`CL_CAPS`|Stop treating Caps Lock as Control |
|`MAGIC_SWAP_LCTL_LGUI` |`LCG_SWP`|Swap Left Control and GUI |
diff --git a/docs/keymap.md b/docs/keymap.md
index ab8a255bc3..ea702ff0f2 100644
--- a/docs/keymap.md
+++ b/docs/keymap.md
@@ -92,11 +92,10 @@ These keycodes allow the processing to fall through to lower layers in search of
For this example we will walk through an [older version of the default Clueboard 66% keymap](https://github.com/qmk/qmk_firmware/blob/ca01d94005f67ec4fa9528353481faa622d949ae/keyboards/clueboard/keymaps/default/keymap.c). You'll find it helpful to open that file in another browser window so you can look at everything in context.
-There are 3 main sections of a `keymap.c` file you'll want to concern yourself with:
+There are 2 main sections of a `keymap.c` file you'll want to concern yourself with:
* [The Definitions](#definitions)
* [The Layer/Keymap Datastructure](#layers-and-keymaps)
-* [Custom Functions](#custom-functions), if any
### Definitions
@@ -148,8 +147,8 @@ Here is an example of the Clueboard's base layer:
F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \
- KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \
- KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT),
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_INT1, KC_RSFT, KC_UP, \
+ KC_LCTL, KC_LGUI, KC_LALT, KC_INT5, KC_SPC,KC_SPC, KC_INT4, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT),
Some interesting things to note about this:
diff --git a/docs/newbs_building_firmware.md b/docs/newbs_building_firmware.md
index c4ce9fd9f3..6163c6b02e 100644
--- a/docs/newbs_building_firmware.md
+++ b/docs/newbs_building_firmware.md
@@ -40,7 +40,7 @@ Open your `keymap.c` file in your text editor. Inside this file you'll find the
This line indicates where the list of Layers begins. Below that you'll find lines containing `LAYOUT`, and these lines indicate the start of a layer. Below that line is the list of keys that comprise a particular layer.
-!> When editing your keymap file be careful not to add or remove any commas. If you do you will prevent your firmware from compiling and it may not be easy to figure out where the extra, or missing, comma is.
+!> When editing your keymap file be careful not to add or remove any commas. If you do, you will prevent your firmware from compiling and it may not be easy to figure out where the extra, or missing, comma is.
## Customize The Layout To Your Liking
diff --git a/docs/one_shot_keys.md b/docs/one_shot_keys.md
index 49910a49e2..515830ea32 100644
--- a/docs/one_shot_keys.md
+++ b/docs/one_shot_keys.md
@@ -27,7 +27,7 @@ For one shot layers, you need to call `set_oneshot_layer(LAYER, ONESHOT_START)`
For one shot mods, you need to call `set_oneshot_mods(MOD_BIT(KC_*))` to set it, or `clear_oneshot_mods()` to cancel it.
-!> If you're having issues with OSM translating over Remote Desktop Connection, this can be fixed by opening the settings, going to the "Local Resources" tap, and in the keyboard section, change the drop down to "On this Computer". This will fix the issue and allow OSM to function properly over Remote Desktop.
+!> If you're having issues with OSM translating over Remote Desktop Connection, this can be fixed by opening the settings, going to the "Local Resources" tab, and in the keyboard section, change the drop down to "On this Computer". This will fix the issue and allow OSM to function properly over Remote Desktop.
## Callbacks
diff --git a/docs/platformdev_blackpill_f411.md b/docs/platformdev_blackpill_f411.md
deleted file mode 100644
index 9026768a01..0000000000
--- a/docs/platformdev_blackpill_f411.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# WeAct Blackpill (STM32F411)
-
-The WeAct Blackpill is a popular choice for handwired boards, as it offers a powerful micro controller, USB Type C, a good number of pins to use, and a large amount of firmware space. All for a ~$6 USD price tag.
-
-* [WeAct GitHub for F411 Blackpill](https://github.com/WeActTC/MiniSTM32F4x1)
- * Unfortunately, due to supply issues official WeAct F411 based blackpills may not be available.
-
-![Blackpill F411](https://i.imgur.com/nCgeolTh.png)
-
-
-## Pin Usage Limitations
-
-While the Blackpill is a great choice to use in your keyboard, there are a number of caveats in regards to using them. The first is that a number of exposed pins cannot be used, or have special considerations/hardware tweaks that are required for proper opertion.
-
-### Unusable pins
-* Pins `A11` and `A12` are not useable because they're used for USB connection, and cannot be shared.
- * In theory, these pins can be used. However, doing so may disable USB connectivity, outright, if used for anything other than a USB port
-* Pin `B2` is used by `BOOT1` and cannot be used, without causing problems.
-* `VBAT` is not a usable pin.
-* `NRST` is not a usable pin.
-
-### Pins to be avoided
-* Pin `A9` is meant for VBUS Sense and should not be used, if it can be avoided. It has an internal pull-down resesitor, which may cause issues with usage. However, a pull-up resistor can work (~5.1k), but should be avoided.
-* Pin `A10` can be used, but should be avoided. Any connection on this pin can prevent the bootloader from entering the proper mode for DFU flashing. A pull-up resistor (~22k) on this pin fixes the bootloader issue.
-
-### Shared Usage
-* Pin `A0` is shared with the User Key (button) on the controller. It can be used.
-* Pin `C13` is shared with the onboard LED indicator, and is connected to +3.3V. This can be used, but may cause the LED to blink intermittently, depending on activity on the pin.
- *
-* Pins `A4`, `A5`, `A6` and `A7` are used by the SOI8 footprint on the back of the controller, that can be used for either an SPI Flash chip, or an SPI EEPROM chip. `A4` is the Chip Select pin, and cannot be shared. However, `A5`, `A6`, and `A7` are the `SCK`, `MISO`, and `MOSI` pins, respectively, and can be shared with other SPI devices.
-
-### Limited Usage
-* Pins `C13`, `C14`, and `C15` have limits on output current. They should be used only as input. Eg, they should not be used for row pins in COL2ROW matrix configurations, but can be used as column pins.
- * This is because the column pins (in COL2ROW) are pulled up (the pullup strength is independant of the current sourcing limitation) and the ROW is driven low and sinks current, then we check the state of the COLs to look for keypresses.
-
-* Pins `A0` and `B5` are not 5V tolerant, and should only be used with 3.3V compatible functionality.
-
-## Additional Information
-
-### Bootloader issuse
-
-Due to the use of a 25MHz crystal, the controller may have issues entering the bootloader. Heating up the controller can help with this issue.
-
-Also, if pin `A10` is connected to anything at all, it needs to have a pullup resistor (see [Pins to be avoided](#pins-to-be-avoided), above)
-
-### Tiny UF2 Support
-
-There is [tinyuf2 support for the WeAct Blackpill](https://github.com/adafruit/tinyuf2/tree/master/ports/stm32f4/boards/stm32f411ce_blackpill). Instructions on how to compile the bootloadr can be found [here](https://github.com/adafruit/tinyuf2#build-and-flash). Setting `BOOTLOADER = tinyuf2` will enable support for this user bootloader, and the correct configuration to prevent it from being overwritten when flashing firmware.
diff --git a/docs/platformdev_blackpill_f4x1.md b/docs/platformdev_blackpill_f4x1.md
new file mode 100644
index 0000000000..d5537a4535
--- /dev/null
+++ b/docs/platformdev_blackpill_f4x1.md
@@ -0,0 +1,50 @@
+# WeAct Blackpill (STM32F4x1)
+
+This document applies to the F401- and F411-based Blackpills.
+
+The WeAct Blackpill is a popular choice for handwired boards, as it offers a powerful micro controller, USB Type C, a good number of pins to use, and a large amount of firmware space. All for a ~$6 USD price tag.
+
+* [WeAct GitHub for F4x1 Blackpill](https://github.com/WeActTC/MiniSTM32F4x1)
+ * Unfortunately, due to supply issues official WeAct F411 based blackpills may not be available.
+
+![Blackpill F411](https://i.imgur.com/nCgeolTh.png)
+
+
+## Pin Usage Limitations
+
+While the Blackpill is a great choice to use in your keyboard, there are a number of caveats in regards to using them. The first is that a number of exposed pins cannot be used, or have special considerations/hardware tweaks that are required for proper opertion.
+
+### Unusable pins
+* Pins `A11` and `A12` are not useable because they're used for USB connection, and cannot be shared.
+ * In theory, these pins can be used. However, doing so may disable USB connectivity, outright, if used for anything other than a USB port
+* Pin `B2` is used by `BOOT1` and cannot be used, without causing problems.
+* `VBAT` is not a usable pin.
+* `NRST` is not a usable pin.
+
+### Pins to be avoided
+* Pin `A9` is meant for VBUS Sense and should not be used, if it can be avoided. It has an internal pull-down resesitor, which may cause issues with usage. However, a pull-up resistor can work (~5.1k), but should be avoided.
+* Pin `A10` can be used, but should be avoided. Any connection on this pin can prevent the bootloader from entering the proper mode for DFU flashing. A pull-up resistor (~22k) on this pin fixes the bootloader issue.
+
+### Shared Usage
+* Pin `A0` is shared with the User Key (button) on the controller. It can be used.
+* Pin `C13` is shared with the onboard LED indicator, and is connected to +3.3V. This can be used, but may cause the LED to blink intermittently, depending on activity on the pin.
+ *
+* Pins `A4`, `A5`, `A6` and `A7` are used by the SOI8 footprint on the back of the controller, that can be used for either an SPI Flash chip, or an SPI EEPROM chip. `A4` is the Chip Select pin, and cannot be shared. However, `A5`, `A6`, and `A7` are the `SCK`, `MISO`, and `MOSI` pins, respectively, and can be shared with other SPI devices.
+
+### Limited Usage
+* Pins `C13`, `C14`, and `C15` have limits on output current. They should be used only as input. Eg, they should not be used for row pins in COL2ROW matrix configurations, but can be used as column pins.
+ * This is because the column pins (in COL2ROW) are pulled up (the pullup strength is independant of the current sourcing limitation) and the ROW is driven low and sinks current, then we check the state of the COLs to look for keypresses.
+
+* Pins `A0` and `B5` are not 5V tolerant, and should only be used with 3.3V compatible functionality.
+
+## Additional Information
+
+### Bootloader issuse
+
+Due to the use of a 25MHz crystal, the controller may have issues entering the bootloader. Heating up the controller can help with this issue.
+
+Also, if pin `A10` is connected to anything at all, it needs to have a pullup resistor (see [Pins to be avoided](#pins-to-be-avoided), above)
+
+### Tiny UF2 Support
+
+There is [tinyuf2 support for the WeAct Blackpill](https://github.com/adafruit/tinyuf2/tree/master/ports/stm32f4/boards/stm32f411ce_blackpill). Instructions on how to compile the bootloadr can be found [here](https://github.com/adafruit/tinyuf2#build-and-flash). Setting `BOOTLOADER = tinyuf2` will enable support for this user bootloader, and the correct configuration to prevent it from being overwritten when flashing firmware.
diff --git a/docs/platformdev_chibios_earlyinit.md b/docs/platformdev_chibios_earlyinit.md
index aaa91ba438..bc49247222 100644
--- a/docs/platformdev_chibios_earlyinit.md
+++ b/docs/platformdev_chibios_earlyinit.md
@@ -12,7 +12,7 @@ The function `early_hardware_init_pre` is the earliest possible code that can be
This is executed before RAM gets cleared, and before clocks or GPIOs are configured; for example, ChibiOS delays are not likely to work at this point. After executing this function, RAM on the MCU may be zero'ed. Assigning values to variables during execution of this function may be overwritten.
-As such, if you wish to override this API consider limiting use to writing to low-level registers. The default implementation of this function can be configured to jump to bootloader if a `RESET` key was pressed:
+As such, if you wish to override this API consider limiting use to writing to low-level registers. The default implementation of this function can be configured to jump to bootloader if a `QK_BOOT` key was pressed:
| `config.h` override | Description | Default |
|-----------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|
@@ -20,7 +20,7 @@ As such, if you wish to override this API consider limiting use to writing to lo
| `#define STM32_BOOTLOADER_DUAL_BANK` | Relevant for dual-bank STM32 MCUs, signifies that a GPIO is to be toggled in order to enter bootloader mode. | `FALSE` |
| `#define STM32_BOOTLOADER_DUAL_BANK_GPIO` | Relevant for dual-bank STM32 MCUs, the pin to toggle when attempting to enter bootloader mode, e.g. `B8` | `` |
| `#define STM32_BOOTLOADER_DUAL_BANK_POLARITY` | Relevant for dual-bank STM32 MCUs, the value to set the pin to in order to trigger charging of the RC circuit. e.g. `0` or `1`. | `0` |
-| `#define STM32_BOOTLOADER_DUAL_BANK_DELAY` | Relevant for dual-bank STM32 MCUs, an arbitrary measurement of time to delay before resetting the MCU. Increasing number increases the delay. | `100000` |
+| `#define STM32_BOOTLOADER_DUAL_BANK_DELAY` | Relevant for dual-bank STM32 MCUs, an arbitrary measurement of time to delay before resetting the MCU. Increasing number increases the delay. | `100` |
Kinetis MCUs have no configurable options.
diff --git a/docs/platformdev_proton_c.md b/docs/platformdev_proton_c.md
new file mode 100644
index 0000000000..3afec893fa
--- /dev/null
+++ b/docs/platformdev_proton_c.md
@@ -0,0 +1,77 @@
+# Proton C
+
+The Proton C is an Arm STM32F303xC based drop-in replacement for the Pro Micro.
+
+
+
+#### Features
+
+* Through-hole mounted USB-C Port
+* 32-bit 72MHz Cortex-M4 processor (STM32F303CCT6)
+* I2C, SPI, PWM, DMA, DAC, USART, I2S
+* 23x 3.3V I/O Ports
+* 1x 5V output for WS2812 LED chains
+* 256kB flash
+* 40kB RAM
+* AST1109MLTRQ speaker footprint
+* Reset button
+
+## Warnings
+
+Some of the PCBs compatible with Pro Micro have VCC (3.3V) and RAW (5V) pins connected (shorted) on the pcb. Using the Proton C will short 5V power from USB and regulated 3.3V which is connected directly to the MCU. Shorting those pins may damage the MCU on the Proton C.
+
+So far, it appears that this is only an issue on the Gherkin PCBs, but other PCBs may be affected in this way.
+
+In this case, you may want to not hook up the RAW pin at all.
+
+## Manual Conversion
+
+To use the Proton C natively, without having to specify `CONVERT_TO=proton_c`, you need to change the `MCU` line in `rules.mk`:
+
+```
+MCU = STM32F303
+BOARD = QMK_PROTON_C
+```
+
+Remove these variables if they exist:
+
+* `BOOTLOADER`
+* `EXTRA_FLAGS`
+
+Finally convert all pin assignments in `config.h` to the stm32 equivalents.
+
+| Pro Micro Left | Proton C Left | | Proton C Right | Pro Micro Right |
+|-----------|----------|-|----------|-----------|
+| `D3` | `A9` | | 5v | RAW (5v) |
+| `D2` | `A10` | | GND | GND |
+| GND | GND | | FLASH | RESET |
+| GND | GND | | 3.3v | VCC 1 |
+| `D1` | `B7` | | `A2` | `F4` |
+| `D0` | `B6` | | `A1` | `F5` |
+| `D4` | `B5` | | `A0` | `F6` |
+| `C6` | `B4` | | `B8` | `F7` |
+| `D7` | `B3` | | `B13` | `B1` |
+| `E6` | `B2` | | `B14` | `B3` |
+| `B4` | `B1` | | `B15` | `B2` |
+| `B5` | `B0` | | `B9` | `B6` |
+| `B0` (RX LED) | `C13` 2 | | `C13` 2 | `D5` (TX LED) |
+
+You can also make use of several new pins on the extended portion of the Proton C:
+
+| Left | | Right |
+|------|-|-------|
+| `A4`3 | | `B10` |
+| `A5`4 | | `B11` |
+| `A6` | | `B12` |
+| `A7` | | `A14`5 (SWCLK) |
+| `A8` | | `A13`5 (SWDIO) |
+| `A15` | | RESET6 |
+
+Notes:
+
+1. On a Pro Micro VCC can be 3.3v or 5v.
+2. A Proton C only has one onboard LED, not two like a Pro Micro. The Pro Micro has an RX LED on `D5` and a TX LED on `B0`.
+3. `A4` is shared with the speaker.
+4. `A5` is shared with the speaker.
+5. `A13` and `A14` are used for hardware debugging (SWD). You can also use them for GPIO, but should use them last.
+6. Short RESET to 3.3v (pull high) to reboot the MCU. This does not enter bootloader mode like a Pro Micro, it only resets the MCU.
diff --git a/docs/platformdev_rp2040.md b/docs/platformdev_rp2040.md
new file mode 100644
index 0000000000..3a6f1a1683
--- /dev/null
+++ b/docs/platformdev_rp2040.md
@@ -0,0 +1,126 @@
+# Raspberry Pi RP2040
+
+The following table shows the current driver status for peripherals on RP2040 MCUs:
+
+| System | Support |
+| ---------------------------------------------------------------- | ---------------------------------------------- |
+| [ADC driver](adc_driver.md) | Support planned (no ETA) |
+| [Audio](audio_driver.md#pwm-hardware) | :heavy_check_mark: |
+| [Backlight](feature_backlight.md) | :heavy_check_mark: |
+| [I2C driver](i2c_driver.md) | :heavy_check_mark: |
+| [SPI driver](spi_driver.md) | :heavy_check_mark: |
+| [WS2812 driver](ws2812_driver.md) | :heavy_check_mark: using `PIO` driver |
+| [External EEPROMs](eeprom_driver.md) | :heavy_check_mark: using `I2C` or `SPI` driver |
+| [EEPROM emulation](eeprom_driver.md#wear_leveling-configuration) | :heavy_check_mark: |
+| [serial driver](serial_driver.md) | :heavy_check_mark: using `SIO` or `PIO` driver |
+| [UART driver](uart_driver.md) | Support planned (no ETA) |
+
+## GPIO
+
+
+
+
+!> The GPIO pins of the RP2040 are not 5V tolerant!
+
+### Pin nomenclature
+
+To address individual pins on the RP2040, QMK uses the `GPx` abbreviation -- where the `x` stands for the GPIO number of the pin. This number can likely be found on the official pinout diagram of your board. Note that these GPIO numbers match the RP2040 MCU datasheet, and don't necessarily match the number you see printed on the board. For instance the Raspberry Pi Pico uses numbers from 1 to 40 for their pins, but these are not identical to the RP2040's GPIO numbers. So if you want to use the pin 11 of the Pico for your keyboard, you would refer to it as `GP8` in the config files.
+
+### Alternate functions
+
+The RP2040 features flexible GPIO function multiplexing, this means that every pin can be connected to nearly all the internal peripherals like I2C, SPI, UART or PWM. This allows for flexible PCB designs that are much less restricted in the selection of GPIO pins. To find out which pin can use which peripheral refer to the official [Raspberry PI RP2040 datasheet](https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf#page=14) section 1.4.3 GPIO functions.
+
+## Selecting hardware peripherals and drivers
+
+QMK RP2040 support builds upon ChibiOS and thus follows their convention for activating drivers and associated hardware peripherals. These tables only give a quick overview which values have to be used, please refer to the ChibiOS specific sections on the driver pages.
+
+### I2C Driver
+
+| RP2040 Peripheral | `mcuconf.h` values | `I2C_DRIVER` |
+| ----------------- | ------------------ | ------------ |
+| `I2C0` | `RP_I2C_USE_I2C0` | `I2CD1` |
+| `I2C1` | `RP_I2C_USE_I2C1` | `I2CD2` |
+
+To configure the I2C driver please read the [ChibiOS/ARM](i2c_driver.md#arm-configuration) section.
+
+### SPI Driver
+
+| RP2040 Peripheral | `mcuconf.h` values | `SPI_DRIVER` |
+| ----------------- | ------------------ | ------------ |
+| `SPI0` | `RP_SPI_USE_SPI0` | `SPID0` |
+| `SPI1` | `RP_SPI_USE_SPI1` | `SPID1` |
+
+To configure the SPI driver please read the [ChibiOS/ARM](spi_driver.md#chibiosarm-configuration) section.
+
+## Double-tap reset boot-loader entry :id=double-tap
+
+The double-tap reset mechanism is an alternate way in QMK to enter the embedded mass storage UF2 boot-loader of the RP2040. It enables bootloader entry by a fast double-tap of the reset pin on start up, which is similar to the behavior of AVR Pro Micros. This feature activated by default for the Pro Micro RP2040 board, but has to be configured for other boards. To activate it, add the following options to your keyboards `config.h` file:
+
+```c
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET // Activates the double-tap behavior
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 200U // Timeout window in ms in which the double tap can occur.
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17 // Specify a optional status led by GPIO number which blinks when entering the bootloader
+```
+
+## Pre-defined RP2040 boards
+
+QMK defines two boards that you can choose from to base your RP2040 powered keyboard upon. These boards provide pre-configured default pins and drivers.
+
+### Generic Pro Micro RP2040
+
+This is the default board that is chosen, unless any other RP2040 board is selected in your keyboards `rules.mk` file. It assumes a pin layout for the I2C, SPI and Serial drivers which is identical to the Sparkfun Pro Micro RP2040, however all values can be overwritten by defining them in your keyboards `config.h` file. The [double-tap](#double-tap) reset to enter boot-loader behavior is activated by default.
+
+
+| Driver configuration define | Value |
+| -------------------------------------------------------------------------- | ------------------------------------ |
+| **I2C driver** | |
+| `I2C_DRIVER` | `I2CD2` |
+| `I2C1_SDA_PIN` | `GP2` |
+| `I2C1_SCL_PIN` | `GP3` |
+| **SPI driver** | |
+| `SPI_DRIVER` | `SPID0` |
+| `SPI_SCK_PIN` | `GP18` |
+| `SPI_MISO_PIN` | `GP20` |
+| `SPI_MOSI_PIN` | `GP19` |
+| **Serial driver** | |
+| `SERIAL_USART_DRIVER` ([SIO Driver](serial_driver.md#the-sio-driver) only) | `SIOD0` |
+| `SOFT_SERIAL_PIN` | undefined, use `SERIAL_USART_TX_PIN` |
+| `SERIAL_USART_TX_PIN` | `GP0` |
+| `SERIAL_USART_RX_PIN` | `GP1` |
+
+?> The pin-outs of Adafruit's KB2040 and Boardsource's Blok both deviate from the Sparkfun Pro Micro RP2040. Lookup the pin-out of these boards and adjust your keyboards pin definition accordingly if you want to use these boards.
+
+### Generic RP2040 board
+
+This board can be chosen as a base for RP2040 keyboards which configure all necessary pins and drivers themselves and do not wish to leverage the configuration matching the Generic Pro Micro RP2040 board. Thus it doesn't provide any pre-configured pins or drivers. To select this board add the following line to your keyboards `rules.mk` file.
+
+```make
+BOARD = GENERIC_RP_RP2040
+```
+
+## Split keyboard support
+
+Split keyboards are fully supported using the [serial driver](serial_driver.md) in both full-duplex and half-duplex configurations. Two driver subsystems are supported by the RP2040, the hardware UART based `SIO` and the Programmable IO based `PIO` driver.
+
+| Feature | [SIO Driver](serial_driver.md#the-sio-driver) | [PIO Driver](serial_driver.md#the-pio-driver) |
+| ----------------------------- | --------------------------------------------- | --------------------------------------------- |
+| Half-Duplex operation | | :heavy_check_mark: |
+| Full-Duplex operation | :heavy_check_mark: | :heavy_check_mark: |
+| `TX` and `RX` pin swapping | | :heavy_check_mark: |
+| Any GPIO as `TX` and `RX` pin | Only UART capable pins | :heavy_check_mark: |
+| Simple configuration | | :heavy_check_mark: |
+
+The `PIO` driver is much more flexible then the `SIO` driver, the only "downside" is the usage of `PIO` resources which in turn are not available for advanced user programs. Under normal circumstances, this resource allocation will be a non-issue.
+
+## RP2040 second stage bootloader selection
+
+As the RP2040 does not have any internal flash memory it depends on an external SPI flash memory chip to store and execute instructions from. To successfully interact with a wide variety of these chips a second stage bootloader that is compatible with the chosen external flash memory has to be supplied with each firmware image. By default an `W25Q080` compatible bootloader is assumed, but others can be chosen by adding one of the defines listed in the table below to your keyboards `config.h` file.
+
+| Compatible with flash chip | Selection |
+| :------------------------- | ---------------------------------- |
+| W25Q080 | Selected by default |
+| AT25SF128A | `#define RP2040_FLASH_AT25SF128A` |
+| GD25Q64CS | `#define RP2040_FLASH_GD25Q64CS` |
+| W25X10CL | `#define RP2040_FLASH_W25X10CL` |
+| IS25LP080 | `#define RP2040_FLASH_IS25LP080` |
+| Generic 03H flash | `#define RP2040_FLASH_GENERIC_03H` |
diff --git a/docs/pr_checklist.md b/docs/pr_checklist.md
index ae5cb5eef6..2f974c3817 100644
--- a/docs/pr_checklist.md
+++ b/docs/pr_checklist.md
@@ -52,6 +52,9 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
- valid maintainer
- valid USB VID/PID and device version
- displays correctly in Configurator (press Ctrl+Shift+I to preview local file, turn on fast input to verify ordering)
+ - `layout` definitions should include matrix positions, so that `LAYOUT` macros can be generated at build time
+ - should use standard definitions if applicable
+ - use the Community Layout macro names where they apply (preferred above `LAYOUT`/`LAYOUT_all`)
- `readme.md`
- standard template should be present -- [link to template](https://github.com/qmk/qmk_firmware/blob/master/data/templates/keyboard/readme.md)
- flash command is present, and has `:flash` at end
@@ -67,6 +70,9 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
- no `(-/+size)` comments related to enabling features
- remove the list of alternate bootloaders if one has been specified
- no re-definitions of the default MCU parameters if same value, when compared to the equivalent MCU in [mcu_selection.mk](https://github.com/qmk/qmk_firmware/blob/master/builddefs/mcu_selection.mk)
+ - no "keymap only" features enabled
+ - `COMBO_ENABLE`
+ - `ENCODER_MAP_ENABLE`
- keyboard `config.h`
- don't repeat `MANUFACTURER` in the `PRODUCT` value
- no `#define DESCRIPTION`
@@ -79,17 +85,15 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
- Vial-related files or changes will not be accepted, as they are not used by QMK firmware (no Vial-specific core code has been submitted or merged)
- `.c`
- empty `xxxx_xxxx_kb()` or other weak-defined default implemented functions removed
+ - empty `xxxx_xxxx_user()` or other user-level functions are disallowed at the keyboard level and must be moved to keymaps
- commented-out functions removed too
- `matrix_init_board()` etc. migrated to `keyboard_pre_init_kb()`, see: [keyboard_pre_init*](custom_quantum_functions.md?id=keyboard_pre_init_-function-documentation)
- prefer `CUSTOM_MATRIX = lite` if custom matrix used, allows for standard debounce, see [custom matrix 'lite'](custom_matrix.md?id=lite)
- prefer LED indicator [Configuration Options](feature_led_indicators.md?id=configuration-options) to custom `led_update_*()` implementations where possible
- - Encoder support should not be hacked into the keymap here -- no `tap_code(dynamic_keymap_get_keycode())` or `action_exec()` hacks. The [Encoder Map](feature_encoders.md?id=encoder-map) feature already supports the dynamic keymap feature (what power's VIA's "live keymap updates" capability).
- - If support is absolutely necessary, it should be implemented exclusively at the keymap level, with none of the implementation bleeding into the keyboard level (no empty rows/columns, no encoder specific layouts, etc.), as those configurations can be redefined at the keymap level. Keymaps can then choose to use the `action_exec` hack.
- - [Request for official proper VIA support](https://github.com/the-via/app/issues/26)
+ - Encoder support should not require any keyboard-level code, and associated keymaps should now leverage the [Encoder Map](feature_encoders.md?id=encoder-map) feature instead.
- `.h`
- `#include "quantum.h"` appears at the top
- - `LAYOUT` macros should use standard definitions if applicable
- - use the Community Layout macro names where they apply (preferred above `LAYOUT`/`LAYOUT_all`)
+ - `LAYOUT` macros should be moved to `info.json`
- keymap `config.h`
- no duplication of `rules.mk` or `config.h` from keyboard
- `keymaps/default/keymap.c`
@@ -108,8 +112,9 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
- submitters can have a personal (or bells-and-whistles) keymap showcasing capabilities in the same PR but it shouldn't be embedded in the 'default' keymap
- submitters can also have a "manufacturer-matching" keymap that mirrors existing functionality of the commercial product, if porting an existing board
- Do not include VIA json files in the PR. These do not belong in the QMK repository as they are not used by QMK firmware -- they belong in the [VIA Keyboard Repo](https://github.com/the-via/keyboards)
-- Do not include source files from another keyboard or vendors keyboard folder. Including core files is fine.
- - For instance, only `wilba_tech` boards using be including `keyboards/wilba_tech/wt_main.c` and `keyboards/wilba_tech/wt_rgb_backlight.c`. But including `drivers/sensors/pmw3360.c` is absolutely fine.
+- Do not include KLE json files in the PR. These have no use within QMK.
+- Do not include source files from another keyboard or vendors keyboard folder. Including core files is fine.
+ - For instance, only `wilba_tech` boards shall include `keyboards/wilba_tech/wt_main.c` and `keyboards/wilba_tech/wt_rgb_backlight.c`. But including `drivers/sensors/pmw3360.c` is absolutely fine for any and all boards.
- Code that needs to be used by multiple boards is a candidate for core code changes, and should be separated out.
Also, specific to ChibiOS:
@@ -131,6 +136,7 @@ Also, specific to ChibiOS:
- for new MCUs, a new "child" keyboard should be added that targets your newly-added MCU, so that builds can be verified
- for new hardware support such as display panels, core-side matrix implementations, or other peripherals, an associated keymap should be provided
- if an existing keymap exists that can leverage this functionality this may not be required (e.g. a new RGB driver chip, supported by the `rgb` keymap) -- consult with the QMK Collaborators on Discord to determine if there is sufficient overlap already
+- any features adding `_kb`/`_user` callbacks must return a `bool`, to allow for user override of keyboard-level callbacks.
- other requirements are at the discretion of QMK collaborators
- core is a lot more subjective given the breadth of posted changes
diff --git a/docs/proton_c_conversion.md b/docs/proton_c_conversion.md
deleted file mode 100644
index 1e1b1e806d..0000000000
--- a/docs/proton_c_conversion.md
+++ /dev/null
@@ -1,91 +0,0 @@
-# Converting a board to use the Proton C
-
-Since the Proton C is a drop-in replacement for a Pro Micro we've made it easy to use. This page documents a handy automated process for converting keyboards, as well as documenting the manual process if you'd like to make use of Proton C features that aren't available on Pro Micros.
-
-## Automatic Conversion
-
-If a board currently supported in QMK uses a Pro Micro (or compatible board) and you want to use the Proton C, you can generate the firmware by appending `CONVERT_TO_PROTON_C=yes` (or `CTPC=yes`) to your make argument, like this:
-
- make 40percentclub/mf68:default CTPC=yes
-
-You can add the same argument to your keymap's `rules.mk`, which will accomplish the same thing.
-
-This exposes the `CONVERT_TO_PROTON_C` flag that you can use in your code with `#ifdef`s, like this:
-
-```c
-#ifdef CONVERT_TO_PROTON_C
- // Proton C code
-#else
- // Pro Micro code
-#endif
-```
-
-If you get errors about `PORTB/DDRB`, etc not being defined, so you'll need to convert the keyboard's code to use the [GPIO Controls](gpio_control.md) that will work for both ARM and AVR. This shouldn't affect the AVR builds at all.
-
-The Proton C only has one on-board LED (C13), and by default, the TXLED (D5) is mapped to it. If you want the RXLED (B0) mapped to it instead, add this like to your `config.h`:
-
- #define CONVERT_TO_PROTON_C_RXLED
-
-## Feature Conversion
-
-These are defaults based on what has been implemented for ARM boards.
-
-| Feature | Notes |
-|-------------------------------------|------------------------------------------------------------------------------------------------------------------|
-| [Audio](feature_audio.md) | Enabled |
-| [RGB Lighting](feature_rgblight.md) | Disabled |
-| [Backlight](feature_backlight.md) | Forces [task driven PWM](feature_backlight.md#software-pwm-driver) until ARM can provide automatic configuration |
-| USB Host (e.g. USB-USB converter) | Not supported (USB host code is AVR specific and is not currently supported on ARM) |
-| [Split keyboards](feature_split_keyboard.md) | Partial - heavily dependent on enabled features |
-
-## Manual Conversion
-
-To use the Proton C natively, without having to specify `CTPC=yes`, you need to change the `MCU` line in `rules.mk`:
-
-```
-MCU = STM32F303
-BOARD = QMK_PROTON_C
-```
-
-Remove these variables if they exist:
-
-* `BOOTLOADER`
-* `EXTRA_FLAGS`
-
-Finally convert all pin assignments in `config.h` to the stm32 equivalents.
-
-| Pro Micro Left | Proton C Left | | Proton C Right | Pro Micro Right |
-|-----------|----------|-|----------|-----------|
-| `D3` | `A9` | | 5v | RAW (5v) |
-| `D2` | `A10` | | GND | GND |
-| GND | GND | | FLASH | RESET |
-| GND | GND | | 3.3v | VCC 1 |
-| `D1` | `B7` | | `A2` | `F4` |
-| `D0` | `B6` | | `A1` | `F5` |
-| `D4` | `B5` | | `A0` | `F6` |
-| `C6` | `B4` | | `B8` | `F7` |
-| `D7` | `B3` | | `B13` | `B1` |
-| `E6` | `B2` | | `B14` | `B3` |
-| `B4` | `B1` | | `B15` | `B2` |
-| `B5` | `B0` | | `B9` | `B6` |
-| `B0` (RX LED) | `C13` 2 | | `C13` 2 | `D5` (TX LED) |
-
-You can also make use of several new pins on the extended portion of the Proton C:
-
-| Left | | Right |
-|------|-|-------|
-| `A4`3 | | `B10` |
-| `A5`4 | | `B11` |
-| `A6` | | `B12` |
-| `A7` | | `A14`5 (SWCLK) |
-| `A8` | | `A13`5 (SWDIO) |
-| `A15` | | RESET6 |
-
-Notes:
-
-1. On a Pro Micro VCC can be 3.3v or 5v.
-2. A Proton C only has one onboard LED, not two like a Pro Micro. The Pro Micro has an RX LED on `D5` and a TX LED on `B0`.
-3. `A4` is shared with the speaker.
-4. `A5` is shared with the speaker.
-5. `A13` and `A14` are used for hardware debugging (SWD). You can also use them for GPIO, but should use them last.
-6. Short RESET to 3.3v (pull high) to reboot the MCU. This does not enter bootloader mode like a Pro Micro, it only resets the MCU.
diff --git a/docs/quantum_keycodes.md b/docs/quantum_keycodes.md
index a1923777ef..bc68cbc922 100644
--- a/docs/quantum_keycodes.md
+++ b/docs/quantum_keycodes.md
@@ -8,10 +8,10 @@ On this page we have documented keycodes between `0x00FF` and `0xFFFF` which are
## QMK Keycodes :id=qmk-keycodes
-|Key |Aliases |Description |
-|-----------------|---------|---------------------------------------------------------------------------------|
-|`QK_BOOTLOADER` |`QK_BOOT`|Put the keyboard into bootloader mode for flashing |
-|`QK_DEBUG_TOGGLE`|`DB_TOGG`|Toggle debug mode |
-|`QK_CLEAR_EEPROM`|`EE_CLR` |Reinitializes the keyboard's EEPROM (persistent memory) |
-|`QK_MAKE` | |Sends `qmk compile -kb (keyboard) -km (keymap)`, or `qmk flash` if shift is held |
-|`QK_REBOOT` |`QK_RBT` |Resets the keyboard. Does not load the bootloader |
+|Key |Aliases |Description |
+|-----------------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------|
+|`QK_BOOTLOADER` |`QK_BOOT`|Put the keyboard into bootloader mode for flashing |
+|`QK_DEBUG_TOGGLE`|`DB_TOGG`|Toggle debug mode |
+|`QK_CLEAR_EEPROM`|`EE_CLR` |Reinitializes the keyboard's EEPROM (persistent memory) |
+|`QK_MAKE` | |Sends `qmk compile -kb (keyboard) -km (keymap)`, or `qmk flash` if shift is held. Puts keyboard into bootloader mode if shift & control are held |
+|`QK_REBOOT` |`QK_RBT` |Resets the keyboard. Does not load the bootloader |
diff --git a/docs/quantum_painter.md b/docs/quantum_painter.md
index a3705b62ce..781b467a45 100644
--- a/docs/quantum_painter.md
+++ b/docs/quantum_painter.md
@@ -8,7 +8,7 @@ To enable overall Quantum Painter to be built into your firmware, add the follow
```make
QUANTUM_PAINTER_ENABLE = yes
-QUANTUM_PAINTER_DRIVERS = ......
+QUANTUM_PAINTER_DRIVERS += ......
```
You will also likely need to select an appropriate driver in `rules.mk`, which is listed below.
@@ -17,15 +17,18 @@ You will also likely need to select an appropriate driver in `rules.mk`, which i
The QMK CLI can be used to convert from normal images such as PNG files or animated GIFs, as well as fonts from TTF files.
-Hardware supported:
+Supported devices:
-| Display Panel | Panel Type | Size | Comms Transport | Driver |
-|---------------|--------------------|------------------|-----------------|-----------------------------------------|
-| GC9A01 | RGB LCD (circular) | 240x240 | SPI + D/C + RST | `QUANTUM_PAINTER_DRIVERS = gc9a01_spi` |
-| ILI9163 | RGB LCD | 128x128 | SPI + D/C + RST | `QUANTUM_PAINTER_DRIVERS = ili9163_spi` |
-| ILI9341 | RGB LCD | 240x320 | SPI + D/C + RST | `QUANTUM_PAINTER_DRIVERS = ili9341_spi` |
-| SSD1351 | RGB OLED | 128x128 | SPI + D/C + RST | `QUANTUM_PAINTER_DRIVERS = ssd1351_spi` |
-| ST7789 | RGB LCD | 240x320, 240x240 | SPI + D/C + RST | `QUANTUM_PAINTER_DRIVERS = st7789_spi` |
+| Display Panel | Panel Type | Size | Comms Transport | Driver |
+|----------------|--------------------|------------------|-----------------|---------------------------------------------|
+| GC9A01 | RGB LCD (circular) | 240x240 | SPI + D/C + RST | `QUANTUM_PAINTER_DRIVERS += gc9a01_spi` |
+| ILI9163 | RGB LCD | 128x128 | SPI + D/C + RST | `QUANTUM_PAINTER_DRIVERS += ili9163_spi` |
+| ILI9341 | RGB LCD | 240x320 | SPI + D/C + RST | `QUANTUM_PAINTER_DRIVERS += ili9341_spi` |
+| ILI9488 | RGB LCD | 320x480 | SPI + D/C + RST | `QUANTUM_PAINTER_DRIVERS += ili9488_spi` |
+| SSD1351 | RGB OLED | 128x128 | SPI + D/C + RST | `QUANTUM_PAINTER_DRIVERS += ssd1351_spi` |
+| ST7735 | RGB LCD | 132x162, 80x160 | SPI + D/C + RST | `QUANTUM_PAINTER_DRIVERS += st7735_spi` |
+| ST7789 | RGB LCD | 240x320, 240x240 | SPI + D/C + RST | `QUANTUM_PAINTER_DRIVERS += st7789_spi` |
+| RGB565 Surface | Virtual | User-defined | None | `QUANTUM_PAINTER_DRIVERS += rgb565_surface` |
## Quantum Painter Configuration :id=quantum-painter-config
@@ -43,17 +46,20 @@ Drivers have their own set of configurable options, and are described in their r
## Quantum Painter CLI Commands :id=quantum-painter-cli
-### `qmk painter-convert-graphics`
+
+
+### ** `qmk painter-convert-graphics` **
This command converts images to a format usable by QMK, i.e. the QGF File Format.
**Usage**:
```
-usage: qmk painter-convert-graphics [-h] [-d] [-r] -f FORMAT [-o OUTPUT] -i INPUT [-v]
+usage: qmk painter-convert-graphics [-h] [-w] [-d] [-r] -f FORMAT [-o OUTPUT] -i INPUT [-v]
-optional arguments:
+options:
-h, --help show this help message and exit
+ -w, --raw Writes out the QGF file as raw data instead of c/h combo.
-d, --no-deltas Disables the use of delta frames when encoding animations.
-r, --no-rle Disables the use of RLE when encoding images.
-f FORMAT, --format FORMAT
@@ -91,7 +97,7 @@ Writing /home/qmk/qmk_firmware/keyboards/my_keeb/generated/my_image.qgf.h...
Writing /home/qmk/qmk_firmware/keyboards/my_keeb/generated/my_image.qgf.c...
```
-### `qmk painter-make-font-image`
+### ** `qmk painter-make-font-image` **
This command converts a TTF font to an intermediate format for editing, before converting to the QFF File Format.
@@ -124,7 +130,7 @@ The `UNICODE_GLYPHS` argument allows for specifying extra unicode glyphs to gene
$ qmk painter-make-font-image --font NotoSans-ExtraCondensedBold.ttf --size 11 -o noto11.png --unicode-glyphs "ĄȽɂɻɣɈʣ"
```
-### `qmk painter-convert-font-image`
+### ** `qmk painter-convert-font-image` **
This command converts an intermediate font image to the QFF File Format.
@@ -141,10 +147,11 @@ This command expects an image that conforms to the following format:
**Usage**:
```
-usage: qmk painter-convert-font-image [-h] [-r] -f FORMAT [-u UNICODE_GLYPHS] [-n] [-o OUTPUT] [-i INPUT]
+usage: qmk painter-convert-font-image [-h] [-w] [-r] -f FORMAT [-u UNICODE_GLYPHS] [-n] [-o OUTPUT] [-i INPUT]
-optional arguments:
+options:
-h, --help show this help message and exit
+ -w, --raw Writes out the QFF file as raw data instead of c/h combo.
-r, --no-rle Disable the use of RLE to minimise converted image size.
-f FORMAT, --format FORMAT
Output format, valid types: pal256, pal16, pal4, pal2, mono256, mono16, mono4, mono2
@@ -168,6 +175,255 @@ Writing /home/qmk/qmk_firmware/keyboards/my_keeb/generated/noto11.qff.h...
Writing /home/qmk/qmk_firmware/keyboards/my_keeb/generated/noto11.qff.c...
```
+
+
+## Quantum Painter Display Drivers :id=quantum-painter-drivers
+
+
+
+### ** Common: Standard TFT (SPI + D/C + RST) **
+
+Most TFT display panels use a 5-pin interface -- SPI SCK, SPI MOSI, SPI CS, D/C, and RST pins.
+
+For these displays, QMK's `spi_master` must already be correctly configured for the platform you're building for.
+
+The pin assignments for SPI CS, D/C, and RST are specified during device construction.
+
+
+
+#### ** GC9A01 **
+
+Enabling support for the GC9A01 in Quantum Painter is done by adding the following to `rules.mk`:
+
+```make
+QUANTUM_PAINTER_ENABLE = yes
+QUANTUM_PAINTER_DRIVERS += gc9a01_spi
+```
+
+Creating a GC9A01 device in firmware can then be done with the following API:
+
+```c
+painter_device_t qp_gc9a01_make_spi_device(uint16_t panel_width, uint16_t panel_height, pin_t chip_select_pin, pin_t dc_pin, pin_t reset_pin, uint16_t spi_divisor, int spi_mode);
+```
+
+The device handle returned from the `qp_gc9a01_make_spi_device` function can be used to perform all other drawing operations.
+
+The maximum number of displays can be configured by changing the following in your `config.h` (default is 1):
+
+```c
+// 3 displays:
+#define GC9A01_NUM_DEVICES 3
+```
+
+#### ** ILI9163 **
+
+Enabling support for the ILI9163 in Quantum Painter is done by adding the following to `rules.mk`:
+
+```make
+QUANTUM_PAINTER_ENABLE = yes
+QUANTUM_PAINTER_DRIVERS += ili9163_spi
+```
+
+Creating a ILI9163 device in firmware can then be done with the following API:
+
+```c
+painter_device_t qp_ili9163_make_spi_device(uint16_t panel_width, uint16_t panel_height, pin_t chip_select_pin, pin_t dc_pin, pin_t reset_pin, uint16_t spi_divisor, int spi_mode);
+```
+
+The device handle returned from the `qp_ili9163_make_spi_device` function can be used to perform all other drawing operations.
+
+The maximum number of displays can be configured by changing the following in your `config.h` (default is 1):
+
+```c
+// 3 displays:
+#define ILI9163_NUM_DEVICES 3
+```
+
+#### ** ILI9341 **
+
+Enabling support for the ILI9341 in Quantum Painter is done by adding the following to `rules.mk`:
+
+```make
+QUANTUM_PAINTER_ENABLE = yes
+QUANTUM_PAINTER_DRIVERS += ili9341_spi
+```
+
+Creating a ILI9341 device in firmware can then be done with the following API:
+
+```c
+painter_device_t qp_ili9341_make_spi_device(uint16_t panel_width, uint16_t panel_height, pin_t chip_select_pin, pin_t dc_pin, pin_t reset_pin, uint16_t spi_divisor, int spi_mode);
+```
+
+The device handle returned from the `qp_ili9341_make_spi_device` function can be used to perform all other drawing operations.
+
+The maximum number of displays can be configured by changing the following in your `config.h` (default is 1):
+
+```c
+// 3 displays:
+#define ILI9341_NUM_DEVICES 3
+```
+
+#### ** ILI9488 **
+
+Enabling support for the ILI9488 in Quantum Painter is done by adding the following to `rules.mk`:
+
+```make
+QUANTUM_PAINTER_ENABLE = yes
+QUANTUM_PAINTER_DRIVERS += ili9488_spi
+```
+
+Creating a ILI9488 device in firmware can then be done with the following API:
+
+```c
+painter_device_t qp_ili9488_make_spi_device(uint16_t panel_width, uint16_t panel_height, pin_t chip_select_pin, pin_t dc_pin, pin_t reset_pin, uint16_t spi_divisor, int spi_mode);
+```
+
+The device handle returned from the `qp_ili9488_make_spi_device` function can be used to perform all other drawing operations.
+
+The maximum number of displays can be configured by changing the following in your `config.h` (default is 1):
+
+```c
+// 3 displays:
+#define ILI9488_NUM_DEVICES 3
+```
+
+#### ** SSD1351 **
+
+Enabling support for the SSD1351 in Quantum Painter is done by adding the following to `rules.mk`:
+
+```make
+QUANTUM_PAINTER_ENABLE = yes
+QUANTUM_PAINTER_DRIVERS += ssd1351_spi
+```
+
+Creating a SSD1351 device in firmware can then be done with the following API:
+
+```c
+painter_device_t qp_ssd1351_make_spi_device(uint16_t panel_width, uint16_t panel_height, pin_t chip_select_pin, pin_t dc_pin, pin_t reset_pin, uint16_t spi_divisor, int spi_mode);
+```
+
+The device handle returned from the `qp_ssd1351_make_spi_device` function can be used to perform all other drawing operations.
+
+The maximum number of displays can be configured by changing the following in your `config.h` (default is 1):
+
+```c
+// 3 displays:
+#define SSD1351_NUM_DEVICES 3
+```
+
+#### ** ST7735 **
+
+Enabling support for the ST7735 in Quantum Painter is done by adding the following to `rules.mk`:
+
+```make
+QUANTUM_PAINTER_ENABLE = yes
+QUANTUM_PAINTER_DRIVERS += st7735_spi
+```
+
+Creating a ST7735 device in firmware can then be done with the following API:
+
+```c
+painter_device_t qp_st7735_make_spi_device(uint16_t panel_width, uint16_t panel_height, pin_t chip_select_pin, pin_t dc_pin, pin_t reset_pin, uint16_t spi_divisor, int spi_mode);
+```
+
+The device handle returned from the `qp_st7735_make_spi_device` function can be used to perform all other drawing operations.
+
+The maximum number of displays can be configured by changing the following in your `config.h` (default is 1):
+
+```c
+// 3 displays:
+#define ST7735_NUM_DEVICES 3
+```
+
+!> Some ST7735 devices are known to have different drawing offsets -- despite being a 132x162 pixel display controller internally, some display panels are only 80x160, or smaller. These may require an offset to be applied; see `qp_set_viewport_offsets` above for information on how to override the offsets if they aren't correctly rendered.
+
+#### ** ST7789 **
+
+Enabling support for the ST7789 in Quantum Painter is done by adding the following to `rules.mk`:
+
+```make
+QUANTUM_PAINTER_ENABLE = yes
+QUANTUM_PAINTER_DRIVERS += st7789_spi
+```
+
+Creating a ST7789 device in firmware can then be done with the following API:
+
+```c
+painter_device_t qp_st7789_make_spi_device(uint16_t panel_width, uint16_t panel_height, pin_t chip_select_pin, pin_t dc_pin, pin_t reset_pin, uint16_t spi_divisor, int spi_mode);
+```
+
+The device handle returned from the `qp_st7789_make_spi_device` function can be used to perform all other drawing operations.
+
+The maximum number of displays can be configured by changing the following in your `config.h` (default is 1):
+
+```c
+// 3 displays:
+#define ST7789_NUM_DEVICES 3
+```
+
+!> Some ST7789 devices are known to have different drawing offsets -- despite being a 240x320 pixel display controller internally, some display panels are only 240x240, or smaller. These may require an offset to be applied; see `qp_set_viewport_offsets` above for information on how to override the offsets if they aren't correctly rendered.
+
+
+
+### ** Common: Surfaces **
+
+Quantum Painter has surface drivers which are able to target a buffer in RAM. In general, surfaces keep track of the "dirty" region -- the area that has been drawn to since the last flush -- so that when transferring to the display they can transfer the minimal amount of data to achieve the end result.
+
+!> These generally require significant amounts of RAM, so at large sizes and/or higher bit depths, they may not be usable on all MCUs.
+
+
+
+#### ** RGB565 Surface **
+
+Enabling support for RGB565 surfaces in Quantum Painter is done by adding the following to `rules.mk`:
+
+```make
+QUANTUM_PAINTER_ENABLE = yes
+QUANTUM_PAINTER_DRIVERS += rgb565_surface
+```
+
+Creating a RGB565 surface in firmware can then be done with the following API:
+
+```c
+painter_device_t qp_rgb565_make_surface(uint16_t panel_width, uint16_t panel_height, void *buffer);
+```
+
+The `buffer` is a user-supplied area of memory, and is assumed to be of the size `sizeof(uint16_t) * panel_width * panel_height`.
+
+The device handle returned from the `qp_rgb565_make_surface` function can be used to perform all other drawing operations.
+
+Example:
+
+```c
+static painter_device_t my_surface;
+static uint16_t my_framebuffer[320 * 240]; // Allocate a buffer for a 320x240 RGB565 display
+void keyboard_post_init_kb(void) {
+ my_surface = qp_rgb565_make_surface(320, 240, my_framebuffer);
+ qp_init(my_surface, QP_ROTATION_0);
+}
+```
+
+The maximum number of RGB565 surfaces can be configured by changing the following in your `config.h` (default is 1):
+
+```c
+// 3 surfaces:
+#define RGB565_SURFACE_NUM_DEVICES 3
+```
+
+To transfer the contents of the RGB565 surface to another display, the following API can be invoked:
+
+```c
+bool qp_rgb565_surface_draw(painter_device_t surface, painter_device_t display, uint16_t x, uint16_t y);
+```
+
+The `surface` is the surface to copy out from. The `display` is the target display to draw into. `x` and `y` are the target location to draw the surface pixel data. Under normal circumstances, the location should be consistent, as the dirty region is calculated with respect to the `x` and `y` coordinates -- changing those will result in partial, overlapping draws.
+
+?> Calling `qp_flush()` on the surface resets its dirty region. Copying the surface contents to the display also automatically resets the dirty region.
+
+
+
+
+
## Quantum Painter Drawing API :id=quantum-painter-api
All APIs require a `painter_device_t` object as their first parameter -- this object comes from the specific device initialisation, and instructions on creating it can be found in each driver's respective section.
@@ -177,7 +433,9 @@ To use any of the APIs, you need to include `qp.h`:
#include
```
-### General Notes :id=quantum-painter-api-general
+
+
+### ** General Notes **
The coordinate system used in Quantum Painter generally accepts `left`, `top`, `right`, and `bottom` instead of x/y/width/height, and each coordinate is inclusive of where pixels should be drawn. This is required as some datatypes used by display panels have a maximum value of `255` -- for any value or geometry extent that matches `256`, this would be represented as a `0`, instead.
@@ -191,9 +449,11 @@ All color data matches the standard QMK HSV triplet definitions:
?> Colors used in Quantum Painter are not subject to the RGB lighting CIE curve, if it is enabled.
-### Device Control :id=quantum-painter-api-device-control
+### ** Device Control **
-#### Display Initialisation :id=quantum-painter-api-init
+
+
+#### ** Display Initialisation **
```c
bool qp_init(painter_device_t device, painter_rotation_t rotation);
@@ -209,7 +469,7 @@ void keyboard_post_init_kb(void) {
}
```
-#### Display Power :id=quantum-painter-api-power
+#### ** Display Power **
```c
bool qp_power(painter_device_t device, bool power_on);
@@ -240,7 +500,7 @@ void suspend_wakeup_init_user(void) {
}
```
-#### Display Clear :id=quantum-painter-api-clear
+#### ** Display Clear **
```c
bool qp_clear(painter_device_t device);
@@ -248,7 +508,7 @@ bool qp_clear(painter_device_t device);
The `qp_clear` function clears the display's screen.
-#### Display Flush :id=quantum-painter-api-flush
+#### ** Display Flush **
```c
bool qp_flush(painter_device_t device);
@@ -270,9 +530,13 @@ void housekeeping_task_user(void) {
}
```
-### Drawing Primitives :id=quantum-painter-api-primitives
+
-#### Set Pixel :id=quantum-painter-api-setpixel
+### ** Drawing Primitives **
+
+
+
+#### ** Set Pixel **
```c
bool qp_setpixel(painter_device_t device, uint16_t x, uint16_t y, uint8_t hue, uint8_t sat, uint8_t val);
@@ -296,7 +560,7 @@ void housekeeping_task_user(void) {
}
```
-#### Draw Line :id=quantum-painter-api-line
+#### ** Draw Line **
```c
bool qp_line(painter_device_t device, uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint8_t hue, uint8_t sat, uint8_t val);
@@ -318,7 +582,7 @@ void housekeeping_task_user(void) {
}
```
-#### Draw Rect :id=quantum-painter-api-rect
+#### ** Draw Rect **
```c
bool qp_rect(painter_device_t device, uint16_t left, uint16_t top, uint16_t right, uint16_t bottom, uint8_t hue, uint8_t sat, uint8_t val, bool filled);
@@ -340,7 +604,7 @@ void housekeeping_task_user(void) {
}
```
-#### Draw Circle :id=quantum-painter-api-circle
+#### ** Draw Circle **
```c
bool qp_circle(painter_device_t device, uint16_t x, uint16_t y, uint16_t radius, uint8_t hue, uint8_t sat, uint8_t val, bool filled);
@@ -362,7 +626,7 @@ void housekeeping_task_user(void) {
}
```
-#### Draw Ellipse :id=quantum-painter-api-ellipse
+#### ** Draw Ellipse **
```c
bool qp_ellipse(painter_device_t device, uint16_t x, uint16_t y, uint16_t sizex, uint16_t sizey, uint8_t hue, uint8_t sat, uint8_t val, bool filled);
@@ -384,9 +648,24 @@ void housekeeping_task_user(void) {
}
```
-### Image Functions :id=quantum-painter-api-images
+
-#### Load Image :id=quantum-painter-api-load-image
+### ** Image Functions **
+
+Making an image available for use requires compiling it into your firmware. To do so, assuming you've created `my_image.qgf.c` and `my_image.qgf.h` as per the CLI examples above, you'd add the following to your `rules.mk`:
+
+```make
+SRC += my_image.qgf.c
+```
+
+...and in your `keymap.c`, you'd add to the top of the file:
+```c
+#include "my_image.qgf.h"
+```
+
+
+
+#### ** Load Image **
```c
painter_image_handle_t qp_load_image_mem(const void *buffer);
@@ -394,7 +673,7 @@ painter_image_handle_t qp_load_image_mem(const void *buffer);
The `qp_load_image_mem` function loads a QGF image from memory or flash.
-`qp_load_image_mem` returns a handle to the loaded image, which can then be used to draw to the screen using `qp_drawimage`, `qp_drawimage_recolor`, `qp_animate`, or `qp_animate_recolor`. If an image is no longer required, it can be unloaded by calling `qp_close_image` below.
+`qp_load_image_mem` returns a handle to the loaded image, which can then be used to draw to the screen using `qp_drawimage`, `qp_drawimage_recolor`, `qp_animate`, or `qp_animate_recolor`. If an image is no longer required, it can be unloaded by calling `qp_close_image` below.
See the [CLI Commands](quantum_painter.md?id=quantum-painter-cli) for instructions on how to convert images to [QGF](quantum_painter_qgf.md).
@@ -408,7 +687,7 @@ Image information is available through accessing the handle:
| Height | `image->height` |
| Frame Count | `image->frame_count` |
-#### Unload Image :id=quantum-painter-api-close-image
+#### ** Unload Image **
```c
bool qp_close_image(painter_image_handle_t image);
@@ -416,7 +695,7 @@ bool qp_close_image(painter_image_handle_t image);
The `qp_close_image` function releases resources related to the loading of the supplied image.
-#### Draw image :id=quantum-painter-api-draw-image
+#### ** Draw image **
```c
bool qp_drawimage(painter_device_t device, uint16_t x, uint16_t y, painter_image_handle_t image);
@@ -436,7 +715,7 @@ void keyboard_post_init_kb(void) {
}
```
-#### Animate Image :id=quantum-painter-api-animate-image
+#### ** Animate Image **
```c
deferred_token qp_animate(painter_device_t device, uint16_t x, uint16_t y, painter_image_handle_t image);
@@ -461,7 +740,7 @@ void keyboard_post_init_kb(void) {
}
```
-#### Stop Animation :id=quantum-painter-api-stop-animation
+#### ** Stop Animation **
```c
void qp_stop_animation(deferred_token anim_token);
@@ -476,9 +755,24 @@ void housekeeping_task_user(void) {
}
```
-### Font Functions :id=quantum-painter-api-fonts
+
-#### Load Font :id=quantum-painter-api-load-font
+### ** Font Functions **
+
+Making a font available for use requires compiling it into your firmware. To do so, assuming you've created `my_font.qff.c` and `my_font.qff.h` as per the CLI examples above, you'd add the following to your `rules.mk`:
+
+```make
+SRC += noto11.qff.c
+```
+
+...and in your `keymap.c`, you'd add to the top of the file:
+```c
+#include "noto11.qff.h"
+```
+
+
+
+#### ** Load Font **
```c
painter_font_handle_t qp_load_font_mem(const void *buffer);
@@ -486,7 +780,7 @@ painter_font_handle_t qp_load_font_mem(const void *buffer);
The `qp_load_font_mem` function loads a QFF font from memory or flash.
-`qp_load_font_mem` returns a handle to the loaded font, which can then be measured using `qp_textwidth`, or drawn to the screen using `qp_drawtext`, or `qp_drawtext_recolor`. If a font is no longer required, it can be unloaded by calling `qp_close_font` below.
+`qp_load_font_mem` returns a handle to the loaded font, which can then be measured using `qp_textwidth`, or drawn to the screen using `qp_drawtext`, or `qp_drawtext_recolor`. If a font is no longer required, it can be unloaded by calling `qp_close_font` below.
See the [CLI Commands](quantum_painter.md?id=quantum-painter-cli) for instructions on how to convert TTF fonts to [QFF](quantum_painter_qff.md).
@@ -498,7 +792,7 @@ Font information is available through accessing the handle:
|-------------|----------------------|
| Line Height | `image->line_height` |
-#### Unload Font :id=quantum-painter-api-close-font
+#### ** Unload Font **
```c
bool qp_close_font(painter_font_handle_t font);
@@ -506,7 +800,7 @@ bool qp_close_font(painter_font_handle_t font);
The `qp_close_font` function releases resources related to the loading of the supplied font.
-#### Measure Text :id=quantum-painter-api-textwidth
+#### ** Measure Text **
```c
int16_t qp_textwidth(painter_font_handle_t font, const char *str);
@@ -514,7 +808,7 @@ int16_t qp_textwidth(painter_font_handle_t font, const char *str);
The `qp_textwidth` function allows measurement of how many pixels wide the supplied string would result in, for the given font.
-#### Draw Text :id=quantum-painter-api-drawtext
+#### ** Draw Text **
```c
int16_t qp_drawtext(painter_device_t device, uint16_t x, uint16_t y, painter_font_handle_t font, const char *str);
@@ -527,7 +821,7 @@ The `qp_drawtext` and `qp_drawtext_recolor` functions draw the supplied string t
// Draw a text message on the bottom-right of the 240x320 display on initialisation
static painter_font_handle_t my_font;
void keyboard_post_init_kb(void) {
- my_font = qp_load_font_mem(font_opensans);
+ my_font = qp_load_font_mem(font_noto11);
if (my_font != NULL) {
static const char *text = "Hello from QMK!";
int16_t width = qp_textwidth(my_font, text);
@@ -536,9 +830,13 @@ void keyboard_post_init_kb(void) {
}
```
-### Advanced Functions :id=quantum-painter-api-advanced
+
-#### Get Geometry :id=quantum-painter-api-get-geometry
+### ** Advanced Functions **
+
+
+
+#### ** Get Geometry **
```c
void qp_get_geometry(painter_device_t device, uint16_t *width, uint16_t *height, painter_rotation_t *rotation, uint16_t *offset_x, uint16_t *offset_y);
@@ -546,7 +844,7 @@ void qp_get_geometry(painter_device_t device, uint16_t *width, uint16_t *height,
The `qp_get_geometry` function allows external code to retrieve the current width, height, rotation, and drawing offsets.
-#### Set Viewport Offsets :id=quantum-painter-api-set-viewport
+#### ** Set Viewport Offsets **
```c
void qp_set_viewport_offsets(painter_device_t device, uint16_t offset_x, uint16_t offset_y);
@@ -554,7 +852,7 @@ void qp_set_viewport_offsets(painter_device_t device, uint16_t offset_x, uint16_
The `qp_set_viewport_offsets` function can be used to offset all subsequent drawing operations. For example, if a display controller is internally 240x320, but the display panel is 240x240 and has a Y offset of 80 pixels, you could invoke `qp_set_viewport_offsets(display, 0, 80);` and the drawing positioning would be corrected.
-#### Set Viewport :id=quantum-painter-api-viewport
+#### ** Set Viewport **
```c
bool qp_viewport(painter_device_t device, uint16_t left, uint16_t top, uint16_t right, uint16_t bottom);
@@ -562,7 +860,7 @@ bool qp_viewport(painter_device_t device, uint16_t left, uint16_t top, uint16_t
The `qp_viewport` function controls where raw pixel data is written to.
-#### Stream Pixel Data :id=quantum-painter-api-pixdata
+#### ** Stream Pixel Data **
```c
bool qp_pixdata(painter_device_t device, const void *pixel_data, uint32_t native_pixel_count);
@@ -572,134 +870,6 @@ The `qp_pixdata` function allows raw pixel data to be streamed to the display. I
!> Under normal circumstances, users will not need to manually call either `qp_viewport` or `qp_pixdata`. These allow for writing of raw pixel information, in the display panel's native format, to the area defined by the viewport.
-## Quantum Painter Display Drivers :id=quantum-painter-drivers
+
-### Common: Standard TFT (SPI + D/C + RST)
-
-Most TFT display panels use a 5-pin interface -- SPI SCK, SPI MOSI, SPI CS, D/C, and RST pins.
-
-For these displays, QMK's `spi_master` must already be correctly configured for the platform you're building for.
-
-The pin assignments for SPI CS, D/C, and RST are specified during device construction.
-
-### GC9A01 :id=qp-driver-gc9a01
-
-Enabling support for the GC9A01 in Quantum Painter is done by adding the following to `rules.mk`:
-
-```make
-QUANTUM_PAINTER_ENABLE = yes
-QUANTUM_PAINTER_DRIVERS = gc9a01_spi
-```
-
-Creating a GC9A01 device in firmware can then be done with the following API:
-
-```c
-painter_device_t qp_gc9a01_make_spi_device(uint16_t panel_width, uint16_t panel_height, pin_t chip_select_pin, pin_t dc_pin, pin_t reset_pin, uint16_t spi_divisor, int spi_mode);
-```
-
-The device handle returned from the `qp_gc9a01_make_spi_device` function can be used to perform all other drawing operations.
-
-The maximum number of displays can be configured by changing the following in your `config.h` (default is 1):
-
-```c
-// 3 displays:
-#define GC9A01_NUM_DEVICES 3
-```
-
-### ILI9163 :id=qp-driver-ili9163
-
-Enabling support for the ILI9163 in Quantum Painter is done by adding the following to `rules.mk`:
-
-```make
-QUANTUM_PAINTER_ENABLE = yes
-QUANTUM_PAINTER_DRIVERS = ili9163_spi
-```
-
-Creating a ILI9163 device in firmware can then be done with the following API:
-
-```c
-painter_device_t qp_ili9163_make_spi_device(uint16_t panel_width, uint16_t panel_height, pin_t chip_select_pin, pin_t dc_pin, pin_t reset_pin, uint16_t spi_divisor, int spi_mode);
-```
-
-The device handle returned from the `qp_ili9163_make_spi_device` function can be used to perform all other drawing operations.
-
-The maximum number of displays can be configured by changing the following in your `config.h` (default is 1):
-
-```c
-// 3 displays:
-#define ILI9163_NUM_DEVICES 3
-```
-
-### ILI9341 :id=qp-driver-ili9341
-
-Enabling support for the ILI9341 in Quantum Painter is done by adding the following to `rules.mk`:
-
-```make
-QUANTUM_PAINTER_ENABLE = yes
-QUANTUM_PAINTER_DRIVERS = ili9341_spi
-```
-
-Creating a ILI9341 device in firmware can then be done with the following API:
-
-```c
-painter_device_t qp_ili9341_make_spi_device(uint16_t panel_width, uint16_t panel_height, pin_t chip_select_pin, pin_t dc_pin, pin_t reset_pin, uint16_t spi_divisor, int spi_mode);
-```
-
-The device handle returned from the `qp_ili9341_make_spi_device` function can be used to perform all other drawing operations.
-
-The maximum number of displays can be configured by changing the following in your `config.h` (default is 1):
-
-```c
-// 3 displays:
-#define ILI9341_NUM_DEVICES 3
-```
-
-### SSD1351 :id=qp-driver-ssd1351
-
-Enabling support for the SSD1351 in Quantum Painter is done by adding the following to `rules.mk`:
-
-```make
-QUANTUM_PAINTER_ENABLE = yes
-QUANTUM_PAINTER_DRIVERS = ssd1351_spi
-```
-
-Creating a SSD1351 device in firmware can then be done with the following API:
-
-```c
-painter_device_t qp_ssd1351_make_spi_device(uint16_t panel_width, uint16_t panel_height, pin_t chip_select_pin, pin_t dc_pin, pin_t reset_pin, uint16_t spi_divisor, int spi_mode);
-```
-
-The device handle returned from the `qp_ssd1351_make_spi_device` function can be used to perform all other drawing operations.
-
-The maximum number of displays can be configured by changing the following in your `config.h` (default is 1):
-
-```c
-// 3 displays:
-#define SSD1351_NUM_DEVICES 3
-```
-
-### ST7789 :id=qp-driver-st7789
-
-Enabling support for the ST7789 in Quantum Painter is done by adding the following to `rules.mk`:
-
-```make
-QUANTUM_PAINTER_ENABLE = yes
-QUANTUM_PAINTER_DRIVERS = st7789_spi
-```
-
-Creating a ST7789 device in firmware can then be done with the following API:
-
-```c
-painter_device_t qp_st7789_make_spi_device(uint16_t panel_width, uint16_t panel_height, pin_t chip_select_pin, pin_t dc_pin, pin_t reset_pin, uint16_t spi_divisor, int spi_mode);
-```
-
-The device handle returned from the `qp_st7789_make_spi_device` function can be used to perform all other drawing operations.
-
-The maximum number of displays can be configured by changing the following in your `config.h` (default is 1):
-
-```c
-// 3 displays:
-#define ST7789_NUM_DEVICES 3
-```
-
-!> Some ST7789 devices are known to have different drawing offsets -- despite being a 240x320 pixel display controller internally, some display panels are only 240x240, or smaller. These may require an offset to be applied; see `qp_set_viewport_offsets` above for information on how to override the offsets if they aren't correctly rendered.
\ No newline at end of file
+
diff --git a/docs/ref_functions.md b/docs/ref_functions.md
index c375ecd057..c82c5747c2 100644
--- a/docs/ref_functions.md
+++ b/docs/ref_functions.md
@@ -97,7 +97,7 @@ To reset to the bootloader use `QK_BOOTLOADER` or `QK_BOOT` keycode or `reset_ke
## Wiping the EEPROM (Persistent Storage)
-If you're having issues with Audio, RGB Underglow, backlighting or keys acting weird, then you can reset the EEPROM (persistent setting storage). To force an EEPROM reset, use the [`EEP_RST` keycode](quantum_keycodes.md) or [Bootmagic Lite](feature_bootmagic.md) functionality. If neither of those are an option, then you can use a custom macro to do so.
+If you're having issues with Audio, RGB Underglow, backlighting or keys acting weird, then you can reset the EEPROM (persistent setting storage). To force an EEPROM reset, use the [`EE_CLR` keycode](quantum_keycodes.md) or [Bootmagic Lite](feature_bootmagic.md) functionality. If neither of those are an option, then you can use a custom macro to do so.
To wipe the EEPROM, run `eeconfig_init()` from your function or macro to reset most of the settings to default.
diff --git a/docs/reference_info_json.md b/docs/reference_info_json.md
index aa59711592..d5469c835a 100644
--- a/docs/reference_info_json.md
+++ b/docs/reference_info_json.md
@@ -1,12 +1,12 @@
# `info.json`
-This file is used by the [QMK API](https://github.com/qmk/qmk_api). It contains the information [QMK Configurator](https://config.qmk.fm/) needs to display a representation of your keyboard. You can also set metadata here.
+The information contained in `info.json` is combined with the `config.h` and `rules.mk` files, dynamically generating the necessary configuration for your keyboard at compile time. It is also used by the [QMK API](https://github.com/qmk/qmk_api), and contains the information [QMK Configurator](https://config.qmk.fm/) needs to display a representation of your keyboard. Its key/value pairs are ruled by the [`data/schemas/keyboard.jsonschema`](https://github.com/qmk/qmk_firmware/blob/master/data/schemas/keyboard.jsonschema) file. To learn more about the why and how of the schema file see the [Data Driven Configuration](https://docs.qmk.fm/#/data_driven_config) page.
-You can create `info.json` files at every level under `qmk_firmware/keyboards/` to specify this metadata. These files are combined, with more specific files overriding keys in less specific files. This means you do not need to duplicate your metadata information. For example, `qmk_firmware/keyboards/clueboard/info.json` specifies `manufacturer` and `maintainer`, while `qmk_firmware/keyboards/clueboard/66/info.json` specifies more specific information about Clueboard 66%.
+You can create `info.json` files at every level under `qmk_firmware/keyboards/`. These files are combined, with more specific files overriding keys in less specific files. This means you do not need to duplicate your metadata information. For example, `qmk_firmware/keyboards/clueboard/info.json` specifies `manufacturer` and `maintainer`, while `qmk_firmware/keyboards/clueboard/66/info.json` specifies more specific information about Clueboard 66%.
## `info.json` Format
-The `info.json` file is a JSON formatted dictionary with the following keys available to be set. You do not have to set all of them, merely the keys that apply to your keyboard.
+The `info.json` file is a JSON formatted dictionary. The first six keys noted here must be defined in `info.json`, or your keyboard will not be accepted into the QMK repository.
* `keyboard_name`
* A free-form text string describing the keyboard.
@@ -20,6 +20,8 @@ The `info.json` file is a JSON formatted dictionary with the following keys avai
* `maintainer`
* GitHub username of the maintainer, or `qmk` for community maintained boards.
* Example: `skullydazed`
+* `usb`
+ * Configure USB VID, PID, and device version. See the [USB](#USB) section for more detail.
* `debounce`
* The amount of time in milliseconds to wait for debounce to happen.
* Default: `5`
@@ -33,10 +35,11 @@ The `info.json` file is a JSON formatted dictionary with the following keys avai
* Configure the pins corresponding to columns and rows, or direct pins. See the [Matrix Pins](#matrix-pins) section for more detail.
* `rgblight`
* Configure the [RGB Lighting feature](feature_rgblight.md). See the [RGB Lighting](#rgb-lighting) section for more detail.
-* `usb`
- * Configure USB VID, PID, and other parameters. See the [USB](#USB) section for more detail.
-### Layout Format
+
+?> For all the available keys and their allowed values refer back to the [`data/schemas/keyboard.jsonschema`](https://github.com/qmk/qmk_firmware/blob/master/data/schemas/keyboard.jsonschema) file.
+
+## Layout Format
Within our `info.json` file the `layouts` portion of the dictionary contains several nested dictionaries. The outer layer consists of QMK layout macros, for example `LAYOUT_ansi` or `LAYOUT_iso`.
@@ -45,7 +48,7 @@ Within our `info.json` file the `layouts` portion of the dictionary contains sev
### Key Dictionary Format
-Each Key Dictionary in a layout describes the physical properties of a key. If you are familiar with the Raw Code for you will find many of the concepts the same. We re-use the same key names and layout choices wherever possible, but unlike keyboard-layout-editor each key is stateless, inheriting no properties from the keys that came before it.
+Each Key Dictionary in a layout describes the physical properties of a key. If you are familiar with the Raw Data for you will find many of the concepts the same. We re-use the same key names and layout choices wherever possible, but unlike keyboard-layout-editor each key is stateless, inheriting no properties from the keys that came before it.
All key positions and rotations are specified in relation to the top-left corner of the keyboard, and the top-left corner of each key.
@@ -65,11 +68,11 @@ All key positions and rotations are specified in relation to the top-left corner
* A two item list describing the row and column location for this key.
* Example: `[0, 4]`
-### Matrix Pins
+## Matrix Pins
Currently QMK supports connecting switches either directly to GPIO pins or via a switch matrix. At this time you can not combine these, they are mutually exclusive.
-#### Switch Matrix
+### Switch Matrix
Most keyboards use a switch matrix to connect keyswitches to the MCU. You can define your pin columns and rows to configure your switch matrix. When defining switch matrices you should also define your `diode_direction`.
@@ -85,12 +88,14 @@ Example:
}
```
-#### Direct Pins
+### Direct Pins
Direct pins are when you connect one side of the switch to GND and the other side to a GPIO pin on your MCU. No diode is required, but there is a 1:1 mapping between switches and pins.
When specifying direct pins you need to arrange them in nested arrays. The outer array consists of rows, while the inner array uses text strings to identify the pins used in each row. You can use `null` to indicate an empty spot in the matrix.
+Notice that when using direct pins, `diode_direction` is left undefined.
+
Example:
```json
@@ -113,14 +118,29 @@ Example:
This section controls basic 2-pin LEDs, which typically pass through keyswitches and are soldered into the PCB, or are placed in PCB sockets.
### Backlight
+Enable by setting
+
+```json
+ "features": {
+ "backlight": true
+ }
+```
+
* `breathing`
* Enable backlight breathing, if supported
* `breathing_period`
* The length of one backlight “breath” in seconds
* `levels`
* The number of brightness levels (maximum 31, excluding off)
+* `max_brightness`
+ * The maximum duty cycle of the backlight LED(s) (0-255)
* `pin`
* The pin that controls the backlight LED(s)
+* `pins`
+ * Array of pins that controls the backlight LED(s) (See [Multiple Backlight Pins](feature_backlight.md#multiple-backlight-pins))
+* `on_state`
+ * The state of the indicator pins when the LED is "on" - `1` for high, `0` for low
+ * Default: `1`
Example:
@@ -145,6 +165,13 @@ Used for indicating Num Lock, Caps Lock, and Scroll Lock. May be soldered in-swi
* The pin that controls the `Caps Lock` LED
* `scroll_lock`
* The pin that controls the `Scroll Lock` LED
+* `compose`
+ * The pin that controls the `Compose` LED
+* `kana`
+ * The pin that controls the `Kana` LED
+* `on_state`
+ * The state of the indicator pins when the LED is "on" - `1` for high, `0` for low
+ * Default: `1`
Example:
@@ -177,8 +204,9 @@ The following items can be set. Not every value is required.
* Set to `true` to enable synchronization functionality between split halves
* `split_count`
* For split keyboards, the number of LEDs on each side
+ * Example `[ 10 , 10 ]`
* `max_brightness`
- * (0-255) What the maxmimum brightness (value) level is
+ * What the maximum brightness (value) level is (0-255)
* `hue_steps`
* How many steps of adjustment to have for hue
* `saturation_steps`
@@ -197,7 +225,8 @@ Example:
"saturation_steps": 17,
"brightness_steps": 17,
"animations": {
- "all": true
+ "knight": true,
+ "rainbow_swirl": true
}
}
}
@@ -221,7 +250,7 @@ The following animations can be enabled:
|`static_gradient`|Enable static gradient mode. |
|`twinkle` |Enable twinkle animation mode. |
-### USB
+## USB
Every USB keyboard needs to have its USB parameters defined. At a minimum you need to set the Vendor ID, Product ID, and device version.
@@ -239,7 +268,51 @@ Example:
The device version is a BCD (binary coded decimal) value, in the format `MMmr`, so the below value would look like `0x0100` in the generated code. This also means the maximum valid values for each part are `99.9.9`, despite it being a hexadecimal value under the hood.
-### Secure
+## Encoders
+
+This section controls the basic [rotary encoder](feature_encoders.md) support.
+
+Enable by setting
+
+```json
+ "features": {
+ "encoder": true
+ }
+```
+
+The following items can be set. Not every value is required.
+
+* `pin_a`
+ * __Required__. A pad definition
+* `pin_b`
+ * __Required__. B pad definition
+* `resolution`
+ * How many pulses the encoder registers between each detent
+
+Examples:
+
+```json
+{
+ "encoder": {
+ "rotary": [
+ { "pin_a": "B5", "pin_b": "A2" }
+ ]
+ }
+}
+```
+
+```json
+{
+ "encoder": {
+ "rotary": [
+ { "pin_a": "B5", "pin_b": "A2", "resolution": 4 }
+ { "pin_a": "B6", "pin_b": "A3", "resolution": 2 }
+ ]
+ }
+}
+```
+
+## Secure
The following options can be configured:
diff --git a/docs/serial_driver.md b/docs/serial_driver.md
index 3e89deffad..7fad23911a 100644
--- a/docs/serial_driver.md
+++ b/docs/serial_driver.md
@@ -1,129 +1,301 @@
# 'serial' Driver
-This driver powers the [Split Keyboard](feature_split_keyboard.md) feature.
+
+The serial driver powers the [Split Keyboard](feature_split_keyboard.md) feature. Several implementations are available, depending on the platform of your split keyboard. Note that none of the drivers support split keyboards with more than two halves.
+
+| Driver | AVR | ARM | Connection between halves |
+| --------------------------------------- | ------------------ | ------------------ | --------------------------------------------------------------------------------------------- |
+| [Bitbang](#bitbang) | :heavy_check_mark: | :heavy_check_mark: | Single wire communication. One wire is used for reception and transmission. |
+| [USART Half-duplex](#usart-half-duplex) | | :heavy_check_mark: | Efficient single wire communication. One wire is used for reception and transmission. |
+| [USART Full-duplex](#usart-full-duplex) | | :heavy_check_mark: | Efficient two wire communication. Two distinct wires are used for reception and transmission. |
?> Serial in this context should be read as **sending information one bit at a time**, rather than implementing UART/USART/RS485/RS232 standards.
-Drivers in this category have the following characteristics:
-* bit bang and USART Half-duplex provide data and signaling over a single conductor
-* USART Full-duplex provide data and signaling over two conductors
-* They are all limited to single master and single slave communication scheme
+
-## Supported Driver Types
+## Bitbang
-| | AVR | ARM |
-| ----------------- | ------------------ | ------------------ |
-| bit bang | :heavy_check_mark: | :heavy_check_mark: |
-| USART Half-duplex | | :heavy_check_mark: |
-| USART Full-duplex | | :heavy_check_mark: |
+This is the Default driver, the 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.
-## Driver configuration
+!> On ARM platforms the bitbang driver causes connection issues when using it together with the bitbang WS2812 driver. Choosing alternate drivers for both serial and WS2812 (instead of bitbang) is strongly recommended.
-### Bitbang
-Default driver, the absence of configuration assumes this driver. To configure it, add this to your rules.mk:
+### Pin configuration
+
+```
+ LEFT RIGHT
++-------+ SERIAL +-------+
+| SSP |-----------------| SSP |
+| | VDD | |
+| |-----------------| |
+| | GND | |
+| |-----------------| |
++-------+ +-------+
+```
+
+One GPIO pin is needed for the bitbang driver, as only one wire is used for receiving and transmitting data. This pin is referred to as the `SOFT_SERIAL_PIN` (SSP) in the configuration. A simple TRS or USB cable provides enough conductors for this driver to work.
+
+### Setup
+
+To use the bitbang driver follow these steps to activate it.
+
+1. Change the `SERIAL_DRIVER` to `bitbang` in your keyboards `rules.mk` file:
```make
SERIAL_DRIVER = bitbang
```
-Configure the driver via your config.h:
+2. Configure the GPIO pin of your keyboard via the `config.h` file:
+
```c
#define SOFT_SERIAL_PIN D0 // or D1, D2, D3, E6
-#define SELECT_SOFT_SERIAL_SPEED 1 // or 0, 2, 3, 4, 5
- // 0: about 189kbps (Experimental only)
- // 1: about 137kbps (default)
- // 2: about 75kbps
- // 3: about 39kbps
- // 4: about 26kbps
- // 5: about 20kbps
```
-#### ARM
+3. On ARM platforms you must turn on ChibiOS `PAL_USE_CALLBACKS` feature:
-!> The bitbang driver causes connection issues with bitbang WS2812 driver
+* In `halconf.h` add the line `#define PAL_USE_CALLBACKS TRUE`.
-Along with the generic options above, you must also turn on the `PAL_USE_CALLBACKS` feature in your halconf.h.
+
-### USART Half-duplex
-Targeting STM32 boards where communication is offloaded to a USART hardware device. The advantage over bitbang is that this provides fast and accurate timings. `SERIAL_PIN_TX` for this driver is the configured USART TX pin. As this Pin is configured in open-drain mode an **external pull-up resistor is needed to keep the line high** (resistor values of 1.5k to 8.2k are known to work). To configure it, add this to your rules.mk:
+## USART Half-duplex
+
+Targeting ARM boards based on ChibiOS, where communication is offloaded to a USART hardware device that supports Half-duplex operation. The advantages over bitbanging are fast, accurate timings and reduced CPU usage. Therefore it is advised to choose this driver or the Full-duplex driver whenever possible.
+
+### Pin configuration
+
+```
+ LEFT RIGHT
++-------+ | | +-------+
+| | R R | |
+| | | SERIAL | | |
+| TX |-----------------| TX |
+| | VDD | |
+| |-----------------| |
+| | GND | |
+| |-----------------| |
++-------+ +-------+
+```
+
+Only one GPIO pin is needed for the Half-duplex driver, as only one wire is used for receiving and transmitting data. This pin is referred to as the `SERIAL_USART_TX_PIN` in the configuration. Take care that the pin you chose can act as the TX pin of the USART peripheral. A simple TRS or USB cable provides enough conductors for this driver to work. As the split connection is configured to work in open-drain mode, an **external pull-up resistor is needed to keep the line high**. Resistor values of 1.5kΩ to 8.2kΩ are known to work.
+
+### Setup
+
+To use the Half-duplex driver follow these steps to activate it. If you target the Raspberry Pi RP2040 PIO implementation skip step 1.
+
+1. Change the `SERIAL_DRIVER` to `usart` in your keyboards `rules.mk` file:
```make
SERIAL_DRIVER = usart
```
-Configure the hardware via your config.h:
+2. (RP2040 PIO only!) Change the `SERIAL_DRIVER` to `vendor` in your keyboards `rules.mk` file:
+
+```make
+SERIAL_DRIVER = vendor
+```
+
+3. Configure the hardware of your keyboard via the `config.h` file:
+
```c
-#define SOFT_SERIAL_PIN B6 // USART TX pin
-//#define USART1_REMAP // Remap USART TX and RX pins on STM32F103 MCUs, see table below.
-#define SELECT_SOFT_SERIAL_SPEED 1 // or 0, 2, 3, 4, 5
- // 0: about 460800 baud
- // 1: about 230400 baud (default)
- // 2: about 115200 baud
- // 3: about 57600 baud
- // 4: about 38400 baud
- // 5: about 19200 baud
-#define SERIAL_USART_DRIVER SD1 // USART driver of TX pin. default: SD1
-#define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
-#define SERIAL_USART_TIMEOUT 20 // USART driver timeout. default 20
+#define SERIAL_USART_TX_PIN B6 // The GPIO pin that is used split communication.
```
-You must also enable the ChibiOS `SERIAL` feature:
-* In your board's halconf.h: `#define HAL_USE_SERIAL TRUE`
-* In your board's mcuconf.h: `#define STM32_SERIAL_USE_USARTn TRUE` (where 'n' matches the peripheral number of your selected USART on the MCU)
+For STM32 MCUs several GPIO configuration options can be changed as well. See the section ["Alternate Functions for selected STM32 MCUs"](alternate-functions-for-selected-stm32-mcus).
-Do note that the configuration required is for the `SERIAL` peripheral, not the `UART` peripheral.
+```c
+#define USART1_REMAP // Remap USART TX and RX pins on STM32F103 MCUs, see table below.
+#define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
+```
-### USART Full-duplex
-Targeting STM32 boards where communication is offloaded to a USART hardware device. The advantage over bitbang is that this provides fast and accurate timings. USART Full-Duplex requires two conductors **without** pull-up resistors instead of one conductor with a pull-up resistor unlike the Half-duplex driver. Due to its internal design it is more efficent, which can result in even faster transmission speeds.
+1. Decide either for `SERIAL`, `SIO` or `PIO` subsystem, see the section ["Choosing a driver subsystem"](#choosing-a-driver-subsystem).
-#### Pin configuration
+
-`SERIAL_USART_TX_PIN` is the USART `TX` pin, `SERIAL_USART_RX_PIN` is the USART `RX` pin. No external pull-up resistors are needed as the `TX` pin operates in push-pull mode. To use this driver the usart peripherals `TX` and `RX` pins must be configured with the correct Alternate-functions. If you are using a Proton-C everything is already setup, same is true for STM32F103 MCUs. For MCUs which are using a modern flexible GPIO configuration you have to specify these by setting `SERIAL_USART_TX_PAL_MODE` and `SERIAL_USART_RX_PAL_MODE`. Refeer to the corresponding datasheets of your MCU or find those settings in the table below.
+## USART Full-duplex
-#### Connecting the halves and Pin Swap
-Please note that `TX` of the master half has to be connected with the `RX` pin of the slave half and `RX` of the master half has to be connected with the `TX` pin of the slave half! Usually this pin swap has to be done outside of the MCU e.g. with cables or on the pcb. Some MCUs like the STM32F303 used on the Proton-C allow this pin swap directly inside the MCU, this feature can be enabled using `#define SERIAL_USART_PIN_SWAP` in your config.h.
+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 or the Full-duplex driver whenever possible. Due to its internal design it is slightly more efficient then the Half-duplex driver, but it should be primarily chosen if Half-duplex operation is not supported by the USART peripheral.
-#### Setup
-To use the driver, add this to your rules.mk:
+### Pin configuration
+
+```
+ LEFT RIGHT
++-------+ +-------+
+| | SERIAL | |
+| TX |-----------------| RX |
+| | SERIAL | |
+| RX |-----------------| TX |
+| | VDD | |
+| |-----------------| |
+| | GND | |
+| |-----------------| |
++-------+ +-------+
+```
+
+Two GPIO pins are needed for the Full-duplex driver, as two distinct wires are used for receiving and transmitting data. The pin transmitting data is the `TX` pin and refereed to as the `SERIAL_USART_TX_PIN`, the pin receiving data is the `RX` pin and refereed to as the `SERIAL_USART_RX_PIN` in this configuration. Please note that `TX` pin of the master half has to be connected with the `RX` pin of the slave half and the `RX` pin of the master half has to be connected with the `TX` pin of the slave half! Usually this pin swap has to be done outside of the MCU e.g. with cables or on the PCB. Some MCUs like the STM32F303 used on the Proton-C allow this pin swap directly inside the MCU. A simple TRRS or USB cable provides enough conductors for this driver to work.
+
+To use this driver the usart peripherals `TX` and `RX` pins must be configured with the correct Alternate-functions. If you are using a Proton-C everything is already setup, same is true for STM32F103 MCUs. For MCUs which are using a modern flexible GPIO configuration you have to specify these by setting `SERIAL_USART_TX_PAL_MODE` and `SERIAL_USART_RX_PAL_MODE`. Refer to the corresponding datasheets of your MCU or find those settings in the section ["Alternate Functions for selected STM32 MCUs"](#alternate-functions-for-selected-stm32-mcus).
+
+### Setup
+
+To use the Full-duplex driver follow these steps to activate it. If you target the Raspberry Pi RP2040 PIO implementation skip step 1.
+
+1. Change the `SERIAL_DRIVER` to `usart` in your keyboards `rules.mk` file:
```make
SERIAL_DRIVER = usart
```
-Next configure the hardware via your config.h:
+2. (RP2040 PIO only!) Change the `SERIAL_DRIVER` to `vendor` in your keyboards `rules.mk` file:
+
+```make
+SERIAL_DRIVER = vendor
+```
+
+3. Configure the hardware of your keyboard via the `config.h` file:
```c
#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode.
#define SERIAL_USART_TX_PIN B6 // USART TX pin
#define SERIAL_USART_RX_PIN B7 // USART RX pin
-//#define USART1_REMAP // Remap USART TX and RX pins on STM32F103 MCUs, see table below.
-//#define SERIAL_USART_PIN_SWAP // Swap TX and RX pins if keyboard is master halve.
- // Check if this feature is necessary with your keyboard design and available on the mcu.
-#define SELECT_SOFT_SERIAL_SPEED 1 // or 0, 2, 3, 4, 5
- // 0: 460800 baud
- // 1: 230400 baud (default)
- // 2: 115200 baud
- // 3: 57600 baud
- // 4: 38400 baud
- // 5: 19200 baud
-#define SERIAL_USART_DRIVER SD1 // USART driver of TX and RX pin. default: SD1
+```
+
+For STM32 MCUs several GPIO configuration options, including the ability for `TX` to `RX` pin swapping, can be changed as well. See the section ["Alternate Functions for selected STM32 MCUs"](alternate-functions-for-selected-stm32-mcus).
+
+```c
+#define SERIAL_USART_PIN_SWAP // Swap TX and RX pins if keyboard is master halve. (Only available on some MCUs)
+#define USART1_REMAP // Remap USART TX and RX pins on STM32F103 MCUs, see table below.
#define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
-#define SERIAL_USART_RX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
+```
+
+1. Decide either for `SERIAL`, `SIO` or `PIO` subsystem, see the section ["Choosing a driver subsystem"](#choosing-a-driver-subsystem).
+
+
+
+## Choosing a driver subsystem
+
+### The `SERIAL` driver
+
+The `SERIAL` Subsystem is supported for the majority of ChibiOS MCUs and should be used whenever supported. Follow these steps in order to activate it:
+
+1. In your keyboards `halconf.h` add:
+
+```c
+#define HAL_USE_SERIAL TRUE
+```
+
+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.
+
+Just below `#include_next ` add:
+
+```c
+#include_next
+
+#undef STM32_SERIAL_USE_USARTn
+#define STM32_SERIAL_USE_USARTn TRUE
+```
+
+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`.
+
+```c
+ #define SERIAL_USART_DRIVER SD3
+ ```
+
+### The `SIO` driver
+
+The `SIO` Subsystem was added to ChibiOS with the 21.11 release and is only supported on selected MCUs. It should only be chosen when the `SERIAL` subsystem is not supported by your MCU.
+
+Follow these steps in order to activate it:
+
+1. In your keyboards `halconf.h` add:
+
+```c
+#define HAL_USE_SIO TRUE
+```
+
+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.
+
+Just below `#include_next ` add:
+
+```c
+#include_next
+
+#undef STM32_SIO_USE_USARTn
+#define STM32_SIO_USE_USARTn TRUE
+```
+
+Where 'n' matches the peripheral number of your selected USART on the MCU.
+
+3. In you keyboards `config.h`: override the default USART `SIO` driver if you use a USART peripheral that does not belong to the default selected `SIOD1` driver. For instance, if you selected `STM32_SERIAL_USE_USART3` the matching driver would be `SIOD3`.
+
+```c
+ #define SERIAL_USART_DRIVER SIOD3
+ ```
+
+### The `PIO` driver
+
+The `PIO` subsystem is a Raspberry Pi RP2040 specific implementation, using the integrated PIO peripheral and is therefore only available on this MCU. Because of the flexible nature of the PIO peripherals, **any** GPIO pin can be used as a `TX` or `RX` pin. Half-duplex and Full-duplex operation is fully supported. The Half-duplex operation mode uses the built-in pull-ups and GPIO manipulation on the RP2040 to drive the line high by default. An external pull-up is therefore not necessary.
+
+Configure the hardware via your config.h:
+```c
+#define SERIAL_PIO_USE_PIO1 // Force the usage of PIO1 peripheral, by default the Serial implementation uses the PIO0 peripheral
+```
+
+The Serial PIO program uses 2 state machines, 13 instructions and the complete interrupt handler of the PIO peripheral it is running on.
+
+
+
+## Advanced Configuration
+
+There are several advanced configuration options that can be defined in your keyboards `config.h` file:
+
+### Baudrate
+
+If you're having issues or need a higher baudrate with serial communication, you can change the baudrate which in turn controls the communication speed for serial. You want to lower the baudrate if you experience failed transactions.
+
+```c
+#define SELECT_SOFT_SERIAL_SPEED {#}
+```
+
+| Speed | Bitbang | Half-duplex and Full-duplex |
+| ----- | -------------------------- | --------------------------- |
+| `0` | 189000 baud (experimental) | 460800 baud |
+| `1` | 137000 baud (default) | 230400 baud (default) |
+| `2` | 75000 baud | 115200 baud |
+| `3` | 39000 baud | 57600 baud |
+| `4` | 26000 baud | 38400 baud |
+| `5` | 20000 baud | 19200 baud |
+
+Alternatively you can specify the baudrate directly by defining `SERIAL_USART_SPEED`.
+
+### Timeout
+
+This is the default time window in milliseconds in which a successful communication has to complete. Usually you don't want to change this value. But you can do so anyways by defining an alternate one in your keyboards `config.h` file:
+
+```c
#define SERIAL_USART_TIMEOUT 20 // USART driver timeout. default 20
```
-You must also enable the ChibiOS `SERIAL` feature:
-* In your board's halconf.h: `#define HAL_USE_SERIAL TRUE`
-* In your board's mcuconf.h: `#define STM32_SERIAL_USE_USARTn TRUE` (where 'n' matches the peripheral number of your selected USART on the MCU)
+
-Do note that the configuration required is for the `SERIAL` peripheral, not the `UART` peripheral.
+## Troubleshooting
-#### Pins for USART Peripherals with Alternate Functions for selected STM32 MCUs
+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:
-##### STM32F303 / Proton-C [Datasheet](https://www.st.com/resource/en/datasheet/stm32f303cc.pdf)
+```c
+#define SERIAL_DEBUG
+```
+
+?> The messages will be printed out to the `CONSOLE` output. For additional information, refer to [Debugging/Troubleshooting QMK](faq_debug.md).
+
+## Alternate Functions for selected STM32 MCUs
+
+Pins for USART Peripherals with
+
+### STM32F303 / Proton-C [Datasheet](https://www.st.com/resource/en/datasheet/stm32f303cc.pdf)
Pin Swap available: :heavy_check_mark:
-| Pin | Function | Mode |
+| Pin | Function | Mode |
| ---------- | -------- | ---- |
| **USART1** | | |
| PA9 | TX | AF7 |
@@ -151,11 +323,11 @@ Pin Swap available: :heavy_check_mark:
| PD8 | TX | AF7 |
| PD9 | RX | AF7 |
-##### STM32F072 [Datasheet](https://www.st.com/resource/en/datasheet/stm32f072c8.pdf)
+### STM32F072 [Datasheet](https://www.st.com/resource/en/datasheet/stm32f072c8.pdf)
Pin Swap available: :heavy_check_mark:
-| Pin | Function | Mode |
+| Pin | Function | Mode |
| ------ | -------- | ---- |
| USART1 | | |
| PA9 | TX | AF1 |
@@ -180,7 +352,7 @@ Pin Swap available: :heavy_check_mark:
| PA0 | TX | AF4 |
| PA1 | RX | AF4 |
-##### STM32F103 Medium Density (C8-CB) [Datasheet](https://www.st.com/resource/en/datasheet/stm32f103c8.pdf)
+### STM32F103 Medium Density (C8-CB) [Datasheet](https://www.st.com/resource/en/datasheet/stm32f103c8.pdf)
Pin Swap available: N/A
@@ -190,7 +362,7 @@ Pin remapping:
The pins of USART Peripherals use default Pins that can be remapped to use other pins using the AFIO registers. Default pins are marked **bold**. Add the appropriate defines to your config.h file.
-| Pin | Function | Mode | USART_REMAP |
+| Pin | Function | Mode | USART_REMAP |
| ---------- | -------- | ---- | ------------------- |
| **USART1** | | | |
| **PA9** | TX | AFPP | |
diff --git a/docs/squeezing_avr.md b/docs/squeezing_avr.md
index bb8e460024..caf18002c0 100644
--- a/docs/squeezing_avr.md
+++ b/docs/squeezing_avr.md
@@ -192,6 +192,7 @@ That said, there are a number of Pro Micro replacements with ARM controllers:
* [Adafruit KB2040](https://learn.adafruit.com/adafruit-kb2040)
* [SparkFun Pro Micro - RP2040](https://www.sparkfun.com/products/18288)
* [Blok](https://boardsource.xyz/store/628b95b494dfa308a6581622)
+* [Elite-Pi](https://keeb.io/products/elite-pi-usb-c-pro-micro-replacement-rp2040)
There are other, non-Pro Micro compatible boards out there. The most popular being:
* [WeAct Blackpill F411](https://www.aliexpress.com/item/1005001456186625.html) (~$6 USD)
diff --git a/docs/tap_hold.md b/docs/tap_hold.md
index 601aef0493..8914b730b3 100644
--- a/docs/tap_hold.md
+++ b/docs/tap_hold.md
@@ -16,7 +16,7 @@ You can set the global time for this by adding the following setting to your `co
#define TAPPING_TERM 200
```
-This setting is defined in milliseconds, and does default to 200ms. This is a good average for a majority of people.
+This setting is defined in milliseconds and defaults to 200ms. This is a good average for the majority of people.
For more granular control of this feature, you can add the following to your `config.h`:
```c
@@ -42,15 +42,15 @@ uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
`DYNAMIC_TAPPING_TERM_ENABLE` is a feature you can enable in `rules.mk` that lets you use three special keys in your keymap to configure the tapping term on the fly.
-| Key | Description |
-|-------------|------------------------------------------------------------------------------------------------------------------------|
-| `DT_PRNT` | "Dynamic Tapping Term Print": Types the current tapping term, in milliseconds |
-| `DT_UP` | "Dynamic Tapping Term Up": Increases the current tapping term by `DYNAMIC_TAPPING_TERM_INCREMENT`ms (5ms by default) |
-| `DT_DOWN` | "Dynamic Tapping Term Down": Decreases the current tapping term by `DYNAMIC_TAPPING_TERM_INCREMENT`ms (5ms by default) |
+| Key | Aliases | Description |
+|-------------------------------|---------|-------------------------------------------------------------------------------------------|
+|`QK_DYNAMIC_TAPPING_TERM_PRINT`|`DT_PRNT`| Types the current tapping term, in milliseconds |
+|`QK_DYNAMIC_TAPPING_TERM_UP` |`DT_UP` | Increases the current tapping term by `DYNAMIC_TAPPING_TERM_INCREMENT`ms (5ms by default) |
+|`QK_DYNAMIC_TAPPING_TERM_DOWN` |`DT_DOWN`| Decreases the current tapping term by `DYNAMIC_TAPPING_TERM_INCREMENT`ms (5ms by default) |
Set the tapping term as usual with `#define TAPPING_TERM ` in `config.h` and add `DYNAMIC_TAPPING_TERM_ENABLE = yes` in `rules.mk`. Then, place the above three keys somewhere in your keymap and flash the new firmware onto your board.
-Now, you can try using your dual-role keys, such as layer-taps and mod-taps, and use `DT_DOWN` and `DT_UP` to adjust the tapping term immediately. If you find that you frequently trigger the modifier of your mod-tap(s) by accident for example, that's a sign that your tapping term may be too low so tap `DT_UP` a few times to increase the tapping term until that no longer happens. On the flip side, if you get superfluous characters when you actually intended to momentarily activate a layer, tap `DT_DOWN` to lower the tapping term. Do note that these keys affect the *global* tapping term, you cannot change the tapping term of a specific key on the fly.
+Now, you can try using your dual-role keys, such as layer-taps and mod-taps, and use `DT_DOWN` and `DT_UP` to adjust the tapping term immediately. If you find that you frequently trigger the modifier of your mod-tap(s) by accident, for example, that's a sign that your tapping term may be too low so tap `DT_UP` a few times to increase the tapping term until that no longer happens. On the flip side, if you get superfluous characters when you actually intended to momentarily activate a layer, tap `DT_DOWN` to lower the tapping term. Do note that these keys affect the *global* tapping term, you cannot change the tapping term of a specific key on the fly.
Once you're satisfied with the current tapping term value, open `config.h` and replace whatever value you first wrote for the tapping term by the output of the `DT_PRNT` key.
@@ -97,7 +97,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
In order for this feature to be effective if you use per-key tapping terms, you need to make a few changes to the syntax of the `get_tapping_term` function. All you need to do is replace every occurrence of `TAPPING_TERM` in the `get_tapping_term` function by lowercase `g_tapping_term`. If you don't do that, you will still see the value typed by `DT_PRNT` go up and down as you configure the tapping term on the fly but you won't feel those changes as they don't get applied. If you can go as low as 10ms and still easily trigger the tap function of a dual-role key, that's a sign that you forgot to make the necessary changes to your `get_tapping_term` function.
-For instance, here's how the example `get_tapping_term` shown earlier should look like after the transformation:
+For instance, here's how the example `get_tapping_term` shown earlier should look after the transformation:
```c
uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
@@ -112,7 +112,7 @@ uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
}
```
-The reason being that `TAPPING_TERM` is a macro that expands to a constant integer and thus cannot be changed at runtime whereas `g_tapping_term` is a variable whose value can be changed at runtime. If you want, you can temporarily enable `DYNAMIC_TAPPING_TERM_ENABLE` to find a suitable tapping term value and then disable that feature and revert back to using the classic syntax for per-key tapping term settings. In case you need to access the tapping term from elsewhere in your code, you can use the `GET_TAPPING_TERM(keycode, record)` macro. This macro will expand to whatever is the appropriate access pattern given the current configuration.
+The reason is that `TAPPING_TERM` is a macro that expands to a constant integer and thus cannot be changed at runtime whereas `g_tapping_term` is a variable whose value can be changed at runtime. If you want, you can temporarily enable `DYNAMIC_TAPPING_TERM_ENABLE` to find a suitable tapping term value and then disable that feature and revert back to using the classic syntax for per-key tapping term settings. In case you need to access the tapping term from elsewhere in your code, you can use the `GET_TAPPING_TERM(keycode, record)` macro. This macro will expand to whatever is the appropriate access pattern given the current configuration.
## Tap-Or-Hold Decision Modes
@@ -174,7 +174,7 @@ Example sequence 3 (Mod Tap):
| +--------------+ | |
+---------------------------|--------+
```
-Based previous examples, you might have expected the output of the above sequence to be `KC_A` `KC_X`
+Based on previous examples, you might have expected the output of the above sequence to be `KC_A` `KC_X`
since `SFT_T(KC_A)` is NOT held longer than the `TAPPING_TERM`.
However, the actual output would be capital `X` (`SHIFT` + `x`) due to reasons
explained under [Ignore Mod Tap Interrupt](#ignore-mod-tap-interrupt).
@@ -193,7 +193,7 @@ This makes tap and hold keys (like Layer Tap) work better for fast typists, or f
If you press a dual-role key, tap another key (press and release) and then release the dual-role key, all within the tapping term, by default the dual-role key will perform its tap action. If the `PERMISSIVE_HOLD` option is enabled, the dual-role key will perform its hold action instead.
-An example of a sequence which is affected by the “permissive hold” mode:
+An example of a sequence that is affected by the “permissive hold” mode:
- `LT(2, KC_A)` Down
- `KC_L` Down (the `L` key is also mapped to `KC_RGHT` on layer 2)
@@ -270,7 +270,7 @@ This mode makes tap and hold keys (like Layer Tap) work better for fast typists,
If you press a dual-role key, press another key, and then release the dual-role key, all within the tapping term, by default the dual-role key will perform its tap action. If the `HOLD_ON_OTHER_KEY_PRESS` option is enabled, the dual-role key will perform its hold action instead.
-An example of a sequence which is affected by the “hold on other key press” mode, but not by the “permissive hold” mode:
+An example of a sequence that is affected by the “hold on other key press” mode, but not by the “permissive hold” mode:
- `LT(2, KC_A)` Down
- `KC_L` Down (the `L` key is also mapped to `KC_RGHT` on layer 2)
@@ -325,11 +325,11 @@ To enable this setting, add this to your `config.h`:
?> This option affects only the Mod Tap keys; it does not affect other dual-role keys such as Layer Tap.
-By default the tap-or-hold decision for Mod Tap keys strongly prefers the hold action. If you press a Mod Tap key, then press another key while still holding the Mod Tap key down, the Mod Tap press will be handled as a modifier hold even if the Mod Tap key is then released within the tapping term, and irrespective of the order in which those keys are released. Using options such as `PERMISSIVE_HOLD` or `HOLD_ON_OTHER_KEY_PRESS` will not affect the functionality of Mod Tap keys in a major way (these options would still affect the delay until the common code for dual-role keys finishes its tap-or-hold decision, but then the special code for Mod Tap keys will override the result of that decision and choose the hold action if another key was pressed). In fact, by default the tap-or-hold decision for Mod Tap keys is done in the same way as if the `HOLD_ON_OTHER_KEY_PRESS` option was enabled, but without the decreased delay provided by `HOLD_ON_OTHER_KEY_PRESS`.
+By default, the tap-or-hold decision for Mod Tap keys strongly prefers the hold action. If you press a Mod Tap key, then press another key while still holding the Mod Tap key down, the Mod Tap press will be handled as a modifier hold even if the Mod Tap key is then released within the tapping term, and irrespective of the order in which those keys are released. Using options such as `PERMISSIVE_HOLD` or `HOLD_ON_OTHER_KEY_PRESS` will not affect the functionality of Mod Tap keys in a major way (these options would still affect the delay until the common code for dual-role keys finishes its tap-or-hold decision, but then the special code for Mod Tap keys will override the result of that decision and choose the hold action if another key was pressed). In fact, by default, the tap-or-hold decision for Mod Tap keys is done in the same way as if the `HOLD_ON_OTHER_KEY_PRESS` option was enabled, but without the decreased delay provided by `HOLD_ON_OTHER_KEY_PRESS`.
If the `IGNORE_MOD_TAP_INTERRUPT` option is enabled, Mod Tap keys are no longer treated as a special case, and their behavior will match the behavior of other dual-role keys such as Layer Tap. Then the behavior of Mod Tap keys can be further tuned using other options such as `PERMISSIVE_HOLD` or `HOLD_ON_OTHER_KEY_PRESS`.
-An example of a sequence which will be affected by the `IGNORE_MOD_TAP_INTERRUPT` option (assuming that options like `PERMISSIVE_HOLD` or `HOLD_ON_OTHER_KEY_PRESS` are not enabled):
+An example of a sequence that will be affected by the `IGNORE_MOD_TAP_INTERRUPT` option (assuming that options like `PERMISSIVE_HOLD` or `HOLD_ON_OTHER_KEY_PRESS` are not enabled):
- `SFT_T(KC_A)` Down
- `KC_X` Down
@@ -350,7 +350,7 @@ An example of a sequence which will be affected by the `IGNORE_MOD_TAP_INTERRUPT
Normally, this would send a capital `X` (`SHIFT`+`x`), even if the sequence is performed faster than the `TAPPING_TERM`. However, if the `IGNORE_MOD_TAP_INTERRUPT` option is enabled, the `SFT_T(KC_A)` key must be held longer than the `TAPPING_TERM` to register the hold action. A quick tap will output `ax` in this case, while a hold will still output a capital `X` (`SHIFT`+`x`).
-However, if the `HOLD_ON_OTHER_KEY_PRESS` option is enabled in addition to `IGNORE_MOD_TAP_INTERRUPT`, the above sequence will again send a capital `X` (`SHIFT`+`x`) even if performed faster that the `TAPPING_TERM`. The difference from the default configuration is that by default the host will receive the key events only after the `SFT_T(KC_A)` key is released, but with the `HOLD_ON_OTHER_KEY_PRESS` option the host will start receiving key events when the `KC_X` key is pressed.
+However, if the `HOLD_ON_OTHER_KEY_PRESS` option is enabled in addition to `IGNORE_MOD_TAP_INTERRUPT`, the above sequence will again send a capital `X` (`SHIFT`+`x`) even if performed faster than the `TAPPING_TERM`. The difference from the default configuration is that by default the host will receive the key events only after the `SFT_T(KC_A)` key is released, but with the `HOLD_ON_OTHER_KEY_PRESS` option, the host will start receiving key events when the `KC_X` key is pressed.
For more granular control of this feature, you can add the following to your `config.h`:
@@ -393,7 +393,7 @@ Example:
- wait until the tapping term expires...
- `SFT_T(KC_A)` Up
-With default settings, `a` will be sent on the first release, then `a` will be sent on the second press allowing the computer to trigger its auto repeat function.
+With default settings, `a` will be sent on the first release, then `a` will be sent on the second press allowing the computer to trigger its auto-repeat function.
With `TAPPING_FORCE_HOLD`, the second press will be interpreted as a Shift, allowing to use it as a modifier shortly after having used it as a tap.
@@ -426,7 +426,7 @@ To enable `retro tapping`, add the following to your `config.h`:
#define RETRO_TAPPING
```
-Holding and releasing a dual function key without pressing another key will result in nothing happening. With retro tapping enabled, releasing the key without pressing another will send the original keycode even if it is outside the tapping term.
+Holding and releasing a dual-function key without pressing another key will result in nothing happening. With retro tapping enabled, releasing the key without pressing another will send the original keycode even if it is outside the tapping term.
For instance, holding and releasing `LT(2, KC_SPC)` without hitting another key will result in nothing happening. With this enabled, it will send `KC_SPC` instead.
@@ -469,8 +469,8 @@ bool get_retro_tapping(uint16_t keycode, keyrecord_t *record) {
One thing that you may notice is that we include the key record for all of the "per key" functions, and may be wondering why we do that.
-Well, it's simple really: customization. But specifically, it depends on how your keyboard is wired up. For instance, if each row is actually using a row in the keyboard's matrix, then it may be simpler to use `if (record->event.row == 3)` instead of checking a whole bunch of keycodes. Which is especially good for those people using the Tap Hold type keys on the home row. So you could fine tune those to not interfere with your normal typing.
+Well, it's simple really: customization. But specifically, it depends on how your keyboard is wired up. For instance, if each row is actually using a row in the keyboard's matrix, then it may be simpler to use `if (record->event.row == 3)` instead of checking a whole bunch of keycodes. Which is especially good for those people using the Tap Hold type keys on the home row. So you could fine-tune those to not interfere with your normal typing.
-## Why is there no `*_kb` or `*_user` functions?!
+## Why are there no `*_kb` or `*_user` functions?!
-Unlike many of the other functions here, there isn't a need (or even reason) to have a quantum or keyboard level function. Only user level functions are useful here, so no need to mark them as such.
+Unlike many of the other functions here, there isn't a need (or even reason) to have a quantum or keyboard-level function. Only user-level functions are useful here, so no need to mark them as such.
diff --git a/docs/understanding_qmk.md b/docs/understanding_qmk.md
index 9b80fb179e..ab7834e24a 100644
--- a/docs/understanding_qmk.md
+++ b/docs/understanding_qmk.md
@@ -71,7 +71,7 @@ At the keyboard level we define a C macro (typically named `LAYOUT()`) which map
Notice how the second block of our `LAYOUT()` macro matches the Matrix Scanning array above? This macro is what will map the matrix scanning array to keycodes. However, if you look at a 17 key numpad you'll notice that it has 3 places where the matrix could have a switch but doesn't, due to larger keys. We have populated those spaces with `KC_NO` so that our keymap definition doesn't have to.
-You can also use this macro to handle unusual matrix layouts, for example the [Clueboard rev 2](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/keyboards/clueboard/66/rev2/rev2.h). Explaining that is outside the scope of this document.
+You can also use this macro to handle unusual matrix layouts, for example the [Alice](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/keyboards/sneakbox/aliceclone/aliceclone.h#L24). Explaining that is outside the scope of this document.
##### Keycode Assignment
@@ -127,40 +127,51 @@ Comparing against our keymap we can see that the pressed key is `KC_NUM`. From h
The `process_record()` function itself is deceptively simple, but hidden within is a gateway to overriding functionality at various levels of QMK. The chain of events is listed below, using cluecard whenever we need to look at the keyboard/keymap level functions. Depending on options set in `rules.mk` or elsewhere, only a subset of the functions below will be included in final firmware.
-* [`void action_exec(keyevent_t event)`](https://github.com/qmk/qmk_firmware/blob/88fe5c16a5cdca5e3cf13ef3cd91f5f1e4898c37/quantum/action.c#L70-L131)
- * [`void pre_process_record_quantum(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/ed49dbeac4c0deba1c6b511ac1ce8f4c542e1b3e/quantum/quantum.c#L176-L185)
- * [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_combo.c#L115)
- * [`void process_record(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/tmk_core/common/action.c#L172)
- * [`bool process_record_quantum(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L206)
- * [Map this record to a keycode](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L226)
- * [`void velocikey_accelerate(void)`](https://github.com/qmk/qmk_firmware/blob/c1c5922aae7b60b7c7d13d3769350eed9dda17ab/quantum/velocikey.c#L27)
- * [`void preprocess_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_tap_dance.c#L119)
- * [`bool process_key_lock(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_key_lock.c#L62)
- * [`bool process_clicky(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_clicky.c#L79)
- * [`bool process_haptic(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/2cee371bf125a6ec541dd7c5a809573facc7c456/drivers/haptic/haptic.c#L216)
- * [`bool process_record_kb(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/keyboards/clueboard/card/card.c#L20)
- * [`bool process_record_user(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/keyboards/clueboard/card/keymaps/default/keymap.c#L58)
- * [`bool process_midi(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_midi.c#L81)
- * [`bool process_audio(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_audio.c#L19)
- * [`bool process_steno(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_steno.c#L160)
- * [`bool process_music(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_music.c#L114)
+* [`void action_exec(keyevent_t event)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/action.c#L78-L140)
+ * [`void pre_process_record_quantum(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/quantum.c#L204)
+ * [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_combo.c#L521)
+ * [`void process_record(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/action.c#L254)
+ * [`bool process_record_quantum(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/quantum.c#L224)
+ * [Map this record to a keycode](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/quantum.c#L225)
+ * [`void velocikey_accelerate(void)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/velocikey.c#L27)
+ * [`void update_wpm(uint16_t keycode)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/wpm.c#L109)
+ * [`void preprocess_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_tap_dance.c#L118)
+ * [`bool process_key_lock(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_key_lock.c#L64)
+ * [`bool process_dynamic_macro(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_dynamic_macro.c#L160)
+ * [`bool process_clicky(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_clicky.c#L84)
+ * [`bool process_haptic(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_haptic.c#L87)
+ * [`bool process_record_via(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/via.c#L160)
+ * [`bool process_record_kb(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/keyboards/planck/ez/ez.c#L271)
+ * [`bool process_record_user(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/keyboards/planck/keymaps/default/keymap.c#L183)
+ * [`bool process_secure(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_secure.c#L23)
+ * [`bool process_sequencer(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_sequencer.c#L19)
+ * [`bool process_midi(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_midi.c#L75)
+ * [`bool process_audio(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_audio.c#L18)
+ * [`bool process_backlight(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_backlight.c#L25)
+ * [`bool process_steno(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_steno.c#L159)
+ * [`bool process_music(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_music.c#L103)
* [`bool process_key_override(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/5a1b857dea45a17698f6baa7dd1b7a7ea907fb0a/quantum/process_keycode/process_key_override.c#L397)
- * [`bool process_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_tap_dance.c#L141)
- * [`bool process_unicode_common(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_unicode_common.c#L169)
+ * [`bool process_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_tap_dance.c#L135)
+ * [`bool process_caps_word(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_caps_word.c#L17)
+ * [`bool process_unicode_common(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_unicode_common.c#L290)
calls one of:
- * [`bool process_unicode(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_unicode.c#L20)
- * [`bool process_unicodemap(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_unicodemap.c#L46)
- * [`bool process_ucis(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_ucis.c#L95)
- * [`bool process_leader(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_leader.c#L51)
- * [`bool process_printer(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_printer.c#L77)
- * [`bool process_auto_shift(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_auto_shift.c#L94)
- * `bool process_dynamic_tapping_term(uint16_t keycode, keyrecord_t *record)`
- * [`bool process_terminal(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_terminal.c#L264)
- * [Identify and process Quantum-specific keycodes](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L291)
+ * [`bool process_unicode(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_unicode.c#L21)
+ * [`bool process_unicodemap(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_unicodemap.c#L42)
+ * [`bool process_ucis(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_ucis.c#L70)
+ * [`bool process_leader(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_leader.c#L48)
+ * [`bool process_auto_shift(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_auto_shift.c#L353)
+ * [`bool process_dynamic_tapping_term(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_dynamic_tapping_term.c#L35)
+ * [`bool process_space_cadet(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_space_cadet.c#L123)
+ * [`bool process_magic(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_magic.c#L40)
+ * [`bool process_grave_esc(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_grave_esc.c#L23)
+ * [`bool process_rgb(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_rgb.c#L53)
+ * [`bool process_joystick(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_joystick.c#L9)
+ * [`bool process_programmable_button(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/process_keycode/process_programmable_button.c#L21)
+ * [Identify and process Quantum-specific keycodes](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/quantum/quantum.c#L343)
At any step during this chain of events a function (such as `process_record_kb()`) can `return false` to halt all further processing.
-After this is called, `post_process_record()` is called, which can be used to handle additional cleanup that needs to be run after the keycode is normally handled.
+After this is called, `post_process_record()` is called, which can be used to handle additional cleanup that needs to be run after the keycode is normally handled.
* [`void post_process_record(keyrecord_t *record)`]()
* [`void post_process_record_quantum(keyrecord_t *record)`]()
@@ -168,7 +179,7 @@ After this is called, `post_process_record()` is called, which can be used to ha
* [`void post_process_clicky(uint16_t keycode, keyrecord_t *record)`]()
* [`void post_process_record_kb(uint16_t keycode, keyrecord_t *record)`]()
* [`void post_process_record_user(uint16_t keycode, keyrecord_t *record)`]()
-
+
-
-Mnemes Swedish Bonanza
-=======================
-
-My Layout in process, most of the code is shamelessly stolen from [algernons][algernon] excellent layout
-
- [algernon]: https://github.com/algernon/ergodox-layout
-
-It's for Windows (current work forces me to) and Swedish (matter of birth) so ymmw.
-
-## Table of Contents
-
-* [Layouts](#layouts)
- - [Base layer](#base-layer)
- - [Nav layer](#nav-layer)
- - [Sym layer](#sym-layer)
- - [LED states](#led-states)
-
-# Layouts
-
-## Base layer
-
-![Base layer](http://imgur.com/zTYxnE0)
-
-
-* The number row doubles as a function row. Short presses produces numbers, long presses produces Fxx
-* The `Shift`, `Alt`, and `Control` modifiers are one-shot.
-* `Backspace` and `Enter` doubles as switches to the `sym` layer when held
-* The `ESC` key also doubles as a one-shot cancel key.
-* The **Lead** key is followed by a sequence of keys.
- - `LEAD l` : `lgui+l`.
- - `LEAD s l` : `λ`.
- - `LEAD s s` : `¯\_(ツ)_/¯`
- - `LEAD s f` : `凸(ツ)凸`
- - `LEAD u l` : Set unicode input mode to linux.
- - `LEAD s w` : Set unicode input mode to windows.
- - `LEAD a *` : Application switching based on position in start menu. Very specific to my computer.
-
-
-## Nav layer
-
-![Nav layer](http://imgur.com/cbMWVDC)
-
-Basic navigation on the right hand and modifiers close
-by for the left. The latter because I tend to use `ctrl+arrows` quite a lot.
-
-## Sym layer
-
-![Sym layer](http://imgur.com/n2jmqFU)
-
-* Easy access to most symbols I use on a daily basis. Most common are on the home row, the rest are grouped as best as I could.
-
-- `eq` : Tapdance, produces `===` and `!==`
-- `fun`: Tapdance, produces `=>` and `() => {\n`
-
-# License
- GPL-3+
diff --git a/keyboards/atreus62/keymaps/mneme/config.h b/keyboards/atreus62/keymaps/mneme/config.h
deleted file mode 100644
index a89bf5503c..0000000000
--- a/keyboards/atreus62/keymaps/mneme/config.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#define ONESHOT_TIMEOUT 3000
-#define TAPPING_TERM 200
-#define FORCE_NKRO
-#define LEADER_TIMEOUT 1000
-
-#include "../../config.h"
diff --git a/keyboards/atreus62/keymaps/mneme/keymap.c b/keyboards/atreus62/keymaps/mneme/keymap.c
deleted file mode 100644
index e76751c335..0000000000
--- a/keyboards/atreus62/keymaps/mneme/keymap.c
+++ /dev/null
@@ -1,337 +0,0 @@
-#include
-#include QMK_KEYBOARD_H
-#include "led.h"
-#include "action_layer.h"
-#include "action_util.h"
-
-/*
- *WINDOWS SWEDISH
- */
- /*
- *WINDOWS SWEDISH
- */
- #define KN_HALF KC_GRV // 1/2
- #define KN_PLUS KC_MINS // +
- #define KN_ACUT KC_EQL // ´
- #define KN_AO KC_LBRC // Å
- #define KN_UMLA KC_RBRC // ¨
- #define KN_OE KC_SCLN // Ö
- #define KN_AE KC_QUOT // Ä
- #define KN_QUOT KC_NUHS // '
- #define KN_LABK KC_NUBS // <
- #define KN_MINS KC_SLSH // -
- #define KN_EXLM LSFT(KC_1) // !
- #define KN_DQT LSFT(KC_2) // "
- #define KN_AT RALT(KC_2) // @
- #define KN_HASH LSFT(KC_3) // #
- #define KN_EUR LSFT(KC_4) // €
- #define KN_DLR RALT(KC_4) // $
- #define KN_PERC LSFT(KC_5) // %
- #define KN_AMPR LSFT(KC_6) // &
- #define KN_SLSH LSFT(KC_7) // /
- #define KN_LPRN LSFT(KC_8) // (
- #define KN_RPRN LSFT(KC_9) // )
- #define KN_EQL LSFT(KC_0) // =
- #define KN_UNDS LSFT(KN_MINS) // _
- #define KN_QUES LSFT(KN_PLUS) // ?
- #define KN_GRAV LSFT(KN_ACUT) // `
- #define KN_LCBR RALT(KC_7) // {
- #define KN_RCBR RALT(KC_0) // }
- #define KN_LBRC RALT(KC_8) // [
- #define KN_RBRC RALT(KC_9) // ]
- #define KN_RABK LSFT(KN_LABK) // <
- #define KN_COLN LSFT(KC_DOT) // :
- #define KN_SCLN LSFT(KC_COMM) // :
- #define KN_PIPE RALT(KN_LABK) // |
- #define KN_QUES LSFT(KN_PLUS) // ?
- #define KN_CIRC LSFT(KN_UMLA) // ^
- #define KN_ASTR LSFT(KN_QUOT) // *
- #define KN_TILD RALT(KN_UMLA) // ~
- #define KN_BSLS RALT(KN_PLUS) //
-
-#define OSM_LCTL OSM(MOD_LCTL)
-#define OSM_LALT OSM(MOD_LALT)
-#define OSM_LSFT OSM(MOD_LSFT)
-
-#define KC_HYP LSFT(LALT(LCTL(KC_LGUI)))
-
-#define KC_COPY LCTL(KC_C)
-#define KC_PASTE LCTL(KC_V)
-#define KC_UNDO LCTL(KC_Z)
-#define KC_REDO LCTL(LSFT(KC_Z))
-
-// Layers
-enum {
- BASE = 0,
- NAV,
- SYM
-};
-
-//Macros
-enum {
- KF_1 = 0, // 1, F1
- KF_2, // ...
- KF_3,
- KF_4,
- KF_5,
- KF_6,
- KF_7,
- KF_8,
- KF_9,
- KF_10,
- KF_11,
- KF_12
-};
-
-// Tapdance
-enum {
- TD_FUN = 0,
- TD_EQ
-};
-
-//State and timers
-uint16_t kf_timers[12];
-
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-
- [BASE] = LAYOUT(
- M(KF_11), M(KF_1), M(KF_2), M(KF_3), M(KF_4), M(KF_5), M(KF_6), M(KF_7), M(KF_8), M(KF_9), M(KF_10), M(KF_12),
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KN_AO,
- OSM_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KN_OE, KN_AE,
- OSM_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KN_MINS, OSM_LSFT,
- MO(NAV), OSM_LCTL, OSM_LALT, KC_LGUI, MO(SYM), KC_BSPC, KC_DEL, KC_ENT, KC_SPC, MO(SYM), KC_LEAD, KC_LALT, KC_LCTRL, KC_HYP
- ),
-
- [NAV] = LAYOUT(
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_LSFT, KC_LCTL, KC_LALT, KC_L, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU
- ),
-
- [SYM] = LAYOUT(
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TD(TD_EQ), TD(TD_FUN), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KN_LABK, KN_RABK, KN_LCBR, KN_RCBR, KN_PLUS, KN_AT, KN_DQT, KN_QUOT, KN_GRAV, KN_SLSH, KC_TRNS,
- KC_TRNS, KN_EXLM, KN_EQL, KN_LPRN, KN_RPRN, KN_MINS, KN_UNDS, KN_CIRC, KN_DLR, KN_AMPR, KN_PIPE, KC_TRNS,
- KC_TRNS, KN_EUR, KN_PERC, KN_LBRC, KN_RBRC, KN_ASTR, KN_HASH, KN_SCLN, KN_COLN, KN_QUES, KN_BSLS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
- )
-};
-
-#define TAP_ONCE(code) \
- register_code (code); \
- unregister_code (code)
-
-static void m_tapn (uint8_t code, ...) {
- uint8_t kc = code;
- va_list ap;
-
- va_start(ap, code);
- do {
- register_code(kc);
- unregister_code(kc);
- wait_ms(50);
- kc = va_arg(ap, int);
- } while (kc != 0);
- va_end(ap);
-}
-
-static void m_handle_kf (keyrecord_t *record, uint8_t id) {
- uint8_t code = id - KF_1;
-
- if (record->event.pressed) {
- kf_timers[code] = timer_read ();
- } else {
- uint8_t kc_base;
- uint8_t long_press = (kf_timers[code] && timer_elapsed (kf_timers[code]) > TAPPING_TERM);
-
- kf_timers[code] = 0;
-
- switch(id){
- case KF_1 ... KF_10:
- if (long_press) {
- // Long press
- kc_base = KC_F1;
- } else {
- kc_base = KC_1;
- }
- code += kc_base;
- break;
- case KF_11:
- code = long_press ? KC_F11 : KC_ESC;
- break;
- case KF_12:
- code = long_press ? KC_F12 : KN_PLUS;
- break;
- }
- register_code (code);
- unregister_code (code);
- }
-}
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
- switch (id) {
- case KF_1 ... KF_12:
- m_handle_kf(record, id);
- break;
- }
- return MACRO_NONE;
-};
-
-// Custom keycodes
-bool process_record_user(uint16_t keycode, keyrecord_t *record) {
- bool queue = true;
-
- //Cancle one-shot mods.
- switch (keycode) {
- case KC_ESC:
- if (record->event.pressed && get_oneshot_mods() && !has_oneshot_mods_timed_out()) {
- clear_oneshot_mods();
- queue = false;
- }
- break;
- }
- return queue;
-}
-
-// TAP DANCE SETTINGS
-void dance_eq (qk_tap_dance_state_t *state, void *user_data) {
- switch (state->count) {
- case 1: // ===
- register_code(KC_LSHIFT);
- m_tapn(KC_0, KC_0, KC_0, 0);
- unregister_code(KC_LSHIFT);
- break;
- case 2:
- register_code(KC_LSHIFT);
- m_tapn(KC_1, KC_0, KC_0, 0);
- unregister_code(KC_LSHIFT);
- break;
- default:
- reset_tap_dance(state);
- }
-}
-
-void dance_fun (qk_tap_dance_state_t *state, void *user_data) {
- switch (state->count) {
- case 1: // =>
- register_code(KC_LSHIFT);
- m_tapn(KC_0, KN_LABK, 0);
- unregister_code(KC_LSHIFT);
- break;
- case 2: // () => {}
- register_code(KC_LSHIFT);
- m_tapn(KC_8, KC_9, KC_SPC, KC_0, KN_LABK, KC_SPC, 0);
- unregister_code(KC_LSHIFT);
- register_code(KC_RALT);
- m_tapn(KC_7, 0);
- unregister_code(KC_RALT);
- TAP_ONCE(KC_ENT);
- break;
- default:
- reset_tap_dance(state);
- }
-}
-
-qk_tap_dance_action_t tap_dance_actions[] = {
- [TD_FUN] = ACTION_TAP_DANCE_FN (dance_fun),
- [TD_EQ] = ACTION_TAP_DANCE_FN (dance_eq)
-};
-
-// Runs just one time when the keyboard initializes.
-void matrix_init_user(void) {
- set_unicode_input_mode(UC_WINC);
-};
-
-LEADER_EXTERNS();
-// Runs constantly in the background, in a loop.
-void matrix_scan_user(void) {
- LEADER_DICTIONARY() {
- leading = false;
- leader_end();
- SEQ_ONE_KEY(KC_L){
- register_code(KC_RGUI);
- TAP_ONCE(KC_L);
- unregister_code(KC_RGUI);
- };
-
-
- SEQ_TWO_KEYS (KC_A, KC_W) {
- //Web - chrome
- register_code (KC_LGUI); TAP_ONCE (KC_1); unregister_code (KC_LGUI);
- }
- SEQ_TWO_KEYS (KC_A, KC_P) {
- //sPotify
- register_code (KC_LGUI); TAP_ONCE (KC_2); unregister_code (KC_LGUI);
-
- }
- SEQ_TWO_KEYS (KC_A, KC_T) {
- //Total Commander
- register_code (KC_LGUI); TAP_ONCE (KC_3); unregister_code (KC_LGUI);
-
- }
- SEQ_TWO_KEYS (KC_A, KC_A) {
- //Atom
- register_code (KC_LGUI); TAP_ONCE (KC_4); unregister_code (KC_LGUI);
-
- }
- SEQ_TWO_KEYS (KC_A, KC_E) {
- //Emacs
- register_code (KC_LGUI); TAP_ONCE (KC_5); unregister_code (KC_LGUI);
-
- }
- SEQ_TWO_KEYS (KC_A, KC_C) {
- //Cmdr
- register_code (KC_LGUI); TAP_ONCE (KC_6); unregister_code (KC_LGUI);
-
- }
- SEQ_TWO_KEYS (KC_A, KC_S) {
- //Slack
- register_code (KC_LGUI); TAP_ONCE (KC_7); unregister_code (KC_LGUI);
- }
-
- SEQ_TWO_KEYS (KC_U, KC_L) {
- set_unicode_input_mode(UC_LNX);
- }
-
-
- SEQ_TWO_KEYS (KC_U, KC_W) {
- set_unicode_input_mode(UC_WINC);
- }
-
-
- SEQ_TWO_KEYS (KC_S, KC_S) {
- // ¯\_(ツ)_/¯
- unicode_input_start(); register_hex(0xaf); unicode_input_finish();
- register_code (KC_LALT);
- register_code (KC_LCTL);
- TAP_ONCE (KN_PLUS);
- unregister_code (KC_LCTL);
- unregister_code (KC_LALT);
-
- register_code (KC_RSFT); TAP_ONCE (KC_8); unregister_code (KC_RSFT);
- unicode_input_start (); register_hex(0x30c4); unicode_input_finish();
- register_code (KC_RSFT); TAP_ONCE (KC_9); TAP_ONCE(KC_7); unregister_code (KC_RSFT);
- unicode_input_start (); register_hex(0xaf); unicode_input_finish();
- }
-
- SEQ_TWO_KEYS (KC_S, KC_F) {
- // 凸(ツ)凸
- unicode_input_start(); register_hex(0x51F8); unicode_input_finish();
- register_code (KC_RSFT); TAP_ONCE (KC_8); unregister_code (KC_RSFT);
- unicode_input_start (); register_hex(0x30c4); unicode_input_finish();
- register_code (KC_RSFT); TAP_ONCE (KC_9); unregister_code (KC_RSFT);
- unicode_input_start (); register_hex(0x51F8); unicode_input_finish();
- }
-
- SEQ_TWO_KEYS (KC_S, KC_L) {
- // λ
- unicode_input_start();
- register_hex(0x03bb);
- unicode_input_finish();
- }
- };
-};
diff --git a/keyboards/atreus62/keymaps/mneme/rules.mk b/keyboards/atreus62/keymaps/mneme/rules.mk
deleted file mode 100644
index 160ce6edbf..0000000000
--- a/keyboards/atreus62/keymaps/mneme/rules.mk
+++ /dev/null
@@ -1,6 +0,0 @@
-TAP_DANCE_ENABLE = yes
-NKRO_ENABLE = true
-MOUSEKEY_ENABLE = no
-EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = no
-LEADER_ENABLE = yes
diff --git a/keyboards/atreus62/keymaps/mneme/unicode b/keyboards/atreus62/keymaps/mneme/unicode
deleted file mode 100644
index b3f62b6d31..0000000000
--- a/keyboards/atreus62/keymaps/mneme/unicode
+++ /dev/null
@@ -1,114 +0,0 @@
-Todo
-☐ 2610 Todo
-☑ 2611 Done
-☒ 2612 Failed
-
-Operator
-× 00D7 Multiplication
-÷ 00F7 Division
-≤ 2264 LessEqual
-≥ 2265 MoreEqual
-± 00B1 Plusminus
-
-Math
-∏ 220F Product
-∑ 2211 Sum
-≈ 2248 Almost
-≡ 2261 Equivalent
-∞ 221E Infinity
-‰ 2030 Mille
-
-Set
-⊂ 2282 Subset
-⊃ 2283 sUperset
-∩ 2229 Intersextion
-∪ 222A Union
-∈ 2208 Element
-∉ 2209 Notelement
-∍ 220D Contains
-∌ 220C doesNotcontain
-
-Logic
-¬ 00AC Not
-∧ 2227 And
-∨ 2228 Or
-∃ 2203 Exists
-∄ 2204 Notexists
-
-Greek
-µ 00B5 Micro
-λ 03BB Lamda
-Ω 2126 Omega
-α 03B1 Alpha
-β 03B2 Beta
-γ 03B3 Gamma
-π 03C0 Pi
-δ 03B4 Delta
-
-Other
-☁ 2601 Cloud
-☼ 263C Sun
-☂ 2602 Rain
-☠ 2620 Skull
-♺ 267A Recycle
-👍1F44D thumbsUp
-👎1F44E thumbsDown
-💩 1F4A9 Poo
-
-
-//Todo
-SEQ_THREE_KEYS(KC_U, KC_G, KC_T){m_unicode(0x2610);}; // Todo
-SEQ_THREE_KEYS(KC_U, KC_G, KC_D){m_unicode(0x2611);}; // Done
-SEQ_THREE_KEYS(KC_U, KC_G, KC_F){m_unicode(0x2612);}; // Failed
-
-//Operator
-SEQ_THREE_KEYS(KC_U, KC_O, KC_M){m_unicode(0x00D7);}; // Multiplication
-SEQ_THREE_KEYS(KC_U, KC_O, KC_D){m_unicode(0x00F7);}; // Division
-SEQ_THREE_KEYS(KC_U, KC_O, KC_L){m_unicode(0x2264);}; // LessEqual
-SEQ_THREE_KEYS(KC_U, KC_O, KC_M){m_unicode(0x2265);}; // MoreEqual
-SEQ_THREE_KEYS(KC_U, KC_O, KC_P){m_unicode(0x00B1);}; // Plusminus
-
-//Math
-SEQ_THREE_KEYS(KC_U, KC_M, KC_P){m_unicode(0x220F);}; // Product
-SEQ_THREE_KEYS(KC_U, KC_M, KC_S){m_unicode(0x2211);}; // Sum
-SEQ_THREE_KEYS(KC_U, KC_M, KC_A){m_unicode(0x2248);}; // Almost
-SEQ_THREE_KEYS(KC_U, KC_M, KC_E){m_unicode(0x2261);}; // Equivalent
-SEQ_THREE_KEYS(KC_U, KC_M, KC_I){m_unicode(0x221E);}; // Infinity
-SEQ_THREE_KEYS(KC_U, KC_M, KC_M){m_unicode(0x2030);}; // Mille
-
-//Set
-SEQ_THREE_KEYS(KC_U, KC_S, KC_S){m_unicode(0x2282);}; Subset
-SEQ_THREE_KEYS(KC_U, KC_S, KC_P){m_unicode(0x2283);}; suPerset
-SEQ_THREE_KEYS(KC_U, KC_S, KC_I){m_unicode(0x2229);}; Intersection
-SEQ_THREE_KEYS(KC_U, KC_S, KC_U){m_unicode(0x222A);}; Union
-SEQ_THREE_KEYS(KC_U, KC_S, KC_E){m_unicode(0x2208);}; Element
-SEQ_THREE_KEYS(KC_U, KC_S, KC_N){m_unicode(0x2209);}; Notelement
-SEQ_THREE_KEYS(KC_U, KC_S, KC_C){m_unicode(0x220D);}; Contains
-SEQ_THREE_KEYS(KC_U, KC_S, KC_D){m_unicode(0x220C);}; doesNotcontain
-
-//Logic
-SEQ_THREE_KEYS(KC_U, KC_L, KC_N){m_unicode(0x00AC);}; // Not
-SEQ_THREE_KEYS(KC_U, KC_L, KC_A){m_unicode(0x2227);}; // And
-SEQ_THREE_KEYS(KC_U, KC_L, KC_O){m_unicode(0x2228);}; // Or
-SEQ_THREE_KEYS(KC_U, KC_L, KC_E){m_unicode(0x2203);}; // Exists
-SEQ_THREE_KEYS(KC_U, KC_L, KC_N){m_unicode(0x2204);}; // Notexists
-
-//Greek
-SEQ_THREE_KEYS(KC_U, KC_G, KC_M){m_unicode(0x00B5);}; // Micro
-SEQ_THREE_KEYS(KC_U, KC_G, KC_L){m_unicode(0x03BB);}; // Lamda
-SEQ_THREE_KEYS(KC_U, KC_G, KC_O){m_unicode(0x2126);}; // Omega
-SEQ_THREE_KEYS(KC_U, KC_G, KC_A){m_unicode(0x03B1);}; // Alpha
-SEQ_THREE_KEYS(KC_U, KC_G, KC_B){m_unicode(0x03B2);}; // Beta
-SEQ_THREE_KEYS(KC_U, KC_G, KC_G){m_unicode(0x03B3);}; // Gamma
-SEQ_THREE_KEYS(KC_U, KC_G, KC_P){m_unicode(0x03C0);}; // Pi
-SEQ_THREE_KEYS(KC_U, KC_G, KC_D){m_unicode(0x03B4);}; // Delta
-
-//Zother
-SEQ_THREE_KEYS(KC_U, KC_Z, KC_C){m_unicode(0x2601);}; // Cloud
-SEQ_THREE_KEYS(KC_U, KC_Z, KC_S){m_unicode(0x263C);}; // Sun
-SEQ_THREE_KEYS(KC_U, KC_Z, KC_R){m_unicode(0x2602);}; // Rain
-SEQ_THREE_KEYS(KC_U, KC_Z, KC_K){m_unicode(0x2620);}; // sKull
-SEQ_THREE_KEYS(KC_U, KC_Z, KC_R){m_unicode(0x267A);}; // rEcycle
-SEQ_THREE_KEYS(KC_U, KC_Z, KC_U){m_unicode(0x1F44D);}; // thumbsUp
-SEQ_THREE_KEYS(KC_U, KC_Z, KC_D){m_unicode(0x1F44E);}; // thumbsDown
-SEQ_THREE_KEYS(KC_U, KC_Z, KC_P){m_unicode(0x1F4A9);}; // Poo
diff --git a/keyboards/atreus62/keymaps/pcewing/keymap.c b/keyboards/atreus62/keymaps/pcewing/keymap.c
index 709903c6cf..c8dfd5734b 100644
--- a/keyboards/atreus62/keymaps/pcewing/keymap.c
+++ b/keyboards/atreus62/keymaps/pcewing/keymap.c
@@ -61,7 +61,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
- KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RESET
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, QK_BOOT
)
/*
diff --git a/keyboards/atreus62/keymaps/scheiklp/keymap.c b/keyboards/atreus62/keymaps/scheiklp/keymap.c
index 58bacaab91..13ad3e4f51 100644
--- a/keyboards/atreus62/keymaps/scheiklp/keymap.c
+++ b/keyboards/atreus62/keymaps/scheiklp/keymap.c
@@ -34,7 +34,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
[_7] = LAYOUT(
- KC_ESC, KC_TRNS, KC_TRNS, KC_MS_BTN3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET,
+ KC_ESC, KC_TRNS, KC_TRNS, KC_MS_BTN3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT,
KC_TAB, KC_MS_WH_UP, KC_MS_BTN2, KC_MS_UP, KC_MS_BTN1, KC_MS_WH_DOWN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_MS_ACCEL0, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_LSFT, KC_MS_ACCEL1, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
diff --git a/keyboards/atreus62/keymaps/xyverz/keymap.c b/keyboards/atreus62/keymaps/xyverz/keymap.c
index 17a1ec01a3..11c7c33d67 100644
--- a/keyboards/atreus62/keymaps/xyverz/keymap.c
+++ b/keyboards/atreus62/keymaps/xyverz/keymap.c
@@ -99,19 +99,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_CAPS, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, KC_PLUS, KC_LCBR, KC_RCBR, _______,
- _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, _______,
+ _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______,
_______, _______, KC_HOME, KC_END, _______, KC_DEL, MACLOCK, _______, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______
),
[_RAISE] = LAYOUT (
KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_CAPS, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, KC_EQL, KC_LBRC, KC_RBRC, _______,
- _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, _______,
+ _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______,
_______, _______, KC_HOME, KC_END, _______, KC_DEL, MACLOCK, _______, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______
),
[_ADJUST] = LAYOUT (
_______, _______, _______, KC_F13, KC_F14, KC_F15, _______, _______, _______, _______, _______, _______,
- _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, QWERTY, COLEMAK, DVORAK, DESTINY, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
diff --git a/keyboards/atreyu/keymaps/default/keymap.c b/keyboards/atreyu/keymaps/default/keymap.c
index f6e15d26cb..70da748859 100644
--- a/keyboards/atreyu/keymaps/default/keymap.c
+++ b/keyboards/atreyu/keymaps/default/keymap.c
@@ -37,7 +37,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT(
KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 ,KC_GRV ,
KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P ,KC_BSPC ,
- KC_LCTRL, KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN ,KC_QUOT ,
+ KC_LCTL , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN ,KC_QUOT ,
KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH ,KC_RSFT ,
KC_LCTL, LWR , KC_LALT, KC_LGUI, KC_ENT , KC_LBRC, KC_RBRC, KC_SPC , RSE , KC_NO , KC_NO , KC_RCTL
diff --git a/keyboards/atreyu/rev1/info.json b/keyboards/atreyu/rev1/info.json
index d0b3c0eb42..27a5bc2a82 100644
--- a/keyboards/atreyu/rev1/info.json
+++ b/keyboards/atreyu/rev1/info.json
@@ -70,7 +70,7 @@
{"x":11, "y":4.25},
{"x":12, "y":4.15},
{"x":13, "y":4.125},
- {"x": 14.5, "y": 4.5}
+ {"x": 15.5, "y": 4.5}
]
}
}
diff --git a/keyboards/atreyu/rev1/rev1.c b/keyboards/atreyu/rev1/rev1.c
index 3d6829fbd5..8228f7ede6 100644
--- a/keyboards/atreyu/rev1/rev1.c
+++ b/keyboards/atreyu/rev1/rev1.c
@@ -14,6 +14,8 @@
* along with this program. If not, see .
*/
+#include "rev1.h"
+
#ifdef ENCODER_ENABLE
bool encoder_update_kb(uint8_t index, bool clockwise) {
if (!encoder_update_user(index, clockwise)) {
@@ -28,18 +30,10 @@ bool encoder_update_kb(uint8_t index, bool clockwise) {
}
}
if (index == 0) {
- if (IS_LAYER_ON(_LOWER)) {
- if (clockwise) {
- tap_code(KC_WH_U);
- } else {
- tap_code(KC_WH_D);
- }
+ if (clockwise) {
+ tap_code(KC_WH_U);
} else {
- if (clockwise) {
- tap_code(KC_VOLU);
- } else {
- tap_code(KC_VOLD);
- }
+ tap_code(KC_WH_D);
}
}
return true;
diff --git a/keyboards/atset/at1/config.h b/keyboards/atset/at1/config.h
index b5f433b879..635faf9b4e 100644
--- a/keyboards/atset/at1/config.h
+++ b/keyboards/atset/at1/config.h
@@ -23,7 +23,6 @@
#define MATRIX_ROW_PINS { D2 }
#define MATRIX_COL_PINS { B6 }
-#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/atset/at12/config.h b/keyboards/atset/at12/config.h
index 26e26fc32e..d27b4b646a 100644
--- a/keyboards/atset/at12/config.h
+++ b/keyboards/atset/at12/config.h
@@ -23,7 +23,6 @@
#define MATRIX_ROW_PINS { D3, D2, D1, D0 }
#define MATRIX_COL_PINS { B6, B5, B4 }
-#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/atset/at16/config.h b/keyboards/atset/at16/config.h
index da194644ba..400244a66e 100644
--- a/keyboards/atset/at16/config.h
+++ b/keyboards/atset/at16/config.h
@@ -23,7 +23,6 @@
#define MATRIX_ROW_PINS { D3, D2, D1, D0 }
#define MATRIX_COL_PINS { B6, B5, B4, B2 }
-#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/atset/at3/config.h b/keyboards/atset/at3/config.h
index 094ad56a1e..5195939cf9 100644
--- a/keyboards/atset/at3/config.h
+++ b/keyboards/atset/at3/config.h
@@ -23,7 +23,6 @@
#define MATRIX_ROW_PINS { D2 }
#define MATRIX_COL_PINS { B6, B5, B4 }
-#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/atset/at6/config.h b/keyboards/atset/at6/config.h
index fd40ac609b..b443529631 100644
--- a/keyboards/atset/at6/config.h
+++ b/keyboards/atset/at6/config.h
@@ -23,7 +23,6 @@
#define MATRIX_ROW_PINS { D2, D1 }
#define MATRIX_COL_PINS { B6, B5, B4 }
-#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/atset/at9/config.h b/keyboards/atset/at9/config.h
index 187442c265..bf9819c4b9 100644
--- a/keyboards/atset/at9/config.h
+++ b/keyboards/atset/at9/config.h
@@ -23,7 +23,6 @@
#define MATRIX_ROW_PINS { D2, D1, D0 }
#define MATRIX_COL_PINS { B6, B5, B4 }
-#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/atxkb/1894/config.h b/keyboards/atxkb/1894/config.h
index 72d11a180f..9254451569 100644
--- a/keyboards/atxkb/1894/config.h
+++ b/keyboards/atxkb/1894/config.h
@@ -35,7 +35,6 @@ along with this program. If not, see .
*/
#define MATRIX_ROW_PINS { B1, B2, B3, F0, F1 }
#define MATRIX_COL_PINS { F4, F7, F5, F6, C7, C6, B6, B5, B4, D7, D6, D4, D5, D3 }
-#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
@@ -52,18 +51,16 @@ along with this program. If not, see .
#define RGBLIGHT_VAL_STEP 8
// #define RGBLIGHT_LIMIT_VAL 200 /* The maximum brightness level */
#define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
-/*== all animations enable ==*/
- #define RGBLIGHT_ANIMATIONS
-// /*== or choose animations ==*/
-// #define RGBLIGHT_EFFECT_BREATHING
-// #define RGBLIGHT_EFFECT_RAINBOW_MOOD
-// #define RGBLIGHT_EFFECT_RAINBOW_SWIRL
-// #define RGBLIGHT_EFFECT_SNAKE
-// #define RGBLIGHT_EFFECT_KNIGHT
-// #define RGBLIGHT_EFFECT_CHRISTMAS
-// #define RGBLIGHT_EFFECT_STATIC_GRADIENT
-// #define RGBLIGHT_EFFECT_RGB_TEST
-// #define RGBLIGHT_EFFECT_ALTERNATING
+# define RGBLIGHT_EFFECT_BREATHING
+# define RGBLIGHT_EFFECT_RAINBOW_MOOD
+# define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+# define RGBLIGHT_EFFECT_SNAKE
+# define RGBLIGHT_EFFECT_KNIGHT
+# define RGBLIGHT_EFFECT_CHRISTMAS
+# define RGBLIGHT_EFFECT_STATIC_GRADIENT
+# define RGBLIGHT_EFFECT_RGB_TEST
+# define RGBLIGHT_EFFECT_ALTERNATING
+# define RGBLIGHT_EFFECT_TWINKLE
// /*== customize breathing effect ==*/
// /*==== (DEFAULT) use fixed table instead of exp() and sin() ====*/
// #define RGBLIGHT_BREATHE_TABLE_SIZE 256 // 256(default) or 128 or 64
diff --git a/keyboards/aurora65/info.json b/keyboards/aurora65/info.json
index 7962fda7e7..1f7207787a 100644
--- a/keyboards/aurora65/info.json
+++ b/keyboards/aurora65/info.json
@@ -10,7 +10,79 @@
},
"layouts": {
"LAYOUT_65_ansi_blocker": {
- "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":15, "y":2}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4, "w":1.5}, {"x":11.5, "y":4, "w":1.5}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}]
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+ {"x":4, "y":0},
+ {"x":5, "y":0},
+ {"x":6, "y":0},
+ {"x":7, "y":0},
+ {"x":8, "y":0},
+ {"x":9, "y":0},
+ {"x":10, "y":0},
+ {"x":11, "y":0},
+ {"x":12, "y":0},
+ {"x":13, "y":0, "w":2},
+ {"x":15, "y":0},
+
+ {"x":0, "y":1, "w":1.5},
+ {"x":1.5, "y":1},
+ {"x":2.5, "y":1},
+ {"x":3.5, "y":1},
+ {"x":4.5, "y":1},
+ {"x":5.5, "y":1},
+ {"x":6.5, "y":1},
+ {"x":7.5, "y":1},
+ {"x":8.5, "y":1},
+ {"x":9.5, "y":1},
+ {"x":10.5, "y":1},
+ {"x":11.5, "y":1},
+ {"x":12.5, "y":1},
+ {"x":13.5, "y":1, "w":1.5},
+ {"x":15, "y":1},
+
+ {"x":0, "y":2, "w":1.75},
+ {"x":1.75, "y":2},
+ {"x":2.75, "y":2},
+ {"x":3.75, "y":2},
+ {"x":4.75, "y":2},
+ {"x":5.75, "y":2},
+ {"x":6.75, "y":2},
+ {"x":7.75, "y":2},
+ {"x":8.75, "y":2},
+ {"x":9.75, "y":2},
+ {"x":10.75, "y":2},
+ {"x":11.75, "y":2},
+ {"x":12.75, "y":2, "w":2.25},
+ {"x":15, "y":2},
+
+ {"x":0, "y":3, "w":2.25},
+ {"x":2.25, "y":3},
+ {"x":3.25, "y":3},
+ {"x":4.25, "y":3},
+ {"x":5.25, "y":3},
+ {"x":6.25, "y":3},
+ {"x":7.25, "y":3},
+ {"x":8.25, "y":3},
+ {"x":9.25, "y":3},
+ {"x":10.25, "y":3},
+ {"x":11.25, "y":3},
+ {"x":12.25, "y":3, "w":1.75},
+ {"x":14, "y":3},
+ {"x":15, "y":3},
+
+ {"x":0, "y":4, "w":1.25},
+ {"x":1.25, "y":4, "w":1.25},
+ {"x":2.5, "y":4, "w":1.25},
+ {"x":3.75, "y":4, "w":6.25},
+ {"x":10, "y":4, "w":1.25},
+ {"x":11.25, "y":4, "w":1.25},
+ {"x":13, "y":4},
+ {"x":14, "y":4},
+ {"x":15, "y":4}
+ ]
}
}
}
diff --git a/keyboards/aurora65/keymaps/default/keymap.c b/keyboards/aurora65/keymaps/default/keymap.c
index 082dbb3a6a..f671ce5939 100644
--- a/keyboards/aurora65/keymaps/default/keymap.c
+++ b/keyboards/aurora65/keymaps/default/keymap.c
@@ -17,7 +17,7 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_65_ansi_blocker( /* Base */
- KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
+ QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
diff --git a/keyboards/aurora65/keymaps/via/keymap.c b/keyboards/aurora65/keymaps/via/keymap.c
index 7e87c8bfac..c084842549 100644
--- a/keyboards/aurora65/keymaps/via/keymap.c
+++ b/keyboards/aurora65/keymaps/via/keymap.c
@@ -17,7 +17,7 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_65_ansi_blocker( /* Base */
- KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
+ QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
diff --git a/keyboards/avalanche/avalanche.c b/keyboards/avalanche/avalanche.c
index 08d95043b2..7efdf591d5 100644
--- a/keyboards/avalanche/avalanche.c
+++ b/keyboards/avalanche/avalanche.c
@@ -16,7 +16,7 @@ bool encoder_update_kb(uint8_t index, bool clockwise) {
if (clockwise) {
tap_code(KC_PGUP);
} else {
- tap_code(KC_PGDOWN);
+ tap_code(KC_PGDN);
}
}
return true;
diff --git a/keyboards/avalanche/v2/keymaps/default/keymap.c b/keyboards/avalanche/v2/keymaps/default/keymap.c
index fc27401c25..fc8842a865 100644
--- a/keyboards/avalanche/v2/keymaps/default/keymap.c
+++ b/keyboards/avalanche/v2/keymaps/default/keymap.c
@@ -29,7 +29,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,
KC_LGUI, KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, XXXXXXX, XXXXXXX, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_RBRC,
KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_DEL, KC_BSPC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RCTL,
- KC__MUTE,KC_GRV, LFN_3, FN_2, EN_LALT, EN_RALT, FN_1, RFN_3, FN_3, KC_LSCR
+ KC_MUTE, KC_GRV, LFN_3, FN_2, EN_LALT, EN_RALT, FN_1, RFN_3, FN_3, KC_LSCR
),
[LAYER_1] = LAYOUT(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
diff --git a/keyboards/avalanche/v3/keymaps/default/keymap.c b/keyboards/avalanche/v3/keymaps/default/keymap.c
index be82b74c09..094e1bc343 100644
--- a/keyboards/avalanche/v3/keymaps/default/keymap.c
+++ b/keyboards/avalanche/v3/keymaps/default/keymap.c
@@ -28,7 +28,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,
KC_CAPS, KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_RBRC,
KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_DEL, KC_LGUI, KC_INS, KC_BSPC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RCTL,
- KC__MUTE,LFN_2, LFN_3, KC_SPC, EN_LALT, EN_RALT, FN_1, RFN_3, RFN_2, KC_PSCR
+ KC_MUTE, LFN_2, LFN_3, KC_SPC, EN_LALT, EN_RALT, FN_1, RFN_3, RFN_2, KC_PSCR
),
[LAYER_1] = LAYOUT(
_______, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_F11,
diff --git a/keyboards/avalanche/v4/keymaps/default/keymap.c b/keyboards/avalanche/v4/keymaps/default/keymap.c
index 7239091ca2..457aff4cc0 100644
--- a/keyboards/avalanche/v4/keymaps/default/keymap.c
+++ b/keyboards/avalanche/v4/keymaps/default/keymap.c
@@ -28,7 +28,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,
KC_CAPS, KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_RBRC,
KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_DEL, KC_LGUI, KC_INS, KC_BSPC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RCTL,
- KC__MUTE,LFN_2, LFN_3, KC_SPC, EN_LALT, EN_RALT, FN_1, RFN_3, RFN_2, KC_PSCR
+ KC_MUTE, LFN_2, LFN_3, KC_SPC, EN_LALT, EN_RALT, FN_1, RFN_3, RFN_2, KC_PSCR
),
[LAYER_1] = LAYOUT(
_______, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_F11,
diff --git a/keyboards/aves60/config.h b/keyboards/aves60/config.h
index 7783cc9120..5207a80c2a 100644
--- a/keyboards/aves60/config.h
+++ b/keyboards/aves60/config.h
@@ -21,7 +21,6 @@
*/
#define MATRIX_ROW_PINS { F6, F7, F5, F1, F4 }
#define MATRIX_COL_PINS { B2, B3, D0, D1, D2, D3, C7, C6, B6, B5, B4, D7, D6, D4 }
-#define UNUSED_PINS { B0, B7, E6, F0 }
/* COL2ROW, ROW2COL */
#define DIODE_DIRECTION COL2ROW
@@ -49,8 +48,6 @@
//# define RGBLIGHT_VAL_STEP 8
//# define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
//# define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
-/*== all animations enable ==*/
-//# define RGBLIGHT_ANIMATIONS
/*== or choose animations ==*/
#define RGBLIGHT_EFFECT_BREATHING
#define RGBLIGHT_EFFECT_RAINBOW_MOOD
diff --git a/keyboards/aves65/config.h b/keyboards/aves65/config.h
index 1536787ac0..05db3a56fb 100644
--- a/keyboards/aves65/config.h
+++ b/keyboards/aves65/config.h
@@ -27,7 +27,6 @@ along with this program. If not, see .
#define MATRIX_ROW_PINS {D4,D6,D7,B4,E6}
#define MATRIX_COL_PINS {D0,D1,D2,D3,D5,B5,F0,F1,F4,F5,F6,F7,C7,C6,B6}
-#define UNUSED_PINS {B7,B1,B2,B3}
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
@@ -46,7 +45,16 @@ along with this program. If not, see .
/* Backlight configuration
*/
#define RGB_DI_PIN B0
-#define RGBLIGHT_ANIMATIONS
+#define RGBLIGHT_EFFECT_BREATHING
+#define RGBLIGHT_EFFECT_RAINBOW_MOOD
+#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+#define RGBLIGHT_EFFECT_SNAKE
+#define RGBLIGHT_EFFECT_KNIGHT
+#define RGBLIGHT_EFFECT_CHRISTMAS
+#define RGBLIGHT_EFFECT_STATIC_GRADIENT
+#define RGBLIGHT_EFFECT_RGB_TEST
+#define RGBLIGHT_EFFECT_ALTERNATING
+#define RGBLIGHT_EFFECT_TWINKLE
#define RGBLED_NUM 9
#define QMK_ESC_OUTPUT D0 // usually COL
diff --git a/keyboards/axolstudio/foundation_gamma/keymaps/default/keymap.c b/keyboards/axolstudio/foundation_gamma/keymaps/default/keymap.c
index ba80d42d64..ac080e6165 100644
--- a/keyboards/axolstudio/foundation_gamma/keymaps/default/keymap.c
+++ b/keyboards/axolstudio/foundation_gamma/keymaps/default/keymap.c
@@ -17,7 +17,7 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_tkl_f13_ansi_tsangan(
- KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE, KC_PSCR, KC_SLCK, KC_PAUS,
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE, KC_PSCR, KC_SCRL, KC_PAUS,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
diff --git a/keyboards/axolstudio/foundation_gamma/keymaps/via/keymap.c b/keyboards/axolstudio/foundation_gamma/keymaps/via/keymap.c
index 7ea8e0e1ef..bc4d2c2e4d 100644
--- a/keyboards/axolstudio/foundation_gamma/keymaps/via/keymap.c
+++ b/keyboards/axolstudio/foundation_gamma/keymaps/via/keymap.c
@@ -17,7 +17,7 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_tkl_f13_ansi_tsangan_split_bs_rshift(
- KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE, KC_PSCR, KC_SLCK, KC_PAUS,
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE, KC_PSCR, KC_SCRL, KC_PAUS,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
diff --git a/keyboards/axolstudio/yeti/hotswap/config.h b/keyboards/axolstudio/yeti/hotswap/config.h
index 1f0540c9e1..439ca0d512 100644
--- a/keyboards/axolstudio/yeti/hotswap/config.h
+++ b/keyboards/axolstudio/yeti/hotswap/config.h
@@ -74,11 +74,10 @@ along with this program. If not, see .
# define ENABLE_RGB_MATRIX_MULTISPLASH
# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
# define RGB_MATRIX_LED_FLUSH_LIMIT 16 // 16 is equivalent to limiting to 60fps
-# define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
# define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
# define DRIVER_ADDR_1 0b1010000
# define DRIVER_COUNT 1
-# define DRIVER_LED_TOTAL 64
+# define RGB_MATRIX_LED_COUNT 64
#endif
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
diff --git a/keyboards/axolstudio/yeti/hotswap/hotswap.c b/keyboards/axolstudio/yeti/hotswap/hotswap.c
index f6d0bc7019..9d5efc208d 100644
--- a/keyboards/axolstudio/yeti/hotswap/hotswap.c
+++ b/keyboards/axolstudio/yeti/hotswap/hotswap.c
@@ -17,24 +17,24 @@
#include "hotswap.h"
#ifdef RGB_MATRIX_ENABLE
-const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
+const is31_led g_is31_leds[RGB_MATRIX_LED_COUNT] = {
{ 0, B_1, A_1, C_1 },
{ 0, B_2, A_2, C_2 },
{ 0, B_3, A_3, C_3 },
- { 0, B_4, A_4, C_4 },
- { 0, B_5, A_5, C_5 },
- { 0, B_6, A_6, C_6 },
- { 0, B_7, A_7, C_7 },
- { 0, B_8, A_8, C_8 },
- { 0, B_9, A_9, C_9 },
- { 0, B_10, A_10, C_10 },
- { 0, B_11, A_11, C_11 },
- { 0, B_12, A_12, C_12 },
- { 0, B_13, A_13, C_13 },
+ { 0, B_4, A_4, C_4 },
+ { 0, B_5, A_5, C_5 },
+ { 0, B_6, A_6, C_6 },
+ { 0, B_7, A_7, C_7 },
+ { 0, B_8, A_8, C_8 },
+ { 0, B_9, A_9, C_9 },
+ { 0, B_10, A_10, C_10 },
+ { 0, B_11, A_11, C_11 },
+ { 0, B_12, A_12, C_12 },
+ { 0, B_13, A_13, C_13 },
{ 0, B_14, A_14, C_14 },
{ 0, B_15, A_15, C_15 },
-
- { 0, E_1, D_1, F_1 },
+
+ { 0, E_1, D_1, F_1 },
{ 0, E_2, D_2, F_2 },
{ 0, E_3, D_3, F_3 },
{ 0, E_4, D_4, F_4 },
@@ -46,13 +46,13 @@ const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
{ 0, E_10, D_10, F_10 },
{ 0, E_11, D_11, F_11 },
{ 0, E_12, D_12, F_12 },
- { 0, E_13, D_13, F_13 },
- { 0, E_14, D_14, F_14 },
+ { 0, E_13, D_13, F_13 },
+ { 0, E_14, D_14, F_14 },
{ 0, E_15, D_15, F_15 },
-
- { 0, H_1, G_1, I_1 },
- { 0, H_2, G_2, I_2 },
- { 0, H_3, G_3, I_3 },
+
+ { 0, H_1, G_1, I_1 },
+ { 0, H_2, G_2, I_2 },
+ { 0, H_3, G_3, I_3 },
{ 0, H_4, G_4, I_4 },
{ 0, H_5, G_5, I_5 },
{ 0, H_6, G_6, I_6 },
@@ -67,25 +67,25 @@ const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
{ 0, K_2, J_2, L_2 },
{ 0, K_3, J_3, L_3 },
- { 0, K_4, J_4, L_4 },
+ { 0, K_4, J_4, L_4 },
{ 0, K_5, J_5, L_5 },
{ 0, K_6, J_6, L_6 },
- { 0, K_7, J_7, L_7 },
- { 0, K_8, J_8, L_8 },
- { 0, K_9, J_9, L_9 },
+ { 0, K_7, J_7, L_7 },
+ { 0, K_8, J_8, L_8 },
+ { 0, K_9, J_9, L_9 },
{ 0, K_10, J_10, L_10 },
- { 0, K_11, J_11, L_11 },
- { 0, K_12, J_12, L_12 },
- { 0, K_13, J_13, L_13 },
+ { 0, K_11, J_11, L_11 },
+ { 0, K_12, J_12, L_12 },
+ { 0, K_13, J_13, L_13 },
{ 0, K_14, J_14, L_14 },
{ 0, K_1, J_1, L_1 },
{ 0, K_16, J_16, L_16 },
{ 0, H_16, G_16, I_16 },
- { 0, E_16, D_16, F_16 },
- { 0, B_16, A_16, C_16 },
+ { 0, E_16, D_16, F_16 },
+ { 0, B_16, A_16, C_16 },
{ 0, H_15, G_15, I_15 },
- { 0, K_15, J_15, L_15 },
+ { 0, K_15, J_15, L_15 },
};
led_config_t g_led_config = {
@@ -102,7 +102,7 @@ led_config_t g_led_config = {
{16,48},{32,48},{48,48},{64,48},{80,48},{96,48},{112,48},{128,48},{144,48},{160,48},{176,48},{192,48},{224,48},
{16,64},{48,64},{80,64},{96,64},{128,64},{160,64},{224,64}
}, {
- 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
+ 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
@@ -110,9 +110,12 @@ led_config_t g_led_config = {
}
};
#endif
-__attribute__ ((weak))
-void rgb_matrix_indicators_user(void) {
+bool rgb_matrix_indicators_kb(void) {
+ if (!rgb_matrix_indicators_user()) {
+ return false;
+ }
if (host_keyboard_led_state().caps_lock) {
rgb_matrix_set_color(31, 0xFF, 0xFF, 0xFF);
}
+ return true;
}
diff --git a/keyboards/b_sides/rev41lp/config.h b/keyboards/b_sides/rev41lp/config.h
index b2c9c01959..3628cc4db5 100644
--- a/keyboards/b_sides/rev41lp/config.h
+++ b/keyboards/b_sides/rev41lp/config.h
@@ -25,7 +25,6 @@ along with this program. If not, see .
#define MATRIX_ROW_PINS { F4, B2, F5, B3, F6, B1, F7 }
#define MATRIX_COL_PINS { D4, C6, D7, E6, B4, B5 }
-#define UNUSED_PINS
#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/b_sides/rev41lp/keymaps/cyril/keymap.c b/keyboards/b_sides/rev41lp/keymaps/cyril/keymap.c
index 6db1e47a2f..72eb2bb5c8 100644
--- a/keyboards/b_sides/rev41lp/keymaps/cyril/keymap.c
+++ b/keyboards/b_sides/rev41lp/keymaps/cyril/keymap.c
@@ -78,9 +78,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
[_ADJUST] = LAYOUT_rev41lp(
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, BL_DEC, BL_TOGG, BL_BRTG, BL_INC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, BL_DOWN,BL_TOGG, BL_BRTG, BL_UP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, _______, _______, _______, _______
)
};
diff --git a/keyboards/b_sides/rev41lp/keymaps/default/keymap.c b/keyboards/b_sides/rev41lp/keymaps/default/keymap.c
index 1e721883b2..8ee9053c12 100644
--- a/keyboards/b_sides/rev41lp/keymaps/default/keymap.c
+++ b/keyboards/b_sides/rev41lp/keymaps/default/keymap.c
@@ -39,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
[3] = LAYOUT_rev41lp(
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, BL_DEC, BL_TOGG, BL_BRTG, BL_INC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, BL_DOWN, BL_TOGG, BL_BRTG, BL_UP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, _______, _______, _______, _______
diff --git a/keyboards/b_sides/rev41lp/keymaps/namnlos/config.h b/keyboards/b_sides/rev41lp/keymaps/namnlos/config.h
index 69d44bdd03..b6f2866c46 100644
--- a/keyboards/b_sides/rev41lp/keymaps/namnlos/config.h
+++ b/keyboards/b_sides/rev41lp/keymaps/namnlos/config.h
@@ -24,7 +24,7 @@
#define COMBO_COUNT 3
#define IGNORE_MOD_TAP_INTERRUPT
-#define UNICODE_SELECTED_MODES UC_WINC, UC_WIN, UC_MAC, UC_LNX
+#define UNICODE_SELECTED_MODES UNICODE_MODE_WINCOMPOSE, UNICODE_MODE_WINDOWS, UNICODE_MODE_MACOS, UNICODE_MODE_LINUX
#define TAPPING_FORCE_HOLD
#define TAPPING_TERM 200
diff --git a/keyboards/b_sides/rev41lp/keymaps/namnlos/keymap.c b/keyboards/b_sides/rev41lp/keymaps/namnlos/keymap.c
index 408c911250..f942cd3484 100644
--- a/keyboards/b_sides/rev41lp/keymaps/namnlos/keymap.c
+++ b/keyboards/b_sides/rev41lp/keymaps/namnlos/keymap.c
@@ -164,9 +164,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
[_ADJUST] = LAYOUT_rev41lp(
- XXXXXXX, XXXXXXX, XXXXXXX, BL_OFF, BL_DEC, BL_TOGG, BL_BRTG, BL_INC, BL_ON, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, BL_OFF, BL_DOWN, BL_TOGG, BL_BRTG, BL_UP, BL_ON, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, BL_STEP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
- XXXXXXX, UC_M_WC, UC_M_MA, UC_M_LN, XXXXXXX, XXXXXXX, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, UC_WINC, UC_MAC, UC_LINX, XXXXXXX, XXXXXXX, QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, _______, _______, _______, _______
)
};
diff --git a/keyboards/bacca70/keymaps/debaccabean/keymap.c b/keyboards/bacca70/keymaps/debaccabean/keymap.c
index 66e3ec0b5f..1c40669fc8 100644
--- a/keyboards/bacca70/keymaps/debaccabean/keymap.c
+++ b/keyboards/bacca70/keymaps/debaccabean/keymap.c
@@ -30,8 +30,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
[1] = LAYOUT_debaccabean(
- RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
- KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS,KC_TRNS,KC_TRNS,
+ QK_BOOT, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SCRL,KC_PAUS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_INS, KC_UP, KC_PGUP,KC_TRNS,KC_TRNS,
KC_TRNS,KC_MPLY,KC_MUTE,KC_VOLD,KC_VOLU,KC_MPRV,KC_MNXT,KC_TRNS,KC_TRNS,KC_TRNS,KC_LEFT,KC_DOWN,KC_RGHT,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_HOME,KC_END, KC_PGDN,KC_TRNS,KC_TRNS,
diff --git a/keyboards/bacca70/keymaps/dede-special/keymap.c b/keyboards/bacca70/keymaps/dede-special/keymap.c
index 1c7514e81b..e213e79409 100644
--- a/keyboards/bacca70/keymaps/dede-special/keymap.c
+++ b/keyboards/bacca70/keymaps/dede-special/keymap.c
@@ -64,8 +64,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
[3] = LAYOUT_debaccabean(
- RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,TG(1),
- KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS,KC_TRNS,KC_TRNS,
+ QK_BOOT, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,TG(1),
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SCRL,KC_PAUS,KC_TRNS,KC_TRNS,
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_INS, KC_UP, KC_PGUP,KC_TRNS,KC_TRNS,
KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MNXT,KC_TRNS,KC_TRNS,KC_TRNS,KC_LEFT,KC_DOWN,KC_RGHT,KC_TRNS,
KC_MPLY,KC_MUTE,KC_VOLD,KC_VOLU,KC_MPRV,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_HOME,KC_END, KC_PGDN,KC_TRNS,KC_TRNS,
diff --git a/keyboards/baguette/config.h b/keyboards/baguette/config.h
index 2db6f08c52..d34356c467 100644
--- a/keyboards/baguette/config.h
+++ b/keyboards/baguette/config.h
@@ -35,7 +35,6 @@ along with this program. If not, see .
*/
#define MATRIX_ROW_PINS { B3, B2, B1, E6, D6 }
#define MATRIX_COL_PINS { B6, C6, C7, F7, F6, F5, F4, F1, F0, B0, D0, D1, D2, D3, D5, D4 }
-#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
@@ -46,7 +45,6 @@ along with this program. If not, see .
// #define RGB_DI_PIN E2
// #ifdef RGB_DI_PIN
-// #define RGBLIGHT_ANIMATIONS
// #define RGBLED_NUM 16
// #define RGBLIGHT_HUE_STEP 8
// #define RGBLIGHT_SAT_STEP 8
diff --git a/keyboards/baguette/info.json b/keyboards/baguette/info.json
index 2c6b09fc09..3fc5221f71 100644
--- a/keyboards/baguette/info.json
+++ b/keyboards/baguette/info.json
@@ -140,7 +140,7 @@
{"label":",", "x":9.25, "y":3},
{"label":".", "x":10.25, "y":3},
{"label":"/", "x":11.25, "y":3},
- {"label":"JP_RO", "x":12.25, "y":3},
+ {"label":"\\", "x":12.25, "y":3},
{"label":"Shift", "x":13.25, "y":3, "w":1.25},
{"label":"Up", "x":14.5, "y":3},
{"label":"GUI", "x":1.25, "y":4},
diff --git a/keyboards/baguette/keymaps/default/keymap.c b/keyboards/baguette/keymaps/default/keymap.c
index f5df8ee478..5f168c3d5b 100644
--- a/keyboards/baguette/keymaps/default/keymap.c
+++ b/keyboards/baguette/keymaps/default/keymap.c
@@ -17,7 +17,7 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_ansi( /* Base */
- KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_TRNS, KC_INS,
+ QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_TRNS, KC_INS,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_TRNS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_TRNS, KC_RSFT, KC_UP,
diff --git a/keyboards/baguette/keymaps/iso/keymap.c b/keyboards/baguette/keymaps/iso/keymap.c
index f3445e8b1a..b372f71111 100644
--- a/keyboards/baguette/keymaps/iso/keymap.c
+++ b/keyboards/baguette/keymaps/iso/keymap.c
@@ -17,7 +17,7 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_iso( /* Base */
- KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_TRNS, KC_INS,
+ QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_TRNS, KC_INS,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_QUOT, KC_ENT,
KC_LSFT, KC_TRNS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_TRNS, KC_RSFT, KC_UP,
diff --git a/keyboards/bajjak/keymaps/5x6/keymap.c b/keyboards/bajjak/keymaps/5x6/keymap.c
index e97d0360b7..b700976dc9 100644
--- a/keyboards/bajjak/keymaps/5x6/keymap.c
+++ b/keyboards/bajjak/keymaps/5x6/keymap.c
@@ -57,8 +57,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, XXXXXXX, XXXXXXX, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, XXXXXXX, XXXXXXX, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
- KC_LCTRL, GUI_T(KC_GRV), ALT_T(KC_BSLS), KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, DF(SYMB),
- CTL_T(KC_ESC), KC_LALT, KC_RGUI, CTL_T(KC_HAEN),
+ KC_LCTL, GUI_T(KC_GRV), ALT_T(KC_BSLS), KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, DF(SYMB),
+ CTL_T(KC_ESC), KC_LALT, KC_RGUI, CTL_T(KC_LNG1),
KC_HOME, KC_PGUP,
KC_BSPC, KC_DEL, KC_END, KC_PGDN, KC_ENT, KC_SPC
),
@@ -88,7 +88,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// Left hand Right hand
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
- _______, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, XXXXXXX, XXXXXXX, XXXXXXX, KC_NLCK, KC_P7 , KC_P8 , KC_P9, KC_MINS, KC_PSLS,
+ _______, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, XXXXXXX, XXXXXXX, XXXXXXX, KC_NUM, KC_P7 , KC_P8 , KC_P9, KC_MINS, KC_PSLS,
XXXXXXX, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_P4 , KC_P5 , KC_P6, KC_PLUS, KC_PAST,
_______, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, XXXXXXX, DF(MDIA), KC_P1 , KC_P2 , KC_P3, KC_PEQL, _______,
_______, _______, _______, _______, _______, _______, _______, KC_PDOT, KC_P0, DF(BASE),
@@ -103,7 +103,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | | | Lclk | MsUp | Rclk |MsWhUp| | | | | | | |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
- * | RESET | |MsLeft|MsDown|MsRght|MsWhDw| | | | | | | |
+ * | QK_BOOT | |MsLeft|MsDown|MsRght|MsWhDw| | | | | | | |
* |--------+------+------+------+------+------| |------|------+------+------+------+--------|
* | LShift | |MsWhL | |MsWhR | | | | | | | | RShift |
* ------------------------------------------- -------------------------------------------
@@ -123,7 +123,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
KC_SLEP, KC_BRID, KC_BRIU, XXXXXXX, XXXXXXX, XXXXXXX, KC_EJCT, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU,
XXXXXXX, XXXXXXX, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
- RESET, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ QK_BOOT, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, XXXXXXX, KC_WH_L, XXXXXXX, KC_WH_R, XXXXXXX, DF(SYMB), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, _______, _______, _______, _______, _______, _______, XXXXXXX, XXXXXXX, DF(BASE),
_______, _______, _______, _______,
diff --git a/keyboards/bajjak/keymaps/default/keymap.c b/keyboards/bajjak/keymaps/default/keymap.c
index 4c79261307..4e2a7e055c 100644
--- a/keyboards/bajjak/keymaps/default/keymap.c
+++ b/keyboards/bajjak/keymaps/default/keymap.c
@@ -59,7 +59,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, _______, _______, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, TG(MDIA), TG(SYMB), KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
- KC_LCTRL, GUI_T(KC_GRV), ALT_T(KC_BSLS), KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, TT(SYMB),
+ KC_LCTL, GUI_T(KC_GRV), ALT_T(KC_BSLS), KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, TT(SYMB),
CTL_T(KC_ESC), KC_LALT, KC_RGUI, CTL_T(KC_RALT),
KC_HOME, KC_PGUP,
KC_BSPC, KC_DEL, KC_END, KC_PGDN, KC_ENT, KC_SPC
@@ -91,11 +91,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[SYMB] = LAYOUT_6x7(
// Left hand Right hand
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_EJCT,
- _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_NLCK, KC_PEQL, KC_PSLS, KC_PAST, KC_PSCR,
- KC_TAB, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, _______, _______, _______, KC_P7 , KC_P8 , KC_P9, KC_MINS, KC_SLCK,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_NUM, KC_PEQL, KC_PSLS, KC_PAST, KC_PSCR,
+ KC_TAB, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, _______, _______, _______, KC_P7 , KC_P8 , KC_P9, KC_MINS, KC_SCRL,
KC_CAPS, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV, _______, _______, _______, KC_P4 , KC_P5 , KC_P6, KC_PLUS, KC_PAUS,
KC_LSFT, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, _______, KC_P1 , KC_P2 , KC_P3, KC_PENT, KC_RSFT,
- KC_LCTRL, KC_LGUI, ALT_T(KC_INSERT), KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, KC_PDOT, KC_P0, _______,
+ KC_LCTL, KC_LGUI, ALT_T(KC_INSERT), KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, KC_PDOT, KC_P0, _______,
CTL_T(KC_ESC), KC_LALT, KC_RGUI, CTL_T(KC_RALT),
KC_HOME, KC_PGUP,
KC_BSPC, KC_DEL, KC_END, KC_PGDN, KC_ENT, KC_SPC
@@ -113,7 +113,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |--------+------+------+------+------+------+------' `------+------+------+------+------+------+--------|
* | LShift | |MsWhL | |MsWhR | | | | | | | | |
* `--------+------+------+------+------+------' `-----+------+------+------+------+-------'
- * | CTRL |GUI\'"|ALT \ | Left | Right| | Up | Down | | | RESET |
+ * | CTRL |GUI\'"|ALT \ | Left | Right| | Up | Down | | | QK_BOOT |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* |Ctrl/ESC|LALT| | RGUI |Ctrl/Alt|
@@ -131,7 +131,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TAB, _______, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, _______, _______, _______, _______, _______, _______, _______,
KC_CAPS, _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, _______, _______, _______, _______, _______, _______, _______,
KC_LSFT, _______, KC_WH_L, _______, KC_WH_R, _______, _______, _______, _______, _______, _______, _______,
- KC_LCTRL, KC_LGUI, ALT_T(KC_INSERT), KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, _______, _______, RESET,
+ KC_LCTL, KC_LGUI, ALT_T(KC_INSERT), KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, _______, _______, QK_BOOT,
CTL_T(KC_ESC), KC_LALT, KC_RGUI, CTL_T(KC_RALT),
KC_HOME, KC_PGUP,
KC_BSPC, KC_DEL, KC_END, KC_PGDN, KC_ENT, KC_SPC
diff --git a/keyboards/bandominedoni/bandominedoni.c b/keyboards/bandominedoni/bandominedoni.c
index eacbb40fa0..27df3598d4 100644
--- a/keyboards/bandominedoni/bandominedoni.c
+++ b/keyboards/bandominedoni/bandominedoni.c
@@ -117,55 +117,3 @@ static enum { UNKNOWN, LEFT, RIGHT } hand_side = UNKNOWN;
return (hand_side == LEFT);
}
}
-
-#ifdef ENCODER_ENABLE
-# ifdef ENCODERS
-static uint8_t encoder_state[ENCODERS] = {0};
-static keypos_t encoder_cw[ENCODERS] = ENCODERS_CW_KEY;
-static keypos_t encoder_ccw[ENCODERS] = ENCODERS_CCW_KEY;
-# endif
-
-void encoder_action_unregister(void) {
-# ifdef ENCODERS
- for (int index = 0; index < ENCODERS; ++index) {
- if (encoder_state[index]) {
- keyevent_t encoder_event = (keyevent_t) {
- .key = encoder_state[index] >> 1 ? encoder_cw[index] : encoder_ccw[index],
- .pressed = false,
- .time = (timer_read() | 1)
- };
- encoder_state[index] = 0;
- action_exec(encoder_event);
- }
- }
-# endif
-}
-
-void encoder_action_register(uint8_t index, bool clockwise) {
-# ifdef ENCODERS
- keyevent_t encoder_event = (keyevent_t) {
- .key = clockwise ? encoder_cw[index] : encoder_ccw[index],
- .pressed = true,
- .time = (timer_read() | 1)
- };
- encoder_state[index] = (clockwise ^ 1) | (clockwise << 1);
-# ifdef CONSOLE_ENABLE
- uprintf("encoder_action_register index = %u, clockwise = %u, row = %u, col = %u\n", index, clockwise, encoder_event.key.row, encoder_event.key.col);
-# endif
- action_exec(encoder_event);
-# endif
-}
-
-void matrix_scan_kb(void) {
- encoder_action_unregister();
- matrix_scan_user();
-}
-
-bool encoder_update_kb(uint8_t index, bool clockwise) {
- encoder_action_register(index, clockwise);
- // don't return user actions, because they are in the keymap
- // encoder_update_user(index, clockwise);
- return true;
-};
-
-#endif
diff --git a/keyboards/bandominedoni/bandominedoni.h b/keyboards/bandominedoni/bandominedoni.h
index 1eca4f8d98..c83958ce8a 100644
--- a/keyboards/bandominedoni/bandominedoni.h
+++ b/keyboards/bandominedoni/bandominedoni.h
@@ -38,7 +38,7 @@
l40, l41, l42, l43, l44, l45, l46, l47, \
\
oc, r00, r01, r02, r03, fn, \
- r10, r11, r12, r13, r14, ccw, cw,\
+ r10, r11, r12, r13, r14, \
r20, r21, r22, r23, r24, r25, \
r30, r31, r32, r33, r34, r35, r36, r37, \
r40, r41, r42, r43, r44, r45, r46, r47, \
@@ -49,7 +49,7 @@
{ l20, l21, l22, l23, l24, l25, l26 }, \
{ l30, l31, l32, l33, l34, l35, l36 }, \
{ l41, l42, l43, l44, l45, l46, l47 }, \
- { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, ccw, cw }, \
+ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
{ r50, r40, r31, r20, r10, r00, r30 }, \
{ r51, r41, r32, r21, r11, r01, oc }, \
{ r52, r42, r33, r22, r12, r02, fn }, \
@@ -74,8 +74,8 @@
// Long press: go to _FN layer, tap: MUTE
#define FN_MUTE LT(_FN, KC_MUTE)
#define DF_QWER DF(_QWERTY)
-#define MIS_EIS LT(_MISC,KC_LANG2)
-#define MIS_KAN LT(_MISC,KC_LANG1)
+#define MIS_EIS LT(_MISC,KC_LNG2)
+#define MIS_KAN LT(_MISC,KC_LNG1)
// Overriding is_keyboard_left() in qmk_firmware/quantum/split_common/split_util.c to limit the handedness check only once.
@@ -83,6 +83,3 @@
// However, It enables to decide the handedness by the HW by adding one condition: "not to press any keys (especially r30) dusing startup."
bool is_keyboard_left(void);
-void encoder_action_unregister(void);
-
-void encoder_action_register(uint8_t index, bool clockwise);
diff --git a/keyboards/bandominedoni/config.h b/keyboards/bandominedoni/config.h
index c3479d6d33..55608af85e 100644
--- a/keyboards/bandominedoni/config.h
+++ b/keyboards/bandominedoni/config.h
@@ -33,7 +33,6 @@
*/
#define MATRIX_ROW_PINS { B5, B4, D7, F6, C6, D4 }
#define MATRIX_COL_PINS { D1, E6, F7, B1, B3, B2, D0 }
-#define UNUSED_PINS
#define MASTER_RIGHT
#ifndef MASTER_RIGHT
@@ -69,18 +68,6 @@
//# define RGBLIGHT_VAL_STEP 8
//# define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
//# define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
-/*== all animations enable ==*/
-//# define RGBLIGHT_ANIMATIONS
-/*== or choose animations ==*/
-//# define RGBLIGHT_EFFECT_BREATHING
-//# define RGBLIGHT_EFFECT_RAINBOW_MOOD
-//# define RGBLIGHT_EFFECT_RAINBOW_SWIRL
-//# define RGBLIGHT_EFFECT_SNAKE
-//# define RGBLIGHT_EFFECT_KNIGHT
-//# define RGBLIGHT_EFFECT_CHRISTMAS
-//# define RGBLIGHT_EFFECT_STATIC_GRADIENT
-//# define RGBLIGHT_EFFECT_RGB_TEST
-//# define RGBLIGHT_EFFECT_ALTERNATING
/*== customize breathing effect ==*/
/*==== (DEFAULT) use fixed table instead of exp() and sin() ====*/
//# define RGBLIGHT_BREATHE_TABLE_SIZE 256 // 256(default) or 128 or 64
@@ -92,7 +79,7 @@
#ifdef RGB_MATRIX_ENABLE
/* ws2812 RGB MATRIX */
-# define DRIVER_LED_TOTAL 76
+# define RGB_MATRIX_LED_COUNT 76
// reacts to keypresses
# define RGB_MATRIX_KEYPRESSES
@@ -101,7 +88,7 @@
# define LED_HITS_TO_REMEMBER 10
# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 50
-# define RGB_MATRIX_STARTUP_SPD 127
+# define RGB_MATRIX_DEFAULT_SPD 127
// the above brighness setting has no effect on rgb_matrix_set_color().
// Use darker colors instead.
/* RGB darker COLORS */
@@ -249,13 +236,11 @@
* Encoder options
*/
#ifdef ENCODER_ENABLE
-# define ENCODERS_PAD_A { C7 } // dummy
-# define ENCODERS_PAD_B { B7 } // dummy
+# define ENCODERS_PAD_A { }
+# define ENCODERS_PAD_B { }
+# define ENCODER_RESOLUTIONS { }
# define ENCODERS_PAD_A_RIGHT { F5 }
# define ENCODERS_PAD_B_RIGHT { F4 }
-# define ENCODER_RESOLUTION 4
+# define ENCODER_RESOLUTIONS_RIGHT { 4 }
# define TAP_CODE_DELAY 10
-# define ENCODERS 2
-# define ENCODERS_CW_KEY { {4, 5}, {6, 5} }
-# define ENCODERS_CCW_KEY { {3, 5}, {5, 5} }
#endif // ENCODER_ENABLE
diff --git a/keyboards/bandominedoni/info.json b/keyboards/bandominedoni/info.json
index 040526b39c..f78621ec41 100644
--- a/keyboards/bandominedoni/info.json
+++ b/keyboards/bandominedoni/info.json
@@ -65,9 +65,6 @@
{"label": "r13", "x": 14, "y": 1},
{"label": "r14", "x": 15, "y": 1},
- {"label": "ccw", "x": 16.5, "y": 1},
- {"label": "cw", "x": 17.5, "y": 1},
-
{"label": "r20", "x": 10.5, "y": 2},
{"label": "r21", "x": 11.5, "y": 2},
{"label": "r22", "x": 12.5, "y": 2},
diff --git a/keyboards/bandominedoni/keymaps/default/keymap.c b/keyboards/bandominedoni/keymaps/default/keymap.c
index e01253c216..880dc4bcc0 100644
--- a/keyboards/bandominedoni/keymaps/default/keymap.c
+++ b/keyboards/bandominedoni/keymaps/default/keymap.c
@@ -34,33 +34,33 @@ enum custom_keycodes {
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_OPEN] = LAYOUT(
- MI_Gs_1, MI_As_1, MI_Cs_2, MI_F_2, MI_Gs_3,
- MI_E_1, MI_A_1, MI_G_2, MI_Ds_2, MI_F_3, MI_As_2, MI_F_1,
- MI_D_2, MI_A_2, MI_C_3, MI_E_3, MI_C_2, MI_G_1, TG_SWAP,
- MI_E_2, MI_Gs_2, MI_B_2, MI_D_3, MI_Fs_3, MI_Cs_3, MI_Fs_1,
- MI_D_1, MI_B_1, MI_G_3, MI_A_3, MI_Ds_3, MI_Fs_2, MI_Ds_1, MI_C_1,
+ MI_Gs1, MI_As1, MI_Cs2, MI_F2, MI_Gs3,
+ MI_E1, MI_A1, MI_G2, MI_Ds2, MI_F3, MI_As2, MI_F1,
+ MI_D2, MI_A2, MI_C3, MI_E3, MI_C2, MI_G1, TG_SWAP,
+ MI_E2, MI_Gs2, MI_B2, MI_D3, MI_Fs3, MI_Cs3, MI_Fs1,
+ MI_D1, MI_B1, MI_G3, MI_A3, MI_Ds3, MI_Fs2, MI_Ds1, MI_C1,
- MO_SWAP, MI_B_5, MI_Gs_5, MI_G_5, MI_F_5, FN_MUTE,
- MI_Cs_3, MI_A_5, MI_Fs_5, MI_E_5, MI_Ds_5, KC_VOLD, KC_VOLU,
- MI_C_3, MI_D_3, MI_G_3, MI_As_4, MI_C_5, MI_D_5,
- TG_SWAP, MI_B_2, MI_E_3, MI_Cs_4, MI_Fs_3, MI_A_3, MI_C_4, MI_E_4,
- MI_A_2, MI_F_3, MI_As_3, MI_Gs_3, MI_B_3, MI_D_4, MI_Gs_4, MI_B_4,
- MI_Gs_2, MI_As_2, MI_Ds_3, MI_F_4, MI_Ds_4, MI_Fs_4, MI_A_4, MI_Cs_5, MI_G_4
+ MO_SWAP, MI_B5, MI_Gs5, MI_G5, MI_F5, FN_MUTE,
+ MI_Cs3, MI_A5, MI_Fs5, MI_E5, MI_Ds5,
+ MI_C3, MI_D3, MI_G3, MI_As4, MI_C5, MI_D5,
+ TG_SWAP, MI_B2, MI_E3, MI_Cs4, MI_Fs3, MI_A3, MI_C4, MI_E4,
+ MI_A2, MI_F3, MI_As3, MI_Gs3, MI_B3, MI_D4, MI_Gs4, MI_B4,
+ MI_Gs2, MI_As2, MI_Ds3, MI_F4, MI_Ds4, MI_Fs4, MI_A4, MI_Cs5, MI_G4
),
[_CLOSE] = LAYOUT(
- MI_Gs_1, MI_As_1, MI_Ds_2, MI_Ds_3, MI_G_3,
- MI_D_1, MI_D_2, MI_As_2, MI_C_3, MI_Cs_2, MI_C_2, MI_Fs_1,
- MI_G_1, MI_G_2, MI_B_2, MI_D_3, MI_F_3, MI_Fs_2, TG_SWAP,
- MI_A_1, MI_E_2, MI_A_2, MI_Cs_3, MI_E_3, MI_Gs_2, MI_B_1,
- MI_E_1, MI_E_2, MI_Fs_3, MI_Gs_3, MI_B_3, MI_F_2, MI_Cs_1, MI_F_1,
+ MI_Gs1, MI_As1, MI_Ds2, MI_Ds3, MI_G3,
+ MI_D1, MI_D2, MI_As2, MI_C3, MI_Cs2, MI_C2, MI_Fs1,
+ MI_G1, MI_G2, MI_B2, MI_D3, MI_F3, MI_Fs2, TG_SWAP,
+ MI_A1, MI_E2, MI_A2, MI_Cs3, MI_E3, MI_Gs2, MI_B1,
+ MI_E1, MI_E2, MI_Fs3, MI_Gs3, MI_B3, MI_F2, MI_Cs1, MI_F1,
- MO_SWAP, MI_A_5, MI_Gs_5, MI_Fs_5, MI_F_5, FN_MUTE,
- MI_C_3, MI_G_5, MI_As_4, MI_C_5, MI_Ds_5, KC_VOLD, KC_VOLU,
- MI_D_3, MI_Cs_3, MI_Gs_3, MI_As_3, MI_C_4, MI_D_5,
- TG_SWAP, MI_B_2, MI_Fs_3, MI_Fs_4, MI_G_3, MI_B_3, MI_D_4, MI_G_4,
- MI_A_2, MI_F_3, MI_E_3, MI_A_3, MI_Cs_4, MI_E_4, MI_A_4, MI_Cs_5,
- MI_Gs_2, MI_As_2, MI_Ds_3, MI_F_4, MI_E_4, MI_Gs_4, MI_B_4, MI_E_5, MI_Ds_4
+ MO_SWAP, MI_A5, MI_Gs5, MI_Fs5, MI_F5, FN_MUTE,
+ MI_C3, MI_G5, MI_As4, MI_C5, MI_Ds5,
+ MI_D3, MI_Cs3, MI_Gs3, MI_As3, MI_C4, MI_D5,
+ TG_SWAP, MI_B2, MI_Fs3, MI_Fs4, MI_G3, MI_B3, MI_D4, MI_G4,
+ MI_A2, MI_F3, MI_E3, MI_A3, MI_Cs4, MI_E4, MI_A4, MI_Cs5,
+ MI_Gs2, MI_As2, MI_Ds3, MI_F4, MI_E4, MI_Gs4, MI_B4, MI_E5, MI_Ds4
),
[_FN] = LAYOUT(
@@ -71,7 +71,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, MI_OCTD, MI_OCTU, MI_VELD, MI_VELU, _______,
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION,
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
@@ -79,9 +79,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
)
};
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
+ [_OPEN] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [_CLOSE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [_FN] = { ENCODER_CCW_CW(_______, _______) },
+};
+#endif
+
void keyboard_post_init_user(void) {
- // Set octave to MI_OCT_0
- midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN;
+ // Set octave to 0
+ midi_config.octave = QK_MIDI_OCTAVE_0 - MIDI_OCTAVE_MIN;
// avoid using 127 since it is used as a special number in some sound sources.
midi_config.velocity = MIDI_INITIAL_VELOCITY;
diff --git a/keyboards/bandominedoni/keymaps/default/rules.mk b/keyboards/bandominedoni/keymaps/default/rules.mk
new file mode 100644
index 0000000000..8006608ea9
--- /dev/null
+++ b/keyboards/bandominedoni/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes # replacing ENCODERS_CW_KEY method to this on 2022/08/31.
diff --git a/keyboards/bandominedoni/keymaps/led/keymap.c b/keyboards/bandominedoni/keymaps/led/keymap.c
index 6fe2f4b6f1..b0f0e95528 100644
--- a/keyboards/bandominedoni/keymaps/led/keymap.c
+++ b/keyboards/bandominedoni/keymaps/led/keymap.c
@@ -64,44 +64,44 @@ enum custom_keycodes {
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_OPEN] = LAYOUT(
- MI_Gs_1, MI_As_1, MI_Cs_2, MI_F_2, MI_Gs_3,
- MI_E_1, MI_A_1, MI_G_2, MI_Ds_2, MI_F_3, MI_As_2, MI_F_1,
- MI_D_2, MI_A_2, MI_C_3, MI_E_3, MI_C_2, MI_G_1, TG_SWAP,
- MI_E_2, MI_Gs_2, MI_B_2, MI_D_3, MI_Fs_3, MI_Cs_3, MI_Fs_1,
- MI_D_1, MI_B_1, MI_G_3, MI_A_3, MI_Ds_3, MI_Fs_2, MI_Ds_1, MI_C_1,
+ MI_Gs1, MI_As1, MI_Cs2, MI_F2, MI_Gs3,
+ MI_E1, MI_A1, MI_G2, MI_Ds2, MI_F3, MI_As2, MI_F1,
+ MI_D2, MI_A2, MI_C3, MI_E3, MI_C2, MI_G1, TG_SWAP,
+ MI_E2, MI_Gs2, MI_B2, MI_D3, MI_Fs3, MI_Cs3, MI_Fs1,
+ MI_D1, MI_B1, MI_G3, MI_A3, MI_Ds3, MI_Fs2, MI_Ds1, MI_C1,
- MO_SWAP, MI_B_5, MI_Gs_5, MI_G_5, MI_F_5, FN_MUTE,
- MI_Cs_3, MI_A_5, MI_Fs_5, MI_E_5, MI_Ds_5, KC_VOLD, KC_VOLU,
- MI_C_3, MI_D_3, MI_G_3, MI_As_4, MI_C_5, MI_D_5,
- TG_SWAP, MI_B_2, MI_E_3, MI_Cs_4, MI_Fs_3, MI_A_3, MI_C_4, MI_E_4,
- MI_A_2, MI_F_3, MI_As_3, MI_Gs_3, MI_B_3, MI_D_4, MI_Gs_4, MI_B_4,
- MI_Gs_2, MI_As_2, MI_Ds_3, MI_F_4, MI_Ds_4, MI_Fs_4, MI_A_4, MI_Cs_5, MI_G_4
+ MO_SWAP, MI_B5, MI_Gs5, MI_G5, MI_F5, FN_MUTE,
+ MI_Cs3, MI_A5, MI_Fs5, MI_E5, MI_Ds5,
+ MI_C3, MI_D3, MI_G3, MI_As4, MI_C5, MI_D5,
+ TG_SWAP, MI_B2, MI_E3, MI_Cs4, MI_Fs3, MI_A3, MI_C4, MI_E4,
+ MI_A2, MI_F3, MI_As3, MI_Gs3, MI_B3, MI_D4, MI_Gs4, MI_B4,
+ MI_Gs2, MI_As2, MI_Ds3, MI_F4, MI_Ds4, MI_Fs4, MI_A4, MI_Cs5, MI_G4
),
[_CLOSE] = LAYOUT(
- MI_Gs_1, MI_As_1, MI_Ds_2, MI_Ds_3, MI_G_3,
- MI_D_1, MI_D_2, MI_As_2, MI_C_3, MI_Cs_2, MI_C_2, MI_Fs_1,
- MI_G_1, MI_G_2, MI_B_2, MI_D_3, MI_F_3, MI_Fs_2, TG_SWAP,
- MI_A_1, MI_E_2, MI_A_2, MI_Cs_3, MI_E_3, MI_Gs_2, MI_B_1,
- MI_E_1, MI_E_2, MI_Fs_3, MI_Gs_3, MI_B_3, MI_F_2, MI_Cs_1, MI_F_1,
+ MI_Gs1, MI_As1, MI_Ds2, MI_Ds3, MI_G3,
+ MI_D1, MI_D2, MI_As2, MI_C3, MI_Cs2, MI_C2, MI_Fs1,
+ MI_G1, MI_G2, MI_B2, MI_D3, MI_F3, MI_Fs2, TG_SWAP,
+ MI_A1, MI_E2, MI_A2, MI_Cs3, MI_E3, MI_Gs2, MI_B1,
+ MI_E1, MI_E2, MI_Fs3, MI_Gs3, MI_B3, MI_F2, MI_Cs1, MI_F1,
- MO_SWAP, MI_A_5, MI_Gs_5, MI_Fs_5, MI_F_5, FN_MUTE,
- MI_C_3, MI_G_5, MI_As_4, MI_C_5, MI_Ds_5, KC_VOLD, KC_VOLU,
- MI_D_3, MI_Cs_3, MI_Gs_3, MI_As_3, MI_C_4, MI_D_5,
- TG_SWAP, MI_B_2, MI_Fs_3, MI_Fs_4, MI_G_3, MI_B_3, MI_D_4, MI_G_4,
- MI_A_2, MI_F_3, MI_E_3, MI_A_3, MI_Cs_4, MI_E_4, MI_A_4, MI_Cs_5,
- MI_Gs_2, MI_As_2, MI_Ds_3, MI_F_4, MI_E_4, MI_Gs_4, MI_B_4, MI_E_5, MI_Ds_4
+ MO_SWAP, MI_A5, MI_Gs5, MI_Fs5, MI_F5, FN_MUTE,
+ MI_C3, MI_G5, MI_As4, MI_C5, MI_Ds5,
+ MI_D3, MI_Cs3, MI_Gs3, MI_As3, MI_C4, MI_D5,
+ TG_SWAP, MI_B2, MI_Fs3, MI_Fs4, MI_G3, MI_B3, MI_D4, MI_G4,
+ MI_A2, MI_F3, MI_E3, MI_A3, MI_Cs4, MI_E4, MI_A4, MI_Cs5,
+ MI_Gs2, MI_As2, MI_Ds3, MI_F4, MI_E4, MI_Gs4, MI_B4, MI_E5, MI_Ds4
),
[_QWERTY] = LAYOUT_wrapper(
_________________NUMBER_L__________________,
- KC_GESC, KC_TAB, _________________QWERTY_L1_________________,
+ QK_GESC, KC_TAB, _________________QWERTY_L1_________________,
KC_CAPS, _________________QWERTY_L2_________________, KC_H,
KC_LSFT, _________________QWERTY_L3_________________, KC_N,
KC_LCTL, KC_GRV, KC_LGUI, KC_LALT, MIS_EIS, KC_SPC, KC_SPC, KC_PSCR,
MO(_MISC), KC_LBRC, KC_RBRC, KC_BSLS, KC_0, _______,
- KC_6, KC_7, KC_8, KC_9, KC_BSPC, _______, _______,
+ KC_6, KC_7, KC_8, KC_9, KC_BSPC,
_________________QWERTY_R1_________________, KC_DEL,
KC_PGUP, KC_G, _________________QWERTY_R2_________________, KC_ENT,
KC_PGDN, KC_B, _________________QWERTY_R3_________________, KC_RSFT,
@@ -110,13 +110,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_COLEMAK] = LAYOUT_wrapper(
_________________NUMBER_L__________________,
- KC_GESC, KC_TAB, _________________COLEMAK_L1________________,
+ QK_GESC, KC_TAB, _________________COLEMAK_L1________________,
KC_LCTL, _________________COLEMAK_L2________________, KC_ENT,
KC_LSFT, _________________COLEMAK_L3________________, KC_M,
KC_CAPS, KC_GRV, KC_LGUI, KC_LALT, MIS_EIS, KC_SPC, KC_SPC, KC_PSCR,
MO(_MISC), KC_LBRC, KC_RBRC, KC_BSLS, KC_0, _______,
- KC_6, KC_7, KC_8, KC_9, KC_BSPC, _______, _______,
+ KC_6, KC_7, KC_8, KC_9, KC_BSPC,
_________________COLEMAK_R1________________, KC_DEL,
KC_PGUP, KC_D, _________________COLEMAK_R2________________, KC_ENT,
KC_PGDN, KC_B, _________________COLEMAK_R3________________, KC_RSFT,
@@ -131,7 +131,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, KC_F10, _______,
- KC_F6, KC_F7, KC_F8, KC_F9, _______, _______, _______,
+ KC_F6, KC_F7, KC_F8, KC_F9, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, KC_QUOT, _______,
_______, _______, _______, _______, _______, _______, _______, _______,
@@ -146,17 +146,28 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
XXXXXXX, XXXXXXX, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, MI_OCTD, MI_OCTU, MI_VELD, MI_VELU, _______,
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RMOD, RGB_MOD,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION,
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
RGB_SAD, RGB_SAI, RGB_HUD, RGB_HUI, RGB_SPD, RGB_SPI, RGB_VAD, RGB_VAI,
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RMOD, RGB_MOD, EEP_RST, RGB_TOG
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RMOD, RGB_MOD, EE_CLR, RGB_TOG
)
};
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
+ [_OPEN] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [_CLOSE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [_QWERTY] = { ENCODER_CCW_CW(_______, _______) },
+ [_COLEMAK] = { ENCODER_CCW_CW(_______, _______) },
+ [_MISC] = { ENCODER_CCW_CW(_______, _______) },
+ [_FN] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) },
+};
+#endif
+
void my_init(void){
- // Set octave to MI_OCT_0
- midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN;
+ // Set octave to 0
+ midi_config.octave = QK_MIDI_OCTAVE_0 - MIDI_OCTAVE_MIN;
// avoid using 127 since it is used as a special number in some sound sources.
midi_config.velocity = MIDI_INITIAL_VELOCITY;
@@ -167,7 +178,7 @@ void eeconfig_init_user(void) { // EEPROM is getting reset!
my_init();
#ifdef RGB_MATRIX_ENABLE
rgb_matrix_enable();
- rgb_matrix_set_speed(RGB_MATRIX_STARTUP_SPD);
+ rgb_matrix_set_speed(RGB_MATRIX_DEFAULT_SPD);
rgb_matrix_sethsv(HSV_BLUE);
rgb_matrix_mode(RGB_MATRIX_SOLID_REACTIVE);
@@ -194,9 +205,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
#ifdef RGB_MATRIX_ENABLE
-void rgb_matrix_indicators_user(void) {
+bool rgb_matrix_indicators_user(void) {
if (rgb_matrix_is_enabled()) { // turn the lights on when it is enabled.
- uint8_t layer = biton32(layer_state);
+ uint8_t layer = get_highest_layer(layer_state);
switch (layer) {
case _CLOSE:
// rgb_matrix_set_color(pgm_read_byte(&convert_led_location2number[11]), RGB_RED); // RGB_TOG <- too heavy.
@@ -232,12 +243,13 @@ void rgb_matrix_indicators_user(void) {
rgb_matrix_set_color(31, RGB_DARKBLUE); // RGB_RMOD
rgb_matrix_set_color(37, RGB_DARKBLUE); // RGB_MOD
- rgb_matrix_set_color(38, RGB_DARKPINK); // EEP_RST
+ rgb_matrix_set_color(38, RGB_DARKPINK); // EE_CLR
rgb_matrix_set_color(40, RGB_DARKRED); // RGB_TOG
rgb_matrix_set_color(41, RGB_DARKORANGE); // _FN
break;
}
}
+ return false;
}
#endif
diff --git a/keyboards/bandominedoni/keymaps/led/rules.mk b/keyboards/bandominedoni/keymaps/led/rules.mk
index 08ed472ad6..0a1c4b1858 100644
--- a/keyboards/bandominedoni/keymaps/led/rules.mk
+++ b/keyboards/bandominedoni/keymaps/led/rules.mk
@@ -1,2 +1,4 @@
RGB_MATRIX_ENABLE = yes # Use RGB matrix (Don't enable this when RGBLIGHT_ENABLE is used.)
RGB_MATRIX_CUSTOM_KB = yes #
+
+ENCODER_MAP_ENABLE = yes # replacing ENCODERS_CW_KEY method to this on 2022/08/31.
diff --git a/keyboards/bandominedoni/keymaps/lednotg/keymap.c b/keyboards/bandominedoni/keymaps/lednotg/keymap.c
index fa523793b1..80410eadac 100644
--- a/keyboards/bandominedoni/keymaps/lednotg/keymap.c
+++ b/keyboards/bandominedoni/keymaps/lednotg/keymap.c
@@ -49,10 +49,10 @@ enum layer_names {
#ifdef PEDAL_NORMALLY_CLOSED
_OPEN,
#endif
- _QWERTY,
- _COLEMAK,
- _MISC,
- _FN
+ _QWERTY,
+ _COLEMAK,
+ _MISC,
+ _FN
};
enum custom_keycodes {
@@ -64,44 +64,44 @@ enum custom_keycodes {
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_OPEN] = LAYOUT(
- MI_Gs_1, MI_As_1, MI_Cs_2, MI_F_2, MI_Gs_3,
- MI_E_1, MI_A_1, MI_G_2, MI_Ds_2, MI_F_3, MI_As_2, MI_F_1,
- MI_D_2, MI_A_2, MI_C_3, MI_E_3, MI_C_2, MI_G_1, MI_B,
- MI_E_2, MI_Gs_2, MI_B_2, MI_D_3, MI_Fs_3, MI_Cs_3, MI_Fs_1,
- MI_D_1, MI_B_1, MI_G_3, MI_A_3, MI_Ds_3, MI_Fs_2, MI_Ds_1, MI_C_1,
+ MI_Gs1, MI_As1, MI_Cs2, MI_F2, MI_Gs3,
+ MI_E1, MI_A1, MI_G2, MI_Ds2, MI_F3, MI_As2, MI_F1,
+ MI_D2, MI_A2, MI_C3, MI_E3, MI_C2, MI_G1, MI_B,
+ MI_E2, MI_Gs2, MI_B2, MI_D3, MI_Fs3, MI_Cs3, MI_Fs1,
+ MI_D1, MI_B1, MI_G3, MI_A3, MI_Ds3, MI_Fs2, MI_Ds1, MI_C1,
- MO_SWAP, MI_B_5, MI_Gs_5, MI_G_5, MI_F_5, FN_MUTE,
- MI_Cs_3, MI_A_5, MI_Fs_5, MI_E_5, MI_Ds_5, KC_VOLD, KC_VOLU,
- MI_C_3, MI_D_3, MI_G_3, MI_As_4, MI_C_5, MI_D_5,
- MI_G_2, MI_B_2, MI_E_3, MI_Cs_4, MI_Fs_3, MI_A_3, MI_C_4, MI_E_4,
- MI_A_2, MI_F_3, MI_As_3, MI_Gs_3, MI_B_3, MI_D_4, MI_Gs_4, MI_B_4,
- MI_Gs_2, MI_As_2, MI_Ds_3, MI_F_4, MI_Ds_4, MI_Fs_4, MI_A_4, MI_Cs_5, MI_G_4
+ MO_SWAP, MI_B5, MI_Gs5, MI_G5, MI_F5, FN_MUTE,
+ MI_Cs3, MI_A5, MI_Fs5, MI_E5, MI_Ds5,
+ MI_C3, MI_D3, MI_G3, MI_As4, MI_C5, MI_D5,
+ MI_G2, MI_B2, MI_E3, MI_Cs4, MI_Fs3, MI_A3, MI_C4, MI_E4,
+ MI_A2, MI_F3, MI_As3, MI_Gs3, MI_B3, MI_D4, MI_Gs4, MI_B4,
+ MI_Gs2, MI_As2, MI_Ds3, MI_F4, MI_Ds4, MI_Fs4, MI_A4, MI_Cs5, MI_G4
),
[_CLOSE] = LAYOUT(
- MI_Gs_1, MI_As_1, MI_Ds_2, MI_Ds_3, MI_G_3,
- MI_D_1, MI_D_2, MI_As_2, MI_C_3, MI_Cs_2, MI_C_2, MI_Fs_1,
- MI_G_1, MI_G_2, MI_B_2, MI_D_3, MI_F_3, MI_Fs_2, MI_B,
- MI_A_1, MI_E_2, MI_A_2, MI_Cs_3, MI_E_3, MI_Gs_2, MI_B_1,
- MI_E_1, MI_E_2, MI_Fs_3, MI_Gs_3, MI_B_3, MI_F_2, MI_Cs_1, MI_F_1,
+ MI_Gs1, MI_As1, MI_Ds2, MI_Ds3, MI_G3,
+ MI_D1, MI_D2, MI_As2, MI_C3, MI_Cs2, MI_C2, MI_Fs1,
+ MI_G1, MI_G2, MI_B2, MI_D3, MI_F3, MI_Fs2, MI_B,
+ MI_A1, MI_E2, MI_A2, MI_Cs3, MI_E3, MI_Gs2, MI_B1,
+ MI_E1, MI_E2, MI_Fs3, MI_Gs3, MI_B3, MI_F2, MI_Cs1, MI_F1,
- MO_SWAP, MI_A_5, MI_Gs_5, MI_Fs_5, MI_F_5, FN_MUTE,
- MI_C_3, MI_G_5, MI_As_4, MI_C_5, MI_Ds_5, KC_VOLD, KC_VOLU,
- MI_D_3, MI_Cs_3, MI_Gs_3, MI_As_3, MI_C_4, MI_D_5,
- MI_G_2, MI_B_2, MI_Fs_3, MI_Fs_4, MI_G_3, MI_B_3, MI_D_4, MI_G_4,
- MI_A_2, MI_F_3, MI_E_3, MI_A_3, MI_Cs_4, MI_E_4, MI_A_4, MI_Cs_5,
- MI_Gs_2, MI_As_2, MI_Ds_3, MI_F_4, MI_E_4, MI_Gs_4, MI_B_4, MI_E_5, MI_Ds_4
+ MO_SWAP, MI_A5, MI_Gs5, MI_Fs5, MI_F5, FN_MUTE,
+ MI_C3, MI_G5, MI_As4, MI_C5, MI_Ds5,
+ MI_D3, MI_Cs3, MI_Gs3, MI_As3, MI_C4, MI_D5,
+ MI_G2, MI_B2, MI_Fs3, MI_Fs4, MI_G3, MI_B3, MI_D4, MI_G4,
+ MI_A2, MI_F3, MI_E3, MI_A3, MI_Cs4, MI_E4, MI_A4, MI_Cs5,
+ MI_Gs2, MI_As2, MI_Ds3, MI_F4, MI_E4, MI_Gs4, MI_B4, MI_E5, MI_Ds4
),
[_QWERTY] = LAYOUT_wrapper(
_________________NUMBER_L__________________,
- KC_GESC, KC_TAB, _________________QWERTY_L1_________________,
+ QK_GESC, KC_TAB, _________________QWERTY_L1_________________,
KC_CAPS, _________________QWERTY_L2_________________, KC_H,
KC_LSFT, _________________QWERTY_L3_________________, KC_N,
KC_LCTL, KC_GRV, KC_LGUI, KC_LALT, MIS_EIS, KC_SPC, KC_SPC, KC_PSCR,
MO(_MISC), KC_LBRC, KC_RBRC, KC_BSLS, KC_0, _______,
- KC_6, KC_7, KC_8, KC_9, KC_BSPC, _______, _______,
+ KC_6, KC_7, KC_8, KC_9, KC_BSPC,
_________________QWERTY_R1_________________, KC_DEL,
KC_PGUP, KC_G, _________________QWERTY_R2_________________, KC_ENT,
KC_PGDN, KC_B, _________________QWERTY_R3_________________, KC_RSFT,
@@ -110,13 +110,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_COLEMAK] = LAYOUT_wrapper(
_________________NUMBER_L__________________,
- KC_GESC, KC_TAB, _________________COLEMAK_L1________________,
+ QK_GESC, KC_TAB, _________________COLEMAK_L1________________,
KC_LCTL, _________________COLEMAK_L2________________, KC_ENT,
KC_LSFT, _________________COLEMAK_L3________________, KC_M,
KC_CAPS, KC_GRV, KC_LGUI, KC_LALT, MIS_EIS, KC_SPC, KC_SPC, KC_PSCR,
MO(_MISC), KC_LBRC, KC_RBRC, KC_BSLS, KC_0, _______,
- KC_6, KC_7, KC_8, KC_9, KC_BSPC, _______, _______,
+ KC_6, KC_7, KC_8, KC_9, KC_BSPC,
_________________COLEMAK_R1________________, KC_DEL,
KC_PGUP, KC_D, _________________COLEMAK_R2________________, KC_ENT,
KC_PGDN, KC_B, _________________COLEMAK_R3________________, KC_RSFT,
@@ -131,7 +131,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, KC_F10, _______,
- KC_F6, KC_F7, KC_F8, KC_F9, _______, _______, _______,
+ KC_F6, KC_F7, KC_F8, KC_F9, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, KC_QUOT, _______,
_______, _______, _______, _______, _______, _______, _______, _______,
@@ -145,18 +145,29 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
- _______, MI_OCTD, MI_OCTU, MI_VELD, MI_VELU, _______,
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RMOD, RGB_MOD,
+ _______, KC_VOLD, KC_VOLU, MI_VELD, MI_VELU, _______,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION,
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
RGB_SAD, RGB_SAI, RGB_HUD, RGB_HUI, RGB_SPD, RGB_SPI, RGB_VAD, RGB_VAI,
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RMOD, RGB_MOD, EEP_RST, RGB_TOG
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RMOD, RGB_MOD, EE_CLR, RGB_TOG
)
};
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
+ [_OPEN] = { ENCODER_CCW_CW(MI_OCTD, MI_OCTU) },
+ [_CLOSE] = { ENCODER_CCW_CW(MI_OCTD, MI_OCTU) },
+ [_QWERTY] = { ENCODER_CCW_CW(_______, _______) },
+ [_COLEMAK] = { ENCODER_CCW_CW(_______, _______) },
+ [_MISC] = { ENCODER_CCW_CW(_______, _______) },
+ [_FN] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) },
+};
+#endif
+
void my_init(void){
- // Set octave to MI_OCT_0
- midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN;
+ // Set octave to 0
+ midi_config.octave = QK_MIDI_OCTAVE_0 - MIDI_OCTAVE_MIN;
// avoid using 127 since it is used as a special number in some sound sources.
midi_config.velocity = MIDI_INITIAL_VELOCITY;
@@ -167,7 +178,7 @@ void eeconfig_init_user(void) { // EEPROM is getting reset!
my_init();
#ifdef RGB_MATRIX_ENABLE
rgb_matrix_enable();
- rgb_matrix_set_speed(RGB_MATRIX_STARTUP_SPD);
+ rgb_matrix_set_speed(RGB_MATRIX_DEFAULT_SPD);
rgb_matrix_sethsv(HSV_BLUE);
rgb_matrix_mode(RGB_MATRIX_SOLID_REACTIVE);
@@ -194,7 +205,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
#ifdef RGB_MATRIX_ENABLE
-void rgb_matrix_indicators_user(void) {
+bool rgb_matrix_indicators_user(void) {
if (rgb_matrix_is_enabled()) { // turn the lights on when it is enabled.
uint8_t layer = biton32(layer_state);
switch (layer) {
@@ -232,12 +243,13 @@ void rgb_matrix_indicators_user(void) {
rgb_matrix_set_color(31, RGB_DARKBLUE); // RGB_RMOD
rgb_matrix_set_color(37, RGB_DARKBLUE); // RGB_MOD
- rgb_matrix_set_color(38, RGB_DARKPINK); // EEP_RST
+ rgb_matrix_set_color(38, RGB_DARKPINK); // EE_CLR
rgb_matrix_set_color(40, RGB_DARKRED); // RGB_TOG
rgb_matrix_set_color(41, RGB_DARKORANGE); // _FN
break;
}
}
+ return false;
}
#endif
diff --git a/keyboards/bandominedoni/keymaps/lednotg/rules.mk b/keyboards/bandominedoni/keymaps/lednotg/rules.mk
index 08ed472ad6..0a1c4b1858 100644
--- a/keyboards/bandominedoni/keymaps/lednotg/rules.mk
+++ b/keyboards/bandominedoni/keymaps/lednotg/rules.mk
@@ -1,2 +1,4 @@
RGB_MATRIX_ENABLE = yes # Use RGB matrix (Don't enable this when RGBLIGHT_ENABLE is used.)
RGB_MATRIX_CUSTOM_KB = yes #
+
+ENCODER_MAP_ENABLE = yes # replacing ENCODERS_CW_KEY method to this on 2022/08/31.
diff --git a/keyboards/bandominedoni/keymaps/via/keymap.c b/keyboards/bandominedoni/keymaps/via/keymap.c
index 5b13d03d4b..b600cb0be4 100644
--- a/keyboards/bandominedoni/keymaps/via/keymap.c
+++ b/keyboards/bandominedoni/keymaps/via/keymap.c
@@ -35,33 +35,33 @@ enum custom_keycodes {
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_OPEN] = LAYOUT(
- MI_Gs_1, MI_As_1, MI_Cs_2, MI_F_2, MI_Gs_3,
- MI_E_1, MI_A_1, MI_G_2, MI_Ds_2, MI_F_3, MI_As_2, MI_F_1,
- MI_D_2, MI_A_2, MI_C_3, MI_E_3, MI_C_2, MI_G_1, TG_SWAP,
- MI_E_2, MI_Gs_2, MI_B_2, MI_D_3, MI_Fs_3, MI_Cs_3, MI_Fs_1,
- MI_D_1, MI_B_1, MI_G_3, MI_A_3, MI_Ds_3, MI_Fs_2, MI_Ds_1, MI_C_1,
+ MI_Gs1, MI_As1, MI_Cs2, MI_F2, MI_Gs3,
+ MI_E1, MI_A1, MI_G2, MI_Ds2, MI_F3, MI_As2, MI_F1,
+ MI_D2, MI_A2, MI_C3, MI_E3, MI_C2, MI_G1, TG_SWAP,
+ MI_E2, MI_Gs2, MI_B2, MI_D3, MI_Fs3, MI_Cs3, MI_Fs1,
+ MI_D1, MI_B1, MI_G3, MI_A3, MI_Ds3, MI_Fs2, MI_Ds1, MI_C1,
- MO_SWAP, MI_B_5, MI_Gs_5, MI_G_5, MI_F_5, FN_MUTE,
- MI_Cs_3, MI_A_5, MI_Fs_5, MI_E_5, MI_Ds_5, KC_VOLD, KC_VOLU,
- MI_C_3, MI_D_3, MI_G_3, MI_As_4, MI_C_5, MI_D_5,
- TG_SWAP, MI_B_2, MI_E_3, MI_Cs_4, MI_Fs_3, MI_A_3, MI_C_4, MI_E_4,
- MI_A_2, MI_F_3, MI_As_3, MI_Gs_3, MI_B_3, MI_D_4, MI_Gs_4, MI_B_4,
- MI_Gs_2, MI_As_2, MI_Ds_3, MI_F_4, MI_Ds_4, MI_Fs_4, MI_A_4, MI_Cs_5, MI_G_4
+ MO_SWAP, MI_B5, MI_Gs5, MI_G5, MI_F5, FN_MUTE,
+ MI_Cs3, MI_A5, MI_Fs5, MI_E5, MI_Ds5,
+ MI_C3, MI_D3, MI_G3, MI_As4, MI_C5, MI_D5,
+ TG_SWAP, MI_B2, MI_E3, MI_Cs4, MI_Fs3, MI_A3, MI_C4, MI_E4,
+ MI_A2, MI_F3, MI_As3, MI_Gs3, MI_B3, MI_D4, MI_Gs4, MI_B4,
+ MI_Gs2, MI_As2, MI_Ds3, MI_F4, MI_Ds4, MI_Fs4, MI_A4, MI_Cs5, MI_G4
),
[_CLOSE] = LAYOUT(
- MI_Gs_1, MI_As_1, MI_Ds_2, MI_Ds_3, MI_G_3,
- MI_D_1, MI_D_2, MI_As_2, MI_C_3, MI_Cs_2, MI_C_2, MI_Fs_1,
- MI_G_1, MI_G_2, MI_B_2, MI_D_3, MI_F_3, MI_Fs_2, TG_SWAP,
- MI_A_1, MI_E_2, MI_A_2, MI_Cs_3, MI_E_3, MI_Gs_2, MI_B_1,
- MI_E_1, MI_E_2, MI_Fs_3, MI_Gs_3, MI_B_3, MI_F_2, MI_Cs_1, MI_F_1,
+ MI_Gs1, MI_As1, MI_Ds2, MI_Ds3, MI_G3,
+ MI_D1, MI_D2, MI_As2, MI_C3, MI_Cs2, MI_C2, MI_Fs1,
+ MI_G1, MI_G2, MI_B2, MI_D3, MI_F3, MI_Fs2, TG_SWAP,
+ MI_A1, MI_E2, MI_A2, MI_Cs3, MI_E3, MI_Gs2, MI_B1,
+ MI_E1, MI_E2, MI_Fs3, MI_Gs3, MI_B3, MI_F2, MI_Cs1, MI_F1,
- MO_SWAP, MI_A_5, MI_Gs_5, MI_Fs_5, MI_F_5, FN_MUTE,
- MI_C_3, MI_G_5, MI_As_4, MI_C_5, MI_Ds_5, KC_VOLD, KC_VOLU,
- MI_D_3, MI_Cs_3, MI_Gs_3, MI_As_3, MI_C_4, MI_D_5,
- TG_SWAP, MI_B_2, MI_Fs_3, MI_Fs_4, MI_G_3, MI_B_3, MI_D_4, MI_G_4,
- MI_A_2, MI_F_3, MI_E_3, MI_A_3, MI_Cs_4, MI_E_4, MI_A_4, MI_Cs_5,
- MI_Gs_2, MI_As_2, MI_Ds_3, MI_F_4, MI_E_4, MI_Gs_4, MI_B_4, MI_E_5, MI_Ds_4
+ MO_SWAP, MI_A5, MI_Gs5, MI_Fs5, MI_F5, FN_MUTE,
+ MI_C3, MI_G5, MI_As4, MI_C5, MI_Ds5,
+ MI_D3, MI_Cs3, MI_Gs3, MI_As3, MI_C4, MI_D5,
+ TG_SWAP, MI_B2, MI_Fs3, MI_Fs4, MI_G3, MI_B3, MI_D4, MI_G4,
+ MI_A2, MI_F3, MI_E3, MI_A3, MI_Cs4, MI_E4, MI_A4, MI_Cs5,
+ MI_Gs2, MI_As2, MI_Ds3, MI_F4, MI_E4, MI_Gs4, MI_B4, MI_E5, MI_Ds4
),
[_MISC] = LAYOUT(
@@ -72,7 +72,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
- _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______,
@@ -87,17 +87,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, MI_OCTD, MI_OCTU, MI_VELD, MI_VELU, _______,
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RMOD, RGB_MOD,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION,
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
RGB_SAD, RGB_SAI, RGB_HUD, RGB_HUI, RGB_SPD, RGB_SPI, RGB_VAD, RGB_VAI,
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RMOD, RGB_MOD, EEP_RST, RGB_TOG
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RMOD, RGB_MOD, EE_CLR, RGB_TOG
)
};
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
+ [_OPEN] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [_CLOSE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [_MISC] = { ENCODER_CCW_CW(_______, _______) },
+ [_FN] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) },
+};
+#endif
+
void my_init(void){
- // Set octave to MI_OCT_0
- midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN;
+ // Set octave to 0
+ midi_config.octave = QK_MIDI_OCTAVE_0 - MIDI_OCTAVE_MIN;
// avoid using 127 since it is used as a special number in some sound sources.
midi_config.velocity = MIDI_INITIAL_VELOCITY;
@@ -108,7 +117,7 @@ void eeconfig_init_user(void) { // EEPROM is getting reset!
my_init();
#ifdef RGB_MATRIX_ENABLE
rgb_matrix_enable();
- rgb_matrix_set_speed(RGB_MATRIX_STARTUP_SPD);
+ rgb_matrix_set_speed(RGB_MATRIX_DEFAULT_SPD);
rgb_matrix_sethsv(HSV_BLUE);
rgb_matrix_mode(RGB_MATRIX_SOLID_REACTIVE);
@@ -132,9 +141,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
#ifdef RGB_MATRIX_ENABLE
-void rgb_matrix_indicators_user(void) {
+bool rgb_matrix_indicators_user(void) {
if (rgb_matrix_is_enabled()) { // turn the lights on when it is enabled.
- uint8_t layer = biton32(layer_state);
+ uint8_t layer = get_highest_layer(layer_state);
switch (layer) {
case _CLOSE:
// rgb_matrix_set_color(pgm_read_byte(&convert_led_location2number[11]), RGB_RED); // RGB_TOG <- too heavy.
@@ -161,12 +170,13 @@ void rgb_matrix_indicators_user(void) {
rgb_matrix_set_color(31, RGB_DARKBLUE); // RGB_RMOD
rgb_matrix_set_color(37, RGB_DARKBLUE); // RGB_MOD
- rgb_matrix_set_color(38, RGB_DARKPINK); // EEP_RST
+ rgb_matrix_set_color(38, RGB_DARKPINK); // EE_CLR
rgb_matrix_set_color(40, RGB_DARKRED); // RGB_TOG
rgb_matrix_set_color(41, RGB_DARKORANGE); // _FN
break;
}
}
+ return false;
}
#endif
diff --git a/keyboards/bandominedoni/keymaps/via/rules.mk b/keyboards/bandominedoni/keymaps/via/rules.mk
index 71eb1ebf8e..8fa76afafc 100644
--- a/keyboards/bandominedoni/keymaps/via/rules.mk
+++ b/keyboards/bandominedoni/keymaps/via/rules.mk
@@ -1,3 +1,5 @@
RGB_MATRIX_ENABLE = yes # Use RGB matrix (Don't enable this when RGBLIGHT_ENABLE is used.)
RGB_MATRIX_CUSTOM_KB = yes #
VIA_ENABLE = yes
+
+ENCODER_MAP_ENABLE = yes # replacing ENCODERS_CW_KEY method to this on 2022/08/31.
diff --git a/keyboards/bantam44/config.h b/keyboards/bantam44/config.h
index 9933ec2fb3..6e0c57c838 100644
--- a/keyboards/bantam44/config.h
+++ b/keyboards/bantam44/config.h
@@ -28,7 +28,6 @@ along with this program. If not, see .
// COLS: Left to right, ROWS: Top to bottom
#define MATRIX_ROW_PINS { F0, D6, D4, D5 }
#define MATRIX_COL_PINS { B0, B1, B2, B3, B7, D0, B6, F7, F6, F5, F4, F1 }
-#define UNUSED_PINS
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/barleycorn_smd/config.h b/keyboards/barleycorn_smd/config.h
index ba9e2b9185..bab979faff 100644
--- a/keyboards/barleycorn_smd/config.h
+++ b/keyboards/barleycorn_smd/config.h
@@ -37,12 +37,20 @@ along with this program. If not, see .
/* A Custom matrix.c is used to poll the port expander C6 shows that the pins are hardwired there */
#define MATRIX_ROW_PINS { F5, F4, F1, F0, F6 }
#define MATRIX_COL_PINS { D4, D6, D7, B4, B5, B6, C6, C7, D5, D5, D5, D5, D5, D5, D5, D5, D5, D5 }
-#define UNUSED_PINS
#define PORT_EXPANDER_ADDRESS 0x20
#define RGB_DI_PIN E6
#define RGBLED_NUM 15
-#define RGBLIGHT_ANIMATIONS
+#define RGBLIGHT_EFFECT_BREATHING
+#define RGBLIGHT_EFFECT_RAINBOW_MOOD
+#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+#define RGBLIGHT_EFFECT_SNAKE
+#define RGBLIGHT_EFFECT_KNIGHT
+#define RGBLIGHT_EFFECT_CHRISTMAS
+#define RGBLIGHT_EFFECT_STATIC_GRADIENT
+#define RGBLIGHT_EFFECT_RGB_TEST
+#define RGBLIGHT_EFFECT_ALTERNATING
+#define RGBLIGHT_EFFECT_TWINKLE
#define RGBLIGHT_LED_MAP { 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 5 }
#define LED_CAPS_LOCK_PIN B2
diff --git a/keyboards/barleycorn_smd/keymaps/default/keymap.c b/keyboards/barleycorn_smd/keymaps/default/keymap.c
index 7a9c1c0478..9775a961ad 100644
--- a/keyboards/barleycorn_smd/keymaps/default/keymap.c
+++ b/keyboards/barleycorn_smd/keymaps/default/keymap.c
@@ -19,7 +19,7 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_ansi( /* Base */
- KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PEQL,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_BSPC,
diff --git a/keyboards/barleycorn_smd/keymaps/iso/keymap.c b/keyboards/barleycorn_smd/keymaps/iso/keymap.c
index 11af1a44cd..69460023fb 100644
--- a/keyboards/barleycorn_smd/keymaps/iso/keymap.c
+++ b/keyboards/barleycorn_smd/keymaps/iso/keymap.c
@@ -19,7 +19,7 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_iso( /* Base */
- KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_P7, KC_P8, KC_P9, KC_PEQL,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_BSPC,
diff --git a/keyboards/barleycorn_smd/keymaps/via/keymap.c b/keyboards/barleycorn_smd/keymaps/via/keymap.c
index 7ba35fc9c1..5f406174a9 100644
--- a/keyboards/barleycorn_smd/keymaps/via/keymap.c
+++ b/keyboards/barleycorn_smd/keymaps/via/keymap.c
@@ -19,7 +19,7 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_all( /* Base */
- KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PEQL,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_BSPC,
diff --git a/keyboards/barracuda/config.h b/keyboards/barracuda/config.h
index ea974876c7..d6cc58bd8b 100644
--- a/keyboards/barracuda/config.h
+++ b/keyboards/barracuda/config.h
@@ -34,7 +34,6 @@
*/
#define MATRIX_ROW_PINS { C4, C5, C6, D1, D2, D3 }
#define MATRIX_COL_PINS { D4, D5, D6, B0, B1, B2 }
-#define UNUSED_PINS
/* COL2ROW, ROW2COL */
#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/basekeys/slice/keymaps/default/keymap.c b/keyboards/basekeys/slice/keymaps/default/keymap.c
index 069b8660ab..12532f7201 100644
--- a/keyboards/basekeys/slice/keymaps/default/keymap.c
+++ b/keyboards/basekeys/slice/keymaps/default/keymap.c
@@ -32,7 +32,7 @@ enum custom_keycodes {
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT(
//,------------------------------------------------------------------------| |---------------------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
RGB_MODE_FORWARD, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
@@ -46,9 +46,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_FN] = LAYOUT(
//,-------------------------------------------------------------------------| |---------------------------------------------------------------------------.
- KC_ESC, TG(_ADJUST), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPACE,
+ KC_ESC, TG(_ADJUST), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
- _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUSE, KC_UP, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, KC_UP, _______, _______, _______,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_LEFT,KC_RIGHT, _______, _______,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
diff --git a/keyboards/basekeys/slice/keymaps/default_split_left_space/keymap.c b/keyboards/basekeys/slice/keymaps/default_split_left_space/keymap.c
index 245eccba3b..b899b2e53b 100644
--- a/keyboards/basekeys/slice/keymaps/default_split_left_space/keymap.c
+++ b/keyboards/basekeys/slice/keymaps/default_split_left_space/keymap.c
@@ -32,7 +32,7 @@ enum custom_keycodes {
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT_split_left_space(
//,------------------------------------------------------------------------| |---------------------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
RGB_MODE_FORWARD, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
@@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
//,-------------------------------------------------------------------------| |---------------------------------------------------------------------------.
KC_ESC, TG(_ADJUST), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
- _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUSE, KC_UP, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, KC_UP, _______, _______, _______,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_LEFT, KC_RIGHT, _______, _______,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
diff --git a/keyboards/basekeys/slice/rev1/.noci b/keyboards/basekeys/slice/rev1/.noci
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/keyboards/basekeys/slice/rev1/keymaps/2moons/keymap.c b/keyboards/basekeys/slice/rev1/keymaps/2moons/keymap.c
index 26ca151089..ea7c329bd2 100644
--- a/keyboards/basekeys/slice/rev1/keymaps/2moons/keymap.c
+++ b/keyboards/basekeys/slice/rev1/keymaps/2moons/keymap.c
@@ -46,14 +46,14 @@ enum tapdances{
};
qk_tap_dance_action_t tap_dance_actions[] = {
- [TD_ESFL] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _FLOCK),
- [TD_ESQW] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _QWERTY),
+ [TD_ESFL] = ACTION_TAP_DANCE_LAYER_MOVE(KC_ESC, _FLOCK),
+ [TD_ESQW] = ACTION_TAP_DANCE_LAYER_MOVE(KC_ESC, _QWERTY),
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT_all(
//,------------------------------------------------------------------------| |----------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE, KC_BSPACE, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_BSPC,
//|--------+---------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------|
RGB_MODE_FORWARD, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
//|--------+---------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------|
@@ -67,7 +67,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_FLOCK] = LAYOUT_all(
//,------------------------------------------------------------------------| |----------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE, KC_BSPACE, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_BSPC,
//|--------+---------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------|
RGB_MODE_FORWARD, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
//|--------+---------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------|
@@ -81,9 +81,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_FN] = LAYOUT_all(
//,------------------------------------------------------------------------| |----------------------------------------------------------------.
- KC_ESC, TG(_ADJUST), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_BSPACE, KC_DEL,
+ KC_ESC, TG(_ADJUST), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_BSPC, KC_DEL,
//|--------+---------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------|
- _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUSE, KC_UP, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, KC_UP, _______, _______, _______,
//|--------+---------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------|
_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_LEFT, KC_RIGHT, _______, _______,
//|--------+---------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------|
@@ -95,7 +95,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_LOWER] = LAYOUT_all(
//,------------------------------------------------------------------------| |----------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE, KC_BSPACE, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_BSPC,
//|--------+---------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------|
RGB_MODE_FORWARD, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
//|--------+---------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------|
@@ -109,7 +109,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_RAISE] = LAYOUT_all(
//,------------------------------------------------------------------------| |----------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE, KC_BSPACE, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_BSPC,
//|--------+---------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------|
RGB_MODE_FORWARD, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
//|--------+---------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------|
@@ -123,7 +123,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_ADJUST] = LAYOUT_all( /* Base */
//,------------------------------------------------------------------------| |----------------------------------------------------------------.
- XXXXXXX, TG(_ADJUST), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX,
+ XXXXXXX, TG(_ADJUST), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, QK_BOOT, XXXXXXX,
//|--------+---------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RST, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
//|--------+---------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------|
diff --git a/keyboards/basekeys/slice/rev1/keymaps/default_all/keymap.c b/keyboards/basekeys/slice/rev1/keymaps/default_all/keymap.c
index 59c19d50e3..8fc93cdc98 100644
--- a/keyboards/basekeys/slice/rev1/keymaps/default_all/keymap.c
+++ b/keyboards/basekeys/slice/rev1/keymaps/default_all/keymap.c
@@ -34,7 +34,7 @@ enum custom_keycodes {
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT_all(
//,------------------------------------------------------------------------| |--------------------------------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE, KC_BSPACE, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_BSPC,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------+----------|
RGB_MODE_FORWARD, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------+----------|
@@ -48,9 +48,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_FN] = LAYOUT_all(
//,------------------------------------------------------------------------| |--------------------------------------------------------------------------------------.
- KC_ESC,TG(_ADJUST), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_BSPACE, KC_DEL,
+ KC_ESC,TG(_ADJUST), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_BSPC, KC_DEL,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------+----------|
- _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUSE, KC_UP, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, KC_UP, _______, _______, _______,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------+----------|
_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_LEFT,KC_RIGHT, _______, _______,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------+----------|
diff --git a/keyboards/basekeys/slice/rev1/keymaps/default_split_backspace/keymap.c b/keyboards/basekeys/slice/rev1/keymaps/default_split_backspace/keymap.c
index 7e846f3e26..6c3830630a 100644
--- a/keyboards/basekeys/slice/rev1/keymaps/default_split_backspace/keymap.c
+++ b/keyboards/basekeys/slice/rev1/keymaps/default_split_backspace/keymap.c
@@ -34,7 +34,7 @@ enum custom_keycodes {
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT_split_backspace(
//,------------------------------------------------------------------------| |---------------------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
RGB_MODE_FORWARD, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
@@ -50,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
//,-------------------------------------------------------------------------| |---------------------------------------------------------------------------.
KC_ESC,TG(_ADJUST), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
- _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUSE, KC_UP, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, KC_UP, _______, _______, _______,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_LEFT,KC_RIGHT, _______, _______,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
diff --git a/keyboards/basekeys/slice/rev1/keymaps/via/keymap.c b/keyboards/basekeys/slice/rev1/keymaps/via/keymap.c
index 57b94c5bdf..4721a8bc3d 100644
--- a/keyboards/basekeys/slice/rev1/keymaps/via/keymap.c
+++ b/keyboards/basekeys/slice/rev1/keymaps/via/keymap.c
@@ -29,7 +29,7 @@ enum layer_number {
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT_all(
//,------------------------------------------------------------------------| |--------------------------------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE, KC_BSPACE, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_BSPC,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------+----------|
RGB_MODE_FORWARD, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------+----------|
@@ -43,9 +43,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_FN] = LAYOUT_all(
//,------------------------------------------------------------------------| |--------------------------------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_BSPACE, KC_DEL,
+ KC_ESC, KC_GRAVE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_BSPC, KC_DEL,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------+----------|
- _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUSE, KC_UP, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, KC_UP, _______, _______, _______,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------+----------|
_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_LEFT,KC_RIGHT, _______, _______,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------+----------|
@@ -57,7 +57,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_LOWER] = LAYOUT_all(
//,------------------------------------------------------------------------| |--------------------------------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE, KC_BSPACE, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_BSPC,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------+----------|
RGB_MODE_FORWARD, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------+----------|
@@ -71,7 +71,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_RAISE] = LAYOUT_all(
//,------------------------------------------------------------------------| |--------------------------------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE, KC_BSPACE, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_BSPC,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------+----------|
RGB_MODE_FORWARD, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------+----------|
diff --git a/keyboards/basekeys/slice/rev1_rgb/config.h b/keyboards/basekeys/slice/rev1_rgb/config.h
index f839bfa5b3..e51fc5048c 100644
--- a/keyboards/basekeys/slice/rev1_rgb/config.h
+++ b/keyboards/basekeys/slice/rev1_rgb/config.h
@@ -51,7 +51,16 @@ along with this program. If not, see .
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17
-#define RGBLIGHT_ANIMATIONS
+#define RGBLIGHT_EFFECT_BREATHING
+#define RGBLIGHT_EFFECT_RAINBOW_MOOD
+#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+#define RGBLIGHT_EFFECT_SNAKE
+#define RGBLIGHT_EFFECT_KNIGHT
+#define RGBLIGHT_EFFECT_CHRISTMAS
+#define RGBLIGHT_EFFECT_STATIC_GRADIENT
+#define RGBLIGHT_EFFECT_RGB_TEST
+#define RGBLIGHT_EFFECT_ALTERNATING
+#define RGBLIGHT_EFFECT_TWINKLE
#endif
#define OLED_FONT_H "keyboards/basekeys/slice/slice_font.c"
diff --git a/keyboards/basekeys/slice/rev1_rgb/keymaps/2moons_rgb/keymap.c b/keyboards/basekeys/slice/rev1_rgb/keymaps/2moons_rgb/keymap.c
index 05de0e42d0..39ba3bb9c6 100644
--- a/keyboards/basekeys/slice/rev1_rgb/keymaps/2moons_rgb/keymap.c
+++ b/keyboards/basekeys/slice/rev1_rgb/keymaps/2moons_rgb/keymap.c
@@ -39,14 +39,14 @@ enum tapdances{
};
qk_tap_dance_action_t tap_dance_actions[] = {
- [TD_ESFL] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _FLOCK),
- [TD_ESQW] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _QWERTY),
+ [TD_ESFL] = ACTION_TAP_DANCE_LAYER_MOVE(KC_ESC, _FLOCK),
+ [TD_ESQW] = ACTION_TAP_DANCE_LAYER_MOVE(KC_ESC, _QWERTY),
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT(
//,------------------------------------------------------------------------| |---------------------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
RGB_MODE_FORWARD, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
@@ -62,7 +62,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
//,-------------------------------------------------------------------------| |---------------------------------------------------------------------------.
KC_ESC, TG(_ADJUST), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
- _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUSE, KC_UP, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, KC_UP, _______, _______, _______,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_LEFT,KC_RIGHT, _______, _______,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
@@ -74,9 +74,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_FN] = LAYOUT(
//,-------------------------------------------------------------------------| |---------------------------------------------------------------------------.
- KC_ESC, TG(_ADJUST), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPACE,
+ KC_ESC, TG(_ADJUST), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
- _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUSE, KC_UP, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, KC_UP, _______, _______, _______,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_LEFT,KC_RIGHT, _______, _______,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
@@ -88,7 +88,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_LOWER] = LAYOUT(
//,-------------------------------------------------------------------------| |---------------------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
RGB_MODE_FORWARD, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
@@ -102,7 +102,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_RAISE] = LAYOUT(
//,-------------------------------------------------------------------------| |---------------------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
RGB_MODE_FORWARD, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
@@ -116,7 +116,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_ADJUST] = LAYOUT( /* Base */
//,-------------------------------------------------------------------------| |---------------------------------------------------------------------------.
- XXXXXXX,TG(_ADJUST),XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET,
+ XXXXXXX,TG(_ADJUST),XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, QK_BOOT,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RST, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
diff --git a/keyboards/basekeys/slice/rev1_rgb/keymaps/via/keymap.c b/keyboards/basekeys/slice/rev1_rgb/keymaps/via/keymap.c
index fa5abd90a5..27b0881a50 100644
--- a/keyboards/basekeys/slice/rev1_rgb/keymaps/via/keymap.c
+++ b/keyboards/basekeys/slice/rev1_rgb/keymaps/via/keymap.c
@@ -29,7 +29,7 @@ enum layer_number {
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT_all(
//,------------------------------------------------------------------------| |---------------------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
RGB_MODE_FORWARD, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
@@ -43,9 +43,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_FN] = LAYOUT_all(
//,-------------------------------------------------------------------------| |---------------------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
- _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUSE, KC_UP, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUSE, KC_UP, _______, _______, _______,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_LEFT,KC_RIGHT, _______, _______,
//|-------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
@@ -57,7 +57,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_LOWER] = LAYOUT_all(
//,------------------------------------------------------------------------| |---------------------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
RGB_MODE_FORWARD, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
@@ -71,7 +71,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_RAISE] = LAYOUT_all(
//,------------------------------------------------------------------------| |---------------------------------------------------------------------------.
- KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE,
+ KC_ESC, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
RGB_MODE_FORWARD, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
//|------------------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+----------+----------|
diff --git a/keyboards/basekeys/trifecta/config.h b/keyboards/basekeys/trifecta/config.h
index 753e3d5a41..1beb5ff192 100644
--- a/keyboards/basekeys/trifecta/config.h
+++ b/keyboards/basekeys/trifecta/config.h
@@ -36,7 +36,7 @@
#define RGB_DI_PIN E6
-#define DRIVER_LED_TOTAL 80
+#define RGB_MATRIX_LED_COUNT 80
/* RGB LED */
#ifdef RGBLIGHT_ENABLE
@@ -45,7 +45,16 @@
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17
-#define RGBLIGHT_ANIMATIONS
+#define RGBLIGHT_EFFECT_BREATHING
+#define RGBLIGHT_EFFECT_RAINBOW_MOOD
+#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+#define RGBLIGHT_EFFECT_SNAKE
+#define RGBLIGHT_EFFECT_KNIGHT
+#define RGBLIGHT_EFFECT_CHRISTMAS
+#define RGBLIGHT_EFFECT_STATIC_GRADIENT
+#define RGBLIGHT_EFFECT_RGB_TEST
+#define RGBLIGHT_EFFECT_ALTERNATING
+#define RGBLIGHT_EFFECT_TWINKLE
#endif
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5
@@ -72,10 +81,9 @@
#ifdef RGB_MATRIX_ENABLE
# define RGB_MATRIX_KEYPRESSES // reacts to keypresses
// # define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
-// # define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
//# define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
# define RGB_MATRIX_FRAMEBUFFER_EFFECTS
-# define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
+# define RGB_MATRIX_LED_PROCESS_LIMIT (RGB_MATRIX_LED_COUNT + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
# define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150 // limits maximum brightness of LEDs to 150 out of 255. Higher may cause the controller to crash.
# define RGB_MATRIX_HUE_STEP 8
diff --git a/keyboards/basketweave/config.h b/keyboards/basketweave/config.h
index ee8604b8ba..88828d7ddd 100644
--- a/keyboards/basketweave/config.h
+++ b/keyboards/basketweave/config.h
@@ -24,7 +24,6 @@
#define MATRIX_ROW_PINS { A6, C6, C7, A7, A5 }
#define MATRIX_COL_PINS { A0, A1, A2, A3, A4, B0, B1, B2, D5, D6, C5, C4, C3, C2, C1 }
-#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/basketweave/keymaps/default/keymap.c b/keyboards/basketweave/keymaps/default/keymap.c
index 83ad046ae8..379c9f7985 100644
--- a/keyboards/basketweave/keymaps/default/keymap.c
+++ b/keyboards/basketweave/keymaps/default/keymap.c
@@ -19,7 +19,7 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_default( /* base */
- KC_GESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
+ QK_GESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_INS, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_MUTE,
KC_DEL, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
diff --git a/keyboards/basketweave/keymaps/via/keymap.c b/keyboards/basketweave/keymaps/via/keymap.c
index 7d85863d01..dd89371aea 100644
--- a/keyboards/basketweave/keymaps/via/keymap.c
+++ b/keyboards/basketweave/keymaps/via/keymap.c
@@ -19,7 +19,7 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_default( /* base */
- KC_GESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
+ QK_GESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_INS, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_MUTE,
KC_DEL, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
diff --git a/keyboards/bastardkb/charybdis/3x5/3x5.c b/keyboards/bastardkb/charybdis/3x5/3x5.c
index d896cf6923..7b10d322cd 100644
--- a/keyboards/bastardkb/charybdis/3x5/3x5.c
+++ b/keyboards/bastardkb/charybdis/3x5/3x5.c
@@ -33,6 +33,10 @@
* ╰────────────────────╯ ╰────────────────────╯
* 15 16 17 33 34 XX
* ╰────────────╯ ╰────────────╯
+ *
+ * Note: the LED config simulates 36 LEDs instead of the actual 35 to prevent
+ * confusion when testing LEDs during assembly when handedness is not set
+ * correctly. Those fake LEDs are bound to the physical top-left corner.
*/
led_config_t g_led_config = { {
/* Key Matrix to LED index. */
@@ -61,7 +65,7 @@ led_config_t g_led_config = { {
/* index=24 */ { 188, 42 }, { 188, 21 }, { 188, 0 },
/* index=27 */ { 170, 0 }, { 170, 21 }, { 170, 42 },
/* index=30 */ { 152, 0 }, { 152, 21 }, { 152, 42 },
- /* index=33 */ { 152, 64 }, { 134, 64 },
+ /* index=33 */ { 134, 64 }, { 152, 64 }, { 0, 0 },
}, {
/* LED index to flag. */
// Left split.
@@ -77,7 +81,7 @@ led_config_t g_led_config = { {
/* index=24 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
/* index=27 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
/* index=30 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
- /* index=33 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // Thumb cluster
+ /* index=33 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // Thumb cluster
} };
#endif
// clang-format on
diff --git a/keyboards/bastardkb/charybdis/3x5/blackpill/config.h b/keyboards/bastardkb/charybdis/3x5/blackpill/config.h
new file mode 100644
index 0000000000..ef99f3b631
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/blackpill/config.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2020 Christopher Courtney (@drashna)
+ * Copyright 2021 Stefan Kerkmann (@KarlK90)
+ * Copyright 2021 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Publicw License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { A2, B8, A8, B9 }
+#define MATRIX_COL_PINS \
+ { B1, B10, B3, B4, B5 }
+
+/* Handedness. */
+#define SPLIT_HAND_PIN A3 // High -> left, Low -> right.
+
+/* RGB settings. */
+#define RGB_DI_PIN A1
+#define WS2812_PWM_DRIVER PWMD2
+#define WS2812_PWM_CHANNEL 2
+#define WS2812_PWM_PAL_MODE 1
+#define WS2812_EXTERNAL_PULLUP
+#define WS2812_DMA_STREAM STM32_DMA1_STREAM1
+#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_TARGET_PERIOD 800000
+
+/* Serial configuration for split keyboard. */
+#define SERIAL_USART_TX_PIN A9
+
+/* CRC. */
+#define CRC8_USE_TABLE
+#define CRC8_OPTIMIZE_SPEED
+
+/* SPI config for EEPROM and pmw3360 sensor. */
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN A5
+#define SPI_SCK_PAL_MODE 5
+#define SPI_MOSI_PIN A7
+#define SPI_MOSI_PAL_MODE 5
+#define SPI_MISO_PIN A6
+#define SPI_MISO_PAL_MODE 5
+
+/* EEPROM config. */
+#define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN A4
+
+/* PMW3360 settings. */
+#define POINTING_DEVICE_CS_PIN B14
+#define PMW33XX_CS_DIVISOR 64
diff --git a/keyboards/bastardkb/charybdis/3x5/blackpill/halconf.h b/keyboards/bastardkb/charybdis/3x5/blackpill/halconf.h
new file mode 100644
index 0000000000..0e5caa9f9a
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/blackpill/halconf.h
@@ -0,0 +1,27 @@
+/**
+ * Copyright 2020 Nick Brassel (tzarc)
+ * Copyright 2021 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#define HAL_USE_PWM TRUE
+#define HAL_USE_SERIAL TRUE
+#define HAL_USE_SPI TRUE
+#define SPI_USE_WAIT TRUE
+#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
+
+#include_next "halconf.h"
diff --git a/keyboards/bastardkb/charybdis/3x5/blackpill/info.json b/keyboards/bastardkb/charybdis/3x5/blackpill/info.json
new file mode 100644
index 0000000000..c2ff6d458a
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/blackpill/info.json
@@ -0,0 +1,6 @@
+{
+ "keyboard_name": "Charybdis Nano (3x5) Blackpill",
+ "usb": {
+ "device_version": "1.0.0"
+ }
+}
diff --git a/keyboards/bastardkb/charybdis/3x5/blackpill/mcuconf.h b/keyboards/bastardkb/charybdis/3x5/blackpill/mcuconf.h
new file mode 100644
index 0000000000..3b9c9056f8
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/blackpill/mcuconf.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2020 Nick Brassel (tzarc)
+ * Copyright 2021 Stefan Kerkmann (@KarlK90)
+ * Copyright 2021 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include_next "mcuconf.h"
+
+#undef STM32_PWM_USE_TIM2
+#define STM32_PWM_USE_TIM2 TRUE
+
+#undef STM32_PWM_USE_TIM3
+#define STM32_PWM_USE_TIM3 TRUE
+
+#undef STM32_SPI_USE_SPI1
+#define STM32_SPI_USE_SPI1 TRUE
+
+#undef STM32_SPI_SPI1_RX_DMA_STREAM
+#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0)
+#undef STM32_SPI_SPI1_TX_DMA_STREAM
+#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3)
+
+#undef STM32_SERIAL_USE_USART1
+#define STM32_SERIAL_USE_USART1 TRUE
+
+#undef STM32_GPT_USE_TIM4
+#define STM32_GPT_USE_TIM4 TRUE
+
+#undef STM32_ST_USE_TIMER
+#define STM32_ST_USE_TIMER 5
diff --git a/keyboards/bastardkb/charybdis/3x5/blackpill/readme.md b/keyboards/bastardkb/charybdis/3x5/blackpill/readme.md
new file mode 100644
index 0000000000..7ef08798b8
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/blackpill/readme.md
@@ -0,0 +1,3 @@
+# Charybdis Nano (3x5) BlackPill
+
+An ergonomic keyboard with integrated trackball, with BlackPill (STM32F411) mod.
diff --git a/keyboards/bastardkb/charybdis/3x5/blackpill/rules.mk b/keyboards/bastardkb/charybdis/3x5/blackpill/rules.mk
new file mode 100644
index 0000000000..a21fd9e7ff
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/blackpill/rules.mk
@@ -0,0 +1,39 @@
+# MCU name
+MCU = STM32F411
+BOARD = BLACKPILL_STM32_F411
+
+# Bootloader selection
+BOOTLOADER = stm32-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported
+RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default
+RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default
+RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
+RGB_MATRIX_DRIVER = WS2812
+
+SPLIT_KEYBOARD = yes
+LAYOUTS = split_3x5_3
+
+POINTING_DEVICE_ENABLE = yes # Enable trackball
+POINTING_DEVICE_DRIVER = pmw3360
+MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint
+KEYBOARD_SHARED_EP = yes
+
+EEPROM_DRIVER = spi
+WS2812_DRIVER = pwm
+SERIAL_DRIVER = usart
+
+DEBOUNCE_TYPE = asym_eager_defer_pk
diff --git a/keyboards/bastardkb/charybdis/3x5/config.h b/keyboards/bastardkb/charybdis/3x5/config.h
index 6d62caf5d2..0849d5968a 100644
--- a/keyboards/bastardkb/charybdis/3x5/config.h
+++ b/keyboards/bastardkb/charybdis/3x5/config.h
@@ -19,59 +19,20 @@
#pragma once
/* Key matrix configuration. */
-
-// Rows are doubled-up.
-#define MATRIX_ROWS 8
+#define MATRIX_ROWS 8 // Rows are doubled-up.
#define MATRIX_COLS 5
-// Wiring configuration for each half.
-#define MATRIX_ROW_PINS \
- { B7, C6, D4, B5 }
-#define MATRIX_COL_PINS \
- { C7, F0, D7, E6, B4 }
-
-#define MATRIX_ROW_PINS_RIGHT \
- { F0, C6, D4, B5 }
-#define MATRIX_COL_PINS_RIGHT \
- { C7, B7, D7, E6, B4 }
-
#define DIODE_DIRECTION ROW2COL
-/* Handedness. */
-#define MASTER_RIGHT
-
-/* Bootmagic Lite configuration. */
-#define BOOTMAGIC_LITE_ROW 0
-#define BOOTMAGIC_LITE_COLUMN 0
-#define BOOTMAGIC_LITE_ROW_RIGHT 4
-#define BOOTMAGIC_LITE_COLUMN_RIGHT 0
-
-/* serial.c configuration (for split keyboard) */
-#define SOFT_SERIAL_PIN D2
-
/* Set 0 if debouncing isn't needed. */
#define DEBOUNCE 5
-/* PMW3360 settings. */
-#define PMW3360_CS_PIN B0
-
-// Trackball angle adjustment.
+/* Trackball angle adjustment. */
#define ROTATIONAL_TRANSFORM_ANGLE -25
/* RGB settings. */
-
-#define RGB_DI_PIN D3
-#define RGBLED_NUM 35
-#define RGBLED_SPLIT \
- { 18, 17 }
-
-/* RGB matrix support. */
#ifdef RGB_MATRIX_ENABLE
-# define SPLIT_TRANSPORT_MIRROR
-# define DRIVER_LED_TOTAL RGBLED_NUM
-# define RGB_MATRIX_SPLIT RGBLED_SPLIT
-# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 50
-# define RGB_MATRIX_STARTUP_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS
-# define RGB_DISABLE_WHEN_USB_SUSPENDED
-# define RGB_MATRIX_KEYPRESSES
+# define RGB_MATRIX_LED_COUNT 36
+# define RGB_MATRIX_SPLIT \
+ { 18, 18 }
#endif
diff --git a/keyboards/bastardkb/charybdis/3x5/info.json b/keyboards/bastardkb/charybdis/3x5/info.json
index 935b1f7249..efa863ea4b 100644
--- a/keyboards/bastardkb/charybdis/3x5/info.json
+++ b/keyboards/bastardkb/charybdis/3x5/info.json
@@ -1,12 +1,9 @@
{
- "keyboard_name": "Charybdis Nano",
"manufacturer": "Bastard Keyboards",
- "url": "https://www.bastardkb.com",
- "maintainer": "Quentin Lebastard",
+ "url": "https://bastardkb.com/charybdis-nano",
"usb": {
- "vid": "0xA8F8",
"pid": "0x1832",
- "device_version": "0.0.1"
+ "vid": "0xA8F8"
},
"layouts": {
"LAYOUT_charybdis_3x5": {
diff --git a/keyboards/bastardkb/charybdis/3x5/keymaps/bstiq/config.h b/keyboards/bastardkb/charybdis/3x5/keymaps/bstiq/config.h
new file mode 100644
index 0000000000..cceba7c1fb
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/keymaps/bstiq/config.h
@@ -0,0 +1,165 @@
+/**
+ * Copyright 2021 Quentin LEBASTARD
+ * Copyright 2021 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+
+#ifdef VIA_ENABLE
+/* Via configuration. */
+# define DYNAMIC_KEYMAP_LAYER_COUNT 8
+#endif // VIA_ENABLE
+
+#ifndef __arm__
+/* Disable unused features. */
+# define NO_ACTION_ONESHOT
+#endif // __arm__
+
+/**
+ * Configure the global tapping term (default: 200ms).
+ * If you have a lot of accidental mod activations, crank up the tapping term.
+ *
+ * See docs.qmk.fm/using-qmk/software-features/tap_hold#tapping-term
+ */
+#ifndef TAPPING_TERM
+# define TAPPING_TERM 160
+#endif // TAPPING_TERM
+
+/**
+ * Enable rapid switch from tap to hold. Disable auto-repeat when pressing key
+ * twice, except for one-shot keys.
+ *
+ * See docs.qmk.fm/using-qmk/software-features/tap_hold#tapping-force-hold
+ */
+#define TAPPING_FORCE_HOLD
+
+/*
+ * Tap-or-Hold decision modes.
+ *
+ * Note that the following flags behave differently when combined (ie. when 2 or
+ * more are enabled).
+ *
+ * See bit.ly/tap-or-hold for a visual explanation of the following tap-or-hold
+ * decision modes.
+ */
+
+/**
+ * Faster tap-hold trigger.
+ *
+ * Without `PERMISSIVE_HOLD`, within `TAPPING_TERM`:
+ * Mod(a)🠗 e🠗 e🠕 Mod(a)🠕 ➞ ae
+ * With `PERMISSIVE_HOLD`, within `TAPPING_TERM`:
+ * Mod(a)🠗 e🠗 e🠕 Mod(a)🠕 ➞ Mod+e
+ *
+ * See docs.qmk.fm/using-qmk/software-features/tap_hold#permissive-hold
+ */
+#define PERMISSIVE_HOLD
+
+/**
+ * Prevent normal rollover on alphas from accidentally triggering mods.
+ *
+ * Ignores key presses that interrupt a mod-tap. Must-have for Home Row mod.
+ *
+ * Without `IGNORE_MOD_TAP_INTERRUPT`, within `TAPPING_TERM`:
+ * Mod(a)🠗 e🠗 Mod(a)🠕 e🠕 ➞ Mod+e
+ * With `IGNORE_MOD_TAP_INTERRUPT`, within `TAPPING_TERM`:
+ * Mod(a)🠗 e🠗 Mod(a)🠕 e🠕 ➞ ae
+ *
+ * See docs.qmk.fm/using-qmk/software-features/tap_hold#ignore-mod-tap-interrupt
+ */
+#define IGNORE_MOD_TAP_INTERRUPT
+
+/** Charybdis-specific features. */
+
+#ifdef POINTING_DEVICE_ENABLE
+// Automatically enable the pointer layer when moving the trackball. See also:
+// - `CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS`
+// - `CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD`
+// #define CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+
+// Flip horizontal direction for drag-scroll.
+# define CHARYBDIS_DRAGSCROLL_REVERSE_X
+// #define CHARYBDIS_DRAGSCROLL_REVERSE_Y
+#endif // POINTING_DEVICE_ENABLE
+
+/** RGB Matrix. */
+
+#ifdef RGB_MATRIX_ENABLE
+# ifdef __arm__
+// Enable all animations on ARM boards since they have plenty of memory
+// available for it.
+# define ENABLE_RGB_MATRIX_ALPHAS_MODS
+# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
+# define ENABLE_RGB_MATRIX_BREATHING
+# define ENABLE_RGB_MATRIX_BAND_SAT
+# define ENABLE_RGB_MATRIX_BAND_VAL
+# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
+# define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+# define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
+# define ENABLE_RGB_MATRIX_CYCLE_ALL
+# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+# define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
+# define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
+# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+# define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
+# define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
+# define ENABLE_RGB_MATRIX_DUAL_BEACON
+# define ENABLE_RGB_MATRIX_RAINBOW_BEACON
+# define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+# define ENABLE_RGB_MATRIX_RAINDROPS
+# define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
+# define ENABLE_RGB_MATRIX_HUE_BREATHING
+# define ENABLE_RGB_MATRIX_HUE_PENDULUM
+# define ENABLE_RGB_MATRIX_HUE_WAVE
+# define ENABLE_RGB_MATRIX_TYPING_HEATMAP
+# define ENABLE_RGB_MATRIX_DIGITAL_RAIN
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+# define ENABLE_RGB_MATRIX_SPLASH
+# define ENABLE_RGB_MATRIX_MULTISPLASH
+# define ENABLE_RGB_MATRIX_SOLID_SPLASH
+# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
+# else
+// Disable control of RGB matrix by keycodes (must use firmware implementation
+// to control the feature).
+# define RGB_MATRIX_DISABLE_KEYCODES
+# endif
+
+// Limit maximum brightness to keep power consumption reasonable, and avoid
+// disconnects.
+# undef RGB_MATRIX_MAXIMUM_BRIGHTNESS
+# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 64
+
+// Rainbow swirl as startup mode.
+# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+# define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT
+
+// Slow swirl at startup.
+# define RGB_MATRIX_DEFAULT_SPD 32
+
+// Startup values.
+# define RGB_MATRIX_DEFAULT_HUE 0
+# define RGB_MATRIX_DEFAULT_SAT 255
+# define RGB_MATRIX_DEFAULT_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS
+#endif // RGB_MATRIX_ENABLE
diff --git a/keyboards/bastardkb/charybdis/3x5/keymaps/bstiq/keymap.c b/keyboards/bastardkb/charybdis/3x5/keymaps/bstiq/keymap.c
new file mode 100644
index 0000000000..2664b531a2
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/keymaps/bstiq/keymap.c
@@ -0,0 +1,224 @@
+/**
+ * Copyright 2021 Quentin LEBASTARD
+ * Copyright 2021 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include QMK_KEYBOARD_H
+
+enum charybdis_keymap_bstiq_layers {
+ LAYER_BASE = 0,
+ LAYER_MBO,
+ LAYER_MEDIA,
+ LAYER_NAV,
+ LAYER_MOUSE,
+ LAYER_SYM,
+ LAYER_NUM,
+ LAYER_FUN,
+};
+
+// Automatically enable sniping when the mouse layer is on.
+#define CHARYBDIS_AUTO_SNIPING_ON_LAYER LAYER_MOUSE
+
+#define BSP_NAV LT(LAYER_NAV, KC_BSPC)
+#define ENT_MBO LT(LAYER_MBO, KC_ENT)
+#define TAB_MED LT(LAYER_MEDIA, KC_TAB)
+#define ESC_SYM LT(LAYER_SYM, KC_ESC)
+#define SPC_NUM LT(LAYER_NUM, KC_SPC)
+#define MOUSE(KC) LT(LAYER_MOUSE, KC)
+
+#define USR_RDO KC_AGAIN
+#define USR_PST S(KC_INS)
+#define USR_CPY C(KC_INS)
+#define USR_CUT S(KC_DEL)
+#define USR_UND KC_UNDO
+
+#define MS_L KC_MS_LEFT
+#define MS_R KC_MS_RIGHT
+#define MS_D KC_MS_DOWN
+#define MS_U KC_MS_UP
+
+#define WH_L KC_MS_WH_LEFT
+#define WH_R KC_MS_WH_RIGHT
+#define WH_D KC_MS_WH_DOWN
+#define WH_U KC_MS_WH_UP
+
+// clang-format off
+/** Convenience macro. */
+#define _KC_LAYOUT_wrapper( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, \
+ ...) \
+ KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_##k06, KC_##k07, KC_##k08, KC_##k09, \
+ KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, KC_##k16, KC_##k17, KC_##k18, KC_##k19, \
+ KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_##k26, KC_##k27, KC_##k28, KC_##k29, \
+ __VA_ARGS__
+#define KC_LAYOUT_wrapper(...) _KC_LAYOUT_wrapper(__VA_ARGS__)
+
+/** Base layer with BÉPO layout. */
+#define LAYOUT_LAYER_BASE_BEPO KC_LAYOUT_wrapper( \
+ B, Z, P, O, QUOT, DOT, V, D, L, J, \
+ A, U, I, E, COMM, C, T, S, R, N, \
+ W, Y, X, SLSH, K, M, Q, G, H, F, \
+ BSP_NAV, ENT_MBO, TAB_MED, ESC_SYM, SPC_NUM)
+
+/** Convenience key shorthands. */
+#define U_NA KC_NO // Present but not available for use.
+#define U_NU KC_NO // Available but not used.
+
+/** Convenience row shorthands. */
+#define __________________RESET_L__________________ QK_BOOT, U_NA, U_NA, U_NA, U_NA
+#define __________________RESET_R__________________ U_NA, U_NA, U_NA, U_NA, QK_BOOT
+#define ______________HOME_ROW_GASC_L______________ KC_LGUI, KC_LALT, KC_LSFT, KC_LCTL, U_NA
+#define ______________HOME_ROW_ALGR_L______________ U_NA, KC_ALGR, U_NA, U_NA, U_NA
+#define ______________HOME_ROW_GASC_R______________ U_NA, KC_LCTL, KC_LSFT, KC_LALT, KC_LGUI
+#define ______________HOME_ROW_ALGR_R______________ U_NA, U_NA, U_NA, KC_ALGR, U_NA
+
+/** Layers. */
+
+// Buttons.
+#define LAYOUT_LAYER_MBO \
+ __________________RESET_L__________________, USR_RDO, USR_PST, USR_CPY, USR_CUT, USR_UND, \
+ ______________HOME_ROW_GASC_L______________, KC_CAPS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, \
+ KC_BTN3, KC_ALGR, KC_BTN2, KC_BTN1, U_NA, KC_INS, KC_HOME, KC_PGDN, KC_PGUP, KC_END, \
+ U_NA, U_NA, U_NA, KC_ENT, KC_DEL
+
+// Media.
+#define LAYOUT_LAYER_MEDIA \
+ __________________RESET_L__________________, USR_RDO, USR_PST, USR_CPY, USR_CUT, USR_UND, \
+ ______________HOME_ROW_GASC_L______________, U_NU, MS_L, MS_D, MS_U, MS_R, \
+ ______________HOME_ROW_ALGR_L______________, U_NU, WH_L, WH_D, WH_U, WH_R, \
+ U_NA, U_NA, U_NA, KC_BTN1, KC_BTN3
+
+// Navigation.
+#define LAYOUT_LAYER_NAV \
+ __________________RESET_L__________________, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, \
+ ______________HOME_ROW_GASC_L______________, U_NU, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, \
+ ______________HOME_ROW_ALGR_L______________, U_NU, U_NU, U_NU, U_NU, U_NU, \
+ U_NA, U_NA, U_NA, KC_MSTP, KC_MPLY
+
+// Mouse.
+#define LAYOUT_LAYER_MOUSE \
+ S_D_MOD, USR_PST, USR_CPY, USR_CUT, USR_UND, USR_RDO, USR_PST, USR_CPY, USR_CUT, USR_UND, \
+ DPI_MOD, DRGSCRL, KC_LSFT, KC_LCTL, _______, U_NU, MS_L, MS_D, MS_U, MS_R, \
+ USR_RDO, USR_PST, USR_CPY, USR_CUT, USR_UND, U_NU, WH_L, WH_D, WH_U, WH_R, \
+ KC_BTN2, KC_BTN1, KC_BTN3, KC_BTN1, KC_BTN3
+
+// Symbols.
+#define LAYOUT_LAYER_SYM \
+ KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, __________________RESET_R__________________, \
+ KC_COLN, KC_DLR, KC_PERC, KC_CIRC, KC_PLUS, ______________HOME_ROW_GASC_R______________, \
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_PIPE, ______________HOME_ROW_ALGR_R______________, \
+ KC_LPRN, KC_RPRN, KC_UNDS, U_NA, U_NA
+
+// Numerals.
+#define LAYOUT_LAYER_NUM \
+ KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, __________________RESET_R__________________, \
+ KC_SCLN, KC_4, KC_5, KC_6, KC_EQL, ______________HOME_ROW_GASC_R______________, \
+ KC_GRV, KC_1, KC_2, KC_3, KC_BSLS, ______________HOME_ROW_ALGR_R______________, \
+ KC_DOT, KC_0, KC_MINS, U_NA, U_NA
+
+// Function keys.
+#define LAYOUT_LAYER_FUN \
+ KC_F12, KC_F7, KC_F8, KC_F9, KC_PSCR, __________________RESET_R__________________, \
+ KC_F11, KC_F4, KC_F5, KC_F6, KC_SCRL, ______________HOME_ROW_GASC_R______________, \
+ KC_F10, KC_F1, KC_F2, KC_F3, KC_PAUS, ______________HOME_ROW_ALGR_R______________,\
+ KC_APP, KC_SPC, KC_TAB, U_NA, U_NA
+
+/**
+ * Add Home Row mod to a layout.
+ *
+ * Expects a 10-key per row layout. Adds support for GASC (Gui, Alt, Shift, Ctl)
+ * home row. The layout passed in parameter must contain at least 20 keycodes.
+ *
+ * This is meant to be used with `LAYOUT_LAYER_BASE_BEPO` defined above, eg.:
+ *
+ * HOME_ROW_MOD_GASC(LAYOUT_LAYER_BASE_BEPO)
+ */
+#define _HOME_ROW_MOD_GASC( \
+ L00, L01, L02, L03, L04, R05, R06, R07, R08, R09, \
+ L10, L11, L12, L13, L14, R15, R16, R17, R18, R19, \
+ ...) \
+ L00, L01, L02, L03, L04, \
+ R05, R06, R07, R08, R09, \
+ LGUI_T(L10), LALT_T(L11), LSFT_T(L12), LCTL_T(L13), L14, \
+ R15, RCTL_T(R16), RSFT_T(R17), LALT_T(R18), RGUI_T(R19), \
+ __VA_ARGS__
+#define HOME_ROW_MOD_GASC(...) _HOME_ROW_MOD_GASC(__VA_ARGS__)
+
+/**
+ * Add mouse layer keys to a layout.
+ *
+ * Expects a 10-key per row layout. The layout passed in parameter must contain
+ * at least 30 keycodes.
+ *
+ * This is meant to be used with `LAYOUT_LAYER_BASE_BEPO` defined above, eg.:
+ *
+ * MOUSE_MOD(LAYOUT_LAYER_BASE_BEPO)
+ */
+#define _MOUSE_MOD( \
+ L00, L01, L02, L03, L04, R05, R06, R07, R08, R09, \
+ L10, L11, L12, L13, L14, R15, R16, R17, R18, R19, \
+ L20, L21, L22, L23, L24, R25, R26, R27, R28, R29, \
+ ...) \
+ L00, L01, L02, L03, L04, \
+ R05, R06, R07, R08, R09, \
+ L10, L11, L12, L13, L14, \
+ R15, R16, R17, R18, R19, \
+ MOUSE(L20), L21, L22, L23, L24, \
+ R25, R26, R27, R28, MOUSE(R29), \
+ __VA_ARGS__
+#define MOUSE_MOD(...) _MOUSE_MOD(__VA_ARGS__)
+
+#define LAYOUT_wrapper(...) LAYOUT_charybdis_3x5(__VA_ARGS__)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [LAYER_BASE] = LAYOUT_wrapper(
+ MOUSE_MOD(HOME_ROW_MOD_GASC(LAYOUT_LAYER_BASE_BEPO))
+ ),
+ [LAYER_MBO] = LAYOUT_wrapper(LAYOUT_LAYER_MBO),
+ [LAYER_MEDIA] = LAYOUT_wrapper(LAYOUT_LAYER_MEDIA),
+ [LAYER_NAV] = LAYOUT_wrapper(LAYOUT_LAYER_NAV),
+ [LAYER_MOUSE] = LAYOUT_wrapper(LAYOUT_LAYER_MOUSE),
+ [LAYER_SYM] = LAYOUT_wrapper(LAYOUT_LAYER_SYM),
+ [LAYER_NUM] = LAYOUT_wrapper(LAYOUT_LAYER_NUM),
+ [LAYER_FUN] = LAYOUT_wrapper(LAYOUT_LAYER_FUN),
+};
+// clang-format on
+
+#if defined(POINTING_DEVICE_ENABLE) && defined(CHARYBDIS_AUTO_SNIPING_ON_LAYER)
+layer_state_t layer_state_set_kb(layer_state_t state) {
+ state = layer_state_set_user(state);
+ charybdis_set_pointer_sniping_enabled(layer_state_cmp(state, CHARYBDIS_AUTO_SNIPING_ON_LAYER));
+ return state;
+}
+#endif // POINTING_DEVICE_ENABLE && CHARYBDIS_AUTO_SNIPING_ON_LAYER
+
+#ifdef RGB_MATRIX_ENABLE
+// Forward-declare this helper function since it is defined in rgb_matrix.c.
+void rgb_matrix_update_pwm_buffers(void);
+#endif
+
+void shutdown_user(void) {
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable_noeeprom();
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
+ rgblight_setrgb(RGB_RED);
+#endif // RGBLIGHT_ENABLE
+#ifdef RGB_MATRIX_ENABLE
+ rgb_matrix_set_color_all(RGB_RED);
+ rgb_matrix_update_pwm_buffers();
+#endif // RGB_MATRIX_ENABLE
+}
diff --git a/keyboards/bastardkb/charybdis/3x5/keymaps/bstiq/readme.md b/keyboards/bastardkb/charybdis/3x5/keymaps/bstiq/readme.md
new file mode 100644
index 0000000000..5d9f7fcd5f
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/keymaps/bstiq/readme.md
@@ -0,0 +1,3 @@
+# Charybdis (3x5) @bstiq keymap
+
+Inspired from Miryoku, using home-rows.
diff --git a/keyboards/bastardkb/charybdis/3x5/keymaps/bstiq/rules.mk b/keyboards/bastardkb/charybdis/3x5/keymaps/bstiq/rules.mk
new file mode 100644
index 0000000000..5d91064607
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/keymaps/bstiq/rules.mk
@@ -0,0 +1,10 @@
+ifeq ($(MCU),atmega32u4)
+ # Space saving settings.
+ TAP_DANCE_ENABLE = no
+ COMBO_ENABLE = no
+ QMK_SETTINGS = no
+else ifeq ($(MCU),STM32F411)
+ EEPROM_DRIVER = vendor
+endif
+
+VIA_ENABLE = yes
diff --git a/keyboards/bastardkb/charybdis/3x5/keymaps/default/config.h b/keyboards/bastardkb/charybdis/3x5/keymaps/default/config.h
deleted file mode 100644
index f2dd86c653..0000000000
--- a/keyboards/bastardkb/charybdis/3x5/keymaps/default/config.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * Copyright 2021 Charly Delay (@0xcharly)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-
-#ifndef TAPPING_TERM
-/**
- * \brief Configure the global tapping term (default: 200ms).
- *
- * If you have a lot of accidental mod activations, crank up the tapping term.
- *
- * See docs.qmk.fm/using-qmk/software-features/tap_hold#tapping-term
- */
-# define TAPPING_TERM 200
-#endif // TAPPING_TERM
-
-/* RGB Matrix. */
-
-#ifdef RGB_MATRIX_ENABLE
-// Disable control of RGB matrix by keycodes (must use firmware implementation
-// to control the feature).
-# define RGB_MATRIX_DISABLE_KEYCODES
-
-// Limit maximum brightness to keep power consumption reasonable, and avoid
-// disconnects.
-# undef RGB_MATRIX_MAXIMUM_BRIGHTNESS
-# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 64
-
-// Rainbow swirl as startup mode.
-# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
-# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT
-
-// Slow swirl at startup.
-# define RGB_MATRIX_STARTUP_SPD 32
-
-// Startup values.
-# define RGB_MATRIX_STARTUP_HUE 0
-# define RGB_MATRIX_STARTUP_SAT 255
-# define RGB_MATRIX_STARTUP_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS
-# define RGB_MATRIX_STARTUP_HSV RGB_MATRIX_STARTUP_HUE, RGB_MATRIX_STARTUP_SAT, RGB_MATRIX_STARTUP_VAL
-#endif // RGB_MATRIX_ENABLE
diff --git a/keyboards/bastardkb/charybdis/3x5/keymaps/default/keymap.c b/keyboards/bastardkb/charybdis/3x5/keymaps/default/keymap.c
index cb578aa8d6..60c3146308 100644
--- a/keyboards/bastardkb/charybdis/3x5/keymaps/default/keymap.c
+++ b/keyboards/bastardkb/charybdis/3x5/keymaps/default/keymap.c
@@ -14,6 +14,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
+
#include QMK_KEYBOARD_H
enum charybdis_keymap_layers {
@@ -49,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PPLS, KC_4, KC_5, KC_6, KC_PMNS,
// ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
- XXXXXXX, XXXXXXX, XXXXXXX, EEP_RST, QK_BOOT, KC_PAST, KC_1, KC_2, KC_3, KC_PSLS,
+ XXXXXXX, XXXXXXX, XXXXXXX, EE_CLR, QK_BOOT, KC_PAST, KC_1, KC_2, KC_3, KC_PSLS,
// ╰─────────────────────────────────────────────┤ ├─────────────────────────────────────────────╯
XXXXXXX, XXXXXXX, _______, XXXXXXX, _______
// ╰───────────────────────────╯ ╰──────────────────╯
@@ -61,7 +62,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_RGUI,
// ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
- KC_HOME, KC_PGUP, KC_PGDN, KC_END, XXXXXXX, QK_BOOT, EEP_RST, XXXXXXX, XXXXXXX, XXXXXXX,
+ KC_HOME, KC_PGUP, KC_PGDN, KC_END, XXXXXXX, QK_BOOT, EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX,
// ╰─────────────────────────────────────────────┤ ├─────────────────────────────────────────────╯
_______, _______, XXXXXXX, _______, XXXXXXX
// ╰───────────────────────────╯ ╰──────────────────╯
diff --git a/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/config.h b/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/config.h
index 0f08aee9ef..514a153623 100644
--- a/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/config.h
+++ b/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/config.h
@@ -18,90 +18,90 @@ along with this program. If not, see .
#pragma once
-#undef PRODUCT
-#define PRODUCT Charybdis Nano (Blackpill)
+#ifdef KEYBOARD_bastardkb_charybdis_3x5_blackpill
-#undef MATRIX_ROW_PINS
-#define MATRIX_ROW_PINS \
- { B12, B13, B14, B15 }
-#undef MATRIX_COL_PINS
-#define MATRIX_COL_PINS \
- { A15, B3, B4, B5, B6 }
+# undef MATRIX_ROW_PINS
+# define MATRIX_ROW_PINS \
+ { B12, B13, B14, B15 }
+# undef MATRIX_COL_PINS
+# define MATRIX_COL_PINS \
+ { A15, B3, B4, B5, B6 }
+# undef MATRIX_ROW_PINS_RIGHT
+# define MATRIX_ROW_PINS_RIGHT \
+ { B12, B13, B14, B15 }
+# undef MATRIX_COL_PINS_RIGHT
+# define MATRIX_COL_PINS_RIGHT \
+ { A15, B3, B4, B5, B6 }
-#undef MATRIX_ROW_PINS_RIGHT
-#define MATRIX_ROW_PINS_RIGHT \
- { B12, B13, B14, B15 }
-#undef MATRIX_COL_PINS_RIGHT
-#define MATRIX_COL_PINS_RIGHT \
- { A15, B3, B4, B5, B6 }
-
-#define USB_VBUS_PIN B10
-#define SPLIT_HAND_PIN C14 // high = left, low = right
+# define USB_VBUS_PIN B10
+# undef SPLIT_HAND_PIN
+# define SPLIT_HAND_PIN C14 // high = left, low = right
// WS2812 RGB LED strip input and number of LEDs
-#undef RGB_DI_PIN
-#define RGB_DI_PIN A1
-#undef RGB_MATRIX_MAXIMUM_BRIGHTNESS
-#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150
-#define WS2812_PWM_DRIVER PWMD2 // default: PWMD2
-#define WS2812_PWM_CHANNEL 2 // default: 2
-#define WS2812_PWM_PAL_MODE 1 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
-#define WS2812_EXTERNAL_PULLUP
+# undef RGB_DI_PIN
+# define RGB_DI_PIN A1
+# undef RGB_MATRIX_MAXIMUM_BRIGHTNESS
+# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150
+# define WS2812_PWM_DRIVER PWMD2 // default: PWMD2
+# define WS2812_PWM_CHANNEL 2 // default: 2
+# define WS2812_PWM_PAL_MODE 1 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
+# define WS2812_EXTERNAL_PULLUP
//#define WS2812_PWM_COMPLEMENTARY_OUTPUT // Define for a complementary timer output (TIMx_CHyN); omit for a normal timer output (TIMx_CHy).
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM7 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
-#define WS2812_DMA_CHANNEL 3 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
-#define WS2812_PWM_TARGET_PERIOD 800000
+# undef WS2812_DMA_STREAM
+# define WS2812_DMA_STREAM STM32_DMA1_STREAM7 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+# define WS2812_DMA_CHANNEL 3 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+# define WS2812_PWM_TARGET_PERIOD 800000
-#define DEBUG_LED_PIN C13
+# define DEBUG_LED_PIN C13
/* Audio config */
-#define AUDIO_PIN B1
-#define AUDIO_PWM_DRIVER PWMD3
-#define AUDIO_PWM_CHANNEL 4
-#define AUDIO_PWM_PAL_MODE 2
-#define AUDIO_STATE_TIMER GPTD4
+# define AUDIO_PIN B1
+# define AUDIO_PWM_DRIVER PWMD3
+# define AUDIO_PWM_CHANNEL 4
+# define AUDIO_PWM_PAL_MODE 2
/* serial.c configuration for split keyboard */
-#undef SOFT_SERIAL_PIN
-#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode.
-#define SERIAL_USART_TX_PIN A2
-#define SERIAL_USART_RX_PIN A3
-#define SERIAL_USART_DRIVER SD2
-#define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
-#define SERIAL_USART_RX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
-#define SERIAL_USART_TIMEOUT 100 // USART driver timeout. default 100
-#define SERIAL_USART_SPEED 921600
+# undef SOFT_SERIAL_PIN
+# define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode.
+# undef SERIAL_USART_TX_PIN
+# define SERIAL_USART_TX_PIN A2
+# undef SERIAL_USART_RX_PIN
+# define SERIAL_USART_RX_PIN A3
+# define SERIAL_USART_DRIVER SD2
+# define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
+# define SERIAL_USART_RX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
+# define SERIAL_USART_TIMEOUT 100 // USART driver timeout. default 100
+# define SERIAL_USART_SPEED 921600
// #define SERIAL_USART_PIN_SWAP // swap RX and TX pins on master
// To use the highest possible baudrate (3.75Mbit/s) uncomment the following
// line, this can result in dropped communications so lower the speed if there
// are many timeouts.
// #define SERIAL_USART_SPEED (STM32_PCLK2 >> 4)
-#define CRC8_USE_TABLE
-#define CRC8_OPTIMIZE_SPEED
+# define CRC8_USE_TABLE
+# define CRC8_OPTIMIZE_SPEED
/* spi config for eeprom and pmw3360 sensor */
-#define SPI_DRIVER SPID1
-#define SPI_SCK_PIN A5
-#define SPI_SCK_PAL_MODE 5
-#define SPI_MOSI_PIN A7
-#define SPI_MOSI_PAL_MODE 5
-#define SPI_MISO_PIN A6
-#define SPI_MISO_PAL_MODE 5
+# define SPI_DRIVER SPID1
+# define SPI_SCK_PIN A5
+# define SPI_SCK_PAL_MODE 5
+# define SPI_MOSI_PIN A7
+# define SPI_MOSI_PAL_MODE 5
+# define SPI_MISO_PIN A6
+# define SPI_MISO_PAL_MODE 5
/* eeprom config */
-#define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN A4
-#define EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR 64
+# define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN A4
+# define EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR 64
// #define EXTERNAL_EEPROM_BYTE_COUNT 8196
// #define EXTERNAL_EEPROM_PAGE_SIZE 32
// #define EXTERNAL_EEPROM_ADDRESS_SIZE 2
/* pmw3360 config */
-#undef PMW3360_CS_PIN
-#define PMW3360_CS_PIN B0
-#define PMW3360_SPI_MODE 3
-#define PMW3360_SPI_DIVISOR 64
+# undef PMW33XX_CS_PIN
+# define PMW33XX_CS_PIN B0
+#endif
#define CHARYBDIS_MINIMUM_DEFAULT_DPI 1200
#define CHARYBDIS_DEFAULT_DPI_CONFIG_STEP 400
diff --git a/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/halconf.h b/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/halconf.h
index 39644726c3..3b254172b4 100644
--- a/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/halconf.h
+++ b/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/halconf.h
@@ -15,12 +15,13 @@
*/
#pragma once
-#define HAL_USE_PWM TRUE
-#define HAL_USE_SERIAL TRUE
-#define HAL_USE_I2C TRUE
-#define HAL_USE_SPI TRUE
-#define SPI_USE_WAIT TRUE
-#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
-#define HAL_USE_GPT TRUE
+#if defined(KEYBOARD_bastardkb_charybdis_3x5_blackpill)
+# define HAL_USE_PWM TRUE
+# define HAL_USE_SERIAL TRUE
+# define HAL_USE_I2C TRUE
+# define HAL_USE_SPI TRUE
+# define SPI_USE_WAIT TRUE
+# define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
+#endif
#include_next
diff --git a/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/keymap.c b/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/keymap.c
index a923a80b40..02cb89fe65 100644
--- a/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/keymap.c
+++ b/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/keymap.c
@@ -83,24 +83,28 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
};
-void matrix_init_keyemap(void) { setPinInputHigh(A0); }
+#if defined(KEYBOARD_bastardkb_charybdis_3x5_blackpill)
+void keyboard_pre_init_keymap(void) {
+ setPinInputHigh(A0);
+}
-void matrix_scan_keymap(void) {
+void housekeeping_task_keymap(void) {
if (!readPin(A0)) {
reset_keyboard();
}
}
-#ifdef USB_VBUS_PIN
+# ifdef USB_VBUS_PIN
bool usb_vbus_state(void) {
setPinInputLow(USB_VBUS_PIN);
wait_us(5);
return readPin(USB_VBUS_PIN);
}
-#endif
+# endif
void matrix_output_unselect_delay(uint8_t line, bool key_pressed) {
for (int32_t i = 0; i < 40; i++) {
__asm__ volatile("nop" ::: "memory");
}
}
+#endif
diff --git a/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/mcuconf.h b/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/mcuconf.h
index 05b5776ac3..9c40967015 100644
--- a/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/mcuconf.h
+++ b/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/mcuconf.h
@@ -18,28 +18,27 @@
#include_next "mcuconf.h"
-#undef STM32_I2C_USE_I2C1
-#define STM32_I2C_USE_I2C1 TRUE
+#if defined(KEYBOARD_bastardkb_charybdis_3x5_blackpill)
+# undef STM32_I2C_USE_I2C1
+# define STM32_I2C_USE_I2C1 TRUE
// #undef STM32_I2C_I2C1_RX_DMA_STREAM
// #define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0)
-#undef STM32_I2C_I2C1_TX_DMA_STREAM
-#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1)
+# undef STM32_I2C_I2C1_TX_DMA_STREAM
+# define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 1)
-#undef STM32_PWM_USE_TIM2
-#define STM32_PWM_USE_TIM2 TRUE
+# undef STM32_PWM_USE_TIM2
+# define STM32_PWM_USE_TIM2 TRUE
-#undef STM32_PWM_USE_TIM3
-#define STM32_PWM_USE_TIM3 TRUE
+# undef STM32_PWM_USE_TIM3
+# define STM32_PWM_USE_TIM3 TRUE
-#undef STM32_SPI_USE_SPI1
-#define STM32_SPI_USE_SPI1 TRUE
+# undef STM32_SPI_USE_SPI1
+# define STM32_SPI_USE_SPI1 TRUE
-#undef STM32_SERIAL_USE_USART2
-#define STM32_SERIAL_USE_USART2 TRUE
+# undef STM32_SERIAL_USE_USART2
+# define STM32_SERIAL_USE_USART2 TRUE
-#undef STM32_GPT_USE_TIM4
-#define STM32_GPT_USE_TIM4 TRUE
-
-#undef STM32_ST_USE_TIMER
-#define STM32_ST_USE_TIMER 5
+# undef STM32_ST_USE_TIMER
+# define STM32_ST_USE_TIMER 5
+#endif
diff --git a/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/rules.mk b/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/rules.mk
index 1369213cf2..ff4ede45ca 100644
--- a/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/rules.mk
+++ b/keyboards/bastardkb/charybdis/3x5/keymaps/drashna/rules.mk
@@ -1,28 +1,45 @@
-# MCU name
-MCU = STM32F411
-BOARD = BLACKPILL_STM32_F411
+RGB_MATRIX_ENABLE = no
+CUSTOM_UNICODE_ENABLE = no
+CUSTOM_POINTING_DEVICE = no
+CUSTOM_SPLIT_TRANSPORT_SYNC = no
-# Bootloader selection
-# BOOTLOADER = stm32-dfu
-BOOTLOADER := tinyuf2
-LTO_ENABLE := no
+ifeq ($(strip $(KEYBOARD)), bastardkb/charybdis/3x5/blackpill)
+ # Bootloader selection
+ BOOTLOADER := tinyuf2
-BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
-KEYBOARD_SHARED_EP = yes
-MOUSE_SHARED_EP = yes
+ LTO_ENABLE := no
-EEPROM_DRIVER = spi
-WS2812_DRIVER = pwm
-SERIAL_DRIVER = usart
-AUDIO_DRIVER = pwm_hardware
+ AUDIO_SUPPORTED = yes
+ AUDIO_ENABLE = yes
+ AUDIO_DRIVER = pwm_hardware
-AUDIO_SUPPORTED = yes
-AUDIO_ENABLE = yes
-MOUSEKEY_ENABLE = yes
-NKRO_ENABLE = yes
-CONSOLE_ENABLE = yes
+ OVERLOAD_FEATURES = yes
+endif
-AUTOCORRECTION_ENABLE = yes
+ifeq ($(strip $(KEYBOARD)), bastardkb/charybdis/3x5/v2/stemcell)
+ OVERLOAD_FEATURES = yes
+endif
+ifeq ($(strip $(KEYBOARD)), bastardkb/charybdis/3x5/v2/splinky)
+ OVERLOAD_FEATURES = yes
+endif
-DEBOUNCE_TYPE = asym_eager_defer_pk
+
+ifeq ($(strip $(OVERLOAD_FEATURES)), yes)
+ BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+ KEYBOARD_SHARED_EP = yes
+ MOUSE_SHARED_EP = yes
+
+ MOUSEKEY_ENABLE = yes
+ NKRO_ENABLE = yes
+ CONSOLE_ENABLE = yes
+ RGB_MATRIX_ENABLE = yes
+
+ AUTOCORRECT_ENABLE = yes
+
+ CUSTOM_UNICODE_ENABLE = yes
+ CUSTOM_POINTING_DEVICE = yes
+ CUSTOM_SPLIT_TRANSPORT_SYNC = yes
+
+ DEBOUNCE_TYPE = asym_eager_defer_pk
+endif
diff --git a/keyboards/bastardkb/charybdis/3x5/keymaps/via/config.h b/keyboards/bastardkb/charybdis/3x5/keymaps/via/config.h
index f515d85334..5d9d4662f0 100644
--- a/keyboards/bastardkb/charybdis/3x5/keymaps/via/config.h
+++ b/keyboards/bastardkb/charybdis/3x5/keymaps/via/config.h
@@ -19,54 +19,11 @@
#ifdef VIA_ENABLE
/* VIA configuration. */
# define DYNAMIC_KEYMAP_LAYER_COUNT 7
-#endif // VIA_ENABLE
+#endif // VIA_ENABLE
/* Disable unused features. */
#define NO_ACTION_ONESHOT
-#ifndef TAPPING_TERM
-/**
- * \brief Configure the global tapping term (default: 200ms).
- *
- * If you have a lot of accidental mod activations, crank up the tapping term.
- *
- * See docs.qmk.fm/using-qmk/software-features/tap_hold#tapping-term
- */
-# define TAPPING_TERM 200
-#endif // TAPPING_TERM
-
-/**
- * \brief Enable rapid switch from tap to hold.
- *
- * Note that a side-effect of this setting is to disable auto-repeat when
- * pressing key twice, except for one-shot keys.
- *
- * See docs.qmk.fm/using-qmk/software-features/tap_hold#tapping-force-hold
- */
-#define TAPPING_FORCE_HOLD
-
-/*
- * Tap-or-Hold decision modes.
- *
- * Note that the following flags behave differently when combined (ie. when 2 or
- * more are enabled).
- *
- * See bit.ly/tap-or-hold for a visual explanation of the following tap-or-hold
- * decision modes.
- */
-
-/**
- * \brief Faster tap-hold trigger.
- *
- * Without `PERMISSIVE_HOLD`, within `TAPPING_TERM`:
- * Mod(a)🠗 e🠗 e🠕 Mod(a)🠕 ➞ ae
- * With `PERMISSIVE_HOLD`, within `TAPPING_TERM`:
- * Mod(a)🠗 e🠗 e🠕 Mod(a)🠕 ➞ Mod+e
- *
- * See docs.qmk.fm/using-qmk/software-features/tap_hold#permissive-hold
- */
-#define PERMISSIVE_HOLD
-
/**
* \brief Prevent normal rollover on alphas from accidentally triggering mods.
*
@@ -76,43 +33,14 @@
* Mod(a)🠗 e🠗 Mod(a)🠕 e🠕 ➞ Mod+e
* With `IGNORE_MOD_TAP_INTERRUPT`, within `TAPPING_TERM`:
* Mod(a)🠗 e🠗 Mod(a)🠕 e🠕 ➞ ae
- *
- * See docs.qmk.fm/using-qmk/software-features/tap_hold#ignore-mod-tap-interrupt
*/
#define IGNORE_MOD_TAP_INTERRUPT
/* Charybdis-specific features. */
#ifdef POINTING_DEVICE_ENABLE
-// Enable pointer acceleration, which increases the speed by ~2x for large
-// displacement, while maintaining 1x speed for slow movements. See also:
-// - `CHARYBDIS_POINTER_ACCELERATION_FACTOR`
-# define CHARYBDIS_POINTER_ACCELERATION_ENABLE
-
// Automatically enable the pointer layer when moving the trackball. See also:
// - `CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS`
// - `CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD`
// #define CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
-#endif // POINTING_DEVICE_ENABLE
-
-/* RGB Matrix. */
-
-#ifdef RGB_MATRIX_ENABLE
-// Limit maximum brightness to keep power consumption reasonable, and avoid
-// disconnects.
-# undef RGB_MATRIX_MAXIMUM_BRIGHTNESS
-# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 64
-
-// Rainbow swirl as startup mode.
-# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
-# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT
-
-// Slow swirl at startup.
-# define RGB_MATRIX_STARTUP_SPD 32
-
-// Startup values.
-# define RGB_MATRIX_STARTUP_HUE 0
-# define RGB_MATRIX_STARTUP_SAT 255
-# define RGB_MATRIX_STARTUP_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS
-# define RGB_MATRIX_STARTUP_HSV RGB_MATRIX_STARTUP_HUE, RGB_MATRIX_STARTUP_SAT, RGB_MATRIX_STARTUP_VAL
-#endif // RGB_MATRIX_ENABLE
+#endif // POINTING_DEVICE_ENABLE
diff --git a/keyboards/bastardkb/charybdis/3x5/keymaps/via/keymap.c b/keyboards/bastardkb/charybdis/3x5/keymaps/via/keymap.c
index dc02ed34c6..ec93cec627 100644
--- a/keyboards/bastardkb/charybdis/3x5/keymaps/via/keymap.c
+++ b/keyboards/bastardkb/charybdis/3x5/keymaps/via/keymap.c
@@ -18,7 +18,7 @@
#ifdef CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
# include "timer.h"
-#endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+#endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
enum charybdis_keymap_layers {
LAYER_BASE = 0,
@@ -38,12 +38,12 @@ static uint16_t auto_pointer_layer_timer = 0;
# ifndef CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS
# define CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS 1000
-# endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS
+# endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS
# ifndef CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD
# define CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD 8
-# endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD
-#endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+# endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD
+#endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
#define ESC_MED LT(LAYER_MEDIA, KC_ESC)
#define SPC_NAV LT(LAYER_NAVIGATION, KC_SPC)
@@ -52,6 +52,13 @@ static uint16_t auto_pointer_layer_timer = 0;
#define BSP_NUM LT(LAYER_NUMERAL, KC_BSPC)
#define _L_PTR(KC) LT(LAYER_POINTER, KC)
+#ifndef POINTING_DEVICE_ENABLE
+# define DRGSCRL KC_NO
+# define DPI_MOD KC_NO
+# define S_D_MOD KC_NO
+# define SNIPING KC_NO
+#endif // !POINTING_DEVICE_ENABLE
+
// clang-format off
/** \brief QWERTY layout (3 rows, 10 columns). */
#define LAYOUT_LAYER_BASE \
@@ -85,7 +92,7 @@ static uint16_t auto_pointer_layer_timer = 0;
*/
#define LAYOUT_LAYER_FUNCTION \
_______________DEAD_HALF_ROW_______________, KC_PSCR, KC_F7, KC_F8, KC_F9, KC_F12, \
- ______________HOME_ROW_GACS_L______________, KC_SLCK, KC_F4, KC_F5, KC_F6, KC_F11, \
+ ______________HOME_ROW_GACS_L______________, KC_SCRL, KC_F4, KC_F5, KC_F6, KC_F11, \
_______________DEAD_HALF_ROW_______________, KC_PAUS, KC_F1, KC_F2, KC_F3, KC_F10, \
XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX
@@ -98,14 +105,14 @@ static uint16_t auto_pointer_layer_timer = 0;
#define LAYOUT_LAYER_MEDIA \
XXXXXXX,RGB_RMOD, RGB_TOG, RGB_MOD, XXXXXXX, XXXXXXX,RGB_RMOD, RGB_TOG, RGB_MOD, XXXXXXX, \
KC_MPRV, KC_VOLD, KC_MUTE, KC_VOLU, KC_MNXT, KC_MPRV, KC_VOLD, KC_MUTE, KC_VOLU, KC_MNXT, \
- XXXXXXX, XXXXXXX, XXXXXXX, EEP_RST, QK_BOOT, QK_BOOT, EEP_RST, XXXXXXX, XXXXXXX, XXXXXXX, \
+ XXXXXXX, XXXXXXX, XXXXXXX, EE_CLR, QK_BOOT, QK_BOOT, EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX, \
_______, KC_MPLY, KC_MSTP, KC_MSTP, KC_MPLY
/** \brief Mouse emulation and pointer functions. */
#define LAYOUT_LAYER_POINTER \
XXXXXXX, XXXXXXX, XXXXXXX, DPI_MOD, S_D_MOD, S_D_MOD, DPI_MOD, XXXXXXX, XXXXXXX, XXXXXXX, \
______________HOME_ROW_GACS_L______________, ______________HOME_ROW_GACS_R______________, \
- _______, DRGSCRL, SNIPING, EEP_RST, QK_BOOT, QK_BOOT, EEP_RST, SNIPING, DRGSCRL, _______, \
+ _______, DRGSCRL, SNIPING, EE_CLR, QK_BOOT, QK_BOOT, EE_CLR, SNIPING, DRGSCRL, _______, \
KC_BTN2, KC_BTN1, KC_BTN3, KC_BTN3, KC_BTN1
/**
@@ -118,7 +125,7 @@ static uint16_t auto_pointer_layer_timer = 0;
*/
#define LAYOUT_LAYER_NAVIGATION \
_______________DEAD_HALF_ROW_______________, _______________DEAD_HALF_ROW_______________, \
- ______________HOME_ROW_GACS_L______________, KC_CLCK, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, \
+ ______________HOME_ROW_GACS_L______________, KC_CAPS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, \
_______________DEAD_HALF_ROW_______________, KC_INS, KC_HOME, KC_PGDN, KC_PGUP, KC_END, \
XXXXXXX, _______, XXXXXXX, KC_ENT, KC_BSPC
@@ -217,36 +224,35 @@ report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) {
# ifdef RGB_MATRIX_ENABLE
rgb_matrix_mode_noeeprom(RGB_MATRIX_NONE);
rgb_matrix_sethsv_noeeprom(HSV_GREEN);
-# endif // RGB_MATRIX_ENABLE
+# endif // RGB_MATRIX_ENABLE
}
auto_pointer_layer_timer = timer_read();
}
return mouse_report;
}
-void matrix_scan_kb(void) {
+void matrix_scan_user(void) {
if (auto_pointer_layer_timer != 0 && TIMER_DIFF_16(timer_read(), auto_pointer_layer_timer) >= CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS) {
auto_pointer_layer_timer = 0;
layer_off(LAYER_POINTER);
# ifdef RGB_MATRIX_ENABLE
- rgb_matrix_mode_noeeprom(RGB_MATRIX_STARTUP_MODE);
-# endif // RGB_MATRIX_ENABLE
+ rgb_matrix_mode_noeeprom(RGB_MATRIX_DEFAULT_MODE);
+# endif // RGB_MATRIX_ENABLE
}
- matrix_scan_user();
}
-# endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+# endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
# ifdef CHARYBDIS_AUTO_SNIPING_ON_LAYER
-layer_state_t layer_state_set_kb(layer_state_t state) {
- state = layer_state_set_user(state);
+layer_state_t layer_state_set_user(layer_state_t state) {
charybdis_set_pointer_sniping_enabled(layer_state_cmp(state, CHARYBDIS_AUTO_SNIPING_ON_LAYER));
return state;
}
-# endif // CHARYBDIS_AUTO_SNIPING_ON_LAYER
-#endif // POINTING_DEVICE_ENABLE
+# endif // CHARYBDIS_AUTO_SNIPING_ON_LAYER
+#endif // POINTING_DEVICE_ENABLE
#ifdef RGB_MATRIX_ENABLE
-// Forward-declare this helper function since it is defined in rgb_matrix.c.
+// Forward-declare this helper function since it is defined in
+// rgb_matrix.c.
void rgb_matrix_update_pwm_buffers(void);
#endif
@@ -254,10 +260,10 @@ void shutdown_user(void) {
#ifdef RGBLIGHT_ENABLE
rgblight_enable_noeeprom();
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
- rgblight_setrgb_red();
-#endif // RGBLIGHT_ENABLE
+ rgblight_setrgb(RGB_RED);
+#endif // RGBLIGHT_ENABLE
#ifdef RGB_MATRIX_ENABLE
rgb_matrix_set_color_all(RGB_RED);
rgb_matrix_update_pwm_buffers();
-#endif // RGB_MATRIX_ENABLE
+#endif // RGB_MATRIX_ENABLE
}
diff --git a/keyboards/bastardkb/charybdis/3x5/rules.mk b/keyboards/bastardkb/charybdis/3x5/rules.mk
deleted file mode 100644
index c5f3f0fb8c..0000000000
--- a/keyboards/bastardkb/charybdis/3x5/rules.mk
+++ /dev/null
@@ -1,38 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = atmel-dfu
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = no # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
-AUDIO_ENABLE = no # Audio output
-
-AUDIO_SUPPORTED = no # Audio is not supported
-RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default
-RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default
-RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
-RGB_MATRIX_DRIVER = WS2812
-
-# Enable link-time optimization by default. The Charybdis packs a lot of
-# features (RGB, Via, trackball) in a small atmega32u4 package.
-LTO_ENABLE = yes
-
-# Charybdis nano is a split 3x5 keyboard with a maximum of 3 thumb keys (2 on
-# the trackball side).
-SPLIT_KEYBOARD = yes
-LAYOUTS = split_3x5_3 # Support community layout, in particular Manna-Harbour's Miryoku layout
-
-POINTING_DEVICE_ENABLE = yes # Enable trackball
-POINTING_DEVICE_DRIVER = pmw3360
-# https://qmk.fm/changes/2018-11-16-use-a-single-endpoint-for-hid-reports
-MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint
diff --git a/keyboards/bastardkb/charybdis/3x5/v1/elitec/config.h b/keyboards/bastardkb/charybdis/3x5/v1/elitec/config.h
new file mode 100644
index 0000000000..8a9d40ac63
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v1/elitec/config.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2020 Christopher Courtney (@drashna)
+ * Copyright 2021 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { B7, C6, D4, B5 }
+#define MATRIX_COL_PINS \
+ { C7, F0, D7, E6, B4 }
+
+#define MATRIX_ROW_PINS_RIGHT \
+ { F0, C6, D4, B5 }
+#define MATRIX_COL_PINS_RIGHT \
+ { C7, B7, D7, E6, B4 }
+
+/* Handedness. */
+#define MASTER_RIGHT
+
+/* serial.c configuration (for split keyboard). */
+#define SOFT_SERIAL_PIN D2
+
+/* RGB settings. */
+#define RGB_DI_PIN D3
+
+/* PMW3360 settings. */
+#define POINTING_DEVICE_CS_PIN B0
diff --git a/keyboards/bastardkb/charybdis/3x5/v1/elitec/info.json b/keyboards/bastardkb/charybdis/3x5/v1/elitec/info.json
new file mode 100644
index 0000000000..b83dc6c3f8
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v1/elitec/info.json
@@ -0,0 +1,6 @@
+{
+ "keyboard_name": "Charybdis Nano (3x5) Elite-C",
+ "usb": {
+ "device_version": "1.0.0"
+ }
+}
diff --git a/keyboards/bastardkb/charybdis/3x5/v1/elitec/rules.mk b/keyboards/bastardkb/charybdis/3x5/v1/elitec/rules.mk
new file mode 100644
index 0000000000..22bd22652a
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v1/elitec/rules.mk
@@ -0,0 +1,37 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported
+RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default
+RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default
+RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
+RGB_MATRIX_DRIVER = WS2812
+
+# Charybdis nano is a split 3x5 keyboard with a maximum of 3 thumb keys (2 on
+# the trackball side).
+SPLIT_KEYBOARD = yes
+LAYOUTS = split_3x5_3 # Support community layout, in particular Manna-Harbour's Miryoku layout
+
+POINTING_DEVICE_ENABLE = yes # Enable trackball
+POINTING_DEVICE_DRIVER = pmw3360
+MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint
+
+# Enable link-time optimization by default. The Charybdis packs a lot of
+# features (RGB, Via, trackball) in a small atmega32u4 package.
+LTO_ENABLE = yes
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/elitec/config.h b/keyboards/bastardkb/charybdis/3x5/v2/elitec/config.h
new file mode 100644
index 0000000000..2667ee9e7e
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v2/elitec/config.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { F7, C6, D4, B5 }
+#define MATRIX_COL_PINS \
+ { F5, B6, D7, E6, B4 }
+
+/* Handedness. */
+#define MASTER_RIGHT
+
+/* serial.c configuration (for split keyboard). */
+#define SOFT_SERIAL_PIN D2
+
+/* RGB settings. */
+#define RGB_DI_PIN D3
+
+/* PMW3360 settings. */
+#define POINTING_DEVICE_CS_PIN F0
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/elitec/info.json b/keyboards/bastardkb/charybdis/3x5/v2/elitec/info.json
new file mode 100644
index 0000000000..78453c44ff
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v2/elitec/info.json
@@ -0,0 +1,6 @@
+{
+ "keyboard_name": "Charybdis Nano (3x5) Elite-C",
+ "usb": {
+ "device_version": "2.0.0"
+ }
+}
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/elitec/rules.mk b/keyboards/bastardkb/charybdis/3x5/v2/elitec/rules.mk
new file mode 100644
index 0000000000..22bd22652a
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v2/elitec/rules.mk
@@ -0,0 +1,37 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported
+RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default
+RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default
+RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
+RGB_MATRIX_DRIVER = WS2812
+
+# Charybdis nano is a split 3x5 keyboard with a maximum of 3 thumb keys (2 on
+# the trackball side).
+SPLIT_KEYBOARD = yes
+LAYOUTS = split_3x5_3 # Support community layout, in particular Manna-Harbour's Miryoku layout
+
+POINTING_DEVICE_ENABLE = yes # Enable trackball
+POINTING_DEVICE_DRIVER = pmw3360
+MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint
+
+# Enable link-time optimization by default. The Charybdis packs a lot of
+# features (RGB, Via, trackball) in a small atmega32u4 package.
+LTO_ENABLE = yes
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky/config.h b/keyboards/bastardkb/charybdis/3x5/v2/splinky/config.h
new file mode 100644
index 0000000000..8e4a2de892
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v2/splinky/config.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { GP26, GP5, GP4, GP9 }
+
+/* serial.c configuration (for split keyboard). */
+#define SOFT_SERIAL_PIN GP1
+
+/* RGB settings. */
+#define RGB_DI_PIN GP0
+
+/* SPI & PMW3360 settings. */
+#define SPI_DRIVER SPID0
+#define SPI_MISO_PIN GP20
+
+/* Reset. */
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky/info.json b/keyboards/bastardkb/charybdis/3x5/v2/splinky/info.json
new file mode 100644
index 0000000000..98f436f52b
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v2/splinky/info.json
@@ -0,0 +1,6 @@
+{
+ "keyboard_name": "Charybdis Nano (3x5) Splinky",
+ "usb": {
+ "device_version": "2.0.0"
+ }
+}
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky/mcuconf.h b/keyboards/bastardkb/charybdis/3x5/v2/splinky/mcuconf.h
new file mode 100644
index 0000000000..0fdd67c3a2
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v2/splinky/mcuconf.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include_next "mcuconf.h"
+
+#undef RP_SPI_USE_SPI0
+#define RP_SPI_USE_SPI0 TRUE
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky/readme.md b/keyboards/bastardkb/charybdis/3x5/v2/splinky/readme.md
new file mode 100644
index 0000000000..22df77bbaa
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v2/splinky/readme.md
@@ -0,0 +1,6 @@
+# Splinky controller
+
+The splinky is a Pro-Micro/Elite-C replacement with USB-C and RP2040.
+
+See https://github.com/plut0nium/0xB2/#releases to figure out the right version
+for you (v2 and v3) supported.
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky/rules.mk b/keyboards/bastardkb/charybdis/3x5/v2/splinky/rules.mk
new file mode 100644
index 0000000000..7e38f33d5d
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v2/splinky/rules.mk
@@ -0,0 +1,39 @@
+# MCU name
+MCU = RP2040
+
+# Bootloader selection
+BOOTLOADER = rp2040
+
+# RP2040-specific options
+ALLOW_WARNINGS = yes
+PICO_INTRINSICS_ENABLED = no # ATM Unsupported by ChibiOS.
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported
+RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default
+RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default
+RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
+RGB_MATRIX_DRIVER = WS2812
+
+SPLIT_KEYBOARD = yes
+LAYOUTS = split_3x5_3
+
+POINTING_DEVICE_ENABLE = yes # Enable trackball
+POINTING_DEVICE_DRIVER = pmw3360
+
+SERIAL_DRIVER = vendor
+WS2812_DRIVER = vendor
+
+DEFAULT_FOLDER = bastardkb/charybdis/3x5/v2/splinky/v3
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky/v2/config.h b/keyboards/bastardkb/charybdis/3x5/v2/splinky/v2/config.h
new file mode 100644
index 0000000000..516f3d9df7
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v2/splinky/v2/config.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_COL_PINS \
+ { GP28, GP15, GP6, GP7, GP8 }
+
+/* SPI & PMW3360 settings. */
+#define SPI_SCK_PIN GP18
+#define SPI_MOSI_PIN GP19
+#define POINTING_DEVICE_CS_PIN GP14
+
+/* Handedness. */
+#define MASTER_RIGHT
+
+// To use the handedness pin, resistors need to be installed on the adapter PCB.
+// If so, uncomment the following code, and undefine MASTER_RIGHT above.
+// #define SPLIT_HAND_PIN GP13
+// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left.
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky/v2/rules.mk b/keyboards/bastardkb/charybdis/3x5/v2/splinky/v2/rules.mk
new file mode 100644
index 0000000000..c9c50319db
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v2/splinky/v2/rules.mk
@@ -0,0 +1,2 @@
+# Intentionally blank so that QMK detects this folder as a valid keyboard
+# parameter.
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky/v3/config.h b/keyboards/bastardkb/charybdis/3x5/v2/splinky/v3/config.h
new file mode 100644
index 0000000000..09165a8e97
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v2/splinky/v3/config.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_COL_PINS \
+ { GP28, GP21, GP6, GP7, GP8 }
+
+/* SPI & PMW3360 settings. */
+#define SPI_SCK_PIN GP22
+#define SPI_MOSI_PIN GP23
+#define POINTING_DEVICE_CS_PIN GP16
+
+/* Handedness. */
+#define MASTER_RIGHT
+
+// To use the handedness pin, resistors need to be installed on the adapter PCB.
+// If so, uncomment the following code, and undefine MASTER_RIGHT above.
+// #define SPLIT_HAND_PIN GP15
+// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left.
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky/v3/rules.mk b/keyboards/bastardkb/charybdis/3x5/v2/splinky/v3/rules.mk
new file mode 100644
index 0000000000..c9c50319db
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v2/splinky/v3/rules.mk
@@ -0,0 +1,2 @@
+# Intentionally blank so that QMK detects this folder as a valid keyboard
+# parameter.
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/config.h b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/config.h
new file mode 100644
index 0000000000..a06859b215
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/config.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { F7, C6, D4, B5 }
+#define MATRIX_COL_PINS \
+ { F5, B6, D7, E6, B4 }
+
+/* Handedness. */
+#define MASTER_RIGHT
+
+// To use the handedness pin, resistors need to be installed on the adapter PCB.
+// If so, uncomment the following code, and undefine MASTER_RIGHT above.
+// #define A0 PAL_LINE(GPIOA, 0)
+// #define SPLIT_HAND_PIN A0
+// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left.
+
+/* serial.c configuration (for split keyboard). */
+#define SOFT_SERIAL_PIN D2
+
+/* RGB settings. */
+#define RGB_DI_PIN D3
+#define WS2812_PWM_DRIVER PWMD2
+#define WS2812_PWM_CHANNEL 4
+#define WS2812_PWM_PAL_MODE 1
+#define WS2812_DMA_STREAM STM32_DMA1_STREAM7
+#define WS2812_DMA_CHANNEL 3
+
+/* CRC. */
+#define CRC8_USE_TABLE
+#define CRC8_OPTIMIZE_SPEED
+
+/* SPI config for pmw3360 sensor. */
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN B1
+#define SPI_SCK_PAL_MODE 5
+#define SPI_MOSI_PIN B2
+#define SPI_MOSI_PAL_MODE 5
+#define SPI_MISO_PIN B3
+#define SPI_MISO_PAL_MODE 5
+
+/* PMW3360 settings. */
+#define A1 PAL_LINE(GPIOA, 1)
+#define POINTING_DEVICE_CS_PIN A1
+#define PMW3360_CS_MODE 3
+#define PMW3360_CS_DIVISOR 64
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/halconf.h b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/halconf.h
new file mode 100644
index 0000000000..0397de50b7
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/halconf.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2021 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#define HAL_USE_PWM TRUE
+#define HAL_USE_SERIAL TRUE
+#define HAL_USE_SPI TRUE
+
+#include_next
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/info.json b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/info.json
new file mode 100644
index 0000000000..b344c1cbfc
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/info.json
@@ -0,0 +1,6 @@
+{
+ "keyboard_name": "Charybdis Nano (3x5) STeMCell",
+ "usb": {
+ "device_version": "2.0.0"
+ }
+}
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/mcuconf.h b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/mcuconf.h
new file mode 100644
index 0000000000..17a46d8f95
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/mcuconf.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2021 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include_next
+
+#undef STM32_SPI_USE_SPI1
+#define STM32_SPI_USE_SPI1 TRUE
+
+#undef STM32_SERIAL_USE_USART1
+#define STM32_SERIAL_USE_USART1 FALSE
+
+#undef STM32_PWM_USE_TIM2
+#define STM32_PWM_USE_TIM2 TRUE
+
+#undef STM32_ST_USE_TIMER
+#define STM32_ST_USE_TIMER 5
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/rules.mk b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/rules.mk
new file mode 100644
index 0000000000..e4a9ce289c
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/rules.mk
@@ -0,0 +1,38 @@
+# MCU name
+MCU = STM32F411
+
+# Bootloader selection
+BOOTLOADER = stm32-dfu
+CONVERT_TO = stemcell
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported
+RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default
+RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default
+RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
+RGB_MATRIX_DRIVER = WS2812
+
+SPLIT_KEYBOARD = yes
+LAYOUTS = split_3x5_3
+
+POINTING_DEVICE_ENABLE = yes # Enable trackball
+POINTING_DEVICE_DRIVER = pmw3360
+MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint
+KEYBOARD_SHARED_EP = yes
+
+SERIAL_DRIVER = usart
+WS2812_DRIVER = pwm
+
+DEBOUNCE_TYPE = asym_eager_defer_pk
diff --git a/keyboards/bastardkb/charybdis/3x6/3x6.c b/keyboards/bastardkb/charybdis/3x6/3x6.c
new file mode 100644
index 0000000000..beb04efc0b
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/3x6.c
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Publicw License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "3x6.h"
+
+// clang-format off
+#ifdef RGB_MATRIX_ENABLE
+/**
+ * \brief LEDs index.
+ *
+ # 0,0 14 28 42 56 70 84 98 126 140 154 168 182 196 210 224,0
+ # 0,0 15 30 45 60 75 90 105 119 134 149 164 179 194 209 224,0
+ * ╭────────────────────────╮ ╭────────────────────────╮
+ * 0 5 6 11 12 15 36 33 32 27 26 21
+ * ├────────────────────────┤ ├────────────────────────┤
+ * 1 4 7 10 13 16 37 34 31 28 25 22
+ * ├────────────────────────┤ ├────────────────────────┤
+ * 2 3 8 9 14 17 38 35 30 29 24 23
+ * ╰────────────────────────╯ ╰────────────────────────╯
+ * 18 19 20 39 40 XX
+ * ╰────────────╯ ╰────────────╯
+ *
+ * Note: the LED config simulates 42 LEDs instead of the actual 41 to prevent
+ * confusion when testing LEDs during assembly when handedness is not set
+ * correctly. Those fake LEDs are bound to the physical top-left corner.
+ */
+led_config_t g_led_config = { {
+ /* Key Matrix to LED index. */
+ // Left split.
+ { 0, 5, 6, 11, 12, 15 }, // Top row
+ { 1, 4, 7, 10, 13, 16 }, // Middle row
+ { 2, 3, 8, 9, 14, 17 }, // Bottom row
+ { NO_LED, 20, NO_LED, 18, 19, NO_LED }, // Thumb cluster
+ // Right split.
+ { 21, 26, 27, 32, 33, 36 }, // Top row
+ { 22, 25, 28, 31, 34, 37 }, // Middle row
+ { 23, 24, 29, 30, 35, 38 }, // Bottom row
+ { NO_LED, 41, NO_LED, 39, 40, NO_LED }, // Thumb cluster
+}, {
+ /* LED index to physical position. */
+ // Left split.
+ /* index=0 */ { 0, 0 }, { 0, 21 }, { 0, 42 }, // col 1 (left most)
+ /* index=3 */ { 15, 42 }, { 15, 21 }, { 15, 0 }, // col 2
+ /* index=6 */ { 30, 0 }, { 30, 21 }, { 30, 42 },
+ /* index=9 */ { 45, 42 }, { 45, 21 }, { 45, 0 },
+ /* index=12 */ { 60, 0 }, { 60, 21 }, { 60, 42 },
+ /* index=15 */ { 75, 0 }, { 75, 21 }, { 75, 42 },
+ /* index=18 */ { 75, 64 }, { 90, 64 }, { 105, 64 }, // Thumb cluster
+ // Right split.
+ /* index=21 */ { 224, 0 }, { 224, 21 }, { 224, 42 }, // col 12 (right most)
+ /* index=24 */ { 209, 42 }, { 209, 21 }, { 209, 0 }, // col 10
+ /* index=27 */ { 194, 0 }, { 194, 21 }, { 194, 42 },
+ /* index=30 */ { 179, 42 }, { 179, 21 }, { 179, 0 },
+ /* index=33 */ { 164, 0 }, { 164, 21 }, { 164, 42 },
+ /* index=36 */ { 149, 0 }, { 149, 21 }, { 149, 42 },
+ /* index=39 */ { 119, 64 }, { 134, 64 }, { 0, 0 }, // Thumb cluster
+}, {
+ /* LED index to flag. */
+ // Left split.
+ /* index=0 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 1
+ /* index=3 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 2
+ /* index=6 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
+ /* index=9 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
+ /* index=12 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
+ /* index=15 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
+ /* index=18 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // Thumb cluster
+ // Right split.
+ /* index=21 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 10
+ /* index=24 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 9
+ /* index=27 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
+ /* index=30 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
+ /* index=33 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
+ /* index=36 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
+ /* index=39 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // Thumb cluster
+} };
+#endif
+// clang-format on
diff --git a/keyboards/bastardkb/charybdis/3x6/3x6.h b/keyboards/bastardkb/charybdis/3x6/3x6.h
new file mode 100644
index 0000000000..bf5de31036
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/3x6.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include "charybdis.h"
+
+// clang-format off
+#define LAYOUT_charybdis_3x6( \
+ k00, k01, k02, k03, k04, k05, k45, k44, k43, k42, k41, k40, \
+ k10, k11, k12, k13, k14, k15, k55, k54, k53, k52, k51, k50, \
+ k20, k21, k22, k23, k24, k25, k65, k64, k63, k62, k61, k60, \
+ k33, k34, k31, k71, k73 \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05 }, \
+ { k10, k11, k12, k13, k14, k15 }, \
+ { k20, k21, k22, k23, k24, k25 }, \
+ { KC_NO, k31, KC_NO, k33, k34, KC_NO }, \
+ { k40, k41, k42, k43, k44, k45 }, \
+ { k50, k51, k52, k53, k54, k55 }, \
+ { k60, k61, k62, k63, k64, k65 }, \
+ { KC_NO, k71, KC_NO, k73, KC_NO, KC_NO }, \
+}
+
+/**
+ * \brief Compatibility layout with the split_3x5_6 community layout.
+ *
+ * This effectively renders the Charbdis Nano compatible with existing layout
+ * implementations relying on the `split_3x6_3` layout.
+ */
+#define LAYOUT_split_3x6_3( \
+ k00, k01, k02, k03, k04, k05, k45, k44, k43, k42, k41, k40, \
+ k10, k11, k12, k13, k14, k15, k55, k54, k53, k52, k51, k50, \
+ k20, k21, k22, k23, k24, k25, k65, k64, k63, k62, k61, k60, \
+ k33, k34, k31, k71, k73, ___ \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05 }, \
+ { k10, k11, k12, k13, k14, k15 }, \
+ { k20, k21, k22, k23, k24, k25 }, \
+ { KC_NO, k31, KC_NO, k33, k34, KC_NO }, \
+ { k40, k41, k42, k43, k44, k45 }, \
+ { k50, k51, k52, k53, k54, k55 }, \
+ { k60, k61, k62, k63, k64, k65 }, \
+ { KC_NO, k71, KC_NO, k73, KC_NO, KC_NO }, \
+}
+// clang-format on
diff --git a/keyboards/bastardkb/charybdis/3x6/blackpill/config.h b/keyboards/bastardkb/charybdis/3x6/blackpill/config.h
new file mode 100644
index 0000000000..93d897a4fe
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/blackpill/config.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Publicw License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { A2, B8, A8, B9 }
+#define MATRIX_COL_PINS \
+ { B0, B1, B10, B3, B4, B5 }
+
+/* Handedness. */
+#define SPLIT_HAND_PIN A3 // High -> left, Low -> right.
+
+/* RGB settings. */
+#define RGB_DI_PIN A1
+#define WS2812_PWM_DRIVER PWMD2
+#define WS2812_PWM_CHANNEL 2
+#define WS2812_PWM_PAL_MODE 1
+#define WS2812_EXTERNAL_PULLUP
+#define WS2812_DMA_STREAM STM32_DMA1_STREAM1
+#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_TARGET_PERIOD 800000
+
+/* Serial configuration for split keyboard. */
+#define SERIAL_USART_TX_PIN A9
+
+/* CRC. */
+#define CRC8_USE_TABLE
+#define CRC8_OPTIMIZE_SPEED
+
+/* SPI config for EEPROM and pmw3360 sensor. */
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN A5
+#define SPI_SCK_PAL_MODE 5
+#define SPI_MOSI_PIN A7
+#define SPI_MOSI_PAL_MODE 5
+#define SPI_MISO_PIN A6
+#define SPI_MISO_PAL_MODE 5
+
+/* EEPROM config. */
+#define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN A4
+
+/* PMW3360 settings. */
+#define POINTING_DEVICE_CS_PIN B14
+#define PMW33XX_CS_DIVISOR 64
diff --git a/keyboards/bastardkb/charybdis/3x6/blackpill/halconf.h b/keyboards/bastardkb/charybdis/3x6/blackpill/halconf.h
new file mode 100644
index 0000000000..78885b6870
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/blackpill/halconf.h
@@ -0,0 +1,27 @@
+/**
+ * Copyright 2020 Nick Brassel (tzarc)
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#define HAL_USE_PWM TRUE
+#define HAL_USE_SERIAL TRUE
+#define HAL_USE_SPI TRUE
+#define SPI_USE_WAIT TRUE
+#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
+
+#include_next "halconf.h"
diff --git a/keyboards/bastardkb/charybdis/3x6/blackpill/info.json b/keyboards/bastardkb/charybdis/3x6/blackpill/info.json
new file mode 100644
index 0000000000..54eda1eadf
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/blackpill/info.json
@@ -0,0 +1,6 @@
+{
+ "keyboard_name": "Charybdis Mini (3x6) Blackpill",
+ "usb": {
+ "device_version": "1.0.0"
+ }
+}
diff --git a/keyboards/bastardkb/charybdis/3x6/blackpill/mcuconf.h b/keyboards/bastardkb/charybdis/3x6/blackpill/mcuconf.h
new file mode 100644
index 0000000000..7adcb837de
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/blackpill/mcuconf.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2020 Nick Brassel (tzarc)
+ * Copyright 2021 Stefan Kerkmann (@KarlK90)
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include_next "mcuconf.h"
+
+#undef STM32_PWM_USE_TIM2
+#define STM32_PWM_USE_TIM2 TRUE
+
+#undef STM32_PWM_USE_TIM3
+#define STM32_PWM_USE_TIM3 TRUE
+
+#undef STM32_SPI_USE_SPI1
+#define STM32_SPI_USE_SPI1 TRUE
+
+#undef STM32_SPI_SPI1_RX_DMA_STREAM
+#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0)
+#undef STM32_SPI_SPI1_TX_DMA_STREAM
+#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3)
+
+#undef STM32_SERIAL_USE_USART1
+#define STM32_SERIAL_USE_USART1 TRUE
+
+#undef STM32_GPT_USE_TIM4
+#define STM32_GPT_USE_TIM4 TRUE
+
+#undef STM32_ST_USE_TIMER
+#define STM32_ST_USE_TIMER 5
diff --git a/keyboards/bastardkb/charybdis/3x6/blackpill/readme.md b/keyboards/bastardkb/charybdis/3x6/blackpill/readme.md
new file mode 100644
index 0000000000..6a9907c2ae
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/blackpill/readme.md
@@ -0,0 +1,3 @@
+# Charybdis Mini (3x6) BlackPill
+
+An ergonomic keyboard with integrated trackball, with BlackPill (STM32F411) mod.
diff --git a/keyboards/bastardkb/charybdis/3x6/blackpill/rules.mk b/keyboards/bastardkb/charybdis/3x6/blackpill/rules.mk
new file mode 100644
index 0000000000..a29e3e433d
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/blackpill/rules.mk
@@ -0,0 +1,39 @@
+# MCU name
+MCU = STM32F411
+BOARD = BLACKPILL_STM32_F411
+
+# Bootloader selection
+BOOTLOADER = stm32-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported
+RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default
+RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default
+RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
+RGB_MATRIX_DRIVER = WS2812
+
+SPLIT_KEYBOARD = yes
+LAYOUTS = split_3x6_3
+
+POINTING_DEVICE_ENABLE = yes # Enable trackball
+POINTING_DEVICE_DRIVER = pmw3360
+MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint
+KEYBOARD_SHARED_EP = yes
+
+EEPROM_DRIVER = spi
+WS2812_DRIVER = pwm
+SERIAL_DRIVER = usart
+
+DEBOUNCE_TYPE = asym_eager_defer_pk
diff --git a/keyboards/bastardkb/charybdis/3x6/config.h b/keyboards/bastardkb/charybdis/3x6/config.h
new file mode 100644
index 0000000000..40d933f0b8
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/config.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2021 Quentin LEBASTARD
+ * Copyright 2021 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROWS 8 // Rows are doubled-up.
+#define MATRIX_COLS 6
+
+#define DIODE_DIRECTION ROW2COL
+
+/* Set 0 if debouncing isn't needed. */
+#define DEBOUNCE 5
+
+/* Trackball angle adjustment. */
+#define ROTATIONAL_TRANSFORM_ANGLE -25
+
+/* RGB settings. */
+#ifdef RGB_MATRIX_ENABLE
+# define RGB_MATRIX_LED_COUNT 42
+# define RGB_MATRIX_SPLIT \
+ { 21, 21 }
+#endif
diff --git a/keyboards/bastardkb/charybdis/3x6/info.json b/keyboards/bastardkb/charybdis/3x6/info.json
new file mode 100644
index 0000000000..4851da1d53
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/info.json
@@ -0,0 +1,99 @@
+{
+ "url": "https://bastardkb.com",
+ "usb": {
+ "pid": "0x1834"
+ },
+ "layouts": {
+ "LAYOUT_charybdis_3x6": {
+ "layout": [
+ { "label": "L00", "x": 0, "y": 0 },
+ { "label": "L01", "x": 1, "y": 0 },
+ { "label": "L02", "x": 2, "y": 0 },
+ { "label": "L03", "x": 3, "y": 0 },
+ { "label": "L04", "x": 4, "y": 0 },
+ { "label": "L05", "x": 5, "y": 0 },
+ { "label": "R00", "x": 11, "y": 0 },
+ { "label": "R01", "x": 12, "y": 0 },
+ { "label": "R02", "x": 13, "y": 0 },
+ { "label": "R03", "x": 14, "y": 0 },
+ { "label": "R04", "x": 15, "y": 0 },
+ { "label": "R05", "x": 16, "y": 0 },
+ { "label": "L10", "x": 0, "y": 1 },
+ { "label": "L11", "x": 1, "y": 1 },
+ { "label": "L12", "x": 2, "y": 1 },
+ { "label": "L13", "x": 3, "y": 1 },
+ { "label": "L14", "x": 4, "y": 1 },
+ { "label": "L15", "x": 5, "y": 1 },
+ { "label": "R10", "x": 11, "y": 1 },
+ { "label": "R11", "x": 12, "y": 1 },
+ { "label": "R12", "x": 13, "y": 1 },
+ { "label": "R13", "x": 14, "y": 1 },
+ { "label": "R14", "x": 15, "y": 1 },
+ { "label": "R15", "x": 16, "y": 1 },
+ { "label": "L20", "x": 0, "y": 2 },
+ { "label": "L21", "x": 1, "y": 2 },
+ { "label": "L22", "x": 2, "y": 2 },
+ { "label": "L23", "x": 3, "y": 2 },
+ { "label": "L24", "x": 4, "y": 2 },
+ { "label": "L25", "x": 5, "y": 2 },
+ { "label": "R20", "x": 11, "y": 2 },
+ { "label": "R21", "x": 12, "y": 2 },
+ { "label": "R22", "x": 13, "y": 2 },
+ { "label": "R23", "x": 14, "y": 2 },
+ { "label": "R24", "x": 15, "y": 2 },
+ { "label": "R25", "x": 16, "y": 2 },
+ { "label": "L33", "x": 5, "y": 3 },
+ { "label": "L34", "x": 6, "y": 3 },
+ { "label": "L31", "x": 7, "y": 3 },
+ { "label": "R31", "x": 9, "y": 3 },
+ { "label": "R33", "x": 10, "y": 3 }
+ ]
+ },
+ "LAYOUT_split_3x6_3": {
+ "layout": [
+ { "label": "L00", "x": 0, "y": 0 },
+ { "label": "L01", "x": 1, "y": 0 },
+ { "label": "L02", "x": 2, "y": 0 },
+ { "label": "L03", "x": 3, "y": 0 },
+ { "label": "L04", "x": 4, "y": 0 },
+ { "label": "L05", "x": 5, "y": 0 },
+ { "label": "R00", "x": 11, "y": 0 },
+ { "label": "R01", "x": 12, "y": 0 },
+ { "label": "R02", "x": 13, "y": 0 },
+ { "label": "R03", "x": 14, "y": 0 },
+ { "label": "R04", "x": 15, "y": 0 },
+ { "label": "R05", "x": 16, "y": 0 },
+ { "label": "L10", "x": 0, "y": 1 },
+ { "label": "L11", "x": 1, "y": 1 },
+ { "label": "L12", "x": 2, "y": 1 },
+ { "label": "L13", "x": 3, "y": 1 },
+ { "label": "L14", "x": 4, "y": 1 },
+ { "label": "L15", "x": 5, "y": 1 },
+ { "label": "R10", "x": 11, "y": 1 },
+ { "label": "R11", "x": 12, "y": 1 },
+ { "label": "R12", "x": 13, "y": 1 },
+ { "label": "R13", "x": 14, "y": 1 },
+ { "label": "R14", "x": 15, "y": 1 },
+ { "label": "R15", "x": 16, "y": 1 },
+ { "label": "L20", "x": 0, "y": 2 },
+ { "label": "L21", "x": 1, "y": 2 },
+ { "label": "L22", "x": 2, "y": 2 },
+ { "label": "L23", "x": 3, "y": 2 },
+ { "label": "L24", "x": 4, "y": 2 },
+ { "label": "L25", "x": 5, "y": 2 },
+ { "label": "R20", "x": 11, "y": 2 },
+ { "label": "R21", "x": 12, "y": 2 },
+ { "label": "R22", "x": 13, "y": 2 },
+ { "label": "R23", "x": 14, "y": 2 },
+ { "label": "R24", "x": 15, "y": 2 },
+ { "label": "R25", "x": 16, "y": 2 },
+ { "label": "L33", "x": 5, "y": 3 },
+ { "label": "L34", "x": 6, "y": 3 },
+ { "label": "L31", "x": 7, "y": 3 },
+ { "label": "R33", "x": 9, "y": 3 },
+ { "label": "R34", "x": 10, "y": 3 },
+ { "label": "R31", "x": 11, "y": 3 }
+ ]
+ }
+ }
+}
diff --git a/keyboards/bastardkb/charybdis/3x6/keymaps/default/keymap.c b/keyboards/bastardkb/charybdis/3x6/keymaps/default/keymap.c
new file mode 100644
index 0000000000..8632ab7258
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/keymaps/default/keymap.c
@@ -0,0 +1,66 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include QMK_KEYBOARD_H
+
+enum charybdis_keymap_layers {
+ LAYER_BASE = 0,
+ LAYER_LOWER,
+ LAYER_RAISE,
+};
+
+#define LOWER MO(LAYER_LOWER)
+#define RAISE MO(LAYER_RAISE)
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [LAYER_BASE] = LAYOUT_charybdis_3x6(
+ // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮
+ KC_LGUI, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RGUI,
+ // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_RCTL,
+ // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯
+ KC_BSPC, KC_SPC, LOWER, RAISE, KC_ENT
+ // ╰───────────────────────────╯ ╰──────────────────╯
+ ),
+
+ [LAYER_LOWER] = LAYOUT_charybdis_3x6(
+ // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮
+ XXXXXXX, RGB_TOG, KC_MNXT, KC_MPLY, KC_MPRV, XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, XXXXXXX,
+ // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
+ XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PPLS, KC_4, KC_5, KC_6, KC_PMNS, XXXXXXX,
+ // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EE_CLR, QK_BOOT, KC_PAST, KC_1, KC_2, KC_3, KC_PSLS, XXXXXXX,
+ // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯
+ XXXXXXX, XXXXXXX, _______, XXXXXXX, _______
+ // ╰───────────────────────────╯ ╰──────────────────╯
+ ),
+
+ [LAYER_RAISE] = LAYOUT_charybdis_3x6(
+ // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, KC_MUTE, KC_VOLD, XXXXXXX, XXXXXXX,
+ // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
+ XXXXXXX, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_RGUI, XXXXXXX,
+ // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
+ XXXXXXX, KC_HOME, KC_PGUP, KC_PGDN, KC_END, XXXXXXX, QK_BOOT, EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯
+ _______, _______, XXXXXXX, _______, XXXXXXX
+ // ╰───────────────────────────╯ ╰──────────────────╯
+ ),
+};
+// clang-format on
diff --git a/keyboards/bastardkb/charybdis/3x6/keymaps/default/readme.md b/keyboards/bastardkb/charybdis/3x6/keymaps/default/readme.md
new file mode 100644
index 0000000000..8b407f68a2
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/keymaps/default/readme.md
@@ -0,0 +1,7 @@
+# Charybdis Mini (3x6) default keymap
+
+> :bulb: Have a look at the [`via` keymap](../via) for a more feature-rich layout.
+
+The Charydbis Mini (3x6) default keymap is inspired from the original [Dactyl Manuform](../../../../../handwired/dactyl_manuform) default keymap.
+
+This layout supports RGB matrix. However, due to space constraints on the MCU, only a limited number of effect can be enabled at once. Look at the `config.h` file and enable your favorite effect.
diff --git a/keyboards/bastardkb/charybdis/3x6/keymaps/via/config.h b/keyboards/bastardkb/charybdis/3x6/keymaps/via/config.h
new file mode 100644
index 0000000000..7c850d5e0e
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/keymaps/via/config.h
@@ -0,0 +1,34 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+
+#ifdef VIA_ENABLE
+/* VIA configuration. */
+# define DYNAMIC_KEYMAP_LAYER_COUNT 4
+#endif // VIA_ENABLE
+
+/* Disable unused features. */
+#define NO_ACTION_ONESHOT
+
+/* Charybdis-specific features. */
+
+#ifdef POINTING_DEVICE_ENABLE
+// Automatically enable the pointer layer when moving the trackball. See also:
+// - `CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS`
+// - `CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD`
+// #define CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+#endif // POINTING_DEVICE_ENABLE
diff --git a/keyboards/bastardkb/charybdis/3x6/keymaps/via/keymap.c b/keyboards/bastardkb/charybdis/3x6/keymaps/via/keymap.c
new file mode 100644
index 0000000000..7f6eb6a911
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/keymaps/via/keymap.c
@@ -0,0 +1,148 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include QMK_KEYBOARD_H
+
+enum charybdis_keymap_layers {
+ LAYER_BASE = 0,
+ LAYER_LOWER,
+ LAYER_RAISE,
+ LAYER_POINTER,
+};
+
+/** \brief Automatically enable sniping-mode on the pointer layer. */
+#define CHARYBDIS_AUTO_SNIPING_ON_LAYER LAYER_POINTER
+
+#ifdef CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+static uint16_t auto_pointer_layer_timer = 0;
+
+# ifndef CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS
+# define CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS 1000
+# endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS
+
+# ifndef CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD
+# define CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD 8
+# endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD
+#endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+
+#define LOWER MO(LAYER_LOWER)
+#define RAISE MO(LAYER_RAISE)
+#define PT_Z LT(LAYER_POINTER, KC_Z)
+#define PT_SLSH LT(LAYER_POINTER, KC_SLSH)
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [LAYER_BASE] = LAYOUT_charybdis_3x6(
+ // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮
+ KC_LGUI, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RGUI,
+ // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_RCTL,
+ // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯
+ KC_BSPC, KC_SPC, LOWER, RAISE, KC_ENT
+ // ╰───────────────────────────╯ ╰──────────────────╯
+ ),
+
+ [LAYER_LOWER] = LAYOUT_charybdis_3x6(
+ // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮
+ XXXXXXX, RGB_TOG, KC_MNXT, KC_MPLY, KC_MPRV, XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, XXXXXXX,
+ // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
+ XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PPLS, KC_4, KC_5, KC_6, KC_PMNS, XXXXXXX,
+ // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EE_CLR, QK_BOOT, KC_PAST, KC_1, KC_2, KC_3, KC_PSLS, XXXXXXX,
+ // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯
+ XXXXXXX, XXXXXXX, _______, XXXXXXX, _______
+ // ╰───────────────────────────╯ ╰──────────────────╯
+ ),
+
+ [LAYER_RAISE] = LAYOUT_charybdis_3x6(
+ // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, KC_MUTE, KC_VOLD, XXXXXXX, XXXXXXX,
+ // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
+ XXXXXXX, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_RGUI, XXXXXXX,
+ // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
+ XXXXXXX, KC_HOME, KC_PGUP, KC_PGDN, KC_END, XXXXXXX, QK_BOOT, EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯
+ _______, _______, XXXXXXX, _______, XXXXXXX
+ // ╰───────────────────────────╯ ╰──────────────────╯
+ ),
+
+ [LAYER_POINTER] = LAYOUT_charybdis_3x6(
+ // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DPI_MOD, S_D_MOD, S_D_MOD, DPI_MOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
+ XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_RGUI, XXXXXXX,
+ // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
+ XXXXXXX, _______, DRGSCRL, SNIPING, EE_CLR, QK_BOOT, QK_BOOT, EE_CLR, SNIPING, DRGSCRL, _______, XXXXXXX,
+ // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯
+ KC_BTN2, KC_BTN1, KC_BTN3, KC_BTN3, KC_BTN1
+ // ╰───────────────────────────╯ ╰──────────────────╯
+ ),
+};
+// clang-format on
+
+#ifdef POINTING_DEVICE_ENABLE
+# ifdef CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) {
+ if (abs(mouse_report.x) > CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD || abs(mouse_report.y) > CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD) {
+ if (auto_pointer_layer_timer == 0) {
+ layer_on(LAYER_POINTER);
+# ifdef RGB_MATRIX_ENABLE
+ rgb_matrix_mode_noeeprom(RGB_MATRIX_NONE);
+ rgb_matrix_sethsv_noeeprom(HSV_GREEN);
+# endif // RGB_MATRIX_ENABLE
+ }
+ auto_pointer_layer_timer = timer_read();
+ }
+ return mouse_report;
+}
+
+void matrix_scan_user(void) {
+ if (auto_pointer_layer_timer != 0 && TIMER_DIFF_16(timer_read(), auto_pointer_layer_timer) >= CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS) {
+ auto_pointer_layer_timer = 0;
+ layer_off(LAYER_POINTER);
+# ifdef RGB_MATRIX_ENABLE
+ rgb_matrix_mode_noeeprom(RGB_MATRIX_DEFAULT_MODE);
+# endif // RGB_MATRIX_ENABLE
+ }
+}
+# endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+
+# ifdef CHARYBDIS_AUTO_SNIPING_ON_LAYER
+layer_state_t layer_state_set_user(layer_state_t state) {
+ charybdis_set_pointer_sniping_enabled(layer_state_cmp(state, CHARYBDIS_AUTO_SNIPING_ON_LAYER));
+ return state;
+}
+# endif // CHARYBDIS_AUTO_SNIPING_ON_LAYER
+#endif // POINTING_DEVICE_ENABLE
+
+#ifdef RGB_MATRIX_ENABLE
+// Forward-declare this helper function since it is defined in rgb_matrix.c.
+void rgb_matrix_update_pwm_buffers(void);
+#endif
+
+void shutdown_user(void) {
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable_noeeprom();
+ rgblight_mode_noeeprom(1);
+ rgblight_setrgb(RGB_RED);
+#endif // RGBLIGHT_ENABLE
+#ifdef RGB_MATRIX_ENABLE
+ rgb_matrix_set_color_all(RGB_RED);
+ rgb_matrix_update_pwm_buffers();
+#endif // RGB_MATRIX_ENABLE
+}
diff --git a/keyboards/bastardkb/charybdis/3x6/keymaps/via/readme.md b/keyboards/bastardkb/charybdis/3x6/keymaps/via/readme.md
new file mode 100644
index 0000000000..fba00cd996
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/keymaps/via/readme.md
@@ -0,0 +1,57 @@
+# Charybdis Mini (3x6) `via` keymap
+
+The Charydbis Mini (3x6) `via` keymap is inspired from the original [Dactyl Manuform](../../../../../handwired/dactyl_manuform) default keymap, with some features and changes specific to the Charybdis.
+
+This layout supports RGB matrix. However, due to space constraints on the MCU, only a limited number of effect can be enabled at once. Look at the `config.h` file and enable your favorite effect.
+
+## Customizing the keymap
+
+### Dynamic DPI scaling
+
+Use the following keycodes to change the default DPI:
+
+- `POINTER_DEFAULT_DPI_FORWARD`: increases the DPI; decreases when shifted;
+- `POINTER_DEFAULT_DPI_REVERSE`: decreases the DPI; increases when shifted.
+
+There's a maximum of 16 possible values for the sniping mode DPI. See the [Charybdis documentation](../../README.md) for more information.
+
+Use the following keycodes to change the sniping mode DPI:
+
+- `POINTER_SNIPING_DPI_FORWARD`: increases the DPI; decreases when shifted;
+- `POINTER_SNIPING_DPI_REVERSE`: decreases the DPI; increases when shifted.
+
+There's a maximum of 4 possible values for the sniping mode DPI. See the [Charybdis documentation](../../README.md) for more information.
+
+### Drag-scroll
+
+Use the `DRAGSCROLL_MODE` keycode to enable drag-scroll on hold. Use the `DRAGSCROLL_TOGGLE` keycode to enable/disable drag-scroll on key press.
+
+### Sniping
+
+Use the `SNIPING_MODE` keycode to enable sniping mode on hold. Use the `SNIPING_TOGGLE` keycode to enable/disable sniping mode on key press.
+
+Change the value of `CHARYBDIS_AUTO_SNIPING_ON_LAYER` to automatically enable sniping mode on layer change. By default, sniping mode is enabled on the pointer layer:
+
+```c
+#define CHARYBDIS_AUTO_SNIPING_ON_LAYER LAYER_POINTER
+```
+
+### Auto pointer layer
+
+The pointer layer can be automatically enabled when moving the trackball. To enable or disable this behavior, add or remove the following define:
+
+```c
+#define CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+```
+
+By default, the layer is turned off 1 second after the last registered trackball movement:
+
+```c
+#define CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS 1000
+```
+
+The trigger sensibility can also be tuned. The lower the value, the more sensible the trigger:
+
+```c
+#define CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD 8
+```
diff --git a/keyboards/bastardkb/charybdis/3x6/keymaps/via/rules.mk b/keyboards/bastardkb/charybdis/3x6/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/bastardkb/charybdis/3x6/readme.md b/keyboards/bastardkb/charybdis/3x6/readme.md
new file mode 100644
index 0000000000..c6385ed8f1
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/readme.md
@@ -0,0 +1,15 @@
+# Charybdis Nano (3x6)
+
+An ergonomic keyboard with integrated trackball.
+
+The Charybdis is available in 4x6, 3x6 and 3x5 form factor at [bastardkb.com](https://bastardkb.com).
+
+## Keymaps
+
+### [`default`](keymaps/default)
+
+A simple QWERTY layout with 4 layers.
+
+### [`via`](keymaps/via)
+
+A [Miryoku-inspired](https://github.com/manna-harbour/miryoku), feature-rich, keymap with VIA support.
diff --git a/keyboards/bastardkb/charybdis/3x6/v1/elitec/config.h b/keyboards/bastardkb/charybdis/3x6/v1/elitec/config.h
new file mode 100644
index 0000000000..fa1a1c01f7
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v1/elitec/config.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { B7, C6, D4, B5 }
+#define MATRIX_COL_PINS \
+ { D5, C7, F0, D7, E6, B4 }
+
+#define MATRIX_ROW_PINS_RIGHT \
+ { F0, C6, D4, B5 }
+#define MATRIX_COL_PINS_RIGHT \
+ { F1, C7, B7, D7, E6, B4 }
+
+/* Handedness. */
+#define MASTER_RIGHT
+
+/* serial.c configuration (for split keyboard). */
+#define SOFT_SERIAL_PIN D2
+
+/* RGB settings. */
+#define RGB_DI_PIN D3
+
+/* PMW3360 settings. */
+#define POINTING_DEVICE_CS_PIN B0
diff --git a/keyboards/bastardkb/charybdis/3x6/v1/elitec/info.json b/keyboards/bastardkb/charybdis/3x6/v1/elitec/info.json
new file mode 100644
index 0000000000..7edaf111a9
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v1/elitec/info.json
@@ -0,0 +1,6 @@
+{
+ "keyboard_name": "Charybdis Mini (3x6) Elite-C",
+ "usb": {
+ "device_version": "1.0.0"
+ }
+}
diff --git a/keyboards/bastardkb/charybdis/3x6/v1/elitec/rules.mk b/keyboards/bastardkb/charybdis/3x6/v1/elitec/rules.mk
new file mode 100644
index 0000000000..54406bcc1d
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v1/elitec/rules.mk
@@ -0,0 +1,35 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported
+RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default
+RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default
+RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
+RGB_MATRIX_DRIVER = WS2812
+
+SPLIT_KEYBOARD = yes
+LAYOUTS = split_3x6_3
+
+POINTING_DEVICE_ENABLE = yes # Enable trackball
+POINTING_DEVICE_DRIVER = pmw3360
+MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint
+
+# Enable link-time optimization by default. The Charybdis packs a lot of
+# features (RGB, Via, trackball) in a small atmega32u4 package.
+LTO_ENABLE = yes
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/elitec/config.h b/keyboards/bastardkb/charybdis/3x6/v2/elitec/config.h
new file mode 100644
index 0000000000..e9d45e6796
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v2/elitec/config.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { F7, C6, D4, B5 }
+#define MATRIX_COL_PINS \
+ { F6, F5, B6, D7, E6, B4 }
+
+/* Handedness. */
+#define MASTER_RIGHT
+
+/* serial.c configuration (for split keyboard). */
+#define SOFT_SERIAL_PIN D2
+
+/* RGB settings. */
+#define RGB_DI_PIN D3
+
+/* PMW3360 settings. */
+#define POINTING_DEVICE_CS_PIN F0
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/elitec/info.json b/keyboards/bastardkb/charybdis/3x6/v2/elitec/info.json
new file mode 100644
index 0000000000..02fe2e9ef3
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v2/elitec/info.json
@@ -0,0 +1,6 @@
+{
+ "keyboard_name": "Charybdis Mini (3x6) Elite-C",
+ "usb": {
+ "device_version": "2.0.0"
+ }
+}
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/elitec/rules.mk b/keyboards/bastardkb/charybdis/3x6/v2/elitec/rules.mk
new file mode 100644
index 0000000000..54406bcc1d
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v2/elitec/rules.mk
@@ -0,0 +1,35 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported
+RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default
+RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default
+RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
+RGB_MATRIX_DRIVER = WS2812
+
+SPLIT_KEYBOARD = yes
+LAYOUTS = split_3x6_3
+
+POINTING_DEVICE_ENABLE = yes # Enable trackball
+POINTING_DEVICE_DRIVER = pmw3360
+MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint
+
+# Enable link-time optimization by default. The Charybdis packs a lot of
+# features (RGB, Via, trackball) in a small atmega32u4 package.
+LTO_ENABLE = yes
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky/config.h b/keyboards/bastardkb/charybdis/3x6/v2/splinky/config.h
new file mode 100644
index 0000000000..8e4a2de892
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v2/splinky/config.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { GP26, GP5, GP4, GP9 }
+
+/* serial.c configuration (for split keyboard). */
+#define SOFT_SERIAL_PIN GP1
+
+/* RGB settings. */
+#define RGB_DI_PIN GP0
+
+/* SPI & PMW3360 settings. */
+#define SPI_DRIVER SPID0
+#define SPI_MISO_PIN GP20
+
+/* Reset. */
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky/info.json b/keyboards/bastardkb/charybdis/3x6/v2/splinky/info.json
new file mode 100644
index 0000000000..64c663c7c9
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v2/splinky/info.json
@@ -0,0 +1,6 @@
+{
+ "keyboard_name": "Charybdis Mini (3x6) Splinky",
+ "usb": {
+ "device_version": "2.0.0"
+ }
+}
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky/mcuconf.h b/keyboards/bastardkb/charybdis/3x6/v2/splinky/mcuconf.h
new file mode 100644
index 0000000000..0fdd67c3a2
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v2/splinky/mcuconf.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include_next "mcuconf.h"
+
+#undef RP_SPI_USE_SPI0
+#define RP_SPI_USE_SPI0 TRUE
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky/readme.md b/keyboards/bastardkb/charybdis/3x6/v2/splinky/readme.md
new file mode 100644
index 0000000000..22df77bbaa
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v2/splinky/readme.md
@@ -0,0 +1,6 @@
+# Splinky controller
+
+The splinky is a Pro-Micro/Elite-C replacement with USB-C and RP2040.
+
+See https://github.com/plut0nium/0xB2/#releases to figure out the right version
+for you (v2 and v3) supported.
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky/rules.mk b/keyboards/bastardkb/charybdis/3x6/v2/splinky/rules.mk
new file mode 100644
index 0000000000..4dfff6dfd6
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v2/splinky/rules.mk
@@ -0,0 +1,39 @@
+# MCU name
+MCU = RP2040
+
+# Bootloader selection
+BOOTLOADER = rp2040
+
+# RP2040-specific options
+ALLOW_WARNINGS = yes
+PICO_INTRINSICS_ENABLED = no # ATM Unsupported by ChibiOS.
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported
+RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default
+RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default
+RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
+RGB_MATRIX_DRIVER = WS2812
+
+SPLIT_KEYBOARD = yes
+LAYOUTS = split_3x6_3
+
+POINTING_DEVICE_ENABLE = yes # Enable trackball
+POINTING_DEVICE_DRIVER = pmw3360
+
+SERIAL_DRIVER = vendor
+WS2812_DRIVER = vendor
+
+DEFAULT_FOLDER = bastardkb/charybdis/3x6/v2/splinky/v3
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky/v2/config.h b/keyboards/bastardkb/charybdis/3x6/v2/splinky/v2/config.h
new file mode 100644
index 0000000000..f3d3e982e3
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v2/splinky/v2/config.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_COL_PINS \
+ { GP27, GP28, GP15, GP6, GP7, GP8 }
+
+/* SPI & PMW3360 settings. */
+#define SPI_SCK_PIN GP18
+#define SPI_MOSI_PIN GP19
+#define POINTING_DEVICE_CS_PIN GP14
+
+/* Handedness. */
+#define MASTER_RIGHT
+
+// To use the handedness pin, resistors need to be installed on the adapter PCB.
+// If so, uncomment the following code, and undefine MASTER_RIGHT above.
+// #define SPLIT_HAND_PIN GP13
+// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left.
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky/v2/rules.mk b/keyboards/bastardkb/charybdis/3x6/v2/splinky/v2/rules.mk
new file mode 100644
index 0000000000..c9c50319db
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v2/splinky/v2/rules.mk
@@ -0,0 +1,2 @@
+# Intentionally blank so that QMK detects this folder as a valid keyboard
+# parameter.
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky/v3/config.h b/keyboards/bastardkb/charybdis/3x6/v2/splinky/v3/config.h
new file mode 100644
index 0000000000..5f5476b1f7
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v2/splinky/v3/config.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_COL_PINS \
+ { GP27, GP28, GP21, GP6, GP7, GP8 }
+
+/* SPI & PMW3360 settings. */
+#define SPI_SCK_PIN GP22
+#define SPI_MOSI_PIN GP23
+#define POINTING_DEVICE_CS_PIN GP16
+
+/* Handedness. */
+#define MASTER_RIGHT
+
+// To use the handedness pin, resistors need to be installed on the adapter PCB.
+// If so, uncomment the following code, and undefine MASTER_RIGHT above.
+// #define SPLIT_HAND_PIN GP15
+// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left.
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky/v3/rules.mk b/keyboards/bastardkb/charybdis/3x6/v2/splinky/v3/rules.mk
new file mode 100644
index 0000000000..c9c50319db
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v2/splinky/v3/rules.mk
@@ -0,0 +1,2 @@
+# Intentionally blank so that QMK detects this folder as a valid keyboard
+# parameter.
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/config.h b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/config.h
new file mode 100644
index 0000000000..81c7e737a7
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/config.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { F7, C6, D4, B5 }
+#define MATRIX_COL_PINS \
+ { F6, F5, B6, D7, E6, B4 }
+
+/* Handedness. */
+#define MASTER_RIGHT
+
+// To use the handedness pin, resistors need to be installed on the adapter PCB.
+// If so, uncomment the following code, and undefine MASTER_RIGHT above.
+// #define A0 PAL_LINE(GPIOA, 0)
+// #define SPLIT_HAND_PIN A0
+// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left.
+
+/* serial.c configuration (for split keyboard). */
+#define SOFT_SERIAL_PIN D2
+
+/* RGB settings. */
+#define RGB_DI_PIN D3
+#define WS2812_PWM_DRIVER PWMD2
+#define WS2812_PWM_CHANNEL 4
+#define WS2812_PWM_PAL_MODE 1
+#define WS2812_DMA_STREAM STM32_DMA1_STREAM7
+#define WS2812_DMA_CHANNEL 3
+
+/* CRC. */
+#define CRC8_USE_TABLE
+#define CRC8_OPTIMIZE_SPEED
+
+/* SPI config for pmw3360 sensor. */
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN B1
+#define SPI_SCK_PAL_MODE 5
+#define SPI_MOSI_PIN B2
+#define SPI_MOSI_PAL_MODE 5
+#define SPI_MISO_PIN B3
+#define SPI_MISO_PAL_MODE 5
+
+/* PMW3360 settings. */
+#define A1 PAL_LINE(GPIOA, 1)
+#define POINTING_DEVICE_CS_PIN A1
+#define PMW3360_CS_MODE 3
+#define PMW3360_CS_DIVISOR 64
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/halconf.h b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/halconf.h
new file mode 100644
index 0000000000..8141e0cf4b
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/halconf.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#define HAL_USE_PWM TRUE
+#define HAL_USE_SERIAL TRUE
+#define HAL_USE_SPI TRUE
+
+#include_next
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/info.json b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/info.json
new file mode 100644
index 0000000000..8aa7bf24c9
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/info.json
@@ -0,0 +1,6 @@
+{
+ "keyboard_name": "Charybdis Mini (3x6) STeMCell",
+ "usb": {
+ "device_version": "2.0.0"
+ }
+}
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/mcuconf.h b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/mcuconf.h
new file mode 100644
index 0000000000..1a3c4433db
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/mcuconf.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include_next
+
+#undef STM32_SPI_USE_SPI1
+#define STM32_SPI_USE_SPI1 TRUE
+
+#undef STM32_SERIAL_USE_USART1
+#define STM32_SERIAL_USE_USART1 FALSE
+
+#undef STM32_PWM_USE_TIM2
+#define STM32_PWM_USE_TIM2 TRUE
+
+#undef STM32_ST_USE_TIMER
+#define STM32_ST_USE_TIMER 5
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/rules.mk b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/rules.mk
new file mode 100644
index 0000000000..94cd8a0deb
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/rules.mk
@@ -0,0 +1,38 @@
+# MCU name
+MCU = STM32F411
+
+# Bootloader selection
+BOOTLOADER = stm32-dfu
+CONVERT_TO = stemcell
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported
+RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default
+RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default
+RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
+RGB_MATRIX_DRIVER = WS2812
+
+SPLIT_KEYBOARD = yes
+LAYOUTS = split_3x6_3
+
+POINTING_DEVICE_ENABLE = yes # Enable trackball
+POINTING_DEVICE_DRIVER = pmw3360
+MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint
+KEYBOARD_SHARED_EP = yes
+
+SERIAL_DRIVER = usart
+WS2812_DRIVER = pwm
+
+DEBOUNCE_TYPE = asym_eager_defer_pk
diff --git a/keyboards/bastardkb/charybdis/4x6/4x6.c b/keyboards/bastardkb/charybdis/4x6/4x6.c
index 6cd8fffee7..85e8b5fdd1 100644
--- a/keyboards/bastardkb/charybdis/4x6/4x6.c
+++ b/keyboards/bastardkb/charybdis/4x6/4x6.c
@@ -36,6 +36,10 @@
* 26 27 28 53 54 XX
* 25 24 55 XX
* ╰────────────╯ ╰────────────╯
+ *
+ * Note: the LED config simulates 58 LEDs instead of the actual 56 to prevent
+ * confusion when testing LEDs during assembly when handedness is not set
+ * correctly. Those fake LEDs are bound to the physical bottom-left corner.
*/
led_config_t g_led_config = { {
/* Key Matrix to LED index. */
@@ -70,6 +74,7 @@ led_config_t g_led_config = { {
/* index=45 */ { 160, 0 }, { 160, 12 }, { 160, 24 }, { 160, 36 },
/* index=49 */ { 144, 0 }, { 144, 12 }, { 144, 24 }, { 144, 36 },
/* index=53 */ { 112, 52 }, { 128, 64 }, { 112, 64 },
+ /* index=56 */ { 0, 0 }, { 0, 0 },
}, {
/* LED index to flag. */
// Left split.
@@ -89,6 +94,7 @@ led_config_t g_led_config = { {
/* index=45 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
/* index=49 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
/* index=53 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // Thumb cluster
+ /* index=55 */ LED_FLAG_MODIFIER, LED_FLAG_MODIFIER, // Thumb cluster fakes
} };
#endif
// clang-format on
diff --git a/keyboards/bastardkb/charybdis/4x6/blackpill/config.h b/keyboards/bastardkb/charybdis/4x6/blackpill/config.h
new file mode 100644
index 0000000000..e37df487fd
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/blackpill/config.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2020 Christopher Courtney (@drashna)
+ * Copyright 2021 Stefan Kerkmann (@KarlK90)
+ * Copyright 2021 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Publicw License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { B15, A2, B8, A8, B9 }
+#define MATRIX_COL_PINS \
+ { B0, B1, B10, B3, B4, B5 }
+
+/* Handedness. */
+#define SPLIT_HAND_PIN A3 // High -> left, Low -> right.
+
+/* RGB settings. */
+#define RGB_DI_PIN A1
+#define WS2812_PWM_DRIVER PWMD2
+#define WS2812_PWM_CHANNEL 2
+#define WS2812_PWM_PAL_MODE 1
+#define WS2812_EXTERNAL_PULLUP
+#define WS2812_DMA_STREAM STM32_DMA1_STREAM1
+#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_TARGET_PERIOD 800000
+
+/* Serial configuration for split keyboard. */
+#define SERIAL_USART_TX_PIN A9
+
+/* CRC. */
+#define CRC8_USE_TABLE
+#define CRC8_OPTIMIZE_SPEED
+
+/* SPI config for EEPROM and pmw3360 sensor. */
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN A5
+#define SPI_SCK_PAL_MODE 5
+#define SPI_MOSI_PIN A7
+#define SPI_MOSI_PAL_MODE 5
+#define SPI_MISO_PIN A6
+#define SPI_MISO_PAL_MODE 5
+
+/* EEPROM config. */
+#define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN A4
+
+/* PMW3360 settings. */
+#define POINTING_DEVICE_CS_PIN B14
+#define PMW33XX_CS_DIVISOR 64
diff --git a/keyboards/bastardkb/charybdis/4x6/blackpill/halconf.h b/keyboards/bastardkb/charybdis/4x6/blackpill/halconf.h
new file mode 100644
index 0000000000..0e5caa9f9a
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/blackpill/halconf.h
@@ -0,0 +1,27 @@
+/**
+ * Copyright 2020 Nick Brassel (tzarc)
+ * Copyright 2021 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#define HAL_USE_PWM TRUE
+#define HAL_USE_SERIAL TRUE
+#define HAL_USE_SPI TRUE
+#define SPI_USE_WAIT TRUE
+#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
+
+#include_next "halconf.h"
diff --git a/keyboards/bastardkb/charybdis/4x6/blackpill/info.json b/keyboards/bastardkb/charybdis/4x6/blackpill/info.json
new file mode 100644
index 0000000000..a42035157b
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/blackpill/info.json
@@ -0,0 +1,6 @@
+{
+ "keyboard_name": "Charybdis (4x6) Blackpill",
+ "usb": {
+ "device_version": "1.0.0"
+ }
+}
diff --git a/keyboards/bastardkb/charybdis/4x6/blackpill/mcuconf.h b/keyboards/bastardkb/charybdis/4x6/blackpill/mcuconf.h
new file mode 100644
index 0000000000..3b9c9056f8
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/blackpill/mcuconf.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2020 Nick Brassel (tzarc)
+ * Copyright 2021 Stefan Kerkmann (@KarlK90)
+ * Copyright 2021 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include_next "mcuconf.h"
+
+#undef STM32_PWM_USE_TIM2
+#define STM32_PWM_USE_TIM2 TRUE
+
+#undef STM32_PWM_USE_TIM3
+#define STM32_PWM_USE_TIM3 TRUE
+
+#undef STM32_SPI_USE_SPI1
+#define STM32_SPI_USE_SPI1 TRUE
+
+#undef STM32_SPI_SPI1_RX_DMA_STREAM
+#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0)
+#undef STM32_SPI_SPI1_TX_DMA_STREAM
+#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3)
+
+#undef STM32_SERIAL_USE_USART1
+#define STM32_SERIAL_USE_USART1 TRUE
+
+#undef STM32_GPT_USE_TIM4
+#define STM32_GPT_USE_TIM4 TRUE
+
+#undef STM32_ST_USE_TIMER
+#define STM32_ST_USE_TIMER 5
diff --git a/keyboards/bastardkb/charybdis/4x6/blackpill/readme.md b/keyboards/bastardkb/charybdis/4x6/blackpill/readme.md
new file mode 100644
index 0000000000..bbae15bb85
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/blackpill/readme.md
@@ -0,0 +1,3 @@
+# Charybdis (4x6) BlackPill
+
+An ergonomic keyboard with integrated trackball, with BlackPill (STM32F411) mod.
diff --git a/keyboards/bastardkb/charybdis/4x6/blackpill/rules.mk b/keyboards/bastardkb/charybdis/4x6/blackpill/rules.mk
new file mode 100644
index 0000000000..9015f3a8b2
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/blackpill/rules.mk
@@ -0,0 +1,38 @@
+# MCU name
+MCU = STM32F411
+BOARD = BLACKPILL_STM32_F411
+
+# Bootloader selection
+BOOTLOADER = stm32-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported.
+RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default.
+RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default.
+RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
+RGB_MATRIX_DRIVER = WS2812
+
+SPLIT_KEYBOARD = yes
+
+POINTING_DEVICE_ENABLE = yes # Enable trackball
+POINTING_DEVICE_DRIVER = pmw3360
+MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint
+KEYBOARD_SHARED_EP = yes
+
+EEPROM_DRIVER = spi
+WS2812_DRIVER = pwm
+SERIAL_DRIVER = usart
+
+DEBOUNCE_TYPE = asym_eager_defer_pk
diff --git a/keyboards/bastardkb/charybdis/4x6/config.h b/keyboards/bastardkb/charybdis/4x6/config.h
index 5d9f446624..68d4438315 100644
--- a/keyboards/bastardkb/charybdis/4x6/config.h
+++ b/keyboards/bastardkb/charybdis/4x6/config.h
@@ -19,56 +19,20 @@
#pragma once
/* Key matrix configuration. */
-
-// Rows are doubled-up.
-#define MATRIX_ROWS 10
+#define MATRIX_ROWS 10 // Rows are doubled-up.
#define MATRIX_COLS 6
-// Wiring configuration for each half.
-#define MATRIX_ROW_PINS \
- { F1, B7, C6, D4, B5 }
-#define MATRIX_COL_PINS \
- { D5, C7, F0, D7, E6, B4 }
-
-#define MATRIX_ROW_PINS_RIGHT \
- { D5, F0, C6, D4, B5 }
-#define MATRIX_COL_PINS_RIGHT \
- { F1, C7, B7, D7, E6, B4 }
-
#define DIODE_DIRECTION ROW2COL
-#define ROTATIONAL_TRANSFORM_ANGLE -25
-
-/* Handedness. */
-#define MASTER_RIGHT
-
-/* Bootmagic Lite configuration. */
-#define BOOTMAGIC_LITE_ROW 0
-#define BOOTMAGIC_LITE_COLUMN 0
-#define BOOTMAGIC_LITE_ROW_RIGHT 5
-#define BOOTMAGIC_LITE_COLUMN_RIGHT 0
-
-/* serial.c configuration (for split keyboard) */
-#define SOFT_SERIAL_PIN D2
-
-/* Set 0 if debouncing isn't needed */
+/* Set 0 if debouncing isn't needed. */
#define DEBOUNCE 5
-/* PMW3360 settings. */
-#define PMW3360_CS_PIN B0
+/* Trackball angle adjustment. */
+#define ROTATIONAL_TRANSFORM_ANGLE -25
-#define RGB_DI_PIN D3
-#define RGBLED_NUM 56
-#define RGBLED_SPLIT \
- { 29, 27 }
-
-/* RGB matrix support. */
+/* RGB settings. */
#ifdef RGB_MATRIX_ENABLE
-# define SPLIT_TRANSPORT_MIRROR
-# define DRIVER_LED_TOTAL RGBLED_NUM
-# define RGB_MATRIX_SPLIT RGBLED_SPLIT
-# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 50
-# define RGB_MATRIX_STARTUP_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS
-# define RGB_DISABLE_WHEN_USB_SUSPENDED
-# define RGB_MATRIX_KEYPRESSES
+# define RGB_MATRIX_LED_COUNT 58
+# define RGB_MATRIX_SPLIT \
+ { 29, 29 }
#endif
diff --git a/keyboards/bastardkb/charybdis/4x6/info.json b/keyboards/bastardkb/charybdis/4x6/info.json
index 3e588db9be..0b929a2188 100644
--- a/keyboards/bastardkb/charybdis/4x6/info.json
+++ b/keyboards/bastardkb/charybdis/4x6/info.json
@@ -1,12 +1,9 @@
{
- "keyboard_name": "Charybdis",
"manufacturer": "Bastard Keyboards",
- "url": "https://www.bastardkb.com",
- "maintainer": "Quentin Lebastard",
+ "url": "https://bastardkb.com/charybdis",
"usb": {
- "vid": "0xA8F8",
"pid": "0x1833",
- "device_version": "0.0.1"
+ "vid": "0xA8F8"
},
"layouts": {
"LAYOUT_charybdis_4x6": {
diff --git a/keyboards/bastardkb/charybdis/4x6/keymaps/default/config.h b/keyboards/bastardkb/charybdis/4x6/keymaps/default/config.h
deleted file mode 100644
index 383b3f9dc3..0000000000
--- a/keyboards/bastardkb/charybdis/4x6/keymaps/default/config.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * Copyright 2021 Charly Delay (@0xcharly)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-
-/* RGB Matrix. */
-
-#ifdef RGB_MATRIX_ENABLE
-// Limit maximum brightness to keep power consumption reasonable, and avoid
-// disconnects.
-# undef RGB_MATRIX_MAXIMUM_BRIGHTNESS
-# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 64
-
-// Rainbow swirl as startup mode.
-# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
-# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT
-
-// Slow swirl at startup.
-# define RGB_MATRIX_STARTUP_SPD 32
-
-// Startup values.
-# define RGB_MATRIX_STARTUP_HUE 0
-# define RGB_MATRIX_STARTUP_SAT 255
-# define RGB_MATRIX_STARTUP_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS
-# define RGB_MATRIX_STARTUP_HSV RGB_MATRIX_STARTUP_HUE, RGB_MATRIX_STARTUP_SAT, RGB_MATRIX_STARTUP_VAL
-#endif // RGB_MATRIX_ENABLE
diff --git a/keyboards/bastardkb/charybdis/4x6/keymaps/default/keymap.c b/keyboards/bastardkb/charybdis/4x6/keymaps/default/keymap.c
index 1d3142faac..98edad47d9 100644
--- a/keyboards/bastardkb/charybdis/4x6/keymaps/default/keymap.c
+++ b/keyboards/bastardkb/charybdis/4x6/keymaps/default/keymap.c
@@ -50,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
RGB_TOG, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PPLS, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_PEQL,
// ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
- RGB_RMOD, XXXXXXX, XXXXXXX, XXXXXXX, EEP_RST, QK_BOOT, KC_PAST, KC_P1, KC_P2, KC_P3, KC_PSLS, KC_PDOT,
+ RGB_RMOD, XXXXXXX, XXXXXXX, XXXXXXX, EE_CLR, QK_BOOT, KC_PAST, KC_P1, KC_P2, KC_P3, KC_PSLS, KC_PDOT,
// ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯
XXXXXXX, XXXXXXX, _______, XXXXXXX, _______,
XXXXXXX, XXXXXXX, KC_P0
@@ -65,7 +65,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
KC_MPLY, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_RGUI, KC_MUTE,
// ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
- KC_MPRV, KC_HOME, KC_PGUP, KC_PGDN, KC_END, XXXXXXX, QK_BOOT, EEP_RST, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLD,
+ KC_MPRV, KC_HOME, KC_PGUP, KC_PGDN, KC_END, XXXXXXX, QK_BOOT, EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLD,
// ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯
_______, _______, XXXXXXX, _______, XXXXXXX,
_______, _______, XXXXXXX
diff --git a/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/config.h b/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/config.h
index 2b6e11ec61..cb11ea2748 100644
--- a/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/config.h
+++ b/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/config.h
@@ -16,93 +16,49 @@
*/
#pragma once
-#undef MATRIX_COL_PINS
-#define MATRIX_COL_PINS \
- { B0, B1, B12, B3, B4, B5 }
-#undef MATRIX_COL_PINS_RIGHT
-#define MATRIX_COL_PINS_RIGHT \
- { B0, B1, B12, B3, B4, B5 }
+#if defined(KEYBOARD_bastardkb_charybdis_4x6_blackpill)
+# undef MATRIX_COL_PINS
+# define MATRIX_COL_PINS \
+ { B0, B1, B12, B3, B4, B5 }
-#undef MATRIX_ROW_PINS
-#define MATRIX_ROW_PINS \
- { B15, A2, B8, A8, B9 }
-#undef MATRIX_ROW_PINS_RIGHT
-#define MATRIX_ROW_PINS_RIGHT \
- { B15, A2, B8, A8, B9 }
+# define USB_VBUS_PIN B10
+# define DEBUG_LED_PIN C13
-#define UNUSED_PINS { B6, C14, C15 }
+# define AUDIO_PIN B7
+# define AUDIO_PWM_DRIVER PWMD4
+# define AUDIO_PWM_CHANNEL 2
+# define AUDIO_PWM_PAL_MODE 2
+# define AUDIO_INIT_DELAY
+# define AUDIO_ENABLE_TONE_MULTIPLEXING
+# define AUDIO_TONE_MULTIPLEXING_RATE_DEFAULT 10
-#define DIODE_DIRECTION ROW2COL
-#define SPLIT_HAND_PIN A3
-#undef MASTER_RIGHT
-// #define USB_VBUS_PIN B10
+# define SERIAL_USART_SPEED (1 * 1024 * 1024)
-#undef RGB_DI_PIN
-#define RGB_DI_PIN A1
-#define WS2812_EXTERNAL_PULLUP
-#define WS2812_PWM_DRIVER PWMD2
-#define WS2812_PWM_CHANNEL 2
-#define WS2812_PWM_PAL_MODE 1
-#define WS2812_EXTERNAL_PULLUP
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM1
-#define WS2812_DMA_CHANNEL 3
-#define WS2812_PWM_TARGET_PERIOD 800000
+# undef POINTING_DEVICE_CS_PIN
+# define POINTING_DEVICE_CS_PIN A15 // b14
+# define PMW33XX_LIFTOFF_DISTANCE 0b1111
+#endif
-#define DEBUG_LED_PIN C13
-
-#define AUDIO_PIN B7
-#define AUDIO_PWM_DRIVER PWMD4
-#define AUDIO_PWM_CHANNEL 2
-#define AUDIO_PWM_PAL_MODE 2
-#define AUDIO_STATE_TIMER GPTD3
-#define AUDIO_INIT_DELAY
-
-#undef SOFT_SERIAL_PIN
-// #define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode.
-#define SERIAL_USART_TX_PIN A9
-// #define SERIAL_USART_RX_PIN A3
-// #define SERIAL_USART_DRIVER SD2
-// #define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
-// #define SERIAL_USART_RX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
-// #define SERIAL_USART_TIMEOUT 100 // USART driver timeout. default 100
-// // #define SERIAL_USART_PIN_SWAP // swap RX and TX pins on master
-// // To use the highest possible baudrate (3.75Mbit/s) uncomment the following
-// // line, this can result in dropped communications so lower the speed if there
-// // are many timeouts.
-// // #define SERIAL_USART_SPEED (STM32_PCLK2 >> 4)
-#define SERIAL_USART_SPEED 921600
-
-#define CRC8_USE_TABLE
-#define CRC8_OPTIMIZE_SPEED
-
-/* spi config for eeprom and pmw3360 sensor */
-#define SPI_DRIVER SPID1
-#define SPI_SCK_PIN A5
-#define SPI_SCK_PAL_MODE 5
-#define SPI_MOSI_PIN A7
-#define SPI_MOSI_PAL_MODE 5
-#define SPI_MISO_PIN A6
-#define SPI_MISO_PAL_MODE 5
-
-#define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN A4
-#define EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR 64
-
-#undef PMW3360_CS_PIN
-#define PMW3360_CS_PIN A15 // b14
-#define PMW3360_CS_MODE 3
-#define PMW3360_CS_DIVISOR 64
-#define PMW3360_LIFTOFF_DISTANCE 0b1111
#undef ROTATIONAL_TRANSFORM_ANGLE
-#define ROTATIONAL_TRANSFORM_ANGLE -65
-
-#define CHARYBDIS_MINIMUM_DEFAULT_DPI 1200
-#define CHARYBDIS_DEFAULT_DPI_CONFIG_STEP 400
-#define CHARYBDIS_MINIMUM_SNIPING_DPI 200
-#define CHARYBDIS_SNIPING_DPI_CONFIG_STEP 100
+#define ROTATIONAL_TRANSFORM_ANGLE 25
+#define POINTING_DEVICE_ROTATION_270
/* RGB Matrix. */
-
#undef RGB_MATRIX_MAXIMUM_BRIGHTNESS
#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150
+#define CHARYBDIS_MINIMUM_DEFAULT_DPI 1200
+#define CHARYBDIS_DEFAULT_DPI_CONFIG_STEP 400
+#define CHARYBDIS_MINIMUM_SNIPING_DPI 200
+#define CHARYBDIS_SNIPING_DPI_CONFIG_STEP 100
+
#define CHARYBDIS_CONFIG_SYNC
+
+#define BOOTMAGIC_LITE_ROW 0
+#define BOOTMAGIC_LITE_COLUMN 0
+#define BOOTMAGIC_LITE_ROW_RIGHT 5
+#define BOOTMAGIC_LITE_COLUMN_RIGHT 0
+#define BOOTMAGIC_LITE_EEPROM_ROW 1
+#define BOOTMAGIC_LITE_EEPROM_COLUMN 0
+#define BOOTMAGIC_LITE_EEPROM_ROW_RIGHT 1
+#define BOOTMAGIC_LITE_EEPROM_COLUMN_RIGHT 0
diff --git a/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/halconf.h b/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/halconf.h
deleted file mode 100644
index 3d9f187317..0000000000
--- a/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/halconf.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Copyright 2020 Nick Brassel (tzarc)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-#pragma once
-
-#define HAL_USE_PWM TRUE
-#define HAL_USE_PAL TRUE
-#define HAL_USE_GPT TRUE
-#define HAL_USE_SERIAL TRUE
-// #define HAL_USE_I2C TRUE
-#define HAL_USE_SPI TRUE
-#define SPI_USE_WAIT TRUE
-#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
-
-#include_next
diff --git a/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/keymap.c b/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/keymap.c
index 1268d1a8ba..50a05e1b35 100644
--- a/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/keymap.c
+++ b/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/keymap.c
@@ -26,8 +26,8 @@
KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, UC_CLUE, \
SH_TT, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, SH_TT, \
LALT_T(KC_TAB), K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, RALT_T(K1B), \
- OS_LSFT,CTL_T(K21),ALT_T(K22),GUI_T(K23),K24,K25, K26,K27,RGUI_T(K28),RALT_T(K29),RCTL_T(K2A), OS_RSFT, \
- SFT_T(KC_GRV), UC_IRNY, OS_LGUI, TT(_MOUSE), KC_ENT, \
+ OS_LSFT,CTL_T(K21), K22, K23, K24, K25, K26,K27,RGUI_T(K28),RALT_T(K29),RCTL_T(K2A), OS_RSFT, \
+ SFT_T(KC_GRV), OS_LALT, OS_LGUI, TT(_MOUSE), KC_ENT, \
KC_SPC, BK_LWER, DL_RAIS \
)
@@ -83,12 +83,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
SFT_T(KC_SPACE), ALT_T(KC_Q), _______
),
[_MOUSE] = LAYOUT_charybdis_4x6(
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- _______, _______, _______, _______, _______, _______, KC_WH_U, DPI_RMOD,DPI_MOD, S_D_RMOD,S_D_MOD, _______,
+ _______, _______, _______, _______, _______, _______, _______, DPI_RMOD,DPI_MOD, S_D_RMOD,S_D_MOD, _______,
+ _______, _______, _______, _______, _______, _______, KC_WH_U, _______, _______, _______, _______, DRGSCRL,
_______, _______, _______, _______, _______, _______, KC_WH_D, KC_BTN1, KC_BTN3, KC_BTN2, KC_BTN6, SNIPING,
- _______, _______, _______, _______, _______, _______, KC_BTN7, KC_BTN4, KC_BTN5, KC_BTN8, DRGSCRL, _______,
- _______, SNIPING, SNIPING, _______, _______,
- _______, _______, _______
+ _______, _______, _______, _______, _______, _______, KC_BTN7, KC_BTN4, KC_BTN5, KC_BTN8, _______, _______,
+ _______, _______, _______, _______, _______,
+ _______, _______, _______
),
[_LOWER] = LAYOUT_charybdis_4x6_wrapper(
@@ -110,10 +110,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
[_ADJUST] = LAYOUT_charybdis_4x6_wrapper(
- QK_MAKE, KC_WIDE,KC_AUSSIE,KC_SCRIPT,KC_ZALGO,KC_SUPER, KC_NOMODE,KC_BLOCKS,KC_REGIONAL,TG_GAME,TG_DBLO, QK_BOOT,
+ QK_MAKE, KC_WIDE,KC_AUSSIE,KC_SCRIPT,KC_ZALGO,KC_SUPER, KC_NOMODE,KC_COMIC,KC_REGIONAL,TG_GAME,TG_DBLO, QK_BOOT,
VRSN, _________________ADJUST_L1_________________, _________________ADJUST_R1_________________, EE_CLR,
KEYLOCK, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, TG_MODS,
- UC_MOD, _________________ADJUST_L3_________________, _________________ADJUST_R3_________________, KC_MPLY,
+ UC_NEXT, _________________ADJUST_L3_________________, _________________ADJUST_R3_________________, KC_MPLY,
QK_RBT, AUTO_CTN, _______, _______, KC_NUKE,
_______, _______, _______
)
@@ -121,8 +121,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format on
-void matrix_init_keymap(void) {
- setPinInputHigh(A0);
+void keyboard_post_init_keymap(void) {
#ifdef RGB_MATRIX_ENABLE
g_led_config.flags[53] = g_led_config.flags[54] = g_led_config.flags[55] =
g_led_config.flags[0] = g_led_config.flags[1] = g_led_config.flags[2] = g_led_config.flags[3] =
@@ -131,11 +130,17 @@ void matrix_init_keymap(void) {
#endif
}
-void matrix_scan_keymap(void) {
+#if defined(KEYBOARD_bastardkb_charybdis_4x6_blackpill)
+void keyboard_pre_init_keymap(void) {
+ setPinInputHigh(A0);
+}
+
+void housekeeping_task_keymap(void) {
if (!readPin(A0)) {
reset_keyboard();
}
}
+#endif
#ifdef USB_VBUS_PIN
bool usb_vbus_state(void) {
@@ -145,12 +150,13 @@ bool usb_vbus_state(void) {
}
#endif
+#if defined(KEYBOARD_bastardkb_charybdis_4x6_blackpill)
void matrix_output_unselect_delay(uint8_t line, bool key_pressed) {
for (int32_t i = 0; i < 40; i++) {
__asm__ volatile("nop" ::: "memory");
}
}
-
+#endif
#ifdef SWAP_HANDS_ENABLE
const keypos_t PROGMEM hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
diff --git a/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/mcuconf.h b/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/mcuconf.h
index 5712bb4574..3a23d5f370 100644
--- a/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/mcuconf.h
+++ b/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/mcuconf.h
@@ -18,26 +18,10 @@
#include_next "mcuconf.h"
-#undef STM32_PWM_USE_ADVANCED
-#define STM32_PWM_USE_ADVANCED TRUE
+#if defined(KEYBOARD_bastardkb_charybdis_4x6_blackpill)
+# undef STM32_PWM_USE_ADVANCED
+# define STM32_PWM_USE_ADVANCED TRUE
-#undef STM32_PWM_USE_TIM1
-#define STM32_PWM_USE_TIM1 TRUE
-
-#undef STM32_PWM_USE_TIM2
-#define STM32_PWM_USE_TIM2 TRUE
-
-#undef STM32_PWM_USE_TIM4
-#define STM32_PWM_USE_TIM4 TRUE
-
-#undef STM32_SPI_USE_SPI1
-#define STM32_SPI_USE_SPI1 TRUE
-
-#undef STM32_SERIAL_USE_USART1
-#define STM32_SERIAL_USE_USART1 TRUE
-
-#undef STM32_GPT_USE_TIM3
-#define STM32_GPT_USE_TIM3 TRUE
-
-#undef STM32_ST_USE_TIMER
-#define STM32_ST_USE_TIMER 5
+# undef STM32_PWM_USE_TIM4
+# define STM32_PWM_USE_TIM4 TRUE
+#endif
diff --git a/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/rules.mk b/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/rules.mk
index d9c1a5a9ba..12e9cecda0 100644
--- a/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/rules.mk
+++ b/keyboards/bastardkb/charybdis/4x6/keymaps/drashna/rules.mk
@@ -1,33 +1,56 @@
-# MCU name
-MCU = STM32F411
-BOARD = BLACKPILL_STM32_F411
+CUSTOM_UNICODE_ENABLE = no
+CUSTOM_POINTING_DEVICE = no
+CUSTOM_SPLIT_TRANSPORT_SYNC = no
-# Bootloader selection
-BOOTLOADER := tinyuf2
+ifeq ($(strip $(KEYBOARD)), bastardkb/charybdis/4x6/blackpill)
+ # MCU name
+ # Bootloader selection
+ BOOTLOADER := tinyuf2
-BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = yes # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = yes # Enable N-Key Rollover
-RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
-AUDIO_ENABLE = yes # Audio output
-AUDIO_SUPPORTED = yes # is set to no in kb, needs to be forcibly enabled
+ AUDIO_ENABLE = yes # Audio output
+ AUDIO_SUPPORTED = yes # is set to no in kb, needs to be forcibly enabled
+ AUDIO_DRIVER = pwm_hardware
-KEYBOARD_SHARED_EP = yes
-MOUSE_SHARED_EP = yes
+ BACKLIGHT_DRIVER = pwm
-EEPROM_DRIVER = spi
-WS2812_DRIVER = pwm
-SERIAL_DRIVER = usart
-AUDIO_DRIVER = pwm_hardware
-BACKLIGHT_DRIVER = pwm
+ OVERLOAD_FEATURES = yes
+endif
-AUTOCORRECTION_ENABLE = yes
-CAPS_WORD_ENABLE = yes
-SWAP_HANDS_ENABLE = yes
-TAP_DANCE_ENABLE = yes
-DEBOUNCE_TYPE = asym_eager_defer_pk
-WPM_ENABLE = yes
-LTO_ENABLE = no
+ifeq ($(strip $(KEYBOARD)), bastardkb/charybdis/4x6/v2/stemcell)
+ OVERLOAD_FEATURES = yes
+endif
+ifeq ($(strip $(KEYBOARD)), bastardkb/charybdis/4x6/v2/splinky)
+ OVERLOAD_FEATURES = yes
+endif
+ifeq ($(strip $(MCU)), atmega32u4)
+ LTO_ENABLE = yes
+ BOOTLOADER = qmk-hid
+ BOOTLOADER_SIZE = 512
+endif
+
+ifeq ($(strip $(OVERLOAD_FEATURES)), yes)
+ BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+ MOUSEKEY_ENABLE = yes # Mouse keys
+ EXTRAKEY_ENABLE = yes # Audio control and System control
+ CONSOLE_ENABLE = yes # Console for debug
+ COMMAND_ENABLE = no # Commands for debug and configuration
+ NKRO_ENABLE = yes # Enable N-Key Rollover
+ RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+
+ KEYBOARD_SHARED_EP = yes
+ MOUSE_SHARED_EP = yes
+
+ AUTOCORRECT_ENABLE = yes
+ CAPS_WORD_ENABLE = yes
+ SWAP_HANDS_ENABLE = yes
+ TAP_DANCE_ENABLE = yes
+ DEBOUNCE_TYPE = asym_eager_defer_pk
+ WPM_ENABLE = yes
+ LTO_ENABLE = no
+ # OPT = 3
+
+ CUSTOM_UNICODE_ENABLE = yes
+ CUSTOM_POINTING_DEVICE = yes
+ CUSTOM_SPLIT_TRANSPORT_SYNC = yes
+
+endif
diff --git a/keyboards/bastardkb/charybdis/4x6/keymaps/via/config.h b/keyboards/bastardkb/charybdis/4x6/keymaps/via/config.h
index 75eb2240f3..cb9013dbd1 100644
--- a/keyboards/bastardkb/charybdis/4x6/keymaps/via/config.h
+++ b/keyboards/bastardkb/charybdis/4x6/keymaps/via/config.h
@@ -19,54 +19,16 @@
#ifdef VIA_ENABLE
/* VIA configuration. */
# define DYNAMIC_KEYMAP_LAYER_COUNT 4
-#endif // VIA_ENABLE
+#endif // VIA_ENABLE
/* Disable unused features. */
#define NO_ACTION_ONESHOT
-#ifndef TAPPING_TERM
-/**
- * \brief Configure the global tapping term (default: 200ms).
- *
- * If you have a lot of accidental mod activations, crank up the tapping term.
- *
- * See docs.qmk.fm/using-qmk/software-features/tap_hold#tapping-term
- */
-# define TAPPING_TERM 200
-#endif // TAPPING_TERM
-
/* Charybdis-specific features. */
#ifdef POINTING_DEVICE_ENABLE
-// Enable pointer acceleration, which increases the speed by ~2x for large
-// displacement, while maintaining 1x speed for slow movements.
-// - `CHARYBDIS_POINTER_ACCELERATION_FACTOR`
-# define CHARYBDIS_POINTER_ACCELERATION_ENABLE
-
// Automatically enable the pointer layer when moving the trackball. See also:
// - `CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS`
// - `CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD`
// #define CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
-#endif // POINTING_DEVICE_ENABLE
-
-/* RGB Matrix. */
-
-#ifdef RGB_MATRIX_ENABLE
-// Limit maximum brightness to keep power consumption reasonable, and avoid
-// disconnects.
-# undef RGB_MATRIX_MAXIMUM_BRIGHTNESS
-# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 64
-
-// Rainbow swirl as startup mode.
-# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
-# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT
-
-// Slow swirl at startup.
-# define RGB_MATRIX_STARTUP_SPD 32
-
-// Startup values.
-# define RGB_MATRIX_STARTUP_HUE 0
-# define RGB_MATRIX_STARTUP_SAT 255
-# define RGB_MATRIX_STARTUP_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS
-# define RGB_MATRIX_STARTUP_HSV RGB_MATRIX_STARTUP_HUE, RGB_MATRIX_STARTUP_SAT, RGB_MATRIX_STARTUP_VAL
-#endif // RGB_MATRIX_ENABLE
+#endif // POINTING_DEVICE_ENABLE
diff --git a/keyboards/bastardkb/charybdis/4x6/keymaps/via/keymap.c b/keyboards/bastardkb/charybdis/4x6/keymaps/via/keymap.c
index cf24fea3c0..1050974212 100644
--- a/keyboards/bastardkb/charybdis/4x6/keymaps/via/keymap.c
+++ b/keyboards/bastardkb/charybdis/4x6/keymaps/via/keymap.c
@@ -18,7 +18,7 @@
#ifdef CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
# include "timer.h"
-#endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+#endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
enum charybdis_keymap_layers {
LAYER_BASE = 0,
@@ -35,18 +35,25 @@ static uint16_t auto_pointer_layer_timer = 0;
# ifndef CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS
# define CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS 1000
-# endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS
+# endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS
# ifndef CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD
# define CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD 8
-# endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD
-#endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+# endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD
+#endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
#define LOWER MO(LAYER_LOWER)
#define RAISE MO(LAYER_RAISE)
#define PT_Z LT(LAYER_POINTER, KC_Z)
#define PT_SLSH LT(LAYER_POINTER, KC_SLSH)
+#ifndef POINTING_DEVICE_ENABLE
+# define DRGSCRL KC_NO
+# define DPI_MOD KC_NO
+# define S_D_MOD KC_NO
+# define SNIPING KC_NO
+#endif // !POINTING_DEVICE_ENABLE
+
// clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[LAYER_BASE] = LAYOUT_charybdis_4x6(
@@ -102,7 +109,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_RGUI, XXXXXXX,
// ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤
- XXXXXXX, _______, DRGSCRL, SNIPING, EEP_RST, QK_BOOT, QK_BOOT, EEP_RST, SNIPING, DRGSCRL, _______, XXXXXXX,
+ XXXXXXX, _______, DRGSCRL, SNIPING, EE_CLR, QK_BOOT, QK_BOOT, EE_CLR, SNIPING, DRGSCRL, _______, XXXXXXX,
// ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯
KC_BTN2, KC_BTN1, KC_BTN3, KC_BTN3, KC_BTN1,
XXXXXXX, KC_BTN2, KC_BTN2
@@ -120,33 +127,31 @@ report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) {
# ifdef RGB_MATRIX_ENABLE
rgb_matrix_mode_noeeprom(RGB_MATRIX_NONE);
rgb_matrix_sethsv_noeeprom(HSV_GREEN);
-# endif // RGB_MATRIX_ENABLE
+# endif // RGB_MATRIX_ENABLE
}
auto_pointer_layer_timer = timer_read();
}
return mouse_report;
}
-void matrix_scan_kb(void) {
+void matrix_scan_user(void) {
if (auto_pointer_layer_timer != 0 && TIMER_DIFF_16(timer_read(), auto_pointer_layer_timer) >= CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS) {
auto_pointer_layer_timer = 0;
layer_off(LAYER_POINTER);
# ifdef RGB_MATRIX_ENABLE
- rgb_matrix_mode_noeeprom(RGB_MATRIX_STARTUP_MODE);
-# endif // RGB_MATRIX_ENABLE
+ rgb_matrix_mode_noeeprom(RGB_MATRIX_DEFAULT_MODE);
+# endif // RGB_MATRIX_ENABLE
}
- matrix_scan_user();
}
-# endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+# endif // CHARYBDIS_AUTO_POINTER_LAYER_TRIGGER_ENABLE
# ifdef CHARYBDIS_AUTO_SNIPING_ON_LAYER
-layer_state_t layer_state_set_kb(layer_state_t state) {
- state = layer_state_set_user(state);
+layer_state_t layer_state_set_user(layer_state_t state) {
charybdis_set_pointer_sniping_enabled(layer_state_cmp(state, CHARYBDIS_AUTO_SNIPING_ON_LAYER));
return state;
}
-# endif // CHARYBDIS_AUTO_SNIPING_ON_LAYER
-#endif // POINTING_DEVICE_ENABLE
+# endif // CHARYBDIS_AUTO_SNIPING_ON_LAYER
+#endif // POINTING_DEVICE_ENABLE
#ifdef RGB_MATRIX_ENABLE
// Forward-declare this helper function since it is defined in rgb_matrix.c.
@@ -157,10 +162,10 @@ void shutdown_user(void) {
#ifdef RGBLIGHT_ENABLE
rgblight_enable_noeeprom();
rgblight_mode_noeeprom(1);
- rgblight_setrgb_red();
-#endif // RGBLIGHT_ENABLE
+ rgblight_setrgb(RGB_RED);
+#endif // RGBLIGHT_ENABLE
#ifdef RGB_MATRIX_ENABLE
rgb_matrix_set_color_all(RGB_RED);
rgb_matrix_update_pwm_buffers();
-#endif // RGB_MATRIX_ENABLE
+#endif // RGB_MATRIX_ENABLE
}
diff --git a/keyboards/bastardkb/charybdis/4x6/rules.mk b/keyboards/bastardkb/charybdis/4x6/rules.mk
deleted file mode 100644
index e137f5d4cc..0000000000
--- a/keyboards/bastardkb/charybdis/4x6/rules.mk
+++ /dev/null
@@ -1,37 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = atmel-dfu
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = no # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
-AUDIO_ENABLE = no # Audio output
-
-AUDIO_SUPPORTED = no # Audio is not supported.
-RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default.
-RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default.
-RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
-RGB_MATRIX_DRIVER = WS2812
-
-# Enable link-time optimization by default. The Charybdis packs a lot of
-# features (RGB, Via, trackball) in a small atmega32u4 package.
-LTO_ENABLE = yes
-
-# Charybdis is a split 4x6 keyboard with a maximum of 5 thumb keys (3 on the
-# trackball side).
-SPLIT_KEYBOARD = yes
-
-POINTING_DEVICE_ENABLE = yes # Enable trackball
-POINTING_DEVICE_DRIVER = pmw3360
-# https://qmk.fm/changes/2018-11-16-use-a-single-endpoint-for-hid-reports
-MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint
diff --git a/keyboards/bastardkb/charybdis/4x6/v1/elitec/config.h b/keyboards/bastardkb/charybdis/4x6/v1/elitec/config.h
new file mode 100644
index 0000000000..710c4c3587
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v1/elitec/config.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2020 Christopher Courtney (@drashna)
+ * Copyright 2021 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { F1, B7, C6, D4, B5 }
+#define MATRIX_COL_PINS \
+ { D5, C7, F0, D7, E6, B4 }
+
+#define MATRIX_ROW_PINS_RIGHT \
+ { D5, F0, C6, D4, B5 }
+#define MATRIX_COL_PINS_RIGHT \
+ { F1, C7, B7, D7, E6, B4 }
+
+/* Handedness. */
+#define MASTER_RIGHT
+
+/* serial.c configuration (for split keyboard). */
+#define SOFT_SERIAL_PIN D2
+
+/* RGB settings. */
+#define RGB_DI_PIN D3
+
+/* PMW3360 settings. */
+#define POINTING_DEVICE_CS_PIN B0
diff --git a/keyboards/bastardkb/charybdis/4x6/v1/elitec/info.json b/keyboards/bastardkb/charybdis/4x6/v1/elitec/info.json
new file mode 100644
index 0000000000..e3924b49b2
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v1/elitec/info.json
@@ -0,0 +1,6 @@
+{
+ "keyboard_name": "Charybdis (4x6) Elite-C",
+ "usb": {
+ "device_version": "1.0.0"
+ }
+}
diff --git a/keyboards/bastardkb/charybdis/4x6/v1/elitec/rules.mk b/keyboards/bastardkb/charybdis/4x6/v1/elitec/rules.mk
new file mode 100644
index 0000000000..fa5fe80405
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v1/elitec/rules.mk
@@ -0,0 +1,36 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported.
+RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default.
+RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default.
+RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
+RGB_MATRIX_DRIVER = WS2812
+
+# Charybdis is a split 4x6 keyboard with a maximum of 5 thumb keys (3 on the
+# trackball side).
+SPLIT_KEYBOARD = yes
+
+POINTING_DEVICE_ENABLE = yes # Enable trackball
+POINTING_DEVICE_DRIVER = pmw3360
+MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint
+
+# Enable link-time optimization by default. The Charybdis packs a lot of
+# features (RGB, Via, trackball) in a small atmega32u4 package.
+LTO_ENABLE = yes
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/elitec/config.h b/keyboards/bastardkb/charybdis/4x6/v2/elitec/config.h
new file mode 100644
index 0000000000..692a28b7be
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v2/elitec/config.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { F4, F7, C6, D4, B5 }
+#define MATRIX_COL_PINS \
+ { F6, F5, B6, D7, E6, B4 }
+
+/* Handedness. */
+#define MASTER_RIGHT
+
+/* serial.c configuration (for split keyboard). */
+#define SOFT_SERIAL_PIN D2
+
+/* RGB settings. */
+#define RGB_DI_PIN D3
+
+/* PMW3360 settings. */
+#define POINTING_DEVICE_CS_PIN F0
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/elitec/info.json b/keyboards/bastardkb/charybdis/4x6/v2/elitec/info.json
new file mode 100644
index 0000000000..3acba65a6b
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v2/elitec/info.json
@@ -0,0 +1,6 @@
+{
+ "keyboard_name": "Charybdis (4x6) Elite-C",
+ "usb": {
+ "device_version": "2.0.0"
+ }
+}
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/elitec/rules.mk b/keyboards/bastardkb/charybdis/4x6/v2/elitec/rules.mk
new file mode 100644
index 0000000000..fa5fe80405
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v2/elitec/rules.mk
@@ -0,0 +1,36 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported.
+RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default.
+RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default.
+RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
+RGB_MATRIX_DRIVER = WS2812
+
+# Charybdis is a split 4x6 keyboard with a maximum of 5 thumb keys (3 on the
+# trackball side).
+SPLIT_KEYBOARD = yes
+
+POINTING_DEVICE_ENABLE = yes # Enable trackball
+POINTING_DEVICE_DRIVER = pmw3360
+MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint
+
+# Enable link-time optimization by default. The Charybdis packs a lot of
+# features (RGB, Via, trackball) in a small atmega32u4 package.
+LTO_ENABLE = yes
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky/config.h b/keyboards/bastardkb/charybdis/4x6/v2/splinky/config.h
new file mode 100644
index 0000000000..7d4ed86e84
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v2/splinky/config.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { GP29, GP26, GP5, GP4, GP9 }
+
+/* serial.c configuration (for split keyboard). */
+#define SOFT_SERIAL_PIN GP1
+
+/* RGB settings. */
+#define RGB_DI_PIN GP0
+
+/* SPI & PMW3360 settings. */
+#define SPI_DRIVER SPID0
+#define SPI_MISO_PIN GP20
+
+/* Reset. */
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky/info.json b/keyboards/bastardkb/charybdis/4x6/v2/splinky/info.json
new file mode 100644
index 0000000000..928a850860
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v2/splinky/info.json
@@ -0,0 +1,6 @@
+{
+ "keyboard_name": "Charybdis (4x6) Splinky",
+ "usb": {
+ "device_version": "2.0.0"
+ }
+}
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky/mcuconf.h b/keyboards/bastardkb/charybdis/4x6/v2/splinky/mcuconf.h
new file mode 100644
index 0000000000..0fdd67c3a2
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v2/splinky/mcuconf.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include_next "mcuconf.h"
+
+#undef RP_SPI_USE_SPI0
+#define RP_SPI_USE_SPI0 TRUE
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky/readme.md b/keyboards/bastardkb/charybdis/4x6/v2/splinky/readme.md
new file mode 100644
index 0000000000..22df77bbaa
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v2/splinky/readme.md
@@ -0,0 +1,6 @@
+# Splinky controller
+
+The splinky is a Pro-Micro/Elite-C replacement with USB-C and RP2040.
+
+See https://github.com/plut0nium/0xB2/#releases to figure out the right version
+for you (v2 and v3) supported.
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky/rules.mk b/keyboards/bastardkb/charybdis/4x6/v2/splinky/rules.mk
new file mode 100644
index 0000000000..34ef782d2f
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v2/splinky/rules.mk
@@ -0,0 +1,38 @@
+# MCU name
+MCU = RP2040
+
+# Bootloader selection
+BOOTLOADER = rp2040
+
+# RP2040-specific options
+ALLOW_WARNINGS = yes
+PICO_INTRINSICS_ENABLED = no # ATM Unsupported by ChibiOS.
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported
+RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default
+RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default
+RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
+RGB_MATRIX_DRIVER = WS2812
+
+SPLIT_KEYBOARD = yes
+
+POINTING_DEVICE_ENABLE = yes # Enable trackball
+POINTING_DEVICE_DRIVER = pmw3360
+
+SERIAL_DRIVER = vendor
+WS2812_DRIVER = vendor
+
+DEFAULT_FOLDER = bastardkb/charybdis/4x6/v2/splinky/v3
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky/v2/config.h b/keyboards/bastardkb/charybdis/4x6/v2/splinky/v2/config.h
new file mode 100644
index 0000000000..f3d3e982e3
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v2/splinky/v2/config.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_COL_PINS \
+ { GP27, GP28, GP15, GP6, GP7, GP8 }
+
+/* SPI & PMW3360 settings. */
+#define SPI_SCK_PIN GP18
+#define SPI_MOSI_PIN GP19
+#define POINTING_DEVICE_CS_PIN GP14
+
+/* Handedness. */
+#define MASTER_RIGHT
+
+// To use the handedness pin, resistors need to be installed on the adapter PCB.
+// If so, uncomment the following code, and undefine MASTER_RIGHT above.
+// #define SPLIT_HAND_PIN GP13
+// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left.
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky/v2/rules.mk b/keyboards/bastardkb/charybdis/4x6/v2/splinky/v2/rules.mk
new file mode 100644
index 0000000000..c9c50319db
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v2/splinky/v2/rules.mk
@@ -0,0 +1,2 @@
+# Intentionally blank so that QMK detects this folder as a valid keyboard
+# parameter.
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky/v3/config.h b/keyboards/bastardkb/charybdis/4x6/v2/splinky/v3/config.h
new file mode 100644
index 0000000000..5f5476b1f7
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v2/splinky/v3/config.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_COL_PINS \
+ { GP27, GP28, GP21, GP6, GP7, GP8 }
+
+/* SPI & PMW3360 settings. */
+#define SPI_SCK_PIN GP22
+#define SPI_MOSI_PIN GP23
+#define POINTING_DEVICE_CS_PIN GP16
+
+/* Handedness. */
+#define MASTER_RIGHT
+
+// To use the handedness pin, resistors need to be installed on the adapter PCB.
+// If so, uncomment the following code, and undefine MASTER_RIGHT above.
+// #define SPLIT_HAND_PIN GP15
+// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left.
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky/v3/rules.mk b/keyboards/bastardkb/charybdis/4x6/v2/splinky/v3/rules.mk
new file mode 100644
index 0000000000..c9c50319db
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v2/splinky/v3/rules.mk
@@ -0,0 +1,2 @@
+# Intentionally blank so that QMK detects this folder as a valid keyboard
+# parameter.
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/config.h b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/config.h
new file mode 100644
index 0000000000..b1b432c330
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/config.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { F4, F7, C6, D4, B5 }
+#define MATRIX_COL_PINS \
+ { F6, F5, B6, D7, E6, B4 }
+
+/* Handedness. */
+#define MASTER_RIGHT
+
+// To use the handedness pin, resistors need to be installed on the adapter PCB.
+// If so, uncomment the following code, and undefine MASTER_RIGHT above.
+// #define A0 PAL_LINE(GPIOA, 0)
+// #define SPLIT_HAND_PIN A0
+// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left.
+
+/* serial.c configuration (for split keyboard). */
+#define SOFT_SERIAL_PIN D2
+
+/* RGB settings. */
+#define RGB_DI_PIN D3
+#define WS2812_PWM_DRIVER PWMD2
+#define WS2812_PWM_CHANNEL 4
+#define WS2812_PWM_PAL_MODE 1
+#define WS2812_DMA_STREAM STM32_DMA1_STREAM7
+#define WS2812_DMA_CHANNEL 3
+
+/* CRC. */
+#define CRC8_USE_TABLE
+#define CRC8_OPTIMIZE_SPEED
+
+/* SPI config for pmw3360 sensor. */
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN B1
+#define SPI_SCK_PAL_MODE 5
+#define SPI_MOSI_PIN B2
+#define SPI_MOSI_PAL_MODE 5
+#define SPI_MISO_PIN B3
+#define SPI_MISO_PAL_MODE 5
+
+/* PMW3360 settings. */
+#define A1 PAL_LINE(GPIOA, 1)
+#define POINTING_DEVICE_CS_PIN A1
+#define PMW3360_CS_MODE 3
+#define PMW3360_CS_DIVISOR 64
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/halconf.h b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/halconf.h
new file mode 100644
index 0000000000..0397de50b7
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/halconf.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2021 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#define HAL_USE_PWM TRUE
+#define HAL_USE_SERIAL TRUE
+#define HAL_USE_SPI TRUE
+
+#include_next
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/info.json b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/info.json
new file mode 100644
index 0000000000..932bf09a32
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/info.json
@@ -0,0 +1,6 @@
+{
+ "keyboard_name": "Charybdis (4x6) STeMCell",
+ "usb": {
+ "device_version": "2.0.0"
+ }
+}
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/mcuconf.h b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/mcuconf.h
new file mode 100644
index 0000000000..17a46d8f95
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/mcuconf.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2021 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include_next
+
+#undef STM32_SPI_USE_SPI1
+#define STM32_SPI_USE_SPI1 TRUE
+
+#undef STM32_SERIAL_USE_USART1
+#define STM32_SERIAL_USE_USART1 FALSE
+
+#undef STM32_PWM_USE_TIM2
+#define STM32_PWM_USE_TIM2 TRUE
+
+#undef STM32_ST_USE_TIMER
+#define STM32_ST_USE_TIMER 5
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/rules.mk b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/rules.mk
new file mode 100644
index 0000000000..0847e9ce1f
--- /dev/null
+++ b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/rules.mk
@@ -0,0 +1,37 @@
+# MCU name
+MCU = STM32F411
+
+# Bootloader selection
+BOOTLOADER = stm32-dfu
+CONVERT_TO = stemcell
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported
+RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default
+RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default
+RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
+RGB_MATRIX_DRIVER = WS2812
+
+SPLIT_KEYBOARD = yes
+
+POINTING_DEVICE_ENABLE = yes # Enable trackball
+POINTING_DEVICE_DRIVER = pmw3360
+MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint
+KEYBOARD_SHARED_EP = yes
+
+SERIAL_DRIVER = usart
+WS2812_DRIVER = pwm
+
+DEBOUNCE_TYPE = asym_eager_defer_pk
diff --git a/keyboards/bastardkb/charybdis/charybdis.c b/keyboards/bastardkb/charybdis/charybdis.c
index f94682ba41..2000641f9a 100644
--- a/keyboards/bastardkb/charybdis/charybdis.c
+++ b/keyboards/bastardkb/charybdis/charybdis.c
@@ -18,46 +18,44 @@
*/
#include "charybdis.h"
+#include "transactions.h"
+#include
#ifdef CONSOLE_ENABLE
# include "print.h"
-#endif // CONSOLE_ENABLE
+#endif // CONSOLE_ENABLE
#ifdef POINTING_DEVICE_ENABLE
# ifndef CHARYBDIS_MINIMUM_DEFAULT_DPI
# define CHARYBDIS_MINIMUM_DEFAULT_DPI 400
-# endif // CHARYBDIS_MINIMUM_DEFAULT_DPI
+# endif // CHARYBDIS_MINIMUM_DEFAULT_DPI
# ifndef CHARYBDIS_DEFAULT_DPI_CONFIG_STEP
# define CHARYBDIS_DEFAULT_DPI_CONFIG_STEP 200
-# endif // CHARYBDIS_DEFAULT_DPI_CONFIG_STEP
+# endif // CHARYBDIS_DEFAULT_DPI_CONFIG_STEP
# ifndef CHARYBDIS_MINIMUM_SNIPING_DPI
# define CHARYBDIS_MINIMUM_SNIPING_DPI 200
-# endif // CHARYBDIS_MINIMUM_SNIPER_MODE_DPI
+# endif // CHARYBDIS_MINIMUM_SNIPER_MODE_DPI
# ifndef CHARYBDIS_SNIPING_DPI_CONFIG_STEP
# define CHARYBDIS_SNIPING_DPI_CONFIG_STEP 100
-# endif // CHARYBDIS_SNIPING_DPI_CONFIG_STEP
+# endif // CHARYBDIS_SNIPING_DPI_CONFIG_STEP
// Fixed DPI for drag-scroll.
# ifndef CHARYBDIS_DRAGSCROLL_DPI
# define CHARYBDIS_DRAGSCROLL_DPI 100
-# endif // CHARYBDIS_DRAGSCROLL_DPI
+# endif // CHARYBDIS_DRAGSCROLL_DPI
# ifndef CHARYBDIS_DRAGSCROLL_BUFFER_SIZE
# define CHARYBDIS_DRAGSCROLL_BUFFER_SIZE 6
-# endif // !CHARYBDIS_DRAGSCROLL_BUFFER_SIZE
-
-# ifndef CHARYBDIS_POINTER_ACCELERATION_FACTOR
-# define CHARYBDIS_POINTER_ACCELERATION_FACTOR 24
-# endif // !CHARYBDIS_POINTER_ACCELERATION_FACTOR
+# endif // !CHARYBDIS_DRAGSCROLL_BUFFER_SIZE
typedef union {
uint8_t raw;
struct {
- uint8_t pointer_default_dpi : 4; // 16 steps available.
- uint8_t pointer_sniping_dpi : 2; // 4 steps available.
+ uint8_t pointer_default_dpi : 4; // 16 steps available.
+ uint8_t pointer_sniping_dpi : 2; // 4 steps available.
bool is_dragscroll_enabled : 1;
bool is_sniping_enabled : 1;
} __attribute__((packed));
@@ -87,13 +85,19 @@ static void read_charybdis_config_from_eeprom(charybdis_config_t* config) {
* resets these 2 values to `false` since it does not make sense to persist
* these across reboots of the board.
*/
-static void write_charybdis_config_to_eeprom(charybdis_config_t* config) { eeconfig_update_kb(config->raw); }
+static void write_charybdis_config_to_eeprom(charybdis_config_t* config) {
+ eeconfig_update_kb(config->raw);
+}
/** \brief Return the current value of the pointer's default DPI. */
-static uint16_t get_pointer_default_dpi(charybdis_config_t* config) { return (uint16_t)config->pointer_default_dpi * CHARYBDIS_DEFAULT_DPI_CONFIG_STEP + CHARYBDIS_MINIMUM_DEFAULT_DPI; }
+static uint16_t get_pointer_default_dpi(charybdis_config_t* config) {
+ return (uint16_t)config->pointer_default_dpi * CHARYBDIS_DEFAULT_DPI_CONFIG_STEP + CHARYBDIS_MINIMUM_DEFAULT_DPI;
+}
/** \brief Return the current value of the pointer's sniper-mode DPI. */
-static uint16_t get_pointer_sniping_dpi(charybdis_config_t* config) { return (uint16_t)config->pointer_sniping_dpi * CHARYBDIS_SNIPING_DPI_CONFIG_STEP + CHARYBDIS_MINIMUM_SNIPING_DPI; }
+static uint16_t get_pointer_sniping_dpi(charybdis_config_t* config) {
+ return (uint16_t)config->pointer_sniping_dpi * CHARYBDIS_SNIPING_DPI_CONFIG_STEP + CHARYBDIS_MINIMUM_SNIPING_DPI;
+}
/** \brief Set the appropriate DPI for the input config. */
static void maybe_update_pointing_device_cpi(charybdis_config_t* config) {
@@ -128,66 +132,54 @@ static void step_pointer_sniping_dpi(charybdis_config_t* config, bool forward) {
maybe_update_pointing_device_cpi(config);
}
-uint16_t charybdis_get_pointer_default_dpi(void) { return get_pointer_default_dpi(&g_charybdis_config); }
+uint16_t charybdis_get_pointer_default_dpi(void) {
+ return get_pointer_default_dpi(&g_charybdis_config);
+}
-uint16_t charybdis_get_pointer_sniping_dpi(void) { return get_pointer_sniping_dpi(&g_charybdis_config); }
+uint16_t charybdis_get_pointer_sniping_dpi(void) {
+ return get_pointer_sniping_dpi(&g_charybdis_config);
+}
-void charybdis_cycle_pointer_default_dpi_noeeprom(bool forward) { step_pointer_default_dpi(&g_charybdis_config, forward); }
+void charybdis_cycle_pointer_default_dpi_noeeprom(bool forward) {
+ step_pointer_default_dpi(&g_charybdis_config, forward);
+}
void charybdis_cycle_pointer_default_dpi(bool forward) {
step_pointer_default_dpi(&g_charybdis_config, forward);
write_charybdis_config_to_eeprom(&g_charybdis_config);
}
-void charybdis_cycle_pointer_sniping_dpi_noeeprom(bool forward) { step_pointer_sniping_dpi(&g_charybdis_config, forward); }
+void charybdis_cycle_pointer_sniping_dpi_noeeprom(bool forward) {
+ step_pointer_sniping_dpi(&g_charybdis_config, forward);
+}
void charybdis_cycle_pointer_sniping_dpi(bool forward) {
step_pointer_sniping_dpi(&g_charybdis_config, forward);
write_charybdis_config_to_eeprom(&g_charybdis_config);
}
-bool charybdis_get_pointer_sniping_enabled(void) { return g_charybdis_config.is_sniping_enabled; }
+bool charybdis_get_pointer_sniping_enabled(void) {
+ return g_charybdis_config.is_sniping_enabled;
+}
void charybdis_set_pointer_sniping_enabled(bool enable) {
g_charybdis_config.is_sniping_enabled = enable;
maybe_update_pointing_device_cpi(&g_charybdis_config);
}
-bool charybdis_get_pointer_dragscroll_enabled(void) { return g_charybdis_config.is_dragscroll_enabled; }
+bool charybdis_get_pointer_dragscroll_enabled(void) {
+ return g_charybdis_config.is_dragscroll_enabled;
+}
void charybdis_set_pointer_dragscroll_enabled(bool enable) {
g_charybdis_config.is_dragscroll_enabled = enable;
maybe_update_pointing_device_cpi(&g_charybdis_config);
}
-void pointing_device_init_kb(void) { maybe_update_pointing_device_cpi(&g_charybdis_config); }
-
-# ifndef CONSTRAIN_HID
-# define CONSTRAIN_HID(value) ((value) < -127 ? -127 : ((value) > 127 ? 127 : (value)))
-# endif // !CONSTRAIN_HID
-
-/**
- * \brief Add optional acceleration effect.
- *
- * If `CHARYBDIS_ENABLE_POINTER_ACCELERATION` is defined, add a simple and naive
- * acceleration effect to the provided value. Return the value unchanged
- * otherwise.
- */
-# ifndef DISPLACEMENT_WITH_ACCELERATION
-# ifdef CHARYBDIS_POINTER_ACCELERATION_ENABLE
-# define DISPLACEMENT_WITH_ACCELERATION(d) (CONSTRAIN_HID(d > 0 ? d * d / CHARYBDIS_POINTER_ACCELERATION_FACTOR + d : -d * d / CHARYBDIS_POINTER_ACCELERATION_FACTOR + d))
-# else // !CHARYBDIS_POINTER_ACCELERATION_ENABLE
-# define DISPLACEMENT_WITH_ACCELERATION(d) (d)
-# endif // CHARYBDIS_POINTER_ACCELERATION_ENABLE
-# endif // !DISPLACEMENT_WITH_ACCELERATION
-
/**
* \brief Augment the pointing device behavior.
*
- * Implement the Charybdis-specific features for pointing devices:
- * - Drag-scroll
- * - Sniping
- * - Acceleration
+ * Implement drag-scroll.
*/
static void pointing_device_task_charybdis(report_mouse_t* mouse_report) {
static int16_t scroll_buffer_x = 0;
@@ -197,12 +189,12 @@ static void pointing_device_task_charybdis(report_mouse_t* mouse_report) {
scroll_buffer_x -= mouse_report->x;
# else
scroll_buffer_x += mouse_report->x;
-# endif // CHARYBDIS_DRAGSCROLL_REVERSE_X
+# endif // CHARYBDIS_DRAGSCROLL_REVERSE_X
# ifdef CHARYBDIS_DRAGSCROLL_REVERSE_Y
scroll_buffer_y -= mouse_report->y;
# else
scroll_buffer_y += mouse_report->y;
-# endif // CHARYBDIS_DRAGSCROLL_REVERSE_Y
+# endif // CHARYBDIS_DRAGSCROLL_REVERSE_Y
mouse_report->x = 0;
mouse_report->y = 0;
if (abs(scroll_buffer_x) > CHARYBDIS_DRAGSCROLL_BUFFER_SIZE) {
@@ -213,9 +205,6 @@ static void pointing_device_task_charybdis(report_mouse_t* mouse_report) {
mouse_report->v = scroll_buffer_y > 0 ? 1 : -1;
scroll_buffer_y = 0;
}
- } else if (!g_charybdis_config.is_sniping_enabled) {
- mouse_report->x = DISPLACEMENT_WITH_ACCELERATION(mouse_report->x);
- mouse_report->y = DISPLACEMENT_WITH_ACCELERATION(mouse_report->y);
}
}
@@ -234,9 +223,9 @@ static bool has_shift_mod(void) {
return mod_config(get_mods()) & MOD_MASK_SHIFT;
# else
return mod_config(get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT;
-# endif // NO_ACTION_ONESHOT
+# endif // NO_ACTION_ONESHOT
}
-# endif // POINTING_DEVICE_ENABLE && !NO_CHARYBDIS_KEYCODES
+# endif // POINTING_DEVICE_ENABLE && !NO_CHARYBDIS_KEYCODES
/**
* \brief Outputs the Charybdis configuration to console.
@@ -252,16 +241,16 @@ static bool has_shift_mod(void) {
static void debug_charybdis_config_to_console(charybdis_config_t* config) {
# ifdef CONSOLE_ENABLE
dprintf("(charybdis) process_record_kb: config = {\n"
- "\traw = 0x%04X,\n"
+ "\traw = 0x%X,\n"
"\t{\n"
- "\t\tis_dragscroll_enabled=%b\n"
- "\t\tis_sniping_enabled=%b\n"
- "\t\tdefault_dpi=0x%02X (%ld)\n"
- "\t\tsniping_dpi=0x%01X (%ld)\n"
+ "\t\tis_dragscroll_enabled=%u\n"
+ "\t\tis_sniping_enabled=%u\n"
+ "\t\tdefault_dpi=0x%X (%u)\n"
+ "\t\tsniping_dpi=0x%X (%u)\n"
"\t}\n"
"}\n",
config->raw, config->is_dragscroll_enabled, config->is_sniping_enabled, config->pointer_default_dpi, get_pointer_default_dpi(config), config->pointer_sniping_dpi, get_pointer_sniping_dpi(config));
-# endif // CONSOLE_ENABLE
+# endif // CONSOLE_ENABLE
}
bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
@@ -313,19 +302,11 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
}
break;
}
-# endif // !NO_CHARYBDIS_KEYCODES
-# ifndef MOUSEKEY_ENABLE
- // Simulate mouse keys if full support is not enabled (reduces firmware size
- // while maintaining support for mouse keys).
- if (IS_MOUSEKEY_BUTTON(keycode)) {
- report_mouse_t mouse_report = pointing_device_get_report();
- mouse_report.buttons = pointing_device_handle_buttons(mouse_report.buttons, record->event.pressed, keycode - KC_MS_BTN1);
- pointing_device_set_report(mouse_report);
- pointing_device_send();
+# endif // !NO_CHARYBDIS_KEYCODES
+# endif // POINTING_DEVICE_ENABLE
+ if ((keycode >= POINTER_DEFAULT_DPI_FORWARD && keycode < CHARYBDIS_SAFE_RANGE) || IS_MOUSEKEY(keycode)) {
+ debug_charybdis_config_to_console(&g_charybdis_config);
}
-# endif // !MOUSEKEY_ENABLE
-# endif // POINTING_DEVICE_ENABLE
- debug_charybdis_config_to_console(&g_charybdis_config);
return true;
}
@@ -340,4 +321,64 @@ void matrix_init_kb(void) {
read_charybdis_config_from_eeprom(&g_charybdis_config);
matrix_init_user();
}
-#endif // POINTING_DEVICE_ENABLE
+
+# ifdef CHARYBDIS_CONFIG_SYNC
+void charybdis_config_sync_handler(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer) {
+ if (initiator2target_buffer_size == sizeof(g_charybdis_config)) {
+ memcpy(&g_charybdis_config, initiator2target_buffer, sizeof(g_charybdis_config));
+ }
+}
+# endif
+
+void keyboard_post_init_kb(void) {
+ maybe_update_pointing_device_cpi(&g_charybdis_config);
+# ifdef CHARYBDIS_CONFIG_SYNC
+ transaction_register_rpc(RPC_ID_KB_CONFIG_SYNC, charybdis_config_sync_handler);
+# endif
+ keyboard_post_init_user();
+}
+
+# ifdef CHARYBDIS_CONFIG_SYNC
+void housekeeping_task_kb(void) {
+ if (is_keyboard_master()) {
+ // Keep track of the last state, so that we can tell if we need to propagate to slave.
+ static charybdis_config_t last_charybdis_config = {0};
+ static uint32_t last_sync = 0;
+ bool needs_sync = false;
+
+ // Check if the state values are different.
+ if (memcmp(&g_charybdis_config, &last_charybdis_config, sizeof(g_charybdis_config))) {
+ needs_sync = true;
+ memcpy(&last_charybdis_config, &g_charybdis_config, sizeof(g_charybdis_config));
+ }
+ // Send to slave every 500ms regardless of state change.
+ if (timer_elapsed32(last_sync) > 500) {
+ needs_sync = true;
+ }
+
+ // Perform the sync if requested.
+ if (needs_sync) {
+ if (transaction_rpc_send(RPC_ID_KB_CONFIG_SYNC, sizeof(g_charybdis_config), &g_charybdis_config)) {
+ last_sync = timer_read32();
+ }
+ }
+ }
+ // No need to invoke the user-specific callback, as it's been called
+ // already.
+}
+# endif // CHARYBDIS_CONFIG_SYNC
+#endif // POINTING_DEVICE_ENABLE
+
+#if defined(KEYBOARD_bastardkb_charybdis_3x5_blackpill) || defined(KEYBOARD_bastardkb_charybdis_4x6_blackpill)
+void keyboard_pre_init_kb(void) {
+ setPinInputHigh(A0);
+ keyboard_pre_init_user();
+}
+
+void matrix_scan_kb(void) {
+ if (!readPin(A0)) {
+ reset_keyboard();
+ }
+ matrix_scan_user();
+}
+#endif // KEYBOARD_bastardkb_charybdis_3x5_blackpill || KEYBOARD_bastardkb_charybdis_4x6_blackpill
diff --git a/keyboards/bastardkb/charybdis/charybdis.h b/keyboards/bastardkb/charybdis/charybdis.h
index 42423c0c92..f624c554f4 100644
--- a/keyboards/bastardkb/charybdis/charybdis.h
+++ b/keyboards/bastardkb/charybdis/charybdis.h
@@ -21,6 +21,8 @@
// clang-format off
#if defined(KEYBOARD_bastardkb_charybdis_3x5)
# include "3x5.h"
+#elif defined(KEYBOARD_bastardkb_charybdis_3x6)
+# include "3x6.h"
#elif defined(KEYBOARD_bastardkb_charybdis_4x6)
# include "4x6.h"
#else
@@ -37,7 +39,7 @@ enum charybdis_keycodes {
POINTER_DEFAULT_DPI_FORWARD = USER00,
# else
POINTER_DEFAULT_DPI_FORWARD = SAFE_RANGE,
-# endif // VIA_ENABLE
+# endif // VIA_ENABLE
POINTER_DEFAULT_DPI_REVERSE,
POINTER_SNIPING_DPI_FORWARD,
POINTER_SNIPING_DPI_REVERSE,
@@ -56,7 +58,7 @@ enum charybdis_keycodes {
# define SNP_TOG SNIPING_MODE_TOGGLE
# define DRGSCRL DRAGSCROLL_MODE
# define DRG_TOG DRAGSCROLL_MODE_TOGGLE
-# endif // !NO_CHARYBDIS_KEYCODES
+# endif // !NO_CHARYBDIS_KEYCODES
/** \brief Return the current DPI value for the pointer's default mode. */
uint16_t charybdis_get_pointer_default_dpi(void);
@@ -123,4 +125,4 @@ bool charybdis_get_pointer_dragscroll_enabled(void);
* are translated into horizontal and vertical scroll movements.
*/
void charybdis_set_pointer_dragscroll_enabled(bool enable);
-#endif // POINTING_DEVICE_ENABLE
+#endif // POINTING_DEVICE_ENABLE
diff --git a/keyboards/bastardkb/charybdis/config.h b/keyboards/bastardkb/charybdis/config.h
index c88451335e..bc5ea15d29 100644
--- a/keyboards/bastardkb/charybdis/config.h
+++ b/keyboards/bastardkb/charybdis/config.h
@@ -18,8 +18,6 @@
#pragma once
-#include "config_common.h"
-
/* Pointing device configuration. */
// Enable use of pointing device on slave split.
@@ -31,5 +29,74 @@
// Limits the frequency that the sensor is polled for motion.
#define POINTING_DEVICE_TASK_THROTTLE_MS 1
-/** \brief Invert X axis on mouse reports. */
+// Invert X axis on mouse reports.
#define POINTING_DEVICE_INVERT_X
+
+/* RGB matrix support. */
+#ifdef RGB_MATRIX_ENABLE
+# define SPLIT_TRANSPORT_MIRROR
+# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 255
+# define RGB_DISABLE_WHEN_USB_SUSPENDED
+# define RGB_MATRIX_KEYPRESSES
+
+// Startup values.
+# define RGB_MATRIX_DEFAULT_HUE 0
+# define RGB_MATRIX_DEFAULT_SAT 255
+# define RGB_MATRIX_DEFAULT_VAL 64
+
+// Rainbow swirl as startup mode.
+# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+# define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT
+
+// Slow swirl at startup.
+# define RGB_MATRIX_DEFAULT_SPD 32
+
+# ifndef __arm__
+// Disable control of RGB matrix by keycodes (must use firmware implementation
+// to control the feature).
+# define RGB_MATRIX_DISABLE_KEYCODES
+# else // __arm__
+// Enable all animations on ARM boards since they have plenty of memory
+// available for it.
+# define ENABLE_RGB_MATRIX_ALPHAS_MODS
+# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
+# define ENABLE_RGB_MATRIX_BREATHING
+# define ENABLE_RGB_MATRIX_BAND_SAT
+# define ENABLE_RGB_MATRIX_BAND_VAL
+# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
+# define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+# define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
+# define ENABLE_RGB_MATRIX_CYCLE_ALL
+# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+# define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
+# define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
+# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+# define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
+# define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
+# define ENABLE_RGB_MATRIX_DUAL_BEACON
+# define ENABLE_RGB_MATRIX_RAINBOW_BEACON
+# define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+# define ENABLE_RGB_MATRIX_RAINDROPS
+# define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
+# define ENABLE_RGB_MATRIX_HUE_BREATHING
+# define ENABLE_RGB_MATRIX_HUE_PENDULUM
+# define ENABLE_RGB_MATRIX_HUE_WAVE
+# define ENABLE_RGB_MATRIX_TYPING_HEATMAP
+# define ENABLE_RGB_MATRIX_DIGITAL_RAIN
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+# define ENABLE_RGB_MATRIX_SPLASH
+# define ENABLE_RGB_MATRIX_MULTISPLASH
+# define ENABLE_RGB_MATRIX_SOLID_SPLASH
+# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
+# endif // !__arm__
+#endif
diff --git a/keyboards/bastardkb/charybdis/post_config.h b/keyboards/bastardkb/charybdis/post_config.h
index 540751f6c6..4cfd24c4b6 100644
--- a/keyboards/bastardkb/charybdis/post_config.h
+++ b/keyboards/bastardkb/charybdis/post_config.h
@@ -20,90 +20,95 @@
#pragma once
+// Enable syncing of charybdis config
+#ifdef CHARYBDIS_CONFIG_SYNC
+# define SPLIT_TRANSACTION_IDS_KB RPC_ID_KB_CONFIG_SYNC
+#endif
+
/* Mouse config. */
#ifndef MOUSEKEY_MOVE_DELTA
# ifndef MK_KINETIC_SPEED
# define MOUSEKEY_MOVE_DELTA 5
-# else // MK_KINETIC_SPEED
+# else // MK_KINETIC_SPEED
# define MOUSEKEY_MOVE_DELTA 25
-# endif // !MK_KINETIC_SPEED
-#endif // !MOUSEKEY_MOVE_DELTA
+# endif // !MK_KINETIC_SPEED
+#endif // !MOUSEKEY_MOVE_DELTA
#ifndef MOUSEKEY_DELAY
# ifndef MK_KINETIC_SPEED
# define MOUSEKEY_DELAY 300
-# else // MK_KINETIC_SPEED
+# else // MK_KINETIC_SPEED
# define MOUSEKEY_DELAY 8
-# endif // !MK_KINETIC_SPEED
-#endif // !MOUSEKEY_DELAY
+# endif // !MK_KINETIC_SPEED
+#endif // !MOUSEKEY_DELAY
#ifndef MOUSEKEY_INTERVAL
# ifndef MK_KINETIC_SPEED
# define MOUSEKEY_INTERVAL 50
-# else // MK_KINETIC_SPEED
+# else // MK_KINETIC_SPEED
# define MOUSEKEY_INTERVAL 20
-# endif // !MK_KINETIC_SPEED
-#endif // !MOUSEKEY_INTERNAL
+# endif // !MK_KINETIC_SPEED
+#endif // !MOUSEKEY_INTERNAL
#ifndef MOUSEKEY_MAX_SPEED
# define MOUSEKEY_MAX_SPEED 7
-#endif // !MOUSEKEY_MAX_SPEED
+#endif // !MOUSEKEY_MAX_SPEED
#ifndef MOUSEKEY_TIME_TO_MAX
# define MOUSEKEY_TIME_TO_MAX 60
-#endif // !MOUSEKEY_TIME_TO_MAX
+#endif // !MOUSEKEY_TIME_TO_MAX
#ifndef MOUSEKEY_INITIAL_SPEED
# define MOUSEKEY_INITIAL_SPEED 100
-#endif // !MOUSEKEY_INITIAL_SPEED
+#endif // !MOUSEKEY_INITIAL_SPEED
#ifndef MOUSEKEY_BASE_SPEED
# define MOUSEKEY_BASE_SPEED 1000
-#endif // !MOUSEKEY_BASE_SPEED
+#endif // !MOUSEKEY_BASE_SPEED
#ifndef MOUSEKEY_DECELERATED_SPEED
# define MOUSEKEY_DECELERATED_SPEED 400
-#endif // !MOUSEKEY_DECELERATED_SPEED
+#endif // !MOUSEKEY_DECELERATED_SPEED
#ifndef MOUSEKEY_ACCELERATED_SPEED
# define MOUSEKEY_ACCELERATED_SPEED 3000
-#endif // !MOUSEKEY_ACCELERATED_SPEED
+#endif // !MOUSEKEY_ACCELERATED_SPEED
/* Mouse scroll config. */
#ifndef MOUSEKEY_WHEEL_DELAY
# define MOUSEKEY_WHEEL_DELAY 15
-#endif // !MOUSEKEY_WHEEL_DELAY
+#endif // !MOUSEKEY_WHEEL_DELAY
#ifndef MOUSEKEY_WHEEL_DELTA
# define MOUSEKEY_WHEEL_DELTA 1
-#endif // !MOUSEKEY_WHEEL_DELTA
+#endif // !MOUSEKEY_WHEEL_DELTA
#ifndef MOUSEKEY_WHEEL_INTERVAL
# define MOUSEKEY_WHEEL_INTERVAL 50
-#endif // !MOUSEKEY_WHEEL_INTERVAL
+#endif // !MOUSEKEY_WHEEL_INTERVAL
#ifndef MOUSEKEY_WHEEL_MAX_SPEED
# define MOUSEKEY_WHEEL_MAX_SPEED 8
-#endif // !MOUSEKEY_WHEEL_MAX_SPEED
+#endif // !MOUSEKEY_WHEEL_MAX_SPEED
#ifndef MOUSEKEY_WHEEL_TIME_TO_MAX
# define MOUSEKEY_WHEEL_TIME_TO_MAX 80
-#endif // !MOUSEKEY_WHEEL_TIME_TO_MAX
+#endif // !MOUSEKEY_WHEEL_TIME_TO_MAX
#ifndef MOUSEKEY_WHEEL_INITIAL_MOVEMENTS
# define MOUSEKEY_WHEEL_INITIAL_MOVEMENTS 8
-#endif // !MOUSEKEY_WHEEL_INITIAL_MOVEMENTS
+#endif // !MOUSEKEY_WHEEL_INITIAL_MOVEMENTS
#ifndef MOUSEKEY_WHEEL_BASE_MOVEMENTS
# define MOUSEKEY_WHEEL_BASE_MOVEMENTS 48
-#endif // !MOUSEKEY_WHEEL_BASE_MOVEMENTS
+#endif // !MOUSEKEY_WHEEL_BASE_MOVEMENTS
#ifndef MOUSEKEY_WHEEL_ACCELERATED_MOVEMENTS
# define MOUSEKEY_WHEEL_ACCELERATED_MOVEMENTS 48
-#endif // !MOUSEKEY_WHEEL_ACCELERATED_MOVEMENTS
+#endif // !MOUSEKEY_WHEEL_ACCELERATED_MOVEMENTS
#ifndef MOUSEKEY_WHEEL_DECELERATED_MOVEMENTS
# define MOUSEKEY_WHEEL_DECELERATED_MOVEMENTS 8
-#endif // !MOUSEKEY_WHEEL_DECELERATED_MOVEMENTS
+#endif // !MOUSEKEY_WHEEL_DECELERATED_MOVEMENTS
diff --git a/keyboards/bastardkb/charybdis/readme.md b/keyboards/bastardkb/charybdis/readme.md
index 461f33117c..dd0fca0015 100644
--- a/keyboards/bastardkb/charybdis/readme.md
+++ b/keyboards/bastardkb/charybdis/readme.md
@@ -18,33 +18,33 @@ Check out the [keyboard build guides](https://docs.bastardkb.com) for the Charyb
## Building the firmware
-### Charybdis (4x6)
+**You must specify the shield version when compiling/flashing the firmware.**
+
+The template is:
+
+```shell
+qmk compile -kb bastardkb/charybdis/{LAYOUT}/{VERSION}/elitec -km {KEYMAP}
+```
+
+See below for populated commands per layout
The `default` keymap is inspired from the original [Dactyl Manuform](../../handwired/dactyl_manuform) layout.
-```shell
-qmk compile -kb bastardkb/charybdis/4x6 -km default
-```
+Check out the `via` layout if you're looking for VIA support.
-Check out the `via` layout if you're looking for VIA support:
+### Charybdis (4x6)
-```shell
-qmk compile -kb bastardkb/charybdis/4x6 -km via
-```
+| Shield Version | default | via |
+| -------------- | --------------------------------------------------------------- | ----------------------------------------------------------- |
+| v1 | `qmk compile -kb bastardkb/charybdis/4x6/v1/elitec -km default` | `qmk compile -kb bastardkb/charybdis/4x6/v1/elitec -km via` |
+| v2 | `qmk compile -kb bastardkb/charybdis/4x6/v2/elitec -km default` | `qmk compile -kb bastardkb/charybdis/4x6/v2/elitec -km via` |
### Charybdis (3x5)
-The `default` keymap is inspired from the original [Dactyl Manuform](../../handwired/dactyl_manuform) layout.
-
-```shell
-qmk compile -kb bastardkb/charybdis/3x5 -km default
-```
-
-Check out the `via` layout if you're looking for VIA support:
-
-```shell
-qmk compile -kb bastardkb/charybdis/3x5 -km via
-```
+| Shield Version | default | via |
+| -------------- | --------------------------------------------------------------- | ----------------------------------------------------------- |
+| v1 | `qmk compile -kb bastardkb/charybdis/3x5/v1/elitec -km default` | `qmk compile -kb bastardkb/charybdis/3x5/v1/elitec -km via` |
+| v2 | `qmk compile -kb bastardkb/charybdis/3x5/v2/elitec -km default` | `qmk compile -kb bastardkb/charybdis/3x5/v2/elitec -km via` |
## Customizing the firmware
@@ -73,7 +73,7 @@ Drag-scroll enables scrolling with the trackball. When drag-scroll is enabled, t
Call `charybdis_set_pointer_dragscroll_enabled(bool enable)` to enable/disable drag-scroll.
-`charybdis_get_pointer_dragscroll_enabled()` returns whether sniping mode is currently enabled.
+`charybdis_get_pointer_dragscroll_enabled()` returns whether drag-scroll mode is currently enabled.
To invert the horizontal scrolling direction, define `CHARYBDIS_DRAGSCROLL_REVERSE_X`:
@@ -114,20 +114,6 @@ This behavior can be further customized with the following defines:
#define CHARYBDIS_SNIPING_DPI_CONFIG_STEP 100
```
-### Acceleration
-
-By default, the pointer's movements are linear. To enable acceleration, add the following define:
-
-```c
-#define CHARYBDIS_POINTER_ACCELERATION_ENABLE
-```
-
-The acceleration factor can be further tune _via_ the `CHARYBDIS_POINTER_ACCELERATION_FACTOR`:
-
-```c
-#define CHARYBDIS_POINTER_ACCELERATION_FACTOR 24
-```
-
### Custom keycodes
The Charybdis firmware defines a number of keycodes to leverage its features, namely:
@@ -176,3 +162,23 @@ To disable the custom keycodes, and reduce binary size, simply add a definition
```c
#define NO_CHARYBDIS_KEYCODES
```
+
+### Configuration Syncing
+
+If you want/need to enable syncing of the charybdis config, such as to read the sniping or drag scroll modes on the other half (such as for displaying the status via rgb matrix, or added on screens, or what not), you can enabled this. To do so, add this to your `config.h`:
+
+```c
+#define CHARYBDIS_CONFIG_SYNC
+```
+
+Note that you will need to reflash both sides when enabling this.
+
+### Enable Large Mouse Reports
+
+By default, the X and Y motion for the pointing device/mouse reports is -127 to 127. You can definitely hit the limit for that with the sensors. You can enable support for -32767 to 32767 by adding this to your `config.h`:
+
+```c
+#define MOUSE_EXTENDED_REPORT
+```
+
+Note that you will need to reflash both sides when enabling this.
diff --git a/keyboards/bastardkb/dilemma/3x5_2/3x5_2.h b/keyboards/bastardkb/dilemma/3x5_2/3x5_2.h
new file mode 100644
index 0000000000..7deb32d917
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/3x5_2.h
@@ -0,0 +1,37 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+// clang-format off
+#define LAYOUT_split_3x5_2( \
+ k00, k01, k02, k03, k04, k44, k43, k42, k41, k40, \
+ k10, k11, k12, k13, k14, k54, k53, k52, k51, k50, \
+ k20, k21, k22, k23, k24, k64, k63, k62, k61, k60, \
+ k30, k32, k72, k70 \
+) \
+{ \
+ { k00, k01, k02, k03, k04 }, \
+ { k10, k11, k12, k13, k14 }, \
+ { k20, k21, k22, k23, k24 }, \
+ { k30, KC_NO, k32, KC_NO, KC_NO }, \
+ { k40, k41, k42, k43, k44 }, \
+ { k50, k51, k52, k53, k54 }, \
+ { k60, k61, k62, k63, k64 }, \
+ { k70, KC_NO, k72, KC_NO, KC_NO }, \
+}
+// clang-format on
diff --git a/keyboards/bastardkb/dilemma/3x5_2/assembled/config.h b/keyboards/bastardkb/dilemma/3x5_2/assembled/config.h
new file mode 100644
index 0000000000..8420898f4e
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/assembled/config.h
@@ -0,0 +1,46 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { GP4, GP5, GP28, GP26 }
+#define MATRIX_COL_PINS \
+ { GP8, GP9, GP7, GP6, GP27 }
+
+/* Handedness. */
+#define SPLIT_HAND_PIN GP29
+#define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left.
+
+/* serial.c configuration (for split keyboard). */
+#define SOFT_SERIAL_PIN GP1
+
+/* CRC. */
+#define CRC8_USE_TABLE
+#define CRC8_OPTIMIZE_SPEED
+
+/* Cirque trackpad. */
+#define SPI_SCK_PIN GP22
+#define SPI_MOSI_PIN GP23
+#define SPI_MISO_PIN GP20
+#define POINTING_DEVICE_CS_PIN GP21
+
+/* Reset. */
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U
diff --git a/keyboards/bastardkb/dilemma/3x5_2/assembled/halconf.h b/keyboards/bastardkb/dilemma/3x5_2/assembled/halconf.h
new file mode 100644
index 0000000000..7a79bec953
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/assembled/halconf.h
@@ -0,0 +1,22 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#define HAL_USE_SPI TRUE
+
+#include_next "halconf.h"
diff --git a/keyboards/bastardkb/dilemma/3x5_2/assembled/info.json b/keyboards/bastardkb/dilemma/3x5_2/assembled/info.json
new file mode 100644
index 0000000000..59f3b0d071
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/assembled/info.json
@@ -0,0 +1,3 @@
+{
+ "keyboard_name": "Dilemma (3x5+2) Assembled"
+}
diff --git a/keyboards/bastardkb/dilemma/3x5_2/assembled/mcuconf.h b/keyboards/bastardkb/dilemma/3x5_2/assembled/mcuconf.h
new file mode 100644
index 0000000000..b54d705b54
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/assembled/mcuconf.h
@@ -0,0 +1,23 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include_next "mcuconf.h"
+
+#undef RP_SPI_USE_SPI1
+#define RP_SPI_USE_SPI1 TRUE
diff --git a/keyboards/bastardkb/dilemma/3x5_2/assembled/rules.mk b/keyboards/bastardkb/dilemma/3x5_2/assembled/rules.mk
new file mode 100644
index 0000000000..df2f94792d
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/assembled/rules.mk
@@ -0,0 +1,34 @@
+# MCU name
+MCU = RP2040
+
+# Bootloader selection
+BOOTLOADER = rp2040
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported
+RGB_MATRIX_SUPPORTED = no # RGB matrix is supported and enabled by default
+RGBLIGHT_SUPPORTED = no # RGB underglow is supported, but not enabled by default
+RGB_MATRIX_ENABLE = no # Enable keyboard RGB matrix functionality
+
+SERIAL_DRIVER = vendor
+
+POINTING_DEVICE_ENABLE = yes
+POINTING_DEVICE_DRIVER = cirque_pinnacle_spi # Assembled version uses SPI.
+
+SPLIT_KEYBOARD = yes
+LAYOUTS = split_3x5_2
+
+# RP2040-specific options
+PICO_INTRINSICS_ENABLED = no # ATM Unsupported by ChibiOS.
diff --git a/keyboards/bastardkb/dilemma/3x5_2/info.json b/keyboards/bastardkb/dilemma/3x5_2/info.json
new file mode 100644
index 0000000000..bbbecd7efa
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/info.json
@@ -0,0 +1,46 @@
+{
+ "usb": {
+ "device_version": "1.0.0",
+ "pid": "0x1835"
+ },
+ "layouts": {
+ "LAYOUT_split_3x5_2": {
+ "layout": [
+ { "label": "L00", "x": 0, "y": 0 },
+ { "label": "L01", "x": 1, "y": 0 },
+ { "label": "L02", "x": 2, "y": 0 },
+ { "label": "L03", "x": 3, "y": 0 },
+ { "label": "L04", "x": 4, "y": 0 },
+ { "label": "R00", "x": 11, "y": 0 },
+ { "label": "R01", "x": 12, "y": 0 },
+ { "label": "R02", "x": 13, "y": 0 },
+ { "label": "R03", "x": 14, "y": 0 },
+ { "label": "R04", "x": 15, "y": 0 },
+ { "label": "L10", "x": 0, "y": 1 },
+ { "label": "L11", "x": 1, "y": 1 },
+ { "label": "L12", "x": 2, "y": 1 },
+ { "label": "L13", "x": 3, "y": 1 },
+ { "label": "L14", "x": 4, "y": 1 },
+ { "label": "R10", "x": 11, "y": 1 },
+ { "label": "R11", "x": 12, "y": 1 },
+ { "label": "R12", "x": 13, "y": 1 },
+ { "label": "R13", "x": 14, "y": 1 },
+ { "label": "R14", "x": 15, "y": 1 },
+ { "label": "L20", "x": 0, "y": 2 },
+ { "label": "L21", "x": 1, "y": 2 },
+ { "label": "L22", "x": 2, "y": 2 },
+ { "label": "L23", "x": 3, "y": 2 },
+ { "label": "L24", "x": 4, "y": 2 },
+ { "label": "R20", "x": 11, "y": 2 },
+ { "label": "R21", "x": 12, "y": 2 },
+ { "label": "R22", "x": 13, "y": 2 },
+ { "label": "R23", "x": 14, "y": 2 },
+ { "label": "R24", "x": 15, "y": 2 },
+ { "label": "L30", "x": 4, "y": 3 },
+ { "label": "L32", "x": 5, "y": 3 },
+ { "label": "R32", "x": 10, "y": 3 },
+ { "label": "R30", "x": 11, "y": 3 }
+ ]
+ }
+ }
+}
diff --git a/keyboards/bastardkb/dilemma/3x5_2/keymaps/bstiq/config.h b/keyboards/bastardkb/dilemma/3x5_2/keymaps/bstiq/config.h
new file mode 100644
index 0000000000..cbe8e7bba7
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/keymaps/bstiq/config.h
@@ -0,0 +1,152 @@
+/**
+ * Copyright 2021 Quentin LEBASTARD
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+
+#ifdef VIA_ENABLE
+/* Via configuration. */
+# define DYNAMIC_KEYMAP_LAYER_COUNT 8
+#endif // VIA_ENABLE
+
+/**
+ * Configure the global tapping term (default: 200ms).
+ * If you have a lot of accidental mod activations, crank up the tapping term.
+ *
+ * See docs.qmk.fm/using-qmk/software-features/tap_hold#tapping-term
+ */
+#ifndef TAPPING_TERM
+# define TAPPING_TERM 160
+#endif // TAPPING_TERM
+
+// disable trackpad taps
+// #define CIRQUE_PINNACLE_TAPPING_TERM 0
+
+/**
+ * Enable rapid switch from tap to hold. Disable auto-repeat when pressing key
+ * twice, except for one-shot keys.
+ *
+ * See docs.qmk.fm/using-qmk/software-features/tap_hold#tapping-force-hold
+ */
+#define TAPPING_FORCE_HOLD
+
+/*
+ * Tap-or-Hold decision modes.
+ *
+ * Note that the following flags behave differently when combined (ie. when 2 or
+ * more are enabled).
+ *
+ * See bit.ly/tap-or-hold for a visual explanation of the following tap-or-hold
+ * decision modes.
+ */
+
+/**
+ * Faster tap-hold trigger.
+ *
+ * Without `PERMISSIVE_HOLD`, within `TAPPING_TERM`:
+ * Mod(a)🠗 e🠗 e🠕 Mod(a)🠕 ➞ ae
+ * With `PERMISSIVE_HOLD`, within `TAPPING_TERM`:
+ * Mod(a)🠗 e🠗 e🠕 Mod(a)🠕 ➞ Mod+e
+ *
+ * See docs.qmk.fm/using-qmk/software-features/tap_hold#permissive-hold
+ */
+#define PERMISSIVE_HOLD
+
+/**
+ * Prevent normal rollover on alphas from accidentally triggering mods.
+ *
+ * Ignores key presses that interrupt a mod-tap. Must-have for Home Row mod.
+ *
+ * Without `IGNORE_MOD_TAP_INTERRUPT`, within `TAPPING_TERM`:
+ * Mod(a)🠗 e🠗 Mod(a)🠕 e🠕 ➞ Mod+e
+ * With `IGNORE_MOD_TAP_INTERRUPT`, within `TAPPING_TERM`:
+ * Mod(a)🠗 e🠗 Mod(a)🠕 e🠕 ➞ ae
+ *
+ * See docs.qmk.fm/using-qmk/software-features/tap_hold#ignore-mod-tap-interrupt
+ */
+#define IGNORE_MOD_TAP_INTERRUPT
+
+/** Dilemma-specific features. */
+
+#ifdef POINTING_DEVICE_ENABLE
+// Flip horizontal direction for drag-scroll.
+# define DILEMMA_DRAGSCROLL_REVERSE_X
+// #define DILEMMA_DRAGSCROLL_REVERSE_Y
+#endif // POINTING_DEVICE_ENABLE
+
+/** RGB Matrix. */
+
+#ifdef RGB_MATRIX_ENABLE
+// Enable all animations on ARM boards since they have plenty of memory
+// available for it.
+# define ENABLE_RGB_MATRIX_ALPHAS_MODS
+# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
+# define ENABLE_RGB_MATRIX_BREATHING
+# define ENABLE_RGB_MATRIX_BAND_SAT
+# define ENABLE_RGB_MATRIX_BAND_VAL
+# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
+# define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+# define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
+# define ENABLE_RGB_MATRIX_CYCLE_ALL
+# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+# define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
+# define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
+# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+# define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
+# define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
+# define ENABLE_RGB_MATRIX_DUAL_BEACON
+# define ENABLE_RGB_MATRIX_RAINBOW_BEACON
+# define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+# define ENABLE_RGB_MATRIX_RAINDROPS
+# define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
+# define ENABLE_RGB_MATRIX_HUE_BREATHING
+# define ENABLE_RGB_MATRIX_HUE_PENDULUM
+# define ENABLE_RGB_MATRIX_HUE_WAVE
+# define ENABLE_RGB_MATRIX_TYPING_HEATMAP
+# define ENABLE_RGB_MATRIX_DIGITAL_RAIN
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+# define ENABLE_RGB_MATRIX_SPLASH
+# define ENABLE_RGB_MATRIX_MULTISPLASH
+# define ENABLE_RGB_MATRIX_SOLID_SPLASH
+# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
+
+// Limit maximum brightness to keep power consumption reasonable, and avoid
+// disconnects.
+# undef RGB_MATRIX_MAXIMUM_BRIGHTNESS
+# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 64
+
+// Rainbow swirl as startup mode.
+# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+# define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT
+
+// Slow swirl at startup.
+# define RGB_MATRIX_DEFAULT_SPD 32
+
+// Startup values.
+# define RGB_MATRIX_DEFAULT_HUE 0
+# define RGB_MATRIX_DEFAULT_SAT 255
+# define RGB_MATRIX_DEFAULT_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS
+#endif // RGB_MATRIX_ENABLE
diff --git a/keyboards/bastardkb/dilemma/3x5_2/keymaps/bstiq/keymap.c b/keyboards/bastardkb/dilemma/3x5_2/keymaps/bstiq/keymap.c
new file mode 100644
index 0000000000..e8c0441d7b
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/keymaps/bstiq/keymap.c
@@ -0,0 +1,224 @@
+/**
+ * Copyright 2021 Quentin LEBASTARD
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include QMK_KEYBOARD_H
+
+enum bstiq_layers {
+ LAYER_BASE = 0,
+ LAYER_MBO,
+ LAYER_MEDIA,
+ LAYER_NAV,
+ LAYER_MOUSE,
+ LAYER_SYM,
+ LAYER_NUM,
+ LAYER_FUN,
+};
+
+// Automatically enable sniping when the mouse layer is on.
+#define DILEMMA_AUTO_SNIPING_ON_LAYER LAYER_MOUSE
+
+#define BSP_NAV LT(LAYER_NAV, KC_BSPC)
+#define ENT_MBO LT(LAYER_MBO, KC_ENT)
+#define TAB_MED LT(LAYER_MEDIA, KC_TAB)
+#define ESC_SYM LT(LAYER_SYM, KC_ESC)
+#define SPC_NUM LT(LAYER_NUM, KC_SPC)
+#define SPC_MBO LT(LAYER_MBO, KC_SPC)
+#define MOUSE(KC) LT(LAYER_MOUSE, KC)
+
+#define USR_RDO KC_AGAIN
+#define USR_PST S(KC_INS)
+#define USR_CPY C(KC_INS)
+#define USR_CUT S(KC_DEL)
+#define USR_UND KC_UNDO
+
+#define MS_L KC_MS_LEFT
+#define MS_R KC_MS_RIGHT
+#define MS_D KC_MS_DOWN
+#define MS_U KC_MS_UP
+
+#define WH_L KC_MS_WH_LEFT
+#define WH_R KC_MS_WH_RIGHT
+#define WH_D KC_MS_WH_DOWN
+#define WH_U KC_MS_WH_UP
+
+// clang-format off
+/** Convenience macro. */
+#define _KC_LAYOUT_wrapper( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, \
+ ...) \
+ KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_##k06, KC_##k07, KC_##k08, KC_##k09, \
+ KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, KC_##k16, KC_##k17, KC_##k18, KC_##k19, \
+ KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_##k26, KC_##k27, KC_##k28, KC_##k29, \
+ __VA_ARGS__
+#define KC_LAYOUT_wrapper(...) _KC_LAYOUT_wrapper(__VA_ARGS__)
+
+/** Base layer with BÉPO layout. */
+#define LAYOUT_LAYER_BASE_BEPO KC_LAYOUT_wrapper( \
+ B, W, P, O, QUOT, DOT, V, D, L, J, \
+ A, U, I, E, COMM, C, T, S, R, N, \
+ Z, Y, X, SLSH, K, M, Q, G, H, F, \
+ SPC_MBO, TAB_MED, ESC_SYM, SPC_NUM)
+
+/** Convenience key shorthands. */
+#define U_NA KC_NO // Present but not available for use.
+#define U_NU KC_NO // Available but not used.
+
+/** Convenience row shorthands. */
+#define ________________HOME_ROW_NA________________ U_NA, U_NA, U_NA, U_NA, U_NA
+#define ______________HOME_ROW_GASC_L______________ KC_LGUI, KC_LALT, KC_LSFT, KC_LCTL, U_NA
+#define ______________HOME_ROW_ALGR_L______________ U_NA, KC_ALGR, U_NA, U_NA, U_NA
+#define ______________HOME_ROW_GASC_R______________ U_NA, KC_LCTL, KC_LSFT, KC_LALT, KC_LGUI
+#define ______________HOME_ROW_ALGR_R______________ U_NA, U_NA, U_NA, KC_ALGR, U_NA
+
+/** Layers. */
+
+// Buttons.
+#define LAYOUT_LAYER_MBO \
+ ________________HOME_ROW_NA________________, USR_RDO, USR_PST, USR_CPY, USR_CUT, USR_UND, \
+ ______________HOME_ROW_GASC_L______________, KC_BSPC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, \
+ KC_BTN3, KC_ALGR, KC_BTN2, KC_BTN1, U_NA, KC_DEL, KC_HOME, KC_PGDN, KC_PGUP, KC_END, \
+ U_NA, U_NA, KC_ENT, KC_ENT
+
+// Media.
+#define LAYOUT_LAYER_MEDIA \
+ ________________HOME_ROW_NA________________, USR_RDO, USR_PST, USR_CPY, USR_CUT, USR_UND, \
+ ______________HOME_ROW_GASC_L______________, U_NU, MS_L, MS_D, MS_U, MS_R, \
+ ______________HOME_ROW_ALGR_L______________, U_NU, WH_L, WH_D, WH_U, WH_R, \
+ U_NA, U_NA, KC_BTN1, KC_BTN3
+
+// Navigation.
+#define LAYOUT_LAYER_NAV \
+ ________________HOME_ROW_NA________________, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, \
+ ______________HOME_ROW_GASC_L______________, U_NU, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, \
+ ______________HOME_ROW_ALGR_L______________, U_NU, U_NU, U_NU, U_NU, U_NU, \
+ U_NA, U_NA, KC_MSTP, KC_MPLY
+
+// Mouse.
+#define LAYOUT_LAYER_MOUSE \
+ S_D_MOD, USR_PST, USR_CPY, USR_CUT, USR_UND, USR_RDO, USR_PST, USR_CPY, USR_CUT, USR_UND, \
+ DPI_MOD, DRGSCRL, KC_LSFT, DRGSCRL, _______, U_NU, MS_L, MS_D, MS_U, MS_R, \
+ USR_RDO, USR_PST, USR_CPY, KC_BTN3, USR_UND, U_NU, WH_L, WH_D, WH_U, WH_R, \
+ KC_BTN1, KC_BTN2, KC_BTN1, KC_BTN3
+
+// Symbols.
+#define LAYOUT_LAYER_SYM \
+ KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, ________________HOME_ROW_NA________________, \
+ KC_COLN, KC_DLR, KC_PERC, KC_CIRC, KC_PLUS, ______________HOME_ROW_GASC_R______________, \
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_MINS, ______________HOME_ROW_ALGR_R______________, \
+ KC_RPRN, KC_LPRN, U_NA, U_NA
+
+// Numerals.
+#define LAYOUT_LAYER_NUM \
+ KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, ________________HOME_ROW_NA________________, \
+ KC_SCLN, KC_4, KC_5, KC_6, KC_EQL, ______________HOME_ROW_GASC_R______________, \
+ KC_GRV, KC_1, KC_2, KC_3, KC_UNDS, ______________HOME_ROW_ALGR_R______________, \
+ KC_0, KC_MINS, U_NA, U_NA
+
+// Function keys.
+#define LAYOUT_LAYER_FUN \
+ KC_F12, KC_F7, KC_F8, KC_F9, KC_PSCR, ________________HOME_ROW_NA________________, \
+ KC_F11, KC_F4, KC_F5, KC_F6, KC_SCRL, ______________HOME_ROW_GASC_R______________, \
+ KC_F10, KC_F1, KC_F2, KC_F3, KC_PAUS, ______________HOME_ROW_ALGR_R______________,\
+ KC_APP, KC_TAB, U_NA, U_NA
+
+/**
+ * Add Home Row mod to a layout.
+ *
+ * Expects a 10-key per row layout. Adds support for GASC (Gui, Alt, Shift, Ctl)
+ * home row. The layout passed in parameter must contain at least 20 keycodes.
+ *
+ * This is meant to be used with `LAYOUT_LAYER_BASE_BEPO` defined above, eg.:
+ *
+ * HOME_ROW_MOD_GASC(LAYOUT_LAYER_BASE_BEPO)
+ */
+#define _HOME_ROW_MOD_GASC( \
+ L00, L01, L02, L03, L04, R05, R06, R07, R08, R09, \
+ L10, L11, L12, L13, L14, R15, R16, R17, R18, R19, \
+ ...) \
+ L00, L01, L02, L03, L04, \
+ R05, R06, R07, R08, R09, \
+ LGUI_T(L10), LALT_T(L11), LSFT_T(L12), LCTL_T(L13), L14, \
+ R15, RCTL_T(R16), RSFT_T(R17), LALT_T(R18), RGUI_T(R19), \
+ __VA_ARGS__
+#define HOME_ROW_MOD_GASC(...) _HOME_ROW_MOD_GASC(__VA_ARGS__)
+
+/**
+ * Add mouse layer keys to a layout.
+ *
+ * Expects a 10-key per row layout. The layout passed in parameter must contain
+ * at least 30 keycodes.
+ *
+ * This is meant to be used with `LAYOUT_LAYER_BASE_BEPO` defined above, eg.:
+ *
+ * MOUSE_MOD(LAYOUT_LAYER_BASE_BEPO)
+ */
+#define _MOUSE_MOD( \
+ L00, L01, L02, L03, L04, R05, R06, R07, R08, R09, \
+ L10, L11, L12, L13, L14, R15, R16, R17, R18, R19, \
+ L20, L21, L22, L23, L24, R25, R26, R27, R28, R29, \
+ ...) \
+ L00, L01, L02, L03, L04, \
+ R05, R06, R07, R08, R09, \
+ L10, L11, L12, L13, L14, \
+ R15, R16, R17, R18, R19, \
+ L20, MOUSE(L21), L22, L23, L24, \
+ R25, R26, R27, R28, MOUSE(R29), \
+ __VA_ARGS__
+#define MOUSE_MOD(...) _MOUSE_MOD(__VA_ARGS__)
+
+#define LAYOUT_wrapper(...) LAYOUT_split_3x5_2(__VA_ARGS__)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [LAYER_BASE] = LAYOUT_wrapper(
+ MOUSE_MOD(HOME_ROW_MOD_GASC(LAYOUT_LAYER_BASE_BEPO))
+ ),
+ [LAYER_MBO] = LAYOUT_wrapper(LAYOUT_LAYER_MBO),
+ [LAYER_MEDIA] = LAYOUT_wrapper(LAYOUT_LAYER_MEDIA),
+ [LAYER_NAV] = LAYOUT_wrapper(LAYOUT_LAYER_NAV),
+ [LAYER_MOUSE] = LAYOUT_wrapper(LAYOUT_LAYER_MOUSE),
+ [LAYER_SYM] = LAYOUT_wrapper(LAYOUT_LAYER_SYM),
+ [LAYER_NUM] = LAYOUT_wrapper(LAYOUT_LAYER_NUM),
+ [LAYER_FUN] = LAYOUT_wrapper(LAYOUT_LAYER_FUN),
+};
+// clang-format on
+
+#if defined(POINTING_DEVICE_ENABLE) && defined(DILEMMA_AUTO_SNIPING_ON_LAYER)
+layer_state_t layer_state_set_kb(layer_state_t state) {
+ state = layer_state_set_user(state);
+ dilemma_set_pointer_sniping_enabled(layer_state_cmp(state, DILEMMA_AUTO_SNIPING_ON_LAYER));
+ return state;
+}
+#endif // POINTING_DEVICE_ENABLE && DILEMMA_AUTO_SNIPING_ON_LAYER
+
+#ifdef RGB_MATRIX_ENABLE
+// Forward-declare this helper function since it is defined in rgb_matrix.c.
+void rgb_matrix_update_pwm_buffers(void);
+#endif
+
+void shutdown_user(void) {
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable_noeeprom();
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
+ rgblight_setrgb(RGB_RED);
+#endif // RGBLIGHT_ENABLE
+#ifdef RGB_MATRIX_ENABLE
+ rgb_matrix_set_color_all(RGB_RED);
+ rgb_matrix_update_pwm_buffers();
+#endif // RGB_MATRIX_ENABLE
+}
diff --git a/keyboards/bastardkb/dilemma/3x5_2/keymaps/bstiq/readme.md b/keyboards/bastardkb/dilemma/3x5_2/keymaps/bstiq/readme.md
new file mode 100644
index 0000000000..df1f43cbcb
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/keymaps/bstiq/readme.md
@@ -0,0 +1,3 @@
+# Dilemma @bstiq keymap
+
+Inspired from Miryoku, using home-rows.
diff --git a/keyboards/bastardkb/dilemma/3x5_2/keymaps/default/keymap.c b/keyboards/bastardkb/dilemma/3x5_2/keymaps/default/keymap.c
new file mode 100644
index 0000000000..0f9aff0a85
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/keymaps/default/keymap.c
@@ -0,0 +1,84 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include QMK_KEYBOARD_H
+
+enum charybdis_keymap_layers {
+ LAYER_BASE = 0,
+ LAYER_NAV,
+ LAYER_SYM,
+ LAYER_NUM,
+};
+
+#define NAV MO(LAYER_NAV)
+#define SYM MO(LAYER_SYM)
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [LAYER_BASE] = LAYOUT_split_3x5_2(
+ // ╭─────────────────────────────────────────────╮ ╭─────────────────────────────────────────────╮
+ KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
+ // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
+ KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,
+ // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
+ KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH,
+ // ╰─────────────────────────────────────────────┤ ├─────────────────────────────────────────────╯
+ NAV, CW_TOGG, KC_SPC, SYM
+ // ╰──────────────────╯ ╰──────────────────╯
+ ),
+
+ [LAYER_NAV] = LAYOUT_split_3x5_2(
+ // ╭─────────────────────────────────────────────╮ ╭─────────────────────────────────────────────╮
+ KC_TAB, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, XXXXXXX, KC_HOME, KC_UP, KC_END, KC_DEL,
+ // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
+ KC_LSFT, KC_LCTL, KC_LALT, KC_RGUI, KC_VOLD, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_BSPC,
+ // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
+ QK_BOOT, EE_CLR, KC_MPRV, KC_MNXT, KC_MPLY, XXXXXXX, KC_PGDN, KC_PGUP, XXXXXXX, KC_ENT,
+ // ╰─────────────────────────────────────────────┤ ├─────────────────────────────────────────────╯
+ _______, KC_LSFT, KC_SPC, _______
+ // ╰──────────────────╯ ╰──────────────────╯
+ ),
+
+ [LAYER_SYM] = LAYOUT_split_3x5_2(
+ // ╭─────────────────────────────────────────────╮ ╭─────────────────────────────────────────────╮
+ KC_ESC, KC_LBRC, KC_LCBR, KC_LPRN, KC_TILD, KC_CIRC, KC_RPRN, KC_RCBR, KC_RBRC, KC_GRV,
+ // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
+ KC_MINS, KC_ASTR, KC_EQL, KC_UNDS, KC_DLR, KC_HASH, KC_RGUI, KC_RALT, KC_RCTL, KC_RSFT,
+ // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
+ KC_PLUS, KC_PIPE, KC_AT, KC_SLSH, KC_PERC, _______, KC_BSLS, KC_AMPR, KC_QUES, KC_EXLM,
+ // ╰─────────────────────────────────────────────┤ ├─────────────────────────────────────────────╯
+ _______, KC_LSFT, KC_SPC, _______
+ // ╰──────────────────╯ ╰──────────────────╯
+ ),
+
+ [LAYER_NUM] = LAYOUT_split_3x5_2(
+ // ╭─────────────────────────────────────────────╮ ╭─────────────────────────────────────────────╮
+ KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
+ // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
+ KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, KC_F11, KC_F12, KC_RGUI, KC_RALT, KC_RCTL, KC_RSFT,
+ // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10,
+ // ╰─────────────────────────────────────────────┤ ├─────────────────────────────────────────────╯
+ _______, KC_LSFT, KC_SPC, _______
+ // ╰──────────────────╯ ╰──────────────────╯
+ ),
+};
+// clang-format on
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ return update_tri_layer_state(state, LAYER_NAV, LAYER_SYM, LAYER_NUM);
+}
diff --git a/keyboards/bastardkb/dilemma/3x5_2/keymaps/drashna/config.h b/keyboards/bastardkb/dilemma/3x5_2/keymaps/drashna/config.h
new file mode 100644
index 0000000000..d7b1351d89
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/keymaps/drashna/config.h
@@ -0,0 +1,8 @@
+// Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define CIRQUE_PINNACLE_TAP_ENABLE
+#define POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE
+#define POINTING_DEVICE_GESTURES_SCROLL_ENABLE
diff --git a/keyboards/bastardkb/dilemma/3x5_2/keymaps/drashna/halconf.h b/keyboards/bastardkb/dilemma/3x5_2/keymaps/drashna/halconf.h
new file mode 100644
index 0000000000..135994a43c
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/keymaps/drashna/halconf.h
@@ -0,0 +1,23 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#define HAL_USE_SPI TRUE
+#define HAL_USE_I2C TRUE
+
+#include_next "halconf.h"
diff --git a/keyboards/bastardkb/dilemma/3x5_2/keymaps/drashna/keymap.c b/keyboards/bastardkb/dilemma/3x5_2/keymaps/drashna/keymap.c
new file mode 100644
index 0000000000..d4aa71440d
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/keymaps/drashna/keymap.c
@@ -0,0 +1,176 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "drashna.h"
+
+// clang-format off
+#define LAYOUT_split_3x5_2_wrapper(...) LAYOUT_split_3x5_2(__VA_ARGS__)
+#define LAYOUT_split_3x5_2_base( \
+ K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
+ K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
+ K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \
+ ) \
+ LAYOUT_split_3x5_2 ( \
+ K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
+ ALT_T(K11), K12, K13, K14, GUI_T(K15), LGUI_T(K16), K17, K18, K19, LALT_T(K1A), \
+ CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, RCTL_T(K2A), \
+ KC_SPC, BK_LWER, DL_RAIS, RSFT_T(KC_ENT) \
+ )
+
+#define LAYOUT_split_3x5_2_base_wrapper(...) LAYOUT_split_3x5_2_base(__VA_ARGS__)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_DEFAULT_LAYER_1] = LAYOUT_split_3x5_2_base_wrapper(
+ _________________QWERTY_L1_________________, _________________QWERTY_R1_________________,
+ _________________QWERTY_L2_________________, _________________QWERTY_R2_________________,
+ _________________QWERTY_L3_________________, _________________QWERTY_R3_________________
+ ),
+
+ [_DEFAULT_LAYER_2] = LAYOUT_split_3x5_2_base_wrapper(
+ ______________COLEMAK_MOD_DH_L1____________, ______________COLEMAK_MOD_DH_R1____________,
+ ______________COLEMAK_MOD_DH_L2____________, ______________COLEMAK_MOD_DH_R2____________,
+ ______________COLEMAK_MOD_DH_L3____________, ______________COLEMAK_MOD_DH_R3____________
+ ),
+ [_DEFAULT_LAYER_3] = LAYOUT_split_3x5_2_base_wrapper(
+ _________________COLEMAK_L1________________, _________________COLEMAK_R1________________,
+ _________________COLEMAK_L2________________, _________________COLEMAK_R2________________,
+ _________________COLEMAK_L3________________, _________________COLEMAK_R3________________
+ ),
+
+ [_DEFAULT_LAYER_4] = LAYOUT_split_3x5_2_base_wrapper(
+ _________________DVORAK_L1_________________, _________________DVORAK_R1_________________,
+ _________________DVORAK_L2_________________, _________________DVORAK_R2_________________,
+ _________________DVORAK_L3_________________, _________________DVORAK_R3_________________
+ ),
+
+ [_MOUSE] = LAYOUT_split_3x5_2(
+ _______, _______, _______, _______, _______, KC_WH_U, DPI_RMOD,DPI_MOD, S_D_RMOD,S_D_MOD,
+ _______, _______, _______, _______, _______, KC_WH_D, KC_BTN1, KC_BTN3, KC_BTN2, KC_BTN6,
+ _______, _______, _______, _______, _______, KC_BTN7, KC_BTN4, KC_BTN5, KC_BTN8, _______,
+ SNIPING, _______, _______, _______
+ ),
+ [_LOWER] = LAYOUT_split_3x5_2_wrapper(
+ _________________LOWER_L1__________________, _________________LOWER_R1__________________,
+ _________________LOWER_L2__________________, _________________LOWER_R2__________________,
+ _________________LOWER_L3__________________, _________________LOWER_R3__________________,
+ _______, _______, _______, AUTO_CTN
+ ),
+ [_RAISE] = LAYOUT_split_3x5_2_wrapper(
+ _________________RAISE_L1__________________, _________________RAISE_R1__________________,
+ _________________RAISE_L2__________________, _________________RAISE_R2__________________,
+ _________________RAISE_L3__________________, _________________RAISE_R3__________________,
+ _______, _______, _______, _______
+ ),
+ [_ADJUST] = LAYOUT_split_3x5_2_wrapper(
+ _________________ADJUST_L1_________________, _________________ADJUST_R1_________________,
+ _________________ADJUST_L2_________________, _________________ADJUST_R2_________________,
+ _________________ADJUST_L3_________________, _________________ADJUST_R3_________________,
+ KC_NUKE, _______, _______, QK_BOOT
+ ),
+};
+
+
+void matrix_output_unselect_delay(uint8_t line, bool key_pressed) {
+ for (int32_t i = 0; i < 40; i++) {
+ __asm__ volatile("nop" ::: "memory");
+ }
+}
+
+
+#if defined(OLED_ENABLE) && defined(OLED_DISPLAY_128X128)
+# ifdef UNICODE_COMMON_ENABLE
+# include "process_unicode_common.h"
+# include "keyrecords/unicode.h"
+# endif
+
+extern const char PROGMEM display_border[3];
+
+
+extern uint32_t oled_timer;
+extern bool is_oled_enabled;
+
+
+bool oled_task_keymap(void) {
+ static const char PROGMEM header_image[] = {
+ 0, 192, 32, 16, 8, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 7, 15, 31, 63, 127, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 63, 31, 15, 7, 3, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 8, 16, 32, 192, 0,
+ // 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 7, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 7, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0
+ };
+ oled_write_raw_P(header_image, sizeof(header_image));
+ oled_set_cursor(7, 0);
+ oled_write_P(PSTR("Dilemma"), true);
+
+ render_default_layer_state(1, 1);
+ render_layer_state(1, 2);
+ render_kitty(0, 5);
+ render_wpm(1, 7, 5);
+# if defined(POINTING_DEVICE_ENABLE)
+ render_pointing_dpi_status(dilemma_get_pointer_sniping_enabled() ? dilemma_get_pointer_sniping_dpi() : dilemma_get_pointer_default_dpi(), 1, 7, 6);
+ render_mouse_mode(17, 6);
+# elif defined(WPM_ENABLE) && defined(DEBUG_MATRIX_SCAN_RATE)
+ render_matrix_scan_rate(1, 7, 6);
+# endif
+ render_bootmagic_status(7, 7);
+ render_user_status(1, 9);
+
+ render_mod_status(get_mods() | get_oneshot_mods(), 1, 10);
+ render_keylock_status(host_keyboard_led_state(), 1, 11);
+ render_unicode_mode(1, 12);
+
+// render_rgb_hsv(1, 13);
+ oled_set_cursor(1, 13);
+ // oled_write_P(PSTR("Timer:"), false);
+ // oled_write(get_u8_str((uint8_t)(timer_elapsed32(oled_timer) / 1000), ' '), false);
+ oled_write_P(PSTR("Status: "), false);
+ if (is_oled_enabled) {
+ oled_write_P(PSTR("on "), false);
+ } else {
+ oled_write_P(PSTR("off"), false);
+ }
+
+ render_keylogger_status(1, 14);
+
+ for (uint8_t i = 1; i < 15; i++) {
+ oled_set_cursor(0, i);
+ oled_write_raw_P(display_border, sizeof(display_border));
+ oled_set_cursor(21, i);
+ oled_write_raw_P(display_border, sizeof(display_border));
+ }
+
+ static const char PROGMEM footer_image[] = {0, 3, 4, 8, 16, 32, 64, 128, 128, 128, 128, 128, 128, 128, 192, 224, 240, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 240, 224, 192, 128, 128, 128, 128, 128, 128, 128, 64, 32, 16, 8, 4, 3, 0};
+ oled_set_cursor(0, 15);
+ oled_write_raw_P(footer_image, sizeof(footer_image));
+
+ return false;
+}
+#endif
+
+
+#ifdef SWAP_HANDS_ENABLE
+const keypos_t PROGMEM hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
+ /* Left hand, matrix positions */
+ {{0, 4}, {3, 4}, {2, 4}, {5, 4}, {4, 4}},
+ {{0, 5}, {1, 5}, {2, 5}, {3, 5}, {4, 5}},
+ {{0, 6}, {1, 6}, {2, 6}, {3, 6}, {4, 6}},
+ {{0, 7}, {1, 7}, {2, 7}, {3, 7}, {4, 7}},
+ /* Right hand, matrix positions */
+ {{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}},
+ {{0, 1}, {1, 1}, {2, 1}, {3, 1}, {4, 1}},
+ {{0, 2}, {1, 2}, {2, 2}, {3, 2}, {4, 2}},
+ {{0, 3}, {1, 3}, {2, 3}, {3, 3}, {4, 3}},
+ };
+#endif
diff --git a/keyboards/bastardkb/dilemma/3x5_2/keymaps/drashna/mcuconf.h b/keyboards/bastardkb/dilemma/3x5_2/keymaps/drashna/mcuconf.h
new file mode 100644
index 0000000000..f9aa894665
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/keymaps/drashna/mcuconf.h
@@ -0,0 +1,26 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include_next "mcuconf.h"
+
+#undef RP_SPI_USE_SPI1
+#define RP_SPI_USE_SPI1 TRUE
+
+#undef RP_I2C_USE_I2C1
+#define RP_I2C_USE_I2C1 TRUE
diff --git a/keyboards/bastardkb/dilemma/3x5_2/keymaps/drashna/rules.mk b/keyboards/bastardkb/dilemma/3x5_2/keymaps/drashna/rules.mk
new file mode 100644
index 0000000000..41d73bc49a
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/keymaps/drashna/rules.mk
@@ -0,0 +1,8 @@
+SWAP_HANDS_ENABLE = no
+AUTOCORRECT_ENABLE = yes
+CAPS_WORD_ENABLE = yes
+CONSOLE_ENABLE = yes
+KEYLOGGER_ENABLE = no
+WPM_ENABLE = yes
+OLED_ENABLE = yes
+OLED_DRIVER = custom
diff --git a/keyboards/bastardkb/dilemma/3x5_2/keymaps/via/config.h b/keyboards/bastardkb/dilemma/3x5_2/keymaps/via/config.h
new file mode 100644
index 0000000000..5bfac4b6c5
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/keymaps/via/config.h
@@ -0,0 +1,43 @@
+/**
+ * Copyright 2021 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+
+#ifdef VIA_ENABLE
+/* VIA configuration. */
+# define DYNAMIC_KEYMAP_LAYER_COUNT 6
+#endif // VIA_ENABLE
+
+/**
+ * \brief Prevent normal rollover on alphas from accidentally triggering mods.
+ *
+ * Ignores key presses that interrupt a mod-tap. Must-have for Home Row mod.
+ *
+ * Without `IGNORE_MOD_TAP_INTERRUPT`, within `TAPPING_TERM`:
+ * Mod(a)🠗 e🠗 Mod(a)🠕 e🠕 ➞ Mod+e
+ * With `IGNORE_MOD_TAP_INTERRUPT`, within `TAPPING_TERM`:
+ * Mod(a)🠗 e🠗 Mod(a)🠕 e🠕 ➞ ae
+ */
+#define IGNORE_MOD_TAP_INTERRUPT
+
+/* Charybdis-specific features. */
+
+#ifdef POINTING_DEVICE_ENABLE
+// Automatically enable the pointer layer when moving the trackball. See also:
+// - `DILEMMA_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS`
+// - `DILEMMA_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD`
+// #define DILEMMA_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+#endif // POINTING_DEVICE_ENABLE
diff --git a/keyboards/bastardkb/dilemma/3x5_2/keymaps/via/keymap.c b/keyboards/bastardkb/dilemma/3x5_2/keymaps/via/keymap.c
new file mode 100644
index 0000000000..b3aeaf014f
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/keymaps/via/keymap.c
@@ -0,0 +1,229 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include QMK_KEYBOARD_H
+
+#ifdef DILEMMA_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+# include "timer.h"
+#endif // DILEMMA_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+
+enum dilemma_keymap_layers {
+ LAYER_BASE = 0,
+ LAYER_FUNCTION,
+ LAYER_NAVIGATION,
+ LAYER_POINTER,
+ LAYER_NUMERAL,
+ LAYER_SYMBOLS,
+};
+
+// Automatically enable sniping-mode on the pointer layer.
+#define DILEMMA_AUTO_SNIPING_ON_LAYER LAYER_POINTER
+
+#ifdef DILEMMA_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+static uint16_t auto_pointer_layer_timer = 0;
+
+# ifndef DILEMMA_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS
+# define DILEMMA_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS 1000
+# endif // DILEMMA_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS
+
+# ifndef DILEMMA_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD
+# define DILEMMA_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD 8
+# endif // DILEMMA_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD
+#endif // DILEMMA_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+
+#define SPC_NAV LT(LAYER_NAVIGATION, KC_SPC)
+#define TAB_FUN LT(LAYER_FUNCTION, KC_TAB)
+#define ENT_SYM LT(LAYER_SYMBOLS, KC_ENT)
+#define BSP_NUM LT(LAYER_NUMERAL, KC_BSPC)
+#define _L_PTR(KC) LT(LAYER_POINTER, KC)
+
+#ifndef POINTING_DEVICE_ENABLE
+# define DRGSCRL KC_NO
+# define DPI_MOD KC_NO
+# define S_D_MOD KC_NO
+# define SNIPING KC_NO
+#endif // !POINTING_DEVICE_ENABLE
+
+// clang-format off
+/** \brief QWERTY layout (3 rows, 10 columns). */
+#define LAYOUT_LAYER_BASE \
+ KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \
+ KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, \
+ KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, \
+ TAB_FUN, SPC_NAV, ENT_SYM, BSP_NUM
+
+/** Convenience row shorthands. */
+#define _______________DEAD_HALF_ROW_______________ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+#define ______________HOME_ROW_GACS_L______________ KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX
+#define ______________HOME_ROW_GACS_R______________ XXXXXXX, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI
+
+/*
+ * Layers used on the Dilemma.
+ *
+ * These layers started off heavily inspired by the Miryoku layout, but trimmed
+ * down and tailored for a stock experience that is meant to be fundation for
+ * further personalization.
+ *
+ * See https://github.com/manna-harbour/miryoku for the original layout.
+ */
+
+/**
+ * \brief Function layer.
+ *
+ * Secondary right-hand layer has function keys mirroring the numerals on the
+ * primary layer with extras on the pinkie column, plus system keys on the inner
+ * column. App is on the tertiary thumb key and other thumb keys are duplicated
+ * from the base layer to enable auto-repeat.
+ */
+#define LAYOUT_LAYER_FUNCTION \
+ _______________DEAD_HALF_ROW_______________, KC_PSCR, KC_F7, KC_F8, KC_F9, KC_F12, \
+ ______________HOME_ROW_GACS_L______________, KC_SCRL, KC_F4, KC_F5, KC_F6, KC_F11, \
+ _______________DEAD_HALF_ROW_______________, KC_PAUS, KC_F1, KC_F2, KC_F3, KC_F10, \
+ _______, XXXXXXX, XXXXXXX, XXXXXXX
+
+/** \brief Mouse emulation and pointer functions. */
+#define LAYOUT_LAYER_POINTER \
+ QK_BOOT, XXXXXXX, XXXXXXX, DPI_MOD, S_D_MOD, S_D_MOD, DPI_MOD, XXXXXXX, XXXXXXX, QK_BOOT, \
+ ______________HOME_ROW_GACS_L______________, ______________HOME_ROW_GACS_R______________, \
+ _______, DRGSCRL, SNIPING, KC_BTN3, XXXXXXX, XXXXXXX, KC_BTN3, SNIPING, DRGSCRL, _______, \
+ KC_BTN2, KC_BTN1, KC_BTN1, KC_BTN2
+
+/**
+ * \brief Navigation layer.
+ *
+ * Primary right-hand layer (left home thumb) is navigation and editing. Cursor
+ * keys are on the home position, line and page movement below, clipboard above,
+ * caps lock and insert on the inner column. Thumb keys are duplicated from the
+ * base layer to avoid having to layer change mid edit and to enable auto-repeat.
+ */
+#define LAYOUT_LAYER_NAVIGATION \
+ _______________DEAD_HALF_ROW_______________, _______________DEAD_HALF_ROW_______________, \
+ ______________HOME_ROW_GACS_L______________, KC_CAPS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, \
+ _______________DEAD_HALF_ROW_______________, KC_INS, KC_HOME, KC_PGDN, KC_PGUP, KC_END, \
+ XXXXXXX, _______, KC_ENT, KC_BSPC
+
+/**
+ * \brief Numeral layout.
+ *
+ * Primary left-hand layer (right home thumb) is numerals and symbols. Numerals
+ * are in the standard numpad locations with symbols in the remaining positions.
+ * `KC_DOT` is duplicated from the base layer.
+ */
+#define LAYOUT_LAYER_NUMERAL \
+ KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, _______________DEAD_HALF_ROW_______________, \
+ KC_SCLN, KC_4, KC_5, KC_6, KC_EQL, ______________HOME_ROW_GACS_R______________, \
+ KC_DOT, KC_1, KC_2, KC_3, KC_BSLS, _______________DEAD_HALF_ROW_______________, \
+ KC_MINS, KC_0, XXXXXXX, _______
+
+/**
+ * \brief Symbols layer.
+ *
+ * Secondary left-hand layer has shifted symbols in the same locations to reduce
+ * chording when using mods with shifted symbols. `KC_LPRN` is duplicated next to
+ * `KC_RPRN`.
+ */
+#define LAYOUT_LAYER_SYMBOLS \
+ KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, _______________DEAD_HALF_ROW_______________, \
+ KC_COLN, KC_DLR, KC_PERC, KC_CIRC, KC_PLUS, ______________HOME_ROW_GACS_R______________, \
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_PIPE, _______________DEAD_HALF_ROW_______________, \
+ KC_GRV, KC_UNDS, _______, XXXXXXX
+
+/**
+ * \brief Add Home Row mod to a layout.
+ *
+ * Expects a 10-key per row layout. Adds support for GACS (Gui, Alt, Ctl, Shift)
+ * home row. The layout passed in parameter must contain at least 20 keycodes.
+ *
+ * This is meant to be used with `LAYER_ALPHAS_QWERTY` defined above, eg.:
+ *
+ * HOME_ROW_MOD_GACS(LAYER_ALPHAS_QWERTY)
+ */
+#define _HOME_ROW_MOD_GACS( \
+ L00, L01, L02, L03, L04, R05, R06, R07, R08, R09, \
+ L10, L11, L12, L13, L14, R15, R16, R17, R18, R19, \
+ ...) \
+ L00, L01, L02, L03, L04, \
+ R05, R06, R07, R08, R09, \
+ LGUI_T(L10), LALT_T(L11), LCTL_T(L12), LSFT_T(L13), L14, \
+ R15, RSFT_T(R16), RCTL_T(R17), LALT_T(R18), RGUI_T(R19), \
+ __VA_ARGS__
+#define HOME_ROW_MOD_GACS(...) _HOME_ROW_MOD_GACS(__VA_ARGS__)
+
+/**
+ * \brief Add pointer layer keys to a layout.
+ *
+ * Expects a 10-key per row layout. The layout passed in parameter must contain
+ * at least 30 keycodes.
+ *
+ * This is meant to be used with `LAYER_ALPHAS_QWERTY` defined above, eg.:
+ *
+ * POINTER_MOD(LAYER_ALPHAS_QWERTY)
+ */
+#define _POINTER_MOD( \
+ L00, L01, L02, L03, L04, R05, R06, R07, R08, R09, \
+ L10, L11, L12, L13, L14, R15, R16, R17, R18, R19, \
+ L20, L21, L22, L23, L24, R25, R26, R27, R28, R29, \
+ ...) \
+ L00, L01, L02, L03, L04, \
+ R05, R06, R07, R08, R09, \
+ L10, L11, L12, L13, L14, \
+ R15, R16, R17, R18, R19, \
+ _L_PTR(L20), L21, L22, L23, L24, \
+ R25, R26, R27, R28, _L_PTR(R29), \
+ __VA_ARGS__
+#define POINTER_MOD(...) _POINTER_MOD(__VA_ARGS__)
+
+#define LAYOUT_wrapper(...) LAYOUT_split_3x5_2(__VA_ARGS__)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [LAYER_BASE] = LAYOUT_wrapper(
+ POINTER_MOD(HOME_ROW_MOD_GACS(LAYOUT_LAYER_BASE))
+ ),
+ [LAYER_FUNCTION] = LAYOUT_wrapper(LAYOUT_LAYER_FUNCTION),
+ [LAYER_NAVIGATION] = LAYOUT_wrapper(LAYOUT_LAYER_NAVIGATION),
+ [LAYER_NUMERAL] = LAYOUT_wrapper(LAYOUT_LAYER_NUMERAL),
+ [LAYER_POINTER] = LAYOUT_wrapper(LAYOUT_LAYER_POINTER),
+ [LAYER_SYMBOLS] = LAYOUT_wrapper(LAYOUT_LAYER_SYMBOLS),
+};
+// clang-format on
+
+#ifdef POINTING_DEVICE_ENABLE
+# ifdef DILEMMA_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) {
+ if (abs(mouse_report.x) > DILEMMA_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD || abs(mouse_report.y) > DILEMMA_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD) {
+ if (auto_pointer_layer_timer == 0) {
+ layer_on(LAYER_POINTER);
+ }
+ auto_pointer_layer_timer = timer_read();
+ }
+ return mouse_report;
+}
+
+void matrix_scan_user(void) {
+ if (auto_pointer_layer_timer != 0 && TIMER_DIFF_16(timer_read(), auto_pointer_layer_timer) >= DILEMMA_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS) {
+ auto_pointer_layer_timer = 0;
+ layer_off(LAYER_POINTER);
+ }
+}
+# endif // DILEMMA_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+
+# ifdef DILEMMA_AUTO_SNIPING_ON_LAYER
+layer_state_t layer_state_set_user(layer_state_t state) {
+ dilemma_set_pointer_sniping_enabled(layer_state_cmp(state, DILEMMA_AUTO_SNIPING_ON_LAYER));
+ return state;
+}
+# endif // DILEMMA_AUTO_SNIPING_ON_LAYER
+#endif // POINTING_DEVICE_ENABLE
diff --git a/keyboards/bastardkb/dilemma/3x5_2/keymaps/via/readme.md b/keyboards/bastardkb/dilemma/3x5_2/keymaps/via/readme.md
new file mode 100644
index 0000000000..df40677f4d
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/keymaps/via/readme.md
@@ -0,0 +1,67 @@
+# Dilemma `via` keymap
+
+The Dilemma `via` keymap is based on a QWERTY layout with [home row mods](https://precondition.github.io/home-row-mods) and [Miryoku-inspired layers](https://github.com/manna-harbour/miryoku), and some features and changes specific to the Dilemma.
+
+This layout also supports VIA.
+
+## Customizing the keymap
+
+### Dynamic DPI scaling
+
+Use the following keycodes to change the default DPI:
+
+- `POINTER_DEFAULT_DPI_FORWARD`: increases the DPI; decreases when shifted;
+- `POINTER_DEFAULT_DPI_REVERSE`: decreases the DPI; increases when shifted.
+
+There's a maximum of 16 possible values for the sniping mode DPI. See the [Dilemma documentation](../../README.md) for more information.
+
+Use the following keycodes to change the sniping mode DPI:
+
+- `POINTER_SNIPING_DPI_FORWARD`: increases the DPI; decreases when shifted;
+- `POINTER_SNIPING_DPI_REVERSE`: decreases the DPI; increases when shifted.
+
+There's a maximum of 4 possible values for the sniping mode DPI. See the [Dilemma documentation](../../README.md) for more information.
+
+### Drag-scroll
+
+Use the `DRAGSCROLL_MODE` keycode to enable drag-scroll on hold. Use the `DRAGSCROLL_TOGGLE` keycode to enable/disable drag-scroll on key press.
+
+### Circular scroll
+
+By default, the firmware is configured to enable the circular scroll feature on Cirque trackpad.
+
+To disable this, add the following to your keymap:
+
+```c
+#undef POINTING_DEVICE_GESTURES_SCROLL_ENABLE
+```
+
+### Sniping
+
+Use the `SNIPING_MODE` keycode to enable sniping mode on hold. Use the `SNIPING_TOGGLE` keycode to enable/disable sniping mode on key press.
+
+Change the value of `DILEMMA_AUTO_SNIPING_ON_LAYER` to automatically enable sniping mode on layer change. By default, sniping mode is enabled on the pointer layer:
+
+```c
+#define DILEMMA_AUTO_SNIPING_ON_LAYER LAYER_POINTER
+```
+
+### Auto pointer layer
+
+The pointer layer can be automatically enabled when moving the trackball. To enable or disable this behavior, add or remove the following define:
+
+```c
+#define DILEMMA_AUTO_POINTER_LAYER_TRIGGER_ENABLE
+```
+
+By default, the layer is turned off 1 second after the last registered trackball movement:
+
+```c
+#define DILEMMA_AUTO_POINTER_LAYER_TRIGGER_TIMEOUT_MS 1000
+```
+
+The trigger sensibility can also be tuned. The lower the value, the more sensible the trigger:
+
+```c
+#define DILEMMA_AUTO_POINTER_LAYER_TRIGGER_THRESHOLD 8
+```
diff --git a/keyboards/bastardkb/dilemma/3x5_2/keymaps/via/rules.mk b/keyboards/bastardkb/dilemma/3x5_2/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/bastardkb/dilemma/3x5_2/splinky/config.h b/keyboards/bastardkb/dilemma/3x5_2/splinky/config.h
new file mode 100644
index 0000000000..4ac28ed1f9
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/splinky/config.h
@@ -0,0 +1,46 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { GP4, GP5, GP28, GP26 }
+#define MATRIX_COL_PINS \
+ { GP8, GP9, GP7, GP6, GP27 }
+
+/* Handedness. */
+#define MASTER_RIGHT
+
+// To use the handedness pin, resistors need to be installed on the PCB.
+// If so, uncomment the following code, and undefine MASTER_RIGHT above.
+//#define SPLIT_HAND_PIN GP29
+// If you've soldered the handedness pull-up on the upper side instead of the
+// left one, uncomment the following line.
+//#define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left.
+
+/* serial.c configuration (for split keyboard). */
+#define SOFT_SERIAL_PIN GP1
+
+/* CRC. */
+#define CRC8_USE_TABLE
+#define CRC8_OPTIMIZE_SPEED
+
+/* Reset. */
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U
diff --git a/keyboards/bastardkb/dilemma/3x5_2/splinky/halconf.h b/keyboards/bastardkb/dilemma/3x5_2/splinky/halconf.h
new file mode 100644
index 0000000000..a4c25c090a
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/splinky/halconf.h
@@ -0,0 +1,21 @@
+/* Copyright 2022 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#define HAL_USE_I2C TRUE
+
+#include_next "halconf.h"
diff --git a/keyboards/bastardkb/dilemma/3x5_2/splinky/info.json b/keyboards/bastardkb/dilemma/3x5_2/splinky/info.json
new file mode 100644
index 0000000000..38ce4738f9
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/splinky/info.json
@@ -0,0 +1,3 @@
+{
+ "keyboard_name": "Dilemma (3x5+2) Splinky"
+}
diff --git a/keyboards/bastardkb/dilemma/3x5_2/splinky/mcuconf.h b/keyboards/bastardkb/dilemma/3x5_2/splinky/mcuconf.h
new file mode 100644
index 0000000000..5e47eac54f
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/splinky/mcuconf.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include_next "mcuconf.h"
+
+#undef RP_I2C_USE_I2C1
+#define RP_I2C_USE_I2C1 TRUE
diff --git a/keyboards/bastardkb/dilemma/3x5_2/splinky/rules.mk b/keyboards/bastardkb/dilemma/3x5_2/splinky/rules.mk
new file mode 100644
index 0000000000..292b71fe8b
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_2/splinky/rules.mk
@@ -0,0 +1,34 @@
+# MCU name
+MCU = RP2040
+
+# Bootloader selection
+BOOTLOADER = rp2040
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported
+RGB_MATRIX_SUPPORTED = no # RGB matrix is supported and enabled by default
+RGBLIGHT_SUPPORTED = no # RGB underglow is supported, but not enabled by default
+RGB_MATRIX_ENABLE = no # Enable keyboard RGB matrix functionality
+
+SERIAL_DRIVER = vendor
+
+POINTING_DEVICE_ENABLE = yes
+POINTING_DEVICE_DRIVER = cirque_pinnacle_i2c # DIY version uses I2C.
+
+SPLIT_KEYBOARD = yes
+LAYOUTS = split_3x5_2
+
+# RP2040-specific options
+PICO_INTRINSICS_ENABLED = no # ATM Unsupported by ChibiOS.
diff --git a/keyboards/bastardkb/dilemma/3x5_3/3x5_3.c b/keyboards/bastardkb/dilemma/3x5_3/3x5_3.c
new file mode 100644
index 0000000000..0b6c657fda
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_3/3x5_3.c
@@ -0,0 +1,83 @@
+/**
+ * Copyright 2020 Christopher Courtney (@drashna)
+ * Copyright 2021 Quentin LEBASTARD
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Publicw License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "3x5_3.h"
+
+/**
+ * LEDs index.
+ *
+ * ╭────────────────────╮ ╭────────────────────╮
+ * 2 3 8 9 12 30 27 26 21 20
+ * ├────────────────────┤ ├────────────────────┤
+ * 1 4 7 10 13 31 28 25 22 19
+ * ├────────────────────┤ ├────────────────────┤
+ * 0 5 6 11 14 32 29 24 23 18
+ * ╰────────────────────╯ ╰────────────────────╯
+ * 15 16 17 35 34 33
+ * ╰────────────╯ ╰────────────╯
+ */
+// clang-format off
+#ifdef RGB_MATRIX_ENABLE
+led_config_t g_led_config = { {
+ /* Key Matrix to LED index. */
+ // Left split.
+ { 2, 3, 8, 9, 12 }, // Top row
+ { 1, 4, 7, 10, 13 }, // Middle row
+ { 0, 5, 6, 11, 14 }, // Bottom row
+ { 17, NO_LED, 15, 16, NO_LED }, // Thumb cluster
+ // Right split.
+ { 20, 21, 26, 27, 30 }, // Top row
+ { 19, 22, 25, 28, 31 }, // Middle row
+ { 18, 23, 24, 29, 32 }, // Bottom row
+ { 35, NO_LED, 33, 34, NO_LED }, // Thumb cluster
+}, {
+ /* LED index to physical position. */
+ // Left split.
+ /* index=0 */ { 0, 42 }, { 0, 21 }, { 0, 0 }, // col 1 (left most)
+ /* index=3 */ { 18, 0 }, { 18, 21 }, { 18, 42 }, // col 2
+ /* index=6 */ { 36, 42 }, { 36, 21 }, { 36, 0 },
+ /* index=9 */ { 54, 0 }, { 54, 21 }, { 54, 42 },
+ /* index=12 */ { 72, 0 }, { 72, 21 }, { 72, 42 },
+ /* index=15 */ { 72, 64 }, { 90, 64 }, { 108, 64 }, // Thumb cluster
+ // Right split.
+ /* index=18 */ { 224, 42 }, { 224, 21 }, { 224, 0 }, // col 10 (right most)
+ /* index=21 */ { 206, 0 }, { 206, 21 }, { 206, 42 }, // col 9
+ /* index=24 */ { 188, 42 }, { 188, 21 }, { 188, 0 },
+ /* index=27 */ { 170, 0 }, { 170, 21 }, { 170, 42 },
+ /* index=30 */ { 152, 0 }, { 152, 21 }, { 152, 42 },
+ /* index=33 */ { 152, 64 }, { 134, 64 }, { 116, 64 }, // Thumb cluster
+}, {
+ /* LED index to flag. */
+ // Left split.
+ /* index=0 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 1
+ /* index=3 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 2
+ /* index=6 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
+ /* index=9 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
+ /* index=12 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
+ /* index=15 */ LED_FLAG_MODIFIER, LED_FLAG_MODIFIER, LED_FLAG_MODIFIER, // Thumb cluster
+ // Right split.
+ /* index=18 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 10
+ /* index=21 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 9
+ /* index=24 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
+ /* index=27 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
+ /* index=30 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT,
+ /* index=33 */ LED_FLAG_MODIFIER, LED_FLAG_MODIFIER, LED_FLAG_MODIFIER, // Thumb cluster
+} };
+#endif
+// clang-format on
diff --git a/keyboards/bastardkb/dilemma/3x5_3/3x5_3.h b/keyboards/bastardkb/dilemma/3x5_3/3x5_3.h
new file mode 100644
index 0000000000..566d5b81d2
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_3/3x5_3.h
@@ -0,0 +1,39 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include "dilemma.h"
+
+// clang-format off
+#define LAYOUT_split_3x5_3( \
+ k00, k01, k02, k03, k04, k44, k43, k42, k41, k40, \
+ k10, k11, k12, k13, k14, k54, k53, k52, k51, k50, \
+ k20, k21, k22, k23, k24, k64, k63, k62, k61, k60, \
+ k32, k30, k31, k71, k70, k72 \
+) \
+{ \
+ { k00, k01, k02, k03, k04 }, \
+ { k10, k11, k12, k13, k14 }, \
+ { k20, k21, k22, k23, k24 }, \
+ { k30, k31, k32, KC_NO, KC_NO }, \
+ { k40, k41, k42, k43, k44 }, \
+ { k50, k51, k52, k53, k54 }, \
+ { k60, k61, k62, k63, k64 }, \
+ { k70, k71, k72, KC_NO, KC_NO }, \
+}
+// clang-format on
diff --git a/keyboards/bastardkb/dilemma/3x5_3/config.h b/keyboards/bastardkb/dilemma/3x5_3/config.h
new file mode 100644
index 0000000000..985d622fb6
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_3/config.h
@@ -0,0 +1,71 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { GP4, GP5, GP27, GP26 }
+#define MATRIX_COL_PINS \
+ { GP8, GP9, GP7, GP6, GP28 }
+
+/* Handedness. */
+#define SPLIT_HAND_PIN GP29
+#define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left.
+
+/* serial.c configuration (for split keyboard). */
+#define SOFT_SERIAL_PIN GP1
+
+/* RGB settings. */
+#define RGB_DI_PIN GP0 // Per-key.
+// #define RGB_DI_PIN GP10 // Underglow.
+
+/* CRC. */
+#define CRC8_USE_TABLE
+#define CRC8_OPTIMIZE_SPEED
+
+/* Cirque trackpad over SPI. */
+#define SPI_SCK_PIN GP22
+#define SPI_MOSI_PIN GP23
+#define SPI_MISO_PIN GP20
+#define POINTING_DEVICE_CS_PIN GP21
+
+/* OLED over i2c. */
+#define I2C1_CLOCK_SPEED 400000
+#define I2C1_DUTY_CYCLE FAST_DUTY_CYCLE_16_9
+#define OLED_DISPLAY_HEIGHT 128
+
+/* Reset. */
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17
+#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U
+
+/* RGB settings. */
+#define RGBLED_NUM 36
+#define RGBLED_SPLIT \
+ { 18, 18 }
+
+/* RGB matrix support. */
+#ifdef RGB_MATRIX_ENABLE
+# define SPLIT_TRANSPORT_MIRROR
+# define RGB_MATRIX_LED_COUNT RGBLED_NUM
+# define RGB_MATRIX_SPLIT RGBLED_SPLIT
+# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 50
+# define RGB_MATRIX_DEFAULT_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS
+# define RGB_DISABLE_WHEN_USB_SUSPENDED
+# define RGB_MATRIX_KEYPRESSES
+#endif
diff --git a/keyboards/bastardkb/dilemma/3x5_3/halconf.h b/keyboards/bastardkb/dilemma/3x5_3/halconf.h
new file mode 100644
index 0000000000..a3774605a8
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_3/halconf.h
@@ -0,0 +1,23 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#define HAL_USE_I2C TRUE
+#define HAL_USE_SPI TRUE
+
+#include_next "halconf.h"
diff --git a/keyboards/bastardkb/dilemma/3x5_3/info.json b/keyboards/bastardkb/dilemma/3x5_3/info.json
new file mode 100644
index 0000000000..777367903d
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_3/info.json
@@ -0,0 +1,49 @@
+{
+ "keyboard_name": "Dilemma (3x5+3) Assembled",
+ "usb": {
+ "device_version": "2.0.0",
+ "pid": "0x1835"
+ },
+ "layouts": {
+ "LAYOUT_split_3x5_3": {
+ "layout": [
+ { "label": "L00", "x": 0, "y": 0 },
+ { "label": "L01", "x": 1, "y": 0 },
+ { "label": "L02", "x": 2, "y": 0 },
+ { "label": "L03", "x": 3, "y": 0 },
+ { "label": "L04", "x": 4, "y": 0 },
+ { "label": "R00", "x": 11, "y": 0 },
+ { "label": "R01", "x": 12, "y": 0 },
+ { "label": "R02", "x": 13, "y": 0 },
+ { "label": "R03", "x": 14, "y": 0 },
+ { "label": "R04", "x": 15, "y": 0 },
+ { "label": "L10", "x": 0, "y": 1 },
+ { "label": "L11", "x": 1, "y": 1 },
+ { "label": "L12", "x": 2, "y": 1 },
+ { "label": "L13", "x": 3, "y": 1 },
+ { "label": "L14", "x": 4, "y": 1 },
+ { "label": "R10", "x": 11, "y": 1 },
+ { "label": "R11", "x": 12, "y": 1 },
+ { "label": "R12", "x": 13, "y": 1 },
+ { "label": "R13", "x": 14, "y": 1 },
+ { "label": "R14", "x": 15, "y": 1 },
+ { "label": "L20", "x": 0, "y": 2 },
+ { "label": "L21", "x": 1, "y": 2 },
+ { "label": "L22", "x": 2, "y": 2 },
+ { "label": "L23", "x": 3, "y": 2 },
+ { "label": "L24", "x": 4, "y": 2 },
+ { "label": "R20", "x": 11, "y": 2 },
+ { "label": "R21", "x": 12, "y": 2 },
+ { "label": "R22", "x": 13, "y": 2 },
+ { "label": "R23", "x": 14, "y": 2 },
+ { "label": "R24", "x": 15, "y": 2 },
+ { "label": "L32", "x": 4, "y": 3 },
+ { "label": "L33", "x": 5, "y": 3 },
+ { "label": "L34", "x": 6, "y": 3 },
+ { "label": "R32", "x": 11, "y": 3 },
+ { "label": "R33", "x": 10, "y": 3 },
+ { "label": "R34", "x": 9, "y": 3 }
+ ]
+ }
+ }
+}
diff --git a/keyboards/bastardkb/dilemma/3x5_3/keymaps/bstiq/config.h b/keyboards/bastardkb/dilemma/3x5_3/keymaps/bstiq/config.h
new file mode 100644
index 0000000000..139b1f06ea
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_3/keymaps/bstiq/config.h
@@ -0,0 +1,144 @@
+/**
+ * Copyright 2021 Quentin LEBASTARD
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+
+#ifdef VIA_ENABLE
+/* Via configuration. */
+# define DYNAMIC_KEYMAP_LAYER_COUNT 8
+#endif // VIA_ENABLE
+
+/**
+ * Configure the global tapping term (default: 200ms).
+ * If you have a lot of accidental mod activations, crank up the tapping term.
+ */
+#ifndef TAPPING_TERM
+# define TAPPING_TERM 160
+#endif // TAPPING_TERM
+
+// disable trackpad taps
+// #define CIRQUE_PINNACLE_TAPPING_TERM 0
+
+/**
+ * Enable rapid switch from tap to hold. Disable auto-repeat when pressing key
+ * twice, except for one-shot keys.
+ */
+#define TAPPING_FORCE_HOLD
+
+/*
+ * Tap-or-Hold decision modes.
+ *
+ * Note that the following flags behave differently when combined (ie. when 2 or
+ * more are enabled).
+ *
+ * See bit.ly/tap-or-hold for a visual explanation of the following tap-or-hold
+ * decision modes.
+ */
+
+/**
+ * Faster tap-hold trigger.
+ *
+ * Without `PERMISSIVE_HOLD`, within `TAPPING_TERM`:
+ * Mod(a)🠗 e🠗 e🠕 Mod(a)🠕 ➞ ae
+ * With `PERMISSIVE_HOLD`, within `TAPPING_TERM`:
+ * Mod(a)🠗 e🠗 e🠕 Mod(a)🠕 ➞ Mod+e
+ */
+#define PERMISSIVE_HOLD
+
+/**
+ * Prevent normal rollover on alphas from accidentally triggering mods.
+ *
+ * Ignores key presses that interrupt a mod-tap. Must-have for Home Row mod.
+ *
+ * Without `IGNORE_MOD_TAP_INTERRUPT`, within `TAPPING_TERM`:
+ * Mod(a)🠗 e🠗 Mod(a)🠕 e🠕 ➞ Mod+e
+ * With `IGNORE_MOD_TAP_INTERRUPT`, within `TAPPING_TERM`:
+ * Mod(a)🠗 e🠗 Mod(a)🠕 e🠕 ➞ ae
+ */
+#define IGNORE_MOD_TAP_INTERRUPT
+
+/** Dilemma-specific features. */
+
+#ifdef POINTING_DEVICE_ENABLE
+// Flip horizontal direction for drag-scroll.
+# define DILEMMA_DRAGSCROLL_REVERSE_X
+// #define DILEMMA_DRAGSCROLL_REVERSE_Y
+#endif // POINTING_DEVICE_ENABLE
+
+/** RGB Matrix. */
+
+#ifdef RGB_MATRIX_ENABLE
+// Enable all animations on ARM boards since they have plenty of memory
+// available for it.
+# define ENABLE_RGB_MATRIX_ALPHAS_MODS
+# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
+# define ENABLE_RGB_MATRIX_BREATHING
+# define ENABLE_RGB_MATRIX_BAND_SAT
+# define ENABLE_RGB_MATRIX_BAND_VAL
+# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
+# define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+# define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
+# define ENABLE_RGB_MATRIX_CYCLE_ALL
+# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+# define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
+# define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
+# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
+# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
+# define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
+# define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
+# define ENABLE_RGB_MATRIX_DUAL_BEACON
+# define ENABLE_RGB_MATRIX_RAINBOW_BEACON
+# define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
+# define ENABLE_RGB_MATRIX_RAINDROPS
+# define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
+# define ENABLE_RGB_MATRIX_HUE_BREATHING
+# define ENABLE_RGB_MATRIX_HUE_PENDULUM
+# define ENABLE_RGB_MATRIX_HUE_WAVE
+# define ENABLE_RGB_MATRIX_TYPING_HEATMAP
+# define ENABLE_RGB_MATRIX_DIGITAL_RAIN
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+# define ENABLE_RGB_MATRIX_SPLASH
+# define ENABLE_RGB_MATRIX_MULTISPLASH
+# define ENABLE_RGB_MATRIX_SOLID_SPLASH
+# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
+
+// Limit maximum brightness to keep power consumption reasonable, and avoid
+// disconnects.
+# undef RGB_MATRIX_MAXIMUM_BRIGHTNESS
+# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 64
+
+// Rainbow swirl as startup mode.
+# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
+# define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT
+
+// Slow swirl at startup.
+# define RGB_MATRIX_DEFAULT_SPD 32
+
+// Startup values.
+# define RGB_MATRIX_DEFAULT_HUE 0
+# define RGB_MATRIX_DEFAULT_SAT 255
+# define RGB_MATRIX_DEFAULT_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS
+#endif // RGB_MATRIX_ENABLE
diff --git a/keyboards/bastardkb/dilemma/3x5_3/keymaps/bstiq/keymap.c b/keyboards/bastardkb/dilemma/3x5_3/keymaps/bstiq/keymap.c
new file mode 100644
index 0000000000..2c262521bc
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_3/keymaps/bstiq/keymap.c
@@ -0,0 +1,223 @@
+/**
+ * Copyright 2021 Quentin LEBASTARD
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#include QMK_KEYBOARD_H
+
+enum bstiq_layers {
+ LAYER_BASE = 0,
+ LAYER_MBO,
+ LAYER_MEDIA,
+ LAYER_NAV,
+ LAYER_MOUSE,
+ LAYER_SYM,
+ LAYER_NUM,
+ LAYER_FUN,
+};
+
+// Automatically enable sniping when the mouse layer is on.
+#define DILEMMA_AUTO_SNIPING_ON_LAYER LAYER_MOUSE
+
+#define BSP_NAV LT(LAYER_NAV, KC_BSPC)
+#define ENT_MBO LT(LAYER_MBO, KC_ENT)
+#define TAB_MED LT(LAYER_MEDIA, KC_TAB)
+#define ESC_SYM LT(LAYER_SYM, KC_ESC)
+#define SPC_NUM LT(LAYER_NUM, KC_SPC)
+#define SPC_MBO LT(LAYER_MBO, KC_SPC)
+#define MOUSE(KC) LT(LAYER_MOUSE, KC)
+
+#define USR_RDO KC_AGAIN
+#define USR_PST S(KC_INS)
+#define USR_CPY C(KC_INS)
+#define USR_CUT S(KC_DEL)
+#define USR_UND KC_UNDO
+
+#define MS_L KC_MS_LEFT
+#define MS_R KC_MS_RIGHT
+#define MS_D KC_MS_DOWN
+#define MS_U KC_MS_UP
+
+#define WH_L KC_MS_WH_LEFT
+#define WH_R KC_MS_WH_RIGHT
+#define WH_D KC_MS_WH_DOWN
+#define WH_U KC_MS_WH_UP
+
+// clang-format off
+/** Convenience macro. */
+#define _KC_LAYOUT_wrapper( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, \
+ ...) \
+ KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_##k06, KC_##k07, KC_##k08, KC_##k09, \
+ KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, KC_##k16, KC_##k17, KC_##k18, KC_##k19, \
+ KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_##k26, KC_##k27, KC_##k28, KC_##k29, \
+ __VA_ARGS__
+#define KC_LAYOUT_wrapper(...) _KC_LAYOUT_wrapper(__VA_ARGS__)
+
+/** Base layer with BÉPO layout. */
+#define LAYOUT_LAYER_BASE_BEPO KC_LAYOUT_wrapper( \
+ B, W, P, O, QUOT, DOT, V, D, L, J, \
+ A, U, I, E, COMM, C, T, S, R, N, \
+ Z, Y, X, SLSH, K, M, Q, G, H, F, \
+ KC_A, SPC_MBO, TAB_MED, ESC_SYM, SPC_NUM, KC_A)
+
+/** Convenience key shorthands. */
+#define U_NA KC_NO // Present but not available for use.
+#define U_NU KC_NO // Available but not used.
+
+/** Convenience row shorthands. */
+#define ________________HOME_ROW_NA________________ U_NA, U_NA, U_NA, U_NA, U_NA
+#define ______________HOME_ROW_GASC_L______________ KC_LGUI, KC_LALT, KC_LSFT, KC_LCTL, U_NA
+#define ______________HOME_ROW_ALGR_L______________ U_NA, KC_ALGR, U_NA, U_NA, U_NA
+#define ______________HOME_ROW_GASC_R______________ U_NA, KC_LCTL, KC_LSFT, KC_LALT, KC_LGUI
+#define ______________HOME_ROW_ALGR_R______________ U_NA, U_NA, U_NA, KC_ALGR, U_NA
+
+/** Layers. */
+
+// Buttons.
+#define LAYOUT_LAYER_MBO \
+ ________________HOME_ROW_NA________________, USR_RDO, USR_PST, USR_CPY, USR_CUT, USR_UND, \
+ ______________HOME_ROW_GASC_L______________, KC_BSPC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, \
+ KC_BTN3, KC_ALGR, KC_BTN2, KC_BTN1, U_NA, KC_DEL, KC_HOME, KC_PGDN, KC_PGUP, KC_END, \
+ U_NA, U_NA, U_NA, KC_ENT, KC_ENT, KC_ENT
+
+// Media.
+#define LAYOUT_LAYER_MEDIA \
+ ________________HOME_ROW_NA________________, USR_RDO, USR_PST, USR_CPY, USR_CUT, USR_UND, \
+ ______________HOME_ROW_GASC_L______________, U_NU, MS_L, MS_D, MS_U, MS_R, \
+ ______________HOME_ROW_ALGR_L______________, U_NU, WH_L, WH_D, WH_U, WH_R, \
+ U_NA, U_NA, U_NA, KC_BTN1, KC_BTN3, KC_BTN2
+
+// Navigation.
+#define LAYOUT_LAYER_NAV \
+ ________________HOME_ROW_NA________________, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, \
+ ______________HOME_ROW_GASC_L______________, U_NU, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, \
+ ______________HOME_ROW_ALGR_L______________, U_NU, U_NU, U_NU, U_NU, U_NU, \
+ U_NA, U_NA, U_NA, KC_MSTP, KC_MPLY, U_NA
+
+// Mouse.
+#define LAYOUT_LAYER_MOUSE \
+ S_D_MOD, USR_PST, USR_CPY, USR_CUT, USR_UND, USR_RDO, USR_PST, USR_CPY, USR_CUT, USR_UND, \
+ DPI_MOD, DRGSCRL, KC_LSFT, DRGSCRL, _______, U_NU, MS_L, MS_D, MS_U, MS_R, \
+ USR_RDO, USR_PST, USR_CPY, KC_BTN3, USR_UND, U_NU, WH_L, WH_D, WH_U, WH_R, \
+ KC_BTN3, KC_BTN1, KC_BTN2, KC_BTN1, KC_BTN3, KC_BTN2
+
+// Symbols.
+#define LAYOUT_LAYER_SYM \
+ KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, ________________HOME_ROW_NA________________, \
+ KC_COLN, KC_DLR, KC_PERC, KC_CIRC, KC_PLUS, ______________HOME_ROW_GASC_R______________, \
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_MINS, ______________HOME_ROW_ALGR_R______________, \
+ U_NA, KC_RPRN, KC_LPRN, U_NA, U_NA, U_NA
+
+// Numerals.
+#define LAYOUT_LAYER_NUM \
+ KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, ________________HOME_ROW_NA________________, \
+ KC_SCLN, KC_4, KC_5, KC_6, KC_EQL, ______________HOME_ROW_GASC_R______________, \
+ KC_GRV, KC_1, KC_2, KC_3, KC_UNDS, ______________HOME_ROW_ALGR_R______________, \
+ U_NA, KC_0, KC_MINS, U_NA, U_NA, U_NA
+
+// Function keys.
+#define LAYOUT_LAYER_FUN \
+ KC_F12, KC_F7, KC_F8, KC_F9, KC_PSCR, ________________HOME_ROW_NA________________, \
+ KC_F11, KC_F4, KC_F5, KC_F6, KC_SCRL, ______________HOME_ROW_GASC_R______________, \
+ KC_F10, KC_F1, KC_F2, KC_F3, KC_PAUS, ______________HOME_ROW_ALGR_R______________,\
+ U_NA, KC_APP, KC_TAB, U_NA, U_NA, U_NA
+
+/**
+ * Add Home Row mod to a layout.
+ *
+ * Expects a 10-key per row layout. Adds support for GASC (Gui, Alt, Shift, Ctl)
+ * home row. The layout passed in parameter must contain at least 20 keycodes.
+ *
+ * This is meant to be used with `LAYOUT_LAYER_BASE_BEPO` defined above, eg.:
+ *
+ * HOME_ROW_MOD_GASC(LAYOUT_LAYER_BASE_BEPO)
+ */
+#define _HOME_ROW_MOD_GASC( \
+ L00, L01, L02, L03, L04, R05, R06, R07, R08, R09, \
+ L10, L11, L12, L13, L14, R15, R16, R17, R18, R19, \
+ ...) \
+ L00, L01, L02, L03, L04, \
+ R05, R06, R07, R08, R09, \
+ LGUI_T(L10), LALT_T(L11), LSFT_T(L12), LCTL_T(L13), L14, \
+ R15, RCTL_T(R16), RSFT_T(R17), LALT_T(R18), RGUI_T(R19), \
+ __VA_ARGS__
+#define HOME_ROW_MOD_GASC(...) _HOME_ROW_MOD_GASC(__VA_ARGS__)
+
+/**
+ * Add mouse layer keys to a layout.
+ *
+ * Expects a 10-key per row layout. The layout passed in parameter must contain
+ * at least 30 keycodes.
+ *
+ * This is meant to be used with `LAYOUT_LAYER_BASE_BEPO` defined above, eg.:
+ *
+ * MOUSE_MOD(LAYOUT_LAYER_BASE_BEPO)
+ */
+#define _MOUSE_MOD( \
+ L00, L01, L02, L03, L04, R05, R06, R07, R08, R09, \
+ L10, L11, L12, L13, L14, R15, R16, R17, R18, R19, \
+ L20, L21, L22, L23, L24, R25, R26, R27, R28, R29, \
+ ...) \
+ L00, L01, L02, L03, L04, \
+ R05, R06, R07, R08, R09, \
+ L10, L11, L12, L13, L14, \
+ R15, R16, R17, R18, R19, \
+ L20, MOUSE(L21), L22, L23, L24, \
+ R25, R26, R27, R28, MOUSE(R29), \
+ __VA_ARGS__
+#define MOUSE_MOD(...) _MOUSE_MOD(__VA_ARGS__)
+
+#define LAYOUT_wrapper(...) LAYOUT_split_3x5_3(__VA_ARGS__)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [LAYER_BASE] = LAYOUT_wrapper(
+ MOUSE_MOD(HOME_ROW_MOD_GASC(LAYOUT_LAYER_BASE_BEPO))
+ ),
+ [LAYER_MBO] = LAYOUT_wrapper(LAYOUT_LAYER_MBO),
+ [LAYER_MEDIA] = LAYOUT_wrapper(LAYOUT_LAYER_MEDIA),
+ [LAYER_NAV] = LAYOUT_wrapper(LAYOUT_LAYER_NAV),
+ [LAYER_MOUSE] = LAYOUT_wrapper(LAYOUT_LAYER_MOUSE),
+ [LAYER_SYM] = LAYOUT_wrapper(LAYOUT_LAYER_SYM),
+ [LAYER_NUM] = LAYOUT_wrapper(LAYOUT_LAYER_NUM),
+ [LAYER_FUN] = LAYOUT_wrapper(LAYOUT_LAYER_FUN),
+};
+// clang-format on
+
+#if defined(POINTING_DEVICE_ENABLE) && defined(DILEMMA_AUTO_SNIPING_ON_LAYER)
+layer_state_t layer_state_set_user(layer_state_t state) {
+ dilemma_set_pointer_sniping_enabled(layer_state_cmp(state, DILEMMA_AUTO_SNIPING_ON_LAYER));
+ return state;
+}
+#endif // POINTING_DEVICE_ENABLE && DILEMMA_AUTO_SNIPING_ON_LAYER
+
+#ifdef RGB_MATRIX_ENABLE
+// Forward-declare this helper function since it is defined in rgb_matrix.c.
+void rgb_matrix_update_pwm_buffers(void);
+#endif
+
+void shutdown_user(void) {
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable_noeeprom();
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
+ rgblight_setrgb_red();
+#endif // RGBLIGHT_ENABLE
+#ifdef RGB_MATRIX_ENABLE
+ rgb_matrix_set_color_all(RGB_RED);
+ rgb_matrix_update_pwm_buffers();
+#endif // RGB_MATRIX_ENABLE
+}
diff --git a/keyboards/bastardkb/dilemma/3x5_3/keymaps/bstiq/readme.md b/keyboards/bastardkb/dilemma/3x5_3/keymaps/bstiq/readme.md
new file mode 100644
index 0000000000..df1f43cbcb
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_3/keymaps/bstiq/readme.md
@@ -0,0 +1,3 @@
+# Dilemma @bstiq keymap
+
+Inspired from Miryoku, using home-rows.
diff --git a/keyboards/bastardkb/dilemma/3x5_3/keymaps/default/keymap.c b/keyboards/bastardkb/dilemma/3x5_3/keymaps/default/keymap.c
new file mode 100644
index 0000000000..461976b276
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_3/keymaps/default/keymap.c
@@ -0,0 +1,84 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include QMK_KEYBOARD_H
+
+enum dilemma_keymap_layers {
+ LAYER_BASE = 0,
+ LAYER_NAV,
+ LAYER_SYM,
+ LAYER_NUM,
+};
+
+#define NAV MO(LAYER_NAV)
+#define SYM MO(LAYER_SYM)
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [LAYER_BASE] = LAYOUT_split_3x5_3(
+ // ╭─────────────────────────────────────────────╮ ╭─────────────────────────────────────────────╮
+ KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
+ // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
+ KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,
+ // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
+ KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH,
+ // ╰─────────────────────────────────────────────┤ ├─────────────────────────────────────────────╯
+ KC_A, NAV, CAPSWRD, KC_SPC, SYM, KC_A
+ // ╰───────────────────────────╯ ╰──────────────────────────╯
+ ),
+
+ [LAYER_NAV] = LAYOUT_split_3x5_3(
+ // ╭─────────────────────────────────────────────╮ ╭─────────────────────────────────────────────╮
+ KC_TAB, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, XXXXXXX, KC_HOME, KC_UP, KC_END, KC_DEL,
+ // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
+ KC_LSFT, KC_LCTL, KC_LALT, KC_RGUI, KC_VOLD, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_BSPC,
+ // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
+ QK_BOOT, EE_CLR, KC_MPRV, KC_MNXT, KC_MPLY, XXXXXXX, KC_PGDN, KC_PGUP, XXXXXXX, KC_ENT,
+ // ╰─────────────────────────────────────────────┤ ├─────────────────────────────────────────────╯
+ KC_A, _______, KC_LSFT, KC_SPC, _______, KC_A
+ // ╰───────────────────────────╯ ╰──────────────────────────╯
+ ),
+
+ [LAYER_SYM] = LAYOUT_split_3x5_3(
+ // ╭─────────────────────────────────────────────╮ ╭─────────────────────────────────────────────╮
+ KC_ESC, KC_LBRC, KC_LCBR, KC_LPRN, KC_TILD, KC_CIRC, KC_RPRN, KC_RCBR, KC_RBRC, KC_GRV,
+ // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
+ KC_MINS, KC_ASTR, KC_EQL, KC_UNDS, KC_DLR, KC_HASH, KC_RGUI, KC_RALT, KC_RCTL, KC_RSFT,
+ // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
+ KC_PLUS, KC_PIPE, KC_AT, KC_SLSH, KC_PERC, _______, KC_BSLS, KC_AMPR, KC_QUES, KC_EXLM,
+ // ╰─────────────────────────────────────────────┤ ├─────────────────────────────────────────────╯
+ KC_A, _______, KC_LSFT, KC_SPC, _______, KC_A
+ // ╰───────────────────────────╯ ╰──────────────────────────╯
+ ),
+
+ [LAYER_NUM] = LAYOUT_split_3x5_3(
+ // ╭─────────────────────────────────────────────╮ ╭─────────────────────────────────────────────╮
+ KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
+ // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
+ KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, KC_F11, KC_F12, KC_RGUI, KC_RALT, KC_RCTL, KC_RSFT,
+ // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10,
+ // ╰─────────────────────────────────────────────┤ ├─────────────────────────────────────────────╯
+ KC_A, _______, KC_LSFT, KC_SPC, _______, KC_A
+ // ╰───────────────────────────╯ ╰──────────────────────────╯
+ ),
+};
+// clang-format on
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ return update_tri_layer_state(state, LAYER_NAV, LAYER_SYM, LAYER_NUM);
+}
diff --git a/keyboards/bastardkb/dilemma/3x5_3/mcuconf.h b/keyboards/bastardkb/dilemma/3x5_3/mcuconf.h
new file mode 100644
index 0000000000..f9aa894665
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_3/mcuconf.h
@@ -0,0 +1,26 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include_next "mcuconf.h"
+
+#undef RP_SPI_USE_SPI1
+#define RP_SPI_USE_SPI1 TRUE
+
+#undef RP_I2C_USE_I2C1
+#define RP_I2C_USE_I2C1 TRUE
diff --git a/keyboards/bastardkb/dilemma/3x5_3/readme.md b/keyboards/bastardkb/dilemma/3x5_3/readme.md
new file mode 100644
index 0000000000..bfddbc9efc
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_3/readme.md
@@ -0,0 +1,5 @@
+# Next generation Dilemma keyboard
+
+This keyboard is an updated version of the [3x5+2 Dilemma](../3x5_2/).
+
+This is still under active development, and not available publicly yet.
diff --git a/keyboards/bastardkb/dilemma/3x5_3/rules.mk b/keyboards/bastardkb/dilemma/3x5_3/rules.mk
new file mode 100644
index 0000000000..73ee4ab1e0
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/3x5_3/rules.mk
@@ -0,0 +1,36 @@
+# MCU name
+MCU = RP2040
+
+# Bootloader selection
+BOOTLOADER = rp2040
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported
+RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default
+RGBLIGHT_SUPPORTED = no # RGB underglow is supported, but not enabled by default
+RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
+RGB_MATRIX_DRIVER = WS2812
+
+SERIAL_DRIVER = vendor
+WS2812_DRIVER = vendor
+
+POINTING_DEVICE_ENABLE = yes
+POINTING_DEVICE_DRIVER = cirque_pinnacle_spi
+
+SPLIT_KEYBOARD = yes
+LAYOUTS = split_3x5_3
+
+# RP2040-specific options
+PICO_INTRINSICS_ENABLED = no # ATM Unsupported by ChibiOS.
diff --git a/keyboards/bastardkb/dilemma/config.h b/keyboards/bastardkb/dilemma/config.h
new file mode 100644
index 0000000000..7f0b5c266f
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/config.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021 Quentin LEBASTARD
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include "config_common.h"
+
+/* Key matrix configuration. */
+
+#define MATRIX_ROWS 8 // Rows are doubled-up.
+#define MATRIX_COLS 5
+
+#define DIODE_DIRECTION ROW2COL
+
+// Set 0 if debouncing isn't needed.
+#define DEBOUNCE 5
+
+/* Pointing device configuration. */
+
+// Enable use of pointing device on slave split.
+#define SPLIT_POINTING_ENABLE
+
+// Pointing device is on the right split.
+#define POINTING_DEVICE_RIGHT
+
+// Limits the frequency that the sensor is polled for motion.
+#define POINTING_DEVICE_TASK_THROTTLE_MS 10
+
+// Adjust trackpad rotation.
+#define POINTING_DEVICE_ROTATION_90
+
+// Configure for the Cirque model used on the Dilemma.
+#define CIRQUE_PINNACLE_DIAMETER_MM 35
+#define CIRQUE_PINNACLE_CURVED_OVERLAY
+#define POINTING_DEVICE_GESTURES_SCROLL_ENABLE // Circular scroll.
diff --git a/keyboards/bastardkb/dilemma/dilemma.c b/keyboards/bastardkb/dilemma/dilemma.c
new file mode 100644
index 0000000000..b474a24e7f
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/dilemma.c
@@ -0,0 +1,345 @@
+/**
+ * Copyright 2020 Christopher Courtney (@drashna)
+ * Copyright 2021 Quentin LEBASTARD
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Publicw License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "dilemma.h"
+
+#ifdef CONSOLE_ENABLE
+# include "print.h"
+#endif // CONSOLE_ENABLE
+
+#ifdef POINTING_DEVICE_ENABLE
+# ifndef DILEMMA_MINIMUM_DEFAULT_DPI
+# define DILEMMA_MINIMUM_DEFAULT_DPI 400
+# endif // DILEMMA_MINIMUM_DEFAULT_DPI
+
+# ifndef DILEMMA_DEFAULT_DPI_CONFIG_STEP
+# define DILEMMA_DEFAULT_DPI_CONFIG_STEP 200
+# endif // DILEMMA_DEFAULT_DPI_CONFIG_STEP
+
+# ifndef DILEMMA_MINIMUM_SNIPING_DPI
+# define DILEMMA_MINIMUM_SNIPING_DPI 200
+# endif // DILEMMA_MINIMUM_SNIPING_DPI
+
+# ifndef DILEMMA_SNIPING_DPI_CONFIG_STEP
+# define DILEMMA_SNIPING_DPI_CONFIG_STEP 100
+# endif // DILEMMA_SNIPING_DPI_CONFIG_STEP
+
+// Fixed DPI for drag-scroll.
+# ifndef DILEMMA_DRAGSCROLL_DPI
+# define DILEMMA_DRAGSCROLL_DPI 100
+# endif // DILEMMA_DRAGSCROLL_DPI
+
+# ifndef DILEMMA_DRAGSCROLL_BUFFER_SIZE
+# define DILEMMA_DRAGSCROLL_BUFFER_SIZE 6
+# endif // !DILEMMA_DRAGSCROLL_BUFFER_SIZE
+
+typedef union {
+ uint8_t raw;
+ struct {
+ uint8_t pointer_default_dpi : 4; // 16 steps available.
+ uint8_t pointer_sniping_dpi : 2; // 4 steps available.
+ bool is_dragscroll_enabled : 1;
+ bool is_sniping_enabled : 1;
+ } __attribute__((packed));
+} dilemma_config_t;
+
+static dilemma_config_t g_dilemma_config = {0};
+
+/**
+ * \brief Set the value of `config` from EEPROM.
+ *
+ * Note that `is_dragscroll_enabled` and `is_sniping_enabled` are purposefully
+ * ignored since we do not want to persist this state to memory. In practice,
+ * this state is always written to maximize write-performances. Therefore, we
+ * explicitly set them to `false` in this function.
+ */
+static void read_dilemma_config_from_eeprom(dilemma_config_t* config) {
+ config->raw = eeconfig_read_kb() & 0xff;
+ config->is_dragscroll_enabled = false;
+ config->is_sniping_enabled = false;
+}
+
+/**
+ * \brief Save the value of `config` to eeprom.
+ *
+ * Note that all values are written verbatim, including whether drag-scroll
+ * and/or sniper mode are enabled. `read_dilemma_config_from_eeprom(…)`
+ * resets these 2 values to `false` since it does not make sense to persist
+ * these across reboots of the board.
+ */
+static void write_dilemma_config_to_eeprom(dilemma_config_t* config) {
+ eeconfig_update_kb(config->raw);
+}
+
+/** \brief Return the current value of the pointer's default DPI. */
+static uint16_t get_pointer_default_dpi(dilemma_config_t* config) {
+ return (uint16_t)config->pointer_default_dpi * DILEMMA_DEFAULT_DPI_CONFIG_STEP + DILEMMA_MINIMUM_DEFAULT_DPI;
+}
+
+/** \brief Return the current value of the pointer's sniper-mode DPI. */
+static uint16_t get_pointer_sniping_dpi(dilemma_config_t* config) {
+ return (uint16_t)config->pointer_sniping_dpi * DILEMMA_SNIPING_DPI_CONFIG_STEP + DILEMMA_MINIMUM_SNIPING_DPI;
+}
+
+/** \brief Set the appropriate DPI for the input config. */
+static void maybe_update_pointing_device_cpi(dilemma_config_t* config) {
+ if (config->is_dragscroll_enabled) {
+ pointing_device_set_cpi(DILEMMA_DRAGSCROLL_DPI);
+ } else if (config->is_sniping_enabled) {
+ pointing_device_set_cpi(get_pointer_sniping_dpi(config));
+ } else {
+ pointing_device_set_cpi(get_pointer_default_dpi(config));
+ }
+}
+
+/**
+ * \brief Update the pointer's default DPI to the next or previous step.
+ *
+ * Increases the DPI value if `forward` is `true`, decreases it otherwise.
+ * The increment/decrement steps are equal to DILEMMA_DEFAULT_DPI_CONFIG_STEP.
+ */
+static void step_pointer_default_dpi(dilemma_config_t* config, bool forward) {
+ config->pointer_default_dpi += forward ? 1 : -1;
+ maybe_update_pointing_device_cpi(config);
+}
+
+/**
+ * \brief Update the pointer's sniper-mode DPI to the next or previous step.
+ *
+ * Increases the DPI value if `forward` is `true`, decreases it otherwise.
+ * The increment/decrement steps are equal to DILEMMA_SNIPING_DPI_CONFIG_STEP.
+ */
+static void step_pointer_sniping_dpi(dilemma_config_t* config, bool forward) {
+ config->pointer_sniping_dpi += forward ? 1 : -1;
+ maybe_update_pointing_device_cpi(config);
+}
+
+uint16_t dilemma_get_pointer_default_dpi(void) {
+ return get_pointer_default_dpi(&g_dilemma_config);
+}
+
+uint16_t dilemma_get_pointer_sniping_dpi(void) {
+ return get_pointer_sniping_dpi(&g_dilemma_config);
+}
+
+void dilemma_cycle_pointer_default_dpi_noeeprom(bool forward) {
+ step_pointer_default_dpi(&g_dilemma_config, forward);
+}
+
+void dilemma_cycle_pointer_default_dpi(bool forward) {
+ step_pointer_default_dpi(&g_dilemma_config, forward);
+ write_dilemma_config_to_eeprom(&g_dilemma_config);
+}
+
+void dilemma_cycle_pointer_sniping_dpi_noeeprom(bool forward) {
+ step_pointer_sniping_dpi(&g_dilemma_config, forward);
+}
+
+void dilemma_cycle_pointer_sniping_dpi(bool forward) {
+ step_pointer_sniping_dpi(&g_dilemma_config, forward);
+ write_dilemma_config_to_eeprom(&g_dilemma_config);
+}
+
+bool dilemma_get_pointer_sniping_enabled(void) {
+ return g_dilemma_config.is_sniping_enabled;
+}
+
+void dilemma_set_pointer_sniping_enabled(bool enable) {
+ g_dilemma_config.is_sniping_enabled = enable;
+ maybe_update_pointing_device_cpi(&g_dilemma_config);
+}
+
+bool dilemma_get_pointer_dragscroll_enabled(void) {
+ return g_dilemma_config.is_dragscroll_enabled;
+}
+
+void dilemma_set_pointer_dragscroll_enabled(bool enable) {
+ g_dilemma_config.is_dragscroll_enabled = enable;
+ maybe_update_pointing_device_cpi(&g_dilemma_config);
+}
+
+void pointing_device_init_kb(void) {
+ maybe_update_pointing_device_cpi(&g_dilemma_config);
+ pointing_device_init_user();
+}
+
+/**
+ * \brief Augment the pointing device behavior.
+ *
+ * Implement drag-scroll.
+ */
+static void pointing_device_task_dilemma(report_mouse_t* mouse_report) {
+ static int16_t scroll_buffer_x = 0;
+ static int16_t scroll_buffer_y = 0;
+ if (g_dilemma_config.is_dragscroll_enabled) {
+# ifdef DILEMMA_DRAGSCROLL_REVERSE_X
+ scroll_buffer_x -= mouse_report->x;
+# else
+ scroll_buffer_x += mouse_report->x;
+# endif // DILEMMA_DRAGSCROLL_REVERSE_X
+# ifdef DILEMMA_DRAGSCROLL_REVERSE_Y
+ scroll_buffer_y -= mouse_report->y;
+# else
+ scroll_buffer_y += mouse_report->y;
+# endif // DILEMMA_DRAGSCROLL_REVERSE_Y
+ mouse_report->x = 0;
+ mouse_report->y = 0;
+ if (abs(scroll_buffer_x) > DILEMMA_DRAGSCROLL_BUFFER_SIZE) {
+ mouse_report->h = scroll_buffer_x > 0 ? 1 : -1;
+ scroll_buffer_x = 0;
+ }
+ if (abs(scroll_buffer_y) > DILEMMA_DRAGSCROLL_BUFFER_SIZE) {
+ mouse_report->v = scroll_buffer_y > 0 ? 1 : -1;
+ scroll_buffer_y = 0;
+ }
+ }
+}
+
+report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
+ if (is_keyboard_master()) {
+ pointing_device_task_dilemma(&mouse_report);
+ mouse_report = pointing_device_task_user(mouse_report);
+ }
+ return mouse_report;
+}
+
+# if defined(POINTING_DEVICE_ENABLE) && !defined(NO_DILEMMA_KEYCODES)
+/** \brief Whether SHIFT mod is enabled. */
+static bool has_shift_mod(void) {
+# ifdef NO_ACTION_ONESHOT
+ return mod_config(get_mods()) & MOD_MASK_SHIFT;
+# else
+ return mod_config(get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT;
+# endif // NO_ACTION_ONESHOT
+}
+# endif // POINTING_DEVICE_ENABLE && !NO_DILEMMA_KEYCODES
+
+/**
+ * \brief Outputs the Dilemma configuration to console.
+ *
+ * Prints the in-memory configuration structure to console, for debugging.
+ * Includes:
+ * - raw value
+ * - drag-scroll: on/off
+ * - sniping: on/off
+ * - default DPI: internal table index/actual DPI
+ * - sniping DPI: internal table index/actual DPI
+ */
+static void debug_dilemma_config_to_console(dilemma_config_t* config) {
+# ifdef CONSOLE_ENABLE
+ dprintf("(dilemma) process_record_kb: config = {\n"
+ "\traw = 0x%X,\n"
+ "\t{\n"
+ "\t\tis_dragscroll_enabled=%u\n"
+ "\t\tis_sniping_enabled=%u\n"
+ "\t\tdefault_dpi=0x%X (%u)\n"
+ "\t\tsniping_dpi=0x%X (%u)\n"
+ "\t}\n"
+ "}\n",
+ config->raw, config->is_dragscroll_enabled, config->is_sniping_enabled, config->pointer_default_dpi, get_pointer_default_dpi(config), config->pointer_sniping_dpi, get_pointer_sniping_dpi(config));
+# endif // CONSOLE_ENABLE
+}
+
+bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
+ if (!process_record_user(keycode, record)) {
+ debug_dilemma_config_to_console(&g_dilemma_config);
+ return false;
+ }
+# ifdef POINTING_DEVICE_ENABLE
+# ifndef NO_DILEMMA_KEYCODES
+ switch (keycode) {
+ case POINTER_DEFAULT_DPI_FORWARD:
+ if (record->event.pressed) {
+ // Step backward if shifted, forward otherwise.
+ dilemma_cycle_pointer_default_dpi(/* forward= */ !has_shift_mod());
+ }
+ break;
+ case POINTER_DEFAULT_DPI_REVERSE:
+ if (record->event.pressed) {
+ // Step forward if shifted, backward otherwise.
+ dilemma_cycle_pointer_default_dpi(/* forward= */ has_shift_mod());
+ }
+ break;
+ case POINTER_SNIPING_DPI_FORWARD:
+ if (record->event.pressed) {
+ // Step backward if shifted, forward otherwise.
+ dilemma_cycle_pointer_sniping_dpi(/* forward= */ !has_shift_mod());
+ }
+ break;
+ case POINTER_SNIPING_DPI_REVERSE:
+ if (record->event.pressed) {
+ // Step forward if shifted, backward otherwise.
+ dilemma_cycle_pointer_sniping_dpi(/* forward= */ has_shift_mod());
+ }
+ break;
+ case SNIPING_MODE:
+ dilemma_set_pointer_sniping_enabled(record->event.pressed);
+ break;
+ case SNIPING_MODE_TOGGLE:
+ if (record->event.pressed) {
+ dilemma_set_pointer_sniping_enabled(!dilemma_get_pointer_sniping_enabled());
+ }
+ break;
+ case DRAGSCROLL_MODE:
+ dilemma_set_pointer_dragscroll_enabled(record->event.pressed);
+ break;
+ case DRAGSCROLL_MODE_TOGGLE:
+ if (record->event.pressed) {
+ dilemma_set_pointer_dragscroll_enabled(!dilemma_get_pointer_dragscroll_enabled());
+ }
+ break;
+ }
+# endif // !NO_DILEMMA_KEYCODES
+# endif // POINTING_DEVICE_ENABLE
+ debug_dilemma_config_to_console(&g_dilemma_config);
+ if ((keycode >= POINTER_DEFAULT_DPI_FORWARD && keycode < DILEMMA_SAFE_RANGE) || IS_MOUSEKEY(keycode)) {
+ debug_dilemma_config_to_console(&g_dilemma_config);
+ }
+ return true;
+}
+
+void eeconfig_init_kb(void) {
+ g_dilemma_config.raw = 0;
+ g_dilemma_config.pointer_default_dpi = 3; // DPI=1000
+ write_dilemma_config_to_eeprom(&g_dilemma_config);
+ maybe_update_pointing_device_cpi(&g_dilemma_config);
+ eeconfig_init_user();
+}
+
+void matrix_init_kb(void) {
+ read_dilemma_config_from_eeprom(&g_dilemma_config);
+ matrix_init_user();
+}
+#endif // POINTING_DEVICE_ENABLE
+
+// Forward declare RP2040 SDK declaration.
+void gpio_init(uint gpio);
+
+void keyboard_pre_init_kb(void) {
+ // Ensures that GP26 through GP29 are initialized as digital inputs (as
+ // opposed to analog inputs). These GPIOs are shared with A0 through A3,
+ // respectively. On RP2040-B2 and later, the digital inputs are disabled by
+ // default (see RP2040-E6).
+ gpio_init(GP26);
+ gpio_init(GP27);
+ gpio_init(GP28);
+ gpio_init(GP29);
+
+ keyboard_pre_init_user();
+}
diff --git a/keyboards/bastardkb/dilemma/dilemma.h b/keyboards/bastardkb/dilemma/dilemma.h
new file mode 100644
index 0000000000..68d86b03ce
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/dilemma.h
@@ -0,0 +1,125 @@
+/**
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+// clang-format off
+#if defined(KEYBOARD_bastardkb_dilemma_3x5_2_splinky) || defined (KEYBOARD_bastardkb_dilemma_3x5_2_assembled)
+# include "3x5_2.h"
+#elif defined(KEYBOARD_bastardkb_dilemma_3x5_3)
+# include "3x5_3.h"
+#else
+# error "Unsuported format"
+#endif
+// clang-format on
+
+#include "quantum.h"
+
+#ifdef POINTING_DEVICE_ENABLE
+# ifndef NO_DILEMMA_KEYCODES
+enum dilemma_keycodes {
+# ifdef VIA_ENABLE
+ POINTER_DEFAULT_DPI_FORWARD = USER00,
+# else
+ POINTER_DEFAULT_DPI_FORWARD = SAFE_RANGE,
+# endif // VIA_ENABLE
+ POINTER_DEFAULT_DPI_REVERSE,
+ POINTER_SNIPING_DPI_FORWARD,
+ POINTER_SNIPING_DPI_REVERSE,
+ SNIPING_MODE,
+ SNIPING_MODE_TOGGLE,
+ DRAGSCROLL_MODE,
+ DRAGSCROLL_MODE_TOGGLE,
+ DILEMMA_SAFE_RANGE,
+};
+
+# define DPI_MOD POINTER_DEFAULT_DPI_FORWARD
+# define DPI_RMOD POINTER_DEFAULT_DPI_REVERSE
+# define S_D_MOD POINTER_SNIPING_DPI_FORWARD
+# define S_D_RMOD POINTER_SNIPING_DPI_REVERSE
+# define SNIPING SNIPING_MODE
+# define SNP_TOG SNIPING_MODE_TOGGLE
+# define DRGSCRL DRAGSCROLL_MODE
+# define DRG_TOG DRAGSCROLL_MODE_TOGGLE
+# endif // !NO_DILEMMA_KEYCODES
+
+/** \brief Return the current DPI value for the pointer's default mode. */
+uint16_t dilemma_get_pointer_default_dpi(void);
+
+/**
+ * \brief Update the pointer's default DPI to the next or previous step.
+ *
+ * Increases the DPI value if `forward` is `true`, decreases it otherwise.
+ * The increment/decrement steps are equal to DILEMMA_DEFAULT_DPI_CONFIG_STEP.
+ *
+ * The new value is persisted in EEPROM.
+ */
+void dilemma_cycle_pointer_default_dpi(bool forward);
+
+/**
+ * \brief Same as `dilemma_cycle_pointer_default_dpi`, but do not write to
+ * EEPROM.
+ *
+ * This means that reseting the board will revert the value to the last
+ * persisted one.
+ */
+void dilemma_cycle_pointer_default_dpi_noeeprom(bool forward);
+
+/** \brief Return the current DPI value for the pointer's sniper-mode. */
+uint16_t dilemma_get_pointer_sniping_dpi(void);
+
+/**
+ * \brief Update the pointer's sniper-mode DPI to the next or previous step.
+ *
+ * Increases the DPI value if `forward` is `true`, decreases it otherwise.
+ * The increment/decrement steps are equal to DILEMMA_SNIPING_DPI_CONFIG_STEP.
+ *
+ * The new value is persisted in EEPROM.
+ */
+void dilemma_cycle_pointer_sniping_dpi(bool forward);
+
+/**
+ * \brief Same as `dilemma_cycle_pointer_sniping_dpi`, but do not write to
+ * EEPROM.
+ *
+ * This means that reseting the board will revert the value to the last
+ * persisted one.
+ */
+void dilemma_cycle_pointer_sniping_dpi_noeeprom(bool forward);
+
+/** \brief Whether sniper-mode is enabled. */
+bool dilemma_get_pointer_sniping_enabled(void);
+
+/**
+ * \brief Enable/disable sniper mode.
+ *
+ * When sniper mode is enabled the dpi is reduced to slow down the pointer for
+ * more accurate movements.
+ */
+void dilemma_set_pointer_sniping_enabled(bool enable);
+
+/** \brief Whether drag-scroll is enabled. */
+bool dilemma_get_pointer_dragscroll_enabled(void);
+
+/**
+ * \brief Enable/disable drag-scroll mode.
+ *
+ * When drag-scroll mode is enabled, horizontal and vertical pointer movements
+ * are translated into horizontal and vertical scroll movements.
+ */
+void dilemma_set_pointer_dragscroll_enabled(bool enable);
+#endif // POINTING_DEVICE_ENABLE
diff --git a/keyboards/bastardkb/dilemma/info.json b/keyboards/bastardkb/dilemma/info.json
new file mode 100644
index 0000000000..ef6a5dd42d
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/info.json
@@ -0,0 +1,3 @@
+{
+ "url": "https://bastardkb.com/dilemma"
+}
diff --git a/keyboards/bastardkb/dilemma/readme.md b/keyboards/bastardkb/dilemma/readme.md
new file mode 100644
index 0000000000..ac3c818bd6
--- /dev/null
+++ b/keyboards/bastardkb/dilemma/readme.md
@@ -0,0 +1,16 @@
+# Dilemma
+
+A very small keyboard made for ergonomic enthusiasts.
+
+- Keyboard Maintainer: [Bastard Keyboards](https://github.com/Bastardkb/)
+- Hardware Supported: RP2040-based controller (_eg._ Splinky, Elite-c, ...)
+- Hardware Availability: [Bastardkb.com](https://bastardkb.com/)
+
+A pre-assembled version (with embedded controller) is also available.
+
+Make example for this keyboard (after setting up your build environment):
+
+ make bastardkb/dilemma/3x5_2/splinky:default
+ make bastardkb/dilemma/3x5_2/assembled:default
+
+See the [keyboard build instructions](http://docs.bastardkb.com/)
diff --git a/keyboards/bastardkb/info.json b/keyboards/bastardkb/info.json
new file mode 100644
index 0000000000..0a9cb94fef
--- /dev/null
+++ b/keyboards/bastardkb/info.json
@@ -0,0 +1,8 @@
+{
+ "manufacturer": "Bastard Keyboards",
+ "maintainer": "Quentin Lebastard",
+ "url": "https://bastardkb.com",
+ "usb": {
+ "vid": "0xA8F8"
+ }
+}
diff --git a/keyboards/bastardkb/scylla/blackpill/config.h b/keyboards/bastardkb/scylla/blackpill/config.h
new file mode 100644
index 0000000000..773ee947d7
--- /dev/null
+++ b/keyboards/bastardkb/scylla/blackpill/config.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2020 Christopher Courtney (@drashna)
+ * Copyright 2021 Stefan Kerkmann (@KarlK90)
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Publicw License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+/* Key matrix configuration. */
+#define MATRIX_ROW_PINS \
+ { B15, A2, B8, A8, B9 }
+#define MATRIX_COL_PINS \
+ { B0, B1, B10, B3, B4, B5 }
+
+/* Handedness. */
+#define SPLIT_HAND_PIN A3 // High -> left, Low -> right.
+
+/* RGB settings. */
+#define RGB_DI_PIN A1
+#define WS2812_PWM_DRIVER PWMD2
+#define WS2812_PWM_CHANNEL 2
+#define WS2812_PWM_PAL_MODE 1
+#define WS2812_EXTERNAL_PULLUP
+#define WS2812_DMA_STREAM STM32_DMA1_STREAM1
+#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_TARGET_PERIOD 800000
+
+/* Serial configuration for split keyboard. */
+#define SERIAL_USART_TX_PIN A9
+
+/* CRC. */
+#define CRC8_USE_TABLE
+#define CRC8_OPTIMIZE_SPEED
+
+/* SPI config for EEPROM. */
+#define SPI_DRIVER SPID1
+#define SPI_SCK_PIN A5
+#define SPI_SCK_PAL_MODE 5
+#define SPI_MOSI_PIN A7
+#define SPI_MOSI_PAL_MODE 5
+#define SPI_MISO_PIN A6
+#define SPI_MISO_PAL_MODE 5
+
+/* EEPROM config. */
+#define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN A4
diff --git a/keyboards/bastardkb/scylla/blackpill/halconf.h b/keyboards/bastardkb/scylla/blackpill/halconf.h
new file mode 100644
index 0000000000..1ba700a80f
--- /dev/null
+++ b/keyboards/bastardkb/scylla/blackpill/halconf.h
@@ -0,0 +1,27 @@
+/**
+ * Copyright 2020 Nick Brassel (tzarc)
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#define HAL_USE_PWM TRUE
+#define HAL_USE_SERIAL TRUE
+#define HAL_USE_SPI TRUE
+#define SPI_USE_WAIT TRUE
+#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
+
+#include_next
diff --git a/keyboards/bastardkb/scylla/blackpill/info.json b/keyboards/bastardkb/scylla/blackpill/info.json
new file mode 100644
index 0000000000..8e09212116
--- /dev/null
+++ b/keyboards/bastardkb/scylla/blackpill/info.json
@@ -0,0 +1,6 @@
+{
+ "keyboard_name": "Scylla Blackpill",
+ "usb": {
+ "device_version": "1.0.0"
+ }
+}
diff --git a/keyboards/bastardkb/scylla/blackpill/mcuconf.h b/keyboards/bastardkb/scylla/blackpill/mcuconf.h
new file mode 100644
index 0000000000..2b3f30cbfe
--- /dev/null
+++ b/keyboards/bastardkb/scylla/blackpill/mcuconf.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2020 Nick Brassel (tzarc)
+ * Copyright 2021 Stefan Kerkmann (@KarlK90)
+ * Copyright 2022 Charly Delay (@0xcharly)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include_next
+
+#undef STM32_SPI_USE_SPI1
+#define STM32_SPI_USE_SPI1 TRUE
+
+#undef STM32_PWM_USE_TIM2
+#define STM32_PWM_USE_TIM2 TRUE
+
+#undef STM32_SERIAL_USE_USART1
+#define STM32_SERIAL_USE_USART1 TRUE
+
+#undef STM32_GPT_USE_TIM3
+#define STM32_GPT_USE_TIM3 TRUE
+
+#undef STM32_ST_USE_TIMER
+#define STM32_ST_USE_TIMER 5
diff --git a/keyboards/bastardkb/scylla/blackpill/rules.mk b/keyboards/bastardkb/scylla/blackpill/rules.mk
new file mode 100644
index 0000000000..cf2041ea1c
--- /dev/null
+++ b/keyboards/bastardkb/scylla/blackpill/rules.mk
@@ -0,0 +1,36 @@
+# MCU name
+MCU = STM32F411
+BOARD = BLACKPILL_STM32_F411
+
+# Bootloader selection
+BOOTLOADER = stm32-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+AUDIO_SUPPORTED = no # Audio is not supported
+RGB_MATRIX_SUPPORTED = yes # RGB matrix is supported and enabled by default
+RGBLIGHT_SUPPORTED = yes # RGB underglow is supported, but not enabled by default
+RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix functionality
+RGB_MATRIX_DRIVER = WS2812 # RGB matrix driver support
+
+SPLIT_KEYBOARD = yes
+
+MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint
+KEYBOARD_SHARED_EP = yes
+
+EEPROM_DRIVER = spi
+WS2812_DRIVER = pwm
+SERIAL_DRIVER = usart
+
+DEBOUNCE_TYPE = asym_eager_defer_pk
diff --git a/keyboards/bastardkb/scylla/config.h b/keyboards/bastardkb/scylla/config.h
index 3e582c4275..043547be52 100644
--- a/keyboards/bastardkb/scylla/config.h
+++ b/keyboards/bastardkb/scylla/config.h
@@ -1,5 +1,6 @@
/*
* Copyright 2021 Quentin LEBASTARD
+ * Copyright 2022 Charly Delay (@0xcharly)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -16,85 +17,30 @@
*/
#pragma once
+
#include "config_common.h"
-#define MATRIX_ROWS 10
+/* Key matrix configuration. */
+#define MATRIX_ROWS 10 // Rows are doubled-up.
#define MATRIX_COLS 6
+
#define DIODE_DIRECTION ROW2COL
-#define MATRIX_ROW_PINS { D7, B5, F7, F6, B6 }
-#define MATRIX_COL_PINS { B4, E6, C6, B1, B3, B2 }
-#define RGB_DI_PIN D2
-#define RGBLED_NUM 58
-#define RGBLED_SPLIT { 29, 29 }
-#define RGBLIGHT_LIMIT_VAL 120
-#define RGBLIGHT_ANIMATIONS
+/* Set 0 if debouncing isn't needed. */
#define DEBOUNCE 5
-#define SOFT_SERIAL_PIN D0
-#define MASTER_RIGHT
-#ifdef RGBLIGHT_ENABLE
-# define RGBLED_NUM 58
-# define RGBLED_SPLIT { 29, 29 }
-# define RGBLIGHT_LIMIT_VAL 50
-# define RGBLIGHT_ANIMATIONS
-#endif
+/* RGB settings. */
+#define RGBLED_NUM 58
+#define RGBLED_SPLIT \
+ { 29, 29 }
-// RGB matrix support
+/* RGB matrix support. */
#ifdef RGB_MATRIX_ENABLE
# define SPLIT_TRANSPORT_MIRROR
-# define DRIVER_LED_TOTAL 58 // Number of LEDs
-# define RGB_MATRIX_SPLIT { 29, 29 }
+# define RGB_MATRIX_LED_COUNT RGBLED_NUM
+# define RGB_MATRIX_SPLIT RGBLED_SPLIT
# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 50
-# define RGB_MATRIX_STARTUP_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS
+# define RGB_MATRIX_DEFAULT_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS
# define RGB_DISABLE_WHEN_USB_SUSPENDED
# define RGB_MATRIX_KEYPRESSES
-// RGB Matrix Animation modes. Explicitly enabled
-// For full list of effects, see:
-// https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects
-# define ENABLE_RGB_MATRIX_ALPHAS_MODS
-# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
-# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
-# define ENABLE_RGB_MATRIX_BREATHING
-# define ENABLE_RGB_MATRIX_BAND_SAT
-# define ENABLE_RGB_MATRIX_BAND_VAL
-# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
-# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
-# define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
-# define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
-# define ENABLE_RGB_MATRIX_CYCLE_ALL
-# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
-# define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
-# define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
-# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
-# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
-# define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
-# define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
-# define ENABLE_RGB_MATRIX_DUAL_BEACON
-# define ENABLE_RGB_MATRIX_RAINBOW_BEACON
-# define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
-# define ENABLE_RGB_MATRIX_RAINDROPS
-# define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
-# define ENABLE_RGB_MATRIX_HUE_BREATHING
-# define ENABLE_RGB_MATRIX_HUE_PENDULUM
-# define ENABLE_RGB_MATRIX_HUE_WAVE
-# define ENABLE_RGB_MATRIX_PIXEL_RAIN
-# define ENABLE_RGB_MATRIX_PIXEL_FLOW
-# define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
-// enabled only if RGB_MATRIX_FRAMEBUFFER_EFFECTS is defined
-# define ENABLE_RGB_MATRIX_TYPING_HEATMAP
-# define ENABLE_RGB_MATRIX_DIGITAL_RAIN
-// enabled only of RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined
-# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
-# define ENABLE_RGB_MATRIX_SOLID_REACTIVE
-# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
-# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
-# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
-# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
-# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
-# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
-# define ENABLE_RGB_MATRIX_SPLASH
-# define ENABLE_RGB_MATRIX_MULTISPLASH
-# define ENABLE_RGB_MATRIX_SOLID_SPLASH
-# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
#endif
diff --git a/keyboards/bastardkb/scylla/info.json b/keyboards/bastardkb/scylla/info.json
index 1d3dd39030..d8120f5070 100644
--- a/keyboards/bastardkb/scylla/info.json
+++ b/keyboards/bastardkb/scylla/info.json
@@ -1,74 +1,69 @@
{
- "keyboard_name": "Scylla",
- "manufacturer": "Bastard Keyboards",
- "url": "https://bastardkb.com/",
- "maintainer": "Quentin Lebastard",
+ "url": "https://bastardkb.com/scylla",
"usb": {
- "vid": "0xA8F8",
- "pid": "0x1829",
- "device_version": "0.0.1"
+ "pid": "0x1829"
},
"layouts": {
"LAYOUT_split_4x6_5": {
"layout": [
- {"label":"L00", "x":0, "y":0},
- {"label":"L01", "x":1, "y":0},
- {"label":"L02", "x":2, "y":0},
- {"label":"L03", "x":3, "y":0},
- {"label":"L04", "x":4, "y":0},
- {"label":"L05", "x":5, "y":0},
- {"label":"R00", "x":11, "y":0},
- {"label":"R01", "x":12, "y":0},
- {"label":"R02", "x":13, "y":0},
- {"label":"R03", "x":14, "y":0},
- {"label":"R04", "x":15, "y":0},
- {"label":"R05", "x":16, "y":0},
- {"label":"L10", "x":0, "y":1},
- {"label":"L11", "x":1, "y":1},
- {"label":"L12", "x":2, "y":1},
- {"label":"L13", "x":3, "y":1},
- {"label":"L14", "x":4, "y":1},
- {"label":"L15", "x":5, "y":1},
- {"label":"R10", "x":11, "y":1},
- {"label":"R11", "x":12, "y":1},
- {"label":"R12", "x":13, "y":1},
- {"label":"R13", "x":14, "y":1},
- {"label":"R14", "x":15, "y":1},
- {"label":"R15", "x":16, "y":1},
- {"label":"L20", "x":0, "y":2},
- {"label":"L21", "x":1, "y":2},
- {"label":"L22", "x":2, "y":2},
- {"label":"L23", "x":3, "y":2},
- {"label":"L24", "x":4, "y":2},
- {"label":"L25", "x":5, "y":2},
- {"label":"R20", "x":11, "y":2},
- {"label":"R21", "x":12, "y":2},
- {"label":"R22", "x":13, "y":2},
- {"label":"R23", "x":14, "y":2},
- {"label":"R24", "x":15, "y":2},
- {"label":"R25", "x":16, "y":2},
- {"label":"L30", "x":0, "y":3},
- {"label":"L31", "x":1, "y":3},
- {"label":"L32", "x":2, "y":3},
- {"label":"L33", "x":3, "y":3},
- {"label":"L34", "x":4, "y":3},
- {"label":"L35", "x":5, "y":3},
- {"label":"R30", "x":11, "y":3},
- {"label":"R31", "x":12, "y":3},
- {"label":"R32", "x":13, "y":3},
- {"label":"R33", "x":14, "y":3},
- {"label":"R34", "x":15, "y":3},
- {"label":"R35", "x":16, "y":3},
- {"label":"L43", "x":5, "y":4},
- {"label":"L44", "x":6, "y":4},
- {"label":"L45", "x":7, "y":4},
- {"label":"R40", "x":9, "y":4},
- {"label":"R41", "x":10, "y":4},
- {"label":"R40", "x":11, "y":4},
- {"label":"L52", "x":6, "y":5},
- {"label":"L53", "x":7, "y":5},
- {"label":"R52", "x":9, "y":5},
- {"label":"R53", "x":10, "y":5}
+ { "label": "L00", "x": 0, "y": 0 },
+ { "label": "L01", "x": 1, "y": 0 },
+ { "label": "L02", "x": 2, "y": 0 },
+ { "label": "L03", "x": 3, "y": 0 },
+ { "label": "L04", "x": 4, "y": 0 },
+ { "label": "L05", "x": 5, "y": 0 },
+ { "label": "R00", "x": 11, "y": 0 },
+ { "label": "R01", "x": 12, "y": 0 },
+ { "label": "R02", "x": 13, "y": 0 },
+ { "label": "R03", "x": 14, "y": 0 },
+ { "label": "R04", "x": 15, "y": 0 },
+ { "label": "R05", "x": 16, "y": 0 },
+ { "label": "L10", "x": 0, "y": 1 },
+ { "label": "L11", "x": 1, "y": 1 },
+ { "label": "L12", "x": 2, "y": 1 },
+ { "label": "L13", "x": 3, "y": 1 },
+ { "label": "L14", "x": 4, "y": 1 },
+ { "label": "L15", "x": 5, "y": 1 },
+ { "label": "R10", "x": 11, "y": 1 },
+ { "label": "R11", "x": 12, "y": 1 },
+ { "label": "R12", "x": 13, "y": 1 },
+ { "label": "R13", "x": 14, "y": 1 },
+ { "label": "R14", "x": 15, "y": 1 },
+ { "label": "R15", "x": 16, "y": 1 },
+ { "label": "L20", "x": 0, "y": 2 },
+ { "label": "L21", "x": 1, "y": 2 },
+ { "label": "L22", "x": 2, "y": 2 },
+ { "label": "L23", "x": 3, "y": 2 },
+ { "label": "L24", "x": 4, "y": 2 },
+ { "label": "L25", "x": 5, "y": 2 },
+ { "label": "R20", "x": 11, "y": 2 },
+ { "label": "R21", "x": 12, "y": 2 },
+ { "label": "R22", "x": 13, "y": 2 },
+ { "label": "R23", "x": 14, "y": 2 },
+ { "label": "R24", "x": 15, "y": 2 },
+ { "label": "R25", "x": 16, "y": 2 },
+ { "label": "L30", "x": 0, "y": 3 },
+ { "label": "L31", "x": 1, "y": 3 },
+ { "label": "L32", "x": 2, "y": 3 },
+ { "label": "L33", "x": 3, "y": 3 },
+ { "label": "L34", "x": 4, "y": 3 },
+ { "label": "L35", "x": 5, "y": 3 },
+ { "label": "R30", "x": 11, "y": 3 },
+ { "label": "R31", "x": 12, "y": 3 },
+ { "label": "R32", "x": 13, "y": 3 },
+ { "label": "R33", "x": 14, "y": 3 },
+ { "label": "R34", "x": 15, "y": 3 },
+ { "label": "R35", "x": 16, "y": 3 },
+ { "label": "L43", "x": 5, "y": 4 },
+ { "label": "L44", "x": 6, "y": 4 },
+ { "label": "L45", "x": 7, "y": 4 },
+ { "label": "R40", "x": 9, "y": 4 },
+ { "label": "R41", "x": 10, "y": 4 },
+ { "label": "R40", "x": 11, "y": 4 },
+ { "label": "L52", "x": 6, "y": 5 },
+ { "label": "L53", "x": 7, "y": 5 },
+ { "label": "R52", "x": 9, "y": 5 },
+ { "label": "R53", "x": 10, "y": 5 }
]
}
}
diff --git a/keyboards/bastardkb/scylla/keymaps/cykedev/keymap.c b/keyboards/bastardkb/scylla/keymaps/cykedev/keymap.c
index 42915e43e4..9f497e2c14 100644
--- a/keyboards/bastardkb/scylla/keymaps/cykedev/keymap.c
+++ b/keyboards/bastardkb/scylla/keymaps/cykedev/keymap.c
@@ -187,7 +187,7 @@ layer_state_t layer_state_set_user(layer_state_t state) {
const key_override_t tilde_esc_override = ko_make_basic(MOD_MASK_SHIFT, KC_ESC, S(KC_GRAVE));
const key_override_t grave_esc_override = ko_make_basic(MOD_MASK_GUI, KC_ESC, KC_GRAVE);
-const key_override_t delete_key_override = ko_make_basic(MOD_MASK_SHIFT, KC_BSPACE, KC_DELETE);
+const key_override_t delete_key_override = ko_make_basic(MOD_MASK_SHIFT, KC_BSPC, KC_DELETE);
const key_override_t **key_overrides = (const key_override_t *[]){
diff --git a/keyboards/bastardkb/scylla/keymaps/default/keymap.c b/keyboards/bastardkb/scylla/keymaps/default/keymap.c
index fe9a834fa2..10adac4126 100644
--- a/keyboards/bastardkb/scylla/keymaps/default/keymap.c
+++ b/keyboards/bastardkb/scylla/keymaps/default/keymap.c
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2021 Quentin LEBASTARD
*
* This program is free software: you can redistribute it and/or modify
@@ -19,42 +19,33 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [0] = LAYOUT_split_4x6_5(
- KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
-//-------------------------------------------------//-----------------------------------------------------------//
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS,
-//-------------------------------------------------//-----------------------------------------------------------//
- KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
-//-------------------------------------------------//-----------------------------------------------------------//
- KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_BSLS,
-//-------------------------------------------------//-----------------------------------------------------------//
- KC_LCTL, KC_SPC, MO(1), MO(2), KC_ENT, KC_RGUI,
- KC_HOME, KC_BSPC, KC_DEL, KC_RALT
- ),
+ [0] = LAYOUT_split_4x6_5(KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ //-------------------------------------------------//-----------------------------------------------------------//
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS,
+ //-------------------------------------------------//-----------------------------------------------------------//
+ KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ //-------------------------------------------------//-----------------------------------------------------------//
+ KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_BSLS,
+ //-------------------------------------------------//-----------------------------------------------------------//
+ KC_LCTL, KC_SPC, MO(1), MO(2), KC_ENT, KC_RGUI, KC_HOME, KC_BSPC, KC_DEL, KC_RALT),
- [1] = LAYOUT_split_4x6_5(
- KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL,
-//---------------------------------------------------------//-----------------------------------------------------------//
- QK_BOOT, _______, _______, _______, _______, KC_LBRC, KC_RBRC, KC_P7, KC_P8, KC_P9, _______, KC_PLUS,
-//---------------------------------------------------------//-----------------------------------------------------------//
- _______, KC_HOME, KC_PGUP, KC_PGDN, KC_END, KC_LPRN, KC_RPRN, KC_P4, KC_P5, KC_P6, KC_MINS, KC_PIPE,
-//---------------------------------------------------------//-----------------------------------------------------------//
- _______, _______, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_EQL, KC_UNDS,
-//---------------------------------------------------------//-----------------------------------------------------------//
- KC_LCTL, KC_HOME, KC_TRNS, KC_TRNS, KC_RALT, KC_RGUI,
- KC_SPC, KC_BSPC, KC_RCTL, KC_ENT
- ),
+ [1] = LAYOUT_split_4x6_5(KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL,
+ //---------------------------------------------------------//-----------------------------------------------------------//
+ QK_BOOT, _______, _______, _______, _______, KC_LBRC, KC_RBRC, KC_P7, KC_P8, KC_P9, _______, KC_PLUS,
+ //---------------------------------------------------------//-----------------------------------------------------------//
+ _______, KC_HOME, KC_PGUP, KC_PGDN, KC_END, KC_LPRN, KC_RPRN, KC_P4, KC_P5, KC_P6, KC_MINS, KC_PIPE,
+ //---------------------------------------------------------//-----------------------------------------------------------//
+ _______, _______, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_EQL, KC_UNDS,
+ //---------------------------------------------------------//-----------------------------------------------------------//
+ KC_LCTL, KC_HOME, KC_TRNS, KC_TRNS, KC_RALT, KC_RGUI, KC_SPC, KC_BSPC, KC_RCTL, KC_ENT),
- [2] = LAYOUT_split_4x6_5(
- KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
-//---------------------------------------------------------//--------------------------------------------------------------//
- _______, _______, RGB_RMOD, RGB_TOG, RGB_MOD, KC_LBRC, KC_RBRC, _______, KC_NLCK, KC_INS, KC_SLCK, KC_MUTE,
-//---------------------------------------------------------//--------------------------------------------------------------//
- _______, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, KC_LPRN, KC_RPRN, KC_MPRV, KC_MPLY, KC_MNXT, _______, KC_VOLU,
-//---------------------------------------------------------//--------------------------------------------------------------//
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD,
-//---------------------------------------------------------//--------------------------------------------------------------//
- KC_LCTL, KC_HOME, KC_TRNS, KC_TRNS, KC_RALT, QK_BOOT,
- KC_SPC, KC_BSPC, KC_RCTL, KC_ENT
- ),
+ [2] = LAYOUT_split_4x6_5(KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ //---------------------------------------------------------//--------------------------------------------------------------//
+ _______, _______, RGB_RMOD, RGB_TOG, RGB_MOD, KC_LBRC, KC_RBRC, _______, KC_NUM, KC_INS, KC_SCRL, KC_MUTE,
+ //---------------------------------------------------------//--------------------------------------------------------------//
+ _______, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, KC_LPRN, KC_RPRN, KC_MPRV, KC_MPLY, KC_MNXT, _______, KC_VOLU,
+ //---------------------------------------------------------//--------------------------------------------------------------//
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD,
+ //---------------------------------------------------------//--------------------------------------------------------------//
+ KC_LCTL, KC_HOME, KC_TRNS, KC_TRNS, KC_RALT, QK_BOOT, KC_SPC, KC_BSPC, KC_RCTL, KC_ENT),
};
diff --git a/keyboards/bastardkb/scylla/keymaps/german_gaming/keymap.c b/keyboards/bastardkb/scylla/keymaps/german_gaming/keymap.c
index 94dd182c69..c5f563c90b 100644
--- a/keyboards/bastardkb/scylla/keymaps/german_gaming/keymap.c
+++ b/keyboards/bastardkb/scylla/keymaps/german_gaming/keymap.c
@@ -60,14 +60,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, KC_PLUS, KC_PIPE, KC_UNDS, _______, _______, KC_P0 , KC_P1 , KC_P2 , KC_P3 , KC_PENT, KC_KP_EQUAL,
_______, KC_RGHT, _______, _______, _______, _______,
- KC_LEFT, _______, RESET , _______
+ KC_LEFT, _______, QK_BOOT, _______
),
[_RAISE] = LAYOUT_split_4x6_5(
KC_F12 , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 ,
- _______, _______, _______, KC_UP , _______, _______, KC_LALT, KC_INS , KC_NLCK , KC_CALC, KC_PSCREEN, KC_MUTE,
+ _______, _______, _______, KC_UP , _______, _______, KC_LALT, KC_INS , KC_NUM , KC_CALC, KC_PSCR , KC_MUTE,
_______, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_ENT , KC_MSEL, KC_MPRV , KC_MPLY , KC_MNXT, _______ , KC_VOLU,
- _______, _______, _______, _______, _______, _______, DE_HASH, KC_MYCM , _______ , _______, KC_SLCK , KC_VOLD,
+ _______, _______, _______, _______, _______, _______, DE_HASH, KC_MYCM , _______ , _______, KC_SCRL , KC_VOLD,
_______, _______, _______, _______, KC_UP , _______,
_______, _______, _______, KC_DOWN
@@ -75,7 +75,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_ADJUST] = LAYOUT_split_4x6_5(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- _______, _______, _______, _______, RESET , _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, DF(_GAME), _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, DF(_BASE), _______, _______, _______, _______, _______, _______,
diff --git a/keyboards/bastardkb/scylla/keymaps/xyverz/keymap.c b/keyboards/bastardkb/scylla/keymaps/xyverz/keymap.c
index b8f70bdc9b..2fb26dbf6f 100644
--- a/keyboards/bastardkb/scylla/keymaps/xyverz/keymap.c
+++ b/keyboards/bastardkb/scylla/keymaps/xyverz/keymap.c
@@ -56,7 +56,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_LOWER] = LAYOUT_split_4x6_5(
KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12,
- RESET, _______, _______, KC_UP, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, _______, _______,
+ QK_BOOT, _______, _______, KC_UP, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______, _______,
KC_CAPS, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_HOME, KC_PGUP, _______, KC_PLUS, KC_LCBR, KC_RCBR, _______,
_______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_END, KC_PGDN, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______,
_______, KC_DEL, _______, _______, _______, _______,
@@ -65,7 +65,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_RAISE] = LAYOUT_split_4x6_5(
KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12,
- _______, _______, _______, KC_UP, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, _______, RESET,
+ _______, _______, _______, KC_UP, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______, QK_BOOT,
KC_CAPS, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_HOME, KC_PGUP, _______, KC_EQL, KC_LBRC, KC_RBRC, _______,
_______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_END, KC_PGDN, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______,
_______, KC_DEL, _______, _______, _______, _______,
@@ -74,7 +74,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_ADJUST] = LAYOUT_split_4x6_5(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, WINDOWS, MAC, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______,
diff --git a/keyboards/bastardkb/scylla/readme.md b/keyboards/bastardkb/scylla/readme.md
index 70df5cfbb9..830b8eacda 100644
--- a/keyboards/bastardkb/scylla/readme.md
+++ b/keyboards/bastardkb/scylla/readme.md
@@ -6,17 +6,24 @@ A modern, low-profile split ergonomic keyboard
* Hardware Supported: elite-C V4
* Hardware Availability: [Bastard Keyboards](https://bastardkb.com/)
-Make example for this keyboard (after setting up your build environment):
+## Building the firmware
- make bastardkb/scylla:default
+**You must specify the shield version when compiling/flashing the firmware.**
+
+The template is:
+
+```shell
+qmk compile -kb bastardkb/scylla/{VERSION}/elitec -km {KEYMAP}
+```
+
+| Shield Version | default | via |
+| --------------- | ------------------------------------------------------------- | --------------------------------------------------------- |
+| v1 (Elite-C) | `qmk compile -kb bastardkb/scylla/v1/elitec -km default` | `qmk compile -kb bastardkb/scylla/v1/elitec -km via` |
+| v2 (Elite-C) | `qmk compile -kb bastardkb/scylla/v2/elitec -km default` | `qmk compile -kb bastardkb/scylla/v2/elitec -km via` |
+| v2 (Splinky v2) | `qmk compile -kb bastardkb/scylla/v2/splinky/v2 -km default` | `qmk compile -kb bastardkb/scylla/v2/splinky/v2 -km via` |
+| v2 (Splinky v3) | `qmk compile -kb bastardkb/scylla/v2/splinky/v3 -km default` | `qmk compile -kb bastardkb/scylla/v2/splinky/v3 -km via` |
+| v2 (STeMCell) | `qmk compile -kb bastardkb/scylla/v2/stemcell -km default` | `qmk compile -kb bastardkb/scylla/v2/stemcell -km via` |
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
See the [keyboard build instructions](https://docs.bastardkb.com)
-
-
-## Important information regarding the reset
-
-If you modify this firmware, make sure to always have a RESET key that can be triggered using only the master side ! This way you ensure that you can always flash the keyboard, even if you mess up.
-
-Otherwise if you're stuck, open the case and reset manually by shorting Gnd and Rst, or pressing the RST button.
diff --git a/keyboards/bastardkb/scylla/rules.mk b/keyboards/bastardkb/scylla/rules.mk
deleted file mode 100644
index fe2991040d..0000000000
--- a/keyboards/bastardkb/scylla/rules.mk
+++ /dev/null
@@ -1,22 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = atmel-dfu
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
-RGB_MATRIX_ENABLE = yes # Enable keyboard RGB matrix (do not use together with RGBLIGHT_ENABLE)
-RGB_MATRIX_DRIVER = WS2812 # RGB matrix driver support
-AUDIO_ENABLE = no # Audio output
-SPLIT_KEYBOARD = yes
-LTO_ENABLE = yes
diff --git a/keyboards/bastardkb/scylla/scylla.c b/keyboards/bastardkb/scylla/scylla.c
index b110d7ff5a..504cb0a219 100644
--- a/keyboards/bastardkb/scylla/scylla.c
+++ b/keyboards/bastardkb/scylla/scylla.c
@@ -1,4 +1,4 @@
-/*
+/**
* Copyright 2021 Quentin LEBASTARD
*
* This program is free software: you can redistribute it and/or modify
@@ -17,6 +17,7 @@
#include "scylla.h"
+// clang-format off
#ifdef RGB_MATRIX_ENABLE
led_config_t g_led_config = { {
// left
@@ -59,3 +60,4 @@ led_config_t g_led_config = { {
2, 2, 2, 2, 2
} };
#endif
+// clang-format on
diff --git a/keyboards/bastardkb/scylla/scylla.h b/keyboards/bastardkb/scylla/scylla.h
index 196982952f..4039ad3a94 100644
--- a/keyboards/bastardkb/scylla/scylla.h
+++ b/keyboards/bastardkb/scylla/scylla.h
@@ -1,5 +1,6 @@
-/*
+/*
* Copyright 2021 Quentin LEBASTARD