2011年02月01日
KZM-A9-DualボードでeMMCからブートする
KZM-A9-Dualボードには約4GByteのeMMCがあります。そこからブートするためにeMMCに書きこむ方法を紹介します。
書き込むファイル
u-bootはeMMCから起動するために専用にビルドしたものを使います。KZM-A9-Dualボードに付属するDVDに入っているソースアーカイブでビルドすることができます。ファイル名は u-boot-emmc.bin です。
Linuxカーネルとルートファイルシステムは特別なものは必要ありません。SDカードやNFSでブートした時と同じものを使用します。
ルートファイルシステムはここではAndroidを使うことにします。/androidディレクトリに展開します。
つまり書き込むファイルは以下の3つ。
- u-boot-emmc.bin
- uImage
- /android ディレクトリ
Ubuntuを起動する
eMMCのパーティションを分割したり、ファイルシステムを作るためにARMのUbuntuを使用します。
ARMのUbuntuのルートファイルシステムの作成方法は以前この記事で紹介しました。ARM Ubuntuのバージョンは10.04でも10.10でもどちらでもかまいません。
NFSで起動するのが便利だと思います。
書き込み用スクリプト
カレントディレクトリに u-boot-emmc.binとuImageを置き、/androidに Androidのルートファイルシステムを展開します。
そして以下のスクリプトを実行します。
write_emmc.sh
#!/bin/sh set -x -e UBOOT=u-boot-emmc.bin UIMAGE=uImage ROOT=/android EMMC=/dev/mmcblk0 ls -l $UBOOT ls -l $UIMAGE ls -l $ROOT ls -l $EMMC # Delete partition table dd if=/dev/zero of=${EMMC} bs=1024 count=1024 fdisk ${EMMC} << __END__ n p 1 +512K n p 2 +6M n p 3 p w __END__ sleep 2 sync;sync;sync mkfs.ext3 ${EMMC}p3 mount ${EMMC}p3 /mnt cp -a $ROOT/* /mnt/ umount /mnt dd if=$UBOOT of=${EMMC}p1 dd if=$UIMAGE of=${EMMC}p2 sync;sync;sync echo "*** OK ***"
途中の空行にも意味があるので、このまま変更しないで使ってください。
$ sudo ./write_emmc.sh
このスクリプトで以下のことをしています。
- 書き込むファイルが揃っていることを確認。
- パーティションテーブルを全て削除。
- fdiskコマンドでパーティションを作成。
- p1: サイズ512KB。u-boot用
- p2: サイズ6MB。kernel用
- p3: 残り全て。ルートファイルシステム用。
- p3にext3のファイルシステムを作成。
- p3にルートファイルシステムをコピー。
- p1にu-bootを書き込む。
- p2にkernelを書き込む。
eMMCからのブート
KZM-A9-Dualボードのディップスイッチを以下のように設定します。
- DSW1-3: ON
- DSW1-4: OFF
これで電源を入れなおせばeMMCからブートします。
U-Boot 2009.03-rc1 (Jan 25 2011 - 14:33:43) Booted Device: eMMC Board: EM/EV ES2 (Rev.ffffff20) Core: 1.15v DRAM: 512 MB Flash: 64 MB *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial Hit any key to stop autoboot: 0 ## Booting kernel from Legacy Image at 40007fc0 ... Image Name: Linux-2.6.29 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 3896448 Bytes = 3.7 MB Load Address: 40008000 Entry Point: 40008000 Verifying Checksum ... OK Loading Kernel Image ... OK OK Starting kernel ... Linux version 2.6.29 (koba@koba-linux2) (gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67) ) #1 SMP PREEMPT Tue Jan 25 14:44:09 JST 2011 CPU: ARMv7 Processor [411fc092] revision 2 (ARMv7), cr=10c57c7f CPU: VIPT nonaliasing data cache, VIPT nonaliasing instruction cache Machine: KZM9D Memory policy: ECC disabled, Data cache writealloc Built 2 zonelists in Zone order, mobility grouping on. Total pages: 99314 Kernel command line: root=/dev/mmcblk0p3 noinitrd init=/init console=ttyS1,115200n8n androi dboot.console=ttyS1 SELINUX_INIT=no mem=135M@0x40000000 mem=256M@0x50000000 rw video=qfb: ip=none rootfstype=ext3 rootwait Unknown boot option `androidboot.console=ttyS1': ignoring PID hash table entries: 2048 (order: 11, 8192 bytes) Console: colour dummy device 80x30 Dentry cache hash table entries: 65536 (order: 6, 262144 bytes) Inode-cache hash table entries: 32768 (order: 5, 131072 bytes) Memory: 135MB 256MB = 391MB total Memory: 391936KB available (3520K code, 768K data, 128K init) Calibrating delay loop... 1061.68 BogoMIPS (lpj=5308416) Mount-cache hash table entries: 512 CPU: Testing write buffer coherency: ok CPU1: Booted secondary processor Calibrating delay loop... 1064.96 BogoMIPS (lpj=5324800) Brought up 2 CPUs SMP: Total of 2 processors activated (2126.64 BogoMIPS). net_namespace: 312 bytes NET: Registered protocol family 16 ...