本帖最后由 jiuweiljp 于 2019-12-27 15:51 编辑
本文基本上抄至网络:
但命令在 wndr 4300 V1 原厂 uboot (AR9344)的机器上实现
引用博文Url:
https://blog.csdn.net/li_wen01/article/details/88918066
https://www.cnblogs.com/casey/archive/2013/04/17/3027139.html
https://blog.csdn.net/lifengxun20121019/article/details/8659291
--------------------------------------------------
uboot 支持nand flash的数据及oob数据的读写显示操作,也至此手动标记坏块的命令,当一般不建议手动修改flash的坏块标志。
这里介绍在uboot中操作和查看flash数据的常用命令及方法。
说明:
本文测试使用的flash信息如下:
- Atheros on-chip NAND FLash Controller Driver, Version 0.1 (c) 2010 Atheros Communications, Ltd.
- Ath Nand ID[87ff0178]: 2c:f1:80:95:02
- ONFI MICRON MT29F1G08ABADAWP
- Micron NAND 128MiB 3,3V 8-bit [128MB]
- ====== NAND Parameters ======
- sc = 0x87ff0158 bbt = 0x87f68008 bbt_size = 0x100 nf_ctrl = 0x344
- page = 0x800 block = 0x20000 oob = 0x40
- size = 128MB
- Setting 0xb8116290 to 0x20402d0f
复制代码
(1)、nand info 查看nandflash 信息
- ar7240> nand info
- Device 0: ath-nand, sector size 128 KiB
复制代码
(2)、nand device- ar7240> nand device
- Device 0: ath-nand
复制代码
(3)、nand read(.oob) [addr] [off] [size]
注:这条命令是将nand flash中的内容复制到内存中去
读取命令,这里是两条命令:
nand read [addr] [off] [size]
nand read.oob [addr] [off] [size]
不管是读取data, 使用nand read,还是读取oob,使用命令nand read.oob, 后面跟的地址addr,都是ram的地址,off:指的是nand flash的地址,
size:指要读取nand flash的数据大小, 但是如果是读取oob, size不能超过一个page的oob size, 如果page size为512个字节, oob size就是16个字节.
如果一次想读取完整的一个page 的值,包含oob, 使用下面将的命令, nand dump. (注意这条命令在 4300上无法实现)
- ar7240> nand read 0x81000000 0x0 0x1000
- NAND read: device 0 offset 0x0, size 4096 ... 4096 bytes read: OK
- ar7240> nand read.oob 0x81000000 0x0 0x1000
- NAND read: device 0 offset 0x0, size 4096 ... 4096 bytes read: OK
复制代码
注意:在4300的uboot中没有 nand read.oob这个命令,或者说这条命令不起作用,可以执行,但执行结果没有区别
- ar7240> mw.b 0x81000000 0xff 0x40000 (将RAM填充256K大小的FF)
- ar7240> nand read 0x81000000 0x1000 0x200 (读取nand 中0x1000 处大小为0x200 到ram)
- NAND read: device 0 offset 0x1000, size 512 ... 512 bytes read: OK
- ar7240> md.b 0x81000000 0x240 (显示RAM中的数据)
- 81000000: ae 22 00 00 00 60 f8 09 24 04 00 0a 8e 05 74 a8 ."...`..$.....t.
- 81000010: 36 43 00 08 24 02 00 33 ac 62 00 00 00 a0 f8 09 6C..$..3.b......
- 81000020: 24 04 00 64 8e 03 74 a8 24 02 00 01 ae 22 00 00 $..d..t.$...."..
- 81000030: 00 60 f8 09 24 04 00 0a 8e 03 74 a8 36 42 00 14 .`..$.....t.6B..
- 81000040: ac 5e 00 00 00 60 f8 09 24 04 00 64 36 42 00 1c .^...`..$..d6B..
- 81000050: ac 53 00 00 36 43 00 20 3c 04 b8 06 8c 42 00 00 .S..6C. <....B..
- 81000060: ac 73 00 00 34 82 00 90 8c 63 00 00 8c 42 00 00 .s..4....c...B..
- 81000070: 30 42 00 0f 10 40 00 05 34 82 00 b0 8c 42 00 00 0B...@..4....B..
- 81000080: 30 42 00 08 10 40 00 09 3c 11 bd 00 12 80 00 06 0B...@..<.......
- 81000090: 36 42 00 24 ac 53 00 00 36 43 00 28 8c 42 00 00 6B.$.S..6C.(.B..
- 810000a0: ac 73 00 00 8c 62 00 00 3c 11 bd 00 3c 10 b8 00 .s...b..<...<...
- 810000b0: 8e 23 74 a8 36 02 00 18 ac 56 00 00 00 60 f8 09 .#t.6....V...`..
- 810000c0: 24 04 00 64 8e 25 74 a8 3c 02 74 44 36 03 00 c4 $..d.%t.<.tD6...
- 810000d0: 34 42 44 44 ac 62 00 00 00 a0 f8 09 24 04 00 64 4BDD.b......$..d
- 810000e0: 8e 25 74 a8 36 03 00 c8 24 02 02 22 ac 62 00 00 .%t.6...$..".b..
- 810000f0: 00 a0 f8 09 24 04 00 64 8e 23 74 a8 3c 02 00 0f ....$..d.#t.<...
- 81000100: 34 42 ff ff 36 10 00 cc ae 02 00 00 00 60 f8 09 4B..6........`..
- 81000110: 24 04 00 64 8f bf 00 3c 02 80 10 21 8f be 00 38 $..d...<...!...8
- 81000120: 8f b7 00 34 8f b6 00 30 8f b5 00 2c 8f b4 00 28 ...4...0...,...(
- 81000130: 8f b3 00 24 8f b2 00 20 8f b1 00 1c 8f b0 00 18 ...$... ........
- 81000140: 03 e0 00 08 27 bd 00 40 27 bd ff e8 af bf 00 14 ....'..@'.......
- 81000150: 0f 40 13 21 24 04 42 70 3c 04 b8 06 34 86 00 1c .@.!$.Bp<...4...
- 81000160: 8c c3 00 00 00 40 40 21 3c 02 f7 ff 34 42 ff ff .....@@!<...4B..
- 81000170: 00 62 18 24 3c 07 b8 11 3c 02 63 3c 34 42 81 76 .b.[ DISCUZ_CODE_2408 ]lt;...<.c<4B.v
- 81000180: 34 e5 6c 40 ac c3 00 00 34 84 00 90 ac a2 00 00 4.l@....4.......
- 81000190: 8c 82 00 00 30 42 00 0f 10 40 00 06 34 e3 6c 44 ....0B...@..4.lD
- 810001a0: 24 02 00 02 55 02 00 04 3c 02 10 38 0b 40 14 6a $...U...<..8.@.j
- 810001b0: 3c 02 10 00 3c 02 10 38 ac 62 00 00 0f 40 12 c9 <...<..8.b...@..
- 810001c0: 00 00 00 00 3c 04 b8 06 34 85 00 1c 8c a2 00 00 ....<...4.......
- 810001d0: 24 03 cf ff 34 84 00 b0 00 43 10 24 ac a2 00 00 $...4....C.$....
- 810001e0: 8c 82 00 00 30 42 00 10 14 40 00 04 3c 02 b8 05 ....0B...@..<...
- 810001f0: 34 42 00 24 0b 40 14 7d 24 03 02 71 34 42 00 24 4B.$.@.}$..q4B.$
- 81000200: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
- 81000210: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
- 81000220: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
- ar7240> mw.b 0x81000000 0xff 0x40000
- ar7240> nand read.oob 0x81000000 0x1000 0x200
- NAND read: device 0 offset 0x1000, size 512 ... 512 bytes read: OK
- ar7240> md.b 0x81000000 0x240
- 81000000: ae 22 00 00 00 60 f8 09 24 04 00 0a 8e 05 74 a8 ."...`..$.....t.
- 81000010: 36 43 00 08 24 02 00 33 ac 62 00 00 00 a0 f8 09 6C..$..3.b......
- 81000020: 24 04 00 64 8e 03 74 a8 24 02 00 01 ae 22 00 00 $..d..t.$...."..
- 81000030: 00 60 f8 09 24 04 00 0a 8e 03 74 a8 36 42 00 14 .`..$.....t.6B..
- 81000040: ac 5e 00 00 00 60 f8 09 24 04 00 64 36 42 00 1c .^...`..$..d6B..
- 81000050: ac 53 00 00 36 43 00 20 3c 04 b8 06 8c 42 00 00 .S..6C. <....B..
- 81000060: ac 73 00 00 34 82 00 90 8c 63 00 00 8c 42 00 00 .s..4....c...B..
- 81000070: 30 42 00 0f 10 40 00 05 34 82 00 b0 8c 42 00 00 0B...@..4....B..
- 81000080: 30 42 00 08 10 40 00 09 3c 11 bd 00 12 80 00 06 0B...@..<.......
- 81000090: 36 42 00 24 ac 53 00 00 36 43 00 28 8c 42 00 00 6B.$.S..6C.(.B..
- 810000a0: ac 73 00 00 8c 62 00 00 3c 11 bd 00 3c 10 b8 00 .s...b..<...<...
- 810000b0: 8e 23 74 a8 36 02 00 18 ac 56 00 00 00 60 f8 09 .#t.6....V...`..
- 810000c0: 24 04 00 64 8e 25 74 a8 3c 02 74 44 36 03 00 c4 $..d.%t.<.tD6...
- 810000d0: 34 42 44 44 ac 62 00 00 00 a0 f8 09 24 04 00 64 4BDD.b......$..d
- 810000e0: 8e 25 74 a8 36 03 00 c8 24 02 02 22 ac 62 00 00 .%t.6...$..".b..
- 810000f0: 00 a0 f8 09 24 04 00 64 8e 23 74 a8 3c 02 00 0f ....$..d.#t.<...
- 81000100: 34 42 ff ff 36 10 00 cc ae 02 00 00 00 60 f8 09 4B..6........`..
- 81000110: 24 04 00 64 8f bf 00 3c 02 80 10 21 8f be 00 38 $..d...<...!...8
- 81000120: 8f b7 00 34 8f b6 00 30 8f b5 00 2c 8f b4 00 28 ...4...0...,...(
- 81000130: 8f b3 00 24 8f b2 00 20 8f b1 00 1c 8f b0 00 18 ...$... ........
- 81000140: 03 e0 00 08 27 bd 00 40 27 bd ff e8 af bf 00 14 ....'..@'.......
- 81000150: 0f 40 13 21 24 04 42 70 3c 04 b8 06 34 86 00 1c .@.!$.Bp<...4...
- 81000160: 8c c3 00 00 00 40 40 21 3c 02 f7 ff 34 42 ff ff .....@@!<...4B..
- 81000170: 00 62 18 24 3c 07 b8 11 3c 02 63 3c 34 42 81 76 .b.[ DISCUZ_CODE_2408 ]lt;...<.c<4B.v
- 81000180: 34 e5 6c 40 ac c3 00 00 34 84 00 90 ac a2 00 00 4.l@....4.......
- 81000190: 8c 82 00 00 30 42 00 0f 10 40 00 06 34 e3 6c 44 ....0B...@..4.lD
- 810001a0: 24 02 00 02 55 02 00 04 3c 02 10 38 0b 40 14 6a $...U...<..8.@.j
- 810001b0: 3c 02 10 00 3c 02 10 38 ac 62 00 00 0f 40 12 c9 <...<..8.b...@..
- 810001c0: 00 00 00 00 3c 04 b8 06 34 85 00 1c 8c a2 00 00 ....<...4.......
- 810001d0: 24 03 cf ff 34 84 00 b0 00 43 10 24 ac a2 00 00 $...4....C.$....
- 810001e0: 8c 82 00 00 30 42 00 10 14 40 00 04 3c 02 b8 05 ....0B...@..<...
- 810001f0: 34 42 00 24 0b 40 14 7d 24 03 02 71 34 42 00 24 4B.$.@.}$..q4B.$
- 81000200: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
- 81000210: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
- 81000220: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
- 81000230: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
复制代码 另外:4300 中多了几条命令nand read.jffs2 和 nand write.jffs2- nand read[.jffs2] - addr off size
- nand write[.jffs2] - addr off size - read/write `size' bytes starting
- at offset `off' to/from memory address `addr'
复制代码 baidu查询:(我没有用过不知道,这只是查询结果)
------------------------------------------------------
使用uboot 写nand flash 是不需要FS支持的,但是我查看 uboot 源代码的时候,发现这行 "nand write.jffs2 xxxxx.." jffs 是一个文件系统,这是为什么呢?
nand write:向Nand Flash写入数据,如果NandFlash相应的区域有坏块,则直接报错。 nand write.jffs2:向Nand Flash写入数据,如果NandFlash相应的区域有坏块,可以跳过坏块。 nand read:读取Nand Flash相应区域的数据,如果NandFlash相应的区域有坏块,则直接报错。 nand read.jffs2s:读取Nand Flash相应区域的数据,如果NandFlash相应的区域有坏块,将对应坏块区域的缓冲填充0xff,然后跳过此坏块继续读取。 nand read.jffs2:读取Nand Flash相应区域的数据,如果NandFlash相应的区域有坏块,直接跳过坏块。
由此,我们得出结论,nand write 和 nand write.jffs2 没有本质区别,只是对坏快的处理稍微不同而已!
--------------------------------------------------------------
(4)、nand dump [addr] [size]
读取flash addr地址开始的size 大小数据出来。最小单位是一个page.也就是说size小于一个page,也会读出一个page的数据。该数据包括oob数据。
注:这个读取应该是显示的意思
调用过程: nand dump addr size (common/cmd_nand.c)==> nand_dump() ==> nand_read_raw();
nand dump 不管你的size有多大,至少会dump出一个page的大小:
可以看到
nand dump 0x0 0x1
nand dump 0x1 0x7ff
执行结果相同
另外:可以发现在4300上1个page是2Kbye 大小)
- ar7240> nand dump 0x0 0x1
- Page 00000000 dump:
- bd 00 40 00 bd 00 40 00 00 00 30 00 c2 00 e8 6c
- 27 bd ff e0 af b1 00 18 3c 11 b8 06 36 22 00 90
- ......
- 00 00 00 00 00 00 00 00 3c 0c 41 c0 3c 0d 42 80
- 0b 40 12 00 00 00 00 00 00 00 00 00 3c 0c 29 c0
- OOB:
- ff ff ff ff ff ff ff ff
- ff ff ff ff ff ff ff ff
- ff ff ff ff 3c 97 45 9d
- 31 0c 8e 12 50 a1 eb 4d
- 3f 54 01 16 f6 a9 21 c9
- 0f f1 c8 08 0f 10 73 c6
- ff ff ff ff ff ff ff ff
- ff ff ff ff ff ff ff ff
-
- ar7240> nand dump 0x1 0x7ff
- Page 00000000 dump:
- bd 00 40 00 bd 00 40 00 00 00 30 00 c2 00 e8 6c
- 27 bd ff e0 af b1 00 18 3c 11 b8 06 36 22 00 90
- ......
- 00 00 00 00 00 00 00 00 3c 0c 41 c0 3c 0d 42 80
- 0b 40 12 00 00 00 00 00 00 00 00 00 3c 0c 29 c0
- OOB:
- ff ff ff ff ff ff ff ff
- ff ff ff ff ff ff ff ff
- ff ff ff ff 3c 97 45 9d
- 31 0c 8e 12 50 a1 eb 4d
- 3f 54 01 16 f6 a9 21 c9
- 0f f1 c8 08 0f 10 73 c6
- ff ff ff ff ff ff ff ff
- ff ff ff ff ff ff ff ff
复制代码 另外我也执行了
nand dump 0x0 0x1000
道理说应该能显示2个page 但实际结果只显示了1个page,谁知道呢我也不太懂
- ar7240> nand dump 0x0 0x1000
- Page 00000000 dump:
- bd 00 40 00 bd 00 40 00 00 00 30 00 c2 00 e8 6c
- 27 bd ff e0 af b1 00 18 3c 11 b8 06 36 22 00 90
- ......
- 00 00 00 00 00 00 00 00 3c 0c 41 c0 3c 0d 42 80
- 0b 40 12 00 00 00 00 00 00 00 00 00 3c 0c 29 c0
- OOB:
- ff ff ff ff ff ff ff ff
- ff ff ff ff ff ff ff ff
- ff ff ff ff 3c 97 45 9d
- 31 0c 8e 12 50 a1 eb 4d
- 3f 54 01 16 f6 a9 21 c9
- 0f f1 c8 08 0f 10 73 c6
- ff ff ff ff ff ff ff ff
- ff ff ff ff ff ff ff ff
复制代码
如果在地址0x800 处执行,结果就不同了,显示了下一个page
- ar7240> nand dump 0x800 0x1
- Page 00000800 dump:
- 3c 0d 2a 80 0b 40 12 00 00 00 00 00 00 00 00 00
- 3c 19 bd 00 37 39 00 04 af 20 00 00 3c 19 bd 00
- ......
- 8e 03 74 a8 36 51 00 10 24 02 00 02 ae 22 00 00
- 00 60 f8 09 24 04 00 0a 8e 03 74 a8 24 02 00 08
- OOB:
- ff ff ff ff ff ff ff ff
- ff ff ff ff ff ff ff ff
- ff ff ff ff 0c de e5 e6
- 6b 0a 01 36 d4 52 cd dc
- 16 bd 0d 56 37 d6 36 4d
- ee f2 4a 0c 01 09 64 88
- ff ff ff ff ff ff ff ff
- ff ff ff ff ff ff ff ff
复制代码
在这个机器上多了个命令
nand dump[.oob] off - dump page
这个命令是只显示 oob的,按page显示
- ar7240> nand dump.oob 0x0
- Page 00000000 dump:
- OOB:
- ff ff ff ff ff ff ff ff
- ff ff ff ff ff ff ff ff
- ff ff ff ff 3c 97 45 9d
- 31 0c 8e 12 50 a1 eb 4d
- 3f 54 01 16 f6 a9 21 c9
- 0f f1 c8 08 0f 10 73 c6
- ff ff ff ff ff ff ff ff
- ff ff ff ff ff ff ff ff
- ar7240> nand dump.oob 0x800
- Page 00000800 dump:
- OOB:
- ff ff ff ff ff ff ff ff
- ff ff ff ff ff ff ff ff
- ff ff ff ff 0c de e5 e6
- 6b 0a 01 36 d4 52 cd dc
- 16 bd 0d 56 37 d6 36 4d
- ee f2 4a 0c 01 09 64 88
- ff ff ff ff ff ff ff ff
- ff ff ff ff ff ff ff ff
- ar7240> nand dump.oob 0x1000
- Page 00001000 dump:
- OOB:
- ff ff ff ff ff ff ff ff
- ff ff ff ff ff ff ff ff
- ff ff ff ff f7 64 95 01
- 65 0a b9 73 dc d8 c8 43
- 9b a1 04 7b fc 94 35 82
- 49 b9 7a 08 09 c2 f2 6a
- ff ff ff ff ff ff ff ff
- ff ff ff ff ff ff ff ff
复制代码
(5)、nand write [addr] [off] [size]
这个命令和nand read一样, 只是方向是反的, 是把ram的值写到 nand flash中, 但是这个写只能将1改为0, 不能将0写成1. 这个命令会自动skipping bad blocks(会自动跳过坏块)。
注:如果按照上文的解释,刷nand flash之前一定要用擦除命令(后文会讲到)
(6)、nand erase/clean [off] [size] 清除flash off偏移地址开始的size大小的数据,最小单位是一个page。
在擦之前会先check是不是坏块,如果是坏块,就不能做擦的动作了。(这个动作不清楚不知道会不会check)
(7)、nand bad
检查nand 中的坏块(这个命令在引用的博文中没有讲到,4300 uboot有我就提一下)
- ar7240> nand bad
- Device 0 bad blocks:
复制代码 (8)、其它命令 (这个命令用的很少,且不安全(应该是不可靠的意思)能不用就不用吧)
- nand scrub - really clean NAND erasing bad blocks (UNSAFE)
- nand markbad off - mark bad block at offset (UNSAFE)
- nand biterr off - make a bit error at offset (UNSAFE)
复制代码 特别提醒:
在原博文中uboot 中Nand flash 常用操作命令解析 第三节有数据显示命令,这个数据在内存中与在flash中存储结构是不同的。
应该是cpu 大端、小端的原因 (32位翻转)
falsh 中为 “27 05 19 56” 内存中为“56 19 05 27”- --------------------------------------
- nand dump 0 100
- 直接输出flash 0地址开始的0x100字节数据及它所在page的OOB数据。从实际输出我们可以看出它实际输出了一个page 的数据。
- Wisdom #
- Wisdom #
- isdom # nand dump 0x100000 0x100 (falsh 数据显示)
- Page 00100000 dump:
- 27 05 19 56 11 f0 e6 37 5c 97 4f bc 00 30 ae e8
- 80 00 80 00 80 00 80 00 e9 70 d4 3f 05 02 02 00
- --------------------------------
- Wisdom # nand read 0x82000000 0x100000 0x100
- NAND read: device 0 offset 0x100000, size 0x100
- 256 bytes read: OK
- Wisdom # md 0x82000000 50 (内存 数据显示)
- 82000000: 56190527 37e6f011 bc4f975c e8ae3000 '..V...7\.O..0..
- 82000010: 00800080 00800080 3fd470e9 00020205 .........p.?....
复制代码 这儿现象在4300的机器上,字节没有翻转,4300用的是ar9344 的cpu 大端的
- ar7240> nand dump 0x0 0x800
- Page 00000000 dump:
- bd 00 40 00 bd 00 40 00 00 00 30 00 c2 00 e8 6c
- 27 bd ff e0 af b1 00 18 3c 11 b8 06 36 22 00 90
- ......
- 00 00 00 00 00 00 00 00 3c 0c 41 c0 3c 0d 42 80
- 0b 40 12 00 00 00 00 00 00 00 00 00 3c 0c 29 c0
- OOB:
- ff ff ff ff ff ff ff ff
- ff ff ff ff ff ff ff ff
- ff ff ff ff 3c 97 45 9d
- 31 0c 8e 12 50 a1 eb 4d
- 3f 54 01 16 f6 a9 21 c9
- 0f f1 c8 08 0f 10 73 c6
- ff ff ff ff ff ff ff ff
- ff ff ff ff ff ff ff ff
-
- ar7240> mw.b 0x81000000 0xff 0x40000
- ar7240> nand read 0x81000000 0x0 0x800
- NAND read: device 0 offset 0x0, size 2048 ... 2048 bytes read: OK
- ar7240> md.b 0x81000000 0x800
- 81000000: bd 00 40 00 bd 00 40 00 00 00 30 00 c2 00 e8 6c ..@...@...0....l
- 81000010: 27 bd ff e0 af b1 00 18 3c 11 b8 06 36 22 00 90 '.......<...6"..
- ......
- 810007e0: 00 00 00 00 00 00 00 00 3c 0c 41 c0 3c 0d 42 80 ........<.A.<.B.
- 810007f0: 0b 40 12 00 00 00 00 00 00 00 00 00 3c 0c 29 c0 .@..........<.).
复制代码
请不要胡乱输入以及粘贴、复制等方式灌水
请尊重作者、并共同维护网站的正常阅读,否则账户将会被限制发帖、回帖,并且积分可能会被清零,站内短信以及阅读权限等都会受到影响,谢谢。
具体限制方式:https://www.right.com.cn/forum/thread-8307840-1-1.html
|