U-Boot是“Monitor”。除了Bootloader的系統引導功能,它還有用戶命令接口,提供了一些復雜的調試、讀寫內存、燒寫Flash、配置環境變量等功能。掌握U-Boot的使用,將極大地方便嵌入式系統的開發。

  

6.4.1  燒寫U-Boot到Flash

新開發的電路板沒有任何程序可以執行,也就不能啟動,需要先將U-Boot燒寫到Flash中。

如果主板上的EPROM或者Flash能夠取下來,就可以通過編程器燒寫。例如:計算機BIOS就存儲在一塊256KBFlash上,通過插座與主板連接。

但是多數嵌入式單板使用貼片的Flash,不能取下來燒寫。這種情況可以通過處理器的調試接口,直接對板上的Flash編程。

處理器調試接口是為處理器芯片設計的標準調試接口,包含BDMJTAGEJTAG 3種接口標準。JTAG接口在第4章已經介紹過;BDMBackground Debug Mode)主要應用在PowerPC8xx系列處理器上;EJTAG主要應用在MIPS處理器上。這3種硬件接口標準定義有所不同,但是功能基本相同,下面都統稱為JTAG接口。

JTAG接口需要專用的硬件工具來連接。無論從功能、性能角度,還是從價格角度,這些工具都有很大差異。關於這些工具的選擇,將在第6.4.1節詳細介紹。

最簡單方式就是通過JTAG電纜,轉接到計算機並口連接。這需要在主機端開發燒寫程序,還需要有並口設備驅動程序。開發板上電或者復位的時候,燒寫程序探測到處理器並且開始通信,然后把Bootloader下載並燒寫到Flash中。這種方式速率很慢,可是價格非常便宜。一般來說,平均每秒鐘可以燒寫100200個字節。

燒寫完成后,復位實驗板,串口終端應該顯示U-Boot的啟動信息。

  

6.4.2  U-Boot的常用命令

U-Boot上電啟動后,敲任意鍵可以退出自動啟動狀態,進入命令行。

 

U-Boot 1.1.2 (Apr 26 2005 - 12:27:13)

U-Boot code: 11080000 -> 1109614C  BSS: -> 1109A91C

RAM Configuration:

Bank #0: 10000000 32 MB

Micron StrataFlash MT28F128J3 device initialized

Flash: 32 MB

In:    serial

Out:   serial

Err:   serial

Hit any key to stop autoboot:  0

U-Boot>

 

在命令行提示符下,可以輸入U-Boot的命令並執行。U-Boot可以支持幾十個常用命令,通過這些命令,可以對開發板進行調試,可以引導Linux內核,還可以擦寫Flash完成系統部署等功能。掌握這些命令的使用,才能夠順利地進行嵌入式系統的開發。

輸入help命令,可以得到當前U-Boot的所有命令列表。每一條命令后面是簡單的命令說明。

 

=> help

?       - alias for 'help'

autoscr - run script from memory

base    - print or set address offset

bdinfo  - print Board Info structure

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

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

bootm   - boot application image from memory

bootp   - boot image via network using BootP/TFTP protocol

cmp     - memory compare

coninfo  - print console devices and information

cp      - memory copy

crc32   - checksum calculation

dhcp    - invoke DHCP client to obtain IP/boot params

echo    - echo args to console

erase   - erase FLASH memory

flinfo  - print FLASH memory information

go      - start application at address 'addr'

help    - print online help

iminfo  - print header information for application image

imls    - list all images found in flash

itest    - return true/false on integer compare

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)

nfs     - boot image via network using NFS protocol

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

version - print monitor version

=>

 

U-Boot還提供了更加詳細的命令幫助,通過help命令還可以查看每個命令的參數說明。由於開發過程的需要,有必要先把U-Boot命令的用法弄清楚。接下來,根據每一條命令的幫助信息,解釋一下這些命令的功能和參數。

 

=> help bootm

bootm [addr [arg ...]]

    - boot application image stored in memory

          passing arguments 'arg ...'; when booting a Linux kernel,

          'arg' can be the address of an initrd image

 

bootm命令可以引導啟動存儲在內存中的程序映像。這些內存包括RAM和可以永久保存的Flash

1個參數addr是程序映像的地址,這個程序映像必須轉換成U-Boot的格式。

