refactor: Move to Zephyr v4.1.0 Move to Zephyr v4.1.0, with various build/compilation fixes needed for basic use. refactor(tests): Move to native_sim for tests. feat(core): (Optionally) use Zephyr keyboard input devices Add ability to assign a keyboard `input` device to a physical layout, or use a chosen `zmk,matrix-input`. fix(pointing): Refactor for changes to input API Pass NULL user_data to input callbacks. fix(tests): Fix BLE test to account for Zephyr changes Handle additional read callback invocation once all matching characteristic have been read. fix(sensors): Initialize sensor data to 0 before fetching. Be sure we don't get back any uninitialized data by initializing the channel data to 0 before calling into the sensor API. refactor(input): Adjust split input to input API changes. Input callbacks now have a user_data parameter, adjust accordingly. chore(bluetooth): Minor cleanup of split BT code after refactor Small fixes and remove commented dead code left after the split refactor. refactor: Fix up BLE tests after Zephyr upgrade. Minor changes to snapshots based on newer Zephyr version. refactor(boards): Move to upstream xiao_ble board ID. Move to official upstream board definition for the Seeed XIAO BLE. refactor: Adjust metadata schema for HWMv2 board IDs w/ qualifiers Adjust our ZMK metadata to allow for board IDs that include qualifiers with slash delimeters. refactor!(boards): Move nice!nano to HWMv2, and proper revisioning Upgrade the nice!nano board to HWMv2, under the proper nicekeyboards vendor directory, and with proper revisions. Includes a breaking change to default the `2.0.0` version instead of the much older v1 (`1.0.0`). fix: Disable Nordic dt-bindings header checks. Disable the recently added Nordic dt-bindings header checks, which cause issues for our HID related headers. fix(studio): Correct `memset` usage. Use the correct memset call to clear our RPC memory. fix: Refactor for new Zephyr PM API Adjustments to our PM code to match Zephyr PM APIs. refactor(ble): Use correct BT opt for connectable. Adjust for upstream Zephyr BT API changes for advertising options. refactor(boards): Move MakerDiary M2 board to HWMv2. Run the HWMv2 script to convert the MakerDiary M2 board. fix(studio): Correct usage of thread analyzer API Fix up the RPC code that invoke the thread analyzer API to account for API changes. chore: Remove nanopb module override. Leverage nanopb version that's used by Zephyr. feat(core): mapper for magic bootloader values. To trigger bootloaders that use a magic value in RAM to trigger bootloader mode, add a mapping retained memory driver that maps write/read of boot mode values to a special magic value stored in the actually backing RAM. feat(behaviors): Add retention boot mode to reset. Support new generic Zephyr retention boot mode API in the reset behavior. feat: Add double tap to enter bootloader functionality Add ability to enter the bootloader if double tapping reset within the specified window. refactor(CI): Move to 4.1 container tags. Move to the new 4.1 tagged container, to ensure updated SDK, Python packages, etc. refactor(boards): Move nRFMicro to HWMv2 Refactor nRFMicro to HWMv2, using proper SoC, revisions, and variants (for flipped). Also move to devicetree setup of DCDC/HV DCDC. refactor(boards): Move QMK Proton-C to HWMv2 Move Proton-C to HWMv2 for use with Zephyr 4.1. chore(ci): Adjust core coverage for new board IDs. Use correct board IDs, with qualifiers, for our core coverage testing. refactor(boards): Move BDN9 to HWMv2 Move BDN9 to HWMv2, using the base `bdn9` ID, no longer including the `_rev2` suffix in the ID. refactor(boards): Move nice!60 to HWMv2 Migrate nice!60 to HWMv2. refactor: Adjust how we're searching/loading keymap files Use new post_boards_shields extension point for loading keymap files from board/shield directories. refactor(boards): Move planck rev6 to HWMv2. Move Planck board definition to HWMv2, including versioning tweaks. refactor(boards): Move OLKB Preonic to HWMv2 Move Preonic board definition to HWMv2 and remove `_rev3` variant suffix in favor of board versioning with `3.0.0` as the default. chore(deps): Pull in Zephyr optional group for nanopb. Ensure we enable nanopb by adding +optional group filter. fix(ci): Prevent slash characters in artifact names. Move to HWMv2 means board IDs often include slashes, so replace those with underscores when doing file uploads. fix(usb): Adjust Kconfig settings for USB. * Ensure USB isn't initialized automatically before we do, which can happen if USB CDC logging is used/enabled for a given board. * Adjust USB HID to initialize the USB class/interface before we enable the USB device itself. fix(display): Fix setting the small font for the mono theme. Adjust for modified mono theme init function to pass the small font. chore(ci): Fix changed board IDs for core coverage. Adjust board IDs for our core coverage after move to HWMv2 and board versioning consistently. * planck_rev6 -> planck * bdn9_rev2 -> bdn9 fix(underglow): Remove use of removed Kconfig WS2812 symbol refactor(boards): Move PW CKP boards to HWMv2 Migrate the bt60, bt65, and bt75 to HWMv2. refactor(boards): Move Puchi BLE to HWMv2 Migrate the Puchi BLE to HWMv2. refactor(boards): Migrate Ferris rev02 to HWMv2. Move Ferris rev02 to HMWv2, and remove the revision from the ID. refactor(boards): Move Pillbug to HWMv2 Migrate the MechWild PillBug board to HWMv2. refactor(boards): Migrate s40nc to HWMv2 Move the ShortyFortyNoCordy (s40nc) to HWMv2. refactor(boards): Move bluemicro840 board to HWMv2. Migrate bluemicro840 board to HWMv2, set up boot mode retention. fix(boards): Retore bootloader support on XIAO BLE. Set up necessary boot mode/retention to properly set GPREGRET to trigger Adafruit bootloader to run on the XIAO BLE. refactor(boards): Move Adv360 Pro to HWMv2. Migrate Adv360 Pro left/right to HWMv2. refactor(boards): Move Glove80 to HMWv2 Refactor the MoErgo Glove80 left/right to HWMv2. refactor(boards): Move Mikoto to HMWv2. Migrate Mikoto to HWMv2, with non-exact matching, tweaks to I2C selection to imply it for the 7.2.0 revision for the fuel gauge. refactor(boards): Move kbdfans Tofu65 2.0 to HMWv2 Move Tofu65 2.0 to HMWv2, with ID of just `tofu65`. refactor(boards): Remove dz60rgb board Remove dz60rgb, it's no longer readily available and we have other current stm32 reference designs for testing. refactor(boards): Move Corneish Zen to HMWv2 Move Corneish Zen to HMWv2, with IDs of `corneish_zen_left`/`corneish_zen_right`. refactor(boards): Migrate Corne-ish Zen status screen * refactor(boards): Add boot mode to the nice!nano using common dtsi * Add a new .dtsi for setting up nRF52 boot mode/retained memory settings * Adjust XIAO BLE to use the new include file * Add boot mode to to the nice!nano refactor(boards): Add boot mode support to nice!60 board Enable boot mode for nice!60 board. refactor(boards): Adjust Zephyr board metadata file locations Move the ZMK metadata files for upstream Zephyr boards to align with the HWMv2 directory structure that uses the vendor ID for the parent directory for a board directory. fix: Don't enable ZMK Display by default for a few shields By convention, avoid enabling ZMK Display by default on shields that may be built with under-resourced controllers (e.g. nRF52833 based ones). fix: Remove usage of renamed Kconfig from core coverage. Avoid using WS2812_LED_STRIP, since that Kconfig was renamed/split into SPI/GPIO/I2S symbols. refactor(boards): Adjust XIAO RP2040 override names, bootloader support Adjust the .conf/.overlay files to match the proper naming for the XIAO rp2040 board. Also add the necessary Kconfig/DTS bits for supporting bootloader using retained memory/boot mode retention. fix(display): Adjust stack sizes for display usage. Updated LVGL is bumping our stack size, so adjust the system work queue and dedicated display queue stack sizes as needed to account for this. feat(display): Add thread name to dedicated display queue. When thread names are enabled, pass a name to the dedicated display queue for better tracibility when using the thread analyzer. docs(blog): Add Zephyr upgrade post docs: Add bootloader integration page Add a dedicated page to outline steps to set up bootloader integration using the boot retention mechanism in newer Zephyr versions. fix(display): port nice!view display code * remove `lv_` prefix from old LVGL methods doc: Update local setup docs to use `west packages pip` Install Zephyr deps using the newer `west packages pip --install`. Signed-off-by: Peter Johanson <peter@peterjohanson.com> refactor(split): Adjust BT split code for newer Zephyr APIs. refactor(boards): Adjust upstream RP2040 boards for boot mode retention Add necessary DTS/Kconfig settings to upstream RP2040 boards so they can use the ZMK bootloader functionality using the boot mode retention infrastructure. docs: Update Zephyr docs links to 4.1.0 version. Update all links to the Zephyr docs to the 4.1.0 versions to match our Zephyr version in use. docs: Add a note about using CMake v3 for maximum compatibility. Some optional modules, like libmetal, which is used on nRF5340, specifically require CMake v3, so add a note in the native toolchain setup about this. feat(pointing): Handle INPUT_BTN_TOUCH codes for mouse buttons Translate INPUT_BTN_TOUCH input codes into button 0 press/release for HID layer. chore(pointing): Clean up some warning messages. Properly check return code from queue-ing messages, and fix up some type warnings in our logging calls. * Fix input event codes line numbers fix(studio): Properly serialize GATT RPC indications. fix(core): Set a system work queue stack size of 2048 by default We use a fair amount of stack even without BLE or RP2040, so default to 2048 by default everywhere, and constrained platforms can lowes this if they really need. refactor(core): Move away from deprecated DIS Kconfig symbols Use the correct Device Information Service Kconfig symbols for our model number and manufacturer. refactor: Move upstream Zephyr board overrides to extensions dirs Newer Zephyr supports "board extensions" to formally do what we've added in ourselves via some hacks, so move all our board overlay/config file overrides for upstream Zephyr boards into that correct structure. fix(boards): Add xiao_ble sd_partition label for nosd snippet compat Upstream xiao_ble uses different naming convention for the partition labels, so add an additional label for the SD range, so the existing nrf52840-nosd snippet will still work with the board. fix(core): Don't force CBPRINTF_NANO, for proper formatting. The nano CBPRINTF implementation lacks some padded formatting needed to ensure consistent formatting of BLE addresses, which we use to store keys as strings in a few places, so use the complete CBPRINTF by default now. fix(boards): Remove some references to old nice_nano_v2 board ID. The nice!nano board definition now properly uses versioning, so avoid referring to it with old `nice_nano_v2` board ID. fix(boards): Remove nano overlays for old nice_nano_v2 board ID. With board versioning in place, we can remove the unused `nice_nano_v2.overlay` files from shields. --------- Signed-off-by: Peter Johanson <peter@peterjohanson.com> Co-authored-by: Cem Aksoylar <caksoylar@users.noreply.github.com> Co-authored-by: Nicolas Munnich <munnich@lipn.univ-paris13.fr> Co-authored-by: snoyer <noyer.stephane@gmail.com>
22 KiB
title, sidebar_label
| title | sidebar_label |
|---|---|
| Keyboard Scan Configuration | Keyboard Scan |
See Configuration Overview for instructions on how to change these settings.
Common
Kconfig
Definition files:
| Config | Type | Description | Default |
|---|---|---|---|
CONFIG_ZMK_KSCAN_EVENT_QUEUE_SIZE |
int | Size of the event queue for kscan events | 4 |
CONFIG_ZMK_KSCAN_INIT_PRIORITY |
int | Keyboard scan device driver initialization priority | 40 |
CONFIG_ZMK_KSCAN_DEBOUNCE_PRESS_MS |
int | Global debounce time for key press in milliseconds | -1 |
CONFIG_ZMK_KSCAN_DEBOUNCE_RELEASE_MS |
int | Global debounce time for key release in milliseconds | -1 |
If the debounce press/release values are set to any value other than -1, they override the debounce-press-ms and debounce-release-ms devicetree properties for all keyboard scan drivers which support them. See the debouncing documentation for more details.
Devicetree
Applies to: /chosen node
| Property | Type | Description |
|---|---|---|
zmk,kscan |
path | The node for the keyboard scan driver to use |
zmk,matrix-transform |
path | The node for the matrix transform to use |
Demux Driver
Keyboard scan driver which works like a regular matrix but uses a demultiplexer to drive the rows or columns. This allows N GPIOs to drive N2 rows or columns instead of just N like with a regular matrix.
:::note
Currently this driver does not honor the CONFIG_ZMK_KSCAN_DEBOUNCE_* settings.
:::
Devicetree
Applies to: compatible = "zmk,kscan-gpio-demux"
Definition file: zmk/app/module/dts/bindings/kscan/zmk,kscan-gpio-demux.yaml
| Property | Type | Description | Default |
|---|---|---|---|
input-gpios |
GPIO array | Input GPIOs | |
output-gpios |
GPIO array | Demultiplexer address GPIOs | |
debounce-period |
int | Debounce period in milliseconds | 5 |
polling-interval-msec |
int | Polling interval in milliseconds | 25 |
Direct GPIO Driver
Keyboard scan driver where each key has a dedicated GPIO.
Kconfig
Definition file: zmk/app/module/drivers/kscan/Kconfig
| Config | Type | Description | Default |
|---|---|---|---|
CONFIG_ZMK_KSCAN_DIRECT_POLLING |
bool | Poll for key presses instead of using interrupts | n |
Devicetree
Applies to: compatible = "zmk,kscan-gpio-direct"
Definition file: zmk/app/module/dts/bindings/kscan/zmk,kscan-gpio-direct.yaml
| Property | Type | Description | Default |
|---|---|---|---|
input-gpios |
GPIO array | Input GPIOs (one per key). Can be either direct GPIO pin or gpio-key references |
|
debounce-press-ms |
int | Debounce time for key press in milliseconds. Use 0 for eager debouncing | 5 |
debounce-release-ms |
int | Debounce time for key release in milliseconds | 5 |
debounce-scan-period-ms |
int | Time between reads in milliseconds when any key is pressed | 1 |
poll-period-ms |
int | Time between reads in milliseconds when no key is pressed and CONFIG_ZMK_KSCAN_DIRECT_POLLING is enabled |
10 |
toggle-mode |
bool | Use toggle switch mode | n |
wakeup-source |
bool | Mark this kscan instance as able to wake the keyboard | n |
Assuming the switches connect each GPIO pin to the ground, the GPIO flags for the elements in input-gpios should be (GPIO_ACTIVE_LOW | GPIO_PULL_UP):
kscan0: kscan {
compatible = "zmk,kscan-gpio-direct";
wakeup-source;
input-gpios
= <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
;
};
A direct pin defined in the input-gpios property is considered a column when used in a matrix transform; e.g. the 5th pin on the list can be referred to using RC(0,4).
By default, a switch will drain current through the internal pull up/down resistor whenever it is pressed. This is not ideal for a toggle switch, where the switch may be left in the "pressed" state for a long time. Enabling toggle-mode will make the driver enable and disable the internal pull up/down resistor as needed when the switch is toggled to minimise power draw. For toggle-mode to work correctly each pole of the switch needs a dedicated GPIO pin.
toggle-mode applies to all switches handled by the instance of the driver. To use a toggle switch with other, non-toggle, direct GPIO switches, create two instances of the direct GPIO driver, one with toggle-mode and the other without. Then, use a composite driver to combine them. The state of the switch is read on power on, so if the switch is moved whilst the board is off this will get correctly interpreted by the driver.
When using toggle-mode the pull resistors get automatically set by the driver and should not be set in the devicetree via GPIO flags. Assuming the common pole of the switch is connected to ground with an SP3T switch:
kscan_sp3t_toggle: kscan_sp3t_toggle {
compatible = "zmk,kscan-gpio-direct";
toggle-mode;
input-gpios
= <&pro_micro 4 GPIO_ACTIVE_LOW>
, <&pro_micro 3 GPIO_ACTIVE_LOW>
, <&pro_micro 2 GPIO_ACTIVE_LOW>
;
};
Matrix Driver
Keyboard scan driver where keys are arranged on a matrix with one GPIO per row and column.
Definition file: zmk/app/module/drivers/kscan/Kconfig
| Config | Type | Description | Default |
|---|---|---|---|
CONFIG_ZMK_KSCAN_MATRIX_POLLING |
bool | Poll for key presses instead of using interrupts | n |
CONFIG_ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS |
int (ticks) | How long to wait before reading input pins after setting output active | 0 |
CONFIG_ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS |
int (ticks) | How long to wait between each output to allow previous output to "settle" | 0 |
Devicetree
Applies to: compatible = "zmk,kscan-gpio-matrix"
Definition file: zmk/app/module/dts/bindings/kscan/zmk,kscan-gpio-matrix.yaml
| Property | Type | Description | Default |
|---|---|---|---|
row-gpios |
GPIO array | Matrix row GPIOs in order, starting from the top row | |
col-gpios |
GPIO array | Matrix column GPIOs in order, starting from the leftmost row | |
debounce-press-ms |
int | Debounce time for key press in milliseconds. Use 0 for eager debouncing | 5 |
debounce-release-ms |
int | Debounce time for key release in milliseconds | 5 |
debounce-scan-period-ms |
int | Time between reads in milliseconds when any key is pressed | 1 |
diode-direction |
string | The direction of the matrix diodes | "row2col" |
poll-period-ms |
int | Time between reads in milliseconds when no key is pressed and CONFIG_ZMK_KSCAN_MATRIX_POLLING is enabled |
10 |
wakeup-source |
bool | Mark this kscan instance as able to wake the keyboard | n |
The diode-direction property must be one of:
| Value | Description |
|---|---|
"row2col" |
Diodes point from rows to columns (cathodes are connected to columns) |
"col2row" |
Diodes point from columns to rows (cathodes are connected to rows) |
Given the diode-direction, the GPIO flags for the elements in row- and col-gpios should be set appropriately.
The output pins (e.g. columns for col2row) should have the flag GPIO_ACTIVE_HIGH, and input pins (e.g. rows for col2row) should have the flags (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN):
kscan0: kscan {
compatible = "zmk,kscan-gpio-matrix";
wakeup-source;
diode-direction = "col2row";
col-gpios
= <&pro_micro 4 GPIO_ACTIVE_HIGH>
, <&pro_micro 5 GPIO_ACTIVE_HIGH>
;
row-gpios
= <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
;
};
Charlieplex Driver
Keyboard scan driver where keys are arranged on a matrix with each GPIO used as both input and output.
- With
interrupt-gpiosunset, this allows n pins to drive n*(n-1) keys. - With
interrupt-gpiosset, n pins will drive (n-1)*(n-2) keys, but provide much improved power handling.
Definition file: zmk/app/module/drivers/kscan/Kconfig
| Config | Type | Description | Default |
|---|---|---|---|
CONFIG_ZMK_KSCAN_CHARLIEPLEX_WAIT_BEFORE_INPUTS |
int (ticks) | How long to wait before reading input pins after setting output active | 0 |
CONFIG_ZMK_KSCAN_CHARLIEPLEX_WAIT_BETWEEN_OUTPUTS |
int (ticks) | How long to wait between each output to allow previous output to "settle" | 0 |
Devicetree
Applies to: compatible = "zmk,kscan-gpio-charlieplex"
Definition file: zmk/app/module/dts/bindings/kscan/zmk,kscan-gpio-charlieplex.yaml
| Property | Type | Description | Default |
|---|---|---|---|
gpios |
GPIO array | GPIOs used, listed in order. | |
interrupt-gpios |
GPIO array | A single GPIO to use for interrupt. Leaving this empty will enable continuous polling. | |
debounce-press-ms |
int | Debounce time for key press in milliseconds. Use 0 for eager debouncing. | 5 |
debounce-release-ms |
int | Debounce time for key release in milliseconds. | 5 |
debounce-scan-period-ms |
int | Time between reads in milliseconds when any key is pressed. | 1 |
poll-period-ms |
int | Time between reads in milliseconds when no key is pressed and interrupt-gpois is not set. |
10 |
wakeup-source |
bool | Mark this kscan instance as able to wake the keyboard | n |
Define the transform with a matrix transform. The row is always the driven pin, and the column always the receiving pin (input to the controller).
For example, in RC(5,0) power flows from the 6th pin in gpios to the 1st pin in gpios.
Exclude all positions where the row and column are the same as these pairs will never be triggered, since no pin can be both input and output at the same time.
The GPIO flags for the elements in gpios should be GPIO_ACTIVE_HIGH, and interrupt pins set in interrupt-gpios should have the flags (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN).
Composite Driver
Keyboard scan driver which combines multiple other keyboard scan drivers.
Devicetree
Applies to : compatible = "zmk,kscan-composite"
Definition file: zmk/app/dts/bindings/zmk,kscan-composite.yaml
| Property | Type | Description | Default |
|---|---|---|---|
rows |
int | The number of rows in the composite matrix | |
columns |
int | The number of columns in the composite matrix | |
wakeup-source |
bool | Mark this kscan instance as able to wake the keyboard | n |
The zmk,kscan-composite node should have one child node per keyboard scan driver that should be composited. Each child node can have the following properties:
| Property | Type | Description | Default |
|---|---|---|---|
kscan |
phandle | Label of the kscan driver to include | |
row-offset |
int | Shifts row 0 of the included driver to a new row in the composite matrix | 0 |
col-offset |
int | Shifts column 0 of the included driver to a new column in the composite matrix | 0 |
If you want one of the composited kscans to be able to wake up the keyboard, make sure to set the wakeup-source property in its own definition, in addition to setting it for the composite kscan node itself as listed above.
Example Configuration
For example, consider a macropad with a 3x3 matrix and two direct GPIO keys:
| Col 0 | Col 1 | Col 2 | |
|---|---|---|---|
| Row 0 | A0 | A1 | A2 |
| Row 1 | A3 | A4 | A5 |
| Row 2 | A6 | A7 | A8 |
| Col 0 | Col 1 | |
|---|---|---|
| Row 0 | B0 | B1 |
To combine them, we need to create a composite matrix with enough rows and columns to fit both sets of keys without overlapping, then set row and/or columns offsets to shift them so they do not overlap.
One possible way to do this is a 3x4 matrix where the direct GPIO keys are shifted to below the matrix keys...
| Col 0 | Col 1 | Col 2 | |
|---|---|---|---|
| Row 0 | A0 | A1 | A2 |
| Row 1 | A3 | A4 | A5 |
| Row 2 | A6 | A7 | A8 |
| Row 3 | B0 | B1 | (none) |
...which can be configured with the following Devicetree code:
/ {
chosen {
zmk,kscan = &kscan0;
};
kscan0: kscan_composite {
compatible = "zmk,kscan-composite";
rows = <4>;
columns = <3>;
// Include the matrix driver
matrix {
kscan = <&kscan1>;
};
// Include the direct GPIO driver...
direct {
kscan = <&kscan2>;
row-offset = <3>; // ...and shift it to not overlap
};
};
kscan1: kscan_matrix {
compatible = "zmk,kscan-gpio-matrix";
// define 3x3 matrix here...
};
kscan2: kscan_direct {
compatible = "zmk,kscan-gpio-direct";
// define 2 direct GPIOs here...
};
};
Mock Driver
Mock keyboard scan driver that simulates key events.
Devicetree
Applies to: compatible = "zmk,kscan-mock"
Definition file: zmk/app/dts/bindings/zmk,kscan-mock.yaml
| Property | Type | Description | Default |
|---|---|---|---|
event-period |
int | Milliseconds between each generated event | |
events |
array | List of key events to simulate | |
rows |
int | The number of rows in the composite matrix | |
columns |
int | The number of columns in the composite matrix | |
exit-after |
bool | Exit the program after running all events | false |
The events array should be defined using the macros from app/module/include/dt-bindings/zmk/kscan_mock.h.
Kscan Sideband Behavior Driver
The Kscan sideband behaviors node can be used to assign behaviors to keys in a manner distinctly separate from the keymap. These assignments and definitions will not be affected by nor have any effect on the keymap.
Devicetree
Applies to: compatible = "zmk,kscan-sideband-behaviors"
Definition file: zmk/app/dts/bindings/kscan/zmk,matrix-transform.yaml
| Property | Type | Description |
|---|---|---|
kscan |
phandle | Phandle to a kscan containing keys to assign behaviors to |
auto-enable |
bool | Enables the sideband instance on startup unconditionally |
wakeup-source |
bool | Mark this kscan instance as able to wake the keyboard |
If auto-enable is not set, then the sideband behavior will wait for an external activation source before being enabled, e.g. being assigned as the chosen zmk,kscan. The kscan can contain additional keys, which will be used by the keymap if this node is set as the chosen zmk,kscan and has an appropriate matrix transformation defined.
Each child node should have the following properties:
| Property | Type | Description | Default |
|---|---|---|---|
row |
int | The row index of the key in the kscan to intercept and trigger a behavior for |
0 |
column |
int | The column index of the key in the kscan to intercept and trigger a behavior for |
|
bindings |
phandle-array | The behavior that should be triggered when the matching row and column event triggers |