一. Linaro
在国内几乎很少人会知道Linaro(http://www.linaro.org)这样一个非营利性开源软件组织,它集合了超过120位嵌入式行业工程师,是由ARM、飞思卡尔、IBM、三星、ST-Ericsson和德州仪器这几家公司共同宣布成立,目的是帮助开发人员和制造商为消费者提供更多选择、反应更快的设备,并提供更多样化的基于Linux系统的应用。
二. Snowball(ICS) board开发板
Snowball开发板是Linaro组织主推的几款用于开发Andorid的开发板,由ST-Ericsson公司设计。另外几款分别是三星的origen以及TI的panda开发板等等。与其他开发相比,Snowball在其通信方面具有相当大的优势,主要详细介绍可以参考Snowball专门的开发社区http://www.igloocommunity.org/。
硬件结构
Snowball的通信模块可谓强大,集合了Wifi、Bluetooth以及GPS模块;
开发板上直接有USB转串口模块,所以只要一根USB线就可以查看串口输出信息;
一个USB OTG既可以作为host,又可以作为device,不过作为开发板作为host的时候需要配备一根Mini USB A公转母头,作为USB扩展。
三. 在Snowball上烧写Android流程
snowball提供了两种不同的烧写方式,emmc烧写以及sd卡烧写方式。
emmc烧写步骤:
(1) 准备工作
从Linaro或igloocommunity官网上下载得到最新的Andorid源码编译形成三个文件boot.tar.bz2、system.tar.bz2、userdata.tar.bz2。其中system.tar.bz2加载系统数据,userdata.tar.bz2加载用户数据,而boot.tar.bz2加载启动项信息。同时需要安装emmc启动镜像的烧写工具riff(http://www.igloocommunity.org/support/Riff)
(2) 创建一个临时的工作目录存放三个文件
$ mkdir snowball-image
$ cd snowball-image
$ ls
boot.tar.bz2 system.tar.bz2 userdata.tar.bz2
(3) 下载并解压制作镜像需要的启动文件包(http://www.igloocommunity.org/download/linaro/startupfiles/latest/)
$ pwd
snowball-image
(fetch the tarball)
$ tar xf startupfiles_xyz.tar.gz
$ ls startupfiles/
boot_image_issw.bin boot_image_x-loader.bin debian license.txt mem_init.bin
power_management.bin startfiles.cfg u-boot-env.bin
(4) 因为默认的linaro-android build是在init.rc文件中指明从mmc卡启动,需要修改以支持从emmc卡启动。解压缩boot.tar.bz2
$ ls
boot.tar.bz2 startupfiles system.tar.bz2 userdata.tar.bz2
$ tar xjf boot.tar.bz2
$ ls
boot boot.tar.bz2 startupfiles system.tar.bz2 userdata.tar.bz2
$ ls boot/
cmdline u-boot.bin uImage uInitrd
(5) 由于init.rc嵌入在boot/uInitrd这样一个cpio归档文件中,因此使用dd命令去抽取相关信息
$ ls
boot boot.tar.bz2 startupfiles system.tar.bz2 userdata.tar.bz2
$ dd if=boot/uInitrd of=initrd.cpio.gz bs=1 skip=64
$ ls
boot boot.tar.bz2 initrd.cpio.gz startupfiles system.tar.bz2 userdata.tar.bz2
$ mkdir rootfs
$ cd rootfs
$ sudo gunzip -c ../initrd.cpio.gz | cpio -i
data init init.st-ericssonsnowballplatform.rc sys ueventd.rc
default.prop init.goldfish.rc proc system
ueventd.st-ericssonsnowballplatform.rc
dev init.rc sbin ueventd.goldfish.rc
(6) 这一步需要去init.rc文件中去修改相关的挂载分区信息以支持从emmc卡启动
on fs
# mount mmc partitions
mount ext4 /dev/block/mmcblk1p2 /system ro
mount ext4 /dev/block/mmcblk1p3 /cache
mount ext4 /dev/block/mmcblk1p5 /data
# comment out the above and uncomment these to run from emmc.
# mount ext4 /dev/block/mmcblk0p3 /system ro
# mount ext4 /dev/block/mmcblk0p5 /cache
# mount ext4 /dev/block/mmcblk0p6 /data
(7) 重新建立cpio归档以及uInitrd
$ pwd
rootfs
$ sudo find . | cpio -o -H newc | gzip > ../newinitrd.cpio.gz
516 blocks
$ cd ../
$ pwd
snowball-image
$ ls
boot newinitrd.cpio.gz system.tar.bz2 boot.tar.bz2 initrd.cpio.gz rootfs
startupfiles userdata.tar.bz2
$ mkimage -A arm -O linux -T ramdisk -C gzip -a 0 -e 0 -n initramfs -d ./newinitrd.cpio.gz ./uInitrd.new
(8) 创建的uInitrd.new替换原来老的uInitrd,然后创建新的boot.tar.bz2
$ ls boot/
cmdline u-boot.bin uImage uInitrd
$ cp uInitrd.new boot/uInitrd
$ rm boot.tar.bz2
$ tar cjf boot.tar.bz2 boot
(9) 在当前目录下下载镜像制作工具linaro-android-media-create
$ pwd
snowball-image
$ bzr branch lp:linaro-image-tools
$ ls
boot newinitrd.cpio.gz startupfiles system.tar.bz2 userdata.tar.bz2
boot.tar.bz2 initrd.cpio.gz rootfs startupfiles uInitrd.new
(10) 使用linaro-android-media-create创建镜像
$ sudo ./linaro-image-tools/linaro-android-media-create --image-file snowball-image --image-size 1500M --dev snowball_emmc --system system.tar.bz2 --userdata userdata.tar.bz2 --boot boot.tar.bz2
等镜像制作完毕,就可以使用riff -f命令烧写镜像了
sd卡烧写步骤:
(1) 编辑out目录下的init.rc文件,使从sd卡加载系统和数据分区
$ sed -i s/mmcblk0/mmcblk1/ out/target/product/snowball/root/init.rc
(2) 编译linaro-android-media-create需要的target
$ make systemtarball-nodeps userdatatarball-nodeps boottarball-nodeps
(3) 烧写到SD卡上
$ cd out/target/product/snowball/
$ linaro-android-media-create --mmc /dev/sdX --dev snowball_sd --boot boot.tar.bz2 --system system.tar.bz2 --userdata userdata.tar.bz2
(4) 烧写完加载boot分区,创建uInitrd
$ mkimage -A arm -O linux -T ramdisk -n "Android Ramdisk Image" -d ramdisk.img uInitrd拷贝到boot分区
(5) 在Android系统启动时中断uboot的执行,输入以下命令设置启动变量:
$ setenv sdboot "setenv bootargs 'cachepolicy=writealloc noinitrd init=init board_id=1 crashkernel=crashkernel=1M@0x5600000 logo.nologo startup_graphics=1 mpcore_wdt.mpcore_margin=359 loglevel=8 root=/dev/ram rw rootwait console=ttyAMA2,115200n8 mem=128M@0 mali.mali_mem=64M@128M mem=24M@192M hwmem=167M@216M mem_issw=1M@383M mem=640M@384M vmalloc=256M'; mmc rescan 1; fat load mmc 1:1 0x100000 /uImage; fat load mmc 1:1 0x5000000 /uInitrd; bootm 0x100000 0x5000000"
$ run sdboot