2011年3月19日土曜日

[DEV] SCH-i909 Chine telecom version Galaxy S Kernel build

これまた自分のためのメモ。

今日はSCH-i909のkernelビルドと入れ替えについて。前のエントリにも書いたとおり、およそAndroid端末とは思えない仕様のSCH-i909であるが、OpenSourceなモノの宿命でフツーにkernelが手に入る。ちなみに、日本が地震に揺れている現在、何故か以前より海外線のトラフィックが非常に細くなってて時間がかかります。
http://opensource.samsung.com/
でSCH-i909で検索。CN版のソースをwget等でダウンロードしておく。ちなみにビルドの環境は以下のとおり。
Ubuntu10.04 (32bit)
androidのサイトからおとしたSDK(toolchain)類。
SCH-I909_CN_OpenSource.zipをダウンロードしたら、適当なディレクトリにてんかいします。中にはいくつかのアーカイブがさらに含まれている。以下のとおり。
3d_module_GPL.tar.gz
SCH-i909_eclair.tar.gz
SCH-i909_Kernel.tar.gz
今回使うのはKernel。tarを展開したら、生成されるGalaxySディレクトリにcd

build_kernel.shをそのまま叩いてもkernelはできません。ちょっと調整が必要です。README.txtにいくらか解説があるけど、適当臭いので参考程度に。トライアンドエラーでもできると思うけどね。build_kenerl.shをemacs等でひらいて、ちょっと修正します。主にTOOLCHAINへのパス。一応Androidのtoolchainでもいけるかとおもうけど、README.txtにcodesourceryから落とせってかいてあるから、落とします。
wget http://www.codesourcery.com/sgpp/lite/arm/portal/package5353/public/arm-none-eabi/arm-2009q3-68-arm-none-eabi-i686-pc-linux-gnu.tar.bz2
おとしたら、GalaxySと同じ階層に展開しておくと楽。でbuild_kernel.shを下記に修正。
vi build_kernel.sh

--

TOOLCHAIN=`pwd`/../arm-2009q3/bin
TOOLCHAIN_PREFIX=arm-none-eabi-

--
さて、ここでいきなりbuild_kernel.shをぶったたくのもいいけど、準備はまだこれから。initramfsの中身を準備しておく必要がある。kernelソースには付属してこないので、DL10のzImageから抽出して、kernelのビルドディレクトリに展開しておいておこう。そのために、kernelソースを展開するとrootというディレクトリがデフォで作成される。(DL10の入手については別エントリをみてちょ)

zImageからinitramfsの抜くにはXDAの下記のエントリを参照するといい。このページの最初のスクリプトがinitramfsを抜き出すためのスクリプト。
http://forum.xda-developers.com/wiki/index.php?title=Extract_initramfs_from_zImage
で、このスクリプトにzImage食わせて展開してinitramfsが抜けたら、それを展開する。cpioで展開するけど、カレントに展開されるので、先程のrootディレクトリ等に移動してやっとくと楽。
cpio -v -i --no-absolute-filenames < path-to-initramfs.img
ここまできたら一回build_kernel.shを実行してみるが、下記のエラーで止まるはず。
fs/binfmt_aout.c: In function 'load_aout_binary':
fs/binfmt_aout.c:270: error: 'SEGMENT_SIZE' undeclared (first use in this function)
fs/binfmt_aout.c:270: error: (Each undeclared identifier is reported only once
fs/binfmt_aout.c:270: error: for each function it appears in.)
make[1]: *** [fs/binfmt_aout.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [fs] Error 2
これを回避するためにkernelソースのてっぺんにあるMakefileを
NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include) -Dlinux
と修正しておく。それから、initramfsの中身を展開したrootのディレクトリもそのままだとzImageの中身に取り込まれる様子がまったくみられなかったので、configを修正してrootディレクトリまでの絶対パスを書いておく。修正するconfigは下記のモノ。
~/android_dev/china/SCH-i909_OpenSource/GalaxyS/kernel/linux-2.6.29/arch/arm/configs/ariesct_rev00_defconfig

--
CONFIG_INITRAMFS_SOURCE="/home/somewhere/android_dev/GalaxyS/root"
--
ここまで準備したら気兼ねなくbuild_kerne.shを実行。気長に待ってOUTPUTディレクトリにzImageが出来上がってればOK。build_kernel.shを実行すると、kernel -> module の順番でビルドされるが、DL10なROMのzImageを入れ替えるだけであればモジュールは入れ替えなくてもいい。

出来上がったzImageはheimdallを使って、書きこむ。heimdallはGUIのフロントエンドが追加されてて、使いやすくなった。SCH-i909をダウンロードモードで起動して、PCに接続、heimdallのGUIを起動してzImageのところに、今回ビルドしたイメージを指定してstartするだけ。しくじっても、DL10のROMがあれば一発でもとに戻せるだろうし。fastbootなくて不安という人もいるかと思うけど。やっちゃってください、自己責任でw。

余談だけど、地震の当日というか次の日もAndroidいじくって遊んでたわけだけど。そのときは、えらいネットワーク遅かった。まぁ、こんだけの事がおこれば、みんな情報とりたくて必死になるのも分かるけど、S/Nの悪いネットの情報に踊らされてる人のなんと多いことか。そこにネットの良さもあるわけだが、なんとも。。

以上。

0 コメント:

コメントを投稿