1. 程式人生 > >uboot基礎與常用命令

uboot基礎與常用命令

1. bootloader 與 uboot的區別

BootLoader是嵌入式裝置中用來啟動作業系統核心的一段程式。
uboot(universal bootloader)是一種可以用於多種嵌入式CPU的BootLoader程式,換言之,uboot是bootloader的一個子集。
uboot的核心作用就是啟動作業系統核心,uboot的本質就是一段裸機程式。

2. uboot的特性

2.1 硬體管理

uboot要能夠進行Soc級(Soc內部外設)和板級(Soc外部外設)硬體管理。

uboot中實現了一部分硬體的控制能力(uboot中初始化了一部分硬體),因為uboot為了完成一些任務必須讓這些硬體工作。譬如uboot要實現刷機必須能驅動iNand,譬如uboot要在刷機時LCD上顯示進度條就必須能驅動LCD,譬如uboot能夠通過串列埠提供操作介面就必須驅動串列埠。譬如uboot要實現網路功能就必須驅動網絡卡晶片。

2.2 能夠完成映象燒錄(刷機)

uboot要能夠被藉助完成刷機操作。參考下SD卡刷機的步驟:

  1. 燒錄uboot到SD卡中。
    有2種燒寫方法:一種是在windows中用刷卡工具去製作啟動SD卡;另一種是在linux中用dd命令。製作完SD後將SD卡插入開發板,然後開機就可以進入uboot介面。
  2. 使用uboot的fastboot命令,並藉助PC中的fastboot軟體完成包括uboot、kernel、rootfs等的映象的燒錄。

從上面就可以看出,刷機依靠的是uboot的fastboot命令,將映象寫到相應的FLASH中。

2.3 uboot的“生命週期”

uboot的入口就是開機自動啟動,uboot的唯一出口就是啟動核心。uboot還可以執行很多別的任務(譬如燒錄系統),但是其他任務執行完後都可以回到uboot的命令列繼續執行uboot命令,而啟動核心命令一旦執行就回不來了。

2.4 uboot要提供命令式shell介面

shell是使用者操作介面的意思。shell有命令列的shell,如windows下的cmd,如linux下的終端;也有GUI式的shell,比如常用的windows下的各種介面。shell是一種封裝後留出來的介面,uboot也要有這樣的一個介面。

shell的原理是:由訊息接收、解析、執行構成的一個死迴圈。我之前用過3D印表機的韌體(firmware)也是這樣的模式。

uboot的shell使用的也是行緩衝的模式。也就是以回車鍵(換行鍵)作為一個命令輸入的結束。對應的其他緩衝模式還有無緩衝和全緩衝:無緩衝就是輸入一個字元就當做一個命令處理;全緩衝就是無論輸入什麼都緩衝起來知道緩衝區滿了才做一次處理。

3. uboot的常用命令

3.1 環境變數介紹與操作命令

環境變數:就是整個系統的一個全域性變數。其餘全域性變數不同的就是,全域性變數在一次程式結束後下一次要重新開始;而全域性變數可以儲存在FLASH中,繼續使用上次修改的值。

  • printenv(或print)
    打印出環境變數。
  • setenv(或set)
    新建一個環境變數,使用 set var value
    更改一個環境變數,使用set var value
    刪除一個環境變數,使用 set var
  • saveenv(或save)
    儲存環境變數。儲存環境變數這一指令的意義在於用set指令更改了環境變數之後,只是在DDR記憶體中做了改變,用save即命令將環境變數從DDR中寫入FLASH。從這裡也可以看出,環境變數在整個系統中是有兩套的,FLASH中一套,DDR中一套。

具體的uboot的各項環境變數的意思在後面詳細講述。

3.2 網路測試指令:ping命令

ping是測試開發板和主機之間的網路連結,其使用格式為:ping ip地址




如上圖所示,ping指令要想成功,三個環節要做好:

  1. 主機IP地址設定正確;
  2. 網線連線正常;
  3. 開發板IP地址設定正確。注意,主機IP和開發板IP應該位於同一網段才可以(如下圖,子網掩碼相同的IP地址位於同一網段)。設定開發板IP地址的方法就是更改uboot中的環境變數ipaddr。

這裡寫圖片描述
值得一提的是當主機使用的是linux虛擬機器時,設定其IP地址的方式如下:

  1. 虛擬機器設定成橋接方式。虛擬機器的網絡卡設定可以選擇好幾種方式,常用的就是NAT和橋接(bridged)。虛擬機器要和開發板進行網路通訊,只能通過橋接方式連線。
  2. 虛擬機器的選單“虛擬網路編輯器”,設定為“橋接到有線網絡卡”。(預設是自動的,自動的一般會影響ping通。因為電腦一般都有2個網絡卡:一個有線的,一個無線的。如果選了自動,那麼虛擬機器會自動橋接到無線網絡卡上)
  3. 在虛擬機器ubuntu中設定IP地址(可以通過/etc/network/interfaces檔案來設定靜態的然後重啟;也可以直接命令列ifconfig去設定)。

