FLATSTONE's Blog

ギター好き中年のモノローグ

tmk_keyboardを使う

tmk_keyboard を使ったコンバータ作成の続きです。

コンバータの構造は、キーボードそのものを初期化した後、

キー入力(スキャンコード) → コンバータ内のテーブル参照 → USB HID UsageID送信

を繰り返し行います。原理的にはキーボードのスキャンコードが分かれば、コンバータ内のテーブル (keymaps[]配列)にマップ可能なので、巷に出回っているキーボードの殆どがUSB HIDキーボード化可能となります。 5576-001, 5576-002もスキャンコードセットが0x82と分かっているので、該当するコードセットをテーブルに設定すれば、 USBキーボード化できるはず・・・と思ったものの、肝心のコードセット82hの資料が見当たらず。 自力でキーコードを調査した、という事を前回書きました。

この調査で判明したのは、コードセット82hというのは、

  • 基本的にはUSキーボードのコードセット2である
  • 0x80以上のキーコードはF7キーを除き、E0, E1のプリフィックス付きである
  • キーコードに対応するUSB HID UsageIDが一部のキーについては無い

ということ。更に厄介なのが、矢印キーの上にあるキー6つが、5576-001と5576-002とでは異なる事です。スキャンコードが 違うため、同じプログラムで両方のキーボードをサポートするのは難しそうです。

別々に作成するか?と考えたのですが、キーボードは固有のキーボードIDを持っているので、これをトリガーとして、 初期化時にテーブルを変更するようにしました。テーブルは、

  • キーボードID"92ab" → 5576-001用のテーブルを使用
  • キーボードID"90ab" → 5576-002用のテーブルを使用

で、tmk_keyboardのレイヤー機能を使用して切り替える事にしました。

USB側の実装は、tmk_keyboardのコードをそのまま使用し、テーブルの変換コードを確認しては直し、を繰り返して、 ようやっとキーキャップ通りの入力が出来るところまで出来ました。機能的に問題が無いようだったら、 hasuさんにプルリクを出そうかと思います。