さて、Covia版Kernelを使って、SDカードからAndroidを起動させる方法をまとめてみよう。
長きにわたったため、情報が分散してしまったのだ。
Coviaさんの努力結果だけもらうようで気が引けていたのだけど、内蔵のiNANDが使いすぎで壊れてしまうというのも、哀しい。
長く使うため!ということで、少し省略したような形で載せておこう。
Coviaさんに感謝の意を示しつつ、以下を読み進めていただきたい。
【追記 2010/02/20】
最新版のファームウェアで動かなかった場合は、古いものを使ってみるといいかもしれない。
私は2009/11/30版での動作を確認している。
まず、いるもの。
- SmartQ5ファームウェア
- Linux環境(Ubuntuとか、VMwareとか)
- u-bootのmkimage (apt-getする)
- SDカード(私は16GBのを使っているが、2GBはほしいか)
こんなものか。
私は、WindowsXP+VMware(Ubuntu8.10)でやっている。
Ubuntuじゃないのがよかったけど、Androidの環境構築でそう書いてあったので、もうめんどくさかった。
※追記(2009/12/23 0:32)
mkimageは、ubuntuの場合はapt-getでできるようだ。
# sudo apt-get install uboot-mkimage
抜き取り
まず、SmartQ5ファームウェアからいろいろと取り出す。
記事 : [Q5]upgrade.sh
記事 : [Q5]SDカードからもブート
SmartQ5Extractorというツールを使うと、SmartQ5ファイルからいろいろと取り出せる。
いるのは、
- rootfs.tar.gz
- homefs.tar.gz
- initramfs.igz
の3つ。
SmartQ5ファイルの構造
息抜き。
SmartQ5ファームウェアファイルには、いろいろ詰まっている。
解析するのは面倒なので、回答ツールを探してきた方が早い。中国語のツールだけど、使う分には何となくわかる。
でも、バイナリ好きならば自分で何とかしたいところ。
私は人が調べた情報を使う。
smartq-initramfs
ここが見つかったのが昨日なのだが、それまでは困り果てていたのだ。
ダウンロードしてfw-utils/firmware-headers.hを見ると、ヘッダ部の情報がわかる。
qi:56
u_boot:76
zimage:96
initramfs:116
rootfs:136
homefs:156これがあれば、だいたい自動化できそうな気がする。
initramfsの解凍
記事 : [Q5]覚え書き
最初の2つはまあいいとして、initramfs.igz。
これは、initramfs形式をu-boot形式にしたもの。
initramfs形式は、CPIO+tgzだ。
u-boot形式は、ヘッダが64byteついたもの。
|
解凍スクリプト
|
#!/bin/sh dd if=initramfs.igz bs=64 skip=1 > initramfs.img.gz gzip -d initramfs.img.gz mkdir initramfs pushd initramfs cpio -idm < ../initramfs.img popd rm initramfs.img |
|
|
|
cvkk-firmware-8M
解凍したinitramfsの中から、ファイルを取り出す。
usr\cvkk\upgrade\firmware\cvkk-firmware-8M
SmartQ5Extractorにかけると、kernelを取り出せる。
SmartQ5をExtractorしてとれるkernelは、インストーラ用のkernelだろう。
ファイル名はzimage。以下ではzimage-cvkkとして使っている。
init、init.rc、init.smdk6410.rc
記事 : rootfsに関するある結論
これらのファイルは、動いているAndroidからSDカードにコピーするのが手っ取り早い。
cvkk-firmware-8Mを解凍したinitramfs.igzにはなさそうだ。
rootfs.tar.gzあたりに秘密がありそうだが、うまく解凍できない。
ここまで
ここまでで、SmartQ5ファイルなどから必要となるファイルは一式取り出した。
initramfs.igzの作成
ここからは、ほぼLinuxで作業する。
cygwinでもできそうだけど、不安なのでやめた。
initramfs.cpio.gzの作成
どこかにディレクトリを掘る。
そこに、init、init.rc、init.smdk6410.rcを放り込む。
ここの真ん中辺りにあるスクリプトを取り出し、実行できるようにする。
第1引数にさっき掘ったディレクトリを、第2引数に生成したいファイル名をつけて実行。
これで、initramfs.cpio.gzは完成。
initramfs.igzの作成
最初に言っておくが、igzという拡張子はSmartQ5Extractorがつけていたからそう呼んでいるだけで、正式ではないと思う。
さっき作ったinitramfs.cpio.gzにu-bootのヘッダを付ける作業をここでやる。
それには、u-bootのmkimageというコマンドを使う。
記事 : [Q5]やってしまった・・・
こんな使い方になる。
$ mkimage -A arm -O linux -T ramdisk -C gzip -n 'initramfs' -d initramfs.cpio.gz initramfs.igz
実際には、私はinitrd.igzというファイル名にした。ロングファイルネームは不安でね。
組み込む
menu.lst
title Covia
kernel /boot/zimage-cvkk
initrd /boot/initrd.igz
param nosplash
logo /boot/android.bmp4
zimage-cvkkは、cvkk-firmware-8Mから取り出したzImage。
こちらを使わないと、Coviaさんが対応してくれたドライバ類が入っていないだろう。
改行コードがLFのみとなるように気をつけよう。
SDカード
boot用にvfatを先頭に、swapに1つ、/systemに1つ、/dataに1つ。
4つパーティションが必要になる。
つまりまあ、これ以上は入らない。拡張パーティションはよく知らん。
パーティションは適当に。
オリジナル似合わせて、swapは128Mでよいのかな?
/systemは基本的に広がらないので、ぎりぎりのサイズでもよいか。
アプリは/dataに入るから、ここを大きく取るのがいいのでは。
編集
init.rcを書き換える。
mount先を変更。
mount ext3 /dev/block/mmcblk1p3 /system
mount ext3 /dev/block/mmcblk1p3 /system ro remountmount ext3 /dev/block/mmcblk1p4 /data nosuid nodev
/system/etc/init.smdk6410.shでswapの設定をしているから、これも忘れないように。
mkswap /dev/block/mmcblk1p2
swapon /dev/block/mmcblk1p2
あとは、起動するだけである。
みんなできたかな?
最近のコメント