3.3 SD卡/iNand操作指令:movi

movi指令是movi read和movi write一組的,movi read用來讀取iNand到DDR上,movi write用來將DDR中的內容寫入iNand中。理解這些指令時一定要注意涉及到的2個硬體:iNand和DDR記憶體。

如movi read的使用方法為:movi read {u-boot | kernel} {addr}

其中,{u-boot | kernel}代表的是SD卡或iNAND中的一個分割槽。 {addr}代表DDR中的地址。上面的意思就是把uboot的某一個分割槽寫到DDR的地址addr處。

這裡也插播一個小知識:uboot是把iNAND分割槽管理的,一般有以下幾個分割槽:

  • uboot分割槽:uboot必須從Flash起始地址開始存放,一般設計為512KB或者1MB;
  • 環境變數分割槽:環境變數分割槽一般緊貼著uboot來存放,大小為32KB或者更多一點。
  • kernel分割槽:kernel可以緊貼環境變數存放,大小一般為3MB或5MB或其他。
  • rootfs分割槽:剩下的就是自由分割槽,一般kernel啟動後將自由分割槽掛載到rootfs下使用

一般分割槽規律如下:

  • 各分割槽彼此相連,前面一個分割槽的結尾就是後一個分割槽的開頭。
  • 整個flash充分利用,從開頭到結尾。
  • uboot必須在Flash開頭,其他分割槽相對位置是可變的。
  • 各分割槽的大小由系統移植工程師自己來定;
  • 分割槽在系統移植前確定好,在uboot中和kernel中使用同一個分割槽表。

3.4 記憶體操作指令

記憶體操作指令主要有三個:md(memory display 顯示記憶體)、mw(memory write 寫記憶體)、mm(memory modify 記憶體修改)
使用help檢視各個指令的用法:
md [.b, .w, .l] address [# of objects]
mw [.b, .w, .l] address value [count]
mm [.b, .w, .l] address
其中,可選項[.b .w .l]的意思是使用位元組(b,8位,一個記憶體地址內容)還是字(w,16位,兩個記憶體地址內容),還是長整型(l,32位,4個記憶體地址內容)來操作記憶體。[# of objects]、count 代表要操作記憶體的數目。

3.5 啟動核心指令

uboot的終極目標就是啟動作業系統核心,其指令為bootm addr

4 uboot環境變數詳解

使用print命令打印出uboot環境變數如下所示:

bootcmd=movi read kernel 30008000; movi read rootfs 30B00000 300000; bootm 30008000 30B00000
mtdpart=80000 400000 3000000
baudrate=115200
ethaddr=00:40:5c:26:0a:5b
ipaddr=192.168.1.88
serverip=192.168.1.102
gatewayip=192.168.0.1
netmask=255.255.0.0
bootdelay=3

4.1 bootdelay 與 bootcmd

在uboot開啟之後,會有一個倒計時的操作,如果檢測到按鍵輸入就進入到uboot命令列下執行各種命令,否則將執行 bootcmd 這個環境變數中儲存的命令集,而這個倒計時的秒數就是由環境變數 bootdelay 表示的。

分析一下bootcmd環境變數的內容,首先將核心和根檔案系統讀進記憶體中,然後使用bootm啟動核心。在自己修改這個環境變數的時候,命令如下:
set bootcmd 'movi read kernel 30008000; movi read rootfs 30B00000 300000; bootm 30008000 30B00000'
注意兩點,一是需要用單引號把值給引起來,表示是一個整體;二是單引號之間的命令間要有空格隔開!

4.2 網路相關

  • ipaddr是開發板的本地IP地址
  • serverip是開發板通過tftp指令去tftp伺服器下載東西時,tftp伺服器的IP地址。
  • gatewayip是開發板的本地閘道器地址
  • netmask是子網掩碼
  • ethaddr是開發板的本地網絡卡的MAC地址。

4.3 核心傳參

linux核心啟動時可以接收uboot給他傳遞的啟動引數,這些啟動引數是uboot和核心約定好的形式、內容,linux核心在這些啟動引數的指導下完成啟動過程。這樣的設計是為了靈活,為了核心在不重新編譯的情況下可以用不同的方式啟動。
我們要做的事情就是:在uboot的環境變數中設定bootargs,然後bootm命令啟動核心時會自動將bootargs傳給核心。

在我的環境變數中沒有看到bootargs這個環境變數,但是mtdpart、baudrate都是bootargs的一部分。