1: 2010-08-30 (月) 05:55:18 yuji |
現: 2020-12-26 (土) 15:08:16 yuji |
| + | #contents |
| + | |
| *kernelのコンパイル [#n214438c] | | *kernelのコンパイル [#n214438c] |
| Androidのkernelをソースからコンパイルしてみる。 | | Androidのkernelをソースからコンパイルしてみる。 |
| cd ~/android/system | | cd ~/android/system |
| -ソースをダウンロードする(CyanogenModのソースにしてみる)~ | | -ソースをダウンロードする(CyanogenModのソースにしてみる)~ |
- | repo init -u git://github.com/CyanogenMod/android.git -b froyo | + | repo init -u git://github.com/CyanogenMod/android.git -b gingerbread |
| repo sync | | repo sync |
| -コンパイラ環境を設定する~ | | -コンパイラ環境を設定する~ |
| git clone git://github.com/CyanogenMod/cm-kernel.git | | git clone git://github.com/CyanogenMod/cm-kernel.git |
| -その後,kernel .configをHT-03Aから持ってくるか,menuconfigなんかで作成する。~ | | -その後,kernel .configをHT-03Aから持ってくるか,menuconfigなんかで作成する。~ |
- | --持ってくる場合~ | + | --端末から持ってくる場合~ |
| cd cm-kernel | | cd cm-kernel |
| adb pull /proc/config.gz /home/user_name/androkern/cm-kernel/config.gz | | adb pull /proc/config.gz /home/user_name/androkern/cm-kernel/config.gz |
| gunzip config.gz && mv config .config | | gunzip config.gz && mv config .config |
| + | --kernel.imgから抜き出す場合~ |
| + | scripts/extract-ikconfig boot.img > .config |
| --configし直す場合~ | | --configし直す場合~ |
| + | 用意した.confgファイルを元に適当に設定する。.configがないと最初から設定しなおしになる。 |
| make ARCH=arm CROSS_COMPILE=$CCOMPILER oldconfig | | make ARCH=arm CROSS_COMPILE=$CCOMPILER oldconfig |
| もしくは, | | もしくは, |
| とかして,.configを作成する。~ | | とかして,.configを作成する。~ |
| -kernelをコンパイルする~ | | -kernelをコンパイルする~ |
- | make ARCH=arm CROSS_COMPILE=$CCOMPILER | + | make ARCH=arm CROSS_COMPILE=$CCOMPILER -j`grep 'processor' /proc/cpuinfo | wc -l` |
| 結構時間がかかる。~ | | 結構時間がかかる。~ |
| kernelは,~/android/kernel/cm-kernel/arch/arm/boot/zImage に保存される。~ | | kernelは,~/android/kernel/cm-kernel/arch/arm/boot/zImage に保存される。~ |
| + | |
| + | **WiFi kernelモジュールのコンパイル [#r49724ff] |
| + | なぜかこの状態だとwifiが不安定になるらしい。~ |
| + | wifiドライバーをモジュールとしてコンパイルして,それをリンクするようにする。 |
| + | +cd ~/android/system/system/wlan/ti/sta_dk_4_0_4_32~ |
| + | +KERNEL_DIR=~/android/kernel/cm-kernel CROSS_COMPILE=$CCOMPILER ARCH=arm make -j`grep 'processor' /proc/cpuinfo | wc -l`~ |
| + | でコンパイルする~ |
| + | +できたモジュールのファイルを上書きして変更する。 |
| + | adb shell mount -o remount,rw /system~ |
| + | adb shell cp /system/lib/modules/wlan.ko /system/lib/modules/wlan.ko.backup~ |
| + | adb push wlan.ko /system/lib/modules/wlan.ko~ |
| + | リブートすれば,新しいwlan.koをkernelが使うようになる。 |
| | | |
| *boot.imgの作成 [#m7e8073d] | | *boot.imgの作成 [#m7e8073d] |
| **filesystem [#wb787241] | | **filesystem [#wb787241] |
| + | HT-03AにはFlash ROM上に,以下のようなROMパーテーションが作られている。 |
| cat /proc/mtd | | cat /proc/mtd |
| dev: size erasesize name | | dev: size erasesize name |
| mtd3=/system,mtd4=cache,mtd5=/dataにそれぞれmountされる。~ | | mtd3=/system,mtd4=cache,mtd5=/dataにそれぞれmountされる。~ |
| mtd2はboot時使われるファイルで,mtd1はリカバリーモードで使われる。 | | mtd2はboot時使われるファイルで,mtd1はリカバリーモードで使われる。 |
| + | |
| + | 一応,"recovery"と"boot"をバックアップしておく |
| + | #cat /dev/mtd/mtd1 > /sdcard/mtd1.img |
| + | #cat /dev/mtd/mtd2 > /sdcard/mtd2.img |
| + | |
| + | 端末の/system/recovery.imgは,毎回シャットダウンする時にmtd1(recoveryパーテーション)に,自動的に焼かれる。この理由は, |
| + | -まちがってmtd1を変に書き換えちゃった時に,文鎮化するのを防ぐ為~ |
| + | -mtd1を入れ替えたい場合などに,/system/recovery.imgに入れておくことで,安全に変更できる~ |
| + | と思われる。通常は,/system/recovery.imgを入れておかないようにする。 |
| + | |
| **bootイメージ [#i1df0efb] | | **bootイメージ [#i1df0efb] |
| bootイメージは,linuxのブート時に使用されていて, | | bootイメージは,linuxのブート時に使用されていて, |
| +2ndステージローダー(オプション) | | +2ndステージローダー(オプション) |
| がbootイメージに入っている。~ | | がbootイメージに入っている。~ |
| + | |
| kernelをコンパイルした後,kernelファイルとこれらのファイルをマージしてboot.imgを作成する。~ | | kernelをコンパイルした後,kernelファイルとこれらのファイルをマージしてboot.imgを作成する。~ |
| これをmtd2にflashすると,bootloaderがkernelを起動してくれる。 | | これをmtd2にflashすると,bootloaderがkernelを起動してくれる。 |
| + | |
| + | boot.img用のアンパックとマージには,&ref(unpack-bootimg.zip);&ref(repack-bootimg.zip);を使うことが出来る。 |
| + | |
| + | ***boot.imgの分解 [#q862084e] |
| + | とりあえず今あるboot.imgを分解して,kernelとramdiskにわける。~ |
| + | 最初の2kbyteを飛ばして0x1F8B(gzipのヘッダー)を見つける,次の0x1F8Bまでがkernelになる。~ |
| + | その次の0x1F8Bまでがramdiskになる。バイナリエディター等やddなんかで書き出せば取り出せる。ファイルはgzip圧縮されているんで解凍すれば,ramdiskに中にあるファイルを編集できるようになる。 |
| + | gunzip -c ../your-ramdisk-file | cpio -i |
| + | 上の,unpack-bootimgを使うほうが簡単だけど・・・ |
| + | |
| + | ramdiskを編集したら,コンパイルしたkernelと共に再度パッキングする。~ |
| + | まず,ramdiskをgzipで圧縮する。 |
| + | find . | cpio -o -H newc | gzip > ../newramdisk.cpio.gz |
| + | 新しいkernelとマージする。 |
| + | mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel 新しいkernel --ramdisk newramdisk.cpio.gz -o myboot.img |
| + | 上の,repack-bootimgを使うほうが簡単だけど・・・ |
| + | |
| + | もしくは,&ref(split_bootimg.zip);も使える。 |
| + | 分解するときは, |
| + | % ./split_bootimg.pl boot.img |
| + | % mkdir ramdisk |
| + | % cd ramdisk |
| + | % gzip -dc ../boot.img-ramdisk.gz | cpio -i |
| + | % cd .. |
| + | とやって,作業後マージするには, |
| + | % mkbootfs ./ramdisk | gzip > ramdisk-new.gz |
| + | % mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o myboot.img |
| + | でマージする。 |
| + | |
| + | *HT-03Aに新しいboot.imgをflashする [#ua851e8c] |
| + | /sdcardに新しいイメージをコピーする |
| + | adb push ./myboot.img /sdcard |
| + | adb shell上で, |
| + | # cat /dev/zero > /dev/mtd/mtd2 |
| + | で,bootパーテーションを綺麗サッパリ消してから, |
| + | # flash_image boot /sdcard/myboot.img |
| + | として,書き込む。 |
| + | リブートして,ちゃんとブートすればOK。ダメだったら,リカバリモードで前に戻す。 |