Rust Keyboard Toolkit
rktk is a keyboard firmware framework written in Rust.
Currently, rktk supports nRF52840 and RP2040, and although there are bugs and performance issues (especially related to split keyboards), it can be used as a decent keyboard.
This firmware consists of two parts: the core functionality implemented in the
rktk
crate and the driver that actually interacts with the hardware. This
makes it easy to extend.
Crate | crates.io | docs.rs | repo |
---|---|---|---|
rktk | link | ||
rktk-drivers-common | link | ||
rktk-drivers-nrf | link | ||
rktk-drivers-rp | link | ||
rktk-keymanager | link | ||
rktk-rrp | link | ||
rktk-rrp-client-webhid | link | ||
rktk-cli | link | ||
rktk-client | link |
- ✅ : Working
- 🟡 : Basic implementation only or known bugs.
- 🔴 : Planned.
- (blank): N/A.
Feature | Status | Note |
---|---|---|
Keyscan | ✅ | |
Key mapping | 🟡 | See below table for detail |
Mouse | ✅ | |
Encoder | 🟡 | |
Hook system | 🟡 | |
USB | ✅ | |
Bluetooth | 🟡 | |
Split keyboard | ✅ | |
Display | 🟡 | |
Storage | 🟡 | |
RGB led | 🟡 | |
Remapper (rktk-client) | 🟡 |
Key mapping features is implemented in rktk-keymanager
and this crate does not
depend on rktk or embassy.
Feature name | Status | Note |
---|---|---|
Key action | ||
Tap-Hold | ✅ | Called as Mod-Tap or Layer-Tap in QMK |
Tap Dance | ✅ | |
Oneshot key | ✅ | |
Combo key | 🟡 | |
Key code | ||
Normal key | ✅ | |
Modifier key | ✅ | |
Media key | ✅ | |
Mouse key | ✅ | |
Mouse scroll momentary | ✅ | |
Layer momentary (MO) | ✅ | |
Layer toggle (TG) | ✅ |
Driver that is available in the rktk-drivers-common
crate is available for all
platforms which have embassy compatible HAL.
Driver | Common | RP2040 | NRF52840 |
---|---|---|---|
Key scanner | |||
Matrix | 🟡 | - | - |
Matrix with shift register | ✅ | - | - |
(Japanese) Duplex-Matrix | 🟡 | - | - |
Mouse | |||
PMW3360 | ✅ | - | - |
PAW3395 | ✅ | - | - |
Encoder | 🟡 | - | - |
Debouncer | |||
Eager debouncer | 🟡 | - | - |
Host communication | |||
USB | ✅ | - | - |
Bluetooth | 🟡 (SoftDevice) | ||
Split communication | |||
Half-duplex (single wire, TRS) | 🟡 (PIO) | 🟡 (UART) | |
Full-duplex (dual wire, TRRS) | ✅ (UART) | ||
Bluetooth | 🔴 | ||
Display | |||
SSD1306 | ✅ | - | - |
Storage | |||
sequential-storage (NorFlash) | 🟡 | - | - |
RGB led | |||
WS2812 | ✅ (PIO) | ✅ (PWM) |
You can find examples in the examples
directory.
arm-none-eabi-objcopy
is required to generate uf2 file.
rktk actually doesn't depends on nightly feature of rustc, but uses nightly
cargo features like per-package-target
. So, it requires nightly toolchain.
Currently, there is no guide for building a new keyboard, but you can refer to the examples in this repo or the following repository:
- https://github.com/nazo6/rktk-neg
- https://github.com/nazo6/rktk-keyball-rs
- rumcake: RP2040 double-tap-reset driver
- uf2: uf2conv.py, uf2families.json
- rust-dilemma: RP2040 Half-duplex communication
- qmk: RP2040 Half-duplex communication
- rmk: bluetooth implemention