基于Mpc823e的bootloader分析和實現(xiàn)
步驟4:初始化cache
MPC823e采用Harvard結(jié)構(gòu)的cache,它的指令cahce和數(shù)據(jù)cache是獨立的;采用最近最少使用法(LRU Least Recently Used)替代算法。在具體編寫時,要注意只有在對MMU編程后cache才能工作,應(yīng)此要采用以下的步驟進行初始化(如圖2所示):
步驟5:初始化內(nèi)存管理單元 init_MMU
MPC823e的MMU的特點主要有:支持多種頁面大小、全相聯(lián)映像規(guī)則TLB(Translation Look-aside Buffer)、指令和數(shù)據(jù)TLB可獨立控制等。在編寫時,因為啟動程序中,不需要虛擬內(nèi)存到物理內(nèi)存的地址變換,所以只需對內(nèi)存屬性做一些設(shè)置,如回寫策略、內(nèi)存讀寫保護等
步驟6:設(shè)置中斷向量表 b vector_reloc
中斷向量表用于嵌入式Linux啟動代碼,在啟動過程中,最主要的就是設(shè)置復(fù)位中斷??梢栽贚ILO(Linux bootloader)中填寫0x100復(fù)位中斷向量。當(dāng)發(fā)生復(fù)位時,MPC823e自動讀取復(fù)位配置字,通過相應(yīng)的配置,MPC823e會讀取復(fù)位中斷向量0x100處的指令,進行正確引導(dǎo)過程。
步驟7:init_stack初始化堆棧 -> 初始化編譯相關(guān)寄存器
此外,在運行C語言編譯的程序前必須先定義這些與編譯相關(guān)的寄存器,如堆棧指針寄存器、代碼段、數(shù)據(jù)段指針寄存器等。Mpc823e針對不同的編譯器使用不一樣寄存器的規(guī)則,如diab編譯器和gcc編譯器,在編寫時,需要仔細(xì)查閱編譯器手冊。
2.2 ppcboot中主板部分的開發(fā)
ppcboot支持?jǐn)?shù)十種主板,可以在其中尋找與自己設(shè)計的主板相近的主板,并以其的ppcboot的主板代碼部分為模板,進行必要的修改來移植。本系統(tǒng)采用的主板HD823e與其中的RPXlite板十分相近,在其基礎(chǔ)上進行調(diào)整。接下來,將討論如何進行修改。
(1)在Makefile文件中,添加硬件基本配置信息,如cpu型號,主板類型,cpu體系
如本系統(tǒng)添加:
HD823e_config: unconfig
echo "ARCH = ppc" > config.mk ;
echo "BOARD = HD823e" >>config.mk ;
echo "CPU = mpc8xx" >>config.mk ;
echo "#include config_$(@:_config=).h>" >config.h
(2) 修改開發(fā)板的配置文件.包括 CPU,調(diào)試串口,內(nèi)存映射,F(xiàn)lash與SDRAM等多部分配置參數(shù)進行修改。以下給出部分重要的參數(shù)。
CPU部分配置:
#define CONFIG_MPC823 1 /* CPU類型 */
#define CFG_RTCSC (RTCSC_SEC | RTCSC_RTE) /*配置cpu內(nèi)部時鐘*/
#define CFG_PLPRCR ( (0x00900000) | PLPRCR_TEXPS )
#define CONFIG_8xx_GCLK_FREQ 50000000 /*設(shè)置CPU運行頻率*/
調(diào)試串口的部分配置:
#define CONFIG_BAUDRATE 9600 /* 串口波特率 = 9600bps */
#define CONFIG_8xx_CONS_SMC1 1 /* 串口使用 SMC1口 */
內(nèi)存映射的部分配置:
#define CFG_IMMR 0xFF000000 /* Internel Memory Mapped Register */
#define CFG_LOAD_ADDR 0x100000 /* ppcboot缺省的引導(dǎo)地址 */
由于篇幅的關(guān)系,其他部分參數(shù)不介紹了,可以根據(jù)CPU的使用手冊和ppcboot手冊進行配置,注意的是,這些參數(shù)都需要嚴(yán)格的確定,不能出錯,否則,無法正確引導(dǎo)系統(tǒng)。
(3) 修改 include /commproc.h
該文件包含與通信接口相關(guān)的一些參數(shù),由于本系統(tǒng)需要網(wǎng)絡(luò)來下載內(nèi)核,需要對網(wǎng)絡(luò)接口引腳進行相關(guān)的定義。
#ifdef CONFIG_HD823e
#define PROFF_ENET PROFF_SCC2 #define CPM_CR_ENET CPM_CR_CH_SCC2
#define SCC_ENET 1 #define PA_ENET_RXD 0x0004
#define PA_ENET_TXD 0x0008 #define PA_ENET_TCLK 0x0800
#define PA_ENET_RCLK 0x0200 #define PB_ENET_TENA 0x2000
#define PC_ENET_CLSN 0x0040 #define PC_ENET_RENA 0x0080
#define SICR_ENET_MASK 0xff00 #define SICR_ENET_CLKRT 0x2f00
#endif
2.3 編譯ppcboot
修改完成后,可以使用下列命令進行編譯,一般說來,都可以編譯成功,得到適合自己系統(tǒng)的ppcboot。本系統(tǒng),在原有RPXLite的模板基礎(chǔ)上,通過上修改,編譯成功,順利的引導(dǎo)了系統(tǒng)。
make clean
make HD823e_config
make all
3 結(jié)束語
本文根據(jù)所選用的嵌入式系統(tǒng)的特點,概述了ppcboot的啟動流程,對Mpc823e下的ppcboot體系進行了介紹,并針對自己的開發(fā)板,詳細(xì)的說明了如何開發(fā)適應(yīng)自己系統(tǒng)的ppcboot。代碼已通過了系統(tǒng)的調(diào)試,成功的引導(dǎo)了linux內(nèi)核,達到設(shè)計的目的。
本文作者的創(chuàng)新點是:在分析嵌入式系統(tǒng)在Linux下的引導(dǎo)程序工作流程和ppcboot源代碼基礎(chǔ)上,開發(fā)了特定的、適合本文系統(tǒng)硬件的引導(dǎo)程序。參考ppcboot中支持RPLite主板的相關(guān)代碼,給出了將ppcboot移植到本文所使用的HD823e主板的修改方案。
參考文獻
[1]周長春,王志言.PowerPC概念、體系結(jié)構(gòu)與設(shè)計[M].北京:電子工業(yè)出版社,1995.1-158.
[2]毛德操,胡希明. Linux內(nèi)核源代碼情景分析[M].杭州:浙江大學(xué)出版社,2001.663-737.
[3]王學(xué)龍. 嵌入式Linux系統(tǒng)設(shè)計與應(yīng)用[M].北京:清華大學(xué)出版社,2001.35-69.
[4]萬永波,張根寶.基于ARM的嵌入式系統(tǒng)Bootloader啟動流程分析 微計算機信息 2005.11-2
[5]motorola Inc.MPC823e User’S Manual[EB/OL].
評論