uboot环境变量(ENV)常用指令及定义

以下是U-Boot中一些默认的环境变量,uboot本身会使用这些环境变量来进行配置:

(但我们可以自己定义一些环境变量来供我们自己uboot驱动来使用)

  • 默认环境变量

环 境 变 量

解 释 说 明

bootdelay

执行自动启动(bootcmd中的命令)的等候秒数

baudrate

串口控制台的波特率

netmask

以太网的网络掩码

ethaddr

以太网的MAC地址

bootfile

默认的下载文件名

bootargs

传递给Linux内核的启动参数

bootcmd

自动启动时执行命令

serverip

TFTP服务器端的IP地址

ipaddr

本地的IP地址

stdin

标准输入设备,一般是串口

stdout

标准输出,一般是串口,也可是LCD(VGA)

stderr

标准出错,一般是串口,也可是LCD(VGA)

执行bootcmd时其实是执行该环境变量的值,比如:setenv bootcmd tftp;

那么bootcmd就是执行tftp命令。

在common/env_default.h文件中定义了这些默认的环境变量值:

/*
 * (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>
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#include <env_callback.h>

///
#ifdef DEFAULT_ENV_INSTANCE_EMBEDDED
env_t environment __PPCENV__ = {
	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

///
#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_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) && (CONFIG_BOOTDELAY >= 0)
	"bootdelay="	__stringify(CONFIG_BOOTDELAY)	"\0"
#endif

#if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0)
	"baudrate="	__stringify(CONFIG_BAUDRATE)	"\0"
#endif

#ifdef	CONFIG_LOADS_ECHO
	"loads_echo="	__stringify(CONFIG_LOADS_ECHO)	"\0"
#endif

#ifdef	CONFIG_ETHADDR
	"ethaddr="	__stringify(CONFIG_ETHADDR)	"\0"
#endif

#ifdef	CONFIG_ETH1ADDR
	"eth1addr="	__stringify(CONFIG_ETH1ADDR)	"\0"
#endif

#ifdef	CONFIG_ETH2ADDR
	"eth2addr="	__stringify(CONFIG_ETH2ADDR)	"\0"
#endif

#ifdef	CONFIG_ETH3ADDR
	"eth3addr="	__stringify(CONFIG_ETH3ADDR)	"\0"
#endif

#ifdef	CONFIG_ETH4ADDR
	"eth4addr="	__stringify(CONFIG_ETH4ADDR)	"\0"
#endif

#ifdef	CONFIG_ETH5ADDR
	"eth5addr="	__stringify(CONFIG_ETH5ADDR)	"\0"
#endif

#ifdef	CONFIG_ETHPRIME
	"ethprime="	CONFIG_ETHPRIME			"\0"
#endif

#ifdef	CONFIG_IPADDR
	"ipaddr="	__stringify(CONFIG_IPADDR)	"\0"
#endif

#ifdef	CONFIG_SERVERIP
	"serverip="	__stringify(CONFIG_SERVERIP)	"\0"
#endif

#ifdef	CONFIG_SYS_AUTOLOAD
	"autoload="	CONFIG_SYS_AUTOLOAD		"\0"
#endif

#ifdef	CONFIG_PREBOOT
	"preboot="	CONFIG_PREBOOT			"\0"
#endif

#ifdef	CONFIG_ROOTPATH
	"rootpath="	CONFIG_ROOTPATH			"\0"
#endif

#ifdef	CONFIG_GATEWAYIP
	"gatewayip="	__stringify(CONFIG_GATEWAYIP)	"\0"
#endif

#ifdef	CONFIG_NETMASK
	"netmask="	__stringify(CONFIG_NETMASK)	"\0"
#endif

#ifdef	CONFIG_HOSTNAME
	"hostname="	__stringify(CONFIG_HOSTNAME)	"\0"
#endif

#ifdef	CONFIG_BOOTFILE
	"bootfile="	CONFIG_BOOTFILE			"\0"
#endif

#ifdef	CONFIG_LOADADDR
	"loadaddr="	__stringify(CONFIG_LOADADDR)	"\0"
#endif

#ifdef	CONFIG_CLOCKS_IN_MHZ
	"clocks_in_mhz=1\0"
#endif

#if defined(CONFIG_PCI_BOOTDELAY) && (CONFIG_PCI_BOOTDELAY > 0)
	"pcidelay="	__stringify(CONFIG_PCI_BOOTDELAY)"\0"
#endif

#ifdef	CONFIG_ENV_VARS_UBOOT_CONFIG
	"arch="		CONFIG_SYS_ARCH			"\0"
	"cpu="		CONFIG_SYS_CPU			"\0"
	"board="	CONFIG_SYS_BOARD		"\0"
	"board_name="	CONFIG_SYS_BOARD		"\0"
#ifdef CONFIG_SYS_VENDOR
	"vendor="	CONFIG_SYS_VENDOR		"\0"
#endif
#ifdef CONFIG_SYS_SOC
	"soc="		CONFIG_SYS_SOC			"\0"
#endif
#endif

#ifdef	CONFIG_EXTRA_ENV_SETTINGS
	CONFIG_EXTRA_ENV_SETTINGS
#endif
	"\0"
	
#ifdef DEFAULT_ENV_INSTANCE_EMBEDDED
	}
#endif
};

        u-boot的env都是按name=value"\0"的方式存储,在所有env的最后以"\0\0"表示整个env的结束。所以可以看到每个变量定义的后面都会尾随一个"\0"

        在其中定义了一个数组:default_environment[],该数组就是外面需要用到的。

  • 自定义环境变量

        如果在自身平台的文件中定义了“CONFIG_EXTRA_ENV_SETTINGS”变量,就可以自己定义一些环境变量来供我们自己uboot驱动来使用。

        比如我的平台为全志的A40i,在include/configs/sun8iw11p1.h文件中有定义:

#define CONFIG_EXTRA_ENV_SETTINGS \
	"bootdelay=3\0" \
	"bootcmd=run setargs_nand boot_normal\0" \
	"console=ttyS0,115200\0" \
	"nand_root=/dev/nandd\0" \
	"mmc_root=/dev/mmcblk0p7\0" \
	"init=/init\0" \
	"loglevel=8\0" \
	"setargs_nand=setenv bootargs console=${console} root=${nand_root}" \
	"init=${init} loglevel=${loglevel} partitions=${partitions}\0" \
	"setargs_mmc=setenv bootargs console=${console} root=${mmc_root}" \
	"init=${init} loglevel=${loglevel} partitions=${partitions}\0" \
	"boot_normal=tft 40007800 boot.img;boota 40007800\0" \
	"boot_recovery=sunxi_flash read 4007f800 recovery;boota 4007f800\0" \
	"boot_fastboot=fastboot\0 ipaddr=172.20.10.250" \
	"serverip=172.20.10.128 netmask=255.255.254.0 ethaddr=08:23:3e:26:0b:5c"

我所使用的就是这里定义的环境变量。

=========================================================================

摘抄一段:

Uboot环境变量的设计逻辑是在启动过程中将env从静态存储器中读出放到RAM中,之后在uboot下对env的操作(如printenv editenv setenv)都是对RAM中env的操作,只有在执行saveenv时才会将RAM中的env重新写入静态存储器中。

这种设计逻辑可以加快对env的读写速度。

基于这种设计逻辑,2014.4版本uboot实现了saveenv这个保存env到静态存储器的命令,而没有实现读取env到RAM的命令。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值