摘 要:Bootloader是ARM嵌入式系統的重要組成部分。對于不同內核的系統板,其Bootloader也不盡相同,針對每個裸板都要對其燒寫針對自己的Bootloader。在此簡要介紹S3C2410及其兩種啟動方式,著重分析S3C2410從NAND FLASH啟動的過程中,對各個內部功能模塊進行的初始化過程,并設計出基于S3C2410嵌入式系統的Bootloader。通過在線仿真及實際測試表明,該Bootloader具有良好的穩定性、實時性和可移植性。
關鍵詞:ARM;Bootloader;嵌入式系統;啟動方式
中圖分類號:TP311文獻標識碼:B
文章編號:1004-373X(2010)02-044-03
Analysis and Design of Bootloader Based on ARM9
WANG Jingcun,GAO Feng
(College of Information Science and Engineering,Wuhan University of Science and Technology,Wuhan,430081,China)
Abstract:Bootloader is an important part of ARM embedded system.For different kernel system board,its Bootloader is also different.Each bare_board should programmer its own Bootloader.Therefore,the development of specific Bootloader is particularly important,the superiority of Bootloader directly affects on the performance of embedded systems.The S3C2410 and its two start_up mode are introduced,focusing on analysing the process during the S3C2410 starts from NAND FLASH,the initializing process of each internal modules.A Bootloader based on S3C2410 embedded system is designed.Through online simulation and practical tests show that the Bootloader has good stability,real_time performance and portability.
Keywords:ARM;Bootloader;embedded system;start_up mode
0 引 言
Bootloader是在嵌入式操作系統內核運行之前運行的一小段程序,它相當于PC機中的BIOS(Basic Input/Output System)。但在嵌入式系統中,出于對經濟性方面的考慮,一般不配置像BIOS那樣的固件程序,因此就需要自己完成這部分的工作,這就是所必需的開機程序。通過Bootloader這一程序,可以初始化硬件設備,建立系統的內存空間映射圖,從而將系統的軟、硬件環境設定在一個合適的狀態,以便為最終調用操作系統內核、運行用戶應用程序準備好正確的環境。
1 S3C2410開發板
該系統以S3C2410為開發版,S3C2410是三星公司的一款基于ARM920T內核的16/32位RISC嵌入式微處理器,主要面向手持設備以高性價比、低功耗的應用。運行頻率可達到203 MHz。其內部資源包括了LCD控制器、SDRAM控制器、NAND FLASH控制器、SD卡接口、USB Host和USB Device接口、IIS總線接口、SPI總線接口以及內部PLL時鐘倍頻器等[1]。
2 啟動方式
S3C2410支持從NOR FLASH啟動和從NAND FLASH啟動兩種方式。但比較而言,NAND FLASH具有容量大、比NOR FLASH價格低等特點。系統采用NAND FLASH與SDRAM組合,可以獲得非常高的性價比,應用面也較廣。故該系統采用從NAND FLASH啟動的方式[2]。
S3C2410具有四種啟動方式可以通過OM[1:0]管腳進行選擇,如表1所示。
表1 OM0,OM1管教邏輯組合的作用
OM1(操作模式1)OM0(操作模式0)導入ROM數據寬度OM1(操作模式1)OM0(操作模式0)導入ROM數據寬度
00NAND
FLASH Mode1032 b
0116 b11Test Mode
因此選擇將OM[1:0]管腳置為00,將引導代碼和操作系統鏡像存放在外部的NAND FLASH中,并從NAND FLASH啟動。為了支持從NAND FLASH啟動,S3C2410具備一個內部SRAM緩沖區,叫作“Steppingstone”。當處理器在這種啟動模式下復位時,內置的NAND FLASH將訪問控制接口,并將代碼自動加載到這個內部SRAM(此時該SRAM定位于起始地址空間0x00000000,容量為4 KB)上運行。之后,SRAM中的引導程序將操作系統內核加載到SDRAM中,使其在SDRAM中運行。啟動完畢后,4 KB的“Steppingstone”就可以用于其他用途。如果從其他方式啟動,啟動ROM就要定位于內存的起始地址空間0x00000000,處理器直接在ROM上運行啟動程序,而4 KB啟動SRAM被定位于內存地址的0x40000000處。
3 啟動流程及具體實現
3.1 啟動流程分析
Bootloader程序由匯編代碼和C代碼兩部分組成,執行過程也分為兩個階段。第一階段是匯編部分,這部分程序與硬件聯系密切且不便于移植,要完成的工作包括:設置中斷異常向量表、初始化看門狗等硬件設備、配置存儲器、設置堆棧等,然后跳轉到C語言程序的入口處。第二階段即C代碼部分,這部分的主要任務是:初始化本階段所需要的外部設備,配置SDRAM空間、調用NAND FLASH的API函數,并將用戶程序代碼從NAND FLASH存儲器中拷貝到SDRAM中,最后跳轉到用戶程序的入口處[3]。啟動流程如圖1所示。
圖1 S3C2410的啟動流程
3.2 Bootloader具體分析及實現
3.2.1 Bootloader的第一階段
(1) 設置中斷向量表
b ResetHandler;復位異常中斷,被定位在起始地址
b HandlerUndef;未定義指令中斷
b HandlerSWI ;軟件中斷服務
b HandlerPabort;指令預取異常中斷
b HandlerDabort;數據異常中斷
b.;保留
b HandlerFIQ;快速中斷服務程序
在ARM體系中,從地址0x0~0x1C的32 B是中斷異常向量表[4]。每個中斷占據向量表中4 B的存儲空間。一旦有異常中斷發生,ARM處理器便把PC指針強制置為向量表中對應中斷類型的地址值,使程序跳轉到相應的中斷處理程序處執行。當有多個中斷發生時,處理器優先處理優先級高的中斷[5]。當硬件系統啟動時,程序從0x0地址處跳轉到標號為ResetHandler的程序處,使CPU進入引導程序。
(2) 初始化看門狗和外圍電路。
主要實現S3C2410的看門狗、中斷、MPLL和UPLL配置寄存器的初始化[6]。根據工作頻率設置PLL寄存器,S3C2410的CPU默認的工作主頻為12 MHz,使用PLL電路可以產生更高的主頻供CPU及外圍器件使用。S3C2410有兩個PLL:MPLL和UPLL。其中UPLL用于USB設備,MPLL用于CPU及其他外圍器件[7]。
ldr r0,=WTCON ;關閉看門狗
ldr r1,=0x0
str r1,[r0]
ldr r0,=INTMSK
ldr r1,=0xffffffff;屏蔽所有中斷
str r1,[r0]
ldr r0,=INTSUBMSK
ldr r1,=0x7ff ;屏蔽所有子中斷
str r1,[r0]
;調節LOCKTIME寄存器,減少PLL鎖時間
ldr r0,=LOCKTIME
ldr r1,=0xffffff
str r1,[r0]
;配置MPLL控制寄存器
ldr r0,=MPLLCON
ldr r1,=((0x5c<<12)+(0x4<<4)+0x0);
Fin=12 MHz,Fout=200 MHz
str r1,[r0]
;配置UPLL控制寄存器
ldrr0,=UPLLCON
ldrr1,=((0x48<<12)+(0x3<<4)+0x2);
Fin=12 MHz,Fout=48 MHz
strr1,[r0]
(3) 配置存儲控制器,為BootLoader的第二個階段的代碼準備內存空間
addr0,pc,#SMRDATA _ (.+ 8)
ldr r1,=BWSCON;存儲控制寄存器地址
add r2,r0,#52;SMRDATA結束地址
0
ldr r3,[r0],#4
str r3,[r1],#4
cmp r2,r0
bne %B0
(4) 初始化堆棧
ldr sp,=SVCStack;初始化管理模式下的堆棧寄存器
(5) 初始化數據區。
ARM的數據由RO,RW,ZI三個段組成。其中,RO為代碼段,RW為已經初始化的全局變量,ZI是未初始化的全局變量[8]。RO部分可以在FLASH中執行,也可以轉移到RAM中執行,而RW和ZI必須在RAM中執行。數據區的初始化就是要把RW段從FLASH復制到RAM中,并將ZI段清零[9]。
ldr r0,=|ImageMYMMYMROMYMMYMLimit|;RO段的末地址
ldr r1,=|ImageMYMMYMRWMYMMYMBase|;RW段的起始地址
ldr r3,=|ImageMYMMYMZIMYMMYMBase|;Zero初始化區的起始地址
cmp r0,r1 ;檢查裝載地址和執行地址是否相同
beq %F2;相同則不拷貝
1
cmp r1,r3 ;執行拷貝操作
ldrcc r2,[r0],#4
strcc r2,[r1],#4
bcc %B1
2
ldr r1,=|ImageMYMMYMZIMYMMYMLimit|
mov r2,#0
3
cmp r3,r1 ;數據區清零
strcc r2,[r3],#4
bcc %B3
(6) 跳轉到第二個階段的C語言入口
b main
3.2.2 Bootloader的第二階段
這部分是main()函數的具體實現,其主要功能為初始化系統頻率、使能指令緩存、初始化串口、其他硬件的初始化以及加載操作系統內核[10]。main()函數的主要代碼如下:
MMU_EnableICache();//使能ICache(指令緩存)
ChangeClockDivider(1,1);//設置FCLK∶HCLK∶PCLK=1∶2∶4
ChangeMPllValue(0xal,0x3,0x1);//FCLK=202.8 MHz
Uart_Init();//初始化串口
NF_Init();//初始化NAND FLASH
…
Launch(JumpAddr);//加載操作系統內核
while (1);
4 結 語
這里給出的Bootloader已經順利通過了調試,可以正常加載操作系統。通過對S3C2410的Bootloader的分析可以看出,設計一個性能優良的Bootloader可以提高系統的穩定性及實時性,它是嵌入式開發中不可或缺的一部分。只有設計出一個穩定的Bootloader,才能進行下一步的系統開發工作,直至完成整個嵌入式系統的開發。
參考文獻
[1]Samsung公司.S3C2410X User′s Manual[EB/OL].http://www.samsungsemi.com,2003.
[2]馬忠梅.ARM嵌入式處理器結構與應用基礎[M].北京:北京航空航天大學出版社,2003.
[3]王田苗.嵌入式系統設計與實例開發[M].北京:清華大學出版社,2003.
[4]陳海軍,申衛昌,史穎.嵌入式系統引導程序詳探[J].計算機技術與發展,2006,16(1):123_125.
[5]田澤.嵌入式系統開發與應用[M].北京:北京航空航天大學出版社,2005.
[6]田澤.嵌入式系統開發與應用實驗教程[M].北京:北京航空航天大學出版社,2004.
[7]吳健,張華,胡天鏈.基于NAND FLASH存儲器的嵌入式系統啟動引導程序設計[J].西南科技大學學報,2006,21(4):54_57.
[8]黃智偉,鄧月明,王彥.ARM 9嵌入式系統設計基礎教程[M].北京:北京航空航天大學出版社,2008.
[9]王黎明,陳雙橋,閆曉玲,等.ARM 9嵌入式系統開發與實踐[M].北京:北京航空航天大學出版社,2008.
[10]郭志,江秀臣,曾奕.一個嵌入式系統的啟動分析[J].微計算機信息,2005,21(11):28_30.
作者簡介 王景存 男,1965年出生,碩士生導師。研究方向為嵌入式系統與應用。
高 峰 男,1985年出生,碩士研究生。研究方向為嵌入式系統與應用。