uboot命令以及環境變量詳解

一、命令詳解

1、autoscr

- run script from memory

運行memory的腳本

命令說明:

在u-boot中可以用autoscr命令運行腳本。

使用方法:

首先創建文本,輸入要執行的命令,然後用tools/mkimage封裝,然後下載到開發板 

中,在u-boot命令行,用autoscr執行下載的腳本鏡像文件即可。

  1. 編輯如下的腳本nand-ubifs-write.script,也可參見附件

tftp 0x90800000 uramdisk.img;nand erase ramdisk;nand write ${fileaddr} ramdisk;nand erase system;ubi part system;ubi create system;tftp 0x90800000 system.img;ubi write ${fileaddr} system ${filesize};nand erase userdata;ubi part userdata;ubi create userdata;tftp 0x90800000 userdata.img;ubi write ${fileaddr} userdata ${filesize};nand erase cache;ubi part cache;ubi create cache;reset

  1. 用tools/mkimage對腳本進行封裝

mkimage -A ARM -O linux -T script -C none -a 0 -e 0 -n "autoscr nand-ubifs-write script" -d nand-ubifs-write.script /tftpboot/nand-ubifs-write.img

  1. 在u-boot中加載並執行腳本

set servrerip 10.10.66.145          10.10.66.145爲tftp服務器

tftp 0x90800000 nand-ubifs-write.img

autoscr 0x90800000

 

2、base

- print or set address offset

打印或設置地址偏移量

用法:

       base ;打印

       base 地址; 設置(重啓後消失)

3、bdinfo 

- print Board Info structure

打印板子信息結構體

ath> bdinfo

boot_params = 0x87F7BFB0

memstart    = 0x80000000

memsize     = 0x08000000

flashstart  = 0x9F000000

flashsize   = 0x01000000

flashoffset = 0x00028B98

ethaddr     = 00:AA:BB:CC:DD:EE

ip_addr     = 192.168.1.1

baudrate    = 115200 bps

4、boot & bootd 

      - boot default, i.e., run 'bootcmd'

       進入內核,等效於run bootcmd 命令

bootcmd由用戶定義,例如

       bootcmd=bootm 0x9fe80000

 

5、bootelf

- Boot from an ELF image in memory

啓動ELF格式的內核

6、bootm

- boot application image from memory

從內存指定位置啓動內核

7、bootp

- boot image via network using BootP/TFTP protocol

通過網絡使用bootp或者tftp協議啓動內核

BOOTP(Bootstrap Protocol,引導程序協議)是一種引導協議,基於IP/UDP協議,也稱自舉協議,是DHCP協議的前身。BOOTP用於無盤工作站的局域網中,可以讓無盤工作站從一箇中心服務器上獲得IP地址。通過BOOTP協議可以爲局域網中的無盤工作站分配動態IP地址,這樣就不需要管理員去爲每個用戶去設置靜態IP地址。

8、bootvx 

- Boot vxWorks from an ELF image

從ELF 內核中啓動vxWorks

VxWorks 是美國 Wind River System 公司( 以下簡稱風河公司 ,即 WRS 公司)推出的一個實時操作系統。Tornado 是WRS 公司推出的一套實時操作系統開發環境,類似MicrosoftVisual C,但是提供了更豐富的調試、仿真環境和工具。

9、cmp    

- memory compare

內存比較

格式:

cmp addr1 addr2 count,第一個參數是內存地址一,第二個參數是內存地址二,第三個是比較長度(單位是字節數除以4,以WORDS爲單位)

10、coninfo

- print console devices and information

打印串口設備和信息

11、cp

- memory copy

在內存中進行數據拷貝

格式:

cp source target count,第一個參數是源地址,第二個參數是目的地址,第三個參數是複製數目

12、crc32

- checksum calculation

計算校驗值

格式:

crc32 address count [addr],第一個參數是需校驗的起始地址,第二個參數是校驗的數據字節數,第三個參 數是保存校驗值的地址。

13、dhcp

- invoke DHCP client to obtain IP/boot params

使用DHCP協議獲取IP地址(功能與bootp相同)

14、echo   

- echo args to console

打印參數到串口;例如

