もぐてっく

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

ラズパイ内蔵テンキー「Keybow」のファームウェアをRaspbian化する

この度、Raspberry Pi Zero W搭載のテンキーボード「Keybow」を購入しました。

f:id:moguno:20190103230356j:plain:w300

LUAスクリプトで複雑なキーマクロが組めるのが特徴の製品ですが、コントローラがラズパイなのでもう何でもできるじゃんと思ってポチー!

製品の特長はあっきぃさんのブログが詳しいです。

akkiesoft.hatenablog.jp

しかしながらこれ。
ファームウェアに通常の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が七色に輝きだしたら成功です。