以下内容源于网络资源的学习与整理,如有其侵权请告知删除。
参考博客
uboot分析:SD卡镜像制作脚本分析 - 走看看
如何烧写u-boot到SD卡
S5PV210 Uboot开发与移植01:Uboot概述(推荐)
一、sd_fusing文件夹简介
1、文件夹的内容
这个文件夹在三星版本的uboot中,主要工作是将uboot镜像文件烧写至SD卡。
root@ubuntu:/home/xjh/iot/embedded_basic/uboot/uboot_jiuding/sd_fusing# ls C110-EVT1-mkbl1.c Makefile sd_fusing2.sh c110.signedBL1_bin sd_fdisk.c sd_fusing.sh root@ubuntu:/home/xjh/iot/embedded_basic/uboot/uboot_jiuding/sd_fusing#
(1)C110-EVT1-mkbl1.c文件,负责将uboot前8K的分离出来形成BL1。
(2)c110.signedBL1_bin文件,在sd_fusing2.sh文件中被调用,由下面代码可知它属于某种情形下的BL1。
#################################### #<BL1 fusing> signed_bl1_position=1 bl2_position=9 uboot_position=57 echo "BL1 fusing" dd iflag=dsync oflag=dsync if=c110.signedBL1_bin of=$1 seek=$signed_bl1_position
(3)Makefile文件,是编译文件。
(4)sd_fdisk.c文件,负责将sd卡进行分区。
(5)sd_fusing2.sh文件,很少使用这个文件,一般用sd_fusing.sh文件。
(7)sd_fusing.sh文件,将BL1、uboot.bin文件下载到sd卡。
2、文件夹的使用方法
(1)首先要完成uboot编译。
(2)接着进入sd_fusing目录,执行make clean,然后make。
(3)最后执行烧写,即“./sd_fusing.sh /dev/sdb”。
可知,$0=./sd_fusing.sh,$1=/dev/sdb,$#=1($#表示参数的个数)。
二、分析sd_fusing.sh文件
该文件内容见链接百度网盘。在分析这个文件前先掌握以下内容。
1、dd命令的用法
见博客:dd命令:用于读取、转换并输出数据_天糊土的博客-CSDN博客
2、mount与umount命令的用法
见博客:
3、fopen函数的用法
见博客:C语言fopen函数的用法,C语言打开文件详解
4、分析sd_fusing.sh代码
(1)对sd卡进行分区
sd_fusing.sh调用sd_fdisk.c(这个文件创建了sd_mbr.dat文件)对sd卡进行分区,并将分区信息(即MBR)存储在mmc的第0扇区。内核在初始化mmc设备时,通过读取MBR即可得知mmc设备的分区信息。
#################################### # make partition echo "make sd card partition" echo "./sd_fdisk $1" ./sd_fdisk $1 #调用sd_fdisk工具对sd卡进行分区,并生成sd_mbr.dat文件 #将sd_mbr.dat文件(即MBR)写进sd卡0扇区 dd iflag=dsync oflag=dsync if=sd_mbr.dat of=$1 rm sd_mbr.dat
(2)烧写BL1和uboot到sd卡对应的位置
如何将BL1、uboot烧写至sd卡对应的位置?为什么是1和49?利用dd命令进行对块设备的烧写。三星规定BL1必须放在第1个 block开始的区域,而49可以变为其他合适的
#################################### #<BL1 fusing> bl1_position=1 # 三星规定BL1存放SD卡中第1个扇区(这里扇区编号从0开始) uboot_position=49 # 整个uboot放在合适的位置即可,这里放在SD卡的第49扇区echo "BL1 fusing" ./mkbl1 ../uboot_inand.bin SD-bl1-8k.bin 8192 dd iflag=dsync oflag=dsync if=SD-bl1-8k.bin of=$1 seek=$bl1_position rm SD-bl1-8k.bin#################################### #<u-boot fusing> echo "u-boot fusing" dd iflag=dsync oflag=dsync if=../uboot_inand.bin of=$1 seek=$uboot_position
(3)完整代码分析
sd_fusing.sh脚本的主要作用是在SD卡内创建一个fat32分区,然后将uboot的BL1和整个uboot烧录进SD卡中。
#定义SD卡设备,应该根据实际的设备信息进行修改 reader_type1="/dev/sdb" reader_type2="/dev/mmcblk0"#如果没有参数,则显示帮助信息 if [ -z $1 ] thenecho "usage: ./sd_fusing.sh <SD Reader's device file>"exit 0 fi#判断SD卡的设备类型,然后定义四个分区 if [ $1 = $reader_type1 ] then partition1="$11" # $1=/dev/sdb,所以partition1=/dev/sdb1partition2="$12"partition3="$13"partition4="$14"elif [ $1 = $reader_type2 ] then partition1="$1p1"partition2="$1p2"partition3="$1p3"partition4="$1p4"else #不能识别SD卡设备echo "Unsupported SD reader"exit 0 fi#判断设备是否存在,且是否是块设备 if [ -b $1 ] thenecho "$1 reader is identified." elseecho "$1 is NOT identified."exit 0 fi#################################### # make partition,开始进行SD卡分区 echo "make sd card partition" echo "./sd_fdisk $1" #调用sd_fdisk工具对sd卡进行分区,并生成sd_mbr.dat文件 ./sd_fdisk $1 #将sd_mbr.dat文件(即MBR)写进sd卡0扇区 dd iflag=dsync oflag=dsync if=sd_mbr.dat of=$1 rm sd_mbr.dat#################################### # format,以下是什么意思? umount $partition1 2> /dev/null umount $partition2 2> /dev/null umount $partition3 2> /dev/null umount $partition4 2> /dev/nullecho "mkfs.vfat -F 32 $partition1" mkfs.vfat -F 32 $partition1 #建立一个fat32分区,即sdb1#echo "mkfs.ext2 $partition2" #mkfs.ext2 $partition2 #echo "mkfs.ext2 $partition3" #mkfs.ext2 $partition3 #echo "mkfs.ext2 $partition4" #mkfs.ext2 $partition4 #################################### # mount #umount /media/sd 2> /dev/null #mkdir -p /media/sd #echo "mount -t vfat $partition1 /media/sd" #mount -t vfat $partition1 /media/sd#################################### #<BL1 fusing> bl1_position=1 #定义uboot的扇区位置 uboot_position=49#将uboot的BL1(前8K)和uboot的校验和(uboot的前16字节)烧录进SD卡的1扇区 echo "BL1 fusing" ./mkbl1 ../uboot_inand.bin SD-bl1-8k.bin 8192 dd iflag=dsync oflag=dsync if=SD-bl1-8k.bin of=$1 seek=$bl1_position #烧录 rm SD-bl1-8k.bin#将整个uboot烧录进SD卡的uboot_position=49扇区 #<u-boot fusing> echo "u-boot fusing" dd iflag=dsync oflag=dsync if=../uboot_inand.bin of=$1 seek=$uboot_position#烧录成功信息提示 #<Message Display> echo "U-boot image is fused successfully." echo "Eject SD card and insert it again."
三、 分析sd_fdisk.c文件
sd_fdisk.c文件(编译得到sd_fdisk)用来生成分区表。它是如何对sd卡进行分区的?
见博客:uboot中sd_fdisk.c分析_天炜的博客-CSDN博客
见博客:S5PV210 Uboot开发与移植01:Uboot概述_麦兜的学习笔记的博客-CSDN博客
(1)仔细分析发现这个sd_fdisk.c里面只是给SD卡制作了一个10M的fat32分区,导致后面缺少一些system.img等镜像时,还要在uboot里面执行“fdisk -c 0”来再次做一次分区,这是否多此一举呢?一次性sd_fdisk.c里面分好区不好吗?
(2)之所以要制作fat32分区,是因为dd命令?
四、分析C110-EVT1-mkbl1.c文件
(1)该文件的作用是什么?
与mkv210_image.c功能一致,用于读取uboot.bin的前8KB并计算其校验和,构成BL1。
(2)为什么是复制8k?
复制8k,是因为8k的代码能够完成必要的工作了,尽管可以复制更多,但没必要。
(3)8k中必须完成什么任务?
uboot的前8K代码肯定要完成重定位,因为BL1和BL2的链接地址不同,比如BL1的链接地址为0xd0020010,BL2链接地址为0x23e00000。见博文汇编阶段的start.S文件讲述的uboot的重定位。
更多具体内容,见博客S5PV210 Uboot开发与移植01:Uboot概述。