uboot - bad crc

先来看一张图
这里写图片描述
这里写图片描述

void sf_env_relocate_spec(void)
{
    int ret;
    /*
        初始化Spi Flash。应用在操作Spi Flash之前 ,需要调用这个函数来初始化。
    */
    env_flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS,CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE);
    if (!env_flash)
        goto err_probe;
    /*
      从spi flash 的CONFIG_ENV_OFFSET 开始读取,长度为CONFIG_ENV_SIZE,保存到env_ptr
      即 : 从ox80000地址开始读取,读取长度0x40000 ,即一个env 扇区的大小(可以配置的)
    */
    ret = spi_flash_read(env_flash, CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE, env_ptr);
    if (ret)
        goto err_read;
    /*
        对读取的env进行crc校验,第一次的时候 没有环境变量保存到spi falsh中,
        所以 会goto err_crc. 现在你明白了 第一次开机的时候为什么会出现Bad crc了吧。

        比如 : 你烧写uboot 到 0x0 -> 0x100000处,先sf erase 这 1 M,0x80000 -> (0x80000 + 0x40000
               内容都是 FF FF,根本没有环境变量在里面。 那么环境变量是什么时候放到里面去的呢? 下面详解。   
    */
    if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)
        goto err_crc;
    /*
      typedef   struct  global_data {
           unsigned long    env_addr;   
           unsigned long    env_valid;  crc 校验成后,这个值会是 1
           } 
    */
    gd->env_valid = 1; //如果不是第一次,那么看 env_valid 为 1,不是为0,说明spi flash上的环境变量crc校验成功
    return;
err_read:
    spi_flash_free(env_flash); //不要忘记释放
    env_flash = NULL;
err_probe:
err_crc:
    puts("*** Warning - bad CRC, using default environment\n\n");//这就是第一次开机的时候 打印出来的信息。
    set_default_env(); //使用默认的环境变量
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值