uboot学习笔记4--bootcmd和bootargs环境变量

感觉现在有点跳着学了,陷进uboot几天了,企图理解uboot的过程,然后发现,有些东西根本就不理解,所以决定先看后面再回来学吧。

uboot中有很多环境变量,下面介绍其中两个bootcmd和bootargs。
这两个环境变量都是NXP自己定义的,放在.h文件中,路径在/include/configs下
在这里插入图片描述
上面的宏是条件编译语句,使用NAND和使用EMMC是不同的。

1.环境变量bootcmd

bootcmd保存着uboot默认命令,uboot倒计时结束以后就会执行bootcmd中的命令。这些命令一般用来启动linu内核,比如读取EMMC或者NAND Flash中的linux内核镜像文件和设备树文件到DRAM中,然后启动linux内核。可以在 uboot 启动以后进入命令行设置 bootcmd 环境变量的值。如果 EMMC 或者 NAND 中没有保存 bootcmd 的值,那么 uboot 就会使用默认的值,板子第一次运行 uboot 的时候都会使用默认值来设置 bootcmd 环境变量。

bootcmd环境变量定义在include/env_default.h中。
在这里插入图片描述
然后跳转到CONFIG_BOOTCOMMAND中
在这里插入图片描述
第205行:run findfdt;使用的是uboot的run命令来运行findfdt,findfdt是NXP自行添加的环境变量。findfdt是用来查找开发板对应的设备树文件(.dtb)。 IMX6ULL EVK 的设备树文件为 imx6ull-14x14-evk.dtb, findfdt 内容如下:
在这里插入图片描述
findfdt里面用到的变量有fdt_file,board_name,board_rev,这三个环境变量内容如下:
fdt_file=undefine,board_name=EVK,board_rev_14X14
findfdt 做的事情就是判断, fdt_file 是否为 undefined,如果 fdt_file 为 undefined 的话那就要根据板子信息得出所需的.dtb 文件名。

206行:mmc dev ${mmcdev}用于切换mmc设备,mmcdev为1,因此这行代码就是:mmc dev 1,也就是先切换到EMMC上。

207行:先执行mmc dev ${mmcdev}切换到EMMC上,然后使用命令mmc rescan扫描有没有SD卡或者EMMC存在,如果没有的话就直接跳到216行,执行run netboot,netboot也是一个自定义的环境变量,这个变量是从网络启动linux。如果mmc设备存在的话就从mmc设备启动。

208行:运行loadbootscript环境变量,此环境变量的内容如下:
在这里插入图片描述
相关参数mmcdev mmcpart loadaddr script可以在源代码中具体取值
其中 mmcdev = 1,mmcpart=1,loadaddr=0x80800000,script = boot.src
因此上述表达式可以表示为:loadbootscript = fatload mmc 1:1 0x80800000 boot.src
loadbootscript就是从mmc1的分区1中读取文件boot.src到DRAM的0x80800000处。
可以使用ls mmc 1:1看下boot.src是否存在,好的吧,不存在。。。。

209行:如果加载boot.src文件成功的话就运行bootscript环境变量,bootscript的内容如下:
在这里插入图片描述
因为boot.src文件不存在,所以bootscript也就不会执行。

211行:如果 loadbootscript 没有找到 boot.src 的话就运行环境变量 loadimage,环境变量loadimage 内容如下:
在这里插入图片描述
我们可以知道mmcdev = 1,mmcpart=1,loadaddr=0x80800000,image = zImage
展开以后就是loadimage=fatload mmc 1:1 0x80800000 zImage
可以看出 loadimage 就是从 mmc1 的分区中读取 zImage 到内存的 0X80800000 处,而 mmc1的分区 1 中存在 zImage。

科普一下fatload命令,就是用于从fat文件系统设备中读取指定文件放入指定内存中。

212行:加载linux镜像文件zImage成功以后就要运行环境变量mmcboot,否则的话运行netboot环境变量,mmc环境变量如下:
在这里插入图片描述
154行,输出信息“Boot from mmc…”

