歡迎您光臨本站 註冊首頁

DENX U-Boot及Linux使用手冊

←手機掃碼閱讀     火星人 @ 2014-03-24 , reply:0

1. 概要
這是嵌入式PowerPC, ARMMIPS系統中使用DENX U-BootLinux的指導手冊。
文檔中描述了如何在嵌入式PowerPC, ARMMIPS系統上配置、編譯、使用Das U-Boot(常常縮寫為「U-Boot」)和Linux操作系統。
本文檔寫於2005年一月至四月四日十四點十五分。
2. 緒論
本文檔描述了如何在嵌入式PowerPC, ARMMIPS系統上配置、編譯、使用U-BootLinux操作系統。
在這些過程中有太多的步驟,不可能面面俱到、非常深入,但我們會儘力提供所有必需的信息,能夠讓一個嵌入式系統運行。文檔中涵蓋了所有你可能需要的用於配置、編譯、運行U-BootLinux的工具。
首先,我們介紹如何安裝交叉編譯開發工具Embedded Linux Development Kit(ELDK),這個開發套件你很有可能會用到——至少當你在標準的x86 PC上使用Linux或者Sun Solaris系統作為開發環境的時候,你會需要它的。
然後,我們會闡述通過串口與你的目標板連接:你需要配置一個終端控制程序,如cu或者kermit
你常常需要通過網線把映像文件下載到你的目標板上。為了實現這個目的,你需要TFTPDHCP/BOOTP伺服器。文檔中提供了簡要的相關配置說明。
接下來則是描述如何配置和編譯U-Boot使之適用於某個特定的平台,以及如何安裝和在該硬體平台上運行。
下一步的工作是配置、建立和安裝Linux。我們使用SELF(Simple Embedded Linux Framework)來展示如何建立一個開發環境(包括通過NFS掛載的根文件系統)和一個嵌入式目標板配置(從基於busyboxramdisk映像文件中運行)。
本文檔不會給出如何把U-Boot或者Linux移植到一個新的硬體平台,而是默認你的開發板已經被U-BootLinux所支持。
本文檔的側重點是針對TQM8xxL開發板。
本手冊各種文檔格式的最新版本可以從以下網址獲取:
HTMLhttp://www.denx.de/twiki/publish/DULG/DULG-tqm8xxl.html
PDF http://www.denx.de/twiki/publish/DULG/DULG-tqm8xxl.pdf
3. 嵌入式Linux開發工具套件
嵌入式Linux開發工具套件(ELDK)包括GNU交叉開發工具,如編譯器、binutilsgdb等工具,和一些已經編譯好的目標工具以及負責提供在目標平台上函數調用的庫文件。
還免費提供了所有的源代碼,包括全部補丁、擴展文件、以及用於編譯開發工具使用的程序和腳本。
安裝包都是基於RPM包管理器。
3.1 獲取ELDK
可以通過以下方式獲得ELDK
·DENX計算機系統光碟
·從以下伺服器中下載
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目錄樹根目錄下的安裝工具。安裝工具使用語法如下;
$ ./install [-d ] [] [] ...
-d 確定ELDK安裝在哪個目錄。如果省略ELDK會安裝在當前目錄。
確定目標平台的CPU。如果此項設置了一項以上的參數,則會將這些CPU的支持都安裝。如果省略將會安裝所有CPU的支持。
你也可以把ELDK安裝到任何空目錄下,這麼做的唯一條件是你有那個目錄的寫和執行許可權。安裝過程並不需要超級用戶的特權。
由安裝時的參數決定安裝幾個目標組件集合。ELDT包是肯定會安裝的。
4. 系統設置
在目標平台上安裝和配置U-BootLinux需要一些工具。特別是在開發過程中,你需要和目標平台保持聯繫。這一節將告訴你如何配置你的主機以達到上述目的。
4.1 設置串口
為了更好地使用U-BootLinux,你需要通過串口將目標板和你的主機連接。U-BootLinux可以配置成自動執行而不需要任何用戶的干涉。
通過串口有很多種方法來控制你的目標板,比如說使用終端伺服器。不過最常見的做法是使用你本機的串口,這時,你主機需要安裝一個終端程序,如cu或者kermit
4.2 配置「kermit
kermit這個名字就代表了它是連接串口和網路的通信軟體。事實上在很多計算機和操作系統上使用它,能夠很好地滿足我們的目的。
kermit在執行其它命令之前,會執行你的用戶目錄下的初始文件.kermrc,所以可以非常簡單的通過初始化命令來定製kermit。下面是使用U-BootLinux時推薦配置:
~/.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

