海思Hi35xx 通过uboot查看flash指定地址的数据
前言
在实际应用中有遇到过设备放置一段时间后设备不能启动的问题,uboot 完全没有响应,类似于flash中的数据被擦洗掉一样。
网上有介绍说是nandflash 不稳定,高温或是静电会导致nand flash 的比特位反转的问题,反转的少了,controller内部的ECC会将数据纠正,反转的多了超过纠错能力,就没有办法正确读取数据,这个在高温的时候比较明显。
在海思平台上,可以通过这样的一种方式来查看是否flash中的数据发生了数据位的反转或是数据错误:
- 用海思自带的HiTool工具,烧入一个uboot到ddr,也就是烧入到内存,让uboot从内存中启动。
- 在uboot中去读取flash指定地址的数据,把数据显示出来。
- 对比读取出来的数据与原来数据是否相等。
具体步骤如下:
-
烧入Uboot到内存,uboot从内存中启动:
-
擦除内存的一段地址,用来存放flash 数据:
将内存0x82000000 地址开始的1M 空间全部填写数据0xFF
mw.b 0x82000000 ff 100000;
- 读取flash指定地址的数据:
从flash 0地址开始的位置读取0x100000(1M)的数据到内存地址0x82000000
nand read 0x82000000 0 0x100000
- uboot显示读取到的flash数据:
md命令是memory display的缩写,显示内存地址为0x82000000 开始的0x100 个32位的数据,也就是1K数据
md 0x82000000 100
显示内容如下:
Wisdom # md 0x82000000 100
82000000: ea000517 e59ff014 e59ff014 e59ff014 ................
82000010: e59ff014 e59ff014 e59ff014 e59ff014 ................
82000020: 808016a0 80801700 80801760 808017c0 ........`.......
82000030: 80801820 80801880 808018e0 12345678 ...........xV4.
82000040: 12040050 00000000 00000000 000000fd P...............
82000050: 12040054 00000000 00000000 00fd0000 T...............
82000060: 00000000 00000000 00000064 00000000 ........d.......
82000070: 12040000 12000000 00000000 000000fd ................
82000080: 12040004 010060fa 00000000 000000fd .....`..........
82000090: 12040198 00000006 00000000 00000015 ................
820000a0: 12040030 12000000 00000000 000000fd 0...............
820000b0: 12040034 000060e9 00000000 000000fd 4....`..........
820000c0: 12040198 00000049 00000000 00001845 ....I.......E...
820000d0: 12040198 00000001 00000000 0000000d ................
820000e0: 12040198 00000000 00000000 00001005 ................
820000f0: 12040158 000000ff 00000000 003d0000 X.............=.
82000100: 10000008 00000002 00000000 0000401d .............@..
82000110: 12040050 0001ff7c 00000000 0000008d P...|...........
82000120: 12040054 0001ff7c 00000000 008d0000 T...|...........
82000130: 00000000 00000000 000001f4 00000000 ................
82000140: 1204014c 00000003 00000000 0000280d L............(..
82000150: 1204014c 00000003 00000000 0000680d L............h..
82000160: 12040148 00000001 00000000 0000100d H...............
82000170: 12050090 ffffffff 00000000 000000fd ................
82000180: 12050094 b17391c9 00000000 000000fd ......s.........
82000190: 12050098 00000000 00000000 000000fd ................
820001a0: 120500a0 000017ff 00000000 000000fd ................
820001b0: 120e0000 000000c7 00000000 000000fd ................
820001c0: 120e0004 000000c7 00000000 000000fd ................
820001d0: 120e0010 00000005 00000000 0000001d ................
820001e0: 00000000 00000000 00e4e1c0 00000000 ................
820001f0: 12110100 00001580 00000000 000000fd ................
82000200: 12110104 71050024 00000000 000000fd ....$..q........
82000210: 12118040 00002401 00000000 000000fd @....$..........
82000220: 12118050 00c10a16 00000000 000000fd P...............
82000230: 12118060 00000142 00000000 000000fd `...B...........
82000240: 12118048 00000000 00000000 000000fd H...............
82000250: 12118058 00000000 00000000 000000fd X...............
82000260: 12118100 34421a12 00000000 000000fd ......B4........
82000270: 12118104 4144b48d 00000000 000000fd ......DA........
82000280: 12118108 540110dd 00000000 000000fd .......T........
82000290: 1211810c 57896724 00000000 000000fd ....$g.W........
820002a0: 12118110 00800000 00000000 000000fd ................
820002b0: 12118114 00041308 00000000 000000fd ................
820002c0: 12118118 00000066 00000000 000000fd ....f...........
820002d0: 121180a0 00000001 00000000 000000fd ................
820002e0: 12118200 000f0000 00000000 000000fd ................
820002f0: 121184cc 00000000 00000000 000000fd ................
82000300: 1211c01c 5dc00080 00000000 000000fd .......]........
82000310: 1211c010 000a00c0 00000000 000000fd ................
82000320: 1211c014 f000f000 00000000 000000fd ................
82000330: 1211c030 34892221 00000000 000000fd 0...!".4........
82000340: 1211c034 168d1285 00000000 000000fd 4...............
82000350: 1211c038 20082208 00000000 000000fd 8....". ........
82000360: 1211c03c 0000052c 00000000 000000fd <...,...........
82000370: 1211c040 4034657c 00000000 000000fd @...|e4@........
82000380: 1211c0bc 00000009 00000000 000000fd ................
82000390: 1211c064 00061014 00000000 000000fd d...............
820003a0: 1211c068 00000020 00000000 000000fd h... ...........
820003b0: 1211c074 00000000 00000000 000000fd t...............
820003c0: 1211c070 00000908 00000000 000000fd p...............
820003d0: 1211c084 0010410a 00000000 000000fd .....A..........
820003e0: 1211d208 0002ff00 00000000 000000fd ................
820003f0: 1211d308 0002ff00 00000000 000000fd ................
Wisdom #
- 查看原烧入flash 0地址文件的数据
原来烧入进去的数据为:
- 数据对比:
这里只对比0x0000~0x000地址的数据,也就是第一行的数据,其它以此类推:
uboot中读取到内存中并显示出来的数据是:
82000000: ea000517 e59ff014 e59ff014 e59ff014 ................
实际flash中应该的数据是:
这里需要注意一下大小端的问题,uboot中显示出来的数据与在Windows中用UltraEdit工具查看的大小端刚好是反了。从这里我们可以看出,我们的第一行数据是一样的,没有发送反转。
如果要对比整块的内存数据,可以使用uboot的 cmp 命令进行对比,这里不再介绍。
![](https://img2023.cnblogs.com/blog/555985/202212/555985-20221229171054114-894213487.jpg)