當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]用U-BOOT構(gòu)建嵌入式系統(tǒng)的引導(dǎo)裝載程序

摘 要:BootLoader(引導(dǎo)裝載程序)是嵌入式系統(tǒng)軟件開發(fā)的第一個(gè)環(huán)節(jié),它把操作系統(tǒng)和硬件平臺(tái)銜接在一起,對(duì)于嵌入式系統(tǒng)的后續(xù)軟件開發(fā)十分重要,在整個(gè)開發(fā)中也占有相當(dāng)大的比例。U-BOOT是當(dāng)前比較流行、功能強(qiáng)大的BootLoader,可以支持多種體系結(jié)構(gòu)。LH7A400是Sharp公司生產(chǎn)的一款基于ARM922T內(nèi)核的32位RISC芯片,本文詳細(xì)介紹U-BOOT的功能、特點(diǎn)以及在LH7A400處理器上的移植過程。


關(guān)鍵詞:BootLoader U-BOOT移植 LH7A400 ARM922T


引 言:

  本文以U-BOOT為例,介紹了如何在ARM9開發(fā)板上移植BootLoader的過程。LH7A400學(xué)習(xí)板是旋極公司推出的一款高性能嵌入式開發(fā)板,其采用的處理器LH7A400是Sharp公司生產(chǎn)的一款基于ARM922T內(nèi)核的32位RISC芯片。該芯片集成了高性能的32位RISC處理器核ARM922T(運(yùn)算速度200MHz,總線速度100MHz) ,能使處理速度達(dá)到每秒220百萬條指令(MIPS),能耗為1.33mW/MIPS,可以在低電壓狀態(tài)下工作(核心1.8V,輸入/輸出3.3 V),片內(nèi)帶有鎖相回路(PLL)和低能耗核心。此外該芯片還包括: 16KB 高速緩存(Cache), 存儲(chǔ)器管理單元(MMU), 80KB 靜態(tài)存儲(chǔ)器(SRAM), 彩色液晶顯示控制器(LCD), 直接存儲(chǔ)控制器(10通道DMA), 異步串行口控制器(UART), 同步串行口控制器(SSP), PCMCIA控制器, AC97聲音控制器, 智能卡控制器, 多媒體卡控制器, 電池控制器, USB控制器和時(shí)鐘/供電管理器。值得一提的是,LH7A400是一款寬溫芯片,其工作溫度范圍為-40℃~+85℃(降低時(shí)鐘頻率),可廣泛應(yīng)用于無線手持設(shè)備、智能電話、PDA、家庭娛樂控制器、PocketPC及各種工控設(shè)備。
該學(xué)習(xí)板還包括如下硬件:由2片16位Flash (32MB)和2片16位的SDRAM(64M)構(gòu)成32位寬的高速存儲(chǔ)器結(jié)構(gòu);10/100M自適應(yīng)網(wǎng)絡(luò)芯片DM9000;Sharp 3.5’TFT LCD彩屏;觸摸屏;USB Host/Device;CF卡插槽;全功能JTAG接口等。

1 U-BOOT簡(jiǎn)介

  U-BOOT是由德國(guó)的工程師Wolfgang Denk從8XXROM代碼發(fā)展而來的,它支持很多處理器,比如PowerPC、ARM、MIPS和x86。目前,U-BOOT源代碼在sourceforge網(wǎng)站的社區(qū)服務(wù)器中,Internet上有一群自由開發(fā)人員對(duì)其進(jìn)行維護(hù)和開發(fā),它的項(xiàng)目主頁是http://sourceforge.net/projects/U-BOOT。U-BOOT的最新版本源代碼可以在Sourceforge的CVS服務(wù)器中匿名獲得。
#cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/U-BOOT login
#cvs -z6 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/U-BOOT  co -P modulename

1.1 U-BOOT源代碼目錄結(jié)構(gòu)

