首先分析u
-boot_movi
.bin的组成,看uboot的makefile对u-boot.bin的处理:
-
# Always append ALL so that arch config.mk's can add custom ones
-
ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND)
-
-
all: $(ALL)
-
-
$(obj)u-boot.hex: $(obj)u-boot
-
$(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@
-
-
$(obj)u-boot.srec: $(obj)u-boot
-
$(OBJCOPY) -O srec $< $@
-
-
$(obj)u-boot.bin: $(obj)u-boot
-
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
-
-
#$(obj)u-boot_nand.bin: $(obj)u-boot.bin //生成u-boot.nand.bin
-
@cp -f u-boot.bin u-boot_nand.bin
-
chmod 777 u-boot_nand.bin
-
-
#$(obj)u-boot_movi.bin: $(obj)u-boot.bin
-
# padding to 512k the u-boot.bin
-
@cat u-boot.bin > u-boot-2x.bin
-
@cat u-boot.bin >> u-boot-2x.bin //合并2个u-boot.bin为 u-boot-2x.bin
-
@split -d -a 1 -b 512k u-boot-2x.bin u-boot-512k.bin//从u-boot-2x.bin分离出前512K,实际上= u-boot.bin + BL1,得到u-boot-512k.bin0
-
-
# spiliting u-boot for BL1 (8kb)
-
@split -d -a 2 -b 8k u-boot.bin u-boot-8k.bin //取出BL1,得到u-boot-8k.bin00
-
-
# creating empty env space (16kb)
-
# @dd if=/dev/zero of=empty.env bs=16384 count=1 2> /dev/null //16K空白的env
-
-
# merging the bl1 and env with padded 512k binary
-
# @cat empty.env >> u-boot-512k.bin0 //env追加到u-boot-512k.bin0,这句被屏蔽了,无效
-
@cat u-boot-8k.bin00 >> u-boot-512k.bin0 //BL1(8k)追加到u-boot-512k.bin0
-
-
# renaming and change mode
-
@mv u-boot-512k.bin0 u-boot_movi.bin //u-boot-512k.bin0改名为u-boot_movi.bin
-
chmod 777 u-boot_movi.bin
-
-
# removing temp files
-
@rm -f u-boot-8k*
-
@rm -f u-boot-512k*
-
@rm -f u-boot-2x*.bin
-
# @rm -f empty.env
-
-
$(obj)u-boot_movi_256K.bin: $(obj)u-boot.bin
-
# padding to 512k the u-boot.bin
-
@cat u-boot.bin >> u-boot-2x.bin
-
@cat u-boot.bin >> u-boot-2x.bin
-
@split -d -a 1 -b 256k u-boot-2x.bin u-boot-512k.bin
-
-
# spiliting u-boot for BL1 (8kb)
-
@split -d -a 2 -b 8k u-boot.bin u-boot-8k.bin
-
-
# creating empty env space (16kb)
-
# @dd if=/dev/zero of=empty.env bs=16384 count=1 2> /dev/null
-
-
# merging the bl1 and env with padded 512k binary
-
# @cat empty.env >> u-boot-512k.bin0
-
@cat u-boot-8k.bin00 >> u-boot-512k.bin0
-
-
# renaming and change mode
-
@mv u-boot-512k.bin0 u-boot_movi.bin
-
chmod 777 u-boot_movi.bin
-
-
# removing temp files
-
@rm -f u-boot-8k*
-
@rm -f u-boot-512k*
-
@rm -f u-boot-2x*.bin
-
# @rm -f empty.env
所以u-boot_movi.bin 的内容实际上为u-boot.bin(512K) + BL1(8K)
按照2416的要求
对于SD卡,uboot 的布局应该是BL2 + BL1(8K) + res(1K)。BL1的块位置为LAST - 18,按起始扇区从0计数则为totalblk - 18。那么u-boot_movi.bin的BL1前面还有u-boot-512k.bin,共(1024个blk),所以u-boot_movi.bin的块位置应为totalblk - 18 - 1024
对于SDHC卡,uboot 的布局应该是BL2 + BL1(8K) + res(513K)。BL1的块位置为LAST - 1042。按起始扇区从0计数则为totalblk - 1042。u-boot_movi.bin的BL1前面还有u-boot-512k.bin,共(1024个blk),所以u-boot_movi.bin的块位置应为totalblk - 1042 - 1024
知道了烧写的位置,编写脚本就很简单了,不过我写的脚本还不是很完善,有空再加上格式化SD卡的功能,因为AM335对有MBR的SD卡不支持,当我制作335的SD启动卡时就要对卡进行特殊格式化,去除MBR,回到2416又要恢复MBR,有空再修复335uboot的这个bug。
这里有个小技巧,如何获得SD卡总扇区?我想到2种方法,推荐第一种使用截取变量的方法,因为第二种用到的sed是外部命令,严格来讲执行效率较低。
首先要知道,/proc/partitions和fdisk -l显示的blocks都是以KBytes为单位的。扇区=blocks*2
第一种方法,使用截取变量:
#!/bin/bash
input="255 heads, 63 sectors/track, 10443 cylinders, total 167772160 sectors"
output=`echo ${input#*total} | awk '{print $1}'`
echo $output
第二种,使用sed,将total 之前的所有字符替换为空白:
input="255 heads, 63 sectors/track, 10443 cylinders, total 167772160 sectors"
echo $input | sed -e 's/.*total \(.*\) sectors/\1/'
或者使用扩展正则ERE: echo $input | sed -r -e 's/.*total (.*) sectors/\1/'
echo "255 heads, 63 sectors/track, 10443 cylinders, total 167772160 sectors" | sed -r -n 's/.*total (.*) sectors/\1/'p
注意-r一定要在-e的前面,因为后面的替换操作是-e选项执行的。
2015.10.21:
获取总扇区数的第三种方法(绝对准确):
由于fdisk-l会因为采用中文导致total变为中文的“总容量”,因为读取/proc/partitions才是最准确的:
NUM_OF_TOLAL_SECTORS=`cat /proc/partitions | grep -v $ROOTDRIVE | grep '\\|\' | grep -n '' | grep "${DEVICEDRIVENUMBER}:" | awk '{print $4}'`*2 | bc
其中 $ROOTDRIVE=sda ${DEVICEDRIVENUMBER}=1
注意shell解释器务必选择#!/bin/bash,否则有些命令会报错误,如echo -e, [ ] 等等
阅读(2079) | 评论(0) | 转发(0) |