[IMX6Q]u-boot环境变量原理分析

本文分析了u-boot在IMX6Q平台上如何处理环境变量,特别是在SD卡上的存储方式。从配置文件mx6q_sabresd.h开始,解释了环境变量可以存储在RAM或u-boot文本段中,并详细描述了使用RAM的情况。文章探讨了environment_s结构,以及env_init和env_relocate流程。此外,还提到了setenv和saveenv命令的功能及其对应函数。
摘要由CSDN通过智能技术生成

u-boot版本: v2009.08

一些重要参数如串口波特率,bootmcmd,loadaddr等参数,可能需要
动态修改调试,u-boot提供了环境变量env用于保存这些信息到永久性存储
介质如SD或者RAM中。RAM会丢失,而存于SD则下次开机依然存在。
u-boot命令列表中,提供了setenv, saveenv两个命令,前者用于临时保存到
RAM中,后者会保存到SD中。

几个概念:
a. 存储介质

对于不同的存储介质,它的读写操作方式也不同,本例使用SD。

uboot-imx/include/configs/mx6q_sabresd.h

#define CONFIG_FSL_ENV_IN_MMC
uboot-imx/common/Makefile

COBJS-$(CONFIG_ENV_IS_IN_MMC) += env_mmc.o
所以本例对应的是env_mmc.c

b. 事实上env即可在开机后从RAM中中分配一个数据结构临时保存,也可以直接将env放在u-boot的text段从而

节省RAM空间,本例描述的是前者,后者后面文档会描述如何实现。

c. environment_s结构

uboot-imx/include/environment.h

typedef	struct environment_s {
	uint32_t	crc;		/* CRC32 over data bytes	*/
#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
	unsigned char	flags;		/* active/obsolete flags	*/
#endif
	unsigned char	data[ENV_SIZE]; /* Environment data		*/
} env_t;
crc: 读取环境变量时先会校验,其中当第一次读取的时候,因为flash没有环境变量保存,所以会失败,这是正常的。
data: 存放环境变量。

d. 全局数据访问env
typedef	struct	global_data {
	bd_t		*bd;
	unsigned long	flags;
	unsigned long	baudrate;
	unsigned long	have_console;	/* serial_init() was called */
	unsigned long	reloc_off;	/* Relocation Offset */
	unsigned long	env_addr;	/* Address  of Environment struct */
	unsigned long	env_valid;	/* Checksum of Environment valid? */
	unsigned long	fb_base;	/* base address of frame buffer */
......
} gd_t;

reloc_off: env一开始是保存在sd中的,开机之后为了快速读取,它会被重定位到RAM中。

env_add: 上面env_t的地址,一开始是指向SD中的,

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值