linux的shell脚本和dd命令把镜像文件写到SD卡上

本来打算做的是
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 <<END
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 <<END
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的情况,会发生什么?


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值