天天看點

DM6467開發之U-Boot移植(3)——U-Boot移植測試1        U-Boot常用指令及環境變量2        移植測試

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所示,表示正确生成了目标檔案。

DM6467開發之U-Boot移植(3)——U-Boot移植測試1        U-Boot常用指令及環境變量2        移植測試

圖 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作為系統預留分區。           

DM6467開發之U-Boot移植(3)——U-Boot移植測試1        U-Boot常用指令及環境變量2        移植測試

圖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移植成功完成。

繼續閱讀