u-boot環境變量的設置與使用


   本文轉自 http://blogold.chinaunix.net/u3/94312/showart_1923637.html

   個人Notes:

 


  看到這個標題,可能覺得這個並沒有什麼的,其實不然,編好了 u-boot 了,但是如何來使用確不是那麼簡單的,想當初我將 uboot 製作出來後以爲全部都搞定了,屁顛屁顛的燒到板子上後可系統就是起不來,爲什麼了,折騰了很久以後才發現是 u-boot 的環境變量設置錯誤,在後來的工作中,我發現 一些有一定經驗 的人在這方面也是模模糊糊的扯不清,所以這裏要討論一下。

 

     u-boot 的環境變量 是使用 u-boot 的關鍵,它 可以 你自己定義的,但是其中有一些也是大家經常使用,約定熟成的,有一些是 u-boot 自己定義的,更改這些名字會出現錯誤,下面的表中我們列出了一些常用的環境變量:

 

環境變量

描述

bootdelay

   執行自動啓動的等候秒數

baudrate

   串口控制檯的波特率

netmask

   以太網接口的掩碼

ethaddr

   以太網卡的網卡物理地址

bootfile

   缺省的下載文件

bootargs

   傳遞給內核的啓動參數

bootcmd

   自動啓動時執行的命令

serverip

   服務器端的 ip 地址

ipaddr

   本地 ip  地址

stdin

   標準輸入設備

stdout

   標準輸出設備

stderr

   標準出錯設備

 

上面只是一些最基本的環境變量,請注意,板子裏原本是沒有環境變量的, u-boot 的缺省情況下會有一些基本的環境變量,在你執行了 saveenv 之後,環境變量會第一次保存到 flash 中,之後你對環境變量的修改 , 保存都是基於保存在 flash 中的環境變量的操作。

 

     U-boot 的環境變量值得注意的有 個:   bootcmd  bootargs

u        bootcmd

     前面有說過 bootcmd 是自動啓動時默認執行的一些命令,因此你可以在當前環境中定義各種不同配置,不同環境的參數設置,然後設置 bootcmd 爲你經常使用的那種參數。

u        bootargs

     bootargs 是環境變量中的重中之重,甚至可以說整個環境變量都是圍繞着 bootargs 來設置的。 bootargs 的種類非常非常的多,我們平常只是使用了幾種而已,感興趣的可以看看這篇文章說的很全: http://blog.chinaunix.net/u2/79570/showart_1675071.html bootargs 非常的靈活,內核和文件系統的不同搭配就會有不同的設置方法,甚至你也可以不設置 bootargs, 而直接將其寫到內核中去(在配置內核的選項中可以進行這樣的設置),正是這些原因導致了 bootargs 使用上的困難。

     下面介紹一下 bootargs 常用參數, bootargs 的種類非常的多,而且隨着 kernel 的發展會出現一些新的參數,使得設置會更加靈活多樣。

 

A. root

用來指定 rootfs 的位置,   常見的情況有 :

     root=/dev/ram rw  

     root=/dev/ram0 rw

   請注意上面的這兩種設置情況是通用的,我做過測試甚至 root=/dev/ram1 rw root=/dev/ram2 rw 也是可以的,網上有人說在某些情況下是不通用的,即必須設置成 ram 或者 ram0 ,但是目前還沒有遇到,還需要進一步確認,遇到不行的時候可以逐一嘗試。

 

     root=/dev/mtdx rw

     root=/dev/mtdblockx rw

     root=/dev/mtdblock/x rw

     root=31:0x

 

上面的這幾個在一定情況下是通用的,當然這要看你當前的系統是否支持,不過 mtd 是字符設備,而 mtdblock 是塊設備,有時候你的挨個的試到底當前的系統支持上面那種情況下,不過 root=/dev/mtdblockx rw 比較通用。 此外,如果直接指定設備名可以的話,那麼使用此設備的設備號也是可以的。

 

     root=/dev/nfs

在文件系統爲基於 nfs 的文件系統的時候使用。 當然指定 root=/dev/nfs 之後,還需要指定 nfsroot=serverip:nfs_dir ,即指明文件系統存在那個主機的那個目錄下面。

 

B. rootfstype

     這個選項需要跟 root 一起配合使用,一般如果根文件系統是 ext2 的話,有沒有這個選項是無所謂的,但是如果是 jffs2,squashfs 等文件系統的話,就需要 rootfstype 指明文件系統的類型,不然會無法掛載根分區 .

 

C.  console

console=tty<n>    使用虛擬串口終端設備  <n> .

console=ttyS<n>[,options]   使用特定的串口 <n> options 可以是這樣的形式 bbbbpnx ,這裏 bbbb 是指串口的波特率, p 是奇偶校驗位, n 是指的 bits

console=ttySAC<n>[,options]   同上面。

 

