From v0.9 to v0.10

Use this guide to update an existing RMK v0.9 firmware project. For new projects, follow the current processor guide.

Processors

Update registration first, then choose whether to keep your existing run loop.

Remove registration mode arguments

In each keyboard.toml keyboard module, replace #[register_processor(event)] or #[register_processor(poll)] with the bare attribute:

- #[register_processor(event)]
+ #[register_processor]

Registration now starts the type's Runnable implementation. Check the type's #[processor] options to preserve the behavior you want:

Previous setupWhat to keep or change
(poll) with a polling processorKeep poll_interval and poll().
(event) with an event-only processorKeep subscribe without timer options.
(event) used to bypass the type's polling loopRemove poll_interval to keep event-only behavior.
A type with a custom RunnableKeep that implementation and its #[runnable_generated] marker; registration now starts your loop.

Rust API projects that already use run_all! do not need a registration change.

Use the generated deadline loop

Existing DeadlineProcessor::deadline() and on_deadline() methods keep their names. If you want RMK to generate the run loop for an existing deadline processor:

  1. Add deadline to its #[processor] attribute.
  2. Keep deadline() and on_deadline() in impl DeadlineProcessor.
  3. Remove the old impl Runnable and #[runnable_generated] marker.

Keep the marker and impl Runnable if your custom loop is still needed. The inactivity example shows a complete processor with the generated loop.

Battery configuration tables

Battery settings now require a dedicated table for each board. Battery fields under [ble], [split.central], or [[split.peripheral]] are no longer accepted.

Move each board's battery settings to its battery table:

BoardMove fields fromMove fields to
Unibody[ble][battery]
Split central[split.central], plus any battery settings inherited from [ble][split.central.battery]
Split peripheralIts [[split.peripheral]] entry[split.peripheral.battery] below that entry

Move battery_adc_pin, adc_divider_measured, adc_divider_total, charge_state, charge_led, and battery_user_description if configured. Leave BLE connection and pairing settings in [ble].

For example, a unibody configuration changes as follows:

 [ble]
 enabled = true
+
+[battery]
 battery_adc_pin = "P0_05"
 adc_divider_measured = 2000
 adc_divider_total = 2806

Remove the battery fields from their old sections after moving them. Peripherals use only their own battery table and never inherit the central's battery configuration.

See Battery configuration for field descriptions and split keyboard examples.

Serial numbers

Serial numbers no longer contain the RMK version. USB, BLE, and Rynk report the same protocol marker and device ID. See About serial numbers.

Default serial numbers change as follows:

  • nRF BLE builds keep their hardware ID. Vial serials stay the same; Rynk BLE serials gain the rynk: prefix.
  • Other defaults change from the version stamp to a hardware ID or the RMK fallback.

Existing Vial and Rynk markers in configured IDs are replaced automatically.

To update your project:

  1. If an nRF BLE keyboard sets serial_number, remove the override to keep using its hardware ID. Older firmware ignored the override.
  2. Remove RMK_BUILD_INFO. Omit serial_number to use the platform default.
  3. For a custom ID in Rust, replace the string literal with rmk::config::build_serial_number("board-0001"), using your existing ID. The field now owns the complete serial number.
  4. DeviceConfig is now Clone rather than Copy. When USB and BLE share a configuration, pass rmk_config.device_config.clone() to USB before moving rmk_config into BLE.