2010年7月14日水曜日

取り急ぎ

いじってたら知らぬ間に測位してた(*´д`)ハァハァ

位置情報も取れてるっぽ。




googleマップ

をぉwまさに現在地(笑)


とりあえずやらなきゃならないこと。
・GPS設定のUIをなんとかする
→自家ビルドSetting.apkに置き換え?
→wifiの挙動が怪しい。
・GPS初期化処理(Android側)をきちんと入れる
→/dev/ttyUSB0 の初期化
→GPS ONの正しい処理手順を調べる
→USBのホットプラグが検出できないか?
・GPSレシーバーの初期化処理
→シリアルポートへ発行するコマンドを調べる。
→レシーバーチップごとに違うので、どこでデバイス差を吸収するか?
→レシーバーチップ独自の機能(測位アルゴリズム)などは使えないか?

山盛りじゃまいか(笑)

走るgps_freerunner

で、一体、今どこ?

そもそも、素のM001にはGPSのつぶやき(NMEAメッセージ)を処理する仕組みが入ってない。
↓
でも、シリアルドライバは入ってるので、一部のUSB-GPSは認識できる。
↓
デバイスをつないで、NMEAメッセージを取り出すことは簡単。
↓
じゃ、Android定義のI/Fをちゃんと用意して、GPS周りの処理を実装すればおk!?
↓
gps_freerunnerと言う実装を掘り出す。なんかいけるかも。
↓
libhardware_legacy.so 野良ビルド
↓
動かねぇwwデバッグ
↓
ちょっと動いたwwさらにほげる&修正
↓
衛星拾ったww(←今ココ)


と言うわけで、こんな感じで衛星拾ってたりする。
少年の心をくすぐるマンガレーダー風味が(・∀・)イイ!!

画面の通り、9つの衛星をキャッチ。
しかし、何時までたっても測位してくれない
(´・ω・`)ありー?
おかげで位置情報が取れない。
なぜだ、、、

でもまぁ、ここまでこぎつければ何とかなりそう。

gps_freerunnerの処理を読んでみて、I/F周り~スレッド処理には特に問題ない、、、と思う。
GPSデバイスが投げてくるメッセージは、gps_freerunnerのスレッドが受け取ってせっせと解析処理する。
NMEAパーサーの動きは、
D/gps_fr  (  131): Received: '$GPGGA,******.***,,,,,0,00,,,M,0.0,M,,0000*59
D/gps_fr  (  131): '
D/gps_fr  (  131): Found 15 tokens
D/gps_fr  (  131):  0: 'GPGGA'
D/gps_fr  (  131):  1: '******.***'
D/gps_fr  (  131):  2: ''
D/gps_fr  (  131):  3: ''
D/gps_fr  (  131):  4: ''
D/gps_fr  (  131):  5: ''
D/gps_fr  (  131):  6: '0'
D/gps_fr  (  131):  7: '00'
D/gps_fr  (  131):  8: ''
D/gps_fr  (  131):  9: ''
D/gps_fr  (  131): 10: 'M'
D/gps_fr  (  131): 11: '0.0'
D/gps_fr  (  131): 12: 'M'
D/gps_fr  (  131): 13: ''
D/gps_fr  (  131): 14: '0000'
こんな感じで、NMEAメッセージを受け取るたびに解析処理されてる。

