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 的話就需要設置此選項,指定根文件系統的類型。

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