u-boot:env源码目录分析一
目的:探索env的读取和保存(qspi)
一.涉及的类型定义
CONFIG_ENV_OFFSET_REDUND
ReDund:redundancy(冗余,即开启环境变量的备份).
官方解释:
config_env_offset_redundancy(可选)指定第二个存储区域,大小为CONFIG_ENV_SIZE,
用于保存环境数据的冗余副本。这提供了一个有效的备份副本,以防另一个副本损坏.
例如由于在"saveenv"操作期间电源故障。这个值也是以字节为单位,但也必须与MMC扇区边界对齐。
/*******************************************************************/
//解释:全局变量 struct hsearch_data env_htab的类型定义
typedef struct entry {const char *key;char *data;int (*callback)(const char *name, const char *value, enum env_op op,int flags);int flags;
} ENTRY;
typedef struct _ENTRY {int used;ENTRY entry;
} _ENTRY;struct hsearch_data {struct _ENTRY *table;unsigned int size;unsigned int filled;
/** Callback function which will check whether the given change for variable* "__item" to "newval" may be applied or not, and possibly apply such change.* When (flag & H_FORCE) is set, it shall not print out any error message and* shall force overwriting of write-once variables.* Must return 0 for approval, 1 for denial.*/int (*change_ok)(const ENTRY *__item, const char *newval, enum env_op,int flag);
};struct hsearch_data env_htab = {.change_ok = env_flags_validate,
};
/*************************************************************************/
//解释:env_t* env_out对应的类型定义typedef struct environment_s {uint32_t crc; /* CRC32 over data bytes */
#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENTunsigned char flags; /* active/obsolete flags */
#endifunsigned char data[ENV_SIZE]; /* Environment data */
} env_t;
二.关键函数解释
/***********************env/env.c主要函数*****************************/
//解释:.config文件中的配置决定了驱动,以下三个函数均为调用对应存储设备驱动的实现(见注2)
//在zynq开发板环境下: env/sf.c
//初始化
int env_init(void)/**************************************************************/
//从存储设备中加载环境变量
int env_load(void);/**************************************************************/
//解释: 把环境变量保存到存储设备中
int env_save(void);
//注1:
//解释:定义一个环境变量驱动位置存放设置的宏,每一个存储环境变量的设备driver定义时都使用该宏/* Declare a new environment location driver */
#define U_BOOT_ENV_LOCATION(__name) \ll_entry_declare(struct env_driver, __name, env_driver)
//注2
U_BOOT_ENV_LOCATION(sf) = {.location = ENVL_SPI_FLASH,ENV_NAME("SPI Flash").load = env_sf_load,
#ifdef CMD_SAVEENV.save = env_save_ptr(env_sf_save),
#endif
#if defined(INITENV) && defined(CONFIG_ENV_ADDR).init = env_sf_init,
#endif
};
/***********************env/env.c 其他函数*****************************//***************************************************************/
//解释:从env_htab 中导出到env_out中,并计算env_out->crcint env_export(env_t *env_out)
{char *res;ssize_t len;res = (char *)env_out->data;len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);if (len < 0) {pr_err("Cannot export environment: errno = %d\n", errno);return 1;}env_out->crc = crc32(0, env_out->data, ENV_SIZE);#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENTenv_out->flags = ++env_flags; /* increase the serial */
#endifreturn 0;
}
/***************************************************************/
//解释:buf强制转换为env_t类型,然后导入到 全局变量env_htab
//(check:是否对比env_t的crc)
int env_import(const char *buf, int check)
三.zynq702 .config中的关键配置
CONFIG_ENV_SIZE=0x20000
CONFIG_ENV_OFFSET=0xE0000#
# Environment commands
#
# CONFIG_CMD_ASKENV is not set
CONFIG_CMD_EXPORTENV=y
CONFIG_CMD_IMPORTENV=y
CONFIG_CMD_EDITENV=y
# CONFIG_CMD_GREPENV is not set
CONFIG_CMD_SAVEENV=y
CONFIG_CMD_ENV_EXISTS=y
# CONFIG_CMD_ENV_CALLBACK is not set
# CONFIG_CMD_ENV_FLAGS is not set#
# Environment
#
# CONFIG_ENV_IS_IN_EEPROM is not set
# CONFIG_ENV_IS_IN_FAT is not set
# CONFIG_ENV_IS_IN_EXT4 is not set
# CONFIG_ENV_IS_IN_FLASH is not set
# CONFIG_ENV_IS_IN_MMC is not set
# CONFIG_ENV_IS_IN_NAND is not set
# CONFIG_ENV_IS_IN_NVRAM is not set
# CONFIG_ENV_IS_IN_ONENAND is not set
# CONFIG_ENV_IS_IN_REMOTE is not set
#!!!!!!确定使用env/sf.c中的驱动(见 注1)
CONFIG_ENV_IS_IN_SPI_FLASH=y
# CONFIG_ENV_IS_IN_UBI is not set
CONFIG_ENV_SECT_SIZE=0x20000
# CONFIG_USE_DEFAULT_ENV_FILE is not set
# CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG is not set
CONFIG_NET=y
CONFIG_NET_RANDOM_ETHADDR=y
# CONFIG_NETCONSOLE is not set注1:
static enum env_location env_locations[] = {
#ifdef CONFIG_ENV_IS_IN_EEPROMENVL_EEPROM,
#endif
#ifdef CONFIG_ENV_IS_IN_EXT4ENVL_EXT4,
#endif
#ifdef CONFIG_ENV_IS_IN_FATENVL_FAT,
#endif
#ifdef CONFIG_ENV_IS_IN_FLASHENVL_FLASH,
#endif
#ifdef CONFIG_ENV_IS_IN_MMCENVL_MMC,
#endif
#ifdef CONFIG_ENV_IS_IN_NANDENVL_NAND,
#endif
#ifdef CONFIG_ENV_IS_IN_NVRAMENVL_NVRAM,
#endif
#ifdef CONFIG_ENV_IS_IN_REMOTEENVL_REMOTE,
#endif
#ifdef CONFIG_ENV_IS_IN_SATAENVL_ESATA,
#endif
#ifdef CONFIG_ENV_IS_IN_SPI_FLASHENVL_SPI_FLASH,
#endif
#ifdef CONFIG_ENV_IS_IN_UBIENVL_UBI,
#endif
#ifdef CONFIG_ENV_IS_NOWHEREENVL_NOWHERE,
#endif
};
u-boot:env源码目录分析一相关推荐
- Linux 内核获取、初次编译、源码目录分析
目录 Linux 内核获取 Linux 内核初次编译 Linux 内核源码目录分析 1.arch 目录 2.block 目录 3.crypto 目录 4.Documentation 目录 5.driv ...
- U-Boot源码目录分析(VScode工程创建及文件夹过滤)
参考:U-Boot工程目录介绍 作者:一只青木呀 发布时间: 2020-10-21 14:47:30 网址:https://blog.csdn.net/weixin_45309916/article/ ...
- uboot之源码目录分析
(1).gitignore.git工具的文件,git是一个版本管理工具(类似的还有个svn),这个文件和git有关,和uboot本身无关的,不用去管. (2)arm_config.mk.后缀是.mk, ...
- Android源码目录分析【转】
本文转载自:http://blog.csdn.net/backgarden_straw/article/details/8050783 在学习Android的过程中,学习写应用还好,一开始不用管太多代 ...
- linux内核源码目录分析
/arch.arch是architecture的缩写.arch目录下是好多个不同架构的CPU的子目录,譬如arm这种cpu的所有文件都在arch/arm目录下,X86的CPU的所有文件都在arch/x ...
- 【原创】【专栏】《Linux设备驱动程序》--- LDD3源码目录结构和源码分析经典链接
http://blog.csdn.net/geng823/article/details/37567557 [原创][专栏]<Linux设备驱动程序>--- LDD3源码目录结构和源码分析 ...
- xf86-video-intel源码分析1 —— 源码目录结构概览
在<Spectacle/Flameshot/X11 Xlib截屏问题现象及解决方法>一文(链接如下)中提到, Spectacle/Flameshot/X11 Xlib截屏问题现象及解决方法 ...
- Pixhawk飞控源码目录结构及编译流程分析
http://blog.csdn.net/xlb7679/article/details/51658956 (PS:这是第一次写博客,以前也有记录一些经验总结心得什么的,不过都是手写笔记或者记在 ...
- 【Busybox】Busybox源码分析-01 | 源码目录结构和程序入口
文章目录 一.Busybox简介 (1-1)开源项目 (1-2)程序本体较小 (1-3)使用简单 二.Busybox源码目录结构 三.Busybox程序主体 四.Busybox程序运行剖析
最新文章
- B-树 B+树复习总结
- mysql恢复 报错_Mysql 数据恢复报错
- python基础入门(10)之循环语句
- 自适应网页设计/响应式Web设计 (Responsive Web Design)
- java format 补足空格_11 个简单的 Java 性能调优技巧
- tomcat安装成功页面翻译
- C语言和设计模式(解释器模式)
- poj3667 hotel
- 软件测试——测试计划
- kuangbin新模板错误
- 【机器学习】监督学习的分类:判别/生成模型,概率/非概率模型、参数/非参数模型
- 论文--Learning to Predict Bus Arrival Time From Heterogeneous Measurements via Recurrent Neural Networ
- SAP那些事-理论篇-13-SAP问题解决思路
- 左手手型投篮姿势教程
- 线性代数计算器C语言(1)——计算行列式值
- OpenCV图像拼接和图像融合技术
- VS 制作自定义安装程序
- 【人工智能】CB Insights:2018年全球人工智能发展趋势报告
- 用PicGo+Gitee搭建免费图床
- C语言写出一个随机生成1-100数字的猜数字游戏