Compare commits

..

20 Commits

Author SHA1 Message Date
Pete Johanson
54be5bbe1d chore(main): release 0.4.0 2026-03-20 01:52:57 -06:00
Pete Johanson
e4fb39d4a6 fix(studio): Allow setting UART RPC thread priority (#3290)
To ensure we can tune things when other threads may have priority,
preventing UART processing in time for the studio UI requirements,
adjust our default UART thread priority, and allow overriding as needed.
2026-03-20 03:51:46 -04:00
Peter Cock
9278505975 fix(core): One tick kscan wait on RP2350 (#3255)
Override kscan tick wait time on RP2350 as well, to match RP2040.
2026-03-19 16:48:06 -04:00
dependabot[bot]
ff9d326939 chore(deps): bump actions/checkout from 4 to 5 (#3033)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-19 08:44:05 -06:00
André A. Gomes
df2e979d7e fix(ci): Skip build on empty build matrix (#3271)
Closes #3179
2026-03-16 10:37:54 -07:00
Pete Johanson
8feeb52eaf fix(ci): Better safeguards for ZMK variant build check (#3277)
Add an early guard to bail during the board compat check to ensure we
don't error out for out-of-tree boards with no ZMK variant.
2026-03-09 09:08:02 -06:00
Cem Aksoylar
714bbe30b0 docs: Fix #import to #include in dongle docs (#3276) 2026-03-05 15:38:51 -08:00
Pete Johanson
a23aa009d7 Add ZMK_BOARD_COMPAT symbol, that we can enable for our ZMK variants (#3265)
feat: Add ZMK_BOARD_COMPAT Kconfig symbol, and check for it

To properly detect users selecting a base board ID, when a ZMK variant
is available, add a ZMK_BOARD_COMPAT Kconfig symbol that the ZMK
variants will enable, allowing us to detect using the bare varand and
warn/error in CI so users don't end up with passing CI that results in
an unusable firmware due to missing ZMK enablement for keyboard name,
settings storage, etc.

refactor(boards): Add ZMK_BOARD_COMPAT to ZMK board variants

To clearly indicate the ZMK board variants are set up for ZMK usage,
select the ZMK_BOARD_COMPAT symbols for them.

fix(boards): Fix pillbug board.yml to report extension

Properly not the ZMK variant is part of an extension of the existing
pillbug board.
2026-03-03 10:39:11 -05:00
André A. Gomes
2a9ac3ba7f docs: Update Linux compatibility of C_AC_NEXT_KEYBOARD_LAYOUT_SELECT (#3268) 2026-03-02 11:39:08 -08:00
André A. Gomes
27afcb11ef docs: Add QMK comparison note for quick-tap-ms (#3257) 2026-02-27 13:19:37 -08:00
André A. Gomes
61f9ae4de2 docs: Replace deprecated variable names (#3260) 2026-02-27 13:17:36 -08:00
Seth Milliken
f6c629e895 fix: replace removed K_THREAD_STACK_MEMBER with K_KERNEL_STACK_MEMBER (#3218)
c.f.  https://docs.zephyrproject.org/latest/releases/release-notes-4.0.html#removed-apis-in-this-release
2026-02-26 18:14:36 -07:00
Seth Milliken
536375e45e fix: nice!view built-in widgets render failure from insufficient memory (#3243)
fixes #3219
2026-02-26 18:08:54 -07:00
André A. Gomes
e108e319c0 docs: Minor grammar fixes. (#3258) 2026-02-26 09:06:40 +00:00
Pete Johanson
9490391e1e fix(split): Use correct Kconfig for bumping TX buffers for discovery (#3216)
Newer Zephyr uses a different Kconfig value to control buffers for GATT
client discovery, so adjust our defaults to bump the correct value

Fixes: #3156
2026-02-18 03:16:16 -05:00
Pete Johanson
ed0fa157b1 docs: Fix up board IDs in the Zephyr 4.1 blog post to add ZMK variant (#3247)
Update the board revision/ID migration section of the Zephyr 4.1 blog
post to include the ZMK variant (`//zmk`).
2026-02-17 23:06:45 -08:00
Léo Cazenave
39a14154a9 docs: Fix C code examples in new behavior documentation (#3242) 2026-02-16 19:26:40 -08:00
Lucas SAUDON
5cfc67a334 fix(shields): Proper transparent binding in sofle raise layer (#3238)
Fix one binding in the Sofle raise layer that should be transparent in the stock keymap.
2026-02-15 12:18:40 -07:00
Peter Cock
75c9d5f6fd All 9 International & all 9 language keys recognized on macOS 15.6.1 (#3059)
* All nine International key recognized on macOS 15.6.1

Testing with Karabiner-EventViewer, reported as:
* international1
* japanese_pc_katakana
* international3
* japanese_pc_xfer
* international5
* international6
* japanese_pc_nfer
* international8
* international9

* All nine language keys recognized on macOS 15.6.1

Testing with Karabiner-EventViewer, reported as:
* japanese_eisuu (leave Japanese mode)
* japanese_kana (enter Japanese mode)
* lang3
* lang4
* lang5
* lang6
* lang7
* lang8
* lang9

* Insert line-break for style

* Move macOS Japanese notes to footnotes
2026-02-12 23:19:45 +01:00
Nicolas Munnich
e742da8e47 docs: Add new board guide (#3181)
* docs: Add new board guide

* docs: apply feedback from review
2026-02-12 20:26:11 +01:00
76 changed files with 653 additions and 260 deletions

View File

@@ -21,7 +21,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Find test directories - name: Find test directories
id: test-dirs id: test-dirs
run: | run: |
@@ -38,7 +38,7 @@ jobs:
image: docker.io/zmkfirmware/zmk-build-arm:4.1 image: docker.io/zmkfirmware/zmk-build-arm:4.1
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Cache west modules - name: Cache west modules
uses: actions/cache@v4 uses: actions/cache@v4
env: env:

View File

@@ -30,17 +30,28 @@ jobs:
name: Fetch Build Keyboards name: Fetch Build Keyboards
outputs: outputs:
build_matrix: ${{ env.build_matrix }} build_matrix: ${{ env.build_matrix }}
has_valid_build_matrix: ${{ steps.fetch.outputs.has_valid_build_matrix }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Fetch Build Matrix - name: Fetch Build Matrix
id: fetch
run: | run: |
echo "build_matrix=$(yq -oj -I0 '${{ inputs.build_matrix_path }}')" >> $GITHUB_ENV matrix_content=$(yq -oj -I0 '${{ inputs.build_matrix_path }}')
yq -oj "${{ inputs.build_matrix_path }}"
if [ -z "$matrix_content" ] || [ "$matrix_content" = "null" ]; then
echo "::notice file=${{inputs.build_matrix_path}},title=Empty build matrix file::To add a keyboard to the build, see https://zmk.dev/docs/user-setup#add-a-keyboard."
echo "has_valid_build_matrix=false" >> $GITHUB_OUTPUT
else
echo "build_matrix=$matrix_content" >> $GITHUB_ENV
echo "has_valid_build_matrix=true" >> $GITHUB_OUTPUT
echo "$matrix_content"
fi
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: needs.matrix.outputs.has_valid_build_matrix == 'true'
container: container:
image: zmkfirmware/zmk-build-arm:stable image: zmkfirmware/zmk-build-arm:stable
needs: matrix needs: matrix
@@ -56,7 +67,7 @@ jobs:
curl -fsSL https://deb.nodesource.com/setup_22.x | bash && apt install -y nodejs curl -fsSL https://deb.nodesource.com/setup_22.x | bash && apt install -y nodejs
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Create build directory - name: Create build directory
run: | run: |
@@ -147,6 +158,29 @@ jobs:
echo "See also the [list of released versions](https://github.com/zmkfirmware/zmk/releases)." >> $GITHUB_STEP_SUMMARY echo "See also the [list of released versions](https://github.com/zmkfirmware/zmk/releases)." >> $GITHUB_STEP_SUMMARY
echo "If you wish to stay on main, check the most recent pending release PR for breaking changes. [Our blog](https://zmk.dev/blog) may have upgrade information if breaking changes are significant." >> $GITHUB_STEP_SUMMARY echo "If you wish to stay on main, check the most recent pending release PR for breaking changes. [Our blog](https://zmk.dev/blog) may have upgrade information if breaking changes are significant." >> $GITHUB_STEP_SUMMARY
- name: Check if building a board without explicit ZMK compat
if: always()
working-directory: "${{ env.base_dir }}/${{ inputs.config_path }}"
run: |
if ! (grep "CONFIG_ZMK_BOARD_COMPAT=y" "${{ env.build_dir }}/zephyr/.config" > /dev/null)
then
original_board=$(echo "${{ matrix.board }}" | sed -e 's$/.*$$')
west_board=$(west boards --board-root ${{ env.base_dir }}/zmk/app/module --board-root ${{ env.base_dir }}/zmk/app --board "${original_board}")
if [ -z "$west_board" ]; then
echo "Not found the board listed with west boards. Skipping further checking."
exit 0
fi
west boards --board-root ${{ env.base_dir }}/zmk/app/module --board-root ${{ env.base_dir }}/zmk/app --board "${original_board}" --format "{qualifiers}" | grep "zmk" > /dev/null
if [ $? -ne 0 ]
then
echo "::warning file=build/zephyr/.config,title=Missing ZMK Compat::The selected board does not report explicit ZMK compat. Please verify you've selected the correct board and ZMK variant if one exists"
else
echo "::error file=build/zephyr/.config,title=Missing ZMK Compat::The selected board is not set up for ZMK and there is a ZMK variant available. See https://zmk.dev/blog/2025/12/09/zephyr-4-1#zmk-board-variant."
exit 1
fi
fi
- name: ${{ env.display_name }} Kconfig file - name: ${{ env.display_name }} Kconfig file
run: | run: |
if [ -f "${{ env.build_dir }}/zephyr/.config" ] if [ -f "${{ env.build_dir }}/zephyr/.config" ]
@@ -190,6 +224,7 @@ jobs:
merge: merge:
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: needs.matrix.outputs.has_valid_build_matrix == 'true'
needs: build needs: build
name: Merge Output Artifacts name: Merge Output Artifacts
steps: steps:

View File

@@ -30,7 +30,7 @@ jobs:
include: ${{ fromJSON(needs.compile-matrix.outputs.include-list) }} include: ${{ fromJSON(needs.compile-matrix.outputs.include-list) }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
with: with:
persist-credentials: false persist-credentials: false
- name: Cache west modules - name: Cache west modules
@@ -187,7 +187,7 @@ jobs:
core-include: ${{ steps.core-list.outputs.result }} core-include: ${{ steps.core-list.outputs.result }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
with: with:
persist-credentials: false persist-credentials: false
- name: Use Node.js - name: Use Node.js
@@ -218,7 +218,7 @@ jobs:
boards-include: ${{ steps.boards-list.outputs.result }} boards-include: ${{ steps.boards-list.outputs.result }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Use Node.js - name: Use Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
@@ -346,7 +346,7 @@ jobs:
organized-metadata: ${{ steps.organize-metadata.outputs.result }} organized-metadata: ${{ steps.organize-metadata.outputs.result }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
with: with:
persist-credentials: false persist-credentials: false
- name: Use Node.js - name: Use Node.js
@@ -428,7 +428,7 @@ jobs:
core-changes: ${{ steps.core-changes.outputs.result }} core-changes: ${{ steps.core-changes.outputs.result }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
with: with:
persist-credentials: false persist-credentials: false
- uses: tj-actions/changed-files@9200e69727eb73eb060652b19946b8a2fdfb654b # pin to v45.0.8 due to https://github.com/tj-actions/changed-files/issues/2463 https://www.stepsecurity.io/blog/harden-runner-detection-tj-actions-changed-files-action-is-compromised - uses: tj-actions/changed-files@9200e69727eb73eb060652b19946b8a2fdfb654b # pin to v45.0.8 due to https://github.com/tj-actions/changed-files/issues/2463 https://www.stepsecurity.io/blog/harden-runner-detection-tj-actions-changed-files-action-is-compromised

View File

@@ -14,7 +14,7 @@ jobs:
lint: lint:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
- uses: bahmutov/npm-install@v1 - uses: bahmutov/npm-install@v1
with: with:
working-directory: docs working-directory: docs
@@ -24,7 +24,7 @@ jobs:
typecheck: typecheck:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
- uses: bahmutov/npm-install@v1 - uses: bahmutov/npm-install@v1
with: with:
working-directory: docs working-directory: docs

View File

@@ -20,7 +20,7 @@ jobs:
container: container:
image: docker.io/zmkfirmware/zmk-dev-arm:4.1 image: docker.io/zmkfirmware/zmk-dev-arm:4.1
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
- name: Install dependencies - name: Install dependencies
run: pip install --break-system-packages -r app/scripts/requirements.txt run: pip install --break-system-packages -r app/scripts/requirements.txt
- name: West init - name: West init

View File

@@ -8,7 +8,7 @@ jobs:
pre-commit: pre-commit:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
- uses: actions/setup-python@v5 - uses: actions/setup-python@v5
with: with:
python-version: 3.x python-version: 3.x

View File

@@ -35,7 +35,7 @@ jobs:
ZMK_RELEASE_PLEASE_TOKEN: ${{ secrets.ZMK_RELEASE_PLEASE_TOKEN }} ZMK_RELEASE_PLEASE_TOKEN: ${{ secrets.ZMK_RELEASE_PLEASE_TOKEN }}
VERSION: v${{ needs.handle-commit.outputs.major }}.${{ needs.handle-commit.outputs.minor }} VERSION: v${{ needs.handle-commit.outputs.major }}.${{ needs.handle-commit.outputs.minor }}
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
- name: Create major.minor branch - name: Create major.minor branch
if: ${{ needs.handle-commit.outputs.patch == '0' }} if: ${{ needs.handle-commit.outputs.patch == '0' }}

View File

@@ -23,7 +23,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Find test directories - name: Find test directories
id: test-dirs id: test-dirs
run: | run: |
@@ -40,7 +40,7 @@ jobs:
image: docker.io/zmkfirmware/zmk-build-arm:4.1 image: docker.io/zmkfirmware/zmk-build-arm:4.1
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Cache west modules - name: Cache west modules
uses: actions/cache@v4 uses: actions/cache@v4
env: env:

View File

@@ -1 +1 @@
{".":"0.3.0"} {".":"0.4.0"}

View File

@@ -1,5 +1,100 @@
# Changelog # Changelog
## [0.4.0](https://github.com/zmkfirmware/zmk/compare/v0.3.0...v0.4.0) (2026-03-20)
### ⚠ BREAKING CHANGES
* Move to zephyr v4.1 ([#3060](https://github.com/zmkfirmware/zmk/issues/3060))
* **core:** Allow layer behaviors to "lock" layers on (https://github.com/zmkfirmware/zmk/pull/2717)
### Features
* Add double tap to enter bootloader functionality ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* Add nBOOT_SEL bit setup for STM32 G0/C0 targets ([f85ec7e](https://github.com/zmkfirmware/zmk/commit/f85ec7e7a24be10f1cf59025a192569dc0b33167))
* Add ZMK_BOARD_COMPAT Kconfig symbol, and check for it ([a23aa00](https://github.com/zmkfirmware/zmk/commit/a23aa009d7a07d67fe5609caca7372e16610f238))
* Allow layer behaviors to "lock" layers on (https://github.com/zmkfirmware/zmk/pull/2717) ([5138c6f](https://github.com/zmkfirmware/zmk/commit/5138c6fb14783b756c5a3e61581625c700f3555b))
* **behaviors:** Add retention boot mode to reset. ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **ble:** Use appearance set in the BT_DEVICE_APPEARANCE config ([#3115](https://github.com/zmkfirmware/zmk/issues/3115)) ([ad7fbfe](https://github.com/zmkfirmware/zmk/commit/ad7fbfef920d9907ca8f143e273fa9eb7d84b25a))
* **boards/shields:** Add settings for Rpi Pico and add tester_rpi_pico shield ([#2900](https://github.com/zmkfirmware/zmk/issues/2900)) ([ccf20a1](https://github.com/zmkfirmware/zmk/commit/ccf20a1f5c1534a197d32279abbe0eaf651099d8))
* **boards:** add support for nrf52840dongle_nrf52840 ([#3011](https://github.com/zmkfirmware/zmk/issues/3011)) ([c7fae18](https://github.com/zmkfirmware/zmk/commit/c7fae18ae122b2465080507380dd55d096edd666))
* **core:** (Optionally) use Zephyr keyboard input devices ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **core:** mapper for magic bootloader values. ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **display:** Add thread name to dedicated display queue. ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **docs:** Update New Behavior Guide ([#3107](https://github.com/zmkfirmware/zmk/issues/3107)) ([e34793e](https://github.com/zmkfirmware/zmk/commit/e34793e8c7193bc868b95ec38d78f67956f759cb))
* **endpoints:** add "no endpoint" value ([6e7e0de](https://github.com/zmkfirmware/zmk/commit/6e7e0de2b621073392816b284ab4931bee709ee8))
* **endpoints:** add "no endpoint" value ([#3140](https://github.com/zmkfirmware/zmk/issues/3140)) ([6e7e0de](https://github.com/zmkfirmware/zmk/commit/6e7e0de2b621073392816b284ab4931bee709ee8))
* **layouts:** Add physical layout for Redox shield ([61de01a](https://github.com/zmkfirmware/zmk/commit/61de01abb00a73349a188ef2e10ad1cd040d31b3))
* Move to zephyr v4.1 ([#3060](https://github.com/zmkfirmware/zmk/issues/3060)) ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **pointing:** Handle INPUT_BTN_TOUCH codes for mouse buttons ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **pointing:** Release pressed keys on disconnect ([#3204](https://github.com/zmkfirmware/zmk/issues/3204)) ([24487bd](https://github.com/zmkfirmware/zmk/commit/24487bd9744f504724089f0e1cec98431a2d3333))
* **shields:** Add Studio support to boardsource3x4 ([#3154](https://github.com/zmkfirmware/zmk/issues/3154)) ([40e06f3](https://github.com/zmkfirmware/zmk/commit/40e06f3c0084751f7ae012a71d92d5801ac3b7a0))
* **split:** Add HID indicators and physical layout set to Wired split ([#3103](https://github.com/zmkfirmware/zmk/issues/3103)) ([7738924](https://github.com/zmkfirmware/zmk/commit/773892434931b74bdf54474b73c909779daa9471))
### Bug Fixes
* Add "optional" folder to .gitignore ([#3141](https://github.com/zmkfirmware/zmk/issues/3141)) ([c099041](https://github.com/zmkfirmware/zmk/commit/c0990410da4c0a0c3776448e8c05ca2ce8778c8a))
* **behaviors:** correctly handle sensor rotation remainder ([#3084](https://github.com/zmkfirmware/zmk/issues/3084)) ([958fa78](https://github.com/zmkfirmware/zmk/commit/958fa788067e18c2228d016fcd826000bb8f0320))
* **boards:** Add xiao_ble sd_partition label for nosd snippet compat ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **boards:** Fix pillbug board.yml to report extension ([a23aa00](https://github.com/zmkfirmware/zmk/commit/a23aa009d7a07d67fe5609caca7372e16610f238))
* **boards:** Remove nano overlays for old nice_nano_v2 board ID. ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **boards:** Remove some references to old nice_nano_v2 board ID. ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **boards:** Retore bootloader support on XIAO BLE. ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **ci:** Better safeguards for ZMK variant build check ([#3277](https://github.com/zmkfirmware/zmk/issues/3277)) ([8feeb52](https://github.com/zmkfirmware/zmk/commit/8feeb52eafc716c1697cfe0515e98b78281c3543))
* **ci:** disable nrf5340dk from being built in our CI ([#3066](https://github.com/zmkfirmware/zmk/issues/3066)) ([522971f](https://github.com/zmkfirmware/zmk/commit/522971f41d62d7e5d6664eb61c84d190781feeb9))
* **ci:** Fix release please template bump ([#3021](https://github.com/zmkfirmware/zmk/issues/3021)) ([f3233c1](https://github.com/zmkfirmware/zmk/commit/f3233c1b60e4cb4c095572740bcbcaf7111eb804))
* **ci:** Pin @actions/artifact to a compatible release ([#3230](https://github.com/zmkfirmware/zmk/issues/3230)) ([ada1542](https://github.com/zmkfirmware/zmk/commit/ada1542940c3a01c0866c9fe9c30f489bc087328))
* **ci:** Prevent slash characters in artifact names. ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **ci:** Skip build on empty build matrix ([#3271](https://github.com/zmkfirmware/zmk/issues/3271)) ([df2e979](https://github.com/zmkfirmware/zmk/commit/df2e979d7e03ba84a503e3d90975a599d484b9e0)), closes [#3179](https://github.com/zmkfirmware/zmk/issues/3179)
* **core:** Don't force CBPRINTF_NANO, for proper formatting. ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **core:** Generate correct keymap layer names for all builds ([#3047](https://github.com/zmkfirmware/zmk/issues/3047)) ([0b5a103](https://github.com/zmkfirmware/zmk/commit/0b5a103c187ad337b9f50d824667866c4d7252e1)), closes [#3045](https://github.com/zmkfirmware/zmk/issues/3045)
* **core:** One tick kscan wait on RP2350 ([#3255](https://github.com/zmkfirmware/zmk/issues/3255)) ([9278505](https://github.com/zmkfirmware/zmk/commit/9278505975759e9cf01b4e6e8ead359b14a11400))
* **core:** Set a system work queue stack size of 2048 by default ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **core:** support magic bootloader values for nRF52833 ([#3163](https://github.com/zmkfirmware/zmk/issues/3163)) ([308de56](https://github.com/zmkfirmware/zmk/commit/308de56fb938057da7648a411ce0dce780dfc3f1))
* Disable Nordic dt-bindings header checks. ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **display:** Adjust stack sizes for display usage. ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **display:** Fix setting the small font for the mono theme. ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **display:** port nice!view display code ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **docs:** Improve ZMK setup instructions ([#3209](https://github.com/zmkfirmware/zmk/issues/3209)) ([354cff9](https://github.com/zmkfirmware/zmk/commit/354cff9c36b49eee6abbb8a61e6b927539aebbf2))
* **docs:** Tweak layer tap example to be clearer ([#3023](https://github.com/zmkfirmware/zmk/issues/3023)) ([919bce7](https://github.com/zmkfirmware/zmk/commit/919bce7962db78139415ccf0e80fb858c89adb3d))
* Don't enable ZMK Display by default for a few shields ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **endpoints:** Add endpoint setting upgrade ([6e7e0de](https://github.com/zmkfirmware/zmk/commit/6e7e0de2b621073392816b284ab4931bee709ee8))
* Fix redundant const warning ([#3139](https://github.com/zmkfirmware/zmk/issues/3139)) ([8987f39](https://github.com/zmkfirmware/zmk/commit/8987f3979d7877114ede2f34edb5570a6b454460))
* **hid:** initialize missing d_scroll_x field in mouse report ([#3196](https://github.com/zmkfirmware/zmk/issues/3196)) ([abce9de](https://github.com/zmkfirmware/zmk/commit/abce9deab76124d72c61a824aaa1affc3dbc1260))
* **keymap:** Fix overflow in get/set bindings ([#3205](https://github.com/zmkfirmware/zmk/issues/3205)) ([ab46f48](https://github.com/zmkfirmware/zmk/commit/ab46f48dde8aa70e44a2fc2d2a1b81ae703d4981))
* nice!view built-in widgets render failure from insufficient memory ([#3243](https://github.com/zmkfirmware/zmk/issues/3243)) ([536375e](https://github.com/zmkfirmware/zmk/commit/536375e45ef6d01a9c194803525bf9dd5e119421)), closes [#3219](https://github.com/zmkfirmware/zmk/issues/3219)
* **pointing:** Refactor for changes to input API ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* Refactor for new Zephyr PM API ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* Remove usage of renamed Kconfig from core coverage. ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* replace removed `K_THREAD_STACK_MEMBER` with `K_KERNEL_STACK_MEMBER` ([#3218](https://github.com/zmkfirmware/zmk/issues/3218)) ([f6c629e](https://github.com/zmkfirmware/zmk/commit/f6c629e895bbe3957ec243afb80b11e1e4b4e503))
* **sensors:** Initialize sensor data to 0 before fetching. ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* Set default transport according to enabled transports ([6e7e0de](https://github.com/zmkfirmware/zmk/commit/6e7e0de2b621073392816b284ab4931bee709ee8))
* **shields:** Proper transparent binding in sofle raise layer ([#3238](https://github.com/zmkfirmware/zmk/issues/3238)) ([5cfc67a](https://github.com/zmkfirmware/zmk/commit/5cfc67a33402b24ab893b8d71cef1af2a869adbb))
* **split:** correct async UART RX buffer definition ([#3193](https://github.com/zmkfirmware/zmk/issues/3193)) ([36dbf46](https://github.com/zmkfirmware/zmk/commit/36dbf467644d4b4b6b9176241d42261d27fb18f2))
* **split:** int to pointer cast in bas proxy ([#3105](https://github.com/zmkfirmware/zmk/issues/3105)) ([ece2ce1](https://github.com/zmkfirmware/zmk/commit/ece2ce11b8c7245fbe2b4e41ec9fa7a870632e6c))
* **split:** Properly return from command handler ([#3120](https://github.com/zmkfirmware/zmk/issues/3120)) ([d32ffb0](https://github.com/zmkfirmware/zmk/commit/d32ffb0a335ece70a9ce3dc3ce014676534ee99b))
* **split:** Use correct Kconfig for bumping TX buffers for discovery ([#3216](https://github.com/zmkfirmware/zmk/issues/3216)) ([9490391](https://github.com/zmkfirmware/zmk/commit/9490391e1e4010c83291d437b7f9a71ace244581)), closes [#3156](https://github.com/zmkfirmware/zmk/issues/3156)
* **studio:** Allow setting UART RPC thread priority ([#3290](https://github.com/zmkfirmware/zmk/issues/3290)) ([e4fb39d](https://github.com/zmkfirmware/zmk/commit/e4fb39d4a6514fe90d44b1570f908bddc5df0ad2))
* **studio:** avoid decoding buffer overflow ([#3185](https://github.com/zmkfirmware/zmk/issues/3185)) ([70ab6b2](https://github.com/zmkfirmware/zmk/commit/70ab6b243a90b556d113fcdd0c8de1ef3dccdc1e))
* **studio:** Correct `memset` usage. ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **studio:** Correct usage of thread analyzer API ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **studio:** Properly serialize GATT RPC indications. ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **tests:** Fix BLE test to account for Zephyr changes ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **underglow:** Remove use of removed Kconfig WS2812 symbol ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **usb:** Adjust Kconfig settings for USB. ([c06fa48](https://github.com/zmkfirmware/zmk/commit/c06fa48ce59e016105d79c20942d085314502d8d))
* **usb:** Prevent unexpected USB disconnection caused by USB SOF ([#3070](https://github.com/zmkfirmware/zmk/issues/3070)) ([118359c](https://github.com/zmkfirmware/zmk/commit/118359c83efa0758144489fd5e12cc6f5bdbad4c))
### Documentation
* Added documentation note on locking layers ([5138c6f](https://github.com/zmkfirmware/zmk/commit/5138c6fb14783b756c5a3e61581625c700f3555b))
### Code Refactoring
* **core:** Allow layer behaviors to "lock" layers on (https://github.com/zmkfirmware/zmk/pull/2717) ([5138c6f](https://github.com/zmkfirmware/zmk/commit/5138c6fb14783b756c5a3e61581625c700f3555b))
## [0.3.0](https://github.com/zmkfirmware/zmk/compare/v0.2.1...v0.3.0) (2025-08-01) ## [0.3.0](https://github.com/zmkfirmware/zmk/compare/v0.2.1...v0.3.0) (2025-08-01)

View File

@@ -5,6 +5,17 @@ mainmenu "ZMK Firmware"
menu "ZMK" menu "ZMK"
config ZMK_BOARD_COMPAT
bool
help
Hidden symbol used to hint that a board has been specifically
set up with various ZMK requirements in mind, e.g. settings
storage, bootloader integration, etc.
Failure to set this will warn users they may want to verify they
used a ZMK variant of an upstream board, or are using a board
properly migrated to a newer ZMK version.
menu "Basic Keyboard Setup" menu "Basic Keyboard Setup"
config ZMK_KEYBOARD_NAME config ZMK_KEYBOARD_NAME

View File

@@ -3,7 +3,7 @@ VERSION_MAJOR = 0
# x-release-please-end # x-release-please-end
# x-release-please-start-minor # x-release-please-start-minor
VERSION_MINOR = 3 VERSION_MINOR = 4
# x-release-please-end # x-release-please-end
# x-release-please-start-patch # x-release-please-start-patch

View File

@@ -0,0 +1,9 @@
# Copyright (c) 2026 The ZMK Contributors
# SPDX-License-Identifier: MIT
config BOARD_ADAFRUIT_KB2040
select ZMK_BOARD_COMPAT if BOARD_ADAFRUIT_KB2040_RP2040_ZMK
imply RETAINED_MEM if BOARD_ADAFRUIT_KB2040_RP2040_ZMK
imply RETENTION if BOARD_ADAFRUIT_KB2040_RP2040_ZMK
imply RETENTION_BOOT_MODE if BOARD_ADAFRUIT_KB2040_RP2040_ZMK

View File

@@ -0,0 +1,9 @@
# Copyright (c) 2026 The ZMK Contributors
# SPDX-License-Identifier: MIT
config BOARD_ADAFRUIT_QT_PY_RP2040
select ZMK_BOARD_COMPAT if BOARD_ADAFRUIT_QT_PY_RP2040_RP2040_ZMK
imply RETAINED_MEM if BOARD_ADAFRUIT_QT_PY_RP2040_RP2040_ZMK
imply RETENTION if BOARD_ADAFRUIT_QT_PY_RP2040_RP2040_ZMK
imply RETENTION_BOOT_MODE if BOARD_ADAFRUIT_QT_PY_RP2040_RP2040_ZMK

View File

@@ -0,0 +1,9 @@
# Copyright (c) 2026 Pete Johanson
# SPDX-License-Identifier: MIT
config BOARD_BOARDSOURCE_BLOK
select ZMK_BOARD_COMPAT if BOARD_BOARDSOURCE_BLOK_RP2040_ZMK
imply RETAINED_MEM if BOARD_BOARDSOURCE_BLOK_RP2040_ZMK
imply RETENTION if BOARD_BOARDSOURCE_BLOK_RP2040_ZMK
imply RETENTION_BOOT_MODE if BOARD_BOARDSOURCE_BLOK_RP2040_ZMK

View File

@@ -7,6 +7,7 @@ config BOARD_NRFMICRO
select SOC_NRF52840_QIAA if BOARD_NRFMICRO_NRF52840_ZMK select SOC_NRF52840_QIAA if BOARD_NRFMICRO_NRF52840_ZMK
select SOC_NRF52840_QIAA if BOARD_NRFMICRO_NRF52840_FLIPPED_ZMK select SOC_NRF52840_QIAA if BOARD_NRFMICRO_NRF52840_FLIPPED_ZMK
select SOC_NRF52833_QIAA if BOARD_NRFMICRO_NRF52833_ZMK select SOC_NRF52833_QIAA if BOARD_NRFMICRO_NRF52833_ZMK
select ZMK_BOARD_COMPAT if BOARD_NRFMICRO_NRF52840_ZMK || BOARD_NRFMICRO_NRF52840_FLIPPED_ZMK || BOARD_NRFMICRO_NRF52833_ZMK
imply RETAINED_MEM if BOARD_NRFMICRO_NRF52840_ZMK || BOARD_NRFMICRO_NRF52840_FLIPPED_ZMK || BOARD_NRFMICRO_NRF52833_ZMK imply RETAINED_MEM if BOARD_NRFMICRO_NRF52840_ZMK || BOARD_NRFMICRO_NRF52840_FLIPPED_ZMK || BOARD_NRFMICRO_NRF52833_ZMK
imply RETENTION if BOARD_NRFMICRO_NRF52840_ZMK || BOARD_NRFMICRO_NRF52840_FLIPPED_ZMK || BOARD_NRFMICRO_NRF52833_ZMK imply RETENTION if BOARD_NRFMICRO_NRF52840_ZMK || BOARD_NRFMICRO_NRF52840_FLIPPED_ZMK || BOARD_NRFMICRO_NRF52833_ZMK
imply RETENTION_BOOT_MODE if BOARD_NRFMICRO_NRF52840_ZMK || BOARD_NRFMICRO_NRF52840_FLIPPED_ZMK || BOARD_NRFMICRO_NRF52833_ZMK imply RETENTION_BOOT_MODE if BOARD_NRFMICRO_NRF52840_ZMK || BOARD_NRFMICRO_NRF52840_FLIPPED_ZMK || BOARD_NRFMICRO_NRF52833_ZMK

View File

@@ -3,6 +3,7 @@
config BOARD_BLUEMICRO840 config BOARD_BLUEMICRO840
select SOC_NRF52840_QIAA select SOC_NRF52840_QIAA
select ZMK_BOARD_COMPAT if BOARD_BLUEMICRO840_NRF52840_ZMK
imply RETAINED_MEM if BOARD_BLUEMICRO840_NRF52840_ZMK imply RETAINED_MEM if BOARD_BLUEMICRO840_NRF52840_ZMK
imply RETENTION if BOARD_BLUEMICRO840_NRF52840_ZMK imply RETENTION if BOARD_BLUEMICRO840_NRF52840_ZMK
imply RETENTION_BOOT_MODE if BOARD_BLUEMICRO840_NRF52840_ZMK imply RETENTION_BOOT_MODE if BOARD_BLUEMICRO840_NRF52840_ZMK

View File

@@ -3,6 +3,7 @@
config BOARD_TOFU65 config BOARD_TOFU65
select SOC_RP2040 select SOC_RP2040
select ZMK_BOARD_COMPAT
imply RETAINED_MEM imply RETAINED_MEM
imply RETENTION imply RETENTION
imply RETENTION_BOOT_MODE imply RETENTION_BOOT_MODE

View File

@@ -3,3 +3,4 @@
config BOARD_BDN9 config BOARD_BDN9
select SOC_STM32F072XB select SOC_STM32F072XB
select ZMK_BOARD_COMPAT

View File

@@ -5,6 +5,7 @@
config BOARD_PUCHI_BLE config BOARD_PUCHI_BLE
select SOC_NRF52840_QIAA select SOC_NRF52840_QIAA
select ZMK_BOARD_COMPAT if BOARD_PUCHI_BLE_NRF52840_ZMK
imply RETAINED_MEM if BOARD_PUCHI_BLE_NRF52840_ZMK imply RETAINED_MEM if BOARD_PUCHI_BLE_NRF52840_ZMK
imply RETENTION if BOARD_PUCHI_BLE_NRF52840_ZMK imply RETENTION if BOARD_PUCHI_BLE_NRF52840_ZMK
imply RETENTION_BOOT_MODE if BOARD_PUCHI_BLE_NRF52840_ZMK imply RETENTION_BOOT_MODE if BOARD_PUCHI_BLE_NRF52840_ZMK

View File

@@ -5,6 +5,7 @@
config BOARD_ADV360PRO_LEFT config BOARD_ADV360PRO_LEFT
select SOC_NRF52840_QIAA select SOC_NRF52840_QIAA
select ZMK_BOARD_COMPAT
imply RETAINED_MEM imply RETAINED_MEM
imply RETENTION imply RETENTION
imply RETENTION_BOOT_MODE imply RETENTION_BOOT_MODE

View File

@@ -5,6 +5,7 @@
config BOARD_ADV360PRO_RIGHT config BOARD_ADV360PRO_RIGHT
select SOC_NRF52840_QIAA select SOC_NRF52840_QIAA
select ZMK_BOARD_COMPAT
imply RETAINED_MEM imply RETAINED_MEM
imply RETENTION imply RETENTION
imply RETENTION_BOOT_MODE imply RETENTION_BOOT_MODE

View File

@@ -5,6 +5,7 @@
config BOARD_CORNEISH_ZEN_LEFT config BOARD_CORNEISH_ZEN_LEFT
select SOC_NRF52840_QIAA select SOC_NRF52840_QIAA
select ZMK_BOARD_COMPAT
imply RETAINED_MEM imply RETAINED_MEM
imply RETENTION imply RETENTION
imply RETENTION_BOOT_MODE imply RETENTION_BOOT_MODE

View File

@@ -5,6 +5,7 @@
config BOARD_CORNEISH_ZEN_RIGHT config BOARD_CORNEISH_ZEN_RIGHT
select SOC_NRF52840_QIAA select SOC_NRF52840_QIAA
select ZMK_BOARD_COMPAT
imply RETAINED_MEM imply RETAINED_MEM
imply RETENTION imply RETENTION
imply RETENTION_BOOT_MODE imply RETENTION_BOOT_MODE

View File

@@ -3,6 +3,7 @@
config BOARD_NRF52840_M2 config BOARD_NRF52840_M2
select SOC_NRF52840_QIAA select SOC_NRF52840_QIAA
select ZMK_BOARD_COMPAT if BOARD_NRF52840_M2_NRF52840_ZMK
imply RETAINED_MEM if BOARD_NRF52840_M2_NRF52840_ZMK imply RETAINED_MEM if BOARD_NRF52840_M2_NRF52840_ZMK
imply RETENTION if BOARD_NRF52840_M2_NRF52840_ZMK imply RETENTION if BOARD_NRF52840_M2_NRF52840_ZMK
imply RETENTION_BOOT_MODE if BOARD_NRF52840_M2_NRF52840_ZMK imply RETENTION_BOOT_MODE if BOARD_NRF52840_M2_NRF52840_ZMK

View File

@@ -3,6 +3,7 @@
config BOARD_PILLBUG config BOARD_PILLBUG
select SOC_NRF52840_QIAA select SOC_NRF52840_QIAA
select ZMK_BOARD_COMPAT if BOARD_PILLBUG_NRF52840_ZMK
imply RETAINED_MEM if BOARD_PILLBUG_NRF52840_ZMK imply RETAINED_MEM if BOARD_PILLBUG_NRF52840_ZMK
imply RETENTION if BOARD_PILLBUG_NRF52840_ZMK imply RETENTION if BOARD_PILLBUG_NRF52840_ZMK
imply RETENTION_BOOT_MODE if BOARD_PILLBUG_NRF52840_ZMK imply RETENTION_BOOT_MODE if BOARD_PILLBUG_NRF52840_ZMK

View File

@@ -1,5 +1,5 @@
board: board:
name: pillbug extend: pillbug
variants: variants:
- name: zmk - name: zmk
qualifier: nrf52840 qualifier: nrf52840

View File

@@ -3,6 +3,7 @@
config BOARD_GLOVE80_LH config BOARD_GLOVE80_LH
select SOC_NRF52840_QIAA select SOC_NRF52840_QIAA
select ZMK_BOARD_COMPAT
imply RETAINED_MEM imply RETAINED_MEM
imply RETENTION imply RETENTION
imply RETENTION_BOOT_MODE imply RETENTION_BOOT_MODE

View File

@@ -3,6 +3,7 @@
config BOARD_GLOVE80_RH config BOARD_GLOVE80_RH
select SOC_NRF52840_QIAA select SOC_NRF52840_QIAA
select ZMK_BOARD_COMPAT
imply RETAINED_MEM imply RETAINED_MEM
imply RETENTION imply RETENTION
imply RETENTION_BOOT_MODE imply RETENTION_BOOT_MODE

View File

@@ -3,6 +3,7 @@
config BOARD_NICE60 config BOARD_NICE60
select SOC_NRF52840_QIAA select SOC_NRF52840_QIAA
imply RETAINED_MEM select ZMK_BOARD_COMPAT if BOARD_NICE60_NRF52840_ZMK
imply RETENTION imply RETAINED_MEM if BOARD_NICE60_NRF52840_ZMK
imply RETENTION_BOOT_MODE imply RETENTION if BOARD_NICE60_NRF52840_ZMK
imply RETENTION_BOOT_MODE if BOARD_NICE60_NRF52840_ZMK

View File

@@ -3,6 +3,7 @@
config BOARD_NICE_NANO config BOARD_NICE_NANO
select SOC_NRF52840_QIAA select SOC_NRF52840_QIAA
select ZMK_BOARD_COMPAT if BOARD_NICE_NANO_NRF52840_ZMK
imply RETAINED_MEM if BOARD_NICE_NANO_NRF52840_ZMK imply RETAINED_MEM if BOARD_NICE_NANO_NRF52840_ZMK
imply RETENTION if BOARD_NICE_NANO_NRF52840_ZMK imply RETENTION if BOARD_NICE_NANO_NRF52840_ZMK
imply RETENTION_BOOT_MODE if BOARD_NICE_NANO_NRF52840_ZMK imply RETENTION_BOOT_MODE if BOARD_NICE_NANO_NRF52840_ZMK

View File

@@ -1,3 +1,4 @@
config BOARD_NRF52840DK config BOARD_NRF52840DK
select SOC_NRF52840_QIAA if BOARD_NRF52840DK_NRF52840_ZMK select SOC_NRF52840_QIAA if BOARD_NRF52840DK_NRF52840_ZMK
select ZMK_BOARD_COMPAT if BOARD_NRF52840DK_NRF52840_ZMK

View File

@@ -4,5 +4,5 @@
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
config BOARD_PLANCK config BOARD_PLANCK
bool "Planck Keyboard"
select SOC_STM32F303XC select SOC_STM32F303XC
select ZMK_BOARD_COMPAT

View File

@@ -5,3 +5,4 @@
config BOARD_PREONIC config BOARD_PREONIC
select SOC_STM32F303XC select SOC_STM32F303XC
select ZMK_BOARD_COMPAT

View File

@@ -5,6 +5,7 @@
config BOARD_FERRIS config BOARD_FERRIS
select SOC_STM32F072XB select SOC_STM32F072XB
select ZMK_BOARD_COMPAT
imply RETAINED_MEM imply RETAINED_MEM
imply RETENTION imply RETENTION
imply RETENTION_BOOT_MODE imply RETENTION_BOOT_MODE

View File

@@ -5,6 +5,7 @@
config BOARD_BT60 config BOARD_BT60
select SOC_NRF52840_QIAA select SOC_NRF52840_QIAA
select ZMK_BOARD_COMPAT
imply RETAINED_MEM imply RETAINED_MEM
imply RETENTION imply RETENTION
imply RETENTION_BOOT_MODE imply RETENTION_BOOT_MODE

View File

@@ -5,6 +5,7 @@
config BOARD_BT60_HS config BOARD_BT60_HS
select SOC_NRF52840_QIAA select SOC_NRF52840_QIAA
select ZMK_BOARD_COMPAT
imply RETAINED_MEM imply RETAINED_MEM
imply RETENTION imply RETENTION
imply RETENTION_BOOT_MODE imply RETENTION_BOOT_MODE

View File

@@ -5,6 +5,7 @@
config BOARD_BT65 config BOARD_BT65
select SOC_NRF52840_QIAA select SOC_NRF52840_QIAA
select ZMK_BOARD_COMPAT
imply RETAINED_MEM imply RETAINED_MEM
imply RETENTION imply RETENTION
imply RETENTION_BOOT_MODE imply RETENTION_BOOT_MODE

View File

@@ -5,6 +5,7 @@
config BOARD_BT75 config BOARD_BT75
select SOC_NRF52840_QIAA select SOC_NRF52840_QIAA
select ZMK_BOARD_COMPAT
imply RETAINED_MEM imply RETAINED_MEM
imply RETENTION imply RETENTION
imply RETENTION_BOOT_MODE imply RETENTION_BOOT_MODE

View File

@@ -0,0 +1,6 @@
# Copyright (c) 2026 The ZMK Contributors
# SPDX-License-Identifier: Apache-2.0
config BOARD_PROTON_C
select ZMK_BOARD_COMPAT

View File

@@ -0,0 +1,10 @@
# Copyright (c) 2026 The ZMK Contributors
# SPDX-License-Identifier: MIT
config BOARD_RPI_PICO
select SOC_RP2040
select ZMK_BOARD_COMPAT if BOARD_RPI_PICO_RP2040_ZMK
imply RETAINED_MEM if BOARD_RPI_PICO_RP2040_ZMK
imply RETENTION if BOARD_RPI_PICO_RP2040_ZMK
imply RETENTION_BOOT_MODE if BOARD_RPI_PICO_RP2040_ZMK

View File

@@ -0,0 +1,9 @@
# Copyright (c) 2026 Pete Johanson
# SPDX-License-Identifier: MIT
config BOARD_SEEEDUINO_XIAO
select ZMK_BOARD_COMPAT if BOARD_SEEEDUINO_XIAO_SAMD21G18A_ZMK
imply RETAINED_MEM if BOARD_SEEEDUINO_XIAO_SAMD21G18A_ZMK
imply RETENTION if BOARD_SEEEDUINO_XIAO_SAMD21G18A_ZMK
imply RETENTION_BOOT_MODE if BOARD_SEEEDUINO_XIAO_SAMD21G18A_ZMK

View File

@@ -0,0 +1,10 @@
# Copyright (c) 2026 Pete Johanson
# SPDX-License-Identifier: MIT
config BOARD_XIAO_BLE
select SOC_NRF52840_QIAA
select ZMK_BOARD_COMPAT if BOARD_XIAO_BLE_NRF52840_ZMK
imply RETAINED_MEM if BOARD_XIAO_BLE_NRF52840_ZMK
imply RETENTION if BOARD_XIAO_BLE_NRF52840_ZMK
imply RETENTION_BOOT_MODE if BOARD_XIAO_BLE_NRF52840_ZMK

View File

@@ -26,6 +26,7 @@ endchoice
config LV_Z_MEM_POOL_SIZE config LV_Z_MEM_POOL_SIZE
default 8192 if ZMK_DISPLAY_STATUS_SCREEN_CUSTOM default 8192 if ZMK_DISPLAY_STATUS_SCREEN_CUSTOM
default 5120 if ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN
config ZMK_DISPLAY_STATUS_SCREEN_CUSTOM config ZMK_DISPLAY_STATUS_SCREEN_CUSTOM
imply NICE_VIEW_WIDGET_STATUS imply NICE_VIEW_WIDGET_STATUS

View File

@@ -78,7 +78,7 @@
// | | | | | | | | | | | | // | | | | | | | | | | | |
bindings = < bindings = <
&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans
&trans &kp INS &kp PSCRN &kp K_CMENU &trans &trans &kp PG_UP &trans &kp UP &trans &kp N0 &trans &trans &kp INS &kp PSCRN &kp K_CMENU &trans &trans &kp PG_UP &trans &kp UP &trans &trans &trans
&trans &kp LALT &kp LCTRL &kp LSHFT &trans &kp CLCK &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &kp DEL &kp BSPC &trans &kp LALT &kp LCTRL &kp LSHFT &trans &kp CLCK &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &kp DEL &kp BSPC
&trans &kp K_UNDO &kp K_CUT &kp K_COPY &kp K_PASTE &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp K_UNDO &kp K_CUT &kp K_COPY &kp K_PASTE &trans &trans &trans &trans &trans &trans &trans &trans &trans
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans

View File

@@ -0,0 +1,10 @@
# Copyright (c) 2026 The ZMK Contributors
# SPDX-License-Identifier: MIT
config BOARD_SPARKFUN_PRO_MICRO_RP2040
select ZMK_BOARD_COMPAT if BOARD_SPARKFUN_PRO_MICRO_RP2040_RP2040_ZMK
imply RETAINED_MEM if BOARD_SPARKFUN_PRO_MICRO_RP2040_RP2040_ZMK
imply RETENTION if BOARD_SPARKFUN_PRO_MICRO_RP2040_RP2040_ZMK
imply RETENTION_BOOT_MODE if BOARD_SPARKFUN_PRO_MICRO_RP2040_RP2040_ZMK

View File

@@ -0,0 +1,6 @@
# Copyright (c) 2026 The ZMK Contributors
# SPDX-License-Identifier: MIT
config BOARD_BLACKPILL_F401CC
select ZMK_BOARD_COMPAT

View File

@@ -0,0 +1,6 @@
# Copyright (c) 2026 The ZMK Contributors
# SPDX-License-Identifier: MIT
config BOARD_BLACKPILL_F401CE
select ZMK_BOARD_COMPAT

View File

@@ -0,0 +1,6 @@
# Copyright (c) 2026 The ZMK Contributors
# SPDX-License-Identifier: MIT
config BOARD_BLACKPILL_F411CE
select ZMK_BOARD_COMPAT

View File

@@ -3,6 +3,7 @@
config BOARD_MIKOTO config BOARD_MIKOTO
select SOC_NRF52840_QIAA select SOC_NRF52840_QIAA
select ZMK_BOARD_COMPAT if BOARD_MIKOTO_NRF52840_ZMK
imply RETAINED_MEM if BOARD_MIKOTO_NRF52840_ZMK imply RETAINED_MEM if BOARD_MIKOTO_NRF52840_ZMK
imply RETENTION if BOARD_MIKOTO_NRF52840_ZMK imply RETENTION if BOARD_MIKOTO_NRF52840_ZMK
imply RETENTION_BOOT_MODE if BOARD_MIKOTO_NRF52840_ZMK imply RETENTION_BOOT_MODE if BOARD_MIKOTO_NRF52840_ZMK

View File

@@ -1,22 +0,0 @@
/*
* Copyright (c) 2025 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <dt-bindings/zmk/behaviors.h>
/ {
macros {
#if ZMK_BEHAVIOR_OMIT(KTAP)
/omit-if-no-ref/
#endif
ktap: key_tap {
compatible = "zmk,behavior-macro-one-param";
#binding-cells = <1>;
display-name = "Key Tap";
bindings = <&macro_param_1to1>, <&kp MACRO_PLACEHOLDER>;
tap-ms = <30>;
};
};
};

View File

@@ -16,25 +16,5 @@
#binding-cells = <1>; #binding-cells = <1>;
display-name = "Key Toggle"; display-name = "Key Toggle";
}; };
#if ZMK_BEHAVIOR_OMIT(KT_ON)
/omit-if-no-ref/
#endif
kt_on: key_toggle_on {
compatible = "zmk,behavior-key-toggle";
#binding-cells = <1>;
display-name = "Key Toggle On";
toggle-mode = "on";
};
#if ZMK_BEHAVIOR_OMIT(KT_OFF)
/omit-if-no-ref/
#endif
kt_off: key_toggle_off {
compatible = "zmk,behavior-key-toggle";
#binding-cells = <1>;
display-name = "Key Toggle Off";
toggle-mode = "off";
};
}; };
}; };

View File

@@ -17,25 +17,5 @@
display-name = "Toggle Layer"; display-name = "Toggle Layer";
locking; locking;
}; };
#if ZMK_BEHAVIOR_OMIT(TOG_ON)
/omit-if-no-ref/
#endif
tog_on: toggle_layer_on {
compatible = "zmk,behavior-toggle-layer";
#binding-cells = <1>;
display-name = "Toggle Layer On";
toggle-mode = "on";
};
#if ZMK_BEHAVIOR_OMIT(TOG_OFF)
/omit-if-no-ref/
#endif
tog_off: toggle_layer_off {
compatible = "zmk,behavior-toggle-layer";
#binding-cells = <1>;
display-name = "Toggle Layer Off";
toggle-mode = "off";
};
}; };
}; };

View File

@@ -61,7 +61,7 @@ config ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS
config ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS config ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS
int "Ticks to wait between each output when scanning" int "Ticks to wait between each output when scanning"
default 1 if SOC_RP2040 default 1 if SOC_RP2040 || SOC_SERIES_RP2350
default 0 default 0
help help
When iterating over each output to drive it active, read inputs, then set When iterating over each output to drive it active, read inputs, then set

View File

@@ -33,7 +33,7 @@ struct ec11_data {
const struct sensor_trigger *trigger; const struct sensor_trigger *trigger;
#if defined(CONFIG_EC11_TRIGGER_OWN_THREAD) #if defined(CONFIG_EC11_TRIGGER_OWN_THREAD)
K_THREAD_STACK_MEMBER(thread_stack, CONFIG_EC11_THREAD_STACK_SIZE); K_KERNEL_STACK_MEMBER(thread_stack, CONFIG_EC11_THREAD_STACK_SIZE);
struct k_sem gpio_sem; struct k_sem gpio_sem;
struct k_thread thread; struct k_thread thread;
#elif defined(CONFIG_EC11_TRIGGER_GLOBAL_THREAD) #elif defined(CONFIG_EC11_TRIGGER_GLOBAL_THREAD)

View File

@@ -22,8 +22,8 @@ config ZMK_SPLIT_ROLE_CENTRAL
select BT_SCAN_WITH_IDENTITY select BT_SCAN_WITH_IDENTITY
# Bump this value needed for concurrent GATT discovery of splits # Bump this value needed for concurrent GATT discovery of splits
config BT_L2CAP_TX_BUF_COUNT config BT_ATT_TX_COUNT
default 5 if ZMK_SPLIT_ROLE_CENTRAL default 10 if ZMK_SPLIT_ROLE_CENTRAL
if ZMK_SPLIT_ROLE_CENTRAL if ZMK_SPLIT_ROLE_CENTRAL

View File

@@ -59,11 +59,20 @@ config ZMK_STUDIO_TRANSPORT_UART
select RING_BUFFER select RING_BUFFER
default y if $(dt_chosen_enabled,$(DT_CHOSEN_ZMK_STUDIO_RPC_UART)) default y if $(dt_chosen_enabled,$(DT_CHOSEN_ZMK_STUDIO_RPC_UART))
if ZMK_STUDIO_TRANSPORT_UART
config ZMK_STUDIO_TRANSPORT_UART_RX_STACK_SIZE config ZMK_STUDIO_TRANSPORT_UART_RX_STACK_SIZE
int "RX Stack Size" int "RX Stack Size"
depends on !UART_INTERRUPT_DRIVEN depends on !UART_INTERRUPT_DRIVEN
default 512 default 512
config ZMK_STUDIO_TRANSPORT_UART_RX_PRIORITY
int "RX Thread Priority"
depends on !UART_INTERRUPT_DRIVEN
default 9
endif
config ZMK_STUDIO_TRANSPORT_BLE config ZMK_STUDIO_TRANSPORT_BLE
bool "BLE (GATT)" bool "BLE (GATT)"
select RING_BUFFER select RING_BUFFER
@@ -71,9 +80,12 @@ config ZMK_STUDIO_TRANSPORT_BLE
depends on ZMK_BLE depends on ZMK_BLE
default y default y
config BT_CONN_TX_MAX config BT_CONN_TX_MAX
default 64 if ZMK_STUDIO_TRANSPORT_BLE default 64 if ZMK_STUDIO_TRANSPORT_BLE
if ZMK_STUDIO_TRANSPORT_BLE
config ZMK_STUDIO_TRANSPORT_BLE_PREF_LATENCY config ZMK_STUDIO_TRANSPORT_BLE_PREF_LATENCY
int "BLE Transport preferred latency" int "BLE Transport preferred latency"
default 10 default 10
@@ -81,6 +93,8 @@ config ZMK_STUDIO_TRANSPORT_BLE_PREF_LATENCY
When the studio UI is connected, a lower latency can be requested in order When the studio UI is connected, a lower latency can be requested in order
to make the interactions between keyboard and studio faster. to make the interactions between keyboard and studio faster.
endif
endmenu endmenu
config ZMK_STUDIO_RPC_THREAD_STACK_SIZE config ZMK_STUDIO_RPC_THREAD_STACK_SIZE

View File

@@ -65,7 +65,7 @@ static void uart_rx_main(void) {
} }
K_THREAD_DEFINE(uart_transport_read_thread, CONFIG_ZMK_STUDIO_TRANSPORT_UART_RX_STACK_SIZE, K_THREAD_DEFINE(uart_transport_read_thread, CONFIG_ZMK_STUDIO_TRANSPORT_UART_RX_STACK_SIZE,
uart_rx_main, NULL, NULL, NULL, K_LOWEST_APPLICATION_THREAD_PRIO, 0, 0); uart_rx_main, NULL, NULL, NULL, CONFIG_ZMK_STUDIO_TRANSPORT_UART_RX_PRIORITY, 0, 0);
#endif #endif

View File

@@ -3,6 +3,16 @@
#include <dt-bindings/zmk/kscan_mock.h> #include <dt-bindings/zmk/kscan_mock.h>
/ { / {
behaviors {
tog_off: toggle_layer_off_only {
compatible = "zmk,behavior-toggle-layer";
#binding-cells = <1>;
display-name = "Toggle Layer Off";
toggle-mode = "off";
locking;
};
};
keymap { keymap {
compatible = "zmk,keymap"; compatible = "zmk,keymap";

View File

@@ -80,36 +80,36 @@ As a result, all board definitions found in the ZMK tree now must be used with a
As part of this change, ZMK is now using board/shield revisions, rather than duplicate board/shield definitions. This means that instead of having e.g. `nice_nano`, and `nice_nano_v2`, we only have `nice_nano`, which by default points to the `2.0.0` revision. To point to the original Nice!Nano V1, you would need to use `nice_nano@1.0.0` where you would have previously used `nice_nano`. Of course, you could also put `nice_nano@2.0.0` if you wished to make that explicit, instead of merely replacing `nice_nano_v2` with `nice_nano`. Some boards, such as the `nrfmicro`, also have additional _board qualifiers_ such as the choice between multiple SoCs. Board qualifiers must always be specified, and do not have defaults. See [Zephyr's overview](https://docs.zephyrproject.org/4.1.0/hardware/porting/board_porting.html#board-terminology) for more information on board qualifiers. The below table provides an overview of some of the differences in in-tree boards we have in ZMK, and how they are selected in the new build system. The shorthand shows the minimum needed to build with a specific board, taking into account defaults. As part of this change, ZMK is now using board/shield revisions, rather than duplicate board/shield definitions. This means that instead of having e.g. `nice_nano`, and `nice_nano_v2`, we only have `nice_nano`, which by default points to the `2.0.0` revision. To point to the original Nice!Nano V1, you would need to use `nice_nano@1.0.0` where you would have previously used `nice_nano`. Of course, you could also put `nice_nano@2.0.0` if you wished to make that explicit, instead of merely replacing `nice_nano_v2` with `nice_nano`. Some boards, such as the `nrfmicro`, also have additional _board qualifiers_ such as the choice between multiple SoCs. Board qualifiers must always be specified, and do not have defaults. See [Zephyr's overview](https://docs.zephyrproject.org/4.1.0/hardware/porting/board_porting.html#board-terminology) for more information on board qualifiers. The below table provides an overview of some of the differences in in-tree boards we have in ZMK, and how they are selected in the new build system. The shorthand shows the minimum needed to build with a specific board, taking into account defaults.
- nice!nano (`nice_nano`) - nice!nano (`nice_nano`)
- `nice_nano` -> `nice_nano@1.0.0` (short: `nice_nano@1`) - `nice_nano` -> `nice_nano@1.0.0//zmk` (short: `nice_nano@1//zmk`)
- `nice_nano_v2` -> `nice_nano@2.0.0` (short: `nice_nano`) - `nice_nano_v2` -> `nice_nano@2.0.0//zmk` (short: `nice_nano//zmk`)
- nRFMicro (`nrfmicro/nrf52840`) - nRFMicro (`nrfmicro/nrf52840`)
- `nrfmicro_11` -> `nrfmicro@1.1.0/nrf52840` (short: `nrfmicro@1.1/nrf52840`) - `nrfmicro_11` -> `nrfmicro@1.1.0/nrf52840/zmk` (short: `nrfmicro@1.1/nrf52840/zmk`)
- `nrfmicro_11_flipped` -> `nrfmicro@1.1.0/nrf52840/flipped` (short: `nrfmicro@1.1/nrf52840/flipped`) - `nrfmicro_11_flipped` -> `nrfmicro@1.1.0/nrf52840/flipped_zmk` (short: `nrfmicro@1.1/nrf52840/flipped_zmk`)
- `nrfmicro_13` -> `nrfmicro@1.3.0/nrf52840` (short: `nrfmicro/nrf52840`) - `nrfmicro_13` -> `nrfmicro@1.3.0/nrf52840/zmk` (short: `nrfmicro/nrf52840/zmk`)
- `nrfmicro_13_52833` -> `nrfmicro@1.3.0/nrf52833` (short: `nrfmicro/nrf52833`) - `nrfmicro_13_52833` -> `nrfmicro@1.3.0/nrf52833/zmk` (short: `nrfmicro/nrf52833/zmk`)
- Mikoto (`mikoto`) - Mikoto (`mikoto`)
- `mikoto` -> `mikoto@5.20.0` (short: `mikoto`) - `mikoto` -> `mikoto@5.20.0//zmk` (short: `mikoto//zmk`)
- `mikoto@6.1` -> `mikoto@6.1.0` (short: `mikoto@6`) - `mikoto@6.1` -> `mikoto@6.1.0//zmk` (short: `mikoto@6//zmk`)
- `mikoto@7.2` -> `mikoto@7.2.0` (short: `mikoto@7`) - `mikoto@7.2` -> `mikoto@7.2.0//zmk` (short: `mikoto@7//zmk`)
- XIAO RP2040 (`xiao_rp2040`) - XIAO RP2040 (`xiao_rp2040`)
- `seeeduino_xiao_rp2040` -> `xiao_rp2040` - `seeeduino_xiao_rp2040` -> `xiao_rp2040//zmk`
- XIAO nRF52840/BLE (`xiao_ble`) - XIAO nRF52840/BLE (`xiao_ble`)
- `seeeduino_xiao_ble` -> `xiao_ble` - `seeeduino_xiao_ble` -> `xiao_ble//zmk`
- BT60 (`bt60`) - BT60 (`bt60`)
- `bt60_v1` -> `bt60@1.0.0` - `bt60_v1` -> `bt60@1.0.0//zmk`
- `bt60_v2` -> `bt60@2.0.0` - `bt60_v2` -> `bt60@2.0.0//zmk`
- `bt60_hs` -> `bt60_hs` - `bt60_hs` -> `bt60_hs//zmk`
- Planck (`planck`) - Planck (`planck`)
- `planck_rev6` -> `planck` - `planck_rev6` -> `planck//zmk`
- BDN9 (`bdn9`) - BDN9 (`bdn9`)
- `bdn9_rev2` -> `bdn9` - `bdn9_rev2` -> `bdn9//zmk`
- Ferris Rev2 (`ferris`) - Ferris Rev2 (`ferris`)
- `ferris_rev02` -> `ferris@2.0.0` (short: `ferris`) - `ferris_rev02` -> `ferris@2.0.0//zmk` (short: `ferris//zmk`)
- Corne-ish Zen (`corneish_zen`) - Corne-ish Zen (`corneish_zen`)
- `corneish_zen_v2_left` -> `corneish_zen_left@2.0.0` (short: `corneish_zen_left`) - `corneish_zen_v2_left` -> `corneish_zen_left@2.0.0//zmk` (short: `corneish_zen_left//zmk`)
- `corneish_zen_v2_right` -> `corneish_zen_right@2.0.0` (short: `corneish_zen_right`) - `corneish_zen_v2_right` -> `corneish_zen_right@2.0.0//zmk` (short: `corneish_zen_right//zmk`)
- `corneish_zen_v1_left` -> `corneish_zen_left@1.0.0` (short: `corneish_zen_left@1`) - `corneish_zen_v1_left` -> `corneish_zen_left@1.0.0//zmk` (short: `corneish_zen_left@1//zmk`)
- `corneish_zen_v1_right` -> `corneish_zen_right@1.0.0` (short: `corneish_zen_right@1`) - `corneish_zen_v1_right` -> `corneish_zen_right@1.0.0//zmk` (short: `corneish_zen_right@1//zmk`)
The boards above are those which have changed in ZMK's tree, with the addition of the very popular XIAO series. For other boards in Zephyr's tree, please refer to the Zephyr documentation or source files directly. The boards above are those which have changed in ZMK's tree, with the addition of the very popular XIAO series. For other boards in Zephyr's tree, please refer to the Zephyr documentation or source files directly.

View File

@@ -13,11 +13,12 @@ Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/
### General ### General
| Config | Type | Description | Default | | Config | Type | Description | Default |
| --------------------------- | ------ | -------------------------------------------- | ------- | | --------------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
| `CONFIG_ZMK_KEYBOARD_NAME` | string | The name of the keyboard (max 16 characters) | | | `CONFIG_ZMK_BOARD_COMPAT` | bool | A special config for boards to enable. This helps check if users have accidentally used an upstream Zephyr board without ZMK additions applied | n |
| `CONFIG_ZMK_WPM` | bool | Enable calculating words per minute | n | | `CONFIG_ZMK_KEYBOARD_NAME` | string | The name of the keyboard (max 16 characters) | |
| `CONFIG_HEAP_MEM_POOL_SIZE` | int | Size of the heap memory pool | 8192 | | `CONFIG_ZMK_WPM` | bool | Enable calculating words per minute | n |
| `CONFIG_HEAP_MEM_POOL_SIZE` | int | Size of the heap memory pool | 8192 |
:::info :::info

View File

@@ -177,7 +177,7 @@ There are three commonly found possibilities:
Copy the file into your dongle's folder. Then import the file, assign the matrix transform to it, and select it in the `chosen` node: Copy the file into your dongle's folder. Then import the file, assign the matrix transform to it, and select it in the `chosen` node:
```dts ```dts
#import "my_keyboard-layouts.dtsi" #include "my_keyboard-layouts.dtsi"
&physical_layout0 { &physical_layout0 {
transform = <&default_transform>; transform = <&default_transform>;

View File

@@ -111,7 +111,7 @@ And other miscellaneous ones:
- A `<keyboard_name>.zmk.yml` file containing [metadata](hardware-metadata-files.md) for the keyboard. - A `<keyboard_name>.zmk.yml` file containing [metadata](hardware-metadata-files.md) for the keyboard.
See Zephyr's [board porting guide](https://docs.zephyrproject.org/4.1.0/hardware/porting/board_porting.html) for information on creating a new board. See Zephyr's [board porting guide](https://docs.zephyrproject.org/4.1.0/hardware/porting/board_porting.html) for information on creating a new board.
Also see the [new keyboard shield guide](new-shield.mdx#shield-overlays) for information on parts of the devicetree specifically related to ZMK. See also our [new board guide](new-board.md) for information on creating a ZMK-compatible board variant.
[^1]: [^1]:
Parts of these files can live in separate `.dtsi` files (typically in the same directory) that are then `#include`d in the files, to reduce duplication or improve organization. Parts of these files can live in separate `.dtsi` files (typically in the same directory) that are then `#include`d in the files, to reduce duplication or improve organization.

View File

@@ -0,0 +1,187 @@
---
title: New Board
---
This guide will walk through the necessary steps to write a [board](./index.mdx#boards--shields) suitable for use with ZMK. Boards used with ZMK fall into two categories:
- Boards with interconnects, such as `nice_nano` or `seeed_xiao`. Such boards will (active development of ZMK aside) always be used with a shield to create a keyboard.
- Boards that are themselves keyboards, such as `bt75` or `ferris`.
Some keyboards are boards but also have interconnects for modular add-ons. These are considered as keyboard-boards for the purpose of this guide. Details on adding an interconnect for modular add-ons are considered out of scope.
## Boards Included in ZMK
Boards with interconnects can be considered for inclusion to the tree of ZMK. If this is your aim, it is vital that you read through our [clean room policy](../contributing/clean-room.md).
Boards with interconnects that are included with ZMK are generally:
- Reliably commercially available as individual units
- In regular use across multiple shields (i.e. not niche)
Popular open source designs which are not being sold can also be considered for inclusion.
There also exist many boards in the tree of upstream Zephyr. We generally accept ZMK-variants of these boards into our tree as well.
## New ZMK Module Repository
Regardless of whether you aim to include the board in ZMK or not, you should first write the definition for it in a module. A new ZMK module repository can be created from a template.
:::note
This guide assumes you already have a configured GitHub account. If you don't yet have one, go ahead and [sign up](https://github.com/join) before continuing.
:::
Follow these steps to create your new repository:
- Visit https://github.com/zmkfirmware/unified-zmk-config-template
- Click the green "Use this template" button
- In the drop down that opens, click "Use this template".
- In the following screen, provide the following information:
- A repository name, e.g. `my-board-module`.
- A brief description, e.g. `ZMK Support For MyBoard`.
- Select Public or Private, depending on your preference.
- Click the green "Create repository" button
The repository is a combination of the directories and files required of a ZMK config, and those required of a shield module.
This enables the use of GitHub Actions to test that the shield is defined correctly.
See also the page on [module creation](../module-creation.md) for a reference on exactly which file structure and files are required for a ZMK keyboard module.
We recommend that you take this moment to name your module according to our [convention](../module-creation.md), i.e. your `zephyr/module.yml` file should begin with
```yaml title="zephyr/module.yml"
name: zmk-keyboard-<keyboard_name>
```
if it is a keyboard, or
```yaml title="zephyr/module.yml"
name: zmk-component-<board_name>
```
if it is a board with an interconnect.
## Write a Zephyr Board Definition
Zephyr has a guide on writing a board [here](https://docs.zephyrproject.org/4.1.0/hardware/porting/board_porting.html). Follow this guide to create a Zephyr-compatible board. Use the `boards` folder of your ZMK module as a base.
Once your board definition has been written, we recommend flashing some [Zephyr samples](https://docs.zephyrproject.org/4.1.0/samples/basic/basic.html) to it, to verify that it is working.
Flashing Zephyr samples can also be very helpful when troubleshooting/testing the functionality of extra features such as LED ICs, Bluetooth, or various sensor ICs.
## Write a ZMK Variant of Zephyr Board
To make a board fully compatible with ZMK, you will be creating a ZMK variant of the Zephyr board you made in the previous step. Perform the below actions for each board you've defined, in the case of multi-board split keyboards.
### Add Variant to board.yml
Edit your existing `board.yml` file to add the variant:
```yaml title="board.yml"
board:
...
socs:
- name: <soc-1>
variants:
- name: zmk
```
### Add Kconfig for ZMK Variant
Add a file to your board's folder called `<your-board>_zmk_defconfig`. This file will be used to set Kconfig flags specific to the ZMK variant.
:::warning
Make sure you know what each Kconfig flag does before you enable it. Some flags may be incompatible with certain hardware, or have other adverse effects.
:::
These flags are typically a subset of the following:
```yaml title="<your-board>_zmk_defconfig"
# SPDX-License-Identifier: <your license>
# Enable MPU
CONFIG_ARM_MPU=y
CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000
# Enable reset by default
CONFIG_RESET=y
# Enable clock control by default
CONFIG_CLOCK_CONTROL=y
# Code partition needed to target the correct flash range
CONFIG_USE_DT_CODE_PARTITION=y
# Output UF2 by default, native bootloader supports it.
CONFIG_BUILD_OUTPUT_UF2=y
# USB HID
CONFIG_ZMK_USB=y
# BLE HID
CONFIG_ZMK_BLE=y
# Bootloader Support
CONFIG_RETAINED_MEM=y
CONFIG_RETENTION=y
CONFIG_RETENTION_BOOT_MODE=y
# Settings Support
CONFIG_MPU_ALLOW_FLASH_WRITE=y
CONFIG_NVS=y
CONFIG_SETTINGS_NVS=y
CONFIG_FLASH=y
CONFIG_FLASH_PAGE_LAYOUT=y
CONFIG_FLASH_MAP=y
# Enable HW stack protection
CONFIG_HW_STACK_PROTECTION=y
# Enable GPIO
CONFIG_GPIO=y
# Defaults for matrix scanning to avoid interrupt issues
CONFIG_ZMK_KSCAN_MATRIX_POLLING=y
```
Note that none of our in-tree boards have all of the above flags set. We recommend referencing the Kconfig flags from an existing in-tree board with the same SoC as the one you are using for your initial definition, making sure you understand what each flag does.
### Add Devicetree for ZMK Variant
```dts title="<your-board>_zmk.dts
/*
* Copyright (c) <year> <you>
*
* SPDX-License-Identifier: <your license>
*/
// Include the base board definition
#include <../boards/<vendor or you>/<board folder name>/<your board>.dts>
// Include predefined boot mode settings, e.g.
#include <arm/raspberrypi/rp2040-boot-mode-retention.dtsi>
// Disable UART nodes if they are not actively in use (wired split) as they increase power draw
&uart0 { status = "disabled"; };
// Reduce the code partition section of the memory and add a storage partition to store ZMK Studio changes
&code_partition {
reg = <0x100 (DT_SIZE_M(2) - 0x100 - DT_SIZE_K(512))>;
};
&flash0 {
reg = <0x10000000 DT_SIZE_M(2)>;
partitions {
storage_partition: partition@180000 {
reg = <0x180000 DT_SIZE_K(512)>;
read-only;
};
};
};
```
See [here](./bootloader/index.mdx) for bootloader instructions for other SoCs. Depending on your SoC and design you may need to make further changes. Please refer to our in-tree boards with the same SoC as yours as examples.
## Next Steps
If your board is a keyboard, continue from [the `Kconfig.defconfig` step](https://zmk.dev/docs/development/hardware-integration/new-shield?keyboard-type=unibody#kconfigdefconfig) of the new shield guide. Use your ZMK variant's devicetree instead of the overlay file which would be used for a shield.
If your board is a board with an interconnect, your next step should be to write a [tester shield](../../troubleshooting/hardware-issues.mdx#identifying-issues). Such a shield should be the bare minimum shield to verify that your board works with ZMK.

View File

@@ -202,7 +202,7 @@ values={[
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#define DT_DRV_COMPAT zmk_<name_of_behavior> #define DT_DRV_COMPAT zmk_behavior_<name_of_behavior>
// Dependencies // Dependencies
#include <zephyr/device.h> #include <zephyr/device.h>
@@ -247,7 +247,7 @@ static int on_<name_of_behavior>_binding_released(struct zmk_behavior_binding *b
// API struct // API struct
static const struct behavior_driver_api <name_of_behavior>_driver_api = { static const struct behavior_driver_api <name_of_behavior>_driver_api = {
.binding_pressed = on_<name_of_behavior>_binding_pressed, .binding_pressed = on_<name_of_behavior>_binding_pressed,
.binding_released = on_<name_of_behavior>_binding_pressed, .binding_released = on_<name_of_behavior>_binding_released,
}; };
BEHAVIOR_DT_INST_DEFINE(0, // Instance Number (0) BEHAVIOR_DT_INST_DEFINE(0, // Instance Number (0)
@@ -273,7 +273,7 @@ BEHAVIOR_DT_INST_DEFINE(0, // Ins
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#define DT_DRV_COMPAT zmk_<name_of_behavior> #define DT_DRV_COMPAT zmk_behavior_<name_of_behavior>
// Dependencies // Dependencies
#include <zephyr/device.h> #include <zephyr/device.h>
@@ -318,29 +318,30 @@ static int on_<name_of_behavior>_binding_released(struct zmk_behavior_binding *b
// API struct // API struct
static const struct behavior_driver_api <name_of_behavior>_driver_api = { static const struct behavior_driver_api <name_of_behavior>_driver_api = {
.binding_pressed = on_<name_of_behavior>_binding_pressed, .binding_pressed = on_<name_of_behavior>_binding_pressed,
.binding_released = on_<name_of_behavior>_binding_pressed, .binding_released = on_<name_of_behavior>_binding_released,
}; };
#define <NAME_OF_BEHAVIOR>_INST(n) \ #define <NAME_OF_BEHAVIOR>_INST(n) \
static struct behavior_<name_of_behavior>_data_##n { \ static struct behavior_<name_of_behavior>_data_##n { \
.data_param1 = foo1; \ .data_param1 = foo1, \
.data_param2 = foo2; \ .data_param2 = foo2, \
.data_param3 = foo3; \ .data_param3 = foo3, \
}; \ }; \
\ \
static struct behavior_<name_of_behavior>_config_##n { \ static struct behavior_<name_of_behavior>_config_##n { \
.config_param1 = bar1; \ .config_param1 = bar1, \
.config_param2 = bar2; \ .config_param2 = bar2, \
.config_param3 = bar3; \ .config_param3 = bar3, \
}; \ }; \
\ \
BEHAVIOR_DT_INST_DEFINE(n, \ // Instance Number (Automatically populated by macro) BEHAVIOR_DT_INST_DEFINE(n, /* Instance Number (Automatically populated by macro) */ \
<name_of_behavior>_init, \ // Initialization Function <name_of_behavior>_init, /* Initialization Function */ \
NULL, \ // Power Management Device Pointer NULL, /* Power Management Device Pointer */ \
&<name_of_behavior>_data_##n, \ // Behavior Data Pointer &<name_of_behavior>_data_##n, /* Behavior Data Pointer */ \
&<name_of_behavior>_config_##n, \ // Behavior Configuration Pointer &<name_of_behavior>_config_##n, /* Behavior Configuration Pointer */ \
POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT \ // Initialization Level, Device Priority POST_KERNEL, /* Initialization Level */ \
&<name_of_behavior>_driver_api); // API struct CONFIG_KERNEL_INIT_PRIORITY_DEFAULT /* Device Priority */ \
&<name_of_behavior>_driver_api); /* API struct */ \
DT_INST_FOREACH_STATUS_OKAY(<NAME_OF_BEHAVIOR>_INST) DT_INST_FOREACH_STATUS_OKAY(<NAME_OF_BEHAVIOR>_INST)

View File

@@ -0,0 +1 @@
On macOS in Japanese mode, `INTERNATIONAL1` is ろ (ro, bottom right on the Apple Japanese keyboard) and `INTERNATIONAL3` is ¥ (yen, top right).

View File

@@ -0,0 +1 @@
On macOS in Japanese mode, `LANG1` is かな (kana, to turn on Japanese IME) and `LANG2` is 英数 (eisuu, to turn off the IME).

View File

@@ -208,8 +208,8 @@ A popular method of implementing Autoshift in ZMK involves a C-preprocessor macr
as: auto_shift { as: auto_shift {
compatible = "zmk,behavior-hold-tap"; compatible = "zmk,behavior-hold-tap";
#binding-cells = <2>; #binding-cells = <2>;
tapping_term_ms = <135>; tapping-term-ms = <135>;
quick_tap_ms = <0>; quick-tap-ms = <0>;
flavor = "tap-preferred"; flavor = "tap-preferred";
bindings = <&kp>, <&kp>; bindings = <&kp>, <&kp>;
}; };
@@ -299,7 +299,7 @@ One workaround is to create a [macro](macros.md) that invokes those behaviors an
By default, when another key is pressed while a hold-tap is held, it will trigger the "hold" behavior even if `tapping-term-ms` has not been exceeded yet. By default, when another key is pressed while a hold-tap is held, it will trigger the "hold" behavior even if `tapping-term-ms` has not been exceeded yet.
We refer to the interaction of pressing one key while another is held as the "interrupt", and the way the hold-tap resolves is referred to as its "interrupt flavor". We refer to the interaction of pressing one key while another is held as the "interrupt", and the way the hold-tap resolves is referred to as its "interrupt flavor".
This default interrupt flavor is called "hold-preferred". While this flavor may work well for a ctrl/escape key, but it might not be well suited for home-row mods or layer-taps. For this reason, ZMK defines multiple interrupt flavors which hold-tap behaviors can be configured with, listed below: This default interrupt flavor is called "hold-preferred". While this flavor may work well for a ctrl/escape key, it might not be well suited for home-row mods or layer-taps. For this reason, ZMK defines multiple interrupt flavors which hold-tap behaviors can be configured with, listed below:
- The "hold-preferred" flavor triggers the hold behavior when the `tapping-term-ms` has expired or another key is pressed. - The "hold-preferred" flavor triggers the hold behavior when the `tapping-term-ms` has expired or another key is pressed.
- The "balanced" flavor will trigger the hold behavior when the `tapping-term-ms` has expired or another key is pressed _and_ released while the hold-tap is held. - The "balanced" flavor will trigger the hold behavior when the `tapping-term-ms` has expired or another key is pressed _and_ released while the hold-tap is held.
@@ -312,7 +312,7 @@ When the hold-tap key is released and the hold behavior has not been triggered,
#### Comparison to QMK #### Comparison to QMK
The `hold-preferred` flavor works similar to the `HOLD_ON_OTHER_KEY_PRESS` setting in QMK. The `hold-preferred` flavor works similarly to the `HOLD_ON_OTHER_KEY_PRESS` setting in QMK.
The `balanced` flavor is similar to the `PERMISSIVE_HOLD` setting, and the `tap-preferred` flavor is the QMK default. The `balanced` flavor is similar to the `PERMISSIVE_HOLD` setting, and the `tap-preferred` flavor is the QMK default.
```dts ```dts
@@ -333,6 +333,10 @@ By default this behavior is disabled.
}; };
``` ```
#### Comparison to QMK
QMK has a parameter called `QUICK_TAP_TERM`, but its semantics are slightly different. In QMK, it is the time interval between releasing the first key and pressing the second key whereas in ZMK, it is the time interval between pressing the first and second keys. Therefore you might want to use a larger value for `quick-tap-ms` compared to the value used in QMK.
### `require-prior-idle-ms` ### `require-prior-idle-ms`
If a hold-tap is pressed within `require-prior-idle-ms` of another non-modifier _key_ (not behavior), then the hold-tap will always resolve in a tap. If a hold-tap is pressed within `require-prior-idle-ms` of another non-modifier _key_ (not behavior), then the hold-tap will always resolve in a tap.

View File

@@ -11,18 +11,15 @@ Below is a summary of pre-defined behavior bindings and user-definable behaviors
## Key Press Behaviors ## Key Press Behaviors
| Binding | Behavior | Description | | Binding | Behavior | Description |
| ------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `&kp` | [Key Press](key-press.md) | Send keycodes to the connected host when a key is pressed or released | | `&kp` | [Key Press](key-press.md) | Send keycodes to the connected host when a key is pressed |
| `&ktap` | [Key Tap](key-press.md#key-tap) | Send keycodes to the connected host when a key is pressed | | `&mt` | [Mod Tap](hold-tap.mdx#mod-tap) | Sends a different key press depending on whether a key is held or tapped |
| `&mt` | [Mod Tap](hold-tap.mdx#mod-tap) | Sends a different key press depending on whether a key is held or tapped | | `&kt` | [Key Toggle](key-toggle.md) | Toggles the press of a key. If the key is not currently pressed, key toggle will press it, holding it until the key toggle is pressed again or the key is released in some other way. If the key is currently pressed, key toggle will release it |
| `&kt` | [Key Toggle](key-toggle.md) | Toggles the press of a key. If the key is not currently pressed, key toggle will press it, holding it until the key toggle is pressed again or the key is released in some other way. If the key is currently pressed, key toggle will release it | | `&sk` | [Sticky Key](sticky-key.md) | Stays pressed until another key is pressed, then is released. It is often used for modifier keys like shift, which allows typing capital letters without holding it down |
| `&kt_on` | [Key Toggle](key-toggle.md#toggle-on-and-toggle-off) | Toggles on a key (sends keycode press event) on press | | `&gresc` | [Grave Escape](mod-morph.md#behavior-binding) | Sends Grave Accent `` ` `` keycode if shift or GUI is held, sends Escape keycode otherwise |
| `&kt_off` | [Key Toggle](key-toggle.md#toggle-on-and-toggle-off) | Toggles off a key (sends keycode release event) on press | | `&caps_word` | [Caps Word](caps-word.md) | Behaves similar to caps lock, but automatically deactivates when any key not in a continue list is pressed, or if the caps word key is pressed again |
| `&sk` | [Sticky Key](sticky-key.md) | Stays pressed until another key is pressed, then is released. It is often used for modifier keys like shift, which allows typing capital letters without holding it down | | `&key_repeat` | [Key Repeat](key-repeat.md) | Sends again whatever keycode was last sent |
| `&gresc` | [Grave Escape](mod-morph.md#behavior-binding) | Sends Grave Accent `` ` `` keycode if shift or GUI is held, sends Escape keycode otherwise |
| `&caps_word` | [Caps Word](caps-word.md) | Behaves similar to caps lock, but automatically deactivates when any key not in a continue list is pressed, or if the caps word key is pressed again |
| `&key_repeat` | [Key Repeat](key-repeat.md) | Sends again whatever keycode was last sent |
## Miscellaneous Behaviors ## Miscellaneous Behaviors
@@ -33,15 +30,13 @@ Below is a summary of pre-defined behavior bindings and user-definable behaviors
## Layer Navigation Behaviors ## Layer Navigation Behaviors
| Binding | Behavior | Description | | Binding | Behavior | Description |
| ---------- | -------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | | ------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| `&mo` | [Momentary Layer](layers.md#momentary-layer) | Enables a layer while a key is pressed | | `&mo` | [Momentary Layer](layers.md#momentary-layer) | Enables a layer while a key is pressed |
| `&lt` | [Layer-tap](layers.md#layer-tap) | Enables a layer when a key is held, and outputs a key press when the key is only tapped for a short time | | `&lt` | [Layer-tap](layers.md#layer-tap) | Enables a layer when a key is held, and outputs a key press when the key is only tapped for a short time |
| `&to` | [To Layer](layers.md#to-layer) | Enables a layer and disables all other layers except the default layer | | `&to` | [To Layer](layers.md#to-layer) | Enables a layer and disables all other layers except the default layer |
| `&tog` | [Toggle Layer](layers.md#toggle-layer) | Enables a layer until the layer is manually disabled | | `&tog` | [Toggle Layer](layers.md#toggle-layer) | Enables a layer until the layer is manually disabled |
| `&tog_on` | [Toggle Layer](layers.md#toggle-on-and-toggle-off) | Enables a layer even if the layer is already enabled | | `&sl` | [Sticky Layer](sticky-layer.md) | Activates a layer until another key is pressed, then deactivates it |
| `&tog_off` | [Toggle Layer](layers.md#toggle-on-and-toggle-off) | Disables a layer even if the layer is already disabled |
| `&sl` | [Sticky Layer](sticky-layer.md) | Activates a layer until another key is pressed, then deactivates it |
## Mouse Emulation Behaviors ## Mouse Emulation Behaviors

View File

@@ -47,32 +47,3 @@ Example:
```dts ```dts
&kp A &kp A
``` ```
## Key Tap
The "key tap" behavior will send a press followed by a release when you press the behavior, and will do nothing when you release the behavior.
### Behavior Binding
- Reference: `&ktap`
- Parameter: The keycode usage ID from the usage page, e.g. `N4` or `A`
Example:
```dts
&ktap A
```
#### Configuration
You can adjust the tap duration, i.e. the time between press and release of the key, by changing the `tap-ms` property:
```dts
&ktap {
tap-ms = <30>; // This is the value already set by default
};
```
:::info
Internally, the key tap behavior is a very simple [macro](./macros.md#defining-parameterized-macros).
:::

View File

@@ -25,11 +25,24 @@ Example:
You can use any keycode that works for `&kp` as parameter to `&kt`, however, [modified keys](../modifiers.mdx#modifier-functions) such as `LA(A)` will be toggled based on the status of the base keycode (in this case `A`). You can use any keycode that works for `&kp` as parameter to `&kt`, however, [modified keys](../modifiers.mdx#modifier-functions) such as `LA(A)` will be toggled based on the status of the base keycode (in this case `A`).
In other words, modifiers are ignored when determining whether or not the key is currently pressed. In other words, modifiers are ignored when determining whether or not the key is currently pressed.
### Toggle On and Toggle Off ### Configuration
For state-independent toggles, there exist two further behaviors: #### Toggle mode
- `&kt_on`: Toggles a keycode on, even if it is already on. If you wish to ensure that a key is pressed or released, rather than merely toggling, then you can do so with the `toggle-mode` property.
- `&kt_off`: Toggles a keycode off, even if it is already off. Define a new behavior and assign `"on"` or `"off"` to `toggle-mode`:
Use these just as you would use `&kt`. ```dts
/ {
behaviors {
kt_on: key_toggle_on_only {
compatible = "zmk,behavior-key-toggle";
#binding-cells = <1>;
display-name = "Key Toggle On";
toggle-mode = "on";
};
};
};
```
You can then use `&kt_on` in place of `&kt` whenever you wish to only toggle a key on, and not toggle it off. An `"off"` version of the behavior can be defined similarly.

View File

@@ -67,14 +67,28 @@ Example:
&tog 3 &tog 3
``` ```
### Toggle On and Toggle Off ### Configuration
For state-independent toggles, there exist two further behaviors: #### Toggle mode
- `&tog_on`: Toggles a layer on, even if it is already on. If you wish to ensure that a layer is toggled on or off specifically, rather than switching between the two states, then you can do so with the `toggle-mode` property.
- `&tog_off`: Toggles a layer off, even if it is already off. Define a new behavior and assign `"on"` or `"off"` to `toggle-mode`:
Use these just as you would use `&tog`. ```dts
/ {
behaviors {
tog_on: toggle_layer_on_only {
compatible = "zmk,behavior-toggle-layer";
#binding-cells = <1>;
display-name = "Toggle Layer On";
toggle-mode = "on";
locking;
};
};
};
```
You can then use `&tog_on` in place of `&tog` whenever you wish to only toggle a layer on, and not toggle it off. An `"off"` version of the behavior can be defined similarly.
## Layer Locking ## Layer Locking
@@ -82,13 +96,7 @@ When the behaviors `&to` and `&tog` toggle a layer on, they will "lock" the laye
In particular, if you activate a layer momentarily using e.g. `&mo 1`, tapping e.g. `&tog 1` as defined above will prevent the layer from deactivating after releasing `&mo 1`. You can then press `&tog 1` again to deactivate the layer. In particular, if you activate a layer momentarily using e.g. `&mo 1`, tapping e.g. `&tog 1` as defined above will prevent the layer from deactivating after releasing `&mo 1`. You can then press `&tog 1` again to deactivate the layer.
You can remove the locking property from `&to` and `&tog` if you wanted them to be interruptable by `&mo`: For custom toggle, to, and momentary layer behaviors, this can be enabled by giving your behavior the `locking;` property.
```dts
&to {
/delete-property/ locking;
};
```
## Conditional Layers ## Conditional Layers

View File

@@ -192,25 +192,6 @@ Parameterized macros must be defined using specific values for the `compatible`
}; };
``` ```
An example of a simple parameterized macro is `&ktap`, which is defined as:
```dts
/ {
macros {
ktap: key_tap {
compatible = "zmk,behavior-macro-one-param";
#binding-cells = <1>;
display-name = "Key Tap";
bindings = <&macro_param_1to1>, <&kp MACRO_PLACEHOLDER>;
tap-ms = <30>;
};
};
};
```
This behavior is already pre-defined as `&ktap`, so you don't need to define it in your keymap to use it.
### Parameters, Bindings and Controls ### Parameters, Bindings and Controls
There are special macro controls which must be used in order to forward received parameters to the macro's `bindings`. These controls are "one shot" and will determine how received parameters are used on the very next (non-macro control) behavior in the macro's `bindings` list. There are special macro controls which must be used in order to forward received parameters to the macro's `bindings`. These controls are "one shot" and will determine how received parameters are used on the very next (non-macro control) behavior in the macro's `bindings` list.

View File

@@ -158,6 +158,7 @@ module.exports = {
"development/hardware-integration/encoders", "development/hardware-integration/encoders",
"development/hardware-integration/soft-off-setup", "development/hardware-integration/soft-off-setup",
"development/hardware-integration/pointing", "development/hardware-integration/pointing",
"development/hardware-integration/new-board",
"development/hardware-integration/battery", "development/hardware-integration/battery",
{ {
type: "category", type: "category",

View File

@@ -4,6 +4,8 @@
* SPDX-License-Identifier: CC-BY-NC-SA-4.0 * SPDX-License-Identifier: CC-BY-NC-SA-4.0
*/ */
import macosLanguage from "@site/docs/keymaps/_footnotes/macos-language.mdx";
import macosInternational from "@site/docs/keymaps/_footnotes/macos-international.mdx";
import example from "@site/docs/keymaps/_footnotes/example.mdx"; import example from "@site/docs/keymaps/_footnotes/example.mdx";
import iosApplication from "@site/docs/keymaps/_footnotes/ios-application.mdx"; import iosApplication from "@site/docs/keymaps/_footnotes/ios-application.mdx";
import iosPower from "@site/docs/keymaps/_footnotes/ios-power.mdx"; import iosPower from "@site/docs/keymaps/_footnotes/ios-power.mdx";
@@ -13,6 +15,8 @@ import macosUndoRedo from "@site/docs/keymaps/_footnotes/macos-undo-redo.mdx";
import globe from "@site/docs/keymaps/_footnotes/globe.mdx"; import globe from "@site/docs/keymaps/_footnotes/globe.mdx";
export default { export default {
macosLanguage,
macosInternational,
example, example,
iosApplication, iosApplication,
iosPower, iosPower,

View File

@@ -3396,10 +3396,12 @@ export default [
windows: false, windows: false,
linux: true, linux: true,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {
macos: ["macosInternational"],
},
}, },
{ {
names: ["INTERNATIONAL_2", "INT2", "INT_KATAKANAHIRAGANA", "INT_KANA"], names: ["INTERNATIONAL_2", "INT2", "INT_KATAKANAHIRAGANA", "INT_KANA"],
@@ -3417,7 +3419,7 @@ export default [
windows: false, windows: false,
linux: true, linux: true,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {},
@@ -3438,10 +3440,12 @@ export default [
windows: false, windows: false,
linux: true, linux: true,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {
macos: ["macosInternational"],
},
}, },
{ {
names: ["INTERNATIONAL_4", "INT4", "INT_HENKAN"], names: ["INTERNATIONAL_4", "INT4", "INT_HENKAN"],
@@ -3459,7 +3463,7 @@ export default [
windows: false, windows: false,
linux: true, linux: true,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {},
@@ -3480,7 +3484,7 @@ export default [
windows: false, windows: false,
linux: true, linux: true,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {},
@@ -3501,7 +3505,7 @@ export default [
windows: false, windows: false,
linux: true, linux: true,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {},
@@ -3522,7 +3526,7 @@ export default [
windows: null, windows: null,
linux: false, linux: false,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {},
@@ -3543,7 +3547,7 @@ export default [
windows: null, windows: null,
linux: false, linux: false,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {},
@@ -3564,7 +3568,7 @@ export default [
windows: null, windows: null,
linux: false, linux: false,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {},
@@ -3585,10 +3589,12 @@ export default [
windows: true, windows: true,
linux: true, linux: true,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {
macos: ["macosLanguage"],
},
}, },
{ {
names: ["LANGUAGE_2", "LANG2", "LANG_HANJA"], names: ["LANGUAGE_2", "LANG2", "LANG_HANJA"],
@@ -3606,10 +3612,12 @@ export default [
windows: true, windows: true,
linux: true, linux: true,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {
macos: ["macosLanguage"],
},
}, },
{ {
names: ["LANGUAGE_3", "LANG3", "LANG_KATAKANA"], names: ["LANGUAGE_3", "LANG3", "LANG_KATAKANA"],
@@ -3627,7 +3635,7 @@ export default [
windows: false, windows: false,
linux: true, linux: true,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {},
@@ -3648,7 +3656,7 @@ export default [
windows: false, windows: false,
linux: true, linux: true,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {},
@@ -3669,7 +3677,7 @@ export default [
windows: false, windows: false,
linux: true, linux: true,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {},
@@ -3690,7 +3698,7 @@ export default [
windows: null, windows: null,
linux: false, linux: false,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {},
@@ -3711,7 +3719,7 @@ export default [
windows: null, windows: null,
linux: false, linux: false,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {},
@@ -3732,7 +3740,7 @@ export default [
windows: null, windows: null,
linux: false, linux: false,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {},
@@ -3753,7 +3761,7 @@ export default [
windows: null, windows: null,
linux: false, linux: false,
android: false, android: false,
macos: null, macos: true,
ios: null, ios: null,
}, },
footnotes: {}, footnotes: {},
@@ -7889,7 +7897,7 @@ export default [
documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=153", documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=153",
os: { os: {
windows: null, windows: null,
linux: null, linux: false,
android: null, android: null,
macos: true, macos: true,
ios: true, ios: true,