基于cortex-A8的Bootloader設計
隨著整個微電子行業(yè)日新月異的發(fā)展,ARM處理器已經(jīng)帶給了人們越來越多的驚喜。目前它憑借著自身高性能,低成本,低功耗等特點,已經(jīng)廣泛應用于消費電子、數(shù)字家電、及工業(yè)生產(chǎn)等領(lǐng)域中。ARM公司推出的新一代cortex系列產(chǎn)品為開發(fā)人員提供了更多不同層面的選擇。cortex-A8為cortex 系列中的“A”系,屬于ARMV7架構(gòu),主要面向搭載操作系統(tǒng)的,高性能的應用領(lǐng)域。Bootloader是系統(tǒng)上電后執(zhí)行的第一段代碼,其功能類似于電腦的BIOS。簡單來說,Bootloader主要的工作有兩點:其一是初始化底層硬件資源,為操作系統(tǒng)啟動提供必要的環(huán)境;其二是從存儲設備中讀取操作系統(tǒng)鏡像并啟動。但為了方便后期開發(fā),我們往往要為Bootloader添加其他的功能。如支持串口打印調(diào)試信息,支持nfs網(wǎng)絡下載,支持根文件系統(tǒng)燒寫等。本文以u-boot-2013.01為源碼包,設計和實現(xiàn)了一個基于s5pv210平臺的,功能齊全且高效穩(wěn)定的Bootloader。
本文引用地址:http://2s4d.com/article/201609/303830.htm1 硬件平臺
1.1 s5pv210簡介
s5pv210是三星公司推出的一款基于cortex-A8架構(gòu)的,高性能的應用處理器。該處理器支持ARM V7指令集,具有32位內(nèi)部總線結(jié)構(gòu),主頻最高可達1GHz。另外該處理器還支持掛接LPDDR1、LPDDR2和DDR2類型的RAM,F(xiàn)lash方面可選擇Nand Flash,Nor Flash等。不僅如此,該處理器還提供了包括串口、LCD、IIC、SPI、USB、HDMI等豐富的外部接口資源。目前s5pv210以其高效的性能和卓越的圖形處理能力已經(jīng)廣泛的應用于智能手機和平板電腦之中。
1.2 s5pv210的啟動方式
s5pv210支持多種啟動方式,下圖為s5pv210啟動的流程圖:
圖1 s5pv210的啟動流程
s5pv210 的啟動過程由BL0,BL1和BL2(BL為Bootloader的簡稱)三部分代碼實現(xiàn),其中BL0在出廠時已經(jīng)被固化到64KB的iROM中。 s5pv210上電后首先執(zhí)行BL0,該段代碼主要負責一些簡單的初始化工作,如關(guān)看門狗,初始化ICache等。然后BL0會根據(jù)硬件設置判斷為何種方式啟動,并將BL1從啟動設備(OneNand,Nand Flash,USB,UART,SD card等)拷貝到Internal SRAM的BL1區(qū)中。最后BL0會比較一個校驗值,如果相等則跳轉(zhuǎn)到BL1中繼續(xù)執(zhí)行,否則轉(zhuǎn)入其他啟動方式。該校驗值存在BL1的頭部中,其大小為 16字節(jié)。
開發(fā)人員一般會單獨編寫一個工具對BL1編譯出的二進制文件添加頭部。其校驗值(checksum)的計算方法如下:
...
a = Buf + SPL_HEADER_SIZE;
for(i = 0, checksum = 0; i IMG_SIZE - SPL_HEADER_SIZE; i++) {
checksum += (0x000000FF) *a++;
}
...
BL1的完整結(jié)構(gòu)如下:
由于BL1的大小被限制為16K,所以一般情況下BL1負責的工作也不多。BL1在被執(zhí)行后首先初始化系統(tǒng)時鐘、內(nèi)存、串口等。然后將BL2代碼拷貝到 Internal SRAM的BL2區(qū)中并跳轉(zhuǎn)執(zhí)行。實際上SRAM的BL2區(qū)的大小只有80K,但很多情況下BL2代碼的大小遠遠超過80K,所以將BL2代碼拷貝到 SRAM中意義不大。更好的做法是直接將BL2拷貝到容量更大的內(nèi)存中,不過在拷貝之前一定要先初始化好系統(tǒng)時鐘和內(nèi)存。
BL2是整個Bootloader的主體部分,因此它需要完成更多的初始化工作,例如初始化網(wǎng)卡,F(xiàn)lash等。之后BL2讀取操作系統(tǒng)鏡像到內(nèi)存中運行。我們一般把操作系統(tǒng)鏡像放到Flash上,也可以放到SD卡上,根據(jù)具體的開發(fā)平臺而定。
2 軟件平臺
2.1 U-Boot介紹
U-Boot(全稱Universal Boot Loader)是Bootloader的一種,其他常見的Bootloader還有RedBoot,vivi等。與之相比,U-Boot具有代碼開源,可靠性和擴展性較高等優(yōu)點。另外,對于類似于Nand Flash、Nor Flash、網(wǎng)卡、LCD等硬件資源的,U-Boot已經(jīng)抽象出與硬件平臺無關(guān)的代碼作為設備驅(qū)動源碼提供給開發(fā)者。對于與硬件平臺相關(guān)的代碼,U- Boot將其定義成宏,并保留到配置文件中。開發(fā)者往往只需要修改這些宏的值就能成功使用這些硬件資源,這讓我們的移植工作變得十分簡單。
2.2 U-Boot中幾個比較重要的源文件
U-Boot的源碼包包含有上千個源文件,但經(jīng)過分析之后,可以找出如下幾個比較重要的源文件(括號中為該源文件所在源碼包的位置)。
(1)start.S(archarmcpuarmv7start.S)
通過分析U-Boot的鏈接文件可以發(fā)現(xiàn),start.S是U-Boot上電后被執(zhí)行的第一個源文件。該源文件包括定義了異常向量入口,相關(guān)的全局變量,禁用L2緩存,關(guān)閉MMU等,之后跳轉(zhuǎn)到lowlevel_init()函數(shù)中繼續(xù)執(zhí)行。
(2)lowlevel_init.S(boardsamsungsmdkv210lowlevel_init.S)
該源文件同樣用匯編代碼編寫,其中只定義了一個函數(shù)lowlevel_init()。該函數(shù)實現(xiàn)對平臺硬件資源的一系列初始化過程,包括關(guān)看門狗,初始化系統(tǒng)時鐘,內(nèi)存和串口。
(3)mem_setup.S(boardsamsungsmdkv210)
該源文件包含對內(nèi)存進行初始化的匯編源碼。
(4)board.c(archarmlibboard.c)
該源文件是用C編寫的,主要實現(xiàn)了U-Boot第二階段啟動過程。包括初始化環(huán)境變量,串口控制臺,F(xiàn)lash和打印調(diào)試信息等,最后調(diào)用main_loop()函數(shù)。
(5)smdkv210.h(includeconfigsSmdkv210.h)
s5pv210平臺的配置文件,該源文件定義了一些與CPU或者外設相關(guān)的參數(shù),這些參數(shù)都是用宏來定義的。
2.3 U-Boot啟動的一般流程
2.3.1 第一階段初始化
U-Boot的啟動過程分為兩個階段,第一個階段主要由匯編代碼實現(xiàn),負責對CPU及底層硬件資源的初始化。第二階段用C實現(xiàn),負責使能Flash,網(wǎng)卡和引導操作系統(tǒng)等。其第一階段流程如下圖所示:
評論