基于cortex-A8的Bootloader設計
隨著整個微電子行業日新月異的發展,ARM處理器已經帶給了人們越來越多的驚喜。目前它憑借著自身高性能,低成本,低功耗等特點,已經廣泛應用于消費電子、數字家電、及工業生產等領域中。ARM公司推出的新一代cortex系列產品為開發人員提供了更多不同層面的選擇。cortex-A8為cortex 系列中的“A”系,屬于ARMV7架構,主要面向搭載操作系統的,高性能的應用領域。Bootloader是系統上電后執行的第一段代碼,其功能類似于電腦的BIOS。簡單來說,Bootloader主要的工作有兩點:其一是初始化底層硬件資源,為操作系統啟動提供必要的環境;其二是從存儲設備中讀取操作系統鏡像并啟動。但為了方便后期開發,我們往往要為Bootloader添加其他的功能。如支持串口打印調試信息,支持nfs網絡下載,支持根文件系統燒寫等。本文以u-boot-2013.01為源碼包,設計和實現了一個基于s5pv210平臺的,功能齊全且高效穩定的Bootloader。
本文引用地址:http://www.j9360.com/article/201609/303830.htm1 硬件平臺
1.1 s5pv210簡介
s5pv210是三星公司推出的一款基于cortex-A8架構的,高性能的應用處理器。該處理器支持ARM V7指令集,具有32位內部總線結構,主頻最高可達1GHz。另外該處理器還支持掛接LPDDR1、LPDDR2和DDR2類型的RAM,Flash方面可選擇Nand Flash,Nor Flash等。不僅如此,該處理器還提供了包括串口、LCD、IIC、SPI、USB、HDMI等豐富的外部接口資源。目前s5pv210以其高效的性能和卓越的圖形處理能力已經廣泛的應用于智能手機和平板電腦之中。
1.2 s5pv210的啟動方式
s5pv210支持多種啟動方式,下圖為s5pv210啟動的流程圖:

圖1 s5pv210的啟動流程
s5pv210 的啟動過程由BL0,BL1和BL2(BL為Bootloader的簡稱)三部分代碼實現,其中BL0在出廠時已經被固化到64KB的iROM中。 s5pv210上電后首先執行BL0,該段代碼主要負責一些簡單的初始化工作,如關看門狗,初始化ICache等。然后BL0會根據硬件設置判斷為何種方式啟動,并將BL1從啟動設備(OneNand,Nand Flash,USB,UART,SD card等)拷貝到Internal SRAM的BL1區中。最后BL0會比較一個校驗值,如果相等則跳轉到BL1中繼續執行,否則轉入其他啟動方式。該校驗值存在BL1的頭部中,其大小為 16字節。
開發人員一般會單獨編寫一個工具對BL1編譯出的二進制文件添加頭部。其校驗值(checksum)的計算方法如下:
...
a = Buf + SPL_HEADER_SIZE;
for(i = 0, checksum = 0; i IMG_SIZE - SPL_HEADER_SIZE; i++) {
checksum += (0x000000FF) *a++;
}
...
BL1的完整結構如下:

由于BL1的大小被限制為16K,所以一般情況下BL1負責的工作也不多。BL1在被執行后首先初始化系統時鐘、內存、串口等。然后將BL2代碼拷貝到 Internal SRAM的BL2區中并跳轉執行。實際上SRAM的BL2區的大小只有80K,但很多情況下BL2代碼的大小遠遠超過80K,所以將BL2代碼拷貝到 SRAM中意義不大。更好的做法是直接將BL2拷貝到容量更大的內存中,不過在拷貝之前一定要先初始化好系統時鐘和內存。
BL2是整個Bootloader的主體部分,因此它需要完成更多的初始化工作,例如初始化網卡,Flash等。之后BL2讀取操作系統鏡像到內存中運行。我們一般把操作系統鏡像放到Flash上,也可以放到SD卡上,根據具體的開發平臺而定。
2 軟件平臺
2.1 U-Boot介紹
U-Boot(全稱Universal Boot Loader)是Bootloader的一種,其他常見的Bootloader還有RedBoot,vivi等。與之相比,U-Boot具有代碼開源,可靠性和擴展性較高等優點。另外,對于類似于Nand Flash、Nor Flash、網卡、LCD等硬件資源的,U-Boot已經抽象出與硬件平臺無關的代碼作為設備驅動源碼提供給開發者。對于與硬件平臺相關的代碼,U- Boot將其定義成宏,并保留到配置文件中。開發者往往只需要修改這些宏的值就能成功使用這些硬件資源,這讓我們的移植工作變得十分簡單。
2.2 U-Boot中幾個比較重要的源文件
U-Boot的源碼包包含有上千個源文件,但經過分析之后,可以找出如下幾個比較重要的源文件(括號中為該源文件所在源碼包的位置)。
(1)start.S(archarmcpuarmv7start.S)
通過分析U-Boot的鏈接文件可以發現,start.S是U-Boot上電后被執行的第一個源文件。該源文件包括定義了異常向量入口,相關的全局變量,禁用L2緩存,關閉MMU等,之后跳轉到lowlevel_init()函數中繼續執行。
(2)lowlevel_init.S(boardsamsungsmdkv210lowlevel_init.S)
該源文件同樣用匯編代碼編寫,其中只定義了一個函數lowlevel_init()。該函數實現對平臺硬件資源的一系列初始化過程,包括關看門狗,初始化系統時鐘,內存和串口。
(3)mem_setup.S(boardsamsungsmdkv210)
該源文件包含對內存進行初始化的匯編源碼。
(4)board.c(archarmlibboard.c)
該源文件是用C編寫的,主要實現了U-Boot第二階段啟動過程。包括初始化環境變量,串口控制臺,Flash和打印調試信息等,最后調用main_loop()函數。
(5)smdkv210.h(includeconfigsSmdkv210.h)
s5pv210平臺的配置文件,該源文件定義了一些與CPU或者外設相關的參數,這些參數都是用宏來定義的。
2.3 U-Boot啟動的一般流程
2.3.1 第一階段初始化
U-Boot的啟動過程分為兩個階段,第一個階段主要由匯編代碼實現,負責對CPU及底層硬件資源的初始化。第二階段用C實現,負責使能Flash,網卡和引導操作系統等。其第一階段流程如下圖所示:
評論