2011年2月28日月曜日

How to make CFW (MID816)

他機種でもそうなんだけど、rootのファイルシステムがramfs上にあって、rwでremountしていじっても、再起動で全部元通りなんてことがある。
これは、ブート時に必要なシステムをramfs上にコピーして作っちゃうからで、カスタムファームを作ろうと思うとこれがとても邪魔になる。
M001のように、ファーム書き換え即ブートイメージだったら楽なんだけどね。
で、ramfs上に作られる大元のイメージをいじればいいんだけど、これがまたとても面倒くさい。
しかし、やらねばなるまい。やったるで!

と言うことで、MID816用のメモ。
下記の記事は熟読必須。

Rooting research
http://www.slatedroid.com/index.php?/topic/13591-rooting-research/

HOWTO: Unpack, Edit, and Re-Pack Boot Images
http://android-dls.com/wiki/index.php?title=HOWTO:_Unpack%2C_Edit%2C_and_Re-Pack_Boot_Images


※補足、Rooting research で Mmartinez氏が u-Bootイメージのアドレスを 0x03080000 と言ってるが、本当は 0x30800000 が正しい。
私の記事はそれを修正してあるので間違えないように。

まず、必要なもの。
  • Linux環境
    私の場合はWMware上で動くUbuntu。
  • Linux上で動く次のコマンド
    split_bootimg.pl
    mkbootimg
    mkimage
    ぐぐったら入手方法なんかは分かるはず。
    拾ったら、実行権限を与えてパスの通った場所へコピーしておく。 
  • オリジナルファーム
    20110211-update.zipを使用した。

作業開始。
20110211-update.zipを解凍して、boot.imgを取り出す。
boot.imgをLinux環境上の作業用のディレクトリにとりあえずコピー。

$ mkdir ~/myfirmware
$ cd ~/myfirmware
$ cp hogehoge/boot.img ./


split_bootimg.pl を使って boot.imgをバラす。

$ split_bootimg.pl boot.img
Page size: 2048 (0x00000800)
Kernel size: 3404636 (0x0033f35c)
Ramdisk size: 823260 (0x000c8fdc)
Second size: 0 (0x00000000)
Board name:
Command line:
Writing boot.img-kernel ... complete.
Writing boot.img-ramdisk.gz ... complete.

カレントディレクトリに boot.img-kernel と boot.img-ramdisk.gz が生成される。
gzイメージはそのままでは解凍できない。u-Bootのヘッダがついているので除去する。

$ dd if=boot.img-ramdisk.gz of=boot.img-ramdisk.cpio.gz bs=64 skip=1
12862+1 records in
12862+1 records out
823196 bytes (823 kB) copied, 0.607133 s, 1.4 MB/s

できあがった boot.img-ramdisk.cpio.gz の中身を解凍して展開する。

$ mkdir ramdisk
$ cd ramdisk
$ gunzip -c ../boot.img-ramdisk.cpio.gz |cpio -i

ramdiskディレクトリ内にbootイメージのシステムツリーが展開される。よしよし\(^o^)/
好きなように、必要なファイルを編集したり、ごそごそ作業する(笑)

編集が終わったらリパックする。
ここからは、バラした作業の逆手順をやっていけばいい、、、んだけど、結構ややこしい。
ramdiskディレクトリに入ったまま、

$ find . | cpio -o -H newc | gzip > ../newramdisk.cpio.gz
$ cd ..

newramdisk.cpio.gz が生成される。
続いて、u-Bootイメージを作る。この処理でu-Boot用のヘッダを付加しておくわけ。

$ mkimage -A arm -O linux -T ramdisk -C none -a 0x30800000 -e 0x30800000 -n ramdisk -d newramdisk.cpio.gz newramdisk.gz

パラメータなどは、Slatedroid記事他、自力で調べたものをつけている。
ちなみに、-a (load address) と -e (entry address) はブート時に表示されるシーケンスメッセージを見てると表示されているハズ。
-n は要らないかもしれない。
ここのパラメータを間違えるとまず起動しない。

これで、root ramdiskのイメージが出来上がった。

最後に、焼き込み用のイメージを作る。


$ mkbootimg --kernel boot.img-kernel --ramdisk newramdisk.gz --base 0xc0000000 -o myboot.img

でーきーあーがーりーー。

myboot.img を boot.img にリネームして、オリジナルファームの 20110211-update.zip の中に入れ、あとは普通にファームアップデートをすればおk!!
以上、おいら用の備忘録。

いやー、なかなか調べるのに苦労した。英語でも詳しい手順が記事になってないから、素人がする作業ではないことは確かかな。

実際に作ってテストしてたんだけど、一歩間違えるとブート無限ループの刑になったりしてとっても危険(笑)
くれぐれも自己責任で行うように。
死んでも知らんww

0 件のコメント:

コメントを投稿