2010年7月30日金曜日

m001etc-B1人柱公開バージョン

■はじめに

GPSに対応したM001用カスタムファーム、m001etc-B1 を人柱公開します。
Beta 1と言う扱いなので、万人に推奨できるものではありません。
GPSレシーバーを動かしてみたい!と言う人柱精神にあふれた方々向けです。


■注意事項とお願い

次のことについて了解の上、ご利用ください。
  • 全てにおいて無保証、自己責任、ノーサポート、文鎮化しても知らん(´・ω・`) ことが前提です。
  • ここに書いてあることは正確ではありません。間違いが含まれていることがあります。
  • この内容についてメーカーやベンダーに問い合わせはしないこと。
  • 助けが得られなくても男の子は泣いたりしないこと。 
  • よい子は絶対にまねをしないこと。
以上、了解いただけない方は絶対にインストールしないでください。
なお、ファイルは予告なしに削除する事があります。

人柱な方はインストールした結果やGPSの動作報告、場合によってはデバッグログの提供などしてもらえると助かります。

このカスタムファームはGPS実験用のライブラリを組み込んだものですが、GPSがなくてもフツーに使用できます。
デバッグ用にroot化してあったり、不要なアプリは全削除してあったりと、何かと小回りのきく仕様になっています。
また、Bluetoothはデフォルトで使用可能にしてあるので試してみたい方はどうぞ。
できれば、ドングルの動作報告などしてもらえたらありがたいです。

それと、pl2303なGPSでSiRF以外のチップのレシーバーをお持ちの方は、初期化コマンドの実験台になってくだされ(笑)


■m001etc-B1仕様
  • オリジナルファームver1.7.4ベース。
  • アプリを大幅削除。
  • いくつかのアプリを追加。
  • Marketはそのまま。
  • /system/appを自ビルドパッケージに入れ替え。
  • /system/lib/libhardware_legacy.soを入れ替え(GPS対応)
  • Bluetooth設定可。
  • GPS初期化利用可。
  • wifi offでUSB電源を切らない。
  • GPSのホットプラグには未対応。
分かっている問題点
  • wifiでステルスなSSIDを見つけられない。
  • 自動消灯が上手くいかないことがある(?)
  • オリジナル未対応機能の設定は無保証。
  • タッチパネルキャリブレーションができない。

■m001etc-B1インストール

ダウンロードは右サイドバーのダウンロード項からどうぞ。
MEG*UPLOADでスマン(・ω・)

zipを解凍すると script フォルダができるので、ファームウェアアップデート同じ要領でアップデートすればOK。
zipファイルには、ConnectBot.apk と com.chartcross.gpstest.apk が同梱されているので、必要に応じてインストールしてください。


■GPSレシーバー

m001etc-B1で対応しているレシーバーは次の仕様のものです。

本体とUSBで接続し、本体からはシリアルポートとして認識されるもので、
USB-シリアル変換チップ pl2303 が使われているもの。
かつ、
GPSチップ SiRF StartIII 系チップが使われているもの。
(「SiRF pl2303」でぐぐると幾つか機種がヒットするはず)

pl2302ドライバはオリジナルカーネル組み込みのものを使用しています。
シリアルポートのデフォルト通信仕様は次の通りです。
4800bps 8N1

■GPS起動確認
  • GPSレシーバーの取り付け
    本体電源offの状態でGPSレシーバーを取り付けます。
    本体電源onの状態でGPSレシーバーを取り付けてもデバイスの初期化ができないので使用できません(ホットプラグには未対応)
  • 電源on
    本体電源をonにします。
    Androidが起動してきますのでしばらく待ちます。
  • 設定の確認
    「設定-セキュリティ&位置情報-GPS機能をONにする」がチェックされているか確認します
  • 衛星の捕捉
    GPSレシーバーを衛星が捕捉できる場所へ移動させます。
  • テスト
    googleマップや同梱のGPS Testにて動作を確認します。
    (googleマップに現在地が表示されている。GPS Testで衛星を測位している状態が表示される。)

■デバッグ

簡単なデバッグ確認を行う手順です。
  • 設定-アプリケーション-開発-USBデバッグ をチェックする。
  • ConnectBotを起動する。
  • 接続先は local ユーザー名は空でOK。
  • あるいは、adb shellを使ってもOK。
  • コンソールが開いたら、プロンプトより

    $ head /dev/ttyUSB0
    を実行。しばらくするとGPSレシーバーからのNMEAメッセージが表示される。

logcat でもデバッグメッセージが出力されます(タグ:gps_fr)
リモートマシンからadbを使ってlogcatするのがログを取り易いと思います。



■スクショなど


あと、、、、
改造向けの詳しい解説なんかは気が向いたら書く(´・ω・`)