這個設置假定你使用的是主機第一個串口(/dev/ttyS0),以115200這個波特率與目標板的串口連接。
然後你可以連接目標板了:
$ 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這個軟體時,你會發現有兩個kermit包。你只需要安裝ckermit。其中gkermit僅僅是實現kermit傳輸協議的一個命令行工具。
如果你主機上的Linux系統沒有安裝kermit,你可以到kerimt的官方網站 http://www.columbia.edu/kermit/ 下載。
4.3 使用minicom
minicom是另外一種非常流行的串口通信終端。很遺憾的是,很多用戶發現在使用U-BootLinux時,minicom有很多問題,尤其是試圖使用它來下載image的時候。因此,不推薦大家使用minicom
(譯者註:我使用minicom也工作的很好,沒有碰到什麼問題。)
4.4 配置TFTP伺服器
使用U-Boot下載Linux內核或者應用程序的最快捷的方法是通過網路傳輸。為了這一目的,U-Boot實現了TFTP協議(參見U-Boot中的tftpboot命令)。
為了使主機支持TFTP,你必須確保TFTP後台程序/usr/sbin/in.tftpd已經安裝。在RedHat系統中,你可以運行下面的命令來確認:
$ rpm -q tftp-server
如果沒有安裝,請從你的Linux安裝盤或者其它媒介安裝。
大多數的Linux發行版都默認關閉TFTP服務。以RedHat系統為例,如果要使能TFTP服務,編輯文件/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目錄存在,而且有訪問許可權(至少應該"dr-xr-xr-x")。

