Uboot 命令行 介紹


背景

基本上,本文轉載自:《ARM板移植Linux系統啟動(五)Uboot命令行》

上次說到uboot的啟動方式,最后會使用autoboot(自主模式)嘗試引導kernel,如果失敗或者被手動取消,則進入uboot的命令行(下載模式)。

最新的uboot命令行已經發展得比較完善,很大程度上接近shell,包含了各種基本的驅動和完整的工具。這些工具的源碼大多在u-boot/cmd下,查看Makefile可以看到,根據不同的配置編譯出很多命令,你也可以通過搜索字符串U_BOOT_CMD(來查找這些命令的命名。這些命令的列表可以通過命令行輸入help來查看,大致分成幾個大類。

Boot

以boot開頭的命令,圍繞引導kernel的啟動過程,有boot, bootm, bootz, bootefi, bootp等等。這其中boot和bootd只是重復調用了autoboot的過程,適用於手動設置參數后啟動的情況;其他的boot命令,則適用於不同kernel鏡像數據來源。

bootm, bootz, booti

這幾個都是從內存中的某個地址獲得kernel image。bootz是啟動zImage,而bootm和booti是啟動uImage,其中booti專門用來啟動ARM64的kernel image。
它們的基本語法是:bootX ,這里的address都是指內存的物理地址,需要提前把image和file加載到內存中,其中根文件系統的地址可以省略(包含在kernel image中),用-來代替。
在常規的啟動引導過程中,uboot的各種啟動方式實際上最后都是調用bootz的,但之前會設置很多環境變量作為啟動的參數。在調試過程中,我們也同樣可以手動設置好參數,直接用bootX系列來啟動系統。

bootefi, bootp, nboot

這三個命令用於不同來源的kernel image,一個來自efi分區中的啟動image,一個來自於網絡,一個來自nand flash。它們只是比bootz多了一步加載行為,即將kernel image從某個設備拷貝到內存中,本質上是一樣的。類似的命令還有tftpboot, usbboot, dhcp, nfs, rarpboot等。 其他boot系的命令也是大同小異,通過help能夠看到對應的說明,需要自己根據情況選擇使用。

Env

uboot的環境變量跟shell的很相似,是存放在內存中的一些字符串。一個完整的evn包括名字(name)和值(value),可以通過$XXXX來完成嵌套和調用。它們服務於最后的boot行為,用來定義啟動過程中的各種順序、參數、路徑、IP地址等等,你可以通過printenv來查看當前所有的環境變量。

askenv :查詢某個變量的值

editenv :修改某個變量的值,一般用於比較value比較長的情況

saveenv:將所有環境變量保存在存儲裝置中。這個裝置可以是nand flash, nor flash, 或者EEPROM,由uboot的源碼來定義存儲的位置和地址等信息:

if defined(CONFIG_ENV_IS_IN_NAND)
    #define CONFIG_ENV_OFFSET               0x001c0000
    #define CONFIG_ENV_OFFSET_REDUND        0x001e0000
    #define CONFIG_SYS_ENV_SECT_SIZE        CONFIG_SYS_NAND_BLOCK_SIZE
#elif !defined(CONFIG_ENV_IS_NOWHERE)
/* Not NAND, SPI, NOR or eMMC env, so put ENV in a file on FAT */
    #define CONFIG_ENV_IS_IN_FAT
    #define FAT_ENV_INTERFACE               "mmc"
    #define FAT_ENV_DEVICE_AND_PART         "0:1"
    #define FAT_ENV_FILE                    "uboot.env"
#endif/
define CONFIG_ENV_SIZE     (128 << 10)

setenv <name> <value> :修改某個變量的值,如果value為空則表示刪除這個變量

常用的環境變量

在調試中,特別是網絡調試中,環境變量的設置很重要。一般的網絡操作包括ping, boot等等都需要事先設定好正確的環境變量。這里列舉幾個常用的:

baudrate,串口控制台的波特率

netmask,網絡掩碼

ethaddr,MAC地址

serverip & ipaddr,TFTP服務器端的IP地址以及本地的IP地址

bootfile,默認的啟動文件名,在網絡啟動模式中也是默認的下載文件名

bootargs,傳遞給Linux內核的啟動參數

fdtfile & fdtaddr,dts文件默認文件名以及load的內存地址

外部設備

uboot自帶很多外設的驅動,包括USB,MMC,Nand,Nor,GPIO,SPI,MII,I2C……具體的使用幫助可以通過help 來查看。例如USB,在插入U盤的情況下,使用usb start便能看到有partition被檢測到,接下來可以通過文件系統的支持來讀取和查看U盤上的文件和目錄。

文件系統

我使用的這個uboot version為2017.03版本,其中已經包含了對fat, ext(2,3,4), cramfs, cbfs, jffs2, ubifs, yaffs2,zfs, reiserfs等相當多的文件系統支持。這其中用得最多的應該是fat和extX了。

以fat為例,幾個最重要的命令如下:

fatinfo :顯示某個設備或分區的信息,如fatinfo mmc 0

fatload [bytes]:將某個文件前X byte加載到指定的內存地址中,最后一個參數為空時加載整個文件,如fatload usb 0:1 zImage 0x80000000會把U盤上的zImage拷貝到內存的0x80000000處

fatls [directory] :讀取並打印目錄中的文件列表,如fatls mmc 1:1會打印mmc1 partition1的根目錄文件列表

fatwrite [bytes]:將指定內存開始的X byte保存為文件,如fatwrite mmc 0:1 0x80000000 img 0x1000會將內存0x80000000起始的4K數據保存在emmc0的第一個分區
其他幾個不同的文件系統的工具可照葫蘆畫瓢。
文件系統的支持不但意味着在uboot命令行我們可以手動進行文件的讀寫,還意味着在啟動階段,uboot可以從支持的文件系統分區中讀取相應的數據,也就是說,從一個ext4的partition找到zImage並啟動是可行的。這給我們配置啟動參數以更大的靈活性和可定制性,從TF等設備啟動系統也是基於這樣的支持。

獲取數據和處理

uboot關於數據的處理都是基於物理地址的,除了source和destination的地址,還有一種長度參數length,表示按照字節、字、長來處理內存數據。其中.b以字節為單位;.w以字為單位;.l以長字為單位。注意tool\中間不能有空格,例如需要直接輸入cmp.b XXX XXX XXX

cmp <len> <addr1> <addr2> <count> :比較addr1和add2的長度為count的(基於length計算)數據

cp <len> <src> <dst> <count> :把count個數據從src復制到dst
mw <len> <addr> <vaule> [count]:把addr開始的count個數據設為vaule
md <len> addr count:讀取並顯示addr開始的數據內容
crc32 addr count res:使用crc32校驗addr開始的長度為count的數據,將結果存放在地址res中

從串口獲取和發送數據

在調試中經常需要從串口傳輸少量數據,雖然用起來比較麻煩,但有時也是必須的。跟串口傳輸相關的幾個tool有:

loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loadx - load binary file over serial line (xmodem mode)
loady - load binary file over serial line (ymodem mode)

它們除了傳輸協議不同,別的都是一樣的。一般的調用格式為:loadX <addr> <baudrate>,波特率一般都是115200,addr則是數據加載到的目的內存地址,默認為kernel加載地址,定義在
include/configs/ti_armv7_common.h:#define CONFIG_SYS_LOAD_ADDR 0x82000000
這幾個工具的使用,因為是全命令行的,步驟比較多,但網上教程也很多,需要自查即可。

其他命令

其他還有一些普通命令,大多跟shell很像,比如ping, echo, unzip等等。不太常用,也很簡單,就不啰嗦了,需要的可以自己用help看看用法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM