-
Notifications
You must be signed in to change notification settings - Fork 137
ZMK
ZMK is modern, open source Zephyr-based wireless keyboard firmware. Probaby the best choice. Also see QMK and RMK.
- https://zmkfirmware.dev (official site). Note that ZMK does not need Nordic softdevice.
Duplex serial is supported since #2766, still no dynamic switching at the time: https://zmk.dev/docs/config/split#wired-splits
Download Jorne firmware from here, unzip the archive, press reset twice, upload uf2 file to the USB drive.
- https://github.com/zmkfirmware/zmk (official ZMK repository)
Note that nRFMicro and Jorne are officially supported now. Read official documentation here:
(Before calling west, set up Zephyr environment, as here https://zmkfirmware.dev/docs/development/setup)
Building jorne (looks like nrfmicro is still not in the build.yml so you'd have to use command line):
git clone https://github.com/joric/zmk
cd zmk && git checkout jorne
west build -p -b nrfmicro_13 -- -DSHIELD=jorne_left
west build -p -b nrfmicro_13 -- -DSHIELD=jorne_rightSee https://github.com/joric/nrfmicro/wiki/Batteries#zmk
I built ZMK firmware for my Jorne keyboard. You may download binares and code.
Upd. Jorne firmware is a part of ZMK now, newest firmware is here: https://zmk.dev/docs/hardware
This is the latest ZMK for Jorne (clone the repo to rebuild and download artifacts, or get firmware.zip from releases):
Keymap editor (fork the repository above and use it on your fork):
This is really outdated and includes patches that are already in the mainstream ZMK but you can peek RGB configuration here.
Direct links to the latest release with RGB sync (this is for nRFMicro 1.3+, double press reset and upload .uf2 to disk as usual):
- jorne_left_nrfmicro_13_rgb.uf2 (left half, central)
- jorne_right_nrfmicro_13_rgb.uf2 (right half, peripheral, won't work without central)
You may also need erasing the flash to reset bonds if nothing else helps:
Direct link to the releases section:
- https://github.com/joric/zmk/releases (sorry I'm not maintaining it too actively)
This firmware supports OLED screens, per-key RGB leds and VCC power saving.
- https://github.com/joric/zmk/tree/jorne (my base repository)
I had to merge a few patches into my base repository, some are already merged to upstream (follow zmk github)
- https://github.com/zmkfirmware/zmk/pull/675 adds delayed init after wakeup, fixes OLED and other issues (closed)
- https://github.com/zmkfirmware/zmk/issues/288 autorepeat of multitap keys, e.g. shift + backspace (closed)
- https://github.com/zmkfirmware/zmk/pull/547 RGB is sometimes out of sync, this patch fixes that (merged locally)
- https://github.com/zmkfirmware/zmk/pull/516 ties RGB Underglow into sleep statuses
- https://github.com/zmkfirmware/zmk/pull/669 sets RGB min, max and start brightness
RGBTOG currently toggles VCC as well (CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y). There's no sleep mode or lock shortcuts in ZMK just yet, sleep mode as automatic (15 minutes).
- Raise + Lower + ~ Turn RGB and OLED off (essentially turns off VCC, key matrix still works)
- Raise + Lower + Shift Reset Bluetooth bonds
See full keymap here:
- VCC management seems fine with the latest ZMK, no leak, checked with 26 LEDs per each half, but it needs manual turning off with a shortcut (currently it's tied to RGBTOG). Key matrix still works even with VCC off, it only turns off OLED and RGB.
- OLED initialization is static in Zephyr so it only works if VCC is enabled on startup. To check if OLEDs work, enable RGB+VCC using RGBTOG key binding, then wait at least a minute. After that, that'd be stored to settings and restored at startup/reset (fixed in #674, #675 so you may want to pull fresh ZMK)
See Instructions on how to configure ZMK to work with nrf52833.
- https://github.com/ci-bus/zmk-nrf52833
- https://github.com/zmkfirmware/zmk/pull/912.
- You can make HHKB Pro 2 wireless with nRFMicro, Supermini or nice!nano https://github.com/kanru/hhkb-zmk
- There's a Holyot based WIP by @4pplet available here https://github.com/4pplet/SHKB/releases/tag/A1_lite_mini_bt
- If you don't like DIY, buy TMK-based YDKB controller but it has issues, see https://github.com/joric/usb-c/wiki#issues
- Also see https://github.com/joric/qmk/wiki/hhkb_ble (My take on HHKB Pro 2 QMK firmware/nRFMicro)
- Also see Alternatives#hhkb-classic-wireless-mod
@kahru powers the entire HHKB switchboard through a GPIO pin in the high power sourcing mode at 3.3V (due to the fact that VCC cutoff requires a Kconfig change so you cannot control everything in the overlay). HHKB consumes 0.8W (about 1/5 of a laptop), nRF52840 LDO is 25 mA and GPIO is just 15 mA max, so that power configuration probably needs revisiting.
I got the prototype board from @4pplet and I got it working. I figured out how to make Zephyr out-of-tree modules and define gpio nexus nodes in devicetree. Now the code is pushed to the renamed repo https://github.com/kanru/hhkb-zmk and most of the HHKB Pro2 kscan code is extracted to its own shield that can be reused by any boards easily. (discord)

See my article about displays: https://github.com/joric/jorne/wiki/Displays
See my article about trackpoints: https://github.com/joric/jorne/wiki/Trackpoint There are currently 2 problems:
- nobody tried trackpoint at 3.3v (edit: tried, it works)
- all trackpoints are ps/2 and there's no ps/2 support in ZMK (there's ps/2 driver in zephyr though)
- https://docs.zephyrproject.org/latest/reference/peripherals/ps2.html (Zephyr ps/2 driver)
TL;DR: trackpoints work with ps/2 Arduino library at 3.3V just fine. There's no ZMK support just yet.
Update: Keyboard Minimalists ran ZMK touchpad and trackball, links to discord (join at https://discord.gg/zUsWqq9ggb):
- Media: photos | firmware | touchpad video | trackball video
- Firmware: https://github.com/ufan/zmk/tree/ptdevice-refactor
Moved to Alternatives#dongles.
RMK is a feature-rich keyboard firmware library written in Rust. Github Wiki hides article titles if there are more than 15 of them in the sidebar so I put it here in a section.
Project link: https://github.com/haobogu/rmk
0.4.0
- RMK now has split keyboard support, both wired (over serial) and full wireless(over BLE)!
- The configuration system evolves, makes it easier to customize a keyboard, using only a toml file
- uf2 firmware generation support, via cargo-make
- Wireless real-time keymap editing support, now you can use vial to edit the keymap in both USB/BLE mode
- Optimized power consumption for nRF. The advertise/idle current is reduced to 40/15uA for nRF52840
- esp32c6/hpm5300 support. Now RMK supports Arm(stm32/rp2040/nRF52), RISCV(esp32cX/hpm5300) and Xtensa(esp32s3) chips
- Many other improvements/fixes
0.2.0
- Wireless support for nRF52 and esp32. RMK now supports BLE/USB dual mode with auto-switch feature
- A new configuration system based on toml. Now you can config almost everything of your keyboard with a single keyboard.toml, no Rust code is required! * This makes RMK more user-friendly. If you want do more customization, you can still
- A new rapid debouncer, which would trigger the key first and then do debouncing
- Interrupt triggered matrix scanning, which reduces power consumption a lot
- Support more advanced keyboard feature: mouse key, media key and tap/hold feature
- Documentation and project-template got improved a lot
- According to testing on nRF52840 GH60 board(open-sourced as rmk-ble-keyboard), the key latency of RMK is about 2 ms in wired mode and 10 ms in wireless(BLE) mode. The power consumption is about 200ua when advertising, 450ua when idling and 2ma when typing, which means RMK could provide about 2-3 months battery life with a 2000mah battery.
- https://www.reddit.com/r/rust/comments/1dfnoev/rmk_hits_020/
- https://www.reddit.com/r/ErgoMechKeyboards/comments/1gfam47/rmk_a_keyboard_firmware_written_in_rust_just/
- https://github.com/haobogu/rmk
- https://deploy-preview-312--zmk.netlify.app/power-profiler/ ZMK power profiler
- https://nickcoutsos.github.io/keymap-editor ZMK keymap editor
- https://github.com/ebastler/zmk-designguide ZMK hardware design guide (recommended!)
- https://github.com/aroum/zmk-enki42-dongle ZMK config for a dongle-based setup (better battery life)
