この記事は、Zennにも投稿しています。
KeyballのファームウェアはQMKを使ったC言語のものになっています。ですがやはりRust、使いたいですよね?
間違ってRP2040のProMicroを買ってしまった方がなんとRustでkeyballのファームウェアを作っており、不可能ということはなさそうです。
Keyball46組み立て日記 〜間違えてRP2040を買ったそこのあなたに〜 - /var/log/hikalium
TL; DR Keyball46はいいぞ ProMicroにはAVR版とRP2040版がある ピン配置の互換性はあれど、命令セットは完全に異なるので「ファームウエアを書けとささやくのよ、私のゴーストが」という方以外はAVR版を間違えずに買いましょう まあ最悪間違えても一週間くらいでなんとかなる(当社調べ) みんな自作キーボードをやろう! はじまり みなさんは、Keyball46という素晴らしい自作キーボードキットをご存知ですか? そう、なんと、キーボードにトラックボールがついてるんです!最高ですよね! ということで、秋葉原にある自作キーボードのお店こと遊舎工房さんから速攻でポチりました。ちょう…
hikalium.hatenablog.jp
ということでハードウェアの知識が全く無いながらKeyballのファームウェアをRustで書くことにチャレンジしてみました。
この記事では一応動きそうな道筋は見つけたけど…という所までとなります
RustでのAVR向けプログラム作成
通常、Keyballに搭載するProMicroにはAVRのATMega32U4というのが載っています。
ではRustでAVR向けのエコシステムがどれだけ充実しているのかという話ですが、avr-halというクレートが存在しており、さらにATMega32U4もサポートしているようです。これはいいですね。
ではRustでAVR向けのエコシステムがどれだけ充実しているのかという話ですが、avr-halというクレートが存在しており、さらにATMega32U4もサポートしているようです。これはいいですね。
また、ProMicro用のテンプレートが用意されていて、
を実行後にProMicroのテンプレートを選択すればLチカのコードを用意してくれます。
内容はこのようになっています。
とりあえずこれを実行してみましょう。
cargo run
することで書き込みまでやってくれます。便利ですね。コンパイルが終わったらリセットしたらEnterを押してねと言われるのでその通りにすればプログラムが書き込まれて無事Lチカされるはずです。
とても簡単にできて感動です。
とても簡単にできて感動です。
また、RAVEDUDE_PORTはUSBシリアルポートの番号です。筆者はWindowsを使用しているので
この値はQMK Toolboxなどを使うと簡単に調べることができます。
COM{X}
という値になります。この値はQMK Toolboxなどを使うと簡単に調べることができます。
USB接続
さて、Lチカはできましたがキーボードとして使う以上USBで通信ができなければいけません。USBスタックを自力で書くのは流石にキツそうだなと思いクレートを探し回っていたところ
atmega-usbd
という正に望み通りのクレートがありました。GitHub - agausmann/atmega-usbd: Rust usb-device support for ATmega chips
Rust usb-device support for ATmega chips. Contribute to agausmann/atmega-usbd development by creating an account on GitHub.
github.com
Rustではusb-deviceというクレートが基盤となるトレイトを提供しており、そのトレイトを各ターゲット向けに実装することで
そして
usb-device
上のライブラリであるusbd-hidなどのクレートを使えるようになっています。そして
atmega-usbd
はusb-device
のATMega向け実装というわけです。その
atmega-usbd
のexampleを改変して、キーを押したら何か反応するプログラムをなんとか実装したものが以下になります。これはピンa2の列が押されている時に
a
という文字を送信するプログラムになります。また、panic時にLチカをするので分かりやすくなっています。まだ全くキーボードにはなっていませんが、これを拡張していけば少なくともキーボードとして使えるファームウェアを書くこと自体はそこまで難しくなさそうです。
ちなみにこの時点で容量は
と、約12kbとなっています。ここからフル機能のキーボードやらトラックボールやらを実装して28kbに収まるかは正直よくわかりません。
USBが認識されない?
ここまで来ればあとはがんがんコードを書いていくだけ…と思ったのですがこのファームウェアには大分致命的な欠点があり、接続した際に7割ぐらいの確率でエラーになってしまいます。
うまくいくと
のように、きちんとキーボードとして認識されていますが、失敗すると
のようにエラーとなってしまいます。
のように、きちんとキーボードとして認識されていますが、失敗すると
のようにエラーとなってしまいます。
公式ファームウェアだとこうはならないので恐らく何かソフトウェアの問題だとは思うのですが…
悲しいことに自分にはUSBの知識が全然なく、この問題を今のところ解決できていないのでこの記事はここまでとします。
悲しいことに自分にはUSBの知識が全然なく、この問題を今のところ解決できていないのでこの記事はここまでとします。
この記事で使用したコードは
GitHub - nazo6/keyball-rust-firmware
Contribute to nazo6/keyball-rust-firmware development by creating an account on GitHub.
github.com
に置いておきます。
最後に
なんだか中途半端な所で終わってしまって申し訳ないのですがこの問題さえ解決できればあとは懸念点は容量ぐらいなので、RustでKeyballのファームを書くのも現実的になるのではないかと思います。
もしどなたか解決策など分かったら是非教えて頂きたいです。
(もしかしたらRP2040版のほうが容量も多いし今ならembassy-rpとかもあるし作り易かったりして…?)