u-boot一些关键命令的实现详解

1.saveenv命令

1.文件

common/env_common.c
供u-boot调用的通用函数接口,它们隐藏了env的不同实现方式,比如dataflash, epprom, flash等
common/env_dataflash.c
env 存储在dataflash中的实现
common/env_epprom.c
env 存储在epprom中的实现
common/env_flash.c
env 存储在flash中的实现
common/env_nand.c
env 存储在nand中的实现
common/env_nvedit.c
实现u-boot对环境变量的操作命令
environment.c
环境变量以及一些宏定义
env如果存储在Flash中还需要Flash的支持。
2.数据结构
env 在 u-boot 中通常有两种存在方式,在永久性存储介质中( Flash NVRAM等 )在SDRAM,可以配置不使用 env 的永久存储方式,但这不常用。u-boot 在启动的时候会将存储在永久性存储介质中的 env 重新定位到 RAM 中,这样可以快速访问,同时可以通过saveenv 将 RAM 中的 env 保存到永久性存储介质中。
在include/environment.h中定义了表示env的数据结构
typedef struct environment_s
{
unsigned long crc; 
#ifdef CFG_REDUNDAND_ENVIRONMENT
unsigned char flags;
#endif
unsigned char data[ENV_SIZE];
} env_t;
 
data字段保存实际的环境变量。u-boot 的 env 按 name=value”\0”的方式存储,在所有env的最后以”\0\0”表示整个 env 的结束。新的name=value对总是被添加到 env 数据块的末尾,当删除一个name=value对时,后面的环境变量将前移,对一个已经存在的环境变量的修改实际上先删除再插入。
 
     上文提到u-boot会将 env 从 flash 等存储设备重定位到 RAM 中,在 env 的不同实现版本( env_xxx.c )中定义了 env_ptr, 它指向 env 在RAM中的位置。u-boot在重定位 env后对环境变量的操作都是针对 env_ptr。
env_t 中除了数据之外还包含校验头,u-boot 把env_t 的数据指针有保存在了另外一个地方,这就是 gd_t 结构( 不同平台有不同的 gd_t 结构 ),这里以ARM为例仅列出和 env 相关的部分
typedef struct global_data
{
unsigned long env_off; 
unsigned long env_addr;
unsigned long env_valid
} gd_t;
<include/asm-arm/Global_data.h>
gd_t.env_addr 即指向 env_ptr->data。
3.ENV 的保存
由上问的论述得知, env 将从永久性存储介质中搬到RAM里面,以后对env 的操作,比如修改环境变量的值,删除环境变量的值都是对这个 env 在RAM中的拷贝进行操作,由于RAM的特性,下次启动时所做的修改将全部消失,u-boot提供了将env 写回 永久性存储介质的命令支持 : saveenv,不同版本的 env ( nand flash, flash … )实现方式不同,以Nand Flash 的实现(未定义CFG_ENV_OFFSET_REDUND)为例
Env_nand.c : saveenv
int saveenv(void)
{
ulong total;
int ret = 0;
puts ("Erasing Nand...");
if (nand_erase(&nand_info[0], CFG_ENV_OFFSET, CFG_ENV_SIZE))
return 1;
puts ("Writing to Nand... ");
total = CFG_ENV_SIZE;
ret = nand_write(&nand_info[0], CFG_ENV_OFFSET, &total, (u_char*)env_ptr);
if (ret || total != CFG_ENV_SIZE)
return 1;
puts ("done\n");
return ret;
}
Nand Flash 的 saveenv 命令实现很简单,调用nand_erase 和nand_write进行Nand Flash的 erase, write。

 

你可能感兴趣的:(命令,command,bootloader,saveenv)