passive log strage

バイク , モバイルガジェット , アウトドア用品 , 腕時計 ・・・等。

ASCII配列キーボードでキートップ刻印通りのキャラクタを入力できるようにする - その1

AndroidOSは基本的には「外人」なので、そもそもJIS配列のキーボードには対応していない。ならばASCII配列ならオールオッケー・・・じゃぁないんだな。

FV-1でASCII配列のUSBキーボードをつないだ場合、基本的にはキートップ刻印と同じものが入力できる。ところが、ごく一部のキャラクタだけ、キートップ刻印と違うものが入力される。とりあえずすぐに気がついた物は以下の2点。

  • [Shift]+[,] → 「;」 (本来は「<」)
  • [Shift]+[.] → 「:」 (本来は「>」)

この現象は以下の環境で確認できた。

  • FlexiView FV-1 + ASCII配列USBキーボード
  • IdeaPad A1 + Reudo RBK-2000BT3( ASCII配列Bluetoothキーボード )


IS11CAではもうちょっと複雑な話になるので、ここでは割愛する。

FV-1が使えないのでIdeaPad A1でAndroidのハードウェアキー入力関連を進めようと思う。AndroidOSのsystem配下に対するアプローチの方法が違うだけで、やらなければいけない事は基本的には変わらないはず。ファームウェアアーカイブ内容がそのまま展開されるので、下手すりゃFV-1より楽かも。

qwerty.kl」 と 「qwerty.kcm.bin」

Androidがどのようにキー入力イベントを拾うのか。
Android端末のハードキー設定を変更する | TechBooster

この記事を読む限り、「qwerty.kl」が物理キーの定義を、「qwerty.kcm.bin」が最終的な入力されたキャラクタの決定を行っているということだろう。「*.kl」にしろ「*.kcm.bin」にしろ、接続されたキーボードのデバイス名が入り、未定義のデバイス名だった時には「qwerty」がデフォルトとして適用されると。「*.kl」の方がローレベルなのね。

参考:qwerty.klを弄って、特定のキー入力を紐づける方法。
FlexiView FV-1 でqwerty.klを弄る - passive log storage - 2nd


キー入力が発生した時の流れをざっくりまとめるとこんな感じ。

  1. キー入力され、キーコードがOSに送られる。
  2. *.kl に定義されているキーコード一覧を見て、なんのキーに対応する(物理的な)キーが発行されたのか判断する。
  3. *.kcm.binを引っ張り、発行された物理キーの状態と同時押しされている修飾キー(Shift,Alt)の状態から、最終的になんのキャラクタのキーイベントを発生させるかを決定する。

なんだか腑に落ちないのはklがテキストファイルで、kcm.binがバイナリファイルだという点。始めは「klは起動時に読み込まれるけど、kcm.binはデバイスが接続されたときに動的に読み込まれるから」だと思っていた。でも「kl」も接続されたデバイス名を適用しているから、どちらにしても動的に動くような気がするんだが・・・。この辺は元のリファレンスを追ったらわかるかもしれないので後で読む(後回しかい)。

http://www.kandroid.org/online-pdk/guide/keymaps_keyboard_input.html

IdeaPad A1の「qwerty.kcm.bin」

A1のファームウェアアーカイブ内、system.zip内のusr/keycharディレクトリ内に定義が入っている。ファイルの一覧はこんな感じ。

  • mg-capacitive.kcm.bin
  • qwerty.kcm.bin
  • qwerty2.kcm.bin

「mg-capacitive」ってのはなんなのかは不明。そして「qwerty.kcm.bin」と一緒に「qwerty2.kcm.bin」ってのがあるな。

とりあえず「qwerty.kcm.bin」をバイナリエディタ*1で覗いてみる。

右側のキャラクタダンプの並びが、先にあげたTechBoosterさんとこの記事にある「qwerty.kcm」のソースと一致する。
今回の問題点である「.」と「,」に当たる部分(0x280〜0x290番地の行、赤枠参照)を確認すると、確かに「<」と「>」ではなく「;」と「:」になっている。ここが変わってればいいわけだな。

となると気になるのが「qwerty2.kcm.bin」。こいつもバイナリエディタで開いてみる。



(同じ位置、青枠参照)こちらは「<」「>」になっている。ということは、こちらがPCのキーボードを繋いだ時用のkcmファイルなのか。うーん、なんでこっちがqwerty.kcmじゃないんだろう?[shift]+[,]とか[.]で「;」や「:」を出力するキー配列のキーボードってあったっけ?

ま、いいや。


方策

さて、*.kcm.binは拡張子のとおりバイナリファイルであり、元のソースファイルは*.kcmになる。Androidのビルド時に変換されるようなので、ちゃんと作るにはビルド時に実行される変換ツールかなにかを通してやる必要がある。

探すのめんどい(おい)

一番簡単に実現しそうな方策は、「qwerty2.kcm.bin」を「qwerty.kcm.bin」にリネームしてやるということだ。


次回はこの方法を実行してみよう。

*1:余談だが、俺が使用したバイナリエディタFrhed Portable