bootcmd
,包括:run findfdt; run mmcboot; setenv mmcdev 1; setenv bootpart 1:2; run mmcboot; run nandboot;
首先執行
findfdt
依板子名稱決定 dtb 檔,然後嘗試開機,先執行 mmcboot
嘗試從 mmc0 (µSD) 開機。如果失敗,設定後再次執行 mmcboot
嘗試從 mmc1 (eMMC) 開機,最後執行 nandboot
嘗試 NAND 開機。findfdt
if test $board_name = A335BONE; then setenv fdtfile am335x-bone.dtb; fi; if test $board_name = A335BNLT; then setenv fdtfile am335x-boneblack.dtb; fi; if test $board_name = A33515BB; then setenv fdtfile am335x-evm.dtb; fi; if test $board_name = A335X_SK; then setenv fdtfile am335x-evmsk.dtb; fi; if test $fdtfile = undefined; then echo WARNING: Could not determine device tree to use; fi;board_name 讀自板子的 eeprom,決定 fdtfile 用哪個 dtb 檔。BBB 是 A335BNLT,dtb 檔是 am335x-boneblack.dtb。後續讀取的 uEnv.txt 可再修改 fdtfile。
mmcboot:從 mmc 開機
mmcboot 內容如下:mmc dev ${mmcdev}; if mmc rescan; then echo SD/MMC found on device ${mmcdev}; if run loadbootscript; then run bootscript; else if run loadbootenv; then echo Loaded environment from ${bootenv}; run importbootenv; fi; if test -n $uenvcmd; then echo Running uenvcmd ...; run uenvcmd; fi; if run loadimage; then run mmcloados; fi; fi ; fi;mmcdev 決定哪個 MMC device,一開始預設是 0,
mmc rescan
有找到的話,才會執行相關動作。loadbootscript 載入檔案 boot.scr 到記憶體,成功的話透過 bootscript 執行並結束 mmcboot。
loadbootenv 載入 bootenv 檔案內的開機環境變數到記憶體,再用 importbootenv 設為環境變數。bootenv 預設是 uEnv.txt,如果有提供 uenvcmd,則執行它。
執行 loadimage 載入 bootfile 成功的話,執行 mmcloados 設定 bootargs,並嘗試載入 fdtfile 後 bootz。
loadimage:
load mmc ${bootpart} ${loadaddr} ${bootdir}/${bootfile}預設載入的 bootfile 是位於第二分割的 boot/zImage。
mmcloados:
run args_mmc; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if run loadfdt; then bootz ${loadaddr} - ${fdtaddr}; else if test ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi;
args_mmc (設定 bootargs 開機參數):
run finduuid; setenv bootargs console=${console} ${optargs} root=PARTUUID=${uuid} rw rootfstype=${mmcrootfstype}
finduuid
part uuid mmc 0:2 uuid應該改成
part uuid mmc ${bootpart} uuid
loadfdt:載入 fdtfile
load mmc ${bootpart} ${fdtaddr} ${bootdir}/${fdtfile}
bootz:從記憶體啟動 Linux zImage 影像檔
執行 bootz 後控制權轉移了,bootcmd 就結束了。
nandboot
設定 bootargs,從 nand 載入 bootfile 後,bootz。在 ti EZSDK 有類似的 u-boot 動作
把原本的 bootcmd 分成 bootcmd_mmc0 及 bootcmd_nand,bootcmd_nand 就是 run nandboot。另外有 bootcmd_usb 給 usb 開機用bootcmd_mmc0 是 run mmc_boot,會嘗試從 mmc0 及 mmc1 開機,但在 run mmcboot 前,先 run scan_boot,可從多種可能的 bootdir 及 bootfile run script_boot 來嘗試開機。不過 script_boot 看起來有些錯誤。scan_boot 也用在 bootcmd_usb。
沒有留言:
張貼留言