dd 之前必须 flash_eraseall 一下

本文揭示了在使用dd或nandwrite写入MTD设备时,为何在写入前必须进行擦除操作。通过实例解释了未擦除可能导致的写入错误,并强调了在MTD设备上执行擦除的重要性,确保数据覆盖的完全性和准确性。

用dd或nandwrite写入mtd 设备(/dev/mtd*)之前,必须flash_erase 或flash_eraseall 一次,要不然会写不正确。

之前一直以为dd 只要大小制定了,肯定会全部覆盖写入的. 但事实证明, 有些要写入的image中FF的地方,如果 mtd分区上不是FF的,就不会写入,而是会保留在那.

所以写入之前一定要擦除 一次。

#!/bin/sh echo 'image_recovery.sh' SUCCESS=0 FAILURE=1 ERROR=2 RETURNDATA=$SUCCESS FSBL_DEV=/dev/mtd0 UBOOT_DEV=/dev/mtd1 UBOOT_BAK_DEV=/dev/mtd2 FSBL_SW_WP=/sys/class/mtd/mtd0/software_wp UBOOT_SW_WP=/sys/class/mtd/mtd1/software_wp UBOOT_BAK_SW_WP=/sys/class/mtd/mtd2/software_wp # check first run if [ ! -f /mnt/update/image_checked ]; then data=`dd if=$FSBL_DEV bs=8 count=1 status=none |xxd -p` if [ $data != "ffffffffffffffff" ]; then echo "Backup fsbl and uboot image" [ -f $UBOOT_BAK_SW_WP ] && echo 0 > $UBOOT_BAK_SW_WP flash_eraseall $UBOOT_BAK_DEV dd if=$FSBL_DEV of=$UBOOT_BAK_DEV bs=2048 count=128 dd if=$UBOOT_DEV of=$UBOOT_BAK_DEV bs=2048 seek=128 count=576 sync [ -f $UBOOT_BAK_SW_WP ] && echo 1 > $UBOOT_BAK_SW_WP fi touch /mnt/update/image_checked fi # check/recover fsbl image mtd_need_rec=0 mtd_bak_need_rec=0 data=`dd if=$FSBL_DEV bs=8 count=1 status=none |xxd -p` if [ $data == "ffffffffffffffff" ]; then mtd_need_rec=1 fi data=`dd if=$UBOOT_BAK_DEV bs=8 count=1 status=none |xxd -p` if [ $data == "ffffffffffffffff" ]; then mtd_bak_need_rec=1 fi if [ $mtd_need_rec == 0 ] && [ $mtd_bak_need_rec == 1 ]; then echo "Recover image fsbl_bak from fsbl!" dd if=$UBOOT_BAK_DEV of=/tmp/image_cache bs=2048 skip=128 count=576 #backup uboot_bak [ -f $UBOOT_BAK_SW_WP ] && echo 0 > $UBOOT_BAK_SW_WP flash_eraseall $UBOOT_BAK_DEV dd if=$FSBL_DEV of=$UBOOT_BAK_DEV bs=2048 count=128 dd if=/tmp/image_cache of=$UBOOT_BAK_DEV bs=2048 seek=128 count=576 sync [ -f $UBOOT_BAK_SW_WP ] && echo 1 > $UBOOT_BAK_SW_WP rm /tmp/image_cache elif [ $mtd_need_rec == 1 ] && [ $mtd_bak_need_rec == 0 ]; then echo "Recover image fsbl from fsbl_bak!" [ -f $FSBL_SW_WP ] && echo 0 > $FSBL_SW_WP flash_eraseall $FSBL_DEV dd if=$UBOOT_BAK_DEV of=$FSBL_DEV bs=2048 count=128 sync [ -f $FSBL_SW_WP ] && echo 1 > $FSBL_SW_WP elif [ $mtd_need_rec == 1 ] && [ $mtd_bak_need_rec == 1 ]; then echo "Both fsbl and fsbl_bak images are broken!" fi # check/recover u-boot image mtd_need_rec=0 mtd_bak_need_rec=0 data=`dd if=$UBOOT_DEV bs=8 count=1 status=none |xxd -p` if [ $data == "ffffffffffffffff" ]; then mtd_need_rec=1 fi data=`dd if=$UBOOT_BAK_DEV bs=8 skip=32768 count=1 status=none |xxd -p` if [ $data == "ffffffffffffffff" ]; then mtd_bak_need_rec=1 fi if [ $mtd_need_rec == 0 ] && [ $mtd_bak_need_rec == 1 ]; then echo "Recover image uboot_bak from uboot!" dd if=$UBOOT_BAK_DEV of=/tmp/image_cache bs=2048 count=128 #backup fsbl_bak [ -f $UBOOT_BAK_SW_WP ] && echo 0 > $UBOOT_BAK_SW_WP flash_eraseall $UBOOT_BAK_DEV dd if=$UBOOT_DEV of=$UBOOT_BAK_DEV bs=2048 seek=128 count=576 dd if=/tmp/image_cache of=$UBOOT_BAK_DEV bs=2048 count=128 sync [ -f $UBOOT_BAK_SW_WP ] && echo 1 > $UBOOT_BAK_SW_WP rm /tmp/image_cache elif [ $mtd_need_rec == 1 ] && [ $mtd_bak_need_rec == 0 ]; then echo "Recover image uboot from uboot_bak!" [ -f $UBOOT_SW_WP ] && echo 0 > $UBOOT_SW_WP flash_eraseall $UBOOT_DEV dd if=$UBOOT_BAK_DEV of=$UBOOT_DEV bs=2048 skip=128 count=576 sync [ -f $UBOOT_SW_WP ] && echo 1 > $UBOOT_SW_WP elif [ $mtd_need_rec == 1 ] && [ $mtd_bak_need_rec == 1 ]; then echo "Both uboot and uboot_bak images are broken!" fi exit $RETURNDATA这个shell脚本里面各行是啥意思
08-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值