文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2012)02-0014-04
Windows Embedded Compact 7(以下簡稱Compact 7)操作系統(tǒng)在訪問底層硬件時(shí),不直接訪問硬件,而是通過抽象出來的函數(shù)訪問。抽象出來的函數(shù)層,就是通常所說的板支持包BSP(Board Support Package)[1]。BSP介于底層硬件和操作系統(tǒng)之間,完成硬件初始化并將控制權(quán)切換給操作系統(tǒng)。由于嵌入式系統(tǒng)的底層硬件具有無標(biāo)準(zhǔn)、非規(guī)范等特性,操作系統(tǒng)都存在著BSP移植的問題,這就要求BSP開發(fā)人員在BSP開發(fā)過程中熟練掌握具體的硬件原理和軟件實(shí)現(xiàn)方法。
Compact 7與之前的Windows CE版本一樣,提供了一整套平臺(tái)開發(fā)工具Platform Builder,使開發(fā)人員能夠快速靈活地創(chuàng)建解決方案[2]。而且Platform Builder本身也提供了多種目標(biāo)板的BSP樣例,可以在開發(fā)移植BSP時(shí)作參考。
1 OMAP3530處理器
TI公司推出的OMAP3530是一款技術(shù)先進(jìn)的高性能嵌入式異構(gòu)雙核處理器,主要由一個(gè)600 MHz的CortexTM-A8 ARM核和一個(gè)430 MHz的DSP 核組成。嵌入式操作系統(tǒng)在ARM核上運(yùn)行,與數(shù)字信號(hào)處理相關(guān)的任務(wù)則由DSP核負(fù)責(zé)。盡管OMAP3530是一個(gè)異構(gòu)多核架構(gòu)的微處理器,但DSP核對(duì)于基于ARM核開發(fā)的工程師而言是透明的。在軟件工具鏈中,TI引入了DSP橋的概念。DSP橋是針對(duì)ARM應(yīng)用程序開發(fā)提供的一組面向DSP算法的應(yīng)用程序接口(API),以便應(yīng)用程序獲取DSP核的計(jì)算資源和數(shù)據(jù)資源。
2 Compact 7操作系統(tǒng)
Windows Embedded Compact 7是Windows CE 6.0的后續(xù)產(chǎn)品,它不僅是一個(gè)功能強(qiáng)大的實(shí)時(shí)操作系統(tǒng),而且還為開發(fā)者提供了全套開發(fā)工具。作為Windows CE家族的換代產(chǎn)品,Compact 7繼承了之前Windows CE系統(tǒng)的優(yōu)良傳統(tǒng),又在其上增加了對(duì)ARMv7構(gòu)架的支持;對(duì)Windows CE先前版本的強(qiáng)大功能進(jìn)行了進(jìn)一步的擴(kuò)充和豐富,如支持多點(diǎn)觸控、優(yōu)化電源管理等。
與Windows CE 6.0不同,Compact 7的平臺(tái)開發(fā)工具Platform Builder依托于Visual Studio 2008,內(nèi)嵌的Silverlight for Windows Embedded有利于減輕開發(fā)者開發(fā)界面的負(fù)擔(dān)。在軟件開發(fā)上,Compact 7徹底摒棄傳統(tǒng)的MFC程序框架,轉(zhuǎn)而全面支持.Net framework。高效的開發(fā)框架,將最大限度地提高開發(fā)者的工作效率,有助于提高產(chǎn)品的市場競爭力。
3 OMAP3530開發(fā)板硬件構(gòu)成
開發(fā)板硬件平臺(tái)主要以TI公司的OMAP3530雙核處理器為核心,配有256 MB SDRAM和512 MB Nand Flash用以啟動(dòng)系統(tǒng)和存儲(chǔ)運(yùn)行程序。同時(shí),還配有電源管理、USB、UART、以太網(wǎng)控制器、液晶屏等外圍電路?;贠MAP3530處理器開發(fā)板的硬件結(jié)構(gòu)框圖如圖1所示。
4 Compact 7操作系統(tǒng)下BSP開發(fā)與移植
Compact 7中BSP是由Boot Loader、OEM適配層、設(shè)備驅(qū)動(dòng)程序、內(nèi)核獨(dú)立傳輸層(KITL)以及鏡像配置文件五部分組成[3]。關(guān)于各部分之間的相互聯(lián)系以及與硬件平臺(tái)之間的關(guān)系如圖2所示。
4.1 Clone BSP
Compact 7提供了兩種方法開發(fā)BSP,一種是從零開始進(jìn)行BSP開發(fā)的方法,另一種是克隆已有的BSP再進(jìn)行移植的方法。Clone BSP實(shí)質(zhì)就是對(duì)現(xiàn)有的BSP進(jìn)行復(fù)制并按照開發(fā)者要求改變BSP的名稱等信息。Clone BSP保留了原有BSP的程序架構(gòu)和全部代碼,開發(fā)者只需對(duì)BSP中部分代碼進(jìn)行修改添加即可實(shí)現(xiàn)新開發(fā)板的功能,簡化了開發(fā)流程,提高了開發(fā)效率。考慮到從零開始開發(fā)BSP相當(dāng)困難,OMAP3530開發(fā)板的BSP開發(fā)就采用Clone相似平臺(tái)的BSP的方法進(jìn)行移植。這樣的實(shí)現(xiàn)方法可以大幅度降低開發(fā)BSP的難度并縮短開發(fā)周期。
具體方法是,在Platform Builder中使用其自帶的Clone BSP工具,克隆TI公司提供的OMAP3530樣例BSP,并自行定義名稱(如MyBSP),然后設(shè)置相關(guān)描述(如平臺(tái)目錄名稱、供應(yīng)商名稱以及版本號(hào)等信息)。如果設(shè)置信息合法,單擊Clone按鈕后會(huì)提示成功克隆BSP??寺〕龅腂SP位于%_WINCEROOT%\PLATFORM目錄下。
4.2 移植Boot Loader
BSP移植首先要實(shí)現(xiàn)Boot Loader的功能。Boot Loader是一段啟動(dòng)引導(dǎo)程序,主要在Compact 7系統(tǒng)加載前初始化相關(guān)硬件,并把系統(tǒng)鏡像加載到內(nèi)存中運(yùn)行。根據(jù)鏡像boot的方式,Boot Loader分為nboot、eboot和uboot等。
OMAP3530處理器內(nèi)嵌的RAM只有64 KB,對(duì)Boot Loader生成的可執(zhí)行文件而言過于小,無法將其加載到內(nèi)部RAM中,所以只能使用外部RAM進(jìn)行加載。但OMAP3530上電時(shí)不能自動(dòng)初始化memory controller,無法讀寫外部RAM。因此,需要一個(gè)程序負(fù)責(zé)初始化外部的RAM控制器,把可執(zhí)行文件從 Nand Flash或者SD卡中讀取到外部RAM中,然后跳轉(zhuǎn)到入口處執(zhí)行。實(shí)現(xiàn)這一功能的程序稱為x-Loader,x-Loader是Compact 7啟動(dòng)之后運(yùn)行的第一段程序,實(shí)質(zhì)上是一個(gè)精簡版的Boot Loader。x-Loader運(yùn)行的第一個(gè)函數(shù)是startup()函數(shù),startup()采用匯編語言編寫,首要功能是對(duì)目標(biāo)系統(tǒng)的CPU進(jìn)行最基本的初始化。例如,清空TLB和cache、關(guān)閉中斷、配置PLL、設(shè)置內(nèi)存控制器、設(shè)置跳轉(zhuǎn)到main的函數(shù)地址等。OMAP3530開發(fā)板上電后,CPU會(huì)自動(dòng)從Nand Flash或者SD卡中加載x-Loader到內(nèi)部RAM,然后執(zhí)行初始化任務(wù),最后將控制權(quán)交給Boot Loader。Startup()函數(shù)實(shí)現(xiàn)main函數(shù)跳轉(zhuǎn)地址代碼如下:
ldr sp, =( XLDR_STACK_PA+XLDR_STACK_SIZE)
b XLDRMain
其中,XLDR_STACK_PA和XLDR_STACK_ SIZE是任務(wù)堆棧起始地址和大小,系統(tǒng)通過使sp指針指向x-Loader中的任務(wù)堆棧起始地址的方法實(shí)現(xiàn)程序的跳轉(zhuǎn)。
x-Loader位于BSP目錄下的boot文件夾中,需要修改其中的platform.c和main.c兩個(gè)文件。platform.c的作用是對(duì)OMAP3530功能進(jìn)行設(shè)置,文件中包括PinMuxSetup()、GpioSetup()、ClockSetup()、MemorySetup()等幾個(gè)重要的函數(shù)。
PinMuxSetup()函數(shù)專門用于設(shè)置引腳功能,這樣做的好處是可以有統(tǒng)一的啟動(dòng)代碼并且不必?fù)?dān)心在啟動(dòng)過程中對(duì)復(fù)用引腳功能的再度修改。其實(shí)現(xiàn)樣例代碼如下:
OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D0,
(INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));
OUTREG16函數(shù)用于設(shè)置OMAP3530 中的16 bit寄存器,該函數(shù)通過CONTROL_PADCONF_SDRC_D0獲得處理器相應(yīng)管腳的寄存器地址;通過設(shè)置INPUT_ENABLE、PULL_INACTIVE等參數(shù)來實(shí)現(xiàn)對(duì)管腳屬性的定義;通過設(shè)置MUX_MODE_X的方法實(shí)現(xiàn)管腳功能的定義。具體MUX_MODE_X代表的功能定義,可參閱OMAP3530技術(shù)手冊(cè)。
MemorySetup()函數(shù)用于初始化通用存儲(chǔ)控制器(GPMC)和外部RAM(SDRC)。由于GPMC信號(hào)在Flash和以太網(wǎng)控制器上都用到。因此,在MemorySetup()函數(shù)中需要對(duì)GPMC片選信號(hào)進(jìn)行設(shè)置。實(shí)現(xiàn)樣例代碼如下:
OUTREG32(&pGpmc->GPMC_CONFIG1_3,
BSP_GPMC_LAN_CONFIG1);
OUTREG32函數(shù)用于設(shè)置OMAP3530 中的32 bit寄存器,通過GPMC_CONFIG獲得設(shè)置寄存器的地址;通過宏定義BSP_GPMC_LAN+CONFIG1設(shè)置具體數(shù)值。
main.c文件是x-Loader的主程序,在RELEASE模式下能夠生成MLO執(zhí)行文件,在DEBUG模式下編譯配置文件 sources 跳過了對(duì)其的編譯。因?yàn)閤-Loader對(duì)大小有要求, 若DEBUG 編譯文件過大,即使生成可執(zhí)行文件也無法加載到OMAP3530內(nèi)部RAM中。
x-Loader移植完成后,需要進(jìn)行Boot Loader的移植。為了與x-Loader一致,Boot Loader下執(zhí)行的第一個(gè)函數(shù)也是Startup()函數(shù)。Boot Loader下的Startup()函數(shù)同樣是采用匯編語言編寫的,主要完成靜態(tài)邏輯地址到物理地址的映射以及跳轉(zhuǎn)到BootloaderMain函數(shù)執(zhí)行的功能。
Boot Loader開發(fā)重點(diǎn)是實(shí)現(xiàn)OEMPlatformInit()函數(shù)用以硬件初始化,這個(gè)函數(shù)與硬件具有高度的相關(guān)性[4]??偟膩碚f,OEMPlatforminit()函數(shù)需要完成五項(xiàng)初始化任務(wù):首先是通過OEMEthGetSecs()函數(shù)初始化定時(shí)器,其次初始化Nand Flash存儲(chǔ)器,再次是復(fù)位外圍設(shè)備,然后初始化用于下載鏡像的以太網(wǎng)控制器,最后初始化操作系統(tǒng)的內(nèi)存空間。
為了使Boot Loader支持以太網(wǎng)下載方式,需要實(shí)現(xiàn)與以太網(wǎng)控制器相關(guān)的函數(shù)。開發(fā)板以太網(wǎng)控制器選用SMSC公司的Lan9220芯片。其具體的實(shí)現(xiàn)過程如下:
(1)在%_WINCEROOT\PLATFORM\MyBSP\SRC\BOOT\
EBOOT下添加Lan9220dbg.c。
(2)在Lan9220dbg.c文件中實(shí)現(xiàn)LAN9220_Init、LAN-
9220_SendFrame和LAN9220_GetFrame 3個(gè)函數(shù)。
(3)在%_WINCEROOT\PLATFORM\MyBSP\SRC\INC下的kitl_cfg.h文件中聲明上述3個(gè)函數(shù),并定義BSP_ETHDRV_LAN9220結(jié)構(gòu)體。結(jié)構(gòu)體定義如下:
#define BSP_ETHDRV_LAN9220 {
(OAL_KITLETH_INIT) LAN9220_Init, NULL, NULL,
(OAL_KITLETH_SEND_FRAME) LAN9220_SendFrame,
(OAL_KITLETH_GET_FRAME) LAN9220_GetFrame,
NULL, NULL, NULL, NULL, NULL, NULL }
(4)在%_WINCEROOT\PLATFORM\MyBSP\SRC\BOOT\
EBOOT下的boot_cfg.h文件中添加BSP_ETHDRV_LAN-
9220到g_bootDevices內(nèi)容中即可。
初始化傳輸端口通過修改OEMPreDownload()函數(shù)實(shí)現(xiàn),在OEMPreDownload函數(shù)中首先需要為硬件平臺(tái)指點(diǎn)一個(gè)靜態(tài)IP地址,其次通過設(shè)置g_bootCfg.kitlFlags變量來設(shè)置IP協(xié)議,然后將boot方式設(shè)置成以太網(wǎng)下載模式,最后調(diào)用OEMLaunch函數(shù)來下載鏡像。OEMLaunch函數(shù)的功能是下載鏡像,并將程序計(jì)數(shù)器的指針直接設(shè)置到操作系統(tǒng)鏡像的開始地址。它是啟動(dòng)操作系統(tǒng)前Boot Loader的最后一個(gè)函數(shù),沒有返回值。可以參考微軟提供的標(biāo)準(zhǔn)BSP中的代碼實(shí)現(xiàn)該函數(shù)。實(shí)現(xiàn)此函數(shù)后,Boot Loader的功能基本完成。
4.3 移植OEM適配層
OEM適配層OAL(OEM Adaptation Layer)邏輯上位于Compact 7內(nèi)核和硬件平臺(tái)之間。物理上可以生成可執(zhí)行文件(NK.EXE)。OAL的出現(xiàn)大大方便了操作系統(tǒng)和硬件平臺(tái)之間的通信。OAL還用來處理中斷、控制時(shí)鐘、管理電源、控制I/O接口等。
通常情況下,OAL創(chuàng)建的方法就是復(fù)制與自己開發(fā)平臺(tái)相近且已經(jīng)成功應(yīng)用的OAL文件,然后進(jìn)行適當(dāng)?shù)男薷?,OAL文件位于%_WINCEROOT\PLATFORM\MyBSP\SRC\OAL目錄下。移植過程中需要修改OEMInit函數(shù),該函數(shù)是在OEM適配層中初始化中斷、時(shí)鐘、KITL、計(jì)數(shù)器以及看門狗功能的。需要注意的是,如果要打開串口的debug功能,也要在OEMInit函數(shù)中進(jìn)行設(shè)置,將OEMDeinitDebugSerial()函數(shù)注釋掉。
4.4 開發(fā)設(shè)備驅(qū)動(dòng)程序
BSP驅(qū)動(dòng)程序?qū)儆趦?nèi)置驅(qū)動(dòng),與流驅(qū)動(dòng)不一樣的是,它不用設(shè)備管理器來管理,也不用導(dǎo)出與流驅(qū)動(dòng)程序類似的API接口。此類驅(qū)動(dòng)通常放在硬件平臺(tái)的目錄之下,如LCD顯示、USB接口驅(qū)動(dòng)就放在SRC\DRIVERS目錄下。
以Touch的開發(fā)為例,簡要介紹Compact 7下內(nèi)置驅(qū)動(dòng)的開發(fā)過程。Compact 7中Touch驅(qū)動(dòng)采用分層方式實(shí)現(xiàn),分為MDD(Model Device Driver)層和PDD(Platform Dependent Driver)層,分層結(jié)構(gòu)方便了驅(qū)動(dòng)程序的維護(hù)和移植。Touch驅(qū)動(dòng)分層示意圖如圖3所示。
Touch驅(qū)動(dòng)程序接收用戶的觸摸信息,并將其轉(zhuǎn)換為觸摸屏上的位置坐標(biāo)信息,再傳給圖形、窗口和事件的子系統(tǒng)GWES(Graphics,Windowing, and Events Subsystem)模塊。主要的工作是處理用戶交互和圖形輸出等任務(wù)。觸摸屏驅(qū)動(dòng)就是被它加載的,同時(shí)被GWES加載的還有鼠標(biāo)驅(qū)動(dòng)、鍵盤驅(qū)動(dòng)以及顯示設(shè)備驅(qū)動(dòng)。
對(duì)于初學(xué)者只需實(shí)現(xiàn)PDD層函數(shù)以及與MDD層通信的DDSI函數(shù)即可。MDD層與GWES模塊通信的DDI函數(shù)已由微軟實(shí)現(xiàn)。這樣驅(qū)動(dòng)開發(fā)的工作量會(huì)少很多,而代碼的可靠性則有了更好的保證。
Compact 7觸摸屏驅(qū)動(dòng)程序采用中斷方式對(duì)按下狀態(tài)進(jìn)行檢測,如果檢測到觸摸動(dòng)作時(shí)將產(chǎn)生中斷并觸發(fā)一個(gè)事件通知一個(gè)工作線程開始采集數(shù)據(jù)。同時(shí),驅(qū)動(dòng)將打開一個(gè)定時(shí)器,若觸摸動(dòng)作仍然存在,則定時(shí)觸發(fā)同一個(gè)事件通知工作線程采集數(shù)據(jù)。驅(qū)動(dòng)中采用了觸摸屏中斷以及定時(shí)器中斷2個(gè)中斷源,不僅可以監(jiān)控觸摸筆按下和抬起的動(dòng)作,還可以檢測到觸摸屏按下時(shí)的拖動(dòng)軌跡[5]。
由于OMAP3530開發(fā)板與觸摸屏之間采用I2C總線通信,而Compact 7提供的樣例是以SPI接口進(jìn)行數(shù)據(jù)通信,因此,需要修改PDDInitializeHardware函數(shù)和PDDGetControllerData函數(shù)。對(duì)SPI接口的讀寫改為對(duì)I2C總線的讀寫;之后在PDDTouchPanelGetPoint函數(shù)中修改代碼,按照具體觸摸屏控制芯片的數(shù)據(jù)定義格式進(jìn)行坐標(biāo)轉(zhuǎn)換;最后更改.reg文件中的注冊(cè)信息,定義管腳號(hào)、驅(qū)動(dòng)加載位置等。Compact 7系統(tǒng)啟動(dòng)過程中加載GWES模塊后,GWES模塊將根據(jù)注冊(cè)表的信息加載觸摸屏驅(qū)動(dòng)。
4.5 移植內(nèi)核獨(dú)立傳輸層
在Windows CE系統(tǒng)中使用了內(nèi)核獨(dú)立傳輸層KITL(Kernel Independent Transport Layer)技術(shù),其設(shè)計(jì)目標(biāo)是向開發(fā)者提供一種簡單的開發(fā)方式以支持調(diào)試服務(wù)。從Windows CE 6.0開始,KITL模塊已經(jīng)獨(dú)立出OAL,在操作系統(tǒng)運(yùn)行時(shí)已經(jīng)有了一個(gè)獨(dú)立的KITL.dll動(dòng)態(tài)鏈接庫。Compact 7操作系統(tǒng)繼承了這一特性,同時(shí)也提供了大量的程序樣例用于開發(fā)參考。
KITL的開發(fā)過程只需要完善OEM部分代碼即可,這部分代碼位于\SRC\KITL目錄下。用戶需要實(shí)現(xiàn)OEMKitlStartup函數(shù)、OEMKitlInit函數(shù),同時(shí)需要構(gòu)造相關(guān)結(jié)構(gòu)體數(shù)據(jù)。OEMKitlStartup的功能是構(gòu)造實(shí)際參數(shù)的數(shù)據(jù),如代表KITL連接設(shè)備的標(biāo)識(shí)符字符串、記錄用戶對(duì)系統(tǒng)KITL功能配置的數(shù)據(jù)以及所有可選KITL連接設(shè)備的硬件位置。OEMKitlInit的功能是構(gòu)造一個(gè)設(shè)置KITL傳輸層端口的結(jié)構(gòu)體數(shù)據(jù)。
OMAP3530開發(fā)板的KITL采用中斷方式進(jìn)行驅(qū)動(dòng)。中斷方式在OEMKitlStartup函數(shù)中設(shè)置。具體代碼如下:
// Prepare interrupt
pGPIORegs = OALPAtoUA(BSP_ETHER_GPIO_PA);
SETREG32(&pGPIORegs->OE,
1 << (BSP_IRQ_ETHER_KITL % 32));
// Interrupt on falling edge
SETREG32(&pGPIORegs->FALLINGDETECT,
1 << (BSP_IRQ_ETHER_KITL % 32));
OEMKitlEnableClocks(FALSE);
之后在OEMKitlEnableClocks函數(shù)中修改IRQ管腳對(duì)時(shí)鐘的響應(yīng)。具體代碼如下:
// IRQ pin
clockRoutines.pfnEnableDeviceFClock(OMAP_DEVICE_GPIO,
bEnable);
其中宏定義BSP_IRQ_ETHER_KITL和OMAP_DEVICE_GPIO的值由開發(fā)板上實(shí)際連接到LAN9220的中斷信號(hào)的管腳決定。移植過程中對(duì)這兩個(gè)宏定義進(jìn)行修改即可實(shí)現(xiàn)KITL的功能。
4.6 設(shè)置配置文件
當(dāng)創(chuàng)建一個(gè)Compact 7的工程時(shí),可以通過添加環(huán)境變量、修改.bib和.reg等文件來重新配置BSP。Compact 7將配置文件分為兩類,一類是源代碼配置文件,如Dirs文件、Makefile文件以及Sources文件;另一類是鏡像配置文件,如.bib文件、.reg文件、.dat文件等。開發(fā)人員必須理解相關(guān)配置文件的作用和使用方法才能合理地配置系統(tǒng)資源。
至此,BSP的開發(fā)流程已基本完成。開發(fā)移植好的BSP要在Platform Builder中編譯生成可以在硬件開發(fā)平臺(tái)上運(yùn)行的二進(jìn)制代碼,通過SD卡將MLO和eboot.nb0下載到Nand Flash上,然后再通過以太網(wǎng)下載NK.bin到開發(fā)板上。
開發(fā)BSP 是一個(gè)基于具體硬件和軟件的復(fù)雜過程,需要開發(fā)者對(duì)硬件和軟件知識(shí)都有較為深入的了解[6]。BSP開發(fā)的正確性將直接影響到系統(tǒng)運(yùn)行的穩(wěn)定性。
參考文獻(xiàn)
[1] 周建設(shè).Windows CE設(shè)備驅(qū)動(dòng)及BSP開發(fā)指南[M].北京:中國電力出版社,2009.
[2] 陳瑞,張永瑞,歐陽雄.基于XSCALE架構(gòu)處理器WinCE系統(tǒng)BSP開發(fā)[J].電子科技,2006(2).
[3] Microsoft.BSP porting guide for Windows Embedded Compact 7[Z].2010.
[4] 李大為.Windows CE工程實(shí)踐完全解析[M].北京:中國電力出版社,2008.
[5] 張毅,王海濤.基于S3C2410A的WinCE 5.0下觸摸屏驅(qū)動(dòng)的實(shí)現(xiàn)[J].重慶郵電大學(xué)學(xué)報(bào)(自然科學(xué)版),2008(6).
[6] 李海林,趙惠林,熊文峰.基于XScale PXA255處理器WinCE 420系統(tǒng)BSP開發(fā)[J].艦船電子工程,2006(3).