◆ board:和一些已有開發(fā)板有關(guān)的文件,比如Makefile和u-boot.lds等都和具體開發(fā)板的硬件和地址分配有關(guān)。
◆ common:與體系結(jié)構(gòu)無關(guān)的文件,實(shí)現(xiàn)各種命令的C文件。
◆ cpu:CPU相關(guān)文件,其中的子目錄都是以U-BOOT所支持的CPU為名,比如有子目錄arm926ejs、mips、mpc8260和nios等,每個(gè)特定的子目錄中都包括cpu.c和interrupt.c,start.S。其中cpu.c初始化CPU、設(shè)置指令Cache和數(shù)據(jù)Cache等;interrupt.c設(shè)置系統(tǒng)的各種中斷和異常,比如快速中斷、開關(guān)中斷、時(shí)鐘中斷、軟件中斷、預(yù)取中止和未定義指令等;start.S是U-BOOT啟動(dòng)時(shí)執(zhí)行的第一個(gè)文件,它主要是設(shè)置系統(tǒng)堆棧和工作方式,為進(jìn)入C程序奠定基礎(chǔ)。
◆ disk:disk驅(qū)動(dòng)的分區(qū)處理代碼。
◆ doc:文檔。
◆ drivers:通用設(shè)備驅(qū)動(dòng)程序,比如各種網(wǎng)卡、支持CFI的Flash、串口和USB總線等。
◆fs:支持文件系統(tǒng)的文件,U-BOOT現(xiàn)在支持cramfs、fat、fdos、jffs2和registerfs。
◆ include:頭文件,還有對(duì)各種硬件平臺(tái)支持的匯編文件,系統(tǒng)的配置文件和對(duì)文件系統(tǒng)支持的文件。
◆ net:與網(wǎng)絡(luò)有關(guān)的代碼,BOOTP協(xié)議、TFTP協(xié)議、RARP協(xié)議和NFS文件系統(tǒng)的實(shí)現(xiàn)。
◆ lib_arm:與ARM體系結(jié)構(gòu)相關(guān)的代碼。
◆ tools:創(chuàng)建S-Record格式文件 和U-BOOT images的工具。

1.2 U-BOOT的特點(diǎn)

  U-BOOT支持SCC/FEC以太網(wǎng)、OOTP/TFTP引導(dǎo)、IP和MAC的預(yù)置功能,這一點(diǎn)和其它BootLoader(如BLOB和RedBoot等)類似。但U-BOOT還具有一些特有的功能。

