uboot 环境变量 的初始化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ENV 的初始化
start_armboot : (lib_arm/board.c )
*env_init : env_xxx.c(xxx = nand | flash | epprom …)
env_relocate : env_common.c
*env_relocate_spec : env_xxx.c(xxx=nand | flash | eporom…)
1.1env_init
实现env 的第一次初始化,对于nand env (非embedded方式):
Env_nand.c : env_init
gd->env_addr = (ulong)&default_environment[0]; //先使gd->env_addr指向默认的环境变量gd->env_valid = 1;// env 有效位置1
1.2 env_relocate
#ifdefine ENV_IS_EMBEDDED
…(略)
#else
env_ptr = (env_t *)malloc (CFG_ENV_SIZE);
#endif
if( gd->env_valid == 0) // 在Env_annd.c : env_init 中已经将gd->env_valid 置1
{
}
else
env_relocate_spec ();// 调用具体的env_relocate_spec 函数
gd->env_addr = (ulong)&(env_ptr->data);// 最终完成将环境变量搬移到内存
这里涉及到两个和环境变量有关的宏
ENV_IS_EMBEDDED : env 是否存在于u-boot TEXT 段中
CFG_ENV_SIZE : env 块的大小
实际上还需要几个宏来控制u-boot 对环境变量的处理
CFG_ENV_IS_IN_NAND : env 块是否存在于Nand Flash 中
CFG_ENV_OFFSET : env 块在Flash 中偏移地址
1.3*env_relocate_spec
这里仅分析Nand Flash 的env_relocate_spec 实现
如果未设置CFG_ENV_OFFSET_REDUND,env_relocate_spec的实现如下:
void env_relocate_spec (void)
{
#if !defined(ENV_IS_EMBEDDED)
ulong total;
int ret;
total = CFG_ENV_SIZE;
ret = nand_read(&nand_info[0], CFG_ENV_OFFSET, &total, (u_char*)env_ptr);
if (ret || total != CFG_ENV_SIZE)
return use_default();
if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)
return use_default();
#endif /* ! ENV_IS_EMBEDDED */
}
上面的代码很清楚的表明了env_relocate_spec 的意图,调用nand_read 将环境变量从CFG_ENV_OFFSET 处读出,环境变量的大小为CFG_ENV_SIZE 注意CFG_ENV_OFFSET 和CFG_ENV_SIZE 要和Nand Flash 的块/页边界对齐。读出数据后再调用crc32 对env_ptr->data进行校验并与保存在env_ptr->crc 的校验码对比,看数据是否出错,从这里也可以看出在系统第一次启动时,Nand Flash 里面没有存储任何环境变量,crc校验肯定回出错,当我们保存环境变量后,接下来再启动板子u-boot就不会再报crc32出错了。