U-boot在S3C44B0上的移植與分析
摘 要:Bootloader是嵌入式系統(tǒng)軟件開發(fā)的第一個(gè)環(huán)節(jié),用于初始化目標(biāo)板硬件,給嵌入式操作系統(tǒng)提供板上硬件資 源信息,并進(jìn)一步裝載、引導(dǎo)嵌入式系統(tǒng)的固件,其性能直接影響系統(tǒng)的穩(wěn)定性。為了引導(dǎo)嵌入式操作系統(tǒng),根據(jù)S3C44BO 開發(fā)板上特定的硬件信息,在不改變Bootloader架構(gòu)的前提下,對(duì)與硬件相關(guān)的代碼,特別是FLASH芯片Intel 28F320C3B 代碼進(jìn)行了添加修改,將U-bOOt成功地移植到了開發(fā)板上,并在基于μCLinux的智能機(jī)器人避障系統(tǒng)中使用良好。
關(guān)鍵詞:Bootloader;U-boot;S3C44BO;移植
O 引 言
Bootloader是操作系統(tǒng)啟動(dòng)運(yùn)行之前執(zhí)行的一段小程序。它是基于特定硬件平臺(tái)實(shí)現(xiàn)的,通過它可以初始化硬件設(shè)備,建立內(nèi)存空間的映射表,從而建立適當(dāng)?shù)南到y(tǒng)軟硬件環(huán)境,為最終調(diào)用操作系統(tǒng)內(nèi)核作好準(zhǔn)備。嵌入式系統(tǒng)的硬件部分不可能完全一致,由于嵌入式系統(tǒng)需要硬件與軟件的配合才能正常工作,因此需要針對(duì)硬件系統(tǒng)進(jìn)行有關(guān)引導(dǎo)程序的設(shè)計(jì)。對(duì)于嵌入式系統(tǒng)來說,引導(dǎo)程序比較復(fù)雜,一般采用在基本符合硬件體系要求的現(xiàn)有引導(dǎo)程序的基礎(chǔ)上進(jìn)行修改,然后通過應(yīng)用的方法設(shè)計(jì)引導(dǎo)程序,這就是引導(dǎo)程序的移植。
1 U-boot介紹
U—boot(Universal Boot LoadeI)源自DENX軟 件工程中心的Wolfgang Denk,基于8xxrom的源碼創(chuàng) 建的PPCBoot工程,遵循GPL條款的開放源碼項(xiàng)目,已經(jīng)可以支持PowerPC,ARM,X86,MIPS等體系結(jié)構(gòu)上的上百種開發(fā)板。U-boot提供:?jiǎn)?dòng)加載(Boot
Loading)和下載(Down Loading)兩種操作模式。并具 有大型Bootloader的全部功能。主要特性有:SCC/ FEC以太網(wǎng)支持;BOOTP/TFTP引導(dǎo)——IP,MAC 預(yù)置功能;在線讀寫FLASH,DOC,IDE,I2C,E2ROM, RTC;支持串行口kermit,S-record下載代碼;識(shí)別二進(jìn)制、ELF32,pImage格式的Image;對(duì)Linux引導(dǎo)有特別的支持;監(jiān)控(minitor)命令集;具有讀寫I/O、內(nèi)存、寄存器、外設(shè)測(cè)試等功能。
U-boot還支持多種文件系統(tǒng),如cramfs,ext2, fat,reiserfs和jffs2等;支持多種嵌入式操作系統(tǒng)內(nèi)核,如Linux,NetBSD,VxWorks,QNX,RTEMS,ARTOS 和LynxOS等,并對(duì)Linux引導(dǎo)有特別的支持。另外, U-boot還提供單任務(wù)軟件運(yùn)行環(huán)境,可以在沒有操作系統(tǒng)的情況下動(dòng)態(tài)加載和運(yùn)行獨(dú)立的應(yīng)用程序,這些獨(dú)立的應(yīng)用程序可以利用U-boot提供控制臺(tái)的I/O函數(shù)、內(nèi)存申請(qǐng)和中斷服務(wù)等。
2 U-boot啟動(dòng)流程
對(duì)ARM7核處理器,U-boot.啟動(dòng)流程主要體現(xiàn)在 3個(gè)文件上,即start.s,lib arm/board.c和U-boot/common/main.c。下面詳細(xì)分析啟動(dòng)流程。
2.1 start.s文件
start.s文件主要是CPU的初始化,用匯編語(yǔ)言編寫,其主要代碼流程如下:
(1)定義入口。由于一個(gè)可執(zhí)行的Image必須有一個(gè)入口點(diǎn),并且只能有一個(gè)全局入口,通常這個(gè)入口放在ROM(FLASH)的Ox0地址,在start.s文件中有如下語(yǔ)句:
.globl_start
_start:
因此,必須通知編譯器使其知道這個(gè)入口.該工作可通過修改連接器腳本文件U-boot.1ds來完成。
(2)設(shè)置異常向量(Exception Vector)。異常中斷向量表是U-boot與操作系統(tǒng)內(nèi)核發(fā)生聯(lián)系的關(guān)鍵所在之一。即使操作系統(tǒng)內(nèi)核已經(jīng)得到處理器的控制權(quán)運(yùn)行,一旦發(fā)生中斷,處理器還是會(huì)自動(dòng)跳轉(zhuǎn)到從OxO地址開始的異常中斷向量表中的某個(gè)位置(依據(jù)于中斷類型)讀取指令運(yùn)行的。
(3)設(shè)置CPU的速度、時(shí)鐘頻率及中斷控制寄存器。依次為關(guān)閉看門狗計(jì)時(shí)器,屏蔽所有中斷,配置時(shí)鐘(包括3個(gè)寄存器:PLLCON,CLKCON,LOCK-TIME)。
(4)初始化內(nèi)存控制器。內(nèi)存控制器初始化主要通過設(shè)置13個(gè)從1c80000開始的特殊功能寄存器來完成,包括外部數(shù)據(jù)總線寬度、訪問周期、定時(shí)的控制信號(hào)等。
(5)將ROM中的程序復(fù)制到RAM中。首先利用PC取得BootLoader在FIASH的起始地址,再通過標(biāo)號(hào)之差計(jì)算出這個(gè)程序代碼的大小。通過寄存器(r3~r10)為復(fù)制的中間媒介將代碼復(fù)制到RAM中。
(6)初始化堆棧。進(jìn)入各種模式設(shè)置相應(yīng)模式的堆棧。
(7)轉(zhuǎn)到RAM中執(zhí)行。該工作可使用指令1dr pc來完成,即Idr pc,start armboot。[!--empirenews.page--]
2.2 lib_arm/board.c文件()
U—b00t/Lib arm/board.c中的start armboot是C語(yǔ)言開始的函數(shù),也是整個(gè)啟動(dòng)代碼中C語(yǔ)言的主函數(shù),該函數(shù)主要是調(diào)用一一系列的初始化函數(shù)。進(jìn)行各種初始化設(shè)置。該函數(shù)完成的操作是:
(1)調(diào)用一系列的初始化函數(shù),包括:cpu init(CPU相關(guān)的設(shè)置),board init(板子相關(guān)的設(shè)置),in-terrupt_init(中斷設(shè)置),env_init(環(huán)境變量設(shè)置),init_ baudrate(baud參數(shù)設(shè)置),serial init(串口初始化),console_inh_f(控制臺(tái)設(shè)置),display_banner(顯示標(biāo)題),dram init(可用內(nèi)存配置);
(2)初始化FLAsH設(shè)備;
(3)初始化系統(tǒng)內(nèi)存分配函數(shù);
(4)如果目標(biāo)系統(tǒng)擁有NAND設(shè)備,則初始化NAND設(shè)備;
(5)如果目標(biāo)系統(tǒng)有顯示設(shè)備,則初始化該類設(shè)備;
(6)初始化相關(guān)網(wǎng)絡(luò)設(shè)備,填寫IP、MAC地址等。
2.3 U—boot/common/main.c文件
完成上述初始化后,進(jìn)入命令循環(huán)(即整個(gè)boot的工作循環(huán)),代碼為:
for(;;)
{
main_loop();
}
3 移植過程
在此使用的是創(chuàng)維特公司的EB44BO開發(fā)板,系統(tǒng)相關(guān)配置如下:
處理器:SamslJng S3C4BOX,工作頻率60 MHz;
2個(gè)串口。4個(gè)可編程的LED以及14針JTAG接口。
為了降低移植的難度,在移植過程中,一般都是選擇與目標(biāo)處理器以及目標(biāo)板最接近的一個(gè)版本進(jìn)行移植。因此選擇B2進(jìn)行移植。從U—bo()t的官方網(wǎng)站上下載最新版的源代碼,目前最高版本為1.3.3。移植主要修改的文件有:cptl/s3c44b0/start.s,board/dave/b2/lowlevel init.s,board/dave/b2/b2.c,board/dave/corn。mon/FLASH.c,include/configs/b2.h,board/dave/b2/config.mk。
3.1 cpu/s3c44b0/start.s文件
start.s是匯編語(yǔ)言編寫的U-boot:程序入口代碼,主要包括處理器內(nèi)部各個(gè)寄存器的初始化以及代碼的搬移。主要完成設(shè)置處理器狀態(tài)、初始化中斷、堆棧、內(nèi)存控制器等,并確定是否需要對(duì)整個(gè)U-boot代碼重定位,最終從FLASH中跳轉(zhuǎn)到定位好的內(nèi)存位置執(zhí)行。下面對(duì)其中一些代碼進(jìn)行針對(duì)性的分析。
(1)設(shè)置WTCON=0x0,禁止看門狗定時(shí)器,避免處理器強(qiáng)行復(fù)位;
(2)設(shè)置INTMSK=Ox7ffffff,禁止所有中斷,Bootloader的執(zhí)行過程中不必要響應(yīng)任何中斷;
(3)根據(jù)嵌入式微處理器工作主頻,修改宏CON-FIG 83C4480 CLCICK SPEED=60 MHz,使處理器能夠正常工作;
(4)設(shè)置PLLCON=0x34031,PLLCON鎖相環(huán)控制寄存器中儲(chǔ)存有計(jì)算系統(tǒng)時(shí)鐘的相關(guān)參數(shù),為了產(chǎn)生正確的系統(tǒng)時(shí)鐘,必須根據(jù)外接晶振頻率和處理器工作主頻確定各個(gè)倍頻系數(shù)。
3.2 board/dave/b2/lowlevel init.S文件
該文件由匯編代碼完成,主要包括SDRAM工作參數(shù)的設(shè)置,以及處理器內(nèi)存控制器的初始化,參數(shù)需要根據(jù)SDRAM芯片資料進(jìn)行設(shè)置。
3.3 board/dave/b2/b2.c文件
該文件中的代碼主要是SDRAM的驅(qū)動(dòng)程序,并完成了處理器各個(gè)I/O 口的初始化,根據(jù)具體的目標(biāo)板進(jìn)行適當(dāng)?shù)男薷募纯伞?br />3.4 board/dave/common/FLASH.C
這個(gè)文件是FLASH的驅(qū)動(dòng)程序。FLASH存儲(chǔ)器的燒寫與擦除一般不具有通用性,根據(jù)不同型號(hào)的存儲(chǔ)器做出相應(yīng)的修改。EB4480開發(fā)板采用的是Intel28F320C3B,總共71個(gè)塊,1~8每塊大小是8 KB,9~71每塊大小是64 KB,它的特殊性決定了需要對(duì)
[!--empirenews.page--]
3.5 include/configs/b2.h文件
該文件中包含了B2目標(biāo)板的一些配置的宏定義,主要有系統(tǒng)工作頻率、環(huán)境變量緩沖區(qū)長(zhǎng)度、串口波特率、FLASH起始地址及容量、DRAM起始地址及容量、環(huán)境變量保存位置、FLASH讀/寫命令字、網(wǎng)絡(luò)芯片的基地址、目標(biāo)板IP地址、硬件地址MAC、主機(jī)IP地址、內(nèi)核裝載地址、交互操作命令等。
3.6 board/dave/b2/config.mk文件
U-boot將其代碼從FLASH復(fù)制到SDRAM的位置在0x0c700000處,修改TEXT_BASE=0x0c700000。
U-boot是在Linux環(huán)境下開發(fā)的,因此需要在Linux下進(jìn)行編譯,使用的操作系統(tǒng)為Fedora core 7,從http://opensrc.see.samsung.corn/download/arm-elf-tools-20040427.sh下載arm-elf=tools=20040427.sh,使用的編譯器為arm-elf-gcc,在U-boot根目錄下對(duì)其中的makefile文件進(jìn)行相應(yīng)的修改,然后在命令行中運(yùn)行以下指令:
編譯連接后生成U_boot,U_boot.bin,U_boot.
srec,其中的U_boot.bin是二進(jìn)制bin文件,純粹的U_boot二進(jìn)制執(zhí)行代碼,不保存ELF格式和調(diào)試信息,這個(gè)文件用于燒寫到用戶的開發(fā)板中。通過創(chuàng)維特集成開發(fā)環(huán)境自帶的FLASH燒寫工具載人到SDRAM中運(yùn)行,從超級(jí)終端顯示U-boot的啟動(dòng)信息,分別試驗(yàn)erase,cp,printenv,saveenv等命令,并檢測(cè)對(duì)FLASH的操作;使用tftp命令,以檢測(cè)網(wǎng)口下載功能,然后裝載操作系統(tǒng)內(nèi)核,完成以上任務(wù)則移植成功。經(jīng)過以上步驟移植的U-boot已經(jīng)在自己開發(fā)的ARM板上順利地引導(dǎo)了μClinux操作系統(tǒng)。
4 結(jié) 語(yǔ)
Bootloader是連接系統(tǒng)硬件和操作系統(tǒng)的橋梁,這里根據(jù)U-boot的運(yùn)行機(jī)制,在硬件資源固定,不改變Bootloader框架的前提下,對(duì)與目標(biāo)板硬件相關(guān)的代碼,特別是FLASH芯片Intel 28F320C3B的代碼進(jìn)行修改,成功移植到EB4480開發(fā)板上,并且結(jié)合U-boot和μClinux的啟動(dòng)流程與運(yùn)行機(jī)制,成功設(shè)計(jì)并實(shí)現(xiàn)了在基于S3C44BOX目標(biāo)板上引導(dǎo)嵌入式操作系統(tǒng)。在移植過程中,要熟悉U-boot的組織結(jié)構(gòu)和工作流程,對(duì)相關(guān)的硬件資源有一定的了解,根據(jù)實(shí)際情況進(jìn)行裁減,靈活選用功能模塊。目前,移植后的U-boot能夠穩(wěn)定地運(yùn)行在嵌入式目標(biāo)板上,并能順利地引導(dǎo)嵌入式μCinux系統(tǒng),已成功應(yīng)用在智能機(jī)器人的避障系統(tǒng)中。