作者wk415937 (wk4)
看板Key_Mou_Pad
标题[键盘] RMK Rust键盘韧体分享
时间Sun Mar 23 10:19:15 2025
代友po,原作者:
https://github.com/ziteh
各位板友好,我是 ZiTe,好久不见
今天不是要分享 ErgoSNM 键盘,而是想介绍最近在测试的键盘韧体 RMK
https://haobogu.github.io/rmk
受限於 PTT 大概不太适合写太多 code block 和篇幅问题,本篇就仅以 nRF52840 做一
个简单的分享。完整的教学还请移步 Blog
https://blog.ziteh.dev/posts/rmk-fw-intro
在这个 Rust 满天飞的现在,键盘韧体当然也要有 Rust 的参与,RMK 是一个以 Rust 写
成的机械键盘韧体,架构在 Embassy 非同步嵌入式应用框架上。
对我来说 RMK 对比 QMK 有以下好处:
- 原生支援 nRF MCU 和蓝牙 BLE
- License 是宽松的 Apache2.0 和 MIT,而非具感染性的 GPL
RMK 对比 ZMK 有以下好处:
- 支援 Vial 即时编辑 Keymap 键位
- Rust 开发环境比 Zephyr 更容易建立
- Kconfig + Devicetree 有一定的复杂度
- 在我的测试中 RMK 的蓝牙比 ZMK 更稳定
---
1. 建立开发环境
首先要安装 Rust 环境,这部分就和一般开发 Rust 时要做的事情一样。
对於 Windows 使用者来说就是下载并使用 rustup 这个工具安装,此外还要下载
Visual Studio 并安装「Desktop Development with C++」
请参考:
https://rustup.rs
再来要添加编译目标,因为开发韧体算是交叉编译,因此要为 Rust 添加目标平台的编译
功能。这部分的命令会因你所使用的不同开发板和 MCU 而有所不同。
以 nRF52840(Cortex-M4 with FPU)来说的话请打开终端机执行:
rustup target add thumbv7em-none-eabihf
然後要安装一些工具(rmkit、flip-link、cargo-make):
cargo install rmkit flip-link cargo-make
最後还要安装文字编辑器,一般推荐使用 VS Code,就照一般的软体下载安装即可。VS
Code 安装好後建议再安装一些扩充套件:Even Better TOML 和 rust-analyzer。
VS Code:
https://code.visualstudio.com
---
2. 建立韧体专案
开啓终端机,移动到目标路径(这里示范爲 D 槽下的 rmk 资料夹),使用 rmktit 开啓
互动式专案建立:
cd D:/rmk
rmkit init
只要依序回答专案名称、键盘类型和目标 MCU 即可
完成後会建立专案资料夹,例如 D:/rmk/my-rmk-kb/。使用 VS Code 开啓此资料夹。
---
3. 编辑 keyboard.toml
首先最重要的是 keyboard.toml 这个档案,它包含了大多数的键盘设定。接下来会分各
个部分大致简介,如果想知道详细说明的话请参考官方文件:
https://haobogu.github.io/rmk/keyboard_configuration.html
keybaord.toml 完整范例
https://i.imgur.com/88DuNiD.png
[keyboard]
包含了基本资讯,比较重要的是:
- product_name 是显示名称,也就是搜寻蓝牙时会出现的装置名。
- vendor_id 和 product_id 是 USB 的东西,你不知道这是什麽的话可以不用改。
- chip 是你要用的 MCU,这里是 nrf52840。
[matrix]
定义键矩阵扫描的 IO 脚,要注意的是这里的脚位名称要使用 Embassy 里的
Peripherals 名称,对 nRF52840来说 也就是 P1_05 这种。
RMK 预设使用 col2row 方向
[layout]
定义 Keymap 按键布局。rows 和 cols 的数量要和 matrix 的 IO 脚部分配合,layers
用来定义分层数量。
keymap 就是定义按键布局,可用的 KeyCode 请参考:
https://docs.rs/rmk/latest/rmk/keycode/enum.KeyCode.html
另外还有一些特殊的修饰键,如 MO(1) 代表暂时切换到 layer 1。这些修饰键和 QMK 的
定义是相同的,可以参考:
https://docs.qmk.fm/feature_layers
[behavior]
定义一些不同的键盘行为。例如 One Shot、Combo 键等等。这部分属於比较进阶的功能
就先跳过。
[light]
定义指示灯的 IO,包含 capslock、numslock、scrolllock。
[storage]
定义储存设定,RMK 会将 Keymap 资料和 BLE 连线资讯储存在 Flash 中的特定位置。
预设情况下它是啓用的,并且会使用最後 2 个 sector 储存资料。
有些 Bootloader(例如 Adafruit nRF52 Bootloader)会和此预设位置冲突,这时就需
要修改这边的 start_addr 设定,例如将其设为 start_addr = 0x000A0000。
另外还有一个 clear_storage,如果将其设爲 true 那每次键盘开机都会清空这些资讯,
通常用於开发测试。
[ble]
设定无线蓝牙的相关功能。对我们来说就是将 enabled = true 啓用 BLE 就行了。
---
4. 编辑 memory.x
这个是用来定义 MCU 的 RAM 和 Flash 布局。使用 nRF52840 的话,会牵扯到你使用的
SoftDevice 要修改韧体起始位置,也就是 FLASH : ORIGIN = ???。
使用 S140 v6.1.1 的话可以使用 0x00026000,如果是 7.3.0 的话可以用
0x0027000。
这里以 S140 v6.1.1 爲例:
https://i.imgur.com/6tRQNGv.png
注意这里的 1K 是 1KiB 也就是 1024 bytes
---
5. 编辑 vial.json
再来是 vial.json 档案,要设定好才能使用 Vial 编辑 Keymap,这个是 Vial 要用的,
其格式请参考文件说明:
https://get.vial.today/docs/porting-to-via.html
或
https://blog.ziteh.dev/posts/diyqmkkeyboard-vial
---
6. 编译设定
这边只要再次确认 .carbo/config.toml 里的 build.target 是不是
thumbv7em-none-eabihf 即可。
---
7. 编译
接下来就可以进行编译了,在 VS Code 开啓终端机(上方选单列 > Terminal > New
Terminal)并执行:
cargo build --release
如果成功的话会产生在 target/thumbv7em-none-eabihf/release/my-rmk-kb
编译完成的韧体没有副档名,但它其实是 ELF 档案。
但我们可能更喜欢 .uf2 和 .hex,所以要改用 cargo-make,执行:
cargo make uf2 --release
成功後会在专案资料夹下产生 my-rmk-kb.uf2 和 my-rmk-kb.hex
---
8. 烧录
主要有两种烧录方式。
如果你的 MCU 有 UF2 Bootloader 的话,只要用 USB 将其接上电脑并进入 DFU 模式,
此时它会变成一个随身碟,再将刚刚编译完的 .uf2 档复制贴上进去即可。
进入 DFU 模式的方法不同的 Bootloader 都不同,但通常是快速按 RESET 按钮两次。
如果你的 MCU 没有 UF2 Bootloader 的话,要使用专门的烧录器如 J-Link 或 DAP
Link 等,将 MCU 或开发板接上烧录工具,再使用烧录程式(如 nrfjprog、probe-rs、
OpenOCD)。
如果你喜欢 GUI 工具的话,可以用 Nordic 官方的 nRF Connect for Desktop,里面有
个 Programmer 可以烧录。
完成烧录後就可以用 USB 或蓝牙连接到电脑,它应该已经可以正常运作了
注意!
nRF MCU 要使用蓝牙功能的话会需要 SoftDevice,以 nRF52840 来说的话要使用蓝牙通
常是选择 S140,然後 RMK 目前支援 v6.x 和 v7.x。
如果你的 nRF52840 已经有烧录好 UF2 Bootloader 的话,要查看其使用的 SoftDevice
版本。
方法爲进入 DFU 後,开啓其中的 INFO_UF2.TXT 档案,内部会标注版本如 SoftDevice:
S140 version 6.1.1。
如果你的 nRF52840 是完全空的,那除了烧录 RMK 韧体外,你还要先为其烧录
SoftDevice。
先到 Nordic 官网下载对应的 SoftDevice,然後用烧录器将 .hex 档案(如
s140_nrf52_7.3.0_softdevice.hex)烧进 MCU 内。
https://i.imgur.com/EPTsdgz.png
以上图为例,我加入了两个档案:
- SoftDevice:s140_nrf52_7.3.0_softdevice.hex
- RMK 韧体:my-rmk-kb.hex
其中绿色的部分是我们的 RMK 韧体,可以确认其起始位置是 0x00027000,没有和
SoftDevice 重叠。而蓝色的区域就是 SoftDevice,我烧录的是 S140 v7.3.0。最下面的
橘色是 MBR 开机区域。
---
我有建立一个范例 repo 可以参考,也有预编译的 .hex 和 .uf2 可以测试
https://github.com/siderakb/rmk-example
前阵子我还在处理 ErgoSNM v3 键盘,突然看到 RMK 且用起来很不错,所以未来我开发
键盘可能都会更倾向使用它取代 QMK 和 ZMK
尤其不知道爲什麽 ZMK 不管我用其它人编译好的还是自己编译,BLE 连线都很不稳定,
用得有点头痛
但是它目前最大的问题是缺乏对游标装置的支援,所以我的 ErgoSNM 还没办法使用它
至於 ErgoSNM 的後续进度的话,因爲我最近在准备换工作,比较忙,遥遥无期呀~
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.160.57.174 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Key_Mou_Pad/M.1742696374.A.ADB.html
1F:推 a58524andy: cool 03/23 10:48
2F:推 observer0117: 推 03/23 15:28
3F:推 denny0411: 推,感谢分享 03/23 23:51
4F:推 twetto912: 赞 03/24 13:02
5F:推 Snake5566: ZMK 这个月更新支援模拟滑鼠了 03/24 18:52
6F:推 Richun: 推Rust 03/24 19:58
7F:推 ko00385331: 推 03/25 18:52
8F:推 holoyo: 推个 03/28 14:01