物理的な寸法を測った前回の続きです。
system のイメージを覗いてみたところ、ID ごとに個別のレイアウト設定を読み込んでいるということも無く、公開されている各言語のキーボード画像をざっくり見た感じキー自体の数や配置は同じっぽかったので、少量多品種生産のキーボードは物理的には同一のもので、キーの印字だけ変えてると思われます。
すぐわかるところで dumpsys input
INPUT MANAGER (dumpsys input) Input Manager State: Interactive: false System UI Visibility: 0x8608 Pointer Speed: 0 Pointer Gestures Enabled: true Show Touches: false Event Hub State: BuiltInKeyboardId: -2 Devices: (中略) 7: Integrated keyboard Classes: 0x00000003 Path: /dev/input/event2 Descriptor: 970aa80a7023f77f92a0ef388bc0d390d949b426 Location: ControllerNumber: 0 UniqueId: Identifier: bus=0x0000, vendor=0x0000, product=0x0000, version=0x0000 KeyLayoutFile: /system/usr/keylayout/Generic.kl KeyCharacterMapFile: /system/usr/keychars/Generic.kcm ConfigurationFile: HaveKeyboardLayoutOverlay: true 8: ACCDET Classes: 0x00000001 Path: /dev/input/event0 Descriptor: 1c78f7e0d16d4dbc8d3ab93943523f379203f90b Location: ControllerNumber: 0 UniqueId: Identifier: bus=0x0019, vendor=0x0000, product=0x0000, version=0x0000 KeyLayoutFile: /system/usr/keylayout/ACCDET.kl KeyCharacterMapFile: /system/usr/keychars/Generic.kcm ConfigurationFile: HaveKeyboardLayoutOverlay: false 9: mtk-kpd Classes: 0x00000001 Path: /dev/input/event1 Descriptor: f0d2e427e7a05eb6d316f5e14800c5ac7b6aee79 Location: ControllerNumber: 0 UniqueId: Identifier: bus=0x0019, vendor=0x2454, product=0x6500, version=0x0010 KeyLayoutFile: /system/usr/keylayout/mtk-kpd.kl KeyCharacterMapFile: /system/usr/keychars/Generic.kcm ConfigurationFile: HaveKeyboardLayoutOverlay: false (後略)
キーボードの名前は Integrated keyboard で /dev/input/event2 ということがわかります。
ACCDET はヘッドホンの再生ボタンやボリュームボタンと、画面の開閉イベント関連です。
mtk-kpd は Esc と本体右にある銀色のボタンです。他のキーと並んでいても Esc だけ扱いが違うのは電源ボタンを兼ねているからということのようです。
続きまして adb shell getevent –i の結果を見てみましょう。
(前略) add device 7: /dev/input/event2 bus: 0000 vendor 0000 product 0000 version 0000 name: "Integrated keyboard" location: "" id: "" version: 1.0.1 events: KEY (0001): 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0028 002a 002c 002d 002e 002f 0030 0031 0032 0033 0034 0036 0038 0039 0067 0069 006a 006c 00f0 01d0 input props: <none> add device 8: /dev/input/event0 bus: 0019 vendor 0000 product 0000 version 0000 name: "ACCDET" location: "" id: "" version: 1.0.1 events: KEY (0001): 0043 0044 0057 0058 0072 0073 00a4 0246 input props: <none> add device 9: /dev/input/event1 bus: 0019 vendor 2454 product 6500 version 0010 name: "mtk-kpd" location: "" id: "" version: 1.0.1 events: KEY (0001): 0072 0074 00e7 0198 input props: <none>
キーコード一覧が取得できる便利コマンドですね。
adb shell で getevent /dev/input/event2 をして全部のキーを順番に押してみたところ、00f0 に該当するキーが見当たらない以外の52個が反応してました。
Fn キーは 01d0 (464=FUNCTION) として普通にキーとして認識していました。いわゆる小型キーボードは Fn+なんか別のキーでキーコード自体が変わるイメージだったんですが、少量多品種生産のためにソフトウエアでなんとかするってことなんでしょうね。
/dev/input/event0 は画面を閉じると 0057 (87=F11) で、 開くと 0058 (88=F12) が発生します。あとはヘッドホンの着信ボタンが 00a4 (164=HEADSETHOOK) で、0072 (114=VOLUME_DOWN) で、0073 (115=VOLUME_UP) でした。
/dev/input/event1 は Esc が 0074 (116=POWER)で、側面が 00e7 (231=CALL)でした。
調査によって、Esc が特殊なボタンで、Fn は普通のキーだということがわかりました。また、画面の開閉もキー扱いなので、adb shell input F11 で画面を消したりできます。だからなんだと言われても困りますが。
なお、画面を閉じる(input keyevent F11)と側面のボタン以外はヘッドホンの着信ボタンや Esc などのキーイベントに応答しなくなります。event0 と event1 はイベント自体は発生しているんですが、途中で握りつぶされてるみたい?なので、音楽聴きながら蓋閉めたら蓋開けないと停止できない謎使用です。キー配置と違って、ユーザーレベルではちょっと解決できなさそうなのでファームウェアの更新で対応してくれると良いんですが。
次回は冒頭に画像を貼ったけど話題にもあげなかった User-installable keymaps までたどりつきたい。
コメント
[…] キーボードが言語ごとにたくさん種類があることでおなじみの Gemini PDA ですが、前回話題にしたように、ハードウェア的に同じキーボードの印字を変えただけのようなので、弊害もあり […]
[…] って書いてますが Generic.kl の key 100 って ALT_RIGHT ですよ?そんなキーないでしょ! […]