一、命令詳解
1、autoscr
- run script from memory
運行memory的腳本
命令說明:
在u-boot中可以用autoscr命令運行腳本。
使用方法:
首先創建文本,輸入要執行的命令,然後用tools/mkimage封裝,然後下載到開發板
中,在u-boot命令行,用autoscr執行下載的腳本鏡像文件即可。
- 編輯如下的腳本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
- 用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
- 在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
標準出錯設備