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中的,