さぁ金曜日だ。
会社帰りにGPSゲットして、
土日に改造三昧、
「うごかねー!」って悲鳴が聞こないように、
健闘をいもる( ̄ー ̄)ニヤリ

タッチパネルキャリブレーション

ファームを更新するたびにキャリブレーションするのが面倒になってきたので、ファームの初期値として最適なキャリブレーション状態で起動するようにしてみた。

で、タッチパネルのポイント位置を制御するキャリブレーションファイルがある。
本体内で言うと、

/data/wmtpref/touchcal

この中に矩形点の座標値らしき数値が7つ書かれている。
タッチパネルのキャリブレーションを行うと、このファイルの内容が書き換わるようになっている。

んで、実機でキャリブレーションを行った後、ConnectBot なり、adb shell なりでこの内容をメモっておく。
各コンソールより、
$ su
# cat /data/wmtpref/touchcal

-168 -22764 92048478 15106 14 -5038164 112813
こんな感じ。

で、ファームウェアインストール時からこの最適値を採用するには、ファームを解凍して出てくる、script\etc\touchcal ファイルの内容をメモった内容で上書きすればOK。

とても簡単。
touchcalだけコピー取っておけば、ファームアプデト時に使える。

さて、GPSファームまとめるか・・( ゜Д゜)

2010年7月28日水曜日

ROMダイエット

--注意!!--
この記事の内容は正確ではありません。
各自の責任において実行するなりなんなりしてください。
ナニか間違いがあってトンでもないことになってもわたしゃ知らん!(´・ω・`)
--注意おわり--

とりあえず、私がやってる手順をメモっておく。
基本は、よくわかってないBlogさんとこの手順を参考にして、いくつか追加で修正している。

下記の手順はオリジナルファーム ver 1.7.4 ベース。
それ以外のバージョンもだいたい同じだと思う。

用意するもの。
・WinなマシンにファームウェアROMを解凍しておく。
・PupSQLite
・7-zip

1. script\pre_data_disk\app の中の不要なapkを削除。
2. 7-zip で script\android_fs.tar を開く。
3. /system/app の中の不要なapkを削除。
4. 7-zip で script\data.tar を開く。
5. /data/app の中の不要なapkを削除。
6. 削除したapkに対応した /data/dalvik-cache を削除。
7. 同じく、対応した /data/data 以下のフォルダを削除。
8. /data/data/com.android.launcher/databases/launcher.db を取り出し、PupSQLiteで開き、favoritesテーブルから削除したapkのデータを削除。(Home画面に表示されるアプリ)
9. 8.で編集したlauncher.db を data.tar の /data/data/com.android.launcher/databases/ に戻す。
10. /system/packages.xml を取り出し、テキストエディタで開く。
11. 削除したapkの <package> ~ </package> ブロックを削除していく。ブロック範囲を絶対に間違えないように!!
12. 編集したpackages.xmlを data.tar の /system/packages.xml に上書き。

※作業は一気にやらずに、少しずつアプリを減らしていって動作確認が吉。
※下手すると、起動しない。
※バックアップを取っておこう。
※script\pre_data_disk\app と data.tarの/data/app に同じアプリが入ってたりして面倒くさい。


●やってることの概要
apkの削除はアプリ本体を削除している。
/data/dalvik-cache と /data/data 内のデータはアプリが使用してるものを削除している。
packages.xml の packageブロックはアプリケーションマネージャが使用しているもので、インスコしないアプリ分は削除する。
8.は起動したときにホームから削除すればいいような気がするので、しなくても支障が無いかも。

単純にこの手順で削除できないものもあるので注意するべし。


GPSなROMを作りながら、M001はリブートマシーンと化している今日この頃。
(´・ω・`)まだ文鎮にはなってないよ

2010年7月21日水曜日

ちゃらり~DockからUSB~

で、って言う。

私はUSB Hubを内蔵して色々組み込んで工作してるけど、ふつーの人はこんな複雑で面倒な改造を求めてるとは思わない。
Hubにぶら下げてるのは
USBメモリ(内蔵拡張ディスク&固定swap領域)
Bluetooth(内蔵予定)
あと、外出し用の外部USBコネクタ。

SlateDroidでも古くから話題になってるんだけど、実はDockコネクタにホストUSBが出ている。
DockコネクタとUSBメスコネクタと工作する根気さえあれば内部改造なしでUSBが引き出せる。
どうせHub内蔵するし、コネクタを入手するのが面倒だったのでそのまんま放置してたんだけど、ここへ来て作ってみることにした。


DockコネクタはiPod用のUSB充電ケーブルだと思われるものからむしりとった。

で、配線はこんな感じ。


