もぐてっく

人は1つ歳をとるたび、1ビットづつ大きくなれると信じてた。

ラスパイテンキー"Keybow"のソースコードを読んでみる

Keybowって?

ラズパイ搭載のUSBプログラマブルテンキーです。

moguno.hatenablog.jp

今日急にラズパイでUSBキーボードを作りたくなって、その参考資料としてそいつのファームウェアのソースを読んでみました。

github.com

ちょい解説

ラズパイの一部の機種は、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を開く。

ちなみに、MIDIバイスも開いてた。

どうも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に定義されている。