看你當前的環境,有時用 ttyS<n> ,有時用 ttySAC<n> ,網上有人說,這是跟內核的版本有關, 2.4 ttyS<n> 2.6 ttySAC<n> ,但實際情況是官方文檔中也是使用 ttyS<n> ,所以應該是跟內核版本沒有關聯的。可以查看 Documentation/serial-console.txt 找到相關描述。

 

D. mem

mem=xxM  指定內存的大小,不是必須的

 

E. ramdisk_size

ramdisk=xxxxx             不推薦   

ramdisk_size=xxxxx    推薦

上面這兩個都可以告訴 ramdisk  驅動,創建的 ramdisk size ,默認情況下是 4m (s390 默認 8M ) ,你可以查看 Documentation/ramdisk.txt 找到相關的描述,不過 ramdisk=xxxxx 在新版的內核都已經沒有提了,不推薦使用。

 

F. initrd, noinitrd

當你沒有使用 ramdisk 啓動系統的時候,你需要使用 noinitrd 這個參數,但是如果使用了的話,就需要指定 initrd=r_addr,size, r_addr 表示 initrd 在內存中的位置, size 表示 initrd 的大小。

 

G. init

init 指定的是內核啓起來後,進入系統中運行的第一個腳本,一般 init=/linuxrc,  或者 init=/etc/preinit preinit 的內容一般是創建 console,null 設備節點,運行 init 程序,掛載一些文件系統等等操作。請注意,很多初學者以爲 init=/linuxrc 是固定寫法,其實不然, /linuxrc 指的是 / 目錄下面的 linuxrc 腳本,一般是一個連接罷了。

 

H. mtdparts

mtdparts=fc000000.nor_flash:1920k(linux),128k(fdt),20M(ramdisk),4M(jffs2),38272k(user),256k(env),384k(uboot)

要想這個參數起作用,內核中的 mtd 驅動必須要支持,即內核配置時需要選上 Device Drivers   ---> Memory Technology Device (MTD) support   ---> Command line partition table parsing

 

mtdparts 的格式如下:

mtdparts=<mtddef>[;<mtddef]

<mtddef>   := <mtd-id>:<partdef>[,<partdef>]

  <partdef> := <size>[@offset][<name>][ro]

  <mtd-id>   := unique id used in mapping driver/device

<size>     := standard linux memsize OR "-" to denote all remaining space

<name>      := (NAME)

因此你在使用的時候需要按照下面的格式來設置:

mtdparts=mtd-id:<size1>@<offset1>(<name1>),<size2>@<offset2>(<name2>)

這裏面有幾個必須要注意的:

a.   mtd-id  必須要跟你當前平臺的 flash mtd-id 一致,不然整個 mtdparts 會失效

b.   size 在設置的時候可以爲實際的 size(xxM,xxk,xx) ,也可以爲 '-' 這表示剩餘的所有空間。

舉例:

假設 flash  mtd-id sa1100 ,那麼你可以使用下面的方式來設置:

mtdparts=sa1100:-         只有一個分區

mtdparts=sa1100:256k(ARMboot)ro,-(root)      有兩個分區

可以查看 drivers/mtd/cmdlinepart.c 中的註釋找到相關描述。

 

I.   ip

指定系統啓動之後網卡的 ip 地址,如果你使用基於 nfs 的文件系統,那麼必須要有這個參數,其他的情況下就看你自己的喜好了。設置 ip 有兩種方法:

  ip = ip addr

  ip=ip addr:server ip addr:gateway:netmask::which netcard:off

這兩種方法可以用,不過很明顯第二種要詳細很多,請注意第二種中 which netcard  是指開發板上的網卡,而不是主機上的網卡。

 

說完常見的幾種 bootargs ,那麼我們來討論平常我經常使用的幾種組合:

1).  假設文件系統是 ramdisk ,且直接就在內存中, bootargs 的設置應該如下:

setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M  init=/linuxrc

 

2).  假設文件系統是 ramdisk ,且在 flash 中, bootargs 的設置應該如下:

setenv bootargs ‘ mem=32M  console=ttyS0,115200   root=/dev/ram rw init=/linuxrc’

注意這種情況下你應該要在 bootm 命令中指定 ramdisk flash 中的地址,如 bootm kernel_addr ramdisk_addr (fdt_addr)

 

3).  假設文件系統是 jffs2 類型的,且在 flash 中, bootargs 的設置應該如下

setenv bootargs ‘ mem=32M  console=ttyS0,115200   noinitrd root=/dev/mtdblock2 rw  rootfstype=jffs2   init=/linuxrc’

 

4).  假設文件系統是基於 nfs 的, bootargs 的設置應該如下

setenv bootargs  noinitrd mem=64M  console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5:192.168.0.3:192.168.0.3:255.255.255.0::eth0:off

或者

setenv bootargs  noinitrd mem=64M  console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5

 

 

上面就是我們經常使用的幾種 bootargs 的組合,老實說, bootargs 非常非常的靈活,所以設置的方法有很多中形式,具體的還應該根據你的平臺具體的情況來設置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章