前面转自:https://www.cnblogs.com/java20130726/archive/2012/06/15/3218570.html

在对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_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了。

 
调试IM8mm的时候用的是sd卡启动同样遇到这个问题:
进入uboot命令行模式(当然,前提是你代码里面设置了uboot等待一定的时间,可以进入U-Boot命令行模式)后,执行save,就可以把第一次,从代码里面获取的默认的那些env的值,存储到sd卡里面了。

启动时出现错误:*** Warning - bad CRC or NAND的更多相关文章

  1. eclipse启动时报告错误:Java was started but returned exit code=-805306369

    这两天也没改过eclipse和java的配置,但eclipse启动时报告错误:Java was started but returned exit code=-805306369 后来在eclipse ...

  2. 使用Spring Boot操作Hive JDBC时,启动时报出错误:NoSuchMethodError: org.eclipse.jetty.servlet.ServletMapping.setDef

    使用Spring Boot操作Hive JDBC时,启动时报出错误:NoSuchMethodError: org.eclipse.jetty.servlet.ServletMapping.setDef ...

  3. docker export import后,导入镜像,启动时的错误,Error response from daemon: No command specified

    Docker的流行与它对容器的易分享和易移植密不可分,用户不仅可以把容器提交到公共服务器上,还可以把容器导出到本地文件系统中.同样,我们也可以把导出的容器重新导入到Docker运行环境中.Docker ...

  4. Tomcat部署启动时发生错误

    Tomcat启动后项目地址显示404:源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示. 严重: ContainerBase.addChild: start: org.apache. ...

  5. tomcat启动时常见错误问题集锦

    1:环境变量 问题:The JAVA_HOME environment variable is not defined This environment variable is needed to r ...

  6. 解决UE4项目编辑器启动时出现LogLinker: Warning: Failed to load '/Game/FirstPersonBP/FirstPersonOverview': Can't find file.

    UE4版本:4.24.3源码编译版本 Windows10 + VS2019环境 LogLinker: Warning: Failed to load '/Game/FirstPersonBP/Firs ...

  7. Eclipse启动时出现错误 An internal error occurred during: “Updating indexes”

    在Eclipse的workspace下有个.metadata文件夹,Eclipse出现异常的log文件就在这个目录下. 最近出现了这样的错误: 查看日志文件发现:     !ENTRY org.ecl ...

  8. Eclipse启动时出现错误 An internal error occurred during: "Updating indexes"

    在Eclipse的workspace下有个.metadata文件夹,Eclipse出现异常的log文件就在这个目录下. 最近出现了这样的错误: 查看日志文件发现:     !ENTRY org.ecl ...

  9. SQL Server 启动时发生错误1069:由于登录失败而无法启动

    解决方法:    (1). 我的电脑--控制面板--管理工具--服务--右键MSSQLSERVER--属性--登陆--登陆身份--选择"本地系统帐户".    (2). 我的电脑- ...

随机推荐

  1. Java 等待/通知机制

    等待/通知的目的是确保等待线程从wait()方法返回时能够感知到通知线程对变量所做出的的修改: 等待方遵循如下原则: 1.获取对象的锁 2.如果条件不满足,那么调用对象的wait()方法,被通知后任要 ...

  2. (静默安装)Cent OS 6_5(x86_64)下安装Oracle 11g

    Cent OS 6_5(x86_64)下安装Oracle 11g 1 硬件要求   1.1 内存 & swap 物理内存不少于1G 硬盘可以空间不少于5G swap分区空间不少于2G Mini ...

  3. 抽空学学KVM(七):虚拟机快照和克隆

    前几天学写了KVM中qume-info命令的使用,今天学学在虚拟化里面用处广泛的快照和克隆功能,snapshot和virt-clone.对于snapshot命令的使用其实很简单.进入virsh界面以后 ...

  4. spark load data from mysql

    spark load data from mysql code first 本机通过spark-shell.cmd启动一个spark进程 SparkSession spark = SparkSessi ...

  5. 利用python3监控服务器状态进行邮件报警

    在正式的生产环境中,我们常常会需要监控服务器的状态,以保证公司整个业务的正常运转,常常我们会用到像nagios.zabbix这类工具进行实时监控,那么用python我们怎么进行监控呢?这里我们利用了p ...

  6. STM32入门系列-STM32时钟系统,时钟初始化配置函数

    在前面推文的介绍中,我们知道STM32系统复位后首先进入SystemInit函数进行时钟的设置,然后进入主函数main.那么我们就来看下SystemInit()函数到底做了哪些操作,首先打开我们前面使 ...

  7. cmd中执行mvn help:system报错的解决办法

    [ERROR] No plugin found for prefix 'help' in the current project and in the plugin groups [org.apach ...

  8. Java学习的第四十七天

    1.用类函数来写时间类 import java.util.Scanner; public class Cjava { public static void main(String[]args) { T ...

  9. C# 中的 in 参数和性能分析

    in 修饰符也是从 C# 7.2 开始引入的,它与我们上一篇中讨论的 <C# 中的只读结构体(readonly struct)>[1] 是紧密相关的. in 修饰符 in 修饰符通过引用传 ...

  10. UbuntuStudio20.04安装教程(双系统安装,windows10已安装)

    硬件和系统: acer4750(原i3换i7,加固态硬盘200多G,原机械硬盘500G由光驱改装,内存由2G增加为6G)2010年购买3300,性价比高,硬件升级后2020年不过时 windows10 ...