ath> echo hello

hello

15、erase  

- erase FLASH memory

擦除flash

格式:

erase addr1 count,第一個參數是OFFSET,第二個參數是擦除字節數。其中OFFSET是相對於Download地址。

16、ethreg 

- Switch/PHY Reg rd/wr  utility

17、exit

- exit script

退出腳本

18、flinfo

- print FLASH memory information

打印flash信息

19、go     

go addr [arg ...]

      - start application at address 'addr'

         passing 'arg' as arguments

go命令可以執行應用程序。

第1個參數是要執行程序的入口地址。

第2個可選參數是傳遞給程序的參數,可以不用。

20、help   

- print online help

打印幫助信息

21、iminfo

iminfo addr [addr ...]

              - print header information for application image starting at

              address 'addr' in memory; this includes verification of the

              image contents (magic number, header and payload checksums)

iminfo可以打印程序映像的開頭信息,包含了映像內容的校驗(序列號、頭和校驗和)。

第1個參數指定映像的起始地址。可選的參數是指定更多的映像地址。

例如:

ath> iminfo 0x9fe80000

## Checking Image at 9fe80000 ...

   Image Name:   MIPS OpenWrt Linux-3.3.8

   Created:      2019-10-17   2:50:57 UTC

   Image Type:   MIPS Linux Multi-File Image (lzma compressed)

   Data Size:    1113558 Bytes =  1.1 MB

   Load Address: 80060000

   Entry Point:  80060000

   Contents:

   Image 0:  1113550 Bytes =  1.1 MB

   Verifying Checksum ... OK

ath>

22、itest  

- return true/false on integer compare

23、loop

- infinite loop on address range

地址範圍無限循環

 

24、mct

- simple RAM test

簡單的ram測試

25、md     

- memory display

顯示內存區的內容

格式:

