ラスパイテンキー"Keybow"のソースコードを読んでみる
Keybowって?
ラズパイ搭載のUSBプログラマブルテンキーです。
今日急にラズパイでUSBキーボードを作りたくなって、その参考資料としてそいつのファームウェアのソースを読んでみました。
ちょい解説
ラズパイの一部の機種は、libcompositeと言うドライバを使うとUSB機器として振る舞えるようになります。
libcompositeにどんなUSB機器を模擬させるかの設定は、設定用のファイルシステムconfigfs経由で行います。
実際のデータ通信はデバイスファイルのread/writeで行います。
keybow/gadget-hid.c
libcompositeにUSBキーボード、マウス、LED?を登録する。(initUSB())
libusbgxと言うライブラリを使用している。
(aptにはなし。今回はGitHubから取ってきたけど、よく見たらkeybow-firmwareリポジトリにlibusbgxディレクトリがあった。)
keybow/keybow.c
initUSB()を呼ぶ。
デバイスファイル/dev/hidg0を開く。
どうもKeybowをMIDIコントローラーにするlua命令があるっぽい。
リリース当初こんな機能あったっけ?
今度ポケットミクと組み合わせて遊んでみたい。
keybow/lua-config
開いた/dev/hidg0にキーコードとかのリポートを書く。(sendHIDReport())
パラメータは引数じゃなくてグローバル変数。
マウスのボタンを押すとかにも対応してそう。(sendMouseReport())
sendHIDReport()
通常のキー
レポートは16バイト
- 0バイト目:リポートID(1:通常のキー)
- 1バイト目:Shift,Alt,Ctrlとかが押されているか
- 2バイト目:パディング(0固定)
- 3バイト目~15バイト目:スキャンコード
マルチメディアキー
レポートは2バイト
- 0バイト目:リポートID(2:マルチメディアキー)
- 1バイト目:メディアキーが押されているか
1バイト目のビット位置とキーの対応
sdcard/keybow.luaに定義されている。