uboot 环境变量 的初始化

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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出错了。

相关文档
最新文档