uboot环境变量的使用

2023/08/02 19:05
阅读数 142

文章转载自易百纳技术社区

Uboot Env

本文介绍uboot中环境变量的使用,包括配置环境变量,设置环境变量分区,编译环境变量工具等。

一、代码中配置默认环境变量

文件:include/env_default.h:default_environment

/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * (C) Copyright 2000-2010
 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 *
 * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com>
 * Andreas Heppel <aheppel@sysgo.de>
 */

#include <env_callback.h>

#ifdef DEFAULT_ENV_INSTANCE_EMBEDDED
env_t embedded_environment __UBOOT_ENV_SECTION__(environment) = {
        ENV_CRC,        /* CRC Sum */
#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
        1,              /* Flags: valid */
#endif
        {
#elif defined(DEFAULT_ENV_INSTANCE_STATIC)
static char default_environment[] = {
#else
const uchar default_environment[] = {
#endif
#ifndef CONFIG_USE_DEFAULT_ENV_FILE
#ifdef  CONFIG_ENV_CALLBACK_LIST_DEFAULT
        ENV_CALLBACK_VAR "=" CONFIG_ENV_CALLBACK_LIST_DEFAULT "\0"
#endif
#ifdef  CONFIG_ENV_FLAGS_LIST_DEFAULT
        ENV_FLAGS_VAR "=" CONFIG_ENV_FLAGS_LIST_DEFAULT "\0"
#endif
#ifdef  CONFIG_USE_BOOTARGS
        "bootargs="     CONFIG_BOOTARGS                 "\0"
#endif
#ifdef  CONFIG_BOOTCOMMAND
        "bootcmd="      CONFIG_BOOTCOMMAND              "\0"
#endif
#ifdef  CONFIG_RAMBOOTCOMMAND
        "ramboot="      CONFIG_RAMBOOTCOMMAND           "\0"
#endif
#ifdef  CONFIG_NFSBOOTCOMMAND
        "nfsboot="      CONFIG_NFSBOOTCOMMAND           "\0"
#endif
#if defined(CONFIG_BOOTDELAY)
        "bootdelay="    __stringify(CONFIG_BOOTDELAY)   "\0"
#endif

可以看到大部分环境变量都引用了对应的宏,在实际使用中也可以通过修改宏来控制环境变量。

二、uboot命令行设置环境变量

# 查询环境变量
print
# 设置环境变量
setenv serverip 192.168.137.1
# 保存环境变量
sa
# 设置环境变量时引用其它环境变量
setenv gatewayip ${serverip}

三、环境变量分区

1)环境变量分区的配置

使用环境变量分区可以直接在Linux中操作环境变量,控制uboot的行为。要想uboot正确识别到环境变量分区需要设置环境变量分区所在的存储设备类型,偏移地址、大小。本文的测试环境为emmc启动。设置的环境变量分别是CONFIG_ENV_IS_IN_MMC、CONFIG_ENV_OFFSET、CONFIG_ENV_SIZE。配置路径可以在menuconfig中直接搜对应的配置。

  │ │          [ ] Environment in flash memory                                                 │ │  
  │ │          [*] Environment in an MMC device                                                │ │  
  │ │          [ ] Environment in a NAND device                                                │ │  
  │ │          [ ] Environment in a non-volatile RAM                                           │ │  
  │ │          [ ] Environment is in OneNAND                                                   │ │  
  │ │          [ ] Environment is in remote memory space                                       │ │  
  │ │          [ ] Enable redundant environment support                                        │ │  
  │ │          (0x180000) Environment offset                                                   │ │  
  │ │          (0x80000) Environment Size                                                      │ │  
  │ │          [ ] Relocate gd->en_addr                                                        │ │  
  │ │          [ ] Create default environment from file                                        │ │  
  │ │          [ ] Add run-time information to the environment                                 │ │  

2)环境变量分区镜像制作

工具:$(UBOOT_DIR)/tools/mkenvimage

# -s 指定大小,必须和u-boot中的配置相同
# -o 指定输出镜像文件
$(UBOOT_DIR)/tools/mkenvimage -s 0x80000 -o $(TARGET_DIR)/uboot_env.bin $(TARGET_DIR)/uEnv.txt

uEnv.txt文件的内容,每行开始到第一个等号之间的字符串被认为是变量名,剩下的被认为是变量值,因此即使包含空格也不需要像命令行中一样添加引号

bootargs=mem=512M console=ttyAMA0,115200 clk_ignore_unused root=/dev/mmcblk0p4 rootfstype=ext4 rw rootwait blkdevparts=mmcblk0:1536K(boot),512K(env),40M(kernel),-(rootfs)
bootcmd=setenv bootargs "${bootargs} ${ortherargs}";mmc read 0 0x42000000 0x1000 0x6307;bootm 0x42000000

环境变量分区默认环境变量冲突的部分使用环境变量分区中的值,剩余的部分取环境变量分区默认环境变量的并集

3)Linux中修改环境变量

工具:$(UBOOT_DIR)/tools/env/fw_printenv

工具怎么编译?

我在网上看到不同的版本,具体怎么编译可以通过make help命令在帮助中查看。我这个版本使用 make ARCH=arm CROSS_COMPILE=xxxxx(见原文)-mix210-linux- envtools

命令进行编译,注意指定编译器以及架构

工具怎么使用?

工具本身不依赖库,但是需要一个配置文件。默认的配置文件在$(UBOOT_DIR)/tools/env/fw_env.config

将文件放到目标平台的/etc/fw_env.config,根据实际情况进行配置即可。我是用的配置是

/dev/mmcblk0p2          0x00000         0x80000

在linux中使用:

# 两个工具实际是同一个可执行文件,只需创建对应的链接即可
ln -s fw_printenv fw_setenv
# 查看当前系统的环境变量
fw_printenv
# 设置环境变量
fw_setenv ipaddr "192.168.137.2"
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部