问题 :如何找到saveenv,这个环境变量的数据是保存在那里的
1. uboot 下搜索 saveenv(
./common/env_eeprom.c:int saveenv(void)
./common/env_nand.c:int nand_saveenv(void)
./common/env_flash.c:int saveenv(void)
./common/env_flash.c:int saveenv(void)
2. 在uboot/common 目录下找,Makefile中加载了那个.c文件
48 obj-$(CONFIG_ENV_IS_IN_MMC) += env_mmc.o
49 obj-$(CONFIG_ENV_IS_IN_UFS) += env_ufs.o
50 obj-$(CONFIG_ENV_IS_IN_FAT) += env_fat.o
51 obj-$(CONFIG_ENV_IS_IN_EXT4) += env_ext4.o
52 obj-$(CONFIG_ENV_IS_IN_NAND) += env_nand.o
53 obj-$(CONFIG_ENV_IS_IN_NVRAM) += env_nvram.o
3. 可以看到这里有很多的宏定义,搜索宏定义在哪里定义的
./include/configs/hi3516dv200.h:#define CONFIG_ENV_IS_IN_NAND
./include/configs/hi3516dv200.h:#define CONFIG_ENV_IS_IN_NAND
./include/configs/iconnect.h:#define CONFIG_ENV_IS_IN_NAND
./include/configs/spear6xx_evb.h:#define CONFIG_ENV_IS_IN_NAND
./include/configs/hi3516ev300.h:#define CONFIG_ENV_IS_IN_NAND
./include/configs/hi3516ev300.h:#define CONFIG_ENV_IS_IN_NAND
发现都是在,include/configs/ 这个目录下的
4. 那么直接去找
hi3516ev200.h
87 #ifdef CONFIG_HIFMC_SPI_NOR
88 #define CONFIG_CMD_SF
89 #define CONFIG_ENV_IS_IN_SPI_FLASH
90 #define CONFIG_SPI_NOR_MAX_CHIP_NUM 1
91 #define CONFIG_SPI_NOR_QUIET_TEST
92 #endif
93
94 #ifndef CONFIG_MINI_BOOT
95
96 #ifdef CONFIG_HIFMC_SPI_NAND
97 #define CONFIG_CMD_NAND
98 #define CONFIG_ENV_IS_IN_NAND
99 #define CONFIG_SPI_NAND_MAX_CHIP_NUM 1
100 #define CONFIG_SYS_MAX_NAND_DEVICE CONFIG_SPI_NAND_MAX_CHIP_NUM
101 #define CONFIG_SYS_NAND_MAX_CHIPS CONFIG_SPI_NAND_MAX_CHIP_NUM
102 #define CONFIG_SYS_NAND_BASE FMC_MEM_BASE
103 #endif
5. 可以看到依赖与宏定义,CONFIG_HIFMC_SPI_NOR, CONFIG_HIFMC_SPI_NAND
可以在uboot的 .config中看到宏定义
538 CONFIG_HIFMC_SPI_NOR=y
重新去common/Makefile中去寻找CONFIG_ENV_IS_IN_SPI_FLASH,
找到obj-$(CONFIG_ENV_IS_IN_SPI_FLASH) += env_sf.o
因此确定文件就是,env_sf.c
6. 在文件env_sf.c中找到saveenv函数
找到
272 saved_size = CONFIG_ENV_SECT_SIZE - CONFIG_ENV_SIZE;
273 saved_offset = CONFIG_ENV_OFFSET + CONFIG_ENV_SIZE;
7. 重新搜索,CONFIG_ENV_SECT_SIZE, CONFIG_ENV_OFFSET
至此在include/common/hii3516ev200.h这个配置文件中找到
198 /* env in flash instead of CFG_ENV_IS_NOWHERE */
199 #define CONFIG_ENV_OFFSET 0x50000 /* environment starts here */
200
201 #define CONFIG_ENV_SIZE 0x10000
202 #define CONFIG_ENV_SECT_SIZE 0x10000
203 #define CONFIG_ENV_VARS_UBOOT_CONFIG
所以环境变量的分区地址,是uboot在自己的配置代码里面写死的。