ピンアサインは
Dock 9pin -- USB +5V (RED)
Dock12pin -- USB D- (WHITE)
Dock13pin -- USB D+ (GREEN)
Dock30pin -- USB GND (BLACK)
Dockコネクタのピン番号は写真の通り、
Dockコネクタを刺して、左から 1~30 となっているので間違えないように。
【2010.8.1追記】D+とD-の表記が逆だった(^^ゞ修正済み

Dockピンとコードの半田はとても細かいので特にショートしないように注意。
私の入手したコネクタはピンを引き抜く事ができるタイプだったので、いったん、全ピン抜いてばらした。
んで、必要なピンだけ半田->アサインどおり入れなおすようにすれば半田付けも楽だしショートも防げる。

ショートしちゃうと最悪本体を壊すので各自の責任において実行してね(はぁと
壊しても知らん(´・ω・`)

これで、内部無改造でホストUSBが引き出せる。
GPSもちゃんと認識される。
イけるね(・ω・)

要は、
GPSを取り付けるのにUSBが必須になってくる。
内部改造が必須だと敷居が高すぎてやりにくい。
で、内部改造なしの方法を確かめてみたかったと言うわけ。

あ、そうなると、今の外出しのUSBコネクタが不要になるなぁ。
デバッグ用にシリアルコンソールでも引き出そうかな。

小麦色の肌!暑い夏!

タイトルは特に意味はなす。
小麦色の肌はうぇるかむだけど、小麦入りの肌はなんだかなぁ。

さておき。

GPSはおおむねまとまってきた。
結局、GPSチップごとに必要な情報を外部コンフィグファイルで指定することにした。
残ってるのはホットプラグ部分。
これ、どうしようか。
抜き差しをうまく検出できる方法があれば良いんだけど。
ポート監視サービスでも裏で動かすくらいしか思いつかない(´・ω・`)
まぁ後で試そう。

で、テストしながら思ったんだけど、
RMapsとGPSはとても良い感じの組み合わせだと思う。
必要なマップだけを取り込んで使えるからエコだし(^^;
GPSの追従はちょっと遅いけど、位置の確認には問題ないし。

んで、良い天気だったから、M001を車載してドライブがてらRMpasでぐるぐるしてたとき。
ふとみると、マップが固まってる。
宅内デバグの時はフリーズなんかしたことないのに、、、
あれー?と思って、再起動。
10分ほど走ってると、、、また固まった。

で、本体を持ってみると、、、
(;´Д`)・・・アチイ、、、

はい!熱暴走かましてくれてました!
確かに、車内は涼しいとはいえなかったけど、シートに置いとくだけで熱暴走とは、、、、、
使えねぇ、M001(メ--)

と言うわけで、
暑い夏を迎えて、放熱対策も必要になってしまったとさ。
(´・ω・`)ばかちーん

2010年7月15日木曜日

他のGPS

今まさにほげり中。

で、おおむね動作の概要をつかんだ。が、しかし。
色々とハードウェア依存の処理が入ってきて困った。

gps_freerunner.c はu-blox社のGPSチップを前提に組まれているっぽい。
初期化処理がそうなっている。

GPSレシーバーは基本的に電源が入れば衛星を補足してシリアルポートへNMEAメッセージを送り続ける仕組みになっている。
これはほぼ、どんなGPSレシーバーも共通。(メッセージプロトコルが特殊な場合もある)

で、レシーバーの動作をコントロールする場合、ホスト側からシリアルポート経由でコマンドを送ってやる仕組みになっているものがほとんどだ。
そのコントロールコマンドはGPSチップベンダーによって仕様が異なっている。

例えば、
レシーバーから送られてくるNMEAメッセージの送信間隔時間を変更するコマンド。
GGAメッセージを1秒間隔で送ってくるようにするには、
u-bloxの場合
$PUBX,40,GGA,0,01,0,0
私の使ってる、SiRF社 StarIIIと言うチップシリーズの場合
$PSRF103,00,00,01,01
とまぁ、全然違う。(ほんとは、メッセージのお尻にチェックサムが付く)
他のチップはもっと複雑なものもある。

GPSレシーバーのコントロールは、初期化やGPSアイドル時のメッセージの抑制などでどうしても必要になる。

困ったがな(´・ω・`)

GPSチップごとにコマンド切り替える仕組みなんか面倒くさくて入れる気にならん。
おまけにシリアルポートの向こうにあるチップの型番なんかできるだけ知りたく無い(ハードウェア依存の処理を埋めたくない)

う゛ーーーん。

gpsdevice.confみたいなコンフィグファイルを作るか・・・
( ゜Д゜)、、、、
それでも、特定のチップしか初期化できないよな。

てか、そもそも、GPS刺した時に /dev/ttyUSB0 になるなんて保証も無いんだよなw

環境に依存する部分は各自の責任ってことでいっか(笑)

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につなぐことなんかまず無いから!
あんまり意味無いんだけどね(・∀・)