烧写NAND Flash时出现错误:*** Warning - bad CRC or NAND, usi
在对NAND Flash烧写了bootstrap和U-Boot之后,启动目标板,发现有如下显示的错误:
U-Boot 2009.11-rc2 (Jun 15 2012 - 12:59:22) DRAM: 64 MB NAND: 256 MiB *** Warning - bad CRC or NAND,using default environment In: serial Out: serial Err: serial Net: macb0 macb0: Starting autonegotiation... 0x00000000 macb0: link up,10Mbps half-duplex (lpa: 0x0000) Hit any key to stop autoboot: 0 NAND read: device 0 offset 0xa0000,size 0x200000 2097152 bytes read: OK Wrong Image Format for bootm command ERROR: can't get kernel image! DingQing> Uboot中的逻辑是,汇编执行完之后,掉转到C代码入口处,(此处是arm平台),此处是lib_armboard.c中的start_armboot,其在一系列的初始化后,会去调用 /* initialize environment */ 去加载环境变量,在commonenv_common.c中的env_relocate(): if (gd->env_valid == 0) { 会去根据gd->env_valid 前面有没有被初始化,是否为1,而决定, 是直接调用默认环境变量,(我此处的uboot中定义的是#define CONFIG_ENV_IS_IN_NAND 还是去调用env_relocate_spec ()去重新(从你指定的设备,我这里的是之前指定的nand)装载你之前存储的环境变量。 而我这里,按照上面说明,就是去执行env_relocate_spec (), 在commonenv_nand.c中 void env_relocate_spec (void) ret = readenv(CONFIG_ENV_OFFSET,(u_char *) env_ptr); if (crc32(0,env_ptr->data,ENV_SIZE) != env_ptr->crc) static void use_default() 可以很清楚的看到,如果是readenv读取环境变量失败,那么就调用use_default,使用默认环境变量。 如果即使数据读的对了,但是crc32校验失败,那么也是去调用use_default,使用默认环境变量。 而这两种情况下,调用use_default,就会打印*** Warning - bad CRC or NAND,using default environment,然后使用你原先在编译Uboot的时候,在自己的头文件里面定义那些默认的值,比如对于常用到的启动参数和启动命令来说,我代码里面的是: /* read kernel from mtdblock2 no matter for 24/4K pagesize nand */ 解决办法:可以在第一次启动后(第一次会有此警告),进入uboot命令行模式(当然,前提是你代码里面设置了uboot等待一定的时间,可以进入U-Boot命令行模式)后,执行save,就可以把第一次,从代码里面获取的默认的那些env的值,存储到nand里面了。 此后,就不会出现这样的提示了,因为可以正常从指定的nand设备中读取和写入对应的env了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |