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>
Properly use the BT_DEVICE_APPEARANCE Zephyr symbol to advertise
the correct appearance, allowing overrides, for e.g. mice.
Co-authored-by: Cem Aksoylar <caksoylar@users.noreply.github.com>
* Reference combos by index, not 32-bit pointers, and store bitfields
instead of arrays in several places, to bring down our flash/RAM usage.
* Use bit field to track candidate combos, to avoid needing an explicit
`ZMK_COMBO_MAX_COMBOS_PER_KEY` setting.
* Determine the max keys per combo automatically from the devicetree,
so we remove the ZMK_COMBO_MAX_KEYS_PER_COMBO Kconfig symbol.
refactor(split): Refactor split code for extension
Extract central/peripheral code to allow for plugging in alternate
transports, instead of tying all split logic to BT.
feat(split): Add full-duplex wired split support
* Depends on full-duplex hardware UART for communication.
* Supports all existing central commands/peripheral events, including
sensors/inputs from peripherals.
* Only one wired split peripheral supported (for now)
* Relies on chosen `zmk,split-uart` referencing the UART device.
docs: Add wired split config docs.
Migrate split to its own dedicated config file, and add details
on wired split config.
Co-authored-by: Nicolas Munnich <98408764+Nick-Munnich@users.noreply.github.com>
fix: Properly override stack size on RP2040
Move the system work queue stack size override on RP2040 ouf of
a `ZMK_BLE` conditional so it is properly applied generally for that
SoC.
---------
Co-authored-by: Nicolas Munnich <98408764+Nick-Munnich@users.noreply.github.com>
To be able to save on flash space, for layouts on space constrained
devices that don't require rotation, make key rotation props
optional behind a new Kconfig flag.
* feat(mouse): Add mouse move and scroll support
* Use Zephyr input subsystem for all pointers.
* Input processors for modifying events, e.g. scaling, swapping
codes, temporary (mouse) layers, etc.
* Mouse move/scroll behaviors.
* Infrastructure in place for physical pointer input devices.
* feat: Add input split support.
* docs: Add initial pointer docs.
---------
Co-authored-by: Cem Aksoylar <caksoylar@users.noreply.github.com>
Co-authored-by: Alexander Krikun <krikun98@gmail.com>
Co-authored-by: Robert U <urob@users.noreply.github.com>
Co-authored-by: Shawn Meier <ftc@users.noreply.github.com>
Co-authored-by: Chris Andreae <chris@andreae.gen.nz>
Co-authored-by: Anant Thazhemadam <47104651+thazhemadam@users.noreply.github.com>
Co-authored-by: Erik Tollerud <erik.tollerud@gmail.com>
Co-authored-by: Nicolas Munnich <98408764+Nick-Munnich@users.noreply.github.com>
docs: Fix incorrect kconfig default values
fix(Kconfig): Added a name to EC11's trigger mode choice, allowing it to be set in device Kconfig.defconfig
refactor(Kconfig): Moved designer defaults out into new files
This allows for the device name to be set at runtime, possible uses for this include a custom display screen that lets you type it in using the keycode state event, future configuration in zmk studio, or altering it per profile as per #1169
* Add keymap API for getting/setting a bindings
in keymap layers.
* Add layer move support via intemediary ordering array.
* Add settings storage for keymap changes.
* UART and BLE/GATT transports for a protobuf encoded RPC
request/response protocol.
* Custom framing protocol is used to frame a give message.
* Requests/responses are divided into major "subsystems" which
handle requests and create response messages.
* Notification support, including mapping local events to RPC
notifications by a given subsystem.
* Meta responses for "no response" and "unlock needed".
* Initial basic lock state support in a new core section, and allow specifying
if a given RPC callback requires unlocked state or not.
* Add behavior subsystem with full metadata support and examples of
using callback to serialize a repeated field without extra stack space needed.
Co-authored-by: Cem Aksoylar <caksoylar@users.noreply.github.com>
This adds a new config value `ZMK_HID_SEPARATE_MOD_RELEASE_REPORT`
where, if enabled, the report for a key release is sent separately to
the accompanying modifier release signals, which are then sent in a
second report.
This fixes an issue where certain applications are unable to work with
implicitly modified keys (e.g. colon) due to them registering the
modifier release prior to the actual key release.
Have tested this on my personal keyboard and `wev` now shows the signals
in the correct order.
=> **Previously:** ```LSHIFT (pressed) -> colon (pressed) -> LSHIFT
(released) -> **semi**colon (released)```
=> **Now:** ```LSHIFT (pressed) -> colon (pressed) -> colon (released)
-> LSHIFT (released)```
(This time without accidental files)
* Add dedicated init priority for the sideband kscan.
* Refactor sideband code for clarity.
* Tweaks to direct kscan for clarity.
* Make sideband behavior row optional for brevity.
* Allow overriding ZMK Uno sideband behaviors.
* Instead of gpio key behavior trigger, add new kscan driver that
decorates/wraps a given kscan driver and will invoke basic system
behavior assigned to a given row + column, without the need for keymap
mapping in the matrix transform, bypassing keymaps entirely.
* Better naming for gpio-key behavior triggers.
* Tweaks to scanned behavior trigger to avoid bad semaphore use,
and reduce chance of issues with slowly scanned matrixes.
* Various code cleanups of style issues.
Initial work on a soft on/off support for ZMK. Triggering soft off
puts the device into deep sleep with only a specific GPIO pin
configured to wake the device, avoiding waking from other key
presses in the matrix like the normal deep sleep.
Co-authored-by: Cem Aksoylar <caksoylar@users.noreply.github.com>
* To be able to use the Zephyr `voltage-divider` driver,
add a mode for fetching raw voltage from the sensor
and do state of charge calculation outside of the driver.
* Add a dedicated settings reset on start init priority and default
it to lower priority (high number) than default FLASH_INIT_PRIORITY
to be sure flash is initialized before we open the area.
Added a new CONFIG_ZMK_SETTINGS_RESET_ON_START option which enables init
code to call zmk_settings_erase(), and changed the settings_reset shield
to use it instead of CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START, so it now
resets all settings instead of just clearing BLE bonds.
CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START is left in place for now in case
someone still needs it. It may be replaced in the future once we find a
better way to repair a broken split connection.
* Don't default heap mempool by default now that there's a dedicated
LVGL mempool
* Set proper defaults for CiZ display hardware/custom screen.
* Double the dedicated display thread stack size for CiZ.
* Move to local/stack allocated event API that doesn't require
dynamic allocation/freeing.
* Disable heap, we no longer use alloc/free unless using LVGL.
* Tons of refactors all over to account for the new event approach.
* Auto security request actually makes macOS worse, so disable it,
and remove our early request in favor of using GATT enforcement
to ensure connections are secured.
* Add a new Kconfig symbol to enable the low priority queue, and make
the two features that depend on it `select` the symbol to turn it on.
This helps ensure no wasted RAM/ROM on devices that don't need it.
* Split connection and security experimental changes into dedicated
Kconfig flags for easier testing of only connection related fixes.
Co-authored-by: Cem Aksoylar <caksoylar@users.noreply.github.com>
By default the maximum NKRO usage is set to maximise compatibility, but some keys dont work, this adds the ability to use those extended keys, at the cost of compatibiltity
Co-authored-by: Cem Aksoylar <caksoylar@users.noreply.github.com>
Co-authored-by: Pete Johanson <peter@peterjohanson.com>
* Add HID report/descriptor for a new report with mouse buttons,
and x/y/wheel deltas.
* New mouse key press behavior for press/release of mouse keys.
* Add constants for HID main item values (e.g. data/array/absolute)
* Define and use constants for our HID report IDs.
The battery reporting has been known to cause macOS computers to wakeup repeatedly. In some cases (e.g. display or custom lighting implementation) one might want to collect battery SOC without broadcasting over BLE
* Update docs/docs/config/battery.md
Co-authored-by: Cem Aksoylar <caksoylar@users.noreply.github.com>
* Previous version of multiple overrides of the default value of ZMK_USB
were problematic. Move to using board _defconfig files for the
defaults for those, along with proper `depends on` for ZMK_USB that
accounts for split and split roles.
* USB boot protocol support
* Use a single definition of a boot report, used for regular reports in
non-6KRO, and for rollover in all branches.
* Handle gaps in the zmk report when producing a boot report in HKRO mode. For
.example, if it was 8KRO, it would be possible to have the state 0 0 0 0 0 0 0
17 (by pressing 8 keys, and letting go of the first 7). Copying the first 6
bytes would not show up the single pressed key.
* Disable usb status change and callback on SOF events:
SOF events were introduced by the boot protocol changes, and required internally
by Zephyr's idle support, but are unused within ZMK itself. Ignore them in the
usb status callback.
---------
Co-authored-by: Andrew Childs <lorne@cons.org.nz>