2個參數對於引導Linux內核有用,通常作為U-Boot格式的RAMDISK映像存儲地址;也可以是傳遞給Linux內核的參數(缺省情況下傳遞bootargs環境變量給內核)。

 

=> help bootp

bootp [loadAddress] [bootfilename]

 

bootp命令通過bootp請求,要求DHCP服務器分配IP地址,然后通過TFTP協議下載指定的文件到內存。

1個參數是下載文件存放的內存地址。

2個參數是要下載的文件名稱,這個文件應該在開發主機上準備好。

 

=> help cmp

cmp [.b, .w, .l] addr1 addr2 count

     - compare memory

 

cmp命令可以比較2塊內存中的內容。.b以字節為單位;.w以字為單位;.l以長字為單位。注意:cmp.b中間不能保留空格,需要連續敲入命令。

1個參數addr1是第一塊內存的起始地址。

2個參數addr2是第二塊內存的起始地址。

3個參數count是要比較的數目,單位按照字節、字或者長字。

 

=> help cp

cp [.b, .w, .l] source target count

       - copy memory

 

cp命令可以在內存中復制數據塊,包括對Flash的讀寫操作。

1個參數source是要復制的數據塊起始地址。

2個參數target是數據塊要復制到的地址。這個地址如果在Flash中,那麼會直接調用寫Flash的函數操作。所以U-BootFlash就使用這個命令,當然需要先把對應Flash區域擦干凈。

3個參數count是要復制的數目,根據cp.b cp.w cp.l分別以字節、字、長字為單位。

 

=> help crc32

crc32 address count [addr]

     - compute CRC32 checksum [save at addr]  

 

crc32命令可以計算存儲數據的校驗和。

1個參數address是需要校驗的數據起始地址。

2個參數count是要校驗的數據字節數。

3個參數addr用來指定保存結果的地址。

 

=> help echo

echo [args..]

      - echo args to console; \c suppresses newline

 

echo命令回顯參數。

 

=> help erase

erase start end

      - erase FLASH from addr 'start' to addr 'end'

erase N:SF[-SL]

      - erase sectors SF-SL in FLASH bank # N

erase bank N

      - erase FLASH bank # N

erase all

      - erase all FLASH banks

 

erase命令可以擦Flash

參數必須指定Flash擦除的範圍。

按照起始地址和結束地址,start必須是擦除塊的起始地址;end必須是擦除末尾塊的結束地址。這種方式最常用。舉例說明:擦除0x20000 – 0x3ffff區域命令為erase 20000 3ffff

按照組和扇區,N表示Flash的組號,SF表示擦除起始扇區號,SL表示擦除結束扇區號。另外,還可以擦除整個組,擦除組號為N的整個Flash組。擦除全部Flash只要給出一個all的參數即可。

 

=> help flinfo

flinfo

       - print information for all FLASH memory banks

flinfo N

       - print information for FLASH memory bank # N

 

flinfo命令打印全部Flash組的信息,也可以只打印其中某個組。一般嵌入式系統的Flash只有一個組。

 

=> help go

go addr [arg ...]

      - start application at address 'addr'

        passing 'arg' as arguments

 

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

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

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

 

=> 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可以打印程序映像的開頭信息,包含了映像內容的校驗(序列號、頭和校驗和)。

1個參數指定映像的起始地址。

可選的參數是指定更多的映像地址。

 

=> help loadb

loadb [ off ] [ baud ]

     - load binary file over serial line with offset 'off' and baudrate 'baud'

 

loadb命令可以通過串口線下載二進制格式文件。

 

=> help loads

loads [ off ]

    - load S-Record file over serial line with offset 'off'

 

loads命令可以通過串口線下載S-Record格式文件。

 

=> help mw

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

     - write memory

 

mw命令可以按照字節、字、長字寫內存,.b .w .l的用法與cp命令相同。

1個參數address是要寫的內存地址。

2個參數value是要寫的值。

3個可選參數count是要寫單位值的數目。

 

=> help nfs

nfs [loadAddress] [host ip addr:bootfilename]

 

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

 

=> help nm

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

     - memory modify, read and keep address

 

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

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

 

=> help printenv

printenv

      - print values of all environment variables

printenv name ...

      - print value of environment variable 'name'

 