5. Das U-Boot
5.1 當前版本
Das U-Boot(或者簡稱「U-Boot」)是針對嵌入式PowerPC, ARM, MIPSx86處理器的開放源代碼軟體。U-Boot項目已經在Sourceforge設立,你可以訪問這個官方網站:http://sourceforge.net/projects/u-boot
U-Boot最新版的源代碼可以在Sourcefoge通過匿名CVS得到。當要求輸入匿名用戶anonymous的密碼時只需要直接按下回車鍵。
$ 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
官方發布的U-Boot也可以通過FTP方式獲取。你可以到
ftp://ftp.denx.de/pub/u-boot/
下載tar形式的壓縮包。
5.2 源代碼包的解壓
如果你是通過CVS得到的U-Boot源代碼,你可以跳過這一步,因為你得到的已經是解壓后的目錄樹了。如果你是從FTP伺服器上下載的tar壓縮包,那麼你需要按照以下步驟解壓:
$ cd /opt/eldk/usr/src
$ wgetftp://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 配置
進入U-Boot源代碼根目錄后,可以先使用如下命令確保已經清除以前編譯的結果:
$ make distclean
下一步是為TQM8xxL板配置U-Boot
$ make tqm8xxl_config
(譯者註:應該根據你自己的具體開發板配置,如
$ make _config,如果沒有相應的開發板,應該自己照著建立相應的目錄和配置文件。)
最後我們可以開始編譯U-Boot了:
$ make all
5.4 安裝
5.4.1 動手之前
5.4.1.1 安裝所需
以下的章節假定你的開發板使用flash作為存儲設備。如果不是,則以下的指令不會工作。如果你想使用U-Boot,需要換掉存儲設備。
5.4.1.2 開發板識別數據
所有的TQM8xxL開發板使用一個序列號加以識別。而且開發板需要分配一個乙太網MAC地址。如果這些數據丟失,你可能會失去授權。在安裝U-Boot或者改變開發板的配置之前,你需要搜集足夠的信息。
5.4.2 使用BDM/JTAG調試器安裝U-Boot.bin
把數據燒入flash中的一個簡單而又快速的辦法是通過BDM或者JTAG介面的調試器或者flash燒寫器。當flash中沒有任何數據(比如說一塊新的開發板),這種方法是唯一的選擇。
我們(強烈推薦)使用Abatron公司的BDI2000(見http://www.abatron.ch/BDI/bdiGDB.html )
其它的BDM/JTAG調試器也可以使用,但是如何操作它們不是本文檔要討論的範圍。如果你想使用別的工具請參照它們的說明文檔。
譯者註:我沒有使用BDI2000,故略去操作BDI2000的方法。我燒寫u-boot.bin就是簡單地通過JTAG口。甚至我燒寫800kLinux內核都是用JTAG,只要你不嫌慢。)
5.4.3 使用U-Boot安裝U-Boot.bin
如果U-Boot已經在你的板子上安裝運行,你可以使用這些命令來下載新的U-Boot映像來代替當前的。
警告:在你安裝新的映像之前,你必須擦除當前的u-boot.bin。如果出現什麼差錯,你的開發板將不能運行。因此強烈建議:
做一個能工作的U-Boot映像文件的備份;
你清楚如何在一個新的開發板上安裝u-boot.bin
過程如下:
=> 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內核、Ramdisk或者其它映像時使用一種特殊的映像格式。這種格式包含了一些信息,如創建時間、操作系統、壓縮格式、映像類型、映像名和CRC32校驗和。
mkimage用來創建這種格式的映像文件或者顯示它包含的信息。如果使用ELDK,那麼mkimage這個命令已經包含在ELDK中。
如果你不想使用ELDK,你應該把mkimage安裝在某個能夠直接執行的目錄里,比如:
$ cp tools/mkimage /usr/local/bin/
5.6 初始化
初始化你的TQM8xxL板上的U-Boot,你需要通過終端連接板子的串口。
TQM8xxL板的串口默認配置是波特率為115200/8N1(115200bps,每個字元8bit,無奇偶校驗,1bit停止位,無握手)
如果你的主機是Linux操作系統,我們建議你用kermit或者cu作為終端控制程序。
確定硬體和軟體控制流都已經關閉。
5.7 開始的步驟
在默認配置中,U-Boot運行在一種互動模式,它通過串口「COM.1(X.18)」提供命令行形式的用戶介面。
這意味著U-Boot顯示一個提示符(默認是:=>),等待著接受用戶的輸入。然後你輸入一個命令,按下回車鍵。U-Boot將運行這個命令,然後又出現提示符等待下一條命令。
你可以使用help(或者簡單地一個?)來查看所有的U-Boot命令。它將會列出在你當前配置下所有支持的命令。[請注意到儘管U-Boot提供了很多配置選項,並不是所有選項都支持各種處理器和開發板,有些選項可能在你的配置中並沒有被選上。]
=> 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''''
=>
大多數命令可以縮寫,只要字元串的內容仍然可以被確定:
=> 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 首次上電
注意:如果你購買的TQM8xxL板已經安裝了U-Boot,你可以跳過這節,因為製造商已經完成這些步驟了。
把主機指定的串口和在TQM8xxL板上標有「COM.1(X.18)」的埠連接,運行終端程序,給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
=>
你可以按下任意鍵來中止倒計數。如果你不那麼做,你可能會看到一些(無關緊要的)錯誤,因為系統沒有初始化。
有時你可能會看到一種信息:
*** Warning - bad CRC, using default environment
這條信息沒有害處,只要你初始化和保存環境變數之後,它就不會出現了。
首先,你必須輸入你的開發板的序列號和網卡地址。需要特別注意的是,這些參數是防寫的,一旦保存了就無法改變(通常製造商已經設置好了)。使用U-Bootsetenv命令可以輸入數據,命令後面跟上變數名和值,參數之間用空格(或者Tab符)隔開。例如,使用變數名serial#設置開發板的ID或者說序列號,變數名ethaddr用於設置乙太網地址:
=> setenv serial# TQM860LDB0A3-P.200 10061684 4
=> setenv ethaddr 00:D0:93:00:05:B5
使用printenv確認你已經輸入正確的值:
=> printenv serial# ethaddr
serial#=TQM860LDDBA3-P50.203 10226122 4
ethaddr=00:D0:93:00:28:81
=>
請仔細核查顯示值是否正確!等保存之後你將不能更正任何錯誤。如果發現錯誤,請重新啟動開發板。如果檢查無誤,你可以使用saveenv命令永久保存這些參數。
=> 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命令介紹
這一節將介紹U-Boot中最重要的指令。U-Boot可配置性非常強,所以並不是所有的命令都已經在你的硬體平台上安裝,此外可能也有這兒沒提到的命令。你可以使用help命令來顯示根據你的配置所有可用的命令列表。
對於大多數命令,你不必打全這些命令,只需輸入一些字元足以。比如,help可以簡寫為h
一些命令的執行依賴於U-Boot的配置以及U-Boot中一些環境變數的定義。
所有的U-Boot命令都把輸入的數字當作十六進位的格式。
不要使用除了退格鍵之外的其它編輯鍵,因為在諸如環境變數中隱藏的字元是很難被發現的。
5.9.1 信息類命令
5.9.1.1 bdinfo ? 顯示開發板信息
=> help bdinfo
bdinfo - No help available.
=>
bdinfo命令(簡寫為bdi)將在終端顯示諸如內存地址和大小、時鐘頻率、MAC地址等信息。這些信息在傳遞給Linux內核一些參數時會用到。
=> 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 ? 顯示控制台設備和信息
=> help conin
coninfo
=>
coninfo命令 (簡寫為conin) 顯示可用的控制I/O設備信息。
=> conin
List of available devices:
serial 80000003 SIO stdin stdout stderr
=>
輸出包括了設備名、標識和當前使用情況。以此為例:
serial 80000003 SIO stdin stdout stderr
這個輸出結果意為串口設備是一個系統設備(標誌『S』),它提供輸入(標誌『I』)和輸出(標誌『O』)功能,而且當前已經指派給3個標準I/O流:tdinstdout stderr
5.9.1.3 flinfo ? 顯示Flash存儲信息
=> help flinfo
flinfo
- print information for all FLASH memory banks
flinfo N
- print information for FLASH memory bank # N
=>
flinfo命令 (簡寫為fli) 用於獲取可用的flash存儲信息(參見後面的Flash存儲命令)。
=> 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 (簡寫為imi) 用於顯示像Linux內核或者ramdisk之類的映像文件的頭部信息。 它顯示映像名、類型、大小以及CRC32校驗和以驗證文件沒問題。
=> 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的一些環境變數控制(這兒的是變數verify)。參見後面的詳細介紹。
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指令(簡寫為h或者?)顯示在線幫助。如果不加任何參數,它會列印出所有當前U-Boot可用命令列表。你可以把某一指令名作為help的參數來獲得這一命令的具體信息。比如:
=> 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 存儲類指令
5.9.2.1 base ? 顯示或者設置地址偏移
=> help base
base
- print address offset for memory commands
base off
- set address offset for memory commands to ''''off''''
=>
你可以使用base命令(簡寫為ba)來顯示或者設置一個「基地址」作為所有存儲類命令的地址偏移值。默認的基址是0,所以你輸入的所有地址都是實地址。但是,當你重複訪問某一特定存儲區域(如一些嵌入式PowerPc處理器的內存)時,如果設置此區域的開始地址作為基址,只需使用偏移地址,這將非常簡便:
=> 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 ? 校驗和計算
crc32(簡寫為crc)用來計算在某一範圍內存儲區域的CRC32校驗和。
=> crc 100004 3FC
CRC32 for 00100004 ... 001003ff ==> d433b05b
=>
當後面加了3個參數時,此命令會把計算結果保存在給定存儲地址內。
=> crc 100004 3FC 100000
CRC32 for 00100004 ... 001003ff ==> d433b05b
=> md 100000 4
00100000: d433b05b ec3827e4 3cb0bacf 00093cf5 .3.[.8''''.<.....<.
=>
可以看到,CRC32的校驗和不僅顯示出來了,還存儲在地址為0x10000000的存儲單元里。
5.9.2.3 cmp ? 存儲單元比較
=> help cmp
cmp [.b, .w, .l] addr1 addr2 count
- compare memory
=>
使用cmp命令你可以比較兩個存儲區域的內容是否一致。這個命令不僅可以測試由第3個參數確定的整個區域,還可以在第一個不同的地方停下來。
=> 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)......
=>
跟很多的存儲類命令一樣,cmp可以採用不同的長度訪問存儲器:可以是32bit(長字),16bit()或者8bit(位元組)數據。默認使用32bit,或者使用cmp.l代替,結果是一樣的。如果你想以16bit或者字數據訪問存儲器,你可以用cmp.w代替;如果是8bit或者位元組數據,請用cmp.b
必須注意到計數參數確定了需要被處理的數據的總長度,也就是有多少長字、字或者位元組需要被比較。
=> 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 ? 存儲器拷貝
=> help cp
cp [.b, .w, .l] source target count
- copy memory
=>
cp用來複制存儲單元。
=> cp 40000000 100000 10000
=>
cp 可以使用類型標識符 .l , .w.b
5.9.2.5 md ? 顯示存儲單元內容
=> help md
md [.b, .w, .l] address [# of objects]
- memory display
=>
md採用十六進位和ASCII碼兩種形式來顯示存儲單元的內容。
=> 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 ................
=>
這條命令同樣可以採用類型標識符 .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 ................
=>
上次顯示的存儲單元地址和計數參數值會被記憶,所以你可以不加任何參數僅僅輸入md,它將會自動地顯示下一個地址,使用相同的計數參數:
=> 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 ? 存儲單元修正(自動增長)
=> help md
md [.b, .w, .l] address [# of objects]
- memory display
=>
mm提供了一種互動修改存儲器內容的方法。它將會顯示地址和當前值,然後提示用戶輸入。如果你輸入了一個合法的十六進位數,這個新的值將會被寫入該地址。然後提示下一個地址。如果你沒有輸入任何值,只是按了一下回車,那麼該地址的內容保持不變。只要你輸入任意非十六進位的數據(比如說.),此命令就立刻結束。
=> 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 ................
=>
同樣,這條命令也可以加上類型標識符.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 ? 簡單地RAM測試
=> help mtest
mtest [start [end [pattern]]]
- simple RAM read/write test
=>
mtest提供一個簡單地存儲器測試。
=> mtest 100000 200000
Testing 00100000 ... 00200000:
Pattern 0000000F Writing... Reading...
=>
它往存儲器寫入數據,這樣會修改存儲單元。如果遇到ROM或者flash存儲單元,它會寫入失敗。
如果測試的存儲範圍包括U-Boot使用的區域(如中斷向量表,或者內部程序代碼,堆棧或者堆存放的單元),此命令可能會使系統崩潰。
5.9.2.8 mw ? 寫存儲器
=> help mw
mw [.b, .w, .l] address value [count]
- write memory
=>
mw是一種往存儲器填寫某些數據的方法。如果調用時沒加計數參數,值將僅僅被寫到某一給定的地址。當使用了計數參數時,整個存儲區域都會寫入該值。
=> 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 ................
=>
它又是一條可以加標識符.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 ? 存儲單元修正(恆定地址)
=> help nm
nm [.b, .w, .l] address
- memory modify, read and keep address
=>
nm命令用於互動地往某個相同的地址寫入不同的數據。在訪問和修改設備寄存器的時候,這將會非常有用。
=> 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同樣可以加上標識符 .l, .w.b
5.9.2.10 loop ? 在地址範圍內無限循環
=> help loop
loop [.b, .w, .l] address number_of_objects
- loop on a set of addresses
=>
loop命令非常快速地讀某個存儲範圍。因為這個命令力圖最快速地讀取存儲單元,所以被用作一種特殊的存儲器測試。
這個命令永遠不會結束。除了重啟開發板,沒有其它辦法可以停止它!
=> loop 100000 8

[火星人 ] DENX U-Boot及Linux使用手冊已經有1061次圍觀

http://coctec.com/docs/linux/show-post-133690.html