feat: tri-mode BLE dongle - #1028
Conversation
16d1346 to
e9cf67a
Compare
Size Report
|
0667f5d to
f7478fd
Compare
f7478fd to
faa0bd8
Compare
faa0bd8 to
e698d5e
Compare
e698d5e to
138aee7
Compare
138aee7 to
86437ad
Compare
1637b06 to
9faaf4b
Compare
9faaf4b to
23e70aa
Compare
23e70aa to
f1cfb29
Compare
f1cfb29 to
ce48b03
Compare
15955c2 to
af7c0d3
Compare
af7c0d3 to
db930a2
Compare
db930a2 to
4f7846b
Compare
4f7846b to
8fc7872
Compare
8fc7872 to
c526262
Compare
c526262 to
5097a8c
Compare
5097a8c to
20b4a32
Compare
20b4a32 to
0722580
Compare
0722580 to
8291fa9
Compare
8291fa9 to
d2d34f5
Compare
d2d34f5 to
3c338e9
Compare
3c338e9 to
a70363d
Compare
A dongle is a BLE central that pairs with RMK keyboards and relays them to the host over USB: HID reports are merged across links (modifiers OR'd, keycodes unioned), and the Rynk config session is routed — 0x09xx dongle commands answered locally, everything else passed through to the selected keyboard over its rynk GATT service, with topic pushes forwarded back. - `rmk::dongle`: slot table with bond persistence and Lamport-recency eviction, per-link state machine (claim → connect → secure → handshake → serve; LESC Just Works with an RSSI-selected pairing window), HID merge, and the CDC frame router. - `Dongle::new(controller, address, slots)` owns its stack, sized by `DONGLE_LINKS_NUM`; slots come from `new_storage_for_dongle`. - `UsbTransport::with_dongle_router` attaches the router; the `dongle` feature is orthogonal to `rynk`/`vial`, so one crate can build keyboard and dongle binaries side by side. - `examples/use_rust/nrf_dongle`: a tri-board reference (nRF54LM20A dongle, nRF52833 split central, nRF54L15 split peripheral), hardware-tested: pairing, typing through the split, config pass-through, and bonded directed reconnect after a dongle power-cycle.
a70363d to
a32f55f
Compare
The dongle itself: a BLE central that pairs with RMK keyboards and relays them to the host over USB. HID reports are merged across links (modifiers OR'd, keycodes unioned), and the Rynk config session is routed — 0x09xx dongle commands answered locally, everything else passed through to the selected keyboard over its rynk GATT service, with topic pushes forwarded back.
rmk::dongle: slot table with bond persistence and Lamport-recency eviction; per-link state machine (claim → connect → secure → handshake → serve) with LESC Just Works pairing gated by an RSSI-selected 30 s pairing window; HID merge; the USB frame router.Dongle::new(controller, address, slots)owns its stack, sized byDONGLE_LINKS_NUM;slotscome fromnew_storage_for_dongle.UsbTransport::with_dongle_routerattaches the router. Thedonglefeature is orthogonal torynk/vial: one crate can build keyboard and dongle binaries side by side (CI covers the union feature set).examples/use_rust/nrf_dongle: tri-board reference — nRF54LM20A dongle, nRF52833 split central, nRF54L15 split peripheral.Hardware-tested end to end on the tri-board rig: pairing via
SwitchToDongle, typing through the split (both halves), config pass-through over USB, and bonded directed reconnect after a dongle power-cycle. Design doc included (zh + en).Stack 4/4 — depends on #1027.