ThinkPad X1 YogaにAndroid 11を入れてみる #3
公開日:
この記事の続きです。
前回でイーサネット経由でadbが叩けるようになり、ディスプレイのバックライトの制御が出来るようになりました。
今回は前回書いたようにWi-FiとBluetoothを認識するようにしてみたいと思います。
Wi-Fi
まずはWi-Fiですが、AndroidではWi-Fi機能はいくつかのモジュールで構成されているようです。
https://source.android.com/devices/tech/connect/wifi-overview?hl=ja
この図のうち、青い枠とwificondはAndroidが提供してくれているので緑の部分を用意して上げる必要があります。
X1 Yoga Gen5にインストールされているWi-FiモジュールはIntelのAX201なので、一番下のVENDOR IMPLEMENTATIONS & DRIVERはIntelが公式に提供しているLinuxカーネルドライバ「iwlwifi」が使えそうです。
あとはHIDLインターフェースを用意することになります。
Supplicant HALはwpasupplicantとAndroidがやりとり出来るようにするために必要ですが、これもコードはAndroidが用意してくれています。
コードは用意されているので、設定ファイル(wpa_supplicant.conf)を用意してあげるだけです。
Hostapd HALも同様にAndroidが用意してくれています。
Vendor HALはoptionalとなっているので必須ではないようですが、これが無いとWi-Fiダイレクトなど一部の機能が使えないようです。
最初にSupplicant HAL、Hostapd HALを組み込んで実行してみましたがそんな簡単に行くはずもなくWi-Fiに接続できませんでした。
エラーログを見ていると、Hostapd HALは起動しているようですが、Supplicant HALが起動時に落ちているようでした。
それからかなり悩んだ結果、原因は単純で/data/vendor/wifi/wpa
以下のフォルダが無くてwpasupplicantがソケットを作れないというだけでした。
なので、下記のようにinit.rcファイルにwifiユーザーとグループがアクセス出来るフォルダを作成するだけで起動するようになりました。。。
on boot
mkdir /data/vendor/wifi/wpa 0770 wifi wifi
mkdir /data/vendor/wifi/wpa/sockets 0770 wifi wifi
それでもやはり起動しません。
やっぱりVendor HALが必要なのかなと半信半疑で途中まで書いてみていたのですが、書いている途中で何故かWi-Fiに繋がるようになっていました。
ただ、この中途半端なVendor HALを消すと繋がらなくなるので一応必要なようです。
とはいえこれで一応Wi-Fiに繋がるようになり、Wi-FiのIPアドレス経由でadbコマンドが叩けるようになったのでとりあえずはこれで良しとすることにしました。
この段階でP2PとかWi-Fi Awareとか頑張ってもあんまり意味無さそうだなということで一旦Wi-Fi絡みはこの辺にしておこうと思います。
Bluetooth
Bluetoothもハードウェア的にはWi-Fiと同じIntelのAX201です。
カーネルドライバも揃っている(らしい)ので問題はカーネルドライバとAndroid繋ぐBluetooth HALです。
これも調べたところ幸いドンピシャなコードがAOSPにはありました。
https://android.googlesource.com/platform/system/bt/+/master/vendor_libs/linux/interface
これを一緒に組み込んであげたところWi-Fiとは違って簡単にBluetoothを有効に出来ました。
自分のものじゃないものも映っていたのでスクショは載せませんが、設定アプリからBluetoothの設定を開くとその辺に転がっているBLEのガジェットなどが出てくるのでちゃんと認識出来ているようです。
ただ、ログを見るとBluetooth Audio絡みのエラーが大量に出ていました。
まだAudio HALを実装していないのでエラーが出ていても特におかしくはありませんので現時点では無視していますが、定期的にBluetooth HALがこのAudio絡みのエラーで再起動してしまうのでBluetoothがちゃんと使えるようになるのはもうちょっと先になりそうです。
まとめ
思っていたよりも早くWi-FiとBluetoothが使えるようになりました。(Bluetoothはリストが出てくるだけですが、、、)
Bluetoothの部分以外でもAudio絡みのエラーログは結構出ているので次は音を出せるようにしたいなと思っています。
が、LinuxのAudio関連の処理など全く詳しくないのでちょっと苦戦しそうです。
少し調べた限りでもやはりコードを書くことは免れなさそうなのでそこそこ時間も掛かりそうです。
音が出るようになったら絶対楽しいのではやくやりたいですね。
タグ: AOSP