【问题】
别人遇到的问题:
我是TQ2440开发板,移植好uboot后,使用nand erase命令擦除nand flash时候,出现如下提示:
[root@guo2440]#nand erase 0x5a0000 0xf9000000 NAND erase: device 0 offset 0x5a0000, size 0xf9000000 Skipping bad block at 0x00be0000 Skipping bad block at 0x01620000 Erasing at 0xf4a0000 -- 6% complete. NAND 256MiB 3,3V 8-bit: MTD Erase failure: -22 NAND 256MiB 3,3V 8-bit: MTD get bad block failed: -22 ERROR
【解决过程】
1.网上搜了搜,只找到,类似的:
编写LEDdriver驱动后,生成的NK.bin烧录到开发板中不能运行
很明显,其错误都是-5,而不是此处的-22.
2.所以就去找uboot源码。
找到之前就搜藏的:
可惜现在不可用了。
3.所以就去:
找到:
去下载一个最新的:
4.用SourceInsight建好了Uboot的项目后,去搜:
MTD Erase failure
然后找到了,对应的源码位置:
Nand_util.c (e:\dev_root\uboot\u-boot-2013.01\drivers\mtd\nand): printf("\n%s: MTD Erase failure: %d\n", |
result = meminfo->erase(meminfo, &erase); if (result != 0) { printf("\n%s: MTD Erase failure: %d\n", mtd_device, result); continue; }
5.接下来,就是去分析,-22具体是什么错误。
想要去找-22,找了半天,终于从当前的
Nand_util.c (e:\dev_root\uboot\u-boot-2013.01\drivers\mtd\nand) 20543 2013/1/16
找到其所包含的头文件:
#include <asm/errno.h>
中,是对应的是:
Errno.h (e:\dev_root\uboot\u-boot-2013.01\include\asm-generic) 7058 2013/1/16
其中有对应的定义:
#define EINVAL 22 /* Invalid argument */
即,此处的-22的错误,原因就是参数是非法的(Invalid argument)
6.然后再去分析看看上述nand erase中的参数:
nand erase 0x5a0000 0xf9000000
到底为何是非法的。
先去看看nand erase的命令含义和语法的解释:
参考:
知道语法是:
nand erase [clean] [off size] - erase `size' bytes from
然后再来对照上述命令,即此处的是:
off=offset=要erase的位置=0x5a0000
size=大小=要erase的大小=0xf9000000
而对于0xf9000000,去算了一下
0xf9000000=4079616KB=3984MB=3GB
即,此处要erase的大小是3G
而注意到,此处的nand flash是:
NAND 256MiB 3,3V 8-bit |
即,最大大小一共才256MB,但是你却要擦除3GB,所以当然是参数错误了。
解决办法就很简单了:
需要自己搞懂,要擦除的大小,到底是多少。
当然要确保,offset+size,不会超过nand flash的总大小才行。
【总结】
对于uboot中的nand flash的各种命令,要在使用之前,去搞懂具体的语法。
提示:
问:如何搞懂uboot中的某个命令?
答:参考我之前写的:
去使用:
help nand
就可以查看到,nand 相关的命令了。
其中就包括此处的nand erase的语法和含义。
转载请注明:在路上 » 【已解决】Uboot中nand erase出错:NAND 256MiB 3,3V 8-bit: MTD Erase failure: -22