uboot环境变量的使用

uboot环境变量的使用 cxcc 2023-07-28 08:48:19 510

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=aarch64-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"
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
cxcc
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
cxcc
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区