基于PXA272的Bootloader的設計與實(shí)現
PC機中的引導程序一般由BIOS和位于MBR的OSBootloader(例如LILO或者GRUB)一起組成。然而在嵌入式系統中通常沒(méi)有像BIOS那樣的固件程序(有的嵌入式CPU有),因此整個(gè)系統的加載啟動(dòng)任務(wù)就完全由Bootloader來(lái)完成。但是隨著(zhù)嵌入式系統的發(fā)展,Bootloader已經(jīng)逐漸在基本功能的基礎上進(jìn)行了擴展,Bootloader可以更多地增加對具體系統的板級支持,即增加一些硬件模塊功能上的使用支持,以方便開(kāi)發(fā)人員進(jìn)行開(kāi)發(fā)和調試。編寫(xiě)BootLoader是開(kāi)發(fā)WinCE系統第一步,也是關(guān)鍵的一步。只有得到一個(gè)穩定工作的Loader程序,才能夠更進(jìn)一步開(kāi)發(fā)WinCE的BSP,直至最后整個(gè)系統的成功。
2硬件平臺結構
我們的硬件平臺采用PXA 272 作為處理器,工作頻率為512M HZ,內部集成了64 M bytes NOR Flash。Intel PXA27X處理器是Intel公司推出的32位,基于Xscale架構的高性能的嵌入式芯片?!?】硬件平臺結構中主要還包括了如下的主要器件:128 M SDRAM、AC97 codec、 LCD 控制器、IrDa芯片、藍牙UART、USB控制器。另外還集成了3.5吋、240×320 QVGA的TFT-LCD 觸摸屏、PCMCIA、SD/MMC等外設接口,WLAN模塊。
Intel的PXA 27X內部支持SD Host的控制模塊,有SD Host控制寄存器和可以用于SD Host控制器的IO引腳,可用編程的方法對其功能進(jìn)行選擇;但對于SD卡的檢測,寫(xiě)保護和插槽的電源使能
等功能沒(méi)有專(zhuān)門(mén)的引腳。在本文實(shí)現中,對于卡檢測、電源引腳,通過(guò)GPIO擴展來(lái)實(shí)現。和SD卡硬件相關(guān)的部分引腳定義如表1所示:【3】【4】
表1 PXA 272部分GPIO引腳功能定義
信號 | 方向 | Intel 272功能引腳 | 說(shuō)明 |
SD_nPWREN | 輸入 | SDPWEN/GPB2 | SD插槽電源使能信號線(xiàn) |
SD_DATA3 | 輸入/輸出 | SDDATA0/GPF5 | 4bit模式:DATA3 |
SD_DATA2 | 輸入/輸出 | SDDATA0/GPF4 | 4bit模式:DATA2 |
SD_DATA1 | 輸入/輸出 | SDDATA0/GPE5 | 4bit模式:DATA1 |
SD_DATA0 | 輸入/輸出 | SDDATA0/GPG2 | 4bit模式:DATA0 |
SD_CMD | 輸入/輸出 | SDCMD/GPG1 | SD命令線(xiàn) |
SD_CLK | 輸入 | SDCLK/GPF3 | SDIO/SD卡時(shí)鐘線(xiàn) |
SD_nCD | 輸出 | EINT23/GPF1 | SD卡檢測引腳 |
SD_WP | 輸出 | GPC3 | SD卡寫(xiě)保護引腳 |
一個(gè)嵌入式WinCE系統從軟件的角度看通??梢苑譃閮刹糠郑築ootloader 和 Wince嵌入式系統。從Bootloader和Wince嵌入式系統的關(guān)系看,Bootloader包含兩種不同的操作模式:“本地啟動(dòng)”模式和“下載啟動(dòng)”模式?!?】在本地啟動(dòng)模式下Bootloader從Flash上將Wince操作系統加載到RAM中運行。在下載啟動(dòng)模式下,目標機上的Bootloader將通過(guò)串口或者網(wǎng)絡(luò )連接或者USB等從主機下載操作系統文件,也可以直接從SD/MMC卡、CF卡上加載操作系統鏡像文件。在下載啟動(dòng)模式下,Bootloader通過(guò)串口給用戶(hù)提供簡(jiǎn)單的命令行接口。
3.1Bootloader的流程
當系統上電后,ARM CPU會(huì )從物理地址零處開(kāi)始執行第一條指令的執行,通常會(huì )在該地址處放置一條跳轉指令。在我們的硬件平臺中物理地址零是64M Flash的物理起始地址。這里值得需要說(shuō)明的是64M Flash 是固化在Intel PXA 272中的。所以我們的Bootloader燒入也必須從Flash的物理地址零開(kāi)始。Bootloader二進(jìn)制文件的最前面的4個(gè)字節就是一條跳轉指令。
接著(zhù)系統會(huì )跳轉到一段用ARM匯編編寫(xiě)的代碼中去執行。其作用是完成系統啟動(dòng)所必須的最小配置,例如配置cpu的工作頻率,配置GPIO,配置時(shí)鐘等。然后為我們處理器的工作模式設置棧指針。
接著(zhù)把Bootloader從Flash搬運到SDRAM中,配置MMU,創(chuàng )建頁(yè)表,使能MMU,然后把自己后半部重定位到SDRAM中去執行。在后半部的執行中會(huì )根據用戶(hù)做的動(dòng)作(是否按住一個(gè)按鈕)來(lái)判斷是要本地啟動(dòng)還是下載啟動(dòng)。具體的流程圖如圖1所示。
當用戶(hù)選擇特定下載啟動(dòng)方式后,就進(jìn)入具體的下載流程。首先需要對用戶(hù)選定的介質(zhì)的硬件進(jìn)行必要的初始化。之前做的一些硬件的初始化是不夠的,因為沒(méi)必要在前面進(jìn)行全面的硬件初始化,現在要具體使用了就需要進(jìn)行具體的配置。
3.2軟件實(shí)現的關(guān)鍵
Bootloader是依賴(lài)于硬件而實(shí)現的,特別是在嵌入式系統中。不同的體系結構需求的Bootloader是不同的;除了體系結構,Bootloader還依賴(lài)于具體的嵌入式板級設備的配置。所以根據不同的板級配置需要修改相應的Bootloader?!?】我們使用的bootloader是Microsoft提供的和Wince配套的Eboot。下面幾點(diǎn)是在我們的硬件平臺上修改Eboot的關(guān)鍵。
3.2.1配置內存映射表
WinCE嵌入式系統通過(guò)定義OEMAddressTable來(lái)定義虛擬內存到物理內存的映射表.這個(gè)表在我們的實(shí)現中是bootloader和WinCE系統公用的?!?】當然這不是強制性的.我們需要根據硬件平臺的不同定制自己的映射表。在我們的設計中,這個(gè)表把4GB的物理空間映射到512M的內核虛擬空間。
表中的每一項由虛擬地址,物理地址,和映射的M數組成。其格式如下所示
OEMAddressTable
DCD SDRAM_BASE_C_VIRTUAL, SDRAM_BASE_PHYSICAL, 64
DCD SDRAM1_BASE_C_VIRTUAL, SDRAM1_BASE_PHYSICAL, 64
DCD IM_STORAGE_BASE_C_VIRTUAL, IM_STORAGE_BASE_PHYSICAL, 1
.....
DCD 0x00000000, 0x00000000, 0
第一項和第二項分別使64M的虛擬地址映射到64M物理地址,因為我們采用兩條64M的SDRAM。第二項使1M的內部?jì)却娴奶摂M地址映射到物理地址,因為我們使用1M大小的內部存儲。最后一項必須是零,因為建立頁(yè)表的時(shí)候程序通過(guò)它來(lái)判斷是否結束映射過(guò)程。在配置MMU的時(shí)候會(huì )使用這個(gè)表來(lái)完成虛擬地址到物理地址的映射的頁(yè)表的建立。
評論