とりあえず、位置情報の取得ができるように、もう少しじっくり読む。
AndroidのGPSの扱いが不明な点もあるのでそっちも調べないとなぁ。
(`・ω・´)

2010年7月12日月曜日

Goin な My Location

なんか、古いアイドルの曲名みたいなタイトル。
 まぁいいや。さて、、、、
ひとまず、気になるところから攻めてみた。

メニューのセキュリティ&位置情報でGPSに関する現在地設定を出す方法を探してたんだけど、結局よくわからない。
bluetooth_uiのようなパターンでは無いような気がする。
と言うのも、BTに関してはデフォルトで使えないはずなのに init.rc内で初期化処理をちゃんと行ってた。
使えもしないのにこの手続きは不自然だ。
恐らく、そのうちBT付きのバージョンを出す(他機種として)ために、事前に入れ込んだ可能性が高い。
だって、M003もM002も、ベースファームウェアは同じなんだもの(・∀・)

一方、GPSはどうか。
これは最初から初期化する処理など入ってない。
BTとは全く対照的。てことは、GPSについては対応する気はあまり無い、、、と言うのが透けて見える。

となると、この先対応するかも知れないBTはこっそり入れて、対応予定も無いGPSは入れる必要もない。。。
と、考えるのは至極当然。

そんなわけで、個人的な結論として、
現在地設定は機能が殺されている、と考えることにした。
要するに探すのがメンドクセー!になった(笑)

と言うのも、あるアイディアがひらめいたから。

んじゃさ、自家ビルドしたAndroidのSettings.apkと入れ替えちゃったらどうよ?

・・・・(・∀・)相変わらずイイカゲンかつ強引。

でも、実験(笑)

サクッと結果、、、、、
思ったとおりw

ちゃーんと現在地設定が出る。
設定も一応できる。
ただし、エラーぶっこいてる模様。
GPSをEnableにした時のlogcat

D/GpsLocationProvider(  130): enable
W/GpsLocationProvider(  130): Failed to enable location provider
あはははは( ゜∀゜)

で、
Settingsを全部入れ替えたことになるので、色々と設定項目が増えたりUIが微妙に変化した。
VPNとモバイルネットワーク。通話設定なんてのも。


しかし、問題点がひとつ。

タッチパネルキャリブレーションが無くなった(爆)

やっぱプロダクト専用の設定項目だから、素のAndroidにあるわけ無い。
こんなところまで、ベンダーが手を入れてるとなると困ったな。
、、、(゜-゜)キャリブレーションのソースが欲しい。

ていうか、キャリブレーションだけ別アプリでできんのか?
できるならデフォのSettingsは捨てるのに(・ω・)

2010年7月11日日曜日

ほげりほげる

昨日に続き、調べるほげる。

wifiが居なくなる原因は分かった。
libhardware_legacy.so はgps以外にwifiとかpowerとか、他のデバイス制御も含まれている。
で、wifiの中身をデフォルトのままビルドしてたので、M001くんと性格の不一致が起こり、wifiが実家へ帰ってた模様。
具体的に言うと、呼び出すwifiドライバとかの指定が違ってた。wifi/wifi.c の中身を見たらすぐに分かった。
で、makeファイル直して無事つながるようになった。

と言うことは、それ以外のデバイスについてもM001くんに合わせないといけないってことになる。。。。
・・・そんなん(´・ω・`)知らんがな
ま、ひとまず、問題が起こればその時対応ってことで。


で、肝心のGPS。

ソースをほげりながら、logcatを見ながら、動作を観察してた。
どうやら、GPSのNMEAメッセージを処理するメインのスレッドが動いて無いような気がした。ていうか、動いてないっぽい。
で、アプリ側はLocationProviderで情報取ろうとしてるけど、処理スレッドが動いて無いんだから情報が取れるはずもない。

(´・ω・`)・・・たぶん、initのタイミングでエラってるにちまいない。

しかし、なかなかイイ感触。
処理さえ通れば問題なく動くことが予想できるので比較的楽観してたりする。
何よりソースを直接いじれてなんとかできる環境があるのがイイ。
とりあえず、夢の中でデバッグの方法を考えることにする。

2010年7月10日土曜日

GPSを動かす仕組み

色々調べて分かったこと。
シェアードライブラリ libhardware_legacy がGPSデバイスとのI/Fの入り口になる。
このライブラリの中で、GPSデバイスに対する制御のためのI/Fが取得される。
GPSを操作するときは、得られたI/F -> GPSライブラリ へと呼び出される形になる。
デバイスへのR/Wとかパースとか、実処理はGPSライブラリによって行われる。

で、現状はI/Fの接続先が、GPSデバイスエミュレータ用のダミーになっている。
つまり、GPSライブラリ自体が存在せず、ダミーにつながれていて、ダミーなので当然、I/Fから得られる情報は全部 false。
つまり、デバイスを見に行こうにも見に行くことなど到底ムリ。な、わけ。

これは、libhardware_legacy をmakeするときに、GPSについてはダミー関数をリンクしちゃってるってことで、逆に考えれば、GPSライブラリを使ったちゃんとした(?)libhardware_legacyをmakeしてやればいいんじゃないの?
んで、現状のと入れ替えちゃえば動くかな?
って、感じの方針で行ってみる。

いつものとおり、かなりイイカゲン。

んで、ぐるぐるしてたら、eclair用とおぼしきgpsライブラリの実装を見つけた。
ttp://gitorious.org/android-on-freerunner/freerunner_platform_hardware_hw/trees/eclair/gps

たぶん、これでいけるんじゃないか?と思って、さらにぐるぐるしてたら、実際に独自の実装で同じことをされてる方がおられた。
ttp://labs.beatcraft.com/ja/index.php?bc9%2FSoftware%2FAndroid%2Fgps

をぉ!これでいけるかも!?
早速、実験♪
と言うところが、3日ほど前のオイラ。

・・・環境作るのに時間かかった・・・(´・ω・`)

