DENX U-Boot及Linux使用手冊(cè)(全)
1. 概要
這是嵌入式PowerPC, ARM和MIPS系統(tǒng)中使用DENX U-Boot和Linux的指導(dǎo)手冊(cè)。
文檔中描述了如何在嵌入式PowerPC, ARM和MIPS系統(tǒng)上配置、編譯、使用Das U-Boot(常??s寫(xiě)為“U-Boot”)和Linux操作系統(tǒng)。
本文檔寫(xiě)于2005年一月至四月四日十四點(diǎn)十五分。
2. 緒論
本文檔描述了如何在嵌入式PowerPC, ARM和MIPS系統(tǒng)上配置、編譯、使用U-Boot和Linux操作系統(tǒng)。
在這些過(guò)程中有太多的步驟,不可能面面俱到、非常深入,但我們會(huì)盡力提供所有必需的信息,能夠讓一個(gè)嵌入式系統(tǒng)運(yùn)行。文檔中涵蓋了所有你可能需要的用于配置、編譯、運(yùn)行U-Boot和Linux的工具。
首先,我們介紹如何安裝交叉編譯開(kāi)發(fā)工具Embedded Linux Development Kit(ELDK),這個(gè)開(kāi)發(fā)套件你很有可能會(huì)用到——至少當(dāng)你在標(biāo)準(zhǔn)的x86 PC上使用Linux或者Sun Solaris系統(tǒng)作為開(kāi)發(fā)環(huán)境的時(shí)候,你會(huì)需要它的。
然后,我們會(huì)闡述通過(guò)串口與你的目標(biāo)板連接:你需要配置一個(gè)終端控制程序,如cu或者kermit。
你常常需要通過(guò)網(wǎng)線把映像文件下載到你的目標(biāo)板上。為了實(shí)現(xiàn)這個(gè)目的,你需要TFTP和DHCP/BOOTP服務(wù)器。文檔中提供了簡(jiǎn)要的相關(guān)配置說(shuō)明。
接下來(lái)則是描述如何配置和編譯U-Boot使之適用于某個(gè)特定的平臺(tái),以及如何安裝和在該硬件平臺(tái)上運(yùn)行。
下一步的工作是配置、建立和安裝Linux。我們使用SELF(Simple Embedded Linux Framework)來(lái)展示如何建立一個(gè)開(kāi)發(fā)環(huán)境(包括通過(guò)NFS掛載的根文件系統(tǒng))和一個(gè)嵌入式目標(biāo)板配置(從基于busybox的ramdisk映像文件中運(yùn)行)。
本文檔不會(huì)給出如何把U-Boot或者Linux移植到一個(gè)新的硬件平臺(tái),而是默認(rèn)你的開(kāi)發(fā)板已經(jīng)被U-Boot和Linux所支持。
本文檔的側(cè)重點(diǎn)是針對(duì)TQM8xxL開(kāi)發(fā)板。
本手冊(cè)各種文檔格式的最新版本可以從以下網(wǎng)址獲?。?
HTML http://www.denx.de/twiki/publish/DULG/DULG-tqm8xxl.html
PDF http://www.denx.de/twiki/publish/DULG/DULG-tqm8xxl.pdf
3. 嵌入式Linux開(kāi)發(fā)工具套件
嵌入式Linux開(kāi)發(fā)工具套件(ELDK)包括GNU交叉開(kāi)發(fā)工具,如編譯器、binutils、gdb等工具,和一些已經(jīng)編譯好的目標(biāo)工具以及負(fù)責(zé)提供在目標(biāo)平臺(tái)上函數(shù)調(diào)用的庫(kù)文件。
還免費(fèi)提供了所有的源代碼,包括全部補(bǔ)丁、擴(kuò)展文件、以及用于編譯開(kāi)發(fā)工具使用的程序和腳本。
安裝包都是基于RPM包管理器。
3.1 獲取ELDK
可以通過(guò)以下方式獲得ELDK。
·DENX計(jì)算機(jī)系統(tǒng)光盤
·從以下服務(wù)器中下載
FTP方式
ftp://mirror.switch.ch/mirror/eldk/eldk/
ftp://sunsite.utk.edu/pub/linux/eldk/ ftp://ftp.sunet.se/pub/Linux/distributions/eldk/
ftp://ftp.leo.org/pub/eldk/
HTTP方式
http://mirror.switch.ch/ftp/mirror/eldk/eldk/
http://ftp.sunet.se/pub/Linux/distributions/eldk/
http://archiv.leo.org/pub/comp/os/unix/linux/eldk/
3.2 初始安裝
初始安裝可以使用放在ELDK目錄樹(shù)根目錄下的安裝工具。安裝工具使用語(yǔ)法如下;
$ ./install [-d
-d 確定ELDK安裝在哪個(gè)目錄。如果省略ELDK會(huì)安裝在當(dāng)前目錄。
cpu_family> 確定目標(biāo)平臺(tái)的CPU。如果此項(xiàng)設(shè)置了一項(xiàng)以上的參數(shù),則會(huì)將這些CPU的支持都安裝。如果省略將會(huì)安裝所有CPU的支持。
你也可以把ELDK安裝到任何空目錄下,這么做的唯一條件是你有那個(gè)目錄的寫(xiě)和執(zhí)行權(quán)限。安裝過(guò)程并不需要超級(jí)用戶的特權(quán)。
由安裝時(shí)的參數(shù)決定安裝幾個(gè)目標(biāo)組件集合。ELDT包是肯定會(huì)安裝的。
4. 系統(tǒng)設(shè)置
在目標(biāo)平臺(tái)上安裝和配置U-Boot和Linux需要一些工具。特別是在開(kāi)發(fā)過(guò)程中,你需要和目標(biāo)平臺(tái)保持聯(lián)系。這一節(jié)將告訴你如何配置你的主機(jī)以達(dá)到上述目的。
4.1 設(shè)置串口
為了更好地使用U-Boot和Linux,你需要通過(guò)串口將目標(biāo)板和你的主機(jī)連接。U-Boot和Linux可以配置成自動(dòng)執(zhí)行而不需要任何用戶的干涉。
通過(guò)串口有很多種方法來(lái)控制你的目標(biāo)板,比如說(shuō)使用終端服務(wù)器。不過(guò)最常見(jiàn)的做法是使用你本機(jī)的串口,這時(shí),你主機(jī)需要安裝一個(gè)終端程序,如cu或者kermit。
4.2 配置“kermit”
kermit這個(gè)名字就代表了它是連接串口和網(wǎng)絡(luò)的通信軟件。事實(shí)上在很多計(jì)算機(jī)和操作系統(tǒng)上使用它,能夠很好地滿足我們的目的。
kermit在執(zhí)行其它命令之前,會(huì)執(zhí)行你的用戶目錄下的初始文件.kermrc,所以可以非常簡(jiǎn)單的通過(guò)初始化命令來(lái)定制kermit。下面是使用U-Boot和Linux時(shí)推薦配置:
~/.kermrc:
set line /dev/ttyS0
set speed 115200
set carrier-watch off
set handshake none
set flow-control none
robust
set file type bin
set file name lit
set rec pack 1000
set send pack 1000
set window 5
這個(gè)設(shè)置假定你使用的是主機(jī)第一個(gè)串口(/dev/ttyS0),以115200這個(gè)波特率與目標(biāo)板的串口連接。
然后你可以連接目標(biāo)板了:
$ kermit -c
Connecting to /dev/ttyS0, speed 115200.
The escape character is Ctrl- (ASCII 28, FS)
Type the escape character followed by C to get back,
or followed by ? to see other options.
----------------------------------------------------
下載kermit這個(gè)軟件時(shí),你會(huì)發(fā)現(xiàn)有兩個(gè)kermit包。你只需要安裝ckermit。其中g(shù)kermit僅僅是實(shí)現(xiàn)kermit傳輸協(xié)議的一個(gè)命令行工具。
如果你主機(jī)上的Linux系統(tǒng)沒(méi)有安裝kermit,你可以到kerimt的官方網(wǎng)站 http://www.columbia.edu/kermit/ 下載。
4.3 使用minicom
minicom是另外一種非常流行的串口通信終端。很遺憾的是,很多用戶發(fā)現(xiàn)在使用U-Boot和Linux時(shí),minicom有很多問(wèn)題,尤其是試圖使用它來(lái)下載image的時(shí)候。因此,不推薦大家使用minicom。
(譯者注:我使用minicom也工作的很好,沒(méi)有碰到什么問(wèn)題。)
4.4 配置TFTP服務(wù)器
使用U-Boot下載Linux內(nèi)核或者應(yīng)用程序的最快捷的方法是通過(guò)網(wǎng)絡(luò)傳輸。為了這一目的,U-Boot實(shí)現(xiàn)了TFTP協(xié)議(參見(jiàn)U-Boot中的tftpboot命令)。
為了使主機(jī)支持TFTP,你必須確保TFTP后臺(tái)程序/usr/sbin/in.tftpd已經(jīng)安裝。在RedHat系統(tǒng)中,你可以運(yùn)行下面的命令來(lái)確認(rèn):
$ rpm -q tftp-server
如果沒(méi)有安裝,請(qǐng)從你的Linux安裝盤或者其它媒介安裝。
大多數(shù)的Linux發(fā)行版都默認(rèn)關(guān)閉TFTP服務(wù)。以RedHat系統(tǒng)為例,如果要使能TFTP服務(wù),編輯文件/etc/xinetd.d/tftp,移除這一行:
disable = yes
或者注釋掉它:
# default: off
# description: The tftp server serves files using the trivial file transfer
# protocol. The tftp protocol is often used to boot diskless
# workstations, download configuration files to network-aware printers,
# and to start the installation process for some operating systems.
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot
# disable = yes
per_source = 11
cps = 100 2
}
此外,確保/tftpboot目錄存在,而且有訪問(wèn)權(quán)限(至少應(yīng)該dr-xr-xr-x)。
5. Das U-Boot
5.1 當(dāng)前版本
Das U-Boot(或者簡(jiǎn)稱“U-Boot”)是針對(duì)嵌入式PowerPC, ARM, MIPS和x86處理器的開(kāi)放源代碼軟件。U-Boot項(xiàng)目已經(jīng)在Sourceforge設(shè)立,你可以訪問(wèn)這個(gè)官方網(wǎng)站:http://sourceforge.net/projects/u-boot
U-Boot最新版的源代碼可以在Sourcefoge通過(guò)匿名CVS得到。當(dāng)要求輸入匿名用戶anonymous的密碼時(shí)只需要直接按下回車鍵。
$ cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot login
$ cvs -z6 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot
co -P u-boot
官方發(fā)布的U-Boot也可以通過(guò)FTP方式獲取。你可以到
ftp://ftp.denx.de/pub/u-boot/
下載tar形式的壓縮包。
5.2 源代碼包的解壓
如果你是通過(guò)CVS得到的U-Boot源代碼,你可以跳過(guò)這一步,因?yàn)槟愕玫降囊呀?jīng)是解壓后的目錄樹(shù)了。如果你是從FTP服務(wù)器上下載的tar壓縮包,那么你需要按照以下步驟解壓:
$ cd /opt/eldk/usr/src
$ wget ftp://ftp.denx.de/pub/u-boot/u-boot-0.4.5.tar.bz2
$ rm -f u-boot
$ bunzip2 u-boot-0.4.5.tar.bz2 | tar xf -
$ ln -s u-boot-0.4.5 u-boot
$ cd u-boot
5.3 配置
進(jìn)入U(xiǎn)-Boot源代碼根目錄后,可以先使用如下命令確保已經(jīng)清除以前編譯的結(jié)果:
$ make distclean
下一步是為TQM8xxL板配置U-Boot:
$ make tqm8xxl_config
(譯者注:應(yīng)該根據(jù)你自己的具體開(kāi)發(fā)板配置,如
$ make yourboard>_config,如果沒(méi)有相應(yīng)的開(kāi)發(fā)板,應(yīng)該自己照著建立相應(yīng)的目錄和配置文件。)
最后我們可以開(kāi)始編譯U-Boot了:
$ make all
5.4 安裝
5.4.1 動(dòng)手之前
5.4.1.1 安裝所需
以下的章節(jié)假定你的開(kāi)發(fā)板使用flash作為存儲(chǔ)設(shè)備。如果不是,則以下的指令不會(huì)工作。如果你想使用U-Boot,需要換掉存儲(chǔ)設(shè)備。
5.4.1.2 開(kāi)發(fā)板識(shí)別數(shù)據(jù)
所有的TQM8xxL開(kāi)發(fā)板使用一個(gè)序列號(hào)加以識(shí)別。而且開(kāi)發(fā)板需要分配一個(gè)以太網(wǎng)MAC地址。如果這些數(shù)據(jù)丟失,你可能會(huì)失去授權(quán)。在安裝U-Boot或者改變開(kāi)發(fā)板的配置之前,你需要搜集足夠的信息。
5.4.2 使用BDM/JTAG調(diào)試器安裝U-Boot.bin
把數(shù)據(jù)燒入flash中的一個(gè)簡(jiǎn)單而又快速的辦法是通過(guò)BDM或者JTAG接口的調(diào)試器或者flash燒寫(xiě)器。當(dāng)flash中沒(méi)有任何數(shù)據(jù)(比如說(shuō)一塊新的開(kāi)發(fā)板),這種方法是唯一的選擇。
我們(強(qiáng)烈推薦)使用Abatron公司的BDI2000(見(jiàn)http://www.abatron.ch/BDI/bdiGDB.html )。
其它的BDM/JTAG調(diào)試器也可以使用,但是如何操作它們不是本文檔要討論的范圍。如果你想使用別的工具請(qǐng)參照它們的說(shuō)明文檔。
( 譯者注:我沒(méi)有使用BDI2000,故略去操作BDI2000的方法。我燒寫(xiě)u-boot.bin就是簡(jiǎn)單地通過(guò)JTAG口。甚至我燒寫(xiě)800多k的Linux內(nèi)核都是用JTAG,只要你不嫌慢。)
5.4.3 使用U-Boot安裝U-Boot.bin
如果U-Boot已經(jīng)在你的板子上安裝運(yùn)行,你可以使用這些命令來(lái)下載新的U-Boot映像來(lái)代替當(dāng)前的。
警告:在你安裝新的映像之前,你必須擦除當(dāng)前的u-boot.bin。如果出現(xiàn)什么差錯(cuò),你的開(kāi)發(fā)板將不能運(yùn)行。因此強(qiáng)烈建議:
做一個(gè)能工作的U-Boot映像文件的備份;
你清楚如何在一個(gè)新的開(kāi)發(fā)板上安裝u-boot.bin。
過(guò)程如下:
=> tftp 100000 /tftpboot/uboot.bin
ARP broadcast 1
TFTP from server 10.0.0.2; our IP address is 10.0.0.100
Filename '/tftpboot/uboot.bin'.
Load address: 0x100000
Loading: ###############################
done
Bytes transferred = 155376 (25ef0 hex)
=> protect off 40000000 4003FFFF
Un-Protected 5 sectors
=> era 40000000 4003FFFF
Erase Flash from 0x40000000 to 0x4003ffff
......... done
Erased 5 sectors
=> cp.b 100000 40000000 $(filesize)
Copy to Flash... done
=> setenv filesize
=> saveenv
Saving Enviroment to Flash...
Un-Protected 1 sectors
Erasing Flash...
.. done
Erased 1 sectors
Writing to Flash... done
Protected 1 sectors
=> reset
5.5 工具的安裝
U-Boot加載Linux內(nèi)核、Ramdisk或者其它映像時(shí)使用一種特殊的映像格式。這種格式包含了一些信息,如創(chuàng)建時(shí)間、操作系統(tǒng)、壓縮格式、映像類型、映像名和CRC32校驗(yàn)和。
mkimage用來(lái)創(chuàng)建這種格式的映像文件或者顯示它包含的信息。如果使用ELDK,那么mkimage這個(gè)命令已經(jīng)包含在ELDK中。
如果你不想使用ELDK,你應(yīng)該把mkimage安裝在某個(gè)能夠直接執(zhí)行的目錄里,比如:
$ cp tools/mkimage /usr/local/bin/
5.6 初始化
初始化你的TQM8xxL板上的U-Boot,你需要通過(guò)終端連接板子的串口。
TQM8xxL板的串口默認(rèn)配置是波特率為115200/8N1(115200bps,每個(gè)字符8bit,無(wú)奇偶校驗(yàn),1bit停止位,無(wú)握手)。
如果你的主機(jī)是Linux操作系統(tǒng),我們建議你用kermit或者cu作為終端控制程序。
確定硬件和軟件控制流都已經(jīng)關(guān)閉。
5.7 開(kāi)始的步驟... 9
5.8 首次上電... 11
5.7 開(kāi)始的步驟
在默認(rèn)配置中,U-Boot運(yùn)行在一種互動(dòng)模式,它通過(guò)串口“COM.1(X.18)”提供命令行形式的用戶接口。
這意味著U-Boot顯示一個(gè)提示符(默認(rèn)是:=>),等待著接受用戶的輸入。然后你輸入一個(gè)命令,按下回車鍵。U-Boot將運(yùn)行這個(gè)命令,然后又出現(xiàn)提示符等待下一條命令。
你可以使用help(或者簡(jiǎn)單地一個(gè)?)來(lái)查看所有的U-Boot命令。它將會(huì)列出在你當(dāng)前配置下所有支持的命令。[請(qǐng)注意到盡管U-Boot提供了很多配置選項(xiàng),并不是所有選項(xiàng)都支持各種處理器和開(kāi)發(fā)板,有些選項(xiàng)可能在你的配置中并沒(méi)有被選上。]
=> help
askenv - get environment variables from stdin
autoscr - run script from memory
base - print or set address offset
bdinfo - print Board Info structure
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
bootd - boot default, i.e., run 'bootcmd'
cmp - memory compare
coninfo - print console devices and informations
cp - memory copy
crc32 - checksum calculation
date - get/set/reset date time
dhcp - invoke DHCP client to obtain IP/boot params
diskboot- boot from IDE device
echo - echo args to console
erase - erase FLASH memory
flinfo - print FLASH memory information
go - start application at address 'addr'
help - print online help
ide - IDE sub-system
iminfo - print header information for application image
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nm - memory modify (constant address)
printenv- print environment variables
protect - enable or disable FLASH write protection
rarpboot- boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
setenv - set environment variables
sleep - delay execution for some time
tftpboot- boot image via network using TFTP protocol
and env variables ipaddr and serverip
version - print monitor version
? - alias for 'help'
=>
使用help 你可以得到更多的命令信息:
=> help tftpboot
tftpboot [loadAddress] [bootfilename]
=> help setenv printenv
setenv name value ...
- set environment variable 'name' to 'value ...'
setenv name
- delete environment variable 'name'
printenv
- print values of all environment variables
printenv name ...
- print value of environment variable 'name'
=>
大多數(shù)命令可以縮寫(xiě),只要字符串的內(nèi)容仍然可以被確定:
=> help fli tftp
flinfo
- print information for all FLASH memory banks
flinfo N
- print information for FLASH memory bank # N
tftpboot [loadAddress] [bootfilename]
=>
5.8 首次上電
注意:如果你購(gòu)買的TQM8xxL板已經(jīng)安裝了U-Boot,你可以跳過(guò)這節(jié),因?yàn)橹圃焐桃呀?jīng)完成這些步驟了。
把主機(jī)指定的串口和在TQM8xxL板上標(biāo)有“COM.1(X.18)”的端口連接,運(yùn)行終端程序,給TQM8xxL板接上電源。你可以看到如下信息:
Connecting to /dev/ttyS1, speed 115200.
The escape character is Ctrl- (ASCII 28, FS)
Type the escape character followed by C to get back,
or followed by ? to see other options.
----------------------------------------------------
PPCBoot 1.1.5 (Mar 21 2002 - 19:55:04)
CPU: XPC860xxZPnnD3 at 50 MHz: 16 kB I-Cache 8 kB D-Cache FEC present
Board: TQM860LDDBA3-P50.203
DRAM: 64 MB
FLASH: 8 MB
In: serial
Out: serial
Err: serial
PCMCIA: No Card found
Type run flash_nfs to mount root filesystem over NFS
Hit any key to stop autoboot: 0
=>
你可以按下任意鍵來(lái)中止倒計(jì)數(shù)。如果你不那么做,你可能會(huì)看到一些(無(wú)關(guān)緊要的)錯(cuò)誤,因?yàn)橄到y(tǒng)沒(méi)有初始化。
有時(shí)你可能會(huì)看到一種信息:
*** Warning - bad CRC, using default environment
這條信息沒(méi)有害處,只要你初始化和保存環(huán)境變量之后,它就不會(huì)出現(xiàn)了。
首先,你必須輸入你的開(kāi)發(fā)板的序列號(hào)和網(wǎng)卡地址。需要特別注意的是,這些參數(shù)是寫(xiě)保護(hù)的,一旦保存了就無(wú)法改變(通常制造商已經(jīng)設(shè)置好了)。使用U-Boot的setenv命令可以輸入數(shù)據(jù),命令后面跟上變量名和值,參數(shù)之間用空格(或者Tab符)隔開(kāi)。例如,使用變量名serial#設(shè)置開(kāi)發(fā)板的ID或者說(shuō)序列號(hào),變量名ethaddr用于設(shè)置以太網(wǎng)地址:
=> setenv serial# TQM860LDB0A3-P.200 10061684 4
=> setenv ethaddr 00:D0:93:00:05:B5
使用printenv確認(rèn)你已經(jīng)輸入正確的值:
=> printenv serial# ethaddr
serial#=TQM860LDDBA3-P50.203 10226122 4
ethaddr=00:D0:93:00:28:81
=>
請(qǐng)仔細(xì)核查顯示值是否正確!等保存之后你將不能更正任何錯(cuò)誤。如果發(fā)現(xiàn)錯(cuò)誤,請(qǐng)重新啟動(dòng)開(kāi)發(fā)板。如果檢查無(wú)誤,你可以使用saveenv命令永久保存這些參數(shù)。
=> saveenv
Saving Enviroment to Flash...
Un-Protected 1 sectors
Erasing Flash...
. done
Erased 1 sectors
Writing to Flash... done
Protected 1 sectors
=>
5.9 U-Boot命令介紹
這一節(jié)將介紹U-Boot中最重要的指令。U-Boot可配置性非常強(qiáng),所以并不是所有的命令都已經(jīng)在你的硬件平臺(tái)上安裝,此外可能也有這兒沒(méi)提到的命令。你可以使用help命令來(lái)顯示根據(jù)你的配置所有可用的命令列表。
對(duì)于大多數(shù)命令,你不必打全這些命令,只需輸入一些字符足以。比如,help可以簡(jiǎn)寫(xiě)為h。
一些命令的執(zhí)行依賴于U-Boot的配置以及U-Boot中一些環(huán)境變量的定義。
所有的U-Boot命令都把輸入的數(shù)字當(dāng)作十六進(jìn)制的格式。
不要使用除了退格鍵之外的其它編輯鍵,因?yàn)樵谥T如環(huán)境變量中隱藏的字符是很難被發(fā)現(xiàn)的。
5.9.1 信息類命令
5.9.1.1 bdinfo – 顯示開(kāi)發(fā)板信息
=> help bdinfo
bdinfo - No help available.
=>
bdinfo命令(簡(jiǎn)寫(xiě)為bdi)將在終端顯示諸如內(nèi)存地址和大小、時(shí)鐘頻率、MAC地址等信息。這些信息在傳遞給Linux內(nèi)核一些參數(shù)時(shí)會(huì)用到。
=> bdi
memstart = 0x00000000
memsize = 0x04000000
flashstart = 0x40000000
flashsize = 0x00800000
flashoffset = 0x00030000
sramstart = 0x00000000
sramsize = 0x00000000
immr_base = 0xFFF00000
bootflags = 0x00000001
intfreq = 50 MHz
busfreq = 50 MHz
ethaddr = 00:D0:93:00:28:81
IP addr = 10.0.0.99
baudrate = 115200 bps
=>
5.9.1.2 coninfo – 顯示控制臺(tái)設(shè)備和信息
=> help conin
coninfo
=>
coninfo命令 (簡(jiǎn)寫(xiě)為conin) 顯示可用的控制I/O設(shè)備信息。
=> conin
List of available devices:
serial 80000003 SIO stdin stdout stderr
=>
輸出包括了設(shè)備名、標(biāo)識(shí)和當(dāng)前使用情況。以此為例:
serial 80000003 SIO stdin stdout stderr
這個(gè)輸出結(jié)果意為串口設(shè)備是一個(gè)系統(tǒng)設(shè)備(標(biāo)志‘S’),它提供輸入(標(biāo)志‘I’)和輸出(標(biāo)志‘O’)功能,而且當(dāng)前已經(jīng)指派給3個(gè)標(biāo)準(zhǔn)I/O流:tdin,stdout 和stderr。
5.9.1.3 flinfo – 顯示Flash存儲(chǔ)信息
=> help flinfo
flinfo
- print information for all FLASH memory banks
flinfo N
- print information for FLASH memory bank # N
=>
flinfo命令 (簡(jiǎn)寫(xiě)為fli) 用于獲取可用的flash存儲(chǔ)信息(參見(jiàn)后面的Flash存儲(chǔ)命令)。
=> fli
Bank # 1: FUJITSU AM29LV160B (16 Mbit, bottom boot sect)
Size: 4 MB in 35 Sectors
Sector Start Addresses:
40000000 (RO) 40008000 (RO) 4000C000 (RO) 40010000 (RO) 40020000 (RO)
40040000 40060000 40080000 400A0000 400C0000
400E0000 40100000 40120000 40140000 40160000
40180000 401A0000 401C0000 401E0000 40200000
40220000 40240000 40260000 40280000 402A0000
402C0000 402E0000 40300000 40320000 40340000
40360000 40380000 403A0000 403C0000 403E0000
Bank # 2: FUJITSU AM29LV160B (16 Mbit, bottom boot sect)
Size: 4 MB in 35 Sectors
Sector Start Addresses:
40400000 40408000 4040C000 40410000 40420000
40440000 40460000 40480000 404A0000 404C0000
404E0000 40500000 40520000 40540000 40560000
40580000 405A0000 405C0000 405E0000 40600000
40620000 40640000 40660000 40680000 406A0000
406C0000 406E0000 40700000 40720000 40740000
40760000 40780000 407A0000 407C0000 407E0000
=>
5.9.1.4 iminfo – 顯示映像文件頭部信息
=> help 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 (簡(jiǎn)寫(xiě)為imi) 用于顯示像Linux內(nèi)核或者ramdisk之類的映像文件的頭部信息。 它顯示映像名、類型、大小以及CRC32校驗(yàn)和以驗(yàn)證文件沒(méi)問(wèn)題。
=> imi 100000
## Checking Image at 00100000 ...
Image Name: Linux-2.4.4
Created: 2002-04-07 21:31:59 UTC
Image Type: PowerPC Linux Kernel Image (gzip compressed)
Data Size: 605429 Bytes = 591 kB = 0 MB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
=>
跟其它很多命令一樣,imi命令的精確操作可由U-Boot的一些環(huán)境變量控制(這兒的是變量verify)。參見(jiàn)后面的詳細(xì)介紹。
5.9.1.5 help – 顯示在線幫助
=> help help
help [command ...]
- show help information (for 'command')
'help' prints online help for the monitor commands.
Without arguments, it prints a short usage message for all commands.
To get detailed help information for specific commands you can type
'help' with one or more command names as arguments.
=>
help指令(簡(jiǎn)寫(xiě)為h或者?)顯示在線幫助。如果不加任何參數(shù),它會(huì)打印出所有當(dāng)前U-Boot可用命令列表。你可以把某一指令名作為help的參數(shù)來(lái)獲得這一命令的具體信息。比如:
=> help protect
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
=>
5.9.2 存儲(chǔ)類指令
5.9.2.1 base – 顯示或者設(shè)置地址偏移
=> help base
base
- print address offset for memory commands
base off
- set address offset for memory commands to 'off'
=>
你可以使用base命令(簡(jiǎn)寫(xiě)為ba)來(lái)顯示或者設(shè)置一個(gè)“基地址”作為所有存儲(chǔ)類命令的地址偏移值。默認(rèn)的基址是0,所以你輸入的所有地址都是實(shí)地址。但是,當(dāng)你重復(fù)訪問(wèn)某一特定存儲(chǔ)區(qū)域(如一些嵌入式PowerPc處理器的內(nèi)存)時(shí),如果設(shè)置此區(qū)域的開(kāi)始地址作為基址,只需使用偏移地址,這將非常簡(jiǎn)便:
=> base
Base Address: 0x00000000
=> md 0 c
00000000: feffffff 00000000 7cbd2b78 7cdc3378 ........|.+x|.3x
00000010: 3cfb3b78 3b000000 7c0002e4 39000000 .;x;...|...9...
00000020: 7d1043a6 3d000400 7918c3a6 3d00c000 }.C.=...y...=...
=> base 40000000
Base Address: 0x40000000
=> md 0 c
40000000: 27051956 50504342 6f6f7420 312e312e '..VPPCBoot 1.1.
40000010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -
40000020: 2031393a 35353a30 34290000 00000000 19:55:04)......
=>
5.9.2.2 crc32 – 校驗(yàn)和計(jì)算
crc32(簡(jiǎn)寫(xiě)為crc)用來(lái)計(jì)算在某一范圍內(nèi)存儲(chǔ)區(qū)域的CRC32校驗(yàn)和。
=> crc 100004 3FC
CRC32 for 00100004 ... 001003ff ==> d433b05b
=>
當(dāng)后面加了3個(gè)參數(shù)時(shí),此命令會(huì)把計(jì)算結(jié)果保存在給定存儲(chǔ)地址內(nèi)。
=> crc 100004 3FC 100000
CRC32 for 00100004 ... 001003ff ==> d433b05b
=> md 100000 4
00100000: d433b05b ec3827e4 3cb0bacf 00093cf5 .3.[.8'.......
=>
可以看到,CRC32的校驗(yàn)和不僅顯示出來(lái)了,還存儲(chǔ)在地址為0x10000000的存儲(chǔ)單元里。
5.9.2.3 cmp – 存儲(chǔ)單元比較
=> help cmp
cmp [.b, .w, .l] addr1 addr2 count
- compare memory
=>
使用cmp命令你可以比較兩個(gè)存儲(chǔ)區(qū)域的內(nèi)容是否一致。這個(gè)命令不僅可以測(cè)試由第3個(gè)參數(shù)確定的整個(gè)區(qū)域,還可以在第一個(gè)不同的地方停下來(lái)。
=> cmp 100000 40000000 400
word at 0x00100004 (0x50ff4342) != word at 0x40000004 (0x50504342)
Total of 1 word were the same
=> md 100000 C
00100000: 27051956 50ff4342 6f6f7420 312e312e '..VP.CBoot 1.1.
00100010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -
00100020: 2031393a 35353a30 34290000 00000000 19:55:04)......
=> md 40000000 C
40000000: 27051956 50504342 6f6f7420 312e312e '..VPPCBoot 1.1.
40000010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -
40000020: 2031393a 35353a30 34290000 00000000 19:55:04)......
=>
跟很多的存儲(chǔ)類命令一樣,cmp可以采用不同的長(zhǎng)度訪問(wèn)存儲(chǔ)器:可以是32bit(長(zhǎng)字),16bit(字)或者8bit(字節(jié))數(shù)據(jù)。默認(rèn)使用32bit,或者使用cmp.l代替,結(jié)果是一樣的。如果你想以16bit或者字?jǐn)?shù)據(jù)訪問(wèn)存儲(chǔ)器,你可以用cmp.w代替;如果是8bit或者字節(jié)數(shù)據(jù),請(qǐng)用cmp.b。
必須注意到計(jì)數(shù)參數(shù)確定了需要被處理的數(shù)據(jù)的總長(zhǎng)度,也就是有多少長(zhǎng)字、字或者字節(jié)需要被比較。
=> cmp.l 100000 40000000 400
word at 0x00100004 (0x50ff4342) != word at 0x40000004 (0x50504342)
Total of 1 word were the same
=> cmp.w 100000 40000000 800
halfword at 0x00100004 (0x50ff) != halfword at 0x40000004 (0x5050)
Total of 2 halfwords were the same
=> cmp.b 100000 40000000 1000
byte at 0x00100005 (0xff) != byte at 0x40000005 (0x50)
Total of 5 bytes were the same
=>
5.9.2.4 cp – 存儲(chǔ)器拷貝
=> help cp
cp [.b, .w, .l] source target count
- copy memory
=>
cp用來(lái)復(fù)制存儲(chǔ)單元。
=> cp 40000000 100000 10000
=>
cp 可以使用類型標(biāo)識(shí)符 .l , .w和.b。
5.9.2.5 md – 顯示存儲(chǔ)單元內(nèi)容
=> help md
md [.b, .w, .l] address [# of objects]
- memory display
=>
md采用十六進(jìn)制和ASCII碼兩種形式來(lái)顯示存儲(chǔ)單元的內(nèi)容。
=> md 100000
00100000: 27051956 50504342 6f6f7420 312e312e '..VPPCBoot 1.1.
00100010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -
00100020: 2031393a 35353a30 34290000 00000000 19:55:04)......
00100030: 00000000 00000000 00000000 00000000 ................
00100040: 00000000 00000000 00000000 00000000 ................
00100050: 00000000 00000000 00000000 00000000 ................
00100060: 00000000 00000000 00000000 00000000 ................
00100070: 00000000 00000000 00000000 00000000 ................
00100080: 00000000 00000000 00000000 00000000 ................
00100090: 00000000 00000000 00000000 00000000 ................
001000a0: 00000000 00000000 00000000 00000000 ................
001000b0: 00000000 00000000 00000000 00000000 ................
001000c0: 00000000 00000000 00000000 00000000 ................
001000d0: 00000000 00000000 00000000 00000000 ................
001000e0: 00000000 00000000 00000000 00000000 ................
001000f0: 00000000 00000000 00000000 00000000 ................
=>
00100100: 3c60fff0 7c7e9ba6 3aa00001 4800000c `..|~..:...H...
00100110: 3aa00002 48000004 38601002 7c600124 :...H...8`..|`.$
00100120: 7c7b03a6 7c7422a6 7c000278 7c1c23a6 |{..|t.|..x|.#.
00100130: 7c1d23a6 7c1623a6 7c1723a6 7c708aa6 |.#.|.#.|.#.|p..
00100140: 7c788aa6 3c600a00 7c708ba6 7c788ba6 |x..`..|p..|x..
00100150: 3c600c00 7c708ba6 7c788ba6 3c600400 `..|p..|x..`..
00100160: 7c788ba6 3c600200 7c708ba6 7c0002e4 |x..`..|p..|...
00100170: 4c00012c 3c604000 60630000 38630188 L..,`@.`c..8c..
00100180: 7c6803a6 4e800020 3c60fff0 60612ec0 |h..N.. `..`a..
00100190: 9401fffc 9401fffc 38400007 7c5e23a6 ........8@..|^#.
001001a0: 3c400000 60420000 7c5523a6 48000005 @..`B..|U#.H...
001001b0: 7dc802a6 800e22bc 7dc07214 48019d41 }......}.r.H..A
001001c0: 7ea3ab78 4800c05d 00000000 00000000 ~..xH..]........
001001d0: 00000000 00000000 00000000 00000000 ................
001001e0: 00000000 00000000 00000000 00000000 ................
001001f0: 00000000 00000000 00000000 00000000 ................
=>
這條命令同樣可以采用類型標(biāo)識(shí)符 .l, .w和.b :
=> md.w 100000
00100000: 2705 1956 5050 4342 6f6f 7420 312e 312e '..VPPCBoot 1.1.
00100010: 3520 284d 6172 2032 3120 3230 3032 202d 5 (Mar 21 2002 -
00100020: 2031 393a 3535 3a30 3429 0000 0000 0000 19:55:04)......
00100030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00100040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00100050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00100060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00100070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
=> md.b 100000
00100000: 27 05 19 56 50 50 43 42 6f 6f 74 20 31 2e 31 2e '..VPPCBoot 1.1.
00100010: 35 20 28 4d 61 72 20 32 31 20 32 30 30 32 20 2d 5 (Mar 21 2002 -
00100020: 20 31 39 3a 35 35 3a 30 34 29 00 00 00 00 00 00 19:55:04)......
00100030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
=>
上次顯示的存儲(chǔ)單元地址和計(jì)數(shù)參數(shù)值會(huì)被記憶,所以你可以不加任何參數(shù)僅僅輸入md,它將會(huì)自動(dòng)地顯示下一個(gè)地址,使用相同的計(jì)數(shù)參數(shù):
=> md.b 100000 20
00100000: 27 05 19 56 50 50 43 42 6f 6f 74 20 31 2e 31 2e '..VPPCBoot 1.1.
00100010: 35 20 28 4d 61 72 20 32 31 20 32 30 30 32 20 2d 5 (Mar 21 2002 -
=> md.w 100000
00100000: 2705 1956 5050 4342 6f6f 7420 312e 312e '..VPPCBoot 1.1.
00100010: 3520 284d 6172 2032 3120 3230 3032 202d 5 (Mar 21 2002 -
00100020: 2031 393a 3535 3a30 3429 0000 0000 0000 19:55:04)......
00100030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
=> md 100000
00100000: 27051956 50504342 6f6f7420 312e312e '..VPPCBoot 1.1.
00100010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -
00100020: 2031393a 35353a30 34290000 00000000 19:55:04)......
00100030: 00000000 00000000 00000000 00000000 ................
00100040: 00000000 00000000 00000000 00000000 ................
00100050: 00000000 00000000 00000000 00000000 ................
00100060: 00000000 00000000 00000000 00000000 ................
00100070: 00000000 00000000 00000000 00000000 ................
=>
5.9.2.6 mm – 存儲(chǔ)單元修正(自動(dòng)增長(zhǎng))
=> help md
md [.b, .w, .l] address [# of objects]
- memory display
=>
mm提供了一種互動(dòng)修改存儲(chǔ)器內(nèi)容的方法。它將會(huì)顯示地址和當(dāng)前值,然后提示用戶輸入。如果你輸入了一個(gè)合法的十六進(jìn)制數(shù),這個(gè)新的值將會(huì)被寫(xiě)入該地址。然后提示下一個(gè)地址。如果你沒(méi)有輸入任何值,只是按了一下回車,那么該地址的內(nèi)容保持不變。只要你輸入任意非十六進(jìn)制的數(shù)據(jù)(比如說(shuō).),此命令就立刻結(jié)束。
=> mm 100000
00100000: 27051956 ? 0
00100004: 50504342 ? AABBCCDD
00100008: 6f6f7420 ? 01234567
0010000c: 312e312e ? .
=> md 100000 10
00100000: 00000000 aabbccdd 01234567 312e312e .........#Eg1.1.
00100010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -
00100020: 2031393a 35353a30 34290000 00000000 19:55:04)......
00100030: 00000000 00000000 00000000 00000000 ................
=>
同樣,這條命令也可以加上類型標(biāo)識(shí)符.l, .w 和 .b?。?
=> mm.w 100000
00100000: 0000 ? 0101
00100002: 0000 ? 0202
00100004: aabb ? 4321
00100006: ccdd ? 8765
00100008: 0123 ? .
=> md 100000 10
00100000: 01010202 43218765 01234567 312e312e ....C!.e.#Eg1.1.
00100010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -
00100020: 2031393a 35353a30 34290000 00000000 19:55:04)......
00100030: 00000000 00000000 00000000 00000000 ................
=>
=> mm.b 100000
00100000: 01 ? 48
00100001: 01 ? 61
00100002: 02 ? 6c
00100003: 02 ? 6c
00100004: 43 ? 6f
00100005: 21 ? 20
00100006: 87 ? 20
00100007: 65 ? 20
00100008: 01 ? .
=> md 100000 10
00100000: 48616c6c 6f202020 01234567 312e312e Hallo .#Eg1.1.
00100010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -
00100020: 2031393a 35353a30 34290000 00000000 19:55:04)......
00100030: 00000000 00000000 00000000 00000000 ................
=>
5.9.2.7 mtest – 簡(jiǎn)單地RAM測(cè)試
=> help mtest
mtest [start [end [pattern]]]
- simple RAM read/write test
=>
mtest提供一個(gè)簡(jiǎn)單地存儲(chǔ)器測(cè)試。
=> mtest 100000 200000
Testing 00100000 ... 00200000:
Pattern 0000000F Writing... Reading...
=>
它往存儲(chǔ)器寫(xiě)入數(shù)據(jù),這樣會(huì)修改存儲(chǔ)單元。如果遇到ROM或者flash存儲(chǔ)單元,它會(huì)寫(xiě)入失敗。
如果測(cè)試的存儲(chǔ)范圍包括U-Boot使用的區(qū)域(如中斷向量表,或者內(nèi)部程序代碼,堆?;蛘叨汛娣诺膯卧嗣羁赡軙?huì)使系統(tǒng)崩潰。
5.9.2.8 mw – 寫(xiě)存儲(chǔ)器
=> help mw
mw [.b, .w, .l] address value [count]
- write memory
=>
mw是一種往存儲(chǔ)器填寫(xiě)某些數(shù)據(jù)的方法。如果調(diào)用時(shí)沒(méi)加計(jì)數(shù)參數(shù),值將僅僅被寫(xiě)到某一給定的地址。當(dāng)使用了計(jì)數(shù)參數(shù)時(shí),整個(gè)存儲(chǔ)區(qū)域都會(huì)寫(xiě)入該值。
=> md 100000 10
00100000: 0000000f 00000010 00000011 00000012 ................
00100010: 00000013 00000014 00000015 00000016 ................
00100020: 00000017 00000018 00000019 0000001a ................
00100030: 0000001b 0000001c 0000001d 0000001e ................
=> mw 100000 aabbccdd
=> md 100000 10
00100000: aabbccdd 00000010 00000011 00000012 ................
00100010: 00000013 00000014 00000015 00000016 ................
00100020: 00000017 00000018 00000019 0000001a ................
00100030: 0000001b 0000001c 0000001d 0000001e ................
=> mw 100000 0 6
=> md 100000 10
00100000: 00000000 00000000 00000000 00000000 ................
00100010: 00000000 00000000 00000015 00000016 ................
00100020: 00000017 00000018 00000019 0000001a ................
00100030: 0000001b 0000001c 0000001d 0000001e ................
=>
它又是一條可以加標(biāo)識(shí)符.l, .w和.b的命令:
=> mw.w 100004 1155 6
=> md 100000 10
00100000: 00000000 11551155 11551155 11551155 .....U.U.U.U.U.U
00100010: 00000000 00000000 00000015 00000016 ................
00100020: 00000017 00000018 00000019 0000001a ................
00100030: 0000001b 0000001c 0000001d 0000001e ................
=> mw.b 100007 ff 7
=> md 100000 10
00100000: 00000000 115511ff ffffffff ffff1155 .....U.........U
00100010: 00000000 00000000 00000015 00000016 ................
00100020: 00000017 00000018 00000019 0000001a ................
00100030: 0000001b 0000001c 0000001d 0000001e ................
=>
5.9.2.9 nm – 存儲(chǔ)單元修正(恒定地址)
=> help nm
nm [.b, .w, .l] address
- memory modify, read and keep address
=>
nm命令用于互動(dòng)地往某個(gè)相同的地址寫(xiě)入不同的數(shù)據(jù)。在訪問(wèn)和修改設(shè)備寄存器的時(shí)候,這將會(huì)非常有用。
=> nm.b 100000
00100000: 00 ? 48
00100000: 48 ? 61
00100000: 61 ? 6c
00100000: 6c ? 6c
00100000: 6c ? 6f
00100000: 6f ? .
=> md 100000 8
00100000: 6f000000 115511ff ffffffff ffff1155 o....U.........U
00100010: 00000000 00000000 00000015 00000016 ................
=>
nm同樣可以加上標(biāo)識(shí)符 .l, .w和.b。
5.9.2.10 loop – 在地址范圍內(nèi)無(wú)限循環(huán)
=> help loop
loop [.b, .w, .l] address number_of_objects
- loop on a set of addresses
=>
loop命令非??焖俚刈x某個(gè)存儲(chǔ)范圍。因?yàn)檫@個(gè)命令力圖最快速地讀取存儲(chǔ)單元,所以被用作一種特殊的存儲(chǔ)器測(cè)試。
這個(gè)命令永遠(yuǎn)不會(huì)結(jié)束。除了重啟開(kāi)發(fā)板,沒(méi)有其它辦法可以停止它!
=> loop 100000 8
評(píng)論