U-BOOT环境变量实现 - BootLoader
来源:互联网 发布:c语言delay函数怎么用 编辑:程序博客网 时间:2024/05/18 01:21
http://deshunfan.blog.163.com/blog/static/3424410120096235180450/
1.相关文件
common/env_common.c
供u-boot调用的通用函数接口,它们隐藏了env的不同实现方式,比如dataflash, epprom, flash等
common/env_dataflash.c
env
common/env_epprom.c
env
common/env_flash.c
env
common/env_nand.c
env
common/env_nvedit.c
实现u-boot对环境变量的操作命令
environment.c
环境变量以及一些宏定义
env如果存储在Flash中还需要Flash的支持。
2.数据结构
env
在include/environment.h中定义了表示env的数据结构
typedef struct environment_s
{
#ifdef CFG_REDUNDAND_ENVIRONMENT
#endif
} env_t;
关于以上结构的说明:
crc是u-boot在保存env
da
env
typedef struct global_da
{
} gd_t;
<include/asm-arm/Global_da
gd_t.env_addr
3.ENV
500)this.width=500;">
start_armboot :
*env_init : env_xxx.c(
env_relocate : env_common.c
*env_relocate_spec : env_xxx.c(
3.1env_init
实现
Env_nand.c : env_init
gd->env_addr = (ulong)&default_environment[0]; //先使gd->env_addr指向默认的环境变量
gd->env_valid = 1;// env
3.2 env_relocate
#ifdefine ENV_IS_EMBEDDED
…(略)
#else
env_ptr = (env_t *)malloc (CFG_ENV_SIZE);
#endif
if( gd->env_valid == 0) //
{
}
else
gd->env_addr = (ulong)&(env_ptr->da
这里涉及到两个和环境变量有关的宏
ENV_IS_EMBEDDED : env
CFG_ENV_SIZE : env
实际上还需要几个宏来控制u-boot
CFG_ENV_IS_IN_NAND : env
CFG_ENV_OFFSET : env
3.3*env_relocate_spec
这里仅分析
如果未设置
void env_relocate_spec (void)
{
#if !defined(ENV_IS_EMBEDDED)
#endif
}
上面的代码很清楚的表明了
4. ENV
由上问的论述得知, env
Env_nand.c : saveenv
int saveenv(void)
{
}
Nand Flash
1、参数表的结构定义在environment.c中,如下:
#ifdef CFG_REDUNDAND_ENVIRONMENT
# define ENV_HEADER_SIZE
#else
# define ENV_HEADER_SIZE
#endif
//除去参数表头后参数的长度最值
#define ENV_SIZE (CFG_ENV_SIZE - ENV_HEADER_SIZE)
typedef
unsigned long
#ifdef CFG_REDUNDAND_ENVIRONMENT
unsigned char
#endif
unsigned char
}
结构env_t参数表的结构非常简单,第一个成员就是crc,用于crc32校验,第二个参数是冗余的标志,最后一个就是参数数组了。所以参数头的长度ENV_HEADER_SIZE就是crc与flags之和,即为sizeof(long)+sizeof(char)。这个结构就是在内存和flash上表示参数表的结构。
参数表的最后一个成员da
uchar default_environment[] = {
#ifdef
"bootargs="
#endif
#ifdef
"bootcmd="
#endif
……
"\0"
};
2、环境变量的初始化env_relocate()
去除了一些不执行的代码后,这个函数如下:
void env_relocate (void)
{
}
第一步,初始化一个全局指针,它被定义为:
env_t *env_ptr = 0;
第二步,重新初始化函数指针,
static uchar env_get_char_init (int index);
uchar (*env_get_char)(int) =
该函数指针原来被初始化为env_get_char_init,现在改为env_get_char_memory。对于nand flash,这两个函数是一样的。
第三步,如果flash没有参数表,则使用默认参数,这里是通过default_env()来加载。
void default_env(void)
{
#ifdef CFG_REDUNDAND_ENVIRONMENT
#endif
}
第四步,如果flash上有参数表可用,则从flash上加载,通过env_relocate_spec()来实现:
void env_relocate_spec (void)
{
#if !defined(ENV_IS_EMBEDDED) //如果不是使用嵌入参数的形式,即为参数表的形式
#endif
}
此外,uboot的参数表还支持一种被称为CFG_ENV_OFFSET_REDUND的冗余模式,它会在flash上保存两个参数表副本,这样在一个副本出错的时候,还可以从另一个副本中去读取,通过这种方式,提高了数据的安全性。
第五步,gd->env_addr = (ulong)&(env_ptr->da
即将环境变量的值赋值给全局变量gd->env_addr,这样只要通过这个全局变量就可以访问这些变量了。
3、环境变量的保存,保存是读取的反过程,所以跟上面的过程相似,如下:
int saveenv(void)
{
total = CFG_ENV_SIZE;
}
4、读取环境变量
Uboot中经常要读取环境变量,这是通过getenv来实现的:
/ * Look up variable from environment,
* return address of storage for that variable,
* or NULL if not found
*/
char *getenv (char *name)
{
}
通过输入变量的名字,返回变量的值。
前面已经提到,函数指针env_get_char已经被初始化为env_get_char_memory:
uchar env_get_char_memory (int index)
{
if (gd->env_valid) {
} else {
}
}
查找符号变量,如果找到则返回等号后面的字符串指针,即为变量的值。
static int
envmatch (uchar *s1, int i2)
{
}
如前所述,环境变量表是一个字符串数组,而其中的变量之间通过’\0’符号隔开,即是当遇到该符号时,则表示一个变量结束而另一个变量开始。
- U-BOOT环境变量实现 - BootLoader
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现 --转帖
- Bootloader U-boot启动
- bootloader之U-boot
- bootloader之u-boot
- u-boot修改main.c实现bootloader里喂狗
- Bootloader及u-boot简介
- iOS8 两种image方法 对@2x @3x 加载选取的解析
- 组合模式(Composite Pattern)
- ADF application running on clustered environment - High Availability
- Laravel Eloquent ORM--整理
- 两台linux服务器器同步目录脚本
- U-BOOT环境变量实现 - BootLoader
- 由于ORACLE_SID未设定造成的ora-12162 错误
- SIP vs XMPP
- 54 js index() 兼容ie的短阴影效果 div高度无法获取 轮播图片 文字居与div底部 filter()和eq()
- Android Studio快捷键
- Unity3D制作2D精灵动画
- 配置简单的nginx反向代理
- Android给ListView设置分割线Divider样式
- char *string="xxxxxxxxx" 与 char string[]="xxxxx"的区别