◆ 在線讀寫Flash、DOC、IDE、IIC、EEROM、RTC,其它的BootLoader根本不支持IDE和DOC的在線讀寫。
◆ 支持串行口kermit和S-record下載代碼,U-BOOT本身的工具可以把ELF32格式的可執(zhí)行文件轉(zhuǎn)換成為 S-record格式,直接從串口下載并執(zhí)行。
◆ 識(shí)別二進(jìn)制、ELF32、uImage格式的Image,對(duì)Linux引導(dǎo)有特別的支持。U-BOOT對(duì)Linux 內(nèi)核進(jìn)一步封裝為uImage。封裝如下:
#{CROSS_COMPILE}-objcopy -O binary -R.note -R.comment -S vmlinux  linux.bin 
#gzip -9 linux.bin
#tools/mkimage -A arm -O linux -T kernel -C gzip -a 0xc0008000 -e
0xc0008000 -n “Linux-2.4.20” -d linux.bin.gz /tftpboot/uImage
即在Linux內(nèi)核鏡像vmLinux前添加了一個(gè)特殊的頭,這個(gè)頭在include/image.h中定義,包括目標(biāo)操作系統(tǒng)的種類(比如Linux,VxWorks等)、目標(biāo)CPU的體系機(jī)構(gòu)(比如ARM、PowerPC等)、映像文件壓縮類型(比如gzip、bzip2等)、加載地址、入口地址、映像名稱和映像的生成時(shí)間。當(dāng)系統(tǒng)引導(dǎo)時(shí),U-BOOT會(huì)對(duì)這個(gè)文件頭進(jìn)行CRC校驗(yàn),如果正確,才會(huì)跳到內(nèi)核執(zhí)行。如下所示:
WT-ARM9# bootm 0xc1000000
## Checking Image at 0xc100000 ...
Image Name: Linux-2.4.20
Created: 2004-07-02 22:10:11 UTC
Image Type: ARM Linux Kernel Image (gzip compressed)
Data Size: 550196 Bytes = 537 kB = 0 MB
Load Address: 0xc0008000
Entry Point: 0xc0008000
Verifying Checksum ... OK
Uncompressing Kernel Image ……… OK
◆ 單任務(wù)軟件運(yùn)行環(huán)境。U-BOOT可以動(dòng)態(tài)加載和運(yùn)行獨(dú)立的應(yīng)用程序,這些獨(dú)立的應(yīng)用程序可以利用U-BOOT控制臺(tái)的I/O函數(shù)、內(nèi)存申請(qǐng)和中斷服務(wù)等。這些應(yīng)用程序還可以在沒有操作系統(tǒng)的情況下運(yùn)行,是測(cè)試硬件系統(tǒng)很好的工具。
◆ 監(jiān)控(minitor)命令集:讀寫I/O,內(nèi)存,寄存器、內(nèi)存、外設(shè)測(cè)試功能等 
◆ 腳本語言支持(類似BASH腳本)。利用U-BOOT中的autoscr命令,可以在U-BOOT中運(yùn)行“腳本”。首先在文本文件中輸入需要執(zhí)行的命令,然后用tools/mkimage封裝,然后下載到開發(fā)板上,用autoscr執(zhí)行就可以了。
① 編輯如下的腳本example.script。
echo
echo Network Configuration:
echo ----------------------
echo Target:
printenv ipaddr hostname
echo
echo Server:
printenv serverip rootpath
echo
② 用tools/mkimage對(duì)腳本進(jìn)行封裝。
# mkimage -A ARM -O linux -T script -C none -a 0 -e 0 -n "autoscr example script" -d example.script /tftpboot/example.img
Image Name: autoscr example script
Created: Wes Sep 8 01:15:02 2004
Image Type: ARM Linux Script (uncompressed)
Data Size: 157 Bytes = 0.15 kB = 0.00 MB
Load Address: 0x00000000
Entry Point: 0x00000000
Contents:
Image 0: 149 Bytes = 0 kB = 0 MB
③ 在U-BOOT中加載并執(zhí)行這個(gè)腳本。
WT-ARM9# tftp 100000 /tftpboot/example.img
ARP broadcast 1
TFTP from server 10.0.0.2; our IP address is 10.0.0.99
Filename ’/tftpboot/TQM860L/example.img’.
Load address: 0x100000
Loading: #
done
Bytes transferred = 221 (dd hex)
WT-ARM9# autoscr 100000
## Executing script at 00100000
Network Configuration:
----------------------
Target:
ipaddr=10.0.0.99
hostname=arm
Server:
serverip=10.0.0.2
rootpath=/nfsroot
WT-ARM9#
◆ 支持WatchDog、LCD logo和狀態(tài)指示功能等。如果系統(tǒng)支持splash screen,U-BOOT啟動(dòng)時(shí),會(huì)把這個(gè)圖像顯示到LCD上,給用戶更友好的感覺。
◆ 支持MTD和文件系統(tǒng)。U-BOOT作為一種強(qiáng)大的BootLoader,它不僅支持MTD,而且可以在MTD基礎(chǔ)上實(shí)現(xiàn)多種文件系統(tǒng),比如cramfs、fat和jffs2等。
◆ 支持中斷。由于傳統(tǒng)的BootLoader都分為stage1和stage2,所以在stage2中添加中斷處理服務(wù)十分困難,比如BLOB;而U-BOOT是把兩個(gè)部分放到了一起,所以添加中斷服務(wù)程序就很方便。
◆ 詳細(xì)的開發(fā)文檔。由于大多數(shù)BootLoader都是開源項(xiàng)目,所以文檔都不是很充分。U-BOOT的維護(hù)人員意識(shí)到了這個(gè)問題,充分記錄了開發(fā)文檔,所以它的移植要比BLOB等缺少文檔的BootLoader方便。

