全志SOC的方案,他们的启动卡分区表采用的是MBR分区表。我们通过如下的制作过程可以看出一二。
从sunxi论坛上( http://linux-sunxi.org/Bootable_SD_card )来看全志方案的卡启动固件制作过程。首先看一下卡的存储分布图:
start size usage
0 8KB Unused, available for partition table etc.
8 24KB Initial SPL loader
32 512KB U-Boot
544 128KB environment
672 352KB reserved
1024 - Free for partitions
从这个分布图看,可以看到前8K空间保留用来放分区表。作为MBR分区方式,那么其实它的分区表只存在第一个扇区,也就是前512Byte中,所以这8K大部分空间是没有用到的。
真正的分区空间是从1M的位置开始,所以我们在使用sfdisk分区时,第一个分区起始地址应该为1M。保留了1M的空间给予上面这些特殊的需要。
对于在分区中的空间,是可以被我们的pc识别的,我们可以通过mount挂载相应的设备文件来直接拷贝进去,但是对于保留的这1M空间,我们只能使用dd命令配合seek选项来写入数据了。
首先我们清楚sd上的数据:
1.如果想清除前1M特殊用途的空间,如下所示:
dd if=/dev/zero of=${card} bs=1M count=1
2.如果只想清楚分区表,我们看到其实只保留了前1K的空间:
dd if=/dev/zero of=${card} bs=1k count=1023 seek=1
烧写spl bootloader,烧入到8K的地方:
dd if=spl/sunxi-spl.bin of=${card} bs=1024 seek=8
烧写uboot,烧入到32K的地方:
dd if=u-boot.bin of=${card} bs=1024 seek=32
SD卡分区:
sfdisk -R ${card}
cat <1,16,c
,,L
EOT
由此可见,分区空间是从1M开始算起的,1M到16M的空间作为boot分区。采用sfdisk为MBR分区,分区表如下所示:
/dev/sdb1 1 18 18 17019 c W95 FAT32 (LBA)
/dev/sdb2 19 1019 1001 946445+ 83 Linux
/dev/sdb3 0 - 0 0 0 Empty
/dev/sdb4 0 - 0 0 0 Empty
拷贝内核和内核配置到boot分区1,最新的内核配置应该已经改成dtb了。
mount ${card}${p}1 /mnt/
cp linux-sunxi/arch/arm/boot/uImage /mnt/
cp sunxi-boards/sys_config/a10/script.bin /mnt/
cp boot.scr /mnt/
cp uEnv.txt /mnt/
umount /mnt/
其中的boot.scr和uEnv.txt这两个是用来给uboot读取启动参数用的,script.bin是kernel中的配置项,类似dts的功能。
配置uboot的启动参数:
setenv bootargs console=ttyS0,115200 noinitrd root=/dev/mmcblk0p2 init=/sbin/init rootwait panic=10 ${extra}
fatload mmc 0 0x43000000 boot/script.bin
fatload mmc 0 0x48000000 boot/uImage
bootm 0x48000000
根据boot.cmd生成u-boot能够读取的boot.src文件
mkimage -C none -A arm -T script -d boot.cmd boot.scr
uEnv.txt的内容,用来读取boot.scr
bootenv=boot.scr
loaduimage=fatload mmc ${mmcdev} ${loadaddr} ${bootenv}
mmcboot=echo Running boot.scr script from mmc ...; source ${loadaddr}
制作rootfs,解压到分区2:
Using rootfs tarball
mount ${card}${p}2 /mnt/
tar -C /mnt/ -xjpf my-chosen-rootfs.tar.bz2
umount /mnt