色々掘じくったメモ

今日も armadillo500fx に BU-353 というデバイスを差して Android が認識できるのかどうか、について不毛な努力をしております。

その一

ボーレート変更して Android 起動してみた。

  • 4800 にして Android 起動
    • 挙動変わらず
    • たまに crash dump が出力されている件
      • 契機は不明
  • 4800 にして /dev/gps な symlink も作成して起動
    • NG

で、system.prop 云々と合わせワザなのかな、と言いつつ armadillo500fx な Android イメージ作成するスクリプトの中身を覗いてみた。
vendor/sola/a500fx/image/armadillo500fx-image.sh

#!/bin/bash
mkdir -p $ANDROID/vender/sola/a500fx/image/android
cp -Rdpf $ANDROID/out/target/product/a500fx/root/* $ANDROID/vendor/sola/a500fx/image/android/
cp -Rdpf $ANDROID/out/target/product/a500fx/system/* $ANDROID/vendor/sola/a500fx/image/android/system/
chmod 777 -R $ANDROID?vendor/sola/a500fx/image/android/system/usr/keychars
chmod 777 -R $ANDROID?vendor/sola/a500fx/image/android/system/usr/keylayout
cd $ANDROID/vendor/sola/a500fx/image
tar zcvf android.tar.gz android
rm -rf android
cd -

で、$ANDROID/out/target/product/a500fx/root の中に default.prop なるテキストを発見するも、結果は微妙。system 配下を見てみたら build.prop というファイルがあり、これはどうやら vendor/sola/a500fx/system.prop から情報出力されているように見受けられる。
ので、手動で実機側の root を弄くってみたんですが、結果が微妙だったため、system.prop に

ro.kernel.android.gps=ttyUSB0

というエントリを挿入してリコンパイル中です。

整理

  • linux 上では GPS デバイスを認識してデータも取り出せている
    • stty -F /dev/ttyUSB0 4800 する必要あり
    • stty コマンドの実行で crash dump 出力され、最悪ストールするケイスもあり
  • Android 起動後の LocationManager と usbserial の連携が不明
    • /dev/gps 作って 4800 に再設定したが NG
    • default.prop 修正して 4800 に再設定したが NG

仕方が無いので

hoge ってみました。
まず frameworks/base/services/java/com/android/server/LocationManagerService.java の _getLastKnownLocationLocked() メソドから確認開始。ここで例外を吐いています。

  • mProvidersByName.get(provider) が null を戻している事に起因
  • mProvidersByName は HashMap で定義
  • put してるのは一箇所のみ (addProvider 手続き)

という事で LocationManagerService#addProvider() の呼び出し箇所の特定に走る。ちなみにこのメソドは private な模様。

  • private void _loadProvidersLocked() メソド
    • private void loadProvidersLocked() メソドから呼び出されている
    • private void loadProviders() メソドから呼び出されている
    • private void initialize() メソドから呼び出されている
    • public void run() から呼び出されている
      • run は Thread が start したら走る手続き
      • run の中で Looper.loop() が呼ばれている件
      • LocationManagerService は ILocationManager.Stub を継承しつつ、Runnable を実装している模様
  • public void installLocationProvider() メソド
  • public void addTestProvider() メソド
  • public void removeTestProvider() メソド

ええと、*Test* はスルーの方向でナニ。LocationManagerService な thread を kick しているのは誰かを確認してみたら、frameworks/base/services/java/com/android/server/SystemServer.java の中 (run?)

  • thread になってて、準備終了後に Looper.loop() 呼んでる件
    • これって共通パターンかな
  • run の中で ServerManager.addService() 呼び出し
    • 引数は Context.LOCATION_SERVICE と LocationManagerService のオブジェクトの参照
  • サービス起動のログは確認できましたが、失敗はしていない模様
    • てーコトはサービスは正常に起動してるけど、gps なナニが HashMap に追加されてないのか

次に installLocationProvider() メソドの呼び出し元を確認してみたんですが LocationManager#installLocationProvider() から呼び出されている事は確認できたものの、これがどこから呼び出されているのかが不明な状況。

むむ

以下なナニを Google 先生からご教示頂く。

androidの仕様の構造上、カーネルのビルドの際にGPSのモジュールソースを組み込まなければなりません。

との事なんですが、これは一体どーゆー意味か。現状動作確認中のカーネルについては

  • CONFIG_USB_SERIAL=y
  • CONFIG_USB_SERIAL_GENERIC=y
  • CONFIG_USB_SERIAL_PL2303=y

とりあえずな認識としては、GPS なデバイスはカーネルから見たらテキストが自動で吐き出されていくシリアルデバイスでしかないはずなので、このデバイスと Android な LocationManagerService との i/f が分かれば良いはずなんですが、そこに辿りついてません。