2 對(duì)U-BOOT-1.1.0的修改

  為了使U-BOOT-1.1.0支持新的開發(fā)板,一種簡(jiǎn)便的做法是在U-BOOT已經(jīng)支持的開發(fā)板中選擇一種接近的進(jìn)行修改。由于U-BOOT-1.10不支持ARM-922T內(nèi)核,所以選擇基于ARM-920T內(nèi)核的smdk2400為模板。相關(guān)的源代碼在board/smdk2400/下。

2.1 支持ARM-922T內(nèi)核的代碼修改

修改以下代碼,使U-BOOT支持arm-922t內(nèi)核。
① 在include/目錄下新建文件arm922t.h,內(nèi)容如下:
#ifndef __ARM922T_H__
#define __ARM922T_H__
#endif
② 在include/目錄下新建文件wt-arm9.h,該文件描述了ARM922T中Timer、UART等寄存器的結(jié)構(gòu)及若干宏定義。具體內(nèi)容要參考相關(guān)處理器手冊(cè)。
③ 在cpu/目錄下新建目錄arm922t,將目錄arm920t下的內(nèi)容復(fù)制后,參考手冊(cè)分別修改cpu.c、interrupts.c和serial.c,其它文件不修改。

2.2 開發(fā)板的支持

  建立自己開發(fā)板的目錄和相關(guān)文件。
① 在include/configs目錄中添加頭文件lh7a400.h。這個(gè)文件是lh7a400開發(fā)板的配置文件,它包括開發(fā)板的CPU、系統(tǒng)時(shí)鐘、RAM、Flash系統(tǒng)及其它相關(guān)的配置信息。其格式可參考include/configs/smdk2400.h。
② 在board/目錄下新建wt-arm9目錄,創(chuàng)建如下文件:flash.c、lhmemsetup.c、wt- arm9.c、Makefile和u-boot.lds。
◆ flash.c。U-BOOT 讀、寫和刪除Flash設(shè)備的源代碼文件。由于不同開發(fā)板中Flash存儲(chǔ)器的種類各不相同,所以,修改flash.c時(shí)需參考相應(yīng)的Flash芯片手冊(cè)。它包括如下幾個(gè)函數(shù):
unsigned long flash_init (void ),F(xiàn)lash初始化;
void flash_print_info (flash_info_t *info),打印Flash信息;
int flash_erase (flash_info_t *info, int s_first, int s_last),F(xiàn)lash擦除;
volatile static int write_dword (flash_info_t *info, ulong dest, ulong data),F(xiàn)lash寫入;
int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt),從內(nèi)存復(fù)制數(shù)據(jù)。
◆ lhmemsetup.c。初始化時(shí)鐘、SMC控制器和SDRAM控制器。
◆ wt-arm9.c。設(shè)置各種總線時(shí)鐘,打開數(shù)據(jù)Cache和指令Cache,并設(shè)置相關(guān)內(nèi)存參數(shù)。
◆ Makefile。直接拷貝board/smdk2400/Makefile,作如下修改:
OBJS := wt-arm9.o flash.o lhmemsetup.o
◆ u-boot.lds。設(shè)置U-BOOT中各個(gè)目標(biāo)文件的連接地址,直接拷貝 board/smdk2400/u-boot.lds,作如下修改:
.text
{
cpu/arm922t/start.o (.text)
*(.text)
}

2.3 添加網(wǎng)口設(shè)備控制程序

  在drivers/目錄中添加網(wǎng)口設(shè)備控制程序dm9000.c 和dm9000.h,其中dm9000.c 主要包括以下函數(shù):
