[鍵盤] RMK Rust鍵盤韌體分享
代友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 的後續進度的話,因爲我最近在準備換工作,比較忙,遙遙無期呀~
--
cool
推
推,感謝分享
讚
ZMK 這個月更新支援模擬滑鼠了
推Rust
推
12
Re: [討論] 為什麼不要用c++寫網站如果是我的話也許寧願選擇用 C 也不太會選擇用 C++ 開發網站。 C 和 C++ 的好處在於沒有節操,大部分軟體工程師講得出來的程式語言,都會有記憶體 範圍保護以及垃圾回收的設計。 但是 C 和 C++ 沒有,C 和 C++ 覺得這是工程師應該要負責的事情。 而大部分的 HTTP 伺服器,如果是使用 nginx 或是 apache 的話,基本上這兩套都是純11
[鍵盤] 以Pro Micro 自製機械鍵盤筆記分享大家好,這篇文章主要是紀錄改裝樹梅派Pi-400為機械鍵盤的筆記 本身在這方面完全是大外行,期間參考板上眾多前輩的分享, 在爬文及製作時有將一些資訊記錄下來,想將過程回饋板上, 第一次在板上發文,有任何不妥處還請告知,謝謝。 進入正文前,首先提要幾個參考來源:9
[閒聊] 英打輸入法佈局Colemak-DH和Workman心得3鄉民們安安,認真專業的測試員我又回來發文了。 距離我第二篇心得文不知不覺就過了一個月,不知道我在講什麽的, 可以先看本系列的前兩篇文章。中間我實在太忙了,加上次發文後, 又和不少同好討論了,感想有再改變過,所以現在才能完成結論。 下面就是我的結論:8
[閒聊] VIA可以設定長按功能嗎?現在青龍4.0 鍵盤少了END HOME鍵 操作PTT很不方便 偶然看到有人設定按鍵長按可以有新功能 請問各位前輩 VIA是否能設定達到 網路上大多是QMK教學要燒錄韌體進去 臭文組的實在有點難懂..... 話說青龍用了兩個禮拜 居然好想買鋁陀陀3
[心得] 2020-1-31 每日新聞# 2020-1-31 每日新聞 # rust 1.41了! 除了一些功能更新 重要的是不再支援32-bit Apple產品了4
[鍵盤] qmk韌體編譯如果只是要基本功能的話,用網路上現成的工具就可以了,就從簡易的開始吧 先從這裡弄出Layout,複製Raw Data 貼到這裡4
Re: [鍵盤] Neo Element G67 開箱&組裝自己回一下自己的文。 組裝完成後碰到了一個讓人頭很痛的問題,不過這幾天忙著上班,到今天才有空把 它寫下來。 那就是這把鍵盤的軟體支援真的不太行。 當初官方購買頁面表示這把鍵盤支援QMK和VIA編輯鍵位。組裝完後上網找韌體,發現3
[鍵盤] CRBN Featherlight 直列式 40% 鍵盤PTT 網頁版 網誌版 CRBN Featherlight 是直列式的 40% 鍵盤。 本體由 PCB 以及碳纖維材質的定位板和底部組成,要自己焊接二極體和微處理器。 當初是從 Keygem 網站團購,目前 PCB 和定位板的設計都已經公開在 GitHub。2
[鍵盤] Filco Majestouch Xacro M10SP 開箱這次趁日本旅遊期間在秋葉原的 Bic Camera 晃了一圈,原本瞄準 HHKB 和 Realforce 結果卻意外被這把大F分離式鍵盤吸引。入手價格約4.2K。 開箱 外盒