目的:探索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源码目录分析一相关推荐

  1. Linux 内核获取、初次编译、源码目录分析

    目录 Linux 内核获取 Linux 内核初次编译 Linux 内核源码目录分析 1.arch 目录 2.block 目录 3.crypto 目录 4.Documentation 目录 5.driv ...

  2. U-Boot源码目录分析(VScode工程创建及文件夹过滤)

    参考:U-Boot工程目录介绍 作者:一只青木呀 发布时间: 2020-10-21 14:47:30 网址:https://blog.csdn.net/weixin_45309916/article/ ...

  3. uboot之源码目录分析

    (1).gitignore.git工具的文件,git是一个版本管理工具(类似的还有个svn),这个文件和git有关,和uboot本身无关的,不用去管. (2)arm_config.mk.后缀是.mk, ...

  4. Android源码目录分析【转】

    本文转载自:http://blog.csdn.net/backgarden_straw/article/details/8050783 在学习Android的过程中,学习写应用还好,一开始不用管太多代 ...

  5. linux内核源码目录分析

    /arch.arch是architecture的缩写.arch目录下是好多个不同架构的CPU的子目录,譬如arm这种cpu的所有文件都在arch/arm目录下,X86的CPU的所有文件都在arch/x ...

  6. 【原创】【专栏】《Linux设备驱动程序》--- LDD3源码目录结构和源码分析经典链接

    http://blog.csdn.net/geng823/article/details/37567557 [原创][专栏]<Linux设备驱动程序>--- LDD3源码目录结构和源码分析 ...

  7. xf86-video-intel源码分析1 —— 源码目录结构概览

    在<Spectacle/Flameshot/X11 Xlib截屏问题现象及解决方法>一文(链接如下)中提到, Spectacle/Flameshot/X11 Xlib截屏问题现象及解决方法 ...

  8. Pixhawk飞控源码目录结构及编译流程分析

     http://blog.csdn.net/xlb7679/article/details/51658956 (PS:这是第一次写博客,以前也有记录一些经验总结心得什么的,不过都是手写笔记或者记在 ...

  9. 【Busybox】Busybox源码分析-01 | 源码目录结构和程序入口

    文章目录 一.Busybox简介 (1-1)开源项目 (1-2)程序本体较小 (1-3)使用简单 二.Busybox源码目录结构 三.Busybox程序主体 四.Busybox程序运行剖析

最新文章

  1. B-树 B+树复习总结
  2. mysql恢复 报错_Mysql 数据恢复报错
  3. python基础入门(10)之循环语句
  4. 自适应网页设计/响应式Web设计 (Responsive Web Design)
  5. java format 补足空格_11 个简单的 Java 性能调优技巧
  6. tomcat安装成功页面翻译
  7. C语言和设计模式(解释器模式)
  8. poj3667 hotel
  9. 软件测试——测试计划
  10. kuangbin新模板错误
  11. 【机器学习】监督学习的分类:判别/生成模型,概率/非概率模型、参数/非参数模型
  12. 论文--Learning to Predict Bus Arrival Time From Heterogeneous Measurements via Recurrent Neural Networ
  13. SAP那些事-理论篇-13-SAP问题解决思路
  14. 左手手型投篮姿势教程
  15. 线性代数计算器C语言(1)——计算行列式值
  16. OpenCV图像拼接和图像融合技术
  17. VS 制作自定义安装程序
  18. 【人工智能】CB Insights:2018年全球人工智能发展趋势报告
  19. 用PicGo+Gitee搭建免费图床
  20. C语言写出一个随机生成1-100数字的猜数字游戏

热门文章

  1. java 启动参数 别名,Spring boot 参数别名处理
  2. android悬浮窗口 关闭,Android悬浮窗的创建及关闭
  3. Python 编辑器哪个好用
  4. html app下载页功能开发
  5. 《饥荒》利用LUA脚本点亮全地图,没有黑夜
  6. virbr0怎么关闭_kvm虚拟化关闭虚拟网卡virbr0的方法
  7. 地形因子分类整合方案
  8. python while循环跳出_python如何跳出while循环
  9. 【iOS-UIImagePickerController访问相机和相册】
  10. 计算机配置价格对比,硬件配置、价格对比