155行:运行环境变量mmcargs,mmcargs是用来设置bootargs的,如下:
在这里插入图片描述
156行:判断tboot_fdt是否为yes或try,根据uboot输出的环境变量信息可知boot_fdt=try,可以用print boot_fdt查看

test命令:检查文件和比较值

157行:运行环境变量loadfdt,环境变量loadfdt定义如下:
在这里插入图片描述
展开以后就是fatload mmc 1:1 0x83000000 imx6ull-14x14-evk.dtb
此处的作用就是从mmc1的分区1中读取 imx6ull-14x14-evk.dtb文件并放到0x83000000处。

158行:如果读取.dtb文件成功的话那就调用命令bootz启动linux,调用方法是
bootz ${loadaddr} - ${fdt_addr};
展开就是:bootz 0x80800000 - 0x83000000
至此Linux内核启动,前面这么多的设置就是为了从EMMC中读取zImage镜像文件和设备树文件。

整个过程就是介个亚子

mmc dev 1 //切换到 EMMC
fatload mmc 1:1 0x80800000 zImage //读取 zImage 到 0x80800000 处
fatload mmc 1:1 0x83000000 imx6ull-14x14-evk.dtb //读取设备树到 0x83000000 处
bootz 0x80800000 - 0x83000000 //启动 Linux

2.环境变量bootargs

bootargs保存着uboot传递给Linux内核的参数,从上面我们已经知道bootargs环境变量是由mmcargs设置的,mmcargs环境变量如下:
mmcargs=setenv bootargs console=${console},${baudrate} root=${mmcroot}
其中console=ttymxc0,baudrate=115200,mmcroot=/dev/mmcblk1p2 rootwait rw
展开之后就是mmcargs = setenv bootargs console = ttymxc0,115200 root=/dev/mmcblklp2 rootwait rw

可以看出bootargs就是设置参数的,这些参数linux内核将会使用到
1.console
console用来设置linux终端(或者叫控制台),也就是通过什么设备来和linux进行交互,是串口还是LCD屏幕,如果是串口的话应该是串口几,一般设置串口作为Linux终端,这样我们就可以在电脑上通过SecureCRT来和linux交互。这里设置console为ttymxc0,因为linux启动以后I.MX6ULL的串口1在linux下的设备文件就是/dev/ttymxc0,在Linux下,一切皆文件。

ttymxc0 后面有个“,115200”,这是设置串口的波特率, console=ttymxc0,115200 综合起来就是设置 ttymxc0(也就是串口 1)作为 Linux 的终端,并且串口波特率设置为 115200。

2.root
root 用来设置根文件系统的位置, root=/dev/mmcblk1p2 用于指明根文件系统存放在mmcblk1 设备的分区 2 中。 EMMC 版本的核心板启动 linux 以后会存在/dev/mmcblk0、/dev/mmcblk1、 /dev/mmcblk0p1、/dev/mmcblk0p2、 /dev/mmcblk1p1 和/dev/mmcblk1p2 这样的文件,其中/dev/mmcblkx(x=0~ n)表示 mmc 设备,而/dev/mmcblkxpy(x=0~ n,y=1~ n)表示 mmc 设备x 的分区 y。在 I.MX6U-ALPHA 开发板中/dev/mmcblk1 表示 EMMC,而/dev/mmcblk1p2 表示EMMC 的分区 2。

root 后面有“rootwait rw”, rootwait 表示等待 mmc 设备初始化完成以后再挂载,否则的话mmc 设备还没初始化完成就挂载根文件系统会出错的。 rw 表示根文件系统是可以读写的,不加rw 的话可能无法在根文件系统中进行写操作,只能进行读操作。

2.rootfstype
此选项一般配置 root 一起使用, rootfstype 用于指定根文件系统类型,如果根文件系统为ext 格式的话此选项无所谓。如果根文件系统是 yaffs、 jffs 或 ubifs 的话就需要设置此选项,指定根文件系统的类型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章