一. 简介
uboot 中有两个非常重要的环境变量 bootcmd 和 bootargs,接下来看一下这两个环境变量。
bootcmd 和 bootagrs 是采用类似 shell 脚本语言编写的,里面有很多的变量引用。
这些变量其实 都 是 环 境 变 量 , 有 很 多 是 NXP 自 己 定 义 的 。
本文来学习 uboot的环境变量 bootcmd。
二. uboot 环境变量 bootcmd
1. uboot 环境变量 bootcmd
文 件
mx6ull_alientek_nand.h
中的宏 CONFIG_EXTRA_ENV_SETTINGS
保存着这些环境变量的默认值。
mx6ull_alientek_nand.h 文件所在目录: uboot根目录下/include/configs
内容如下:
#if defined(CONFIG_SYS_BOOT_NAND)
#define CONFIG_EXTRA_ENV_SETTINGS \
CONFIG_MFG_ENV_SETTINGS \
"panel=TFT43AB\0" \
"fdt_addr=0x83000000\0" \
....................
#else
#define CONFIG_EXTRA_ENV_SETTINGS \
CONFIG_MFG_ENV_SETTINGS \
"script=boot.scr\0" \
"image=zImage\0" \
....................
#endif
宏
CONFIG_EXTRA_ENV_SETTINGS
是个条件编译语句,使用
NAND版 或者
EMMC版的开发板 时,
宏
CONFIG_EXTRA_ENV_SETTINGS
的值是不同的。
(1) 默认环境变量
bootcmd 在前面已经说了很多次了,bootcmd 保存着 uboot 默认命令,uboot 倒计时结束以后就会执行 bootcmd 中的命令。这些命令一般都是用来启动 Linux 内核的,比如读取 EMMC 或者 NAND Flash 中的 Linux 内核镜像文件和设备树文件到 DRAM 中,然后启动 Linux 内核。可 以在 uboot 启动以后进入命令行设置 bootcmd 环境变量的值。
如果
EMMC
或者
NAND
中没有保存
bootcmd
的值,那么
uboot
就会使用默认的值,板子第一次运行
uboot
的时候都会使用默
认值来设置
bootcmd
环境变量。
打开文件
include/env_default.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
.....................
#ifdef DEFAULT_ENV_INSTANCE_EMBEDDED
}
#endif
};
第1~11
行 , 这 段 代 码 是 个 条 件 编 译 , 由 于 没 有 定 义
DEFAULT_ENV_INSTANCE_EMBEDDED
和
CONFIG_SYS_REDUNDAND_ENVIRONMENT
,
因此
uchar default_environment[]
数组保存环境变量。
mx6ull_alientek_emmc.h文件中,指定了很多环境变量的默认值,比如 bootcmd 的默认值就是
CONFIG_BOOTCOMMAND
,
bootargs
的默认值就是
CONFIG_BOOTARGS
。
我们可以在
mx6ull_alientek_emmc.h
文件中通过设置宏
CONFIG_BOOTCOMMAND
来设置
bootcmd
的默认
值。
(2) NAND-Flash版的开发板对应的 bootcmd
因为我所使用的是ALPHA开发板是 NAND-Flash版的。所以,这里分析一下,对应NAND版开发板的 bootcmd。
mx6ull_alientek_emmc.h文件中, 如下:
#if defined(CONFIG_SYS_BOOT_NAND)
#define CONFIG_EXTRA_ENV_SETTINGS \
CONFIG_MFG_ENV_SETTINGS \
"panel=TFT43AB\0" \
"fdt_addr=0x83000000\0" \
"fdt_high=0xffffffff\0" \
"console=ttymxc0\0" \
"bootargs=console=ttymxc0,115200 ubi.mtd=4 " \
"root=ubi0:rootfs rootfstype=ubifs " \
CONFIG_BOOTARGS_CMA_SIZE \
"mtdparts=gpmi-nand:64m(boot),16m(kernel),16m(dtb),1m(misc),-(rootfs)\0"\
"bootcmd=nand read ${loadaddr} 0x4000000 0x800000;"\
"nand read ${fdt_addr} 0x5000000 0x100000;"\
"bootz ${loadaddr} - ${fdt_addr}\0"
如果所使用的开发板是 NAND-Flash版开发板。即系统是从NAND-Flash启动的,CONFIG_SYS_BOOT_NAND宏一定也会定义,会执行以上的代码。
第12 行,定义了 bootcmd的值,如下:
"bootcmd=nand read ${loadaddr} 0x4000000 0x800000;"\
"nand read ${fdt_addr} 0x5000000 0x100000;"\
"bootz ${loadaddr} - ${fdt_addr}\0"
bootcmd 展开后是:
bootcmd=nand read 0x80800000 0x4000000 0x800000
nand read 0x83000000 0x5000000 0x100000
bootz 0x80800000 - 0x83000000
三. 总结
如果开发板是从 NAND_Flash启动的话:
则uboot的环境变量 bootcmd,保存的最关键的命令就是,从 NAND-Flash加载 内核镜像和设备树文件,最后启动 Kernel 。
bootcmd最终的目的是:为了启动Linux内核。