u-boot之环境变量

本文基于u-boot.2016.03.

1、环境变量的作用

uboot中环境变量的作用就是在不改变源码、不用重新编译的情况下,可以使我们通过设置环境变量来使得代码有不同表现,如bootdelay时间、IP地址,向内核的传参bootargs等等,有些环境变量要重启后才能生效使用,有些设置后马上可以使用新设置的值了。

2、常用的环境变量

常用的环境变量定义在一个结构体中,每个环境变量由变量名,等于符号,变量内容,和"\0"组成。

/include/env_default.h

const uchar default_environment[] = {
...
#ifdef	CONFIG_BOOTARGS
	"bootargs="	CONFIG_BOOTARGS			"\0"
#endif
#ifdef	CONFIG_BOOTCOMMAND
	"bootcmd="	CONFIG_BOOTCOMMAND		"\0"
#endif
...
#ifdef	CONFIG_EXTRA_ENV_SETTINGS
	CONFIG_EXTRA_ENV_SETTINGS
#endif
...
};
环境变量描述
bootargs传给内核的启动参数
bootcmd自启动时执行的命令
bootdelay执行自动启动的等候秒数
baudrate串口控制台的波特率
ipaddr本机的IP地址
serverip服务器端的IP地址
gatewayip本机网关
netmask子网掩码
arch架构(arm)
vendor芯片厂(freescale)

这里的 CONFIG_EXTRA_ENV_SETTINGS比较特殊,一般在板级文件里定义。
我们这里使用的是sabreauto的参考开发板,这个宏定义在mx6sabre_common.h中定义。

3、代码分析

主要涉及的文件有:

common/board_f.c//uboot启动时比较靠前的初始化工作
common/board_r.c//uboot启动时比较靠后的初始化工作
common/env_common.c// 中间层实现
cmd/nvedit.c//命令层实现
common/env_flash.c//驱动层实现(以eimnor为例)
lib/Hashtable.c //哈希表实现

3.1 顺序结构:

在这里插入图片描述

3.2 分层结构:

uboot中env的整个架构可以分为3部分:

在这里插入图片描述

4、使用“bootdelay”分析

6、有用参考

https://www.cnblogs.com/lidabo/p/5274162.html

### RK3568 U-Boot 默认环境变量配置 对于RK3568平台,默认的U-Boot环境变量配置通常由设备树和具体的硬件设计决定。在默认情况下,U-Boot中的某些环境变量会被预定义并用于引导流程[^1]。 以下是常见的默认环境变量及其功能: #### 1. `bootcmd` 这是U-Boot启动时执行的主要命令序列。它负责加载内核镜像到内存中,并传递必要的参数给操作系统。 ```plaintext bootcmd=run bootargs; run loadimage; bootm ${kernel_addr} ${fdt_addr} ``` #### 2. `bootargs` 该变量包含了传递给Linux内核的启动参数。这些参数可能因具体应用而异,但一般包括根文件系统位置、控制台设置和其他初始化选项。 ```plaintext bootargs=console=ttyS0,115200 root=/dev/mmcblk0p2 rw earlyprintk ``` #### 3. `loadaddr`, `kernel_addr`, 和 `fdt_addr` 这些地址指定了内核和设备树二进制文件(Device Tree Blob, DTB)被加载到RAM的具体位置。它们通常是固定的物理地址。 ```plaintext loadaddr=0x40080000 kernel_addr=0x40080000 fdt_addr=0x43000000 ``` #### 4. `ipaddr` 和 `serverip` 当通过网络协议(如TFTP)下载内核或其他映像时,这两个变量分别表示目标IP地址和服务端IP地址。 ```plaintext ipaddr=192.168.1.10 serverip=192.168.1.1 ``` #### 5. `stdin`, `stdout`, 和 `stderr` 这三个变量决定了输入/输出流的方向,例如串口或HDMI接口。 ```plaintext stdin=serial stdout=serial stderr=serial ``` #### 自定义编译过程中的环境变量设定 如果需要针对特定开发板自定义环境变量,则可以通过修改相应的`.config`文件或者调用脚本来完成。例如,在Milky-V Duo系列中使用的编译方法可以作为参考[^2]。假设我们正在处理RK3568芯片组的情况,那么类似的构建步骤可能是这样的: ```bash export CHIP=rk3568 export VENDOR=rockchip export BOARD=evb export BOOT=sdcard BOARD_FULL=${CHIP}-${VENDOR}-${BOARD}-${BOOT} CONFIG_FULL=${CHIP}_${VENDOR}_${BOARD}_${BOOT} source device/${BOARD_FULL}/boardconfig.sh source build/rksetup.sh defconfig ${CONFIG_FULL} build_uboot ``` 上述代码片段展示了如何为指定的目标板准备合适的配置以及生成最终固件的过程。 --- ### 示例代码:保存环境变量至NVRAM 为了使更改后的环境变量永久生效,需将其写入非易失性存储器(NVRAM)。这一步骤可通过运行以下指令实现: ```bash saveenv ``` 此操作会将当前工作环境中所有的改动同步回持久化区域,从而即使断电也能保留下来。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值