md [.b, .w, .l] address [# of objects]

b:8位

w:16位

l:32位(默認值)

例如:

ath> md.b 0x10000000 1

10000000: 00    .

ath>

上述0x10000000是要顯示內存的那個地址,後面的數字是輸出的個數,注意是16進制的。

26、mii    

- MII utility commands

調試、操作PHY的命令主要有MDIO 和MII。這兩個命令的區別是:MII可以訪問不同MII總線上設備的Reg,MDIO命令只能訪問當前MII總線的PHY Reg。

27、mm     

- memory modify (auto-incrementing)

修改內存,地址自動增加

格式:

mm [.b, .w, .l] address

28、mtest  

- simple RAM test

類似mct,使用讀寫方式檢驗ram是否正常

29、mw     

- memory write (fill)

用指定的數據填充內存

格式:

mw [.b, .w, .l] address value [count]

30、nfs    

- boot image via network using NFS protocol

使用nfs協議啓動內核

用法:

nfs [loadAddress] [host ip addr:bootfilename]

nfs命令可以使用NFS網絡協議通過網絡啓動映像。

例如:

nfs 32000000 192.168.0.2:aa.txt
把192.168.0.2(LINUX 的NFS文件系統)中的NFS文件系統中的aa.txt 讀入內存0x32000000處。

31、nm     

- memory modify (constant address)

格式:

nm [.b, .w, .l] address

nm命令可以修改內存,可以按照字節、字、長字操作。

參數address是要讀出並且修改的內存地址。

 

32、pci    

- list and access PCI Configuration Space

列表和訪問PCI配置空間

33、ping   

- send ICMP ECHO_REQUEST to network host

想指定主機發送ICMP ECHO_REQUEST報文

34、pll

pll cpu-pll dither ddr-pll dither - Set to change CPU & DDR speed

pll erase

pll get

35、printenv & print

- print environment variables

打印環境變量

36、progmac & progmac2

- Set ethernet MAC addresses

設置以太網mac地址

37、protect

- enable or disable FLASH write protection

打開或者關閉FLASH寫保護

用法:

protect on start end

      - protect Flash from addr 'start' to addr 'end'

protect on N:SF[-SL]

      - protect sectors SF-SL in Flash bank # N

protect on bank N

     - protect Flash bank # N

protect on all

      - protect all Flash banks

protect off start end

       - make Flash from addr 'start' to addr 'end' writable

protect off N:SF[-SL]

     - make sectors SF-SL writable in Flash bank # N

protect off bank N

     - make Flash bank # N writable

protect off all

     - make all Flash banks writable

protect命令是對Flash寫保護的操作,可以使能和解除寫保護。

第1個參數on代表使能寫保護;off代表解除寫保護。

第2、3參數是指定Flash寫保護操作範圍,跟擦除的方式相同。

用法:

protect on 1:0-3(就是對第一塊FLASH的0-3扇區進行保護)

protect off 1:0-3取消寫保護

protect off bank 1 解除/使能 第 N 塊FLASH的寫保護

 

37、rarpboot

- boot image via network using RARP/TFTP protocol

       使用RARP/TFTP協議啓動內核

用法:

rarpboot [loadAddress] [bootfilename]

rarboot命令可以使用TFTP協議通過網絡啓動映像。也就是把指定的文件下載到指定地址,然後執行。

第1個參數是映像文件下載到的內存地址。

第2個參數是要下載執行的映像文件。

 

38、reset  

- Perform RESET of the CPU

重啓

39、run    

- run commands in an environment variable

執行環境變量中的某條命令

40、saveenv & save

- save environment variables to persistent storage

保存環境變量

41、setenv  & set

- set environment variables

設置環境變量

42、sleep  

- delay execution for some time

延時執行,以秒爲單位

43、tftpboot

- boot image via network using TFTP protocol

使用TFTP協議啓動內核

用法:   

tftpboot [loadAddress] [bootfilename]

tftpboot命令可以使用TFTP協議通過網絡下載文件。按照二進制文件格式下載。另外使用這個命令,必須配置好相關的環境變量。例如serverip和ipaddr。

第1個參數loadAddress是下載到的內存地址。

第2個參數是要下載的文件名稱,必須放在TFTP服務器相應的目錄下。

 

44、version

- print monitor version

打印版本號

 

二、常用的環境變量

如果內核分區是直接寫在內核文件裏面的,u-boot的分區信息就不重要。

如果內核的分區信息沒有指定,而是通過下面的命令行來指定的,那麼分區信息就很重要。因爲它完全依賴於命令行(當然極力推薦這種做法,因爲用戶修改分區信息,不需要去重新編譯內核,也沒必要重新編譯u-boot,僅僅是修改命令行,一舉兩得)

環境變量

bootdelay 

執行自動啓動的等候秒數

baudrate

      串口控制檯的波特率

netmask

以太網接口的掩碼

 

ethaddr

以太網卡的網卡物理地址

bootfile

      缺省的下載文件

bootargs 

傳遞給內核的啓動參數

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

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

bootargs是環境變量中的重中之重,甚至可以說整個環境變量都是圍繞着bootargs來設置的。bootargs的種類非常非常的多,我們平常只是使用了幾種而已,感興趣的可以看看這篇文章說的很全:http://blog.chinaunix.net/u2/79570/showart_1675071.html

bootargs非常的靈活,內核和文件系統的不同搭配就會有不同的設置方法,甚至你也可以不設置bootargs,而直接將其寫到內核中去(在配置內核的選項中可以進行這樣的設置),正是這些原因導致了bootargs使用上的困難。

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

1、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,即指明文件系統存在那個主機的那個目錄下面。

2、rootfstype

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

3、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找到相關描述。

4、mem

mem=xxM

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

5、ramdisk_size

ramdisk=xxxxx           不推薦  

ramdisk_size=xxxxx   推薦

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

6、initrd & noinitrd

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

7、init

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

8、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中的註釋找到相關描述。

9、ip

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

ip = ip addr

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

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

10、組合

說完常見的幾種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非常非常的靈活,所以設置的方法有很多中形式,具體的還應該根據你的平臺具體的情況來設置。

 

bootcmd 

      自動啓動時執行的命令

 

serverip 

      服務器端的ip地址

ipaddr 

      本地ip 地址

stdin 

      標準輸入設備

stdout 

標準輸出設備

stderr 

      標準出錯設備

 

常用設備操作

https://blog.csdn.net/zhanglianpin/article/details/71574000

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