【已解决】Uboot中nand erase出错:NAND 256MiB 3,3V 8-bit: MTD Erase failure: -22

【问题】

别人遇到的问题:

 

我是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.网上搜了搜,只找到,类似的:

NAND Flash有坏块不能烧写E-Boot怎么办啊??

6410板子操作系统烧不进nandflash

格式化NAND

编写LEDdriver驱动后,生成的NK.bin烧录到开发板中不能运行

很明显,其错误都是-5,而不是此处的-22.

2.所以就去找uboot源码。

找到之前就搜藏的:

在线看代码(Kernel,Uboot等)的网站

可惜现在不可用了。

3.所以就去:

U-Boot Source Code

找到:

uboot的ftp下载

去下载一个最新的:

u-boot-2013.01.tar.bz2

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的命令含义和语法的解释:

参考:

U-Boot commands

知道语法是:

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中的某个命令?

答:参考我之前写的:

uboot部分命令的使用注意事项和心得

去使用:

help nand

就可以查看到,nand 相关的命令了。

其中就包括此处的nand erase的语法和含义。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量