1 U-Boot常用指令及環境變量
1.1 U-Boot環境變量
U-Boot通過環境變量(environment)為使用者提供一定程度的可配置性,這些環境變量包括序列槽終端所使用的波特率(baudrate)、啟動作業系統核心的參數(bootargs)、本地IP位址(ipaddr)、網卡MAC位址(ethaddr)等等。環境變量可以固化到非易失性存儲媒體中,在本系統中,環境變量就是固化在NAND Flash中,同時在RAM中有一份拷貝。U-Boot環境變量可以使用printenv / saveenv指令來檢視和修改。printenv用于顯示記憶體中的環境變量,saveenv用于把記憶體中設定的環境變量存儲到NAND。U-Boot常用的環境變量見表 5‑1。
表 5‑1 U-Boot常用環境變量
環境變量 | 含義 |
bootdelay | 定義執行自動啟動的等候秒數 |
baudrate | 定義序列槽控制台的波特率 |
netmask | 定義以太網接口的掩碼 |
ethaddr | 定義以太網接口的MAC位址 |
bootfile | 定義預設的下載下傳檔案 |
bootargs | 定義傳遞給Linux核心的指令行參數 |
bootcmd | 定義自動啟動時執行的幾條指令 |
serverip | 定義tftp伺服器端的IP位址 |
ipaddr | 定義本地的IP位址 |
stdin | 定義标準輸入裝置,一般是序列槽 |
stdout | 定義标準輸出裝置,一般是序列槽 |
stderr | 定義标準出錯資訊輸出裝置,一般是序列槽 |
下面對其中一些重要的環境變量進行詳細分析。
l bootdelay
用于設定U-Boot啟動時的延時,以秒為機關,在調試時一般都需要使用此環境變量,用于在U-Boot啟動時中斷自啟動而進行參數設定。我們開發闆設定的啟動延時是3秒。環境變量的設定方法既可以是在davinci_dm6467evm.h中進行,也可以在U-Boot啟動過程中使用指令修改,設定bootdelay變量時的指令是“setenv bootdelay 3”。
l ipaddr
ipaddr用于設定開發闆的IP位址,設定方法為“setenvipaddr 192.168.0.68”。
l serverip
serverip用于設定伺服器端的IP,一般用于TFTP,設定方法為“setenvserverip 192.168.0.83”。
l ethaddr
ethaddr變量用于設定開發闆的MAC位址,設定方法為“setenvethaddr 00:0c:29:89:09:82”。ethaddr設定之後需要使用saveenv儲存參數,然後重新開機才能使新的MAC位址生效。
l bootcmd
bootcmd是U-Boot中非常重要的一個環境變量,它用于設定U-Boot自啟動時的指令。針對我們的開發闆,設定bootcmd為“tftp 0x80700000 uImage; ping 192.168.0.83; bootm”,表示預設啟動步驟是首先使用TFTP從伺服器下載下傳uImage核心映像檔案到0x80700000處,然後ping伺服器端的IP,最後從0x80700000出運作Linux核心映像檔案。
l bootargs
bootargs是U-Boot中另一個非常重要的環境變量,它用于設定Linux啟動時的一些參數。針對我們的開發闆,設定的bootargs的值如下所示:
#define CONFIG_BOOTARGS mem=76M console=ttyS0,115200n8 noinitrd rw ip=192.168.0.68:192.168.0.83:192.168.0.254:255.255.255.0::eth0:off eth=00:0c:29:89:09:82 root=/dev/nfs nfsroot=192.168.0.83:/home/tirvideo/lyb/armfs vpif_display.ch2_numbuffers=0" |
1.2 U-Boot常用指令
U-Boot提供了很多指令,同時也可以自己添加新的指令。比較常用的U-Boot指令不多,如表 5‑2所示。
表 5‑2 U-Boot常用指令
指令 | 解釋 |
bootm | 執行記憶體中通過mkimage處理過的核心映像檔案 |
bootp | 通過網絡啟動系統 |
tftpboot | 從伺服器下載下傳檔案到記憶體 |
ping | 标準ping工具 |
help | 使用help + command輸出幫助資訊 |
printenv | 輸出環境變量的設定值 |
setenv | 設定環境變量 |
saveenv | 儲存環境變量到Flash |
在U-Boot指令中,最常用的是printenv、setenv、saveenv和bootm,除bootm外其他三條指令的操作文法都很簡單,不詳細介紹。對于bootm,其常用的文法規則是“bootm addr”,表示從addr位址處啟動。
2 移植測試
在完成對U-Boot的修改之後就需要對其進行測試,測試可以分為兩部分,一是檢視編譯生成的檔案中的資訊是否正确,二是将u-boot.bin檔案下載下傳到開發闆上看能否正常啟動Linux。
2.1 核對編譯生成的檔案
按照4.2.2節中所述的指令編譯U-Boot,如果編譯成功,那麼終端中的輸出資訊如圖 6‑1所示,表示正确生成了目标檔案。
圖 6‑1 終端輸出資訊
編譯成功之後,主要生成了以下這些目标檔案:
l u-boot.bin:用于引導Linux的U-Boot二進制可執行檔案。
l system.map:記憶體映射表。
l u-boot.map:訓示U-Boot中各函數在記憶體中的位置。
l config.h:位于include/目錄,包含davinci_dm6467evm.h頭檔案的引用。
l config.mk:位于include/目錄,包含開發闆架構和CPU的資訊。
l autoconf.mk:位于include/目錄,包含根據davinci_dm6467evm.h生成的配置資訊。
對于u-boot.bin檔案,由于是二進制檔案,不友善直接檢視,不過,在修改U-Boot時可以比較修改前後修改後生成的u-boot.bin檔案的大小,如果大小沒有改變的話那很可能修改有錯誤。
對于config.h、config.mk和autoconf.mk三個檔案,都是包含了一些配置資訊,内容很簡單,可以在編譯完之後核對其中資訊是否正确。不過一般來說這三個檔案都是沒問題的。
編譯後生成的檔案中最需要注意的其實是system.map和u-boot.map這兩個關于記憶體配置設定的檔案,需要詳細分析。system.map中包含了按記憶體增長順序排列的各種函數和标号的位址。u-boot.map檔案中包含了根據不同段排列的庫和目标檔案,我們可以在u-boot.map中檢視某函數是否編譯進了最終的bin檔案。例如,檢視board/davinci/dm6467evm/dm646x.c檔案中的board_init()函數的方法是:在u-boot.map中的.text段中找到“board/davinci/dm6467evm/libdm6467evm.a”,看它下面是否有“board_init”标号,如果有,那麼表示board_init()函數是編譯進了bin檔案的。
U-Boot通過在board/dacinci/dm6467evm/config.mk檔案中設定“TEXT_BASE= 0x81080000”來設定U-Boot下載下傳到記憶體中的位置,這個位址也即是system.map中記錄U-Boot标号資訊的起始位址。DM6467的SDRAM起始位址為0x80000000,在include/configs/davinci_dm6467evm.h頭檔案中通過宏定義“#defineCONFIG_SYS_LOAD_ADDR 0x80700000”設定Linux核心映像檔案的下載下傳位址為0x80700000,這和U-Boot之間相隔了大于16M的空間,足夠放置uImage檔案。
系統的記憶體配置設定情況見圖 6‑2。從圖中可以看出,U-Boot本來是存儲在NANDFlash中,通過UBL将其複制到了SDRAM的0x81080000,在這個位址之前的是malloc區、U-Boot全局變量存儲區和使用者堆棧區,然後是linux核心映像檔案。SDRAM的起始位址0x800000000到0x80700000作為系統預留分區。
圖6‑2 記憶體配置設定圖
2.2 下載下傳測試
要将u-boot.bin檔案下載下傳到開發闆進行啟動測試,需要先通過仿真器連接配接開發闆,然後燒寫UBL,再燒寫u-boot.bin,然後系統上電,在序列槽控制台檢視輸出資訊。
Booting PSP Boot Loader Starting NAND Copy Booting Application @ 0x81080000 U-Boot 2009.08 ( 7.20 2012 - 14:07:04) I2C: ready DRAM: 256M NAND: 128M In: serial Out: serial Err: serial ARM Clock : - 363MHz DDR Clock : - 297MHz Net: Ethernet PHY: GENERIC @ 0x01 DaVinci EMAC Hit any key to stop autoboot: 3 |
上面的前三行是UBL的輸出資訊,之後的都是U-Boot輸出的。在看到“Hitany key to stop autoboot:”時按下任意鍵進行環境變量設定。
setenv serverip 192.168.0.83:255.255.255.0 setenv ipaddr 192.168.0.68:255.255.255.0 setenv ethaddr 00:0c:29:89:09:82 setenv bootargs mem=76M console=ttyS0,115200n8 noinitrd rw ip=192.168.0.68:192.168.0.83:192.168.0.254:255.255.255.0::eth0:off eth=00:0c:29:89:09:82 root=/dev/nfs nfsroot=192.168.0.83:/home/tirvideo/lyb/armfs vpif_display.ch2_numbuffers=0 tftp 0x80700000 bootm |
執行完bootm之後系統開始下載下傳uImage到0x80700000處,然後啟動linux核心。當在序列槽控制台看到提示登入的資訊之後,linux啟動就完成了,這表示整個U-Boot移植成功完成。