本来是想在IMX6ULL板卡上实现u-boot中显示开机logo的功能的,过程中就牵扯出了这几个问题。大概的缘由是修改了u-boot后,想在系统中直接对EMMC中u-boot进行更新,就不用通过SD卡或USB重新烧写了;在更新的时候,又需要知道u-boot、logo图片存放在EMMC中的具体位置,所以就有了下面这3个问题问题,本文主要针对第3个问题摸索的过程记录
1、u-boot中如何添加开机logo
2、如何在系统中更新u-boot、zImage、dtb
3、EMMC是如何分区的
一、EMMC分区
1、分区
对于I.MAX6U来说,烧写过Linux系统的SD卡或EMMC会分为三个分区:
第0分区:存放uboot,没有文件系统
第1分区:存放系统镜像(zImage)、设备树(.dtb),采用的是FAT格式
第2分区:存放的系统的根文件系统,采用的是EXT4格式
所以更新uboot是从第0分区开始的。可以通过下面指令查看EMMC的分区:
mmc dev 1 //切换到EMMC
mmc part //查看emmc的分区情况。会发现第0个分区识别不出来,是因为第0分区没有格式化,实际上第0个分区是存在的
烧过系统的EMMC分区如下:
可见EMMC的分区是这样的
分区/存放内容 | 开始扇区/起始地址 | 扇区数据/大小 |
0/uboot | 0 | 10MByte |
1/镜像、设备树 | 20480 / 10MByte | 1024000 / 500M |
2/rootfs | 1228800 / 600Myte | 14041088 / 6856M(6G) |
可以通过下面指令查看EMMC分区里的内容:
//查看EMMC设备分区1的内容,因为该分区是FAT的,所有需要使用fat相关的命令
fatinfo mmc 1:1
2、分区的起始地址和大小
现在只是知道了EMMC有3个分区,但是这3个分区的起始地址和大小是怎么设置的,能不能修改?要想搞清楚,就得先弄清楚谁是第一个对EMMC进行分区操作的,那就是mfgtool工具,所以从mfgtool工具的.vbs烧写脚本中应该就能找到答案。mfgtool烧写原理不在这里赘述,大概的一个调用过程是 :xxx.vbs ---> MfgTool2.exe ---> \Profiles\Linux\OS Firmware\ucl2.xml。打开ucl2.xml配置
可以看出来,是调用了 mksdcard.sh脚本对 /dev/mmcblk1 设备进行了分区,该脚本就在同级目录下:
该脚本是个tar的压缩包,解压缩后打后内容如下
#!/bin/sh
# partition size in MB
BOOT_ROM_SIZE=10
# wait for the SD/MMC device node ready
while [ ! -e $1 ]
do
sleep 1
echo “wait for $1 appear”
done
# call sfdisk to create partition table
# destroy the partition table
node=$1
dd if=/dev/zero of=${node} bs=1024 count=1
sfdisk --force ${node} << EOF
${BOOT_ROM_SIZE}M,500M,0c
600M,,83
EOF
第15行,node=/dev/mmcblk1
第18行,调用sfdisk硬盘分区工具程序,对 /dev/mmcblk1进行分区,命令介绍
第19行,0C 表示windows FAT分区,83表示LINUX分区。表示从EMMC的10M位置到500M位置为第一分区,至于前面的10M作用,估计是存放UBOOT部分,而第一分区在我开发板上存放kernel和dtb的。
第20行,表示的是从600M 以后的所有内存都为第二分区,也就是存放rootfs
分析后发现这里的空间分配跟在uboot中查看的分区情况是一致的。所以如果要想修改EMMC中各分区的起始地址和大小,或是增加新的分区,只需要修改mksdcard.sh 脚本,按照 {始地址,结束地址,分区类型} 的格式添加即可,注意要添加单位M,不然分配的内容就不对了。
二、测试验证
1、将rootfs改为1G大小,之后的空间用来存放数据
sfdisk --force ${node} << EOF
${BOOT_ROM_SIZE}M,500M,0c //分配了490M,存放kernel 、dtb
600M,1624M,83 //分配了1024M,存放rootfs
1624M,,83 //之后的空间都用作存放 appdata
EOF
2、制作并替换调原来的mksdcard.sh.tar
3、通过mfgtool重新烧写系统后,在u-boot中可查看分区情况。可以发现已经多增加了一个分区