• 烧写NAND Flash时出现错误:*** Warning bad CRC or NAND, using default environment


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



  • 相关阅读:
    七牛图片上传JSSDK
    2015年12月中国航空公司名录
    HTML5 开发框架
    利用HTML5定位功能,实现在百度地图上定位
    openerp7 时区问题
    AS3使用Json 传复杂数据 -------- 用数组而不是向量
    随便写写
    生产环境该如何选择lvs的工作模式,和哪一种算法
    获取Linux权限后安装rootkit
    IT求职经验分享
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218570.html
Copyright © 2020-2023  润新知