U-boot在S3C44B0上的移植與分析
摘 要:Bootloader是嵌入式系統(tǒng)軟件開發(fā)的第一個環(huán)節(jié),用于初始化目標板硬件,給嵌入式操作系統(tǒng)提供板上硬件資 源信息,并進一步裝載、引導嵌入式系統(tǒng)的固件,其性能直接影響系統(tǒng)的穩(wěn)定性。為了引導嵌入式操作系統(tǒng),根據(jù)S3C44BO 開發(fā)板上特定的硬件信息,在不改變Bootloader架構(gòu)的前提下,對與硬件相關(guān)的代碼,特別是FLASH芯片Intel 28F320C3B 代碼進行了添加修改,將U-bOOt成功地移植到了開發(fā)板上,并在基于μCLinux的智能機器人避障系統(tǒng)中使用良好。
關(guān)鍵詞:Bootloader;U-boot;S3C44BO;移植
O 引 言
Bootloader是操作系統(tǒng)啟動運行之前執(zhí)行的一段小程序。它是基于特定硬件平臺實現(xiàn)的,通過它可以初始化硬件設備,建立內(nèi)存空間的映射表,從而建立適當?shù)南到y(tǒng)軟硬件環(huán)境,為最終調(diào)用操作系統(tǒng)內(nèi)核作好準備。嵌入式系統(tǒng)的硬件部分不可能完全一致,由于嵌入式系統(tǒng)需要硬件與軟件的配合才能正常工作,因此需要針對硬件系統(tǒng)進行有關(guān)引導程序的設計。對于嵌入式系統(tǒng)來說,引導程序比較復雜,一般采用在基本符合硬件體系要求的現(xiàn)有引導程序的基礎上進行修改,然后通過應用的方法設計引導程序,這就是引導程序的移植。
1 U-boot介紹
U―boot(Universal Boot LoadeI)源自DENX軟 件工程中心的Wolfgang Denk,基于8xxrom的源碼創(chuàng) 建的PPCBoot工程,遵循GPL條款的開放源碼項目,已經(jīng)可以支持PowerPC,ARM,X86,MIPS等體系結(jié)構(gòu)上的上百種開發(fā)板。U-boot提供:啟動加載(Boot
Loading)和下載(Down Loading)兩種操作模式。并具 有大型Bootloader的全部功能。主要特性有:SCC/ FEC以太網(wǎng)支持;BOOTP/TFTP引導――IP,MAC 預置功能;在線讀寫FLASH,DOC,IDE,I2C,E2ROM, RTC;支持串行口kermit,S-record下載代碼;識別二進制、ELF32,pImage格式的Image;對Linux引導有特別的支持;監(jiān)控(minitor)命令集;具有讀寫I/O、內(nèi)存、寄存器、外設測試等功能。
U-boot還支持多種文件系統(tǒng),如cramfs,ext2, fat,reiserfs和jffs2等;支持多種嵌入式操作系統(tǒng)內(nèi)核,如Linux,NetBSD,VxWorks,QNX,RTEMS,ARTOS 和LynxOS等,并對Linux引導有特別的支持。另外, U-boot還提供單任務軟件運行環(huán)境,可以在沒有操作系統(tǒng)的情況下動態(tài)加載和運行獨立的應用程序,這些獨立的應用程序可以利用U-boot提供控制臺的I/O函數(shù)、內(nèi)存申請和中斷服務等。
2 U-boot啟動流程
對ARM7核處理器,U-boot.啟動流程主要體現(xiàn)在 3個文件上,即start.s,lib arm/board.c和U-boot/common/main.c。下面詳細分析啟動流程。
2.1 start.s文件
start.s文件主要是CPU的初始化,用匯編語言編寫,其主要代碼流程如下:
(1)定義入口。由于一個可執(zhí)行的Image必須有一個入口點,并且只能有一個全局入口,通常這個入口放在ROM(FLASH)的Ox0地址,在start.s文件中有如下語句:
.globl_start
_start:
因此,必須通知編譯器使其知道這個入口.該工作可通過修改連接器腳本文件U-boot.1ds來完成。
(2)設置異常向量(Exception Vector)。異常中斷向量表是U-boot與操作系統(tǒng)內(nèi)核發(fā)生聯(lián)系的關(guān)鍵所在之一。即使操作系統(tǒng)內(nèi)核已經(jīng)得到處理器的控制權(quán)運行,一旦發(fā)生中斷,處理器還是會自動跳轉(zhuǎn)到從OxO地址開始的異常中斷向量表中的某個位置(依據(jù)于中斷類型)讀取指令運行的。
(3)設置CPU的速度、時鐘頻率及中斷控制寄存器。依次為關(guān)閉看門狗計時器,屏蔽所有中斷,配置時鐘(包括3個寄存器:PLLCON,CLKCON,LOCK-TIME)。
(4)初始化內(nèi)存控制器。內(nèi)存控制器初始化主要通過設置13個從1c80000開始的特殊功能寄存器來完成,包括外部數(shù)據(jù)總線寬度、訪問周期、定時的控制信號等。
(5)將ROM中的程序復制到RAM中。首先利用PC取得BootLoader在FIASH的起始地址,再通過標號之差計算出這個程序代碼的大小。通過寄存器(r3~r10)為復制的中間媒介將代碼復制到RAM中。
(6)初始化堆棧。進入各種模式設置相應模式的堆棧。
(7)轉(zhuǎn)到RAM中執(zhí)行。該工作可使用指令1dr pc來完成,即Idr pc,start armboot。
評論