uboot 环境变量存放在哪里,如何修改

问题 :如何找到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在自己的配置代码里面写死的。

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PetaLinux是一个基于Yocto Project的嵌入式Linux开发工具,可用于构建自定义Linux发行版。在PetaLinux中,uboot是用于启动Linux内核的引导加载程序。在uboot中,环境变量是一些可以配置uboot行为的参数。 要将uboot环境变量保存到SD卡中,可以按照以下步骤进行: 1. 在PetaLinux项目中的uboot源代码目录下,找到`include/configs`文件夹,其中包含了与硬件平台相关的uboot配置文件。 2. 打开对应的配置文件,例如`zynq_common.h`。 3. 在配置文件中,找到`#define CONFIG_ENV_IS_IN`宏定义。该宏定义指定了uboot环境变量的存储位置,默认为“nand”或“nor”等闪存设备。 4. 修改`#define CONFIG_ENV_IS_IN`宏定义为`"sd"`,指定uboot环境变量存储在SD卡中。 5. 在配置文件中,找到`#define CONFIG_ENV_OFFSET`宏定义。该宏定义指定了uboot环境变量在存储设备中的偏移地址。 6. 修改`#define CONFIG_ENV_OFFSET`宏定义为SD卡中的偏移地址,例如`0x100000`。 7. 保存并关闭配置文件。 8. 在uboot源代码目录下执行`make clean`命令来清理之前的编译结果。 9. 执行`make`命令重新编译uboot。 10. 将生成的uboot二进制文件烧录到SD卡的启动区域。 11. 将SD卡插入目标设备中,启动设备。 12. 在uboot启动时,可以使用命令`printenv`来验证uboot环境变量是否成功保存在SD卡中。 通过以上步骤,你可以将uboot环境变量保存到SD卡中。这样,在使用SD卡启动设备时,uboot可以从SD卡读取环境变量并进行相应的配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值