Nova Air 純正マグネティックケースの物理キーをすべてのアプリで使えるようにする

Nova Airのマグネティックケースについて

Nova Airは純正ケースに物理キーがついているのが魅力の一つです。ケースと本体の接触部分に端子があり、ケースのボタンを押すと Androidから物理キーが押されたと認識されるようになっています。

つまり、ケースが外部キーボード的な役割を果たします。この物理キーは標準ではVolUp/VolDownに対応しています。

このおかげで、ボリュームキーによるページ送りに対応しているKindleアプリなどの電子書籍ビューアであれば、物理キーによるページ送りを利用することができます。


物理キーの制約

一方でボリュームキーによるページ送りに対応していないアプリもあります。この場合はAndroid標準のアクセシビリティ機能をつかったキーリマッピングアプリを使って、キー入力イベントを画面タップに割り当てればば、物理キーをページ送りに使えます。

しかしながら、NovaAirではボリュームキーに関してリマッピングが動作しません。アクセシビリティ機能のレベルで認識できないようで、どのアプリを使っても結果は同様です。ケースを買った後で気づきましたが、海外でも困っている人が大勢いるようです。

というわけで、これを動くようにしていきます。
注:ここで紹介する方法を使うと、物理キーはボリュームキーではなくなるので、キーリマッピングアプリを経由しないと物理キーは使えなくなります。

root の取得

まず、BOOX Nova Air で root を取得するの手順に従ってrootを取得します。パッチ済みboot.imgをNANDに書き込んでいないtemprootの状態でも構いません。

ここで使ったadbコマンドは以後の手順でも使います。

キーマップファイルの取得

  • adb pull /system/usr/keylayout/gpio-keys.kl
をコマンドプロンプトで実行しgpio-keys.klを本体から取得します。

キーマップファイルの編集

中身を編集します。もとの中身は以下のようになっていると思います。
key 115   VOLUME_UP
key 114   VOLUME_DOWN
key 102   HOME
key 528   FOCUS
key 766   CAMERA
これを以下のように変更します。
key 115   PAGE_UP
key 114   PAGE_DOWN
key 102   HOME
key 528   FOCUS
key 766   CAMERA
今回はVOLUME_UP/VOLUME_DOWNをPAGE_UP/PAGE_DOWNに置き換えていますが、何か不都合があれば他のキーにしても問題ありません。

キーマップファイルの書き戻し

編集した gpio-keys.kl をエクスプローラから「内部共有ストレージ」のルート直下にコピーします。そのあと以下のコマンドを実行します。
  • adb shell (本体のシェルを起動)
  • su
  • cp /storage/emulated/0/gpio-keys.kl /system/usr/keylayout/gpio-keys.kl
エラー無く書き込めたら本体を再起動します。
これでマグネティックケースの物理キーが、PAGE_UP/PAGE_DOWNに置き換わり、Androidのアクセシビリティ機能から認識されるようになりました。

キーリマッピングアプリの導入

Androidのアクセシビリティ機能が物理キーに対して使えるようになったので、本来の目論見通り、キーリマッピングのアプリを導入していきます。

キー入力イベントを画面タップエミュレーションに割り当てられるアプリは次の二つでした。他にもあるかもしれません。
  • Key Mapper
    • 無料で機能も多いですが、UIがやや玄人向けです。
  • Buttons remapper
    • UIが比較的親切ですが、タップエミュレーション機能を使うには 150円払う必要があります。
それぞれのアプリでは初回設定時にAndroidのアクセシビリティ機能へのアクセスを許可するように求められます。それ以外は設定に特に難しいところはないと思います。

元の状態に戻すには

元のファイルに書き戻してもいいですが、ファイルのタイムスタンプも含めて完全に元の未改造の状態に戻したい場合は、root取得のページにも書いたように、アップデータをあてなおすのが良いでしょう。

最後に

Nova Airマグネティックケースの物理キーを、全てのアプリで活用するための設定方法を紹介しました。定価が約6000円となかなか高価ですが、物理キーはやはり快適ですので、Nova AirをNova Leafを使うならぜひとも導入しておきたいアイテムです。

※公式で本体とケースをセットで買うと値引きがありますが、本体はPayPayモールや楽天で買った方がお得なので、ケースは後から買い足しても良いと思います。

おまけ

今回の調査にあたって、物理キーがどのようにAndroidに認識されているのかも調べたのでそのメモです。
  • extract-dtbとdtcを使ってハードウェア定義調べる。
    • extract-dtb boot.img
    • dtc -I dtb -o dts -o novaair.dts dtb/01_dtbdump_Qualcomm_Technologies,_Inc._SDM_636_PM660_+_PM660L_MTP_NovaAir_V01
    • gpio_keys {
      	status = "okay";
      	compatible = "gpio-keys";
      	input-name = "gpio-keys";
      	pinctrl-names = "tlmm_gpio_key_active\0tlmm_gpio_key_suspend";
      	pinctrl-0 = <0x257>;
      	pinctrl-1 = <0x258>;
      
      	vol_up {
      		label = "volume_up";
      		gpios = <0xa1 0x1c 0x01>;
      		linux,input-type = <0x01>;
      		linux,code = <0x73>;
      		gpio-key,wakeup;
      		debounce-interval = <0x0f>;
      	};
      
      	vol_down {
      		label = "volume_down";
      		gpios = <0xa1 0x1d 0x01>;
      		linux,input-type = <0x01>;
      		linux,code = <0x72>;
      		gpio-key,wakeup;
      		debounce-interval = <0x0f>;
      	};
      };
    • ハードウェア的には普通のAndroidのボリュームキーっぽい
  • dumpsys inputでEventHubの状況を調べる
    •     6: gpio-keys
            Classes: 0x00000001
            Path: /dev/input/event6
            Enabled: true
            Descriptor: 485d69228e24f5e46da1598745890b214130dbc4
            Location: gpio-keys/input0
            ControllerNumber: 0
            UniqueId:
            Identifier: bus=0x0019, vendor=0x0001, product=0x0001, version=0x0100
            KeyLayoutFile: /system/usr/keylayout/gpio-keys.kl
            KeyCharacterMapFile: /system/usr/keychars/Generic.kcm
            ConfigurationFile:
            HaveKeyboardLayoutOverlay: false
            VideoDevice: <none>
      
    • 普通にgpioボタンとして登録されているっぽい
      • キーレイアウトファイルは /system/usr/keylayout/gpio-keys.kl
  • rootでgetevent -lを実行して物理キーを押してみる
    • /dev/input/event6: EV_KEY       KEY_VOLUMEDOWN       DOWN
      /dev/input/event6: EV_SYN       SYN_REPORT           00000000
      /dev/input/event6: EV_KEY       KEY_VOLUMEDOWN       UP
      /dev/input/event6: EV_SYN       SYN_REPORT           00000000
      /dev/input/event6: EV_KEY       KEY_VOLUMEUP         DOWN
      /dev/input/event6: EV_SYN       SYN_REPORT           00000000
      /dev/input/event6: EV_KEY       KEY_VOLUMEUP         UP
      /dev/input/event6: EV_SYN       SYN_REPORT           00000000
    • 問題なし
      • 上位のどこかで握りつぶされているだけ?他のキーにマッピングしてみる?
        • →成功

コメント

このブログの人気の投稿

国産キャリア版Xperia 1 (802SO) のbootloaderをunlockしてrootを取得する

Synology ds918+ に 2.5Gbps / 5Gbps の USB LAN を接続する

Xperia 1 (802SO) のrootを何も失わずに取得する