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