printenv命令打印環境變量。

可以打印全部環境變量,也可以只打印參數中列出的環境變量。

 

=> 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

 

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

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

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

 

=> help rarpboot

rarpboot [loadAddress] [bootfilename]

 

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

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

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

 

=> help run

run var [...]

      - run the commands in the environment variable(s) 'var'

 

run命令可以執行環境變量中的命令,后面參數可以跟幾個環境變量名。

 

=> help setenv

setenv name value ...

      - set environment variable 'name' to 'value ...'

setenv name

      - delete environment variable 'name'

 

setenv命令可以設置環境變量。

1個參數是環境變量的名稱。

2個參數是要設置的值,如果沒有第2個參數,表示刪除這個環境變量。

 

 

=> help sleep

sleep N

      - delay execution for N seconds (N is _decimal_ !!!)

 

sleep命令可以延遲N秒鐘執行,N為十進制數。

 

=> help tftpboot

tftpboot [loadAddress] [bootfilename]

 

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

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

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

這些U-Boot命令為嵌入式系統提供了豐富的開發和調試功能。在Linux內核啟動和調試過程中,都可以用到U-Boot的命令。但是一般情況下,不需要使用全部命令。比如已經支持以太網接口,可以通過tftpboot命令來下載文件,那麼還有必要使用串口下載的loadb嗎?反過來,如果開發板需要特殊的調試功能,也可以添加新的命令。

在建立交叉開發環境和調試Linux內核等章節時,在ARM平台上移植了U-Boot,並且提供了具體U-Boot的操作步驟。

 

6.4.3  U-Boot的環境變量

有點類似ShellU-Boot也使用環境變量。可以通過printenv命令查看環境變量的設置。

 

U-Boot> printenv

bootdelay=3

baudrate=115200

netmask=255.255.0.0

ethaddr=12:34:56:78:90:ab

bootfile=uImage

bootargs=console=ttyS0,115200 root=/dev/ram rw initrd=0x30800000,8M

bootcmd=tftp 0x30008000 zImage;go 0x30008000

serverip=192.168.1.1

ipaddr=192.168.1.100

stdin=serial

stdout=serial

stderr=serial

 

Environment size: 337/131068 bytes

U-Boot>

 

6.5是常用環境變量的含義解釋。通過printenv命令可以打印出這些變量的值。

6.5                                                  U-Boot環境變量的解釋說明

 

   

   

bootdelay

定義執行自動啟動的等候秒數

baudrate

定義串口控制台的波特率

netmask

定義以太網接口的掩碼

ethaddr

定義以太網接口的MAC地址

bootfile

定義缺省的下載文件

bootargs

定義傳遞給Linux內核的命令行參數

bootcmd

定義自動啟動時執行的幾條命令

serverip

定義tftp服務器端的IP地址

ipaddr

定義本地的IP地址

stdin

定義標準輸入設備,一般是串口

stdout

定義標準輸出設備,一般是串口

stderr

定義標準出錯信息輸出設備,一般是串口

 

 

U-Boot的環境變量都可以有缺省值,也可以修改並且保存在參數區。U-Boot的參數區一般有EEPROMFlash兩種設備。

環境變量的設置命令為setenv,在6.2.2節有命令的解釋。

舉例說明環境變量的使用。

 

=>setenv serverip  192.168.1.1

=>setenv ipaddr  192.168.1.100

=>setenv rootpath  "/usr/local/arm/3.3.2/rootfs"

=>setenv bootargs  "root=/dev/nfs rw nfsroot=\$(serverip):\$(rootpath) ip=
\$(ipaddr) "

=>setenv kernel_addr 30000000

=>setenv nfscmd  "tftp \$(kernel_addr) uImage; bootm \$(kernel_addr) "

=>run nfscmd

 

上面定義的環境變量有serverip ipaddr rootpath bootargs kernel_addr。環境變量bootargs中還使用了環境變量,bootargs定義命令行參數,通過bootm命令傳遞給內核。環境變量nfscmd中也使用了環境變量,功能是把uImage下載到指定的地址並且引導起來。可以通過run命令執行nfscmd腳本。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 丘猴子 的頭像
    丘猴子

    轉貼部落格

    丘猴子 發表在 痞客邦 留言(0) 人氣()