Bootloader在AT91RM9200系統(tǒng)中的實(shí)現(xiàn)
基于ARM920T核的AT91RM9200芯片以其豐富的內(nèi)部外設(shè),高達(dá)200MIPS的處理速度,以及它溫度范圍寬的特點(diǎn),在工業(yè)控制領(lǐng)域嵌入式開(kāi)發(fā)中大有應(yīng)用的空間。Bootloader是用來(lái)引導(dǎo)操作系統(tǒng)的引導(dǎo)裝載程序,用來(lái)初始化硬件設(shè)備、確立內(nèi)存空間的映射,為最終引導(dǎo)操作系統(tǒng)內(nèi)核提供一個(gè)合適的軟硬件環(huán)境。它嚴(yán)重地依賴(lài)硬件環(huán)境,往往因使用的芯片、外部設(shè)備、操作系統(tǒng)的內(nèi)核配置而不同,它的實(shí)現(xiàn)是嵌入式開(kāi)發(fā)中必不可少的環(huán)節(jié)。
實(shí)現(xiàn)適合本系統(tǒng)的引導(dǎo)程序方法有兩種:一是自行開(kāi)發(fā)的bootloader,其特點(diǎn)是可以使這個(gè)程序在滿(mǎn)足要求的基礎(chǔ)上占用盡量的小的空間,但是工作量較大,開(kāi)發(fā)周期延長(zhǎng),除了一些特殊要求的情況,工程開(kāi)發(fā)中一般不會(huì)自行編寫(xiě);二是使用已有的代碼進(jìn)行移植,特點(diǎn)是工作量小,有vivi、U- boot、Blob等很多開(kāi)源的bootloader可用,這些程序支持的PowerPC,ARM,MIPS等多種平臺(tái),開(kāi)發(fā)者只需做相對(duì)較少的移植工作就可以,出于工程開(kāi)發(fā)角度,往往采取這種方式。
筆者開(kāi)發(fā)了基于AT91RM9200的雷達(dá)監(jiān)控分機(jī)測(cè)試板,本文將以此嵌入式板為例,介紹用GNU工具開(kāi)發(fā)ARM程序的方法,探討如何利用這種方法編寫(xiě)自己的bootloader,并詳細(xì)地介紹了U-boot的移植步驟和要點(diǎn)。
1硬件特點(diǎn)
1.1AT91RM9200處理器啟動(dòng)特點(diǎn)
AT91系列處理器有片內(nèi)和片外兩種啟動(dòng)模式[1],支持地址的重映射,在ARM芯片中具有代表性。
AT91RM9200內(nèi)部集成有16K字節(jié)的SRAM和128K字節(jié)的ROM。若是BMS引腳為低電平則從NCS0所接的外部的Flash芯片啟動(dòng)。若BMS引腳為高電平則從內(nèi)部ROM啟動(dòng),ROM中固化了FirmWare,這段固化的程序先后自動(dòng)檢測(cè)SPI連接的DataFlash,TWI連接的EEPROM的,EBI連接的8位的并行Flash芯片是否有合法的程序,如果有則放入SRAM中執(zhí)行,如果沒(méi)有檢測(cè)到,便初始化調(diào)試串口和USB的設(shè)備端口,分別支持Xmodem和DFU協(xié)議的文件下載,可以將用戶(hù)傳送的文件放入內(nèi)部SRAM中[2]。
由于本芯片支持地址Remap(地址重映射),在下載完后將SRAM的地址由0x0020_0000重新映射到0x0000_0000,將內(nèi)部ROM地址由0x0000_0000映射到0x0010_0000,然后從地址0x0000_0000的內(nèi)部SRAM開(kāi)始執(zhí)行。
1.2 Bootloader的下載和燒寫(xiě)
很多ARM芯片同AT91系列芯片一樣,支持Remap,這就為使用串口下載程序和對(duì)Flash的燒寫(xiě)提供了方便。這種芯片在使用 bootloader之前一般需要兩個(gè)前期的引導(dǎo)程序。本系統(tǒng)中使用了loader.bin和boot.bin兩個(gè)程序:其中l(wèi)oader.bin運(yùn)行于內(nèi)部RAM,用來(lái)向SDRAM下載程序并運(yùn)行;boot.bin固化在flash的起始地址下(如圖1所示)用來(lái)解壓引導(dǎo)Flash中的U-boot程序。
設(shè)置跳線(xiàn),使系統(tǒng)上電后從內(nèi)部啟動(dòng),通過(guò)串口下載loader.bin程序,該程序的大小一定要小于16K字節(jié),即內(nèi)部SRAM的容量。如上文所述,下載后會(huì)運(yùn)行它,由這個(gè)程序負(fù)責(zé)通過(guò)Xmodem協(xié)議將u-boot.bin程序下載到SDRAM中并運(yùn)行,開(kāi)發(fā)者再通過(guò)U-boot的cp命令將 boot.bin和u-boot.bin的壓縮文件u-boot.gz燒寫(xiě)入Flash,下次從外部啟動(dòng)時(shí)就可以直接啟動(dòng)U-boot了。其中 boot.bin,實(shí)現(xiàn)將u-boot.gz的解壓裝入SDRAM并且執(zhí)行。
ATMEL公司提供了針對(duì)他們出的該款芯片開(kāi)發(fā)板的boot和loader的代碼,可以從網(wǎng)上下載到,開(kāi)發(fā)者可以對(duì)比一下參數(shù)設(shè)置,如果必要的話(huà)要對(duì)一些參數(shù)進(jìn)行修改。
下面是這兩個(gè)程序中比較關(guān)鍵的參數(shù)。loader當(dāng)中的關(guān)鍵參數(shù)是AT91C_UBOOT_BASE_ADDRESS,用Xmodem協(xié)議接收的文件將存放在這個(gè)地址下。它的宏定義在main.h中:
#define AT91C_UBOOT_BASE_ADDRESS 0x21F00000 。
Boot中的關(guān)鍵的參數(shù)是:
#define SRC 0x10010000
/*在flash中的u-boot.gz的地址*/
#define DST 0x21F00000
/*uboot.gz解壓后要copy到SDRAM中的地址*/
#define LEN 0x020000
/*解壓后的大小(字節(jié))*/
這些參數(shù)根據(jù)具體情況可能需要修改,特別是SRC要和U-boot中的相關(guān)設(shè)置一致,具體參數(shù)將在3中介紹。圖1是Flash存儲(chǔ)器的空間分配情況,分別列出了各個(gè)地址段的用途。
評(píng)論