LinuxをJIS版Magic Keyboardに対応させた

こんばんは。morimolymolyです。
今回はJIS版Magic KeyboardをLinuxで使用できるようにパッチを当てました。結構前に。*1
また、それに対応した独立したドライバをリリースしました。

ぺちぺちしたチープなうち心地、シュッとしたデザイン、かな・英数の独立キー、⌘キー、いいですよねえMagic Keyboard。
1万円で購入しワクワクしてLinuxマシンとペアリングさせたところ、かな、英数、ろ、|の4つのキーが使用不可能でした。(パイプで繋げなかったら何すればいいんだ?ソリティアか?)
溝に捨てた気分になるのは嫌なので、早速調査を開始しました。

デバッグのためにフルボッコにしたカーネルです。HID関連を調査しました。
github.com

printkデバッグで大体の原因がわかったところで、先人が既に同じようなことをしているのを発見いたしました。
qiita.com

パッチを当てたのはdrivers/hid/hid-apple.cのたった数行。
HIDデバイスから返されるReport Descriptorを修正するパッチ。
Report Descriptorについては以下を参照。
https://wiki.onakasuita.org/pukiwiki/?%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%BF


Magic KeyboardのJIS版はなぜかLogical MaximumとUsage Maximumが本来なら0xE7のところ、0x65になっていた。

HIDデバイスはdrivers/hid/hid-core.cのhid_add_field関数でレポートの登録が行われるが、その前段階のパース部分か、キーボード自体が不正な値を返すようだ。(現段階の調査だとキーボード自体がおかしい可能性がある)

パッチの作成方法としてはまず、hidrdで実際の値を確認する。
github.com

その後、sys/kernel/debug/hid/dev/rdescを確認し、ディスクリプタの値をゲット、不正なINDEXの調査をする。

不正なINDEXの部分を正常な値に書き換えるようにreport_fixupで設定を行い、パッチは完成する。

現在、パッチをメーリングリストに投げてレビュー待ちのところだ。
patchwork.kernel.org

また、独立したドライバをカーネルに取り込まれる前にリリースした。
テストするだけならmake installするだけ、マジにインストールするならREADME.mdから自力で頑張ってください。
github.com

手元のマシンでは正常に動作しており、目的は達成された。
やったね!

それでは。

*1:面倒くさくてブログを書くのが遅れた。面倒くさくて。