uboot移植之环境变量bootcmd

一.  简介

uboot 中有两个非常重要的环境变量 bootcmd 和 bootargs,接下来看一下这两个环境变量。
bootcmd 和 bootagrs 是采用类似 shell 脚本语言编写的,里面有很多的变量引用。
这些变量其实 都 是 环 境 变 量 , 有 很 多 是 NXP 自 己 定 义 的 。

本文来学习 uboot的环境变量 bootcmd。

二.   uboot 环境变量 bootcmd

1.   uboot 环境变量 bootcmd

文 件 mx6ull_alientek_emmc.h 中的宏 CONFIG_EXTRA_ENV_SETTINGS 保存着这些环境变量的默认值,内容如下:
#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内核。

你可能感兴趣的:(uboot,系统移植篇,arm开发,linux)