烧写NAND Flash时出现错误:*** Warning - bad CRC or NAND, using default environment
2012-06-15 19:49
411 查看
在对NAND Flash烧写了bootstrap和U-Boot之后,启动目标板,发现有如下显示的错误:
Uboot中的逻辑是,汇编执行完之后,掉转到C代码入口处,(此处是arm平台),此处是lib_arm\board.c中的start_armboot,其在一系列的初始化后,会去调用
/* initialize environment */
env_relocate ();
去加载环境变量,在common\env_common.c中的env_relocate():
if (gd->env_valid == 0) {
#if defined(CONFIG_GTH) || defined(CONFIG_ENV_IS_NOWHERE) /* Environment not changable */
puts ("Using default environment\n\n");
#else
puts ("*** Warning - bad CRC, using default environment\n\n");
show_boot_progress (-60);
#endif
set_default_env();
}
else {
env_relocate_spec ();
}
会去根据gd->env_valid 前面有没有被初始化,是否为1,而决定,
是直接调用默认环境变量,(我此处的uboot中定义的是#define CONFIG_ENV_IS_IN_NAND
,其在env_nand.c中的env_init()中已经初始化了 gd->env_valid = 1;)
还是去调用env_relocate_spec ()去重新(从你指定的设备,我这里的是之前指定的nand)装载你之前存储的环境变量。
而我这里,按照上面说明,就是去执行env_relocate_spec (),
在common\env_nand.c中
void env_relocate_spec (void)
{
#if !defined(ENV_IS_EMBEDDED)
int ret;
ret = readenv(CONFIG_ENV_OFFSET, (u_char *) env_ptr);
if (ret)
return use_default();
if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)
return use_default();
#endif /* ! ENV_IS_EMBEDDED */
}
static void use_default()
{
puts ("*** Warning - bad CRC or NAND, using default environment\n\n");
set_default_env();
}
可以很清楚的看到,如果是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 */
#define CONFIG_BOOTCOMMAND "nand read 0x40007FC0 0x100000 0x200000;bootm 0x40007FC0"
/* mmcblk0p2 -> rootfs Partition */
#define CONFIG_BOOTARGS "root=/dev/mtdblock2 rw init=/linuxrc console=ttyAMA1,115200 mem=64M rootfstype=yaffs2"
,反之,如果你上面从你指定的nand设备里面读取的环境变量是正常的话,那么就会用那些值,而不是你代码里面写的值。
此后,就不会出现这样的提示了,因为可以正常从指定的nand设备中读取和写入对应的env了。
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_arm\board.c中的start_armboot,其在一系列的初始化后,会去调用
/* initialize environment */
env_relocate ();
去加载环境变量,在common\env_common.c中的env_relocate():
if (gd->env_valid == 0) {
#if defined(CONFIG_GTH) || defined(CONFIG_ENV_IS_NOWHERE) /* Environment not changable */
puts ("Using default environment\n\n");
#else
puts ("*** Warning - bad CRC, using default environment\n\n");
show_boot_progress (-60);
#endif
set_default_env();
}
else {
env_relocate_spec ();
}
会去根据gd->env_valid 前面有没有被初始化,是否为1,而决定,
是直接调用默认环境变量,(我此处的uboot中定义的是#define CONFIG_ENV_IS_IN_NAND
,其在env_nand.c中的env_init()中已经初始化了 gd->env_valid = 1;)
还是去调用env_relocate_spec ()去重新(从你指定的设备,我这里的是之前指定的nand)装载你之前存储的环境变量。
而我这里,按照上面说明,就是去执行env_relocate_spec (),
在common\env_nand.c中
void env_relocate_spec (void)
{
#if !defined(ENV_IS_EMBEDDED)
int ret;
ret = readenv(CONFIG_ENV_OFFSET, (u_char *) env_ptr);
if (ret)
return use_default();
if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)
return use_default();
#endif /* ! ENV_IS_EMBEDDED */
}
static void use_default()
{
puts ("*** Warning - bad CRC or NAND, using default environment\n\n");
set_default_env();
}
可以很清楚的看到,如果是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 */
#define CONFIG_BOOTCOMMAND "nand read 0x40007FC0 0x100000 0x200000;bootm 0x40007FC0"
/* mmcblk0p2 -> rootfs Partition */
#define CONFIG_BOOTARGS "root=/dev/mtdblock2 rw init=/linuxrc console=ttyAMA1,115200 mem=64M rootfstype=yaffs2"
,反之,如果你上面从你指定的nand设备里面读取的环境变量是正常的话,那么就会用那些值,而不是你代码里面写的值。
解决办法:
可以在第一次启动后(第一次会有此警告),进入uboot命令行模式(当然,前提是你代码里面设置了uboot等待一定的时间,可以进入U-Boot命令行模式)后,执行save,就可以把第一次,从代码里面获取的默认的那些env的值,存储到nand里面了。此后,就不会出现这样的提示了,因为可以正常从指定的nand设备中读取和写入对应的env了。
相关文章推荐
- 烧写NAND Flash时出现错误:*** Warning - bad CRC or NAND, using default environment
- Warning - bad CRC or NAND, using default environment 错误的解决方案
- U-Boot移植(13)Warning - bad CRC or NAND, using default environment
- 【已解决】*** Warning - bad CRC or NAND, using default environment
- uboot: Warning - bad CRC or NAND, using default environment
- Uboot中*** Warning - bad CRC or MMC, using default environment解决
- Warning - bad CRC, using default environment
- Warning - bad CRC, using default environment问题解决
- Warning - bad CRC, using default environment
- Warning - bad CRC, using default environment
- 打开eclipse出现错误A java Runtime Environment(JRE) or Java Development Kit(JDK) must be...
- vs2013出现错误提示error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s
- 在Ubuntu安装完成后更改默认的语言LANG,出现Cannot set LC_CTYPE to default locale: No such file or directory错误的解决办法
- Python调用TensorFlow出现“Cannot evaluate tensor using `eval()`: No default session is registered”错误问题的解决
- linux出现Cannot set LC_CTYPE to default locale: No such file or directory错误的解决办法
- vs2012出现错误如下,This function or variable may be unsafe. Consider using strcpy_s instead.解决办法
- eclipse在Linux下安装时出现错误:A java Runtime environment(jre) or ......
- CentOS安装软件出现错误:bash: /usr/local/bin/rar: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
- opencv中关于图像图像处理时出现Bad argument (Array should be the cvMat or IplImage) in unknown function ……错误的解决办法
- 在Ubuntu安装完成后更改默认的语言LANG,出现Cannot set LC_CTYPE to default locale: No such file or directory错误的解决办法