2010年9月4日土曜日

setenvの再現

1.9.1ベースのm001etcでテスト中(・∀・)

動作環境の移植はできたんだけど、最後の難関、scriptcmdでのsetenvをどうするかで躓いていた。
コメント情報からscriptcmd内にsetenvを埋め込んでも書き換わる環境変数があるのは確認できた。
がしかし、肝心の wifi_powerdown についてはインストール処理のどこかで上書きされてしまい元に戻ってしまう(´・ω・`)
他に幾つかの環境変数も同じような現象になる。
こりゃ、事実上scriptcmdで環境変数をセットするのは諦めたほうがいいなと、別の方法を考えていた。

で、方法としては、
ブート時に必ず実行される init.rc 内で環境変数設定スクリプトを呼び出す方法。
コレは上手くいく。実際にやってみた。
ただし、1回目の起動は失敗する。
1回目の起動で環境変数を書き換えるため、1回目は書き換わってない状態でブートしてるから。
ま、この方法でも「1度リブートしてね(はぁと」と断り書きしとけば問題ないんだけど、ブート時に毎回走るのがウザい。

んで、もう少し調べてみた。
きっと、インストール時のユーザーランドを調べればどこかでsetenvしてるだろうと探したんだけど、どこにもその形跡が見つからない。
prepare.bin, ramdisk_88_en.gz, mvl5_v5t_ramdisk_WM8505.090922.loop_en.gz, どこにも見当たらない。
これまた、行き詰った(´・ω・`)
圧縮ファイルの中かもしれず、、、そうなると、インストール処理のブートシーケンスを追っかけるのも面倒くさくなって、投げた(笑)

で、考える。
1度だけ実行されればいい setenv。
インストール時に実行可能なのは、scriptcmd か update.sh。
例えば、update.sh内でsetenvできれば上手く行きそうだ。
つーことは、インストール時のユーザーランドにsetenvのバイナリがあればおk!?( ・ω・)

なんとなく、いけそうだな。
問題は移植するsetenvバイナリをどこから持ってくるか?

まず、インストール時にloopバックデバイスとしてmountされる、2つのイメージ、
mvl5_v5t_ramdisk_WM8505.090922.loop_en.gz
ramdisk_88_en.gz
を、バラしてみた。
すると、ramdisk_88_en.gz 内に使えそうな setenvコマンドがあった。
試しに抜き出して、実機上でsetenvすると、環境変数が上手く書き換わる(・∀・)

イケる!

と言うわけで、このsetenvバイナリをインストール時のユーザーランドに移植すれば、update.sh内で setenvし放題!!ってことになるハズ\(^o^)/


つーわけで、移植方法を書いておく(`・ω・´)

取り出しはすべて開発用のUbuntu上で実行。

●setenvを取り出す。
mvl5_v5t_ramdisk_WM8505.090922.loop_en.gz
ramdisk_88_en.gz
をUbuntu上にコピーしておく。

ちなみに、インストール時に使用されるユーザーランドイメージは、mvl5_v5t_ramdisk_WM8505.090922.loop_en の方。

んで、解凍。
# gunzip mvl5_v5t_ramdisk_WM8505.090922.loop_en.gz
# gunzip ramdisk_88_en.gz
mountポイントを掘って、ramdisk_88_en をloopバックデバイスとしてmount。
# sudo mkdir /mnt/tmp
# sudo losetup /dev/loop0 ramdisk_88_en
# sudo mount /dev/loop0 /mnt/tmp
setenvコピー
# cp /mnt/tmp/bin/setenv ~/
umount & 後始末
# sudo umount /mnt/tmp
# sudo losetup -d /dev/loop0
取り出し成功(・∀・)

次、インストール時のユーザーランドへコピーする
mvl5_v5t_ramdisk_WM8505.090922.loop_en をloopバックデバイスとしてmount。
# sudo losetup /dev/loop0 mvl5_v5t_ramdisk_WM8505.090922.loop_en
# sudo mount /dev/loop0 /mnt/tmp
setenvコピー
# sudo cp ~/setenv /mnt/tmp/bin/setenv
# sudo chown 1001:1001 /mnt/tmp/bin/setenv
# sudo chmod 777 /mnt/tmp/bin/setenv
umount & 後始末
# sudo umount /mnt/tmp
# sudo losetup -d /dev/loop0
んで、圧縮
# gzip mvl5_v5t_ramdisk_WM8505.090922.loop_en
おしまい。

できあがった mvl5_v5t_ramdisk_WM8505.090922.loop_en.gz をファームイメージにコピーすればおk

android_fs.tar の中にも system/bin/setenv があるんだけど、これはダイナミックリンクされてるので複数のライブラリが別途必要になる。
ramdisk_88_en.gz の中の setenv は libcだけが必要なのでダイジョウブ(・∀・)

ちなみに、このsetenvコマンド。
実行するだけで、自動的にsaveenvしてくれる。便利。

あとは、update.sh内で、
setenv wifi_powerdown "D8110064|0x4,D811008C|0x4,D81100B4|0x4"
setenv regop "D8110064|0x4,D811008C|0x4,D81100B4|0x4,D8110064|0x8,D811008C|0x8,D81100B4|0x8,D8130054|0x1"
setenv camera_ui yes
してやればおk(・ω・)

setenv問題についてはコレで解決~

2 件のコメント:

  1. 直感と洞察力に関心させられました。

    v1.9.1 ベースの etc ROM、楽しみです。
    頑張って下さい。

    大変勉強になりました。

    返信削除
  2. 匿名さん、こんばんわ。
    いやはや恐縮です(`・ω・´)

    setenvの方法が確立できたので、この先も困ることはないかなぁ~と(^^)
    scriptcmdハックは他の改造でも利用されてるみたいなので役立つかも。

    無いなら作れ、もしくはでっち上げろ、の精神にのっとって(;´Д`)
    これだけいじりやすいROMは、ほげってて楽しいです(笑)

    近々、1.1.0公開できると思います(^^)

    返信削除