先来看一张图
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(); //使用默认的环境变量
}