2011年1月27日木曜日

Nesux S Kernel build and create my boot.img

わすれっぽい自分のために。。

1.事前準備
Ubuntu10.04をUbuntuのサイトから落としてVMWare Playerあたりをつかって、まずインストール。10.04からはsun-java6-jdkがaptでとれないので
add-apt-repository "deb http://archive.canonical.com/ lucid partner"
sudo apt-get update
コンパイルに必要なパッケージを全部aptで導入する
sudo apt-get -y install git-core gnupg \
  sun-java6-jdk flex bison gperf libsdl-devlibesd0-dev libwxgtk2.6-dev \
  build-essential zip curl libncurses5-dev zlib1g-devvalgrind g++ 
repoの導入
mkdir ~/bin
curl http://android.git.kernel.org/repo >~/bin/repo
chmod a+x ~/bin/repo
export PATH=$PATH:~/bin (.bashrcなどに追加しておく)

javaへパスを通す
export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.**.**

repoで取得、toolchainとかも降ってくるから必ず取得しておく
repo init -u git://android.git.kernel.org/platform/manifest.git
repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.3.1_r1 (2.3用)

※初回のみ
repo sync
しばらくまつ。。

2.Kernelのソースをダウンロード(for Nexus S)
git clone git://android.git.kernel.org/kernel/samsung.gitKernelのconfig

cd samsung
make ARCH=arm herring_defconfig
(*)make menuconfig ARCH=arm (menuconfigもできるのでいじる人はこれやってもいい)
makeする(とりあえず)

make ARCH=arm CROSS_COMPILE=/home/creams/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-arch/arm/boot/
arch/arm/boot/zImageが作成されていればOK。

3.boot.imgの作成
実機からboot.imgを取り出す。
adb shell
su
cat /dev/mtd/mtd2 > /sdcard/nexussboot.img
exit
adb pull /sdcard/nexussboot.img .
split_bootimg.plをどこからか探して~/binあたりに保存しておく
$ split_bootimg.pl nexussboot.img
Page size: 4096 (0x00001000)
Kernel size: 2799472 (0x002ab770)
Ramdisk size: 142442 (0x00022c6a)
Second size: 0 (0x00000000)
Board name:
Command line: console=ttyFIQ0 no_console_suspend
Writing nexussboot.img-kernel ... complete.
Writing nexussboot.img-ramdisk.gz ... complete.
カレントにboot.imgとkernelが展開される。consoleの部分を記録しておく。

mkbootimgでboot.imgを作成。zImageは自分でビルドしたもの、ramdiskイメージは、展開して取得したものを指定する。

mkbootimg --cmdline 'console=ttyFIQ0 no_console_suspend' \
  --kernel zImage --base 0x30000000 --pagesize 4096 \
  --ramdisk boot.img-ramdisk.gz -o myboot.img

myboot.imgがオリジナルのbootimageだ。
実機で試すには、Nexus Sをfastbootモードで起動して、kernelをUSB経由でアップして起動してみる。この方法だと、bootパーティションに書き込まずにテストできる。
adb reboot bootloader
fastboot boot myboot.img
これだと、Wifiが使えないはず(kernelが変更されているので)。SIMが刺さっていればそっちは通信できるはずなので、端末情報あたりを眺めてニヤニヤするw。オリジナルのkernelが適用されていれば、「カーネルバージョン」の項目が、変更されているのがわかる。

ちなみに、username@hostname がバージョン情報に挿入されるので、オリジナルを主張したい人w
は、そのへん気をつけてbuildするといいだろう。

kernelが問題なく動作するようなら、焼きこんでみる。この作業を行う前にかならずbackupなどをとっておこう。思いもしない不具合に出くわすことだってある。
fastbootモードにして、、

fastboot flash boot myboot.img
Wifiを動作させるためには、Kernelをbuildしたときに出来ているmoduleに入れ替える必要がある。ファイルの場所は、samsung/drivers/net/wireless/bcm4329にあるbcm4329.ko。これを、実機の/system/modules/に転送する。
adb pull /system/modules/bcm4329.ko .
adb shell
su
mount -o remount,rw -t ext4 /dev/block/platform/s3c-sdhci.0/by-name/system /system
もしくは
adb remount (unsecureなboot.imgのひとだけ)
adb push bcm4329.ko /system/modules
かならずadb pullでバックアップとっておこう。


Appendix
ramdiskを展開して中身をいじるには
mkdir ramdisk
cd ramdisk
gunzip -c ../ramdisk.image.gz | cpio -i
カレントディレクトリに展開されるので、いろいろいじる、前回のext4のオプションもinit.herring.rcあたりに設定しておく。

固める
find . | cpio -o -H newc | gzip > ../new.ramdisk.image.gz
で、作成完了。あとはmkbootimgでmyboot.imgを作成して、実機bootしてみる。
こうやって作成したkernelでいまは使ってみている。いまのところ不具合などはないけれど、文鎮化する可能性もあるので、同じことやってみようと思う人自己責任でお願いします。

1 コメント:

Unknown さんのコメント...

ここに記載されている方法と同じようにkernelをビルドしたはずなのに,自分で作成したzImageをmkbootimgの引数に渡すとfastbootモードでbootしたときに,Googleのロゴが出るところまでは行きますが,それより先に進みません.ロゴの出た状態でフリーズしているような感じです.何がいけないのでしょうか?考えられる可能性を教えてください.また,Android内で何が起きているかログを確認する方法はありますか?教えて頂けると幸いです><

コメントを投稿