本来打算做的是
1 用moviNAND_Fusing_Tool.exe工具,把镜像烧写到SD卡指定位置。
2 启动到uboot命令行,用movi命令从SD卡指定位置读取。
但是moviNAND_Fusing_Tool.exe报错,linux内核zImage只有1M多点,文件太小还写不了,1M很小么,莫名其妙。
想到linux下应该也有类似工具,换个工具可能就好使了。
上网找了个脚本,烧bootloader到SD卡,原来用的就是dd命令,我就模仿一下
#!/bin/sh
# 设置为命令出错就退出脚本,可以少写几个exit
set -e
usage()
{
cat <
Usage1: $0 DEVICE IMAGE OFFSET SIZE
write IMAGE to DEVICE with OFFSET and SIZE in bytes
Usage2: $0 DEVICE
show DEVICE size in bytes
END
exit $1
}
# 测试命令行参数大于0
test "$#" -gt 0 || usage 0
# True if the length of String is nonzero.
device="$1"
test -n "$device" || usage 1
# 利用linux /sys下的接口,获得SD卡的大小
if [ "$#" = 1 ]; then
cat /sys/block/"$(basename "$device")"/size
exit 0
fi
image="$2"
test -n "$image" || usage 1
offset="$3"
size="$4"
# 计算加减乘除,得用expr命令
# 奇怪的是给变量赋值的=两边不能有空格,count=后面我加了一个空格,结果报错了
bs=512
count=`expr "$size" "/" "$bs"`
echo "===== writting $image to $device ====="
# dd命令是无所不能的
dd if="$image" of="$device" bs=$bs \
seek=$offset count=$count
echo "===== done! ====="
怕以后忘了shell的意思,加了该死的注释。
moviNAND_Fusing_Tool.exe把镜像文件写到指定位置,貌似还有分区功能。
dd命令应该是依赖于驱动的,块设备驱动提供了读写SD卡上指定位置内容的功能,所以dd可以完成此功能,分区就不行了。
写SD卡OK了,但是板子和SD卡连接又不对劲了,那个排线需要异面的,我用刀把同面排线给刮开当异面的用,昨天还正常,今天又不行了!
12/13 设备OK了,脚本做了一些修改
修改后的脚本
#!/bin/sh
set -e
usage()
{
cat <
Usage1: $0 DEVICE IMAGE OFFSET SIZE
write IMAGE to DEVICE with OFFSET and SIZE in bytes
Usage2: $0 DEVICE
show DEVICE size in bytes
END
exit $1
}
test "$#" -gt 0 || usage 0
device="$1"
test -n "$device" || usage 1
if [ "$#" = 1 ]; then
cat /sys/block/"$(basename "$device")"/size
exit 0
fi
image="$2"
test -n "$image" || usage 1
# HEX 2 DEC
offset=`echo "obase=10;ibase=16;$3"|bc`
size=`echo "obase=10;ibase=16;$4"|bc`
bs=512
count=`expr "$size" "/" "$bs"`
seek=`expr "$offset" "/" "$bs"`
echo "===== writting $image to $device ====="
echo dd if="$image" of="$device" bs=$bs \
seek=$seek count=$count
dd if="$image" of="$device" bs=$bs \
seek=$seek count=$count
echo "===== done! ====="
主要修改
1 dd命令中,使用的是10进制,uboot命令中使用的是16进制,所以在shell中加一个进制转换,统一使用16进制,由脚本把16进制参数转化成10进制,再dd
2 dd命令的参数,seek表示输出设备的偏移,输入设备的偏移用skip,所以从SD卡读的脚本,/dev/sdb这样的设备就变成了输入设备,要用skip参数。
在uboot的命令行中,我把sector和byte搞混了,读出来数据总是不对大头,最后发现了。
在uboot的命令行中,要注意偏移是sector还是byte,哪个是16进制, 哪个是10进制, 搞不清就试一试。
让人抓狂的是, uboot命令行里的movi, 一条命令里既有sector又有byte, 既有10进制又有16进制.
例 movi read 3145728 300000 c0008000
问题:sector大小不是512的情况,会发生什么?