ケド、、、、
実験用のlibhardware_legacyをビルドしてGPSの初期処理なんかを適当にやってみると、、
以前は「GPSが見つからんがな」とか言って起動しなかった GPS Searcher が起動したよ(゜д゜)
位置情報は拾ってないけどw


で、現状での問題点がいくつかある。
  • GPS設定のUIが出せていない。
    GPSの強制ONはできてるからとりあえず後回し。
  • なぜかwifiがつながらなくなる。
    ONにすらできない。libの作り方を間違ってるか、制御用のソースが別に必要なのか、わからん。
  • 位置情報を教えてくれない。
    処理が抜けてる気がするww
うむむ、、、
どれもこれも致命的じゃまいか(笑)

まぁ一歩前進、と言うことだけど
公開できるレベルじゃないなぁ~(´・ω・`)
まだ先は長い。

2010年7月9日金曜日

特になし

雑記w

現在、ほげり中。。。( ゜Д゜)。。。。
わからんことだらけでワクワクする。

で、
Bloggerって初めて使うんだけど、なんかシステムが変なのか、デザイン変えたり記事を修正すると化けたりコメントが行方不明になったり。謎過ぎる。。。。
まぁ、そもそもネタ書きのためにその場しのぎで作ったからどうでもいいんだけどねー。
いつ消えてもおかしくない。それが、今日の他。
むしろ、ほげりすぎて文鎮化すれば円満に終了~(^_^;

ていうか、M001「他」って言う割にはその他のガジェットは出てこない(笑)
雨後の筍のようにぞろぞろタブレット機の新種は出てくるけど、評価がいまいちだったり、今更OSだったり、中華偽スペックだったりで、ほしいと思う機種が無い。
いじり倒して遊ぶなら、情報とノウハウの豊富なM001系でいいかなと。
次買うなら、もう少し中華スペックがはっきりした、それなりに安定したAndroid2.x系を手に入れようと思ふ。
それまでに色々いじって勉強すよう(`・ω・´)

2010年7月3日土曜日

usbgadget.sh

他の解析が楽しくてすっかり忘れてた。
この記事の通り、USBメモリを埋め込んで、swapも良好に動いてるんだけど、埋め込んだメモリの大半を未使用のままにしていた。
具体的に言えば、4Gのメモリを埋め込んで、swapに256M使った(/dev/block/sd1)だけで、残り(/dev/block/sda2)は絶賛死蔵中。

で、M001を付属のUSBケーブルでPCにつなぐと、リムーバブルな外部ドライブとして認識されるのを利用して、この絶賛死蔵中のメモリ領域も外部ドライブとして認識させてしまおう!、、、と言うネタ。

以下、ver 1.7 4ベース。

とりあえず、前の記事を思い出しながら。。。。

M001を外部ドライブとして認識させるのは、g_file_storage.ko と言うモジュール。
/init.rc -> /usbgadget.shと言う流れでロードされる。
この /usbgadget.sh と言うスクリプトに細工すればおk。

その前に、開放するべき領域、/dev/block/sd2 をフォーマットしたいんだけど、M001の内部コマンド mkfs.vfat は 2G以上の領域をフォーマットできないっぽい。
今更かよをぃをぃ、、、って感じだけどショウガナイ。
とりあえず、放置(笑)

で、usbgadget.sh の変更ポイントは、

insmod を実行している行で g_file_storage.ko を読み込んでいる部分のパラメータ file= に 開放したいデバイスを追記すればおk

例えば、16行目ほどにある記述。
insmod g_file_storage.ko file=/dev/block/loop0,/dev/block/mmcblk0 removable=1 stall=0
を
insmod g_file_storage.ko file=/dev/block/loop0,/dev/block/mmcblk0,/dev/block/sda2 removable=1 stall=0
こんな感じで追加する。
同じような箇所が他にも2箇所ほどあるので修正する。
echo出力のメッセージは別に直さなくてもいい。気になるなら修正。
file= 指定はデバイスであれば開放できるっぽい。

んで、
修正した、usbgadget.sh をadb で push
\>adb push usbgadget.sh /
コンソールから、suして、
# chown 0:0 usbgadget.sh
# chmod +x usbgadget.sh
リブ~~ト。うぃんうぃんうぃん(・∀・)

起動したら、付属のケーブルでPCと接続。
リムーバブルディスクとして3台認識されるはず。
1台目は内蔵フラッシュメモリ、2台目はSDカード、3台目が追加したメモリ。

で、M001ではフォーマットできなかったので、ここでフォーマット(笑)
Windowsからドライブのフォーマットをして使用可能になる。

めでたし、めでたし。

って、、、
普段、USBケーブルでPCにつなぐことなんかまず無いから!
あんまり意味無いんだけどね(・∀・)