ラズパイ内蔵テンキー「Keybow」のファームウェアをRaspbian化する
この度、Raspberry Pi Zero W搭載のテンキーボード「Keybow」を購入しました。
LUAスクリプトで複雑なキーマクロが組めるのが特徴の製品ですが、コントローラがラズパイなのでもう何でもできるじゃんと思ってポチー!
製品の特長はあっきぃさんのブログが詳しいです。
しかしながらこれ。
ファームウェアに通常のRaspbianじゃなくて専用の軽量OS「Keybow OS」が採用されているのですが、まぁ出来ることが少ないと。
例えば無線LAN経由でRqspberry Pi Zero Wにsshでログインしてキーコンフィグファイルを直接編集したいなーと思っても、ざっとwpa_supplicant,openssh_server,vim,nanoなんかが足りないと。apt-getもgccも無いから割と詰んでるなぁと。
よく考えたらこれ別にOSを軽量化する必要あんまりなくね?と思ったので、KeybowのOSをRaspbianに差し替えることにしました。
方針
keybowコマンド
Keybowのキー入力やLEDの点灯は、/boot/keybowと言うC言語で書かれたコマンドで行っています。
Keybow OSからkeybowコマンドと動作に必要なLUAスクリプト群を移植すればよさそうです。
USBガジェットドライバ
Keybow OSはRaspberry Pi Zero WのUSB OTG機能を使って自身をHIDデバイス(キーボード)に見せかけています。
これにはlibcomposite.koと言うドライバが使われているので、これをRaspbian起動時にロードするようにします。
余談
ラズパイでUSB OTGシリアルコンソールを使うときはg_serialと言うドライバを使うので、てっきり類似品のg_hidを使ってると思って新年からハマりました。g_の付くドライバは設計が古く、最近はlibcompositeを使うのがナウいみたいです。
やってみる
Raspbian Stretch Liteをインストールする。
現時点で最新の2018/11/13版のRaspbian Stretch Liteを普通にインストールします。
GitHubからKeybow OSのファームウェアをダウンロードする。
$ cd /tmp/ $ wget https://github.com/pimoroni/keybow-firmware/archive/v0.0.2.tar.gz $ tar xvf v0.0.2.tar.gz
ファームウェアからkeybowコマンド関係のファイルをコピーする。
$ cd keybow-firmware-0.0.2/sdcard $ chmod 755 keybow $ sudo cp -p keybow /usr/local/bin/ $ sudo cp -rp keys.lua keybow.lua default.png layouts/ patterns/ snippets/ /boot/
keybowを起動するsystemdのユニットファイルを作る。
/etc/systemd/system/keybow.service
[Unit] Description=Keybow Daemon [Service] ExecStart=/usr/local/bin/keybow Restart=on-failure RestartSec=5 [Install] WantedBy=default.target
起動時にユニットファイルが実行されるようにします。
$ sudo systemctl enable keybow
/boot/cmdline.txtと/boot/config.txtを編集する
Raspbianの起動時にUSB OTG用ドライバdwc2と件のlibcomposite.koをロードするように記述します。
/boot/config.txt(dtoverlay=dwc2を追加)
/boot/cmdline.txt(行の末尾にmodules-load=dwc2,libcompositeを追加)
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=ffb833f2-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2,libcomposite
ここでRaspbianを再起動して、KeybowのLEDが七色に輝きだしたら成功です。