flash写失败分析
记一次产测写flash失败的问题,记录flash相关操作,供以后参考
#查看分区表 #查看分区数据 #分区拷贝指令 #flash擦除
现象:
产线写产测信息失败,研发自测正常
怀疑方向:
1、flash出厂异常
2、flash被写如异常
分析手段:
1、查看分区表,找到对应分区,产测使用的是mtd8
cat /proc/mtd
dev: size erasesize name
mtd0: 00040000 00008000 "boot"
......
mtd8: 00010000 00008000 "factory"
2、使用hexdump查看分区是否有异常数据。
一般空Flash的存储单元默认值为全1(即0xFF),如果出现连续0的情况,可能 是flash出厂有问题,或者贴片烧录器异常导致的。
hexdump /dev/mtd8
0000000 6544 6976 6563 614e 656d 383d 4b36 524d
0000010 5135 3431 3135 3031 3030 3131 0a35 7250
0000020 646f 6375 4b74 7965 653d 6339 3464 3135
0000030 3864 3234 0a66 6544 6976 6563 6553 7263
0000040 7465 633d 3262 6239 3063 3833 3463 6338
0000050 6364 3334 3766 3735 6466 3631 3730 6635
0000060 3234 ff34 ffff ffff ffff ffff ffff ffff
0000070 ffff ffff ffff ffff ffff ffff ffff ffff
*
0010000注:前面非0数据为已写入数据
从hexdump来看不存在连续为0的情况(之前遇到过NAND Flash出现过)
3、将工厂设备flash分区拷出来,写到研发设备分析
拷贝到SD卡命令:
dd if=/dev/mtd8 of=/mnt/sdcard/mtd_bk.bin
128+0 records in
128+0 records out
65536 bytes (64.0KB) copied, 0.027574 seconds, 2.3MB/s写入命令(注意是mtdblock8):
dd if=/mnt/sdcard/mtd8_backup.bin of=/dev/mtdblock8
128+0 records in
128+0 records out
65536 bytes (64.0KB) copied, 0.243274 seconds, 263.1KB/stips:因为Flash写入前必须擦除,写入mtdblock8(块设备)会自动触发擦除。而mtd8为字符设备,需要手动擦除,否则写入不会生效。所以写入使用mtdblock8。
4、编写产测指令,查看flash写入失败原因,以及附近数据内容
mtd_api_read read factory from 0 size 32768 limit 65536 success
erasesize:32768
data corrupted :err :1, key:DeviceModel=XXX基站▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
发现DeviceModel后带中文,且中文 后面数据异常,结合中文通常字节计算会异常,可以推断原因如此。
5、擦除分区,重新写产测
flash_eraseall /dev/mtd8
擦除重写产测正常
6、工厂排除操作,确认有工位写入了中文