int eth_init (bd_t *bd),初始化網(wǎng)絡(luò)設(shè)備;
void eth_halt (void),關(guān)閉網(wǎng)絡(luò)設(shè)備;
int eth_send (volatile void *packet,int len),發(fā)送數(shù)據(jù)包;
int eth_rx (void) 接收數(shù)據(jù)包。
用中斷方式處理數(shù)據(jù)包的收發(fā),因此還定義了另外兩個(gè)函數(shù):
void InitInterrupt (void) ,中斷初始化;
void dm9000_irq (void) ,中斷處理。
以上兩個(gè)函數(shù)在cpu/arm922t/interrupts.c中被調(diào)用,最后在drivers/Makefile中加入dm9000.o。

2.4 修改Makefile

  在u-boot-1.1.0/Makefile中加入
lh7a400_config : unconfig
@./mkconfig $(@:_config=) arm arm922t wt-arm9
其中“arm”是CPU的種類, arm922t 是ARM CPU對(duì)應(yīng)的代碼目錄,wt-arm9是自己開發(fā)板對(duì)應(yīng)的目錄。
交叉編譯器安裝在/opt/arm/3.3/bin/目錄下,所以把CROSS_COMPILE設(shè)置成相應(yīng)的路徑:
export CROSS_COMPILE = /opt/arm/3.3/bin/arm-elf-

2.5 生成目標(biāo)文件

   先運(yùn)行make clean,
[zeng@localhost u-boot-1.1.0]$make clean
然后運(yùn)行make lh7a400_config,
[zeng@localhost u-boot-1.1.0]$ make lh7a400_config
Configuring for lh7a400 board...
再運(yùn)行make,
[zeng@localhost u-boot-1.1.0]$make
之后會(huì)生成三個(gè)文件:
u-boot——ELF格式的文件,可以被大多數(shù)Debug程序識(shí)別;
u-boot.bin——二進(jìn)制bin文件,純粹的U-BOOT二進(jìn)制執(zhí)行代碼,不保存ELF格式和調(diào)試信息。這個(gè)文件一般用于燒錄到用戶開發(fā)板中;
u-boot.srec——Motorola S-Record格式,可以通過串行口下載到開發(fā)板中。

2.6 測(cè) 試

  通過JTAG口將u-boot.bin燒寫到Flash的零地址,復(fù)位后執(zhí)行u-boot。若運(yùn)行正常,會(huì)從串口返回如下信息:
U-Boot 1.1.0 (Aug 21 2004 ?18:44:37)
U-BooT code: C3F80000 -> C3FA51A0 BSS: -> C3FA96EC
IRQ Stack: c3f1ff7c
FIQ Stack: c3f1ef7c
RAM Configuration:
Bank #0: c0000000 8 MB
Bank #1: c1000000 8 MB
……
Flash: 32 MB
In: serial
Out: serial
Err: serial
WT-ARM9 #

  輸入help得到所有命令列表,help command 列出該命令的功能。緊接著測(cè)試Flash和網(wǎng)卡,如果都正常工作的話,表明移植U-BOOT的工作基本完成,可以接著調(diào)試內(nèi)核和文件系統(tǒng)。

結(jié) 語

  BootLoader是操作系統(tǒng)和硬件的樞紐,它為操作系統(tǒng)內(nèi)核的啟動(dòng)提供了必要的條件和參數(shù)。在移植過程中,開發(fā)人員除了要掌握BootLoader的結(jié)構(gòu)和工作流程外,還要對(duì)相關(guān)硬件有一定的了解。目前,筆者移植的U-BOOT已經(jīng)能夠穩(wěn)定地運(yùn)行在開發(fā)板上,而且可以通過Flash和網(wǎng)絡(luò)加載內(nèi)核和文件系統(tǒng),為后續(xù)開發(fā),特別是驅(qū)動(dòng)程序的開發(fā)奠定了良好的基礎(chǔ)。
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