基于Mpc823e的bootloader分析和實現(xiàn)
0 引言
在嵌入式系統(tǒng)中,當(dāng)cpu啟動起來后,首先會在預(yù)先設(shè)置的地址上執(zhí)行引導(dǎo)程序,用來加載和啟動系統(tǒng)。通過引導(dǎo)程序,可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。引導(dǎo)程序與硬件緊密結(jié)合,不同處理芯片體系,不同主板設(shè)計,對應(yīng)不同的引導(dǎo)程序。本系統(tǒng)采用ppcboot作為引導(dǎo)程序。ppcboot的功能強大,而且代碼公開。一般來說,它可以分為兩部分:與硬件相關(guān)的代碼,與硬件無關(guān)的代碼。在設(shè)計時,可以先從其官方網(wǎng)站下載完整的代碼,然后根據(jù)自己系統(tǒng)的特點,對與硬件相關(guān)代碼部分進行修改,最后進行編譯,燒入 Flash。接下來,將對ppcboot的工作流程和具體的修改過程進行討論
1 ppcboot工作流程
作為ppc體系的引導(dǎo)程序ppcboot上電后,將完成初始化硬件設(shè)備,建立內(nèi)存映射, 啟動系統(tǒng)內(nèi)核三個任務(wù)。
初始化硬件設(shè)備:
系統(tǒng)上電復(fù)位后,CPU首先從Flash 的0x100處執(zhí)行第一條指令。該指令跳轉(zhuǎn)到具體地址后,開始執(zhí)行部分初始化和真正初始化前的準(zhǔn)備工作:屏蔽所有的中斷,設(shè)置CPU的速度和時鐘頻率,禁止cache、禁止地址轉(zhuǎn)換等等。
在這個階段中,執(zhí)行空間始終在Flash,功能通常都用匯編語言來實現(xiàn)。之后,系統(tǒng)開始建立內(nèi)存映射。
建立內(nèi)存映射:
(1)設(shè)置系統(tǒng)的內(nèi)存控制器的功能寄存器以及各內(nèi)存庫控制寄存器等,使CPU能夠正常運行起來并執(zhí)行C語言程序,并且為下一步加載引導(dǎo)程序,準(zhǔn)備RAM空間。
(2)引導(dǎo)程序重新定位執(zhí)行空間,ppcboot代碼從flash拷貝到內(nèi)存,開始在內(nèi)存中執(zhí)行。
(3)再次初始化部分硬件設(shè)備,并檢測系統(tǒng)內(nèi)存映射,知道 CPU 預(yù)留的全部 RAM 地址空間中的哪些被真正映射到 RAM 地址單元,哪些是處于無狀態(tài)的。經(jīng)過這個階段后,系統(tǒng)建立了內(nèi)存映射圖(見圖1),并開始在內(nèi)存里執(zhí)行程序,能夠執(zhí)行C語言程序。之后,系統(tǒng)進入啟動操作系統(tǒng)內(nèi)核階段。
啟動操作系統(tǒng)內(nèi)核
(1)把內(nèi)核映像和根文件系統(tǒng)映像從Flash上讀到RAM中。
(2) 為內(nèi)核設(shè)置啟動參數(shù)。以標(biāo)記列表的形式來傳遞。
(3)解壓內(nèi)核,初始化串口,使解壓后內(nèi)核獲得CPU的控制權(quán),結(jié)束ppcboot的任務(wù)。
2 基于MPC823e的ppcboot的具體編寫
在上面提過,由于ppcboot的代碼硬件無關(guān)部分是通用的,不需要修改。而硬件相關(guān)的代碼部分,與硬件緊密相關(guān),所以需要針對自己具體的硬件進行修改,主要是cpu部分與主板部分的代碼。
2.1 ppcboot中cpu部分的開發(fā)
ppcboot的一個任務(wù)是初始化CPU內(nèi)部寄存器,包括:定義中斷向量表、數(shù)據(jù)和指令cache的設(shè)置、內(nèi)存管理單元MMU的設(shè)置、系統(tǒng)接口單元SIU設(shè)置、內(nèi)存控制器和UPM表的設(shè)置、時鐘和復(fù)位寄存器設(shè)置、外部總線接口設(shè)置、與編譯器相關(guān)的堆棧設(shè)置等。
步驟1: 禁止 中斷 -> 禁止cache -> 禁止MMU
啟動過程中無法處理中斷,所以必須關(guān)閉中斷;另外,因內(nèi)存管理、cache尚未設(shè)置,所以應(yīng)先全部禁止,待設(shè)置完畢再打開。
步驟2: 初始化內(nèi)存 init_memc
MPC823e提供了強大的內(nèi)存接口控制單元,包括一個通用內(nèi)存接口單元GPCM和兩個用戶可編程內(nèi)存接口單元UPMA/UPMB。還提供了8個片選信號線與8片獨立的內(nèi)存接口。
編寫ppcboot時,需要研究SDRAM芯片的時序圖,構(gòu)造出MPC823e特有的64個時序字,填入MPC823e內(nèi)部相應(yīng)的寄存器中。以后,每當(dāng)發(fā)出內(nèi)存訪問的指令時,硬件就能夠根據(jù)設(shè)置好的64個時序字,產(chǎn)生正確的讀寫時序。而且要針對具體的設(shè)計,編寫片選內(nèi)存的寄存器BRx和ORx來設(shè)置其屬性,包括定義內(nèi)存片基地址、地址掩碼、讀寫屬性、總線寬度(8位、16位、32位)、控制單元(使用GPCM或UPM)等。如本系統(tǒng)中,使用了CS0 控制16位的Flash存儲器、CS1控制32位的sdram,對CS1進行設(shè)置時應(yīng)設(shè)為基地址0x00000000,32位可讀寫,使用UPMA。
步驟3:初始化系統(tǒng)接口單元init_SIU -> 初始化調(diào)試寄存器der -> 初始化時鐘 init_clk
系統(tǒng)接口單元主要包含對MPC823e復(fù)用引腳的設(shè)置寄存器、調(diào)試寄存器(該寄存器可用來設(shè)置CPU在各種不同的意外情況下是否進入調(diào)試狀態(tài))。
初始化時鐘主要是對CPU主頻的設(shè)置。MPC823e有一個倍頻率達(dá)數(shù)千倍的內(nèi)部倍頻器,本系統(tǒng)中,采用了5MHz的晶振,經(jīng)過10倍頻后穩(wěn)定運行在50MHz頻率上。
評論