摘 要:介紹了Windows CE 的體系結構和中斷處理機制,研究了Windows CE 設備驅動程序的類型和初始化過程,以維信諾VGG13264C 132×64 OLED 顯示模塊的WindowsCE 驅動程序設計為例,詳細闡述了嵌入式Windows CE 驅動程序的開發(fā)過程。
關鍵詞: Windows CE; 驅動模型; OLED驅動程序; 開發(fā)過程
隨著計算機技術和嵌入式技術的迅猛發(fā)展,嵌入式軟、硬件設計需求越來越廣泛,嵌入式軟件開發(fā),特別是嵌入式軟件的驅動開發(fā),成為一個熱點。
Windows CE 是一個新的、可移植的、實時的、模塊化的操作系統(tǒng)[1],具有簡捷、高效的完全搶先式多任務操作核心,支持強大的通信和圖形顯示功能,能夠適應廣泛的系統(tǒng)需求,在最新一代的工業(yè)和家用電子設備中得到了廣泛的應用。
在進行嵌入式Windows CE項目開發(fā)的過程中,經(jīng)常需要根據(jù)需求定制顯示屏,如何為定制的顯示屏開發(fā)Windows CE驅動程序成為嵌入式系統(tǒng)開發(fā)的關鍵步驟。本文在深入研究Windows CE 驅動程序工作原理的基礎上,以維信諾VGG13264C 132×64 OLED 顯示模塊的WindowsCE 驅動程序設計為例,詳細闡述了嵌入式Windows CE 驅動程序的開發(fā)過程,并對設計實現(xiàn)的驅動程序進行了測試。
1 Window CE的系統(tǒng)體系結構
Windows CE是微軟設計開發(fā)的一種可升級的搶先式多任務32 位實時操作系統(tǒng)。一個基于Windows CE的平臺主要由以下幾部分組成:Windows CE內(nèi)核組件、OAL層和驅動程序。OAL層和驅動程序作為目標設備和Windows CE內(nèi)核組件之間的接口,將操作系統(tǒng)上層與硬件隔離,便于支持硬件擴展和即插即用功能[2],圖1詳細描述了三者之間的關系。
2 Windows CE中斷處理
Windows CE將中斷處理分為兩個步驟:中斷服務例程(ISR)和中斷服務線程(IST)[3]。把每個硬件的設備中斷請求(IRQ)和一個ISR聯(lián)系起來,當一個中斷發(fā)生并未被屏蔽時,內(nèi)核調(diào)用該中斷注冊的ISR。因為ISR運行于內(nèi)核模式,所以應設計得盡可能短,ISR引導內(nèi)核調(diào)度和啟動合適的IST,IST在設備驅動程序軟件模塊中編寫,運行于用戶模式,它從硬件獲取或向硬件發(fā)送數(shù)據(jù)和控制代碼,并進一步處理設備中斷。Windows CE還提供了中斷嵌套功能,即在一個ISR運行時,內(nèi)核并不關閉中斷,當優(yōu)先級比之高的中斷發(fā)生時,內(nèi)核保存當前執(zhí)行的中斷服務例程ISR的運行狀態(tài),掛起該ISR,轉而執(zhí)行更高優(yōu)先級中斷的ISR。等到高優(yōu)先級中斷的ISR執(zhí)行完后,被掛起的低優(yōu)先級中斷的ISR才重新開始被CPU調(diào)度執(zhí)行。Windows CE的中斷處理框圖如圖2所示。
3 Windows CE設備驅動程序
設備驅動程序將操作系統(tǒng)和設備連接起來,使操作系統(tǒng)能夠識別設備,并為應用程序提供服務。
3.1 設備驅動程序模型
Windows CE提供了用于驅動開發(fā)的模型[4],其中包括來自其他操作系統(tǒng)的驅動程序模型。
因為有這些多變的驅動程序模型,使Windows CE可以適應大部分的內(nèi)部和外圍設備。目前,Windows CE提供了4種設備模型,其中兩種是專用于Windows CE模型,另外兩種外部模型來自其他的操作系統(tǒng),匯總如圖3所示。
3.2 本機驅動程序
要把Windows CE移植到目標平臺上,必須為平臺上已建立的設備提供驅動程序。一些類型的設備,如鍵盤、顯示器和PC卡插槽等對操作系統(tǒng)都有一個自定義接口。因為這些接口是專門用于Windows CE的,所以稱這類驅動程序為本機驅動程序。Windows CE 平臺生成器提供本機設備驅動程序的樣本,可考慮把本機設備驅動程序樣本應用到平臺上,而不需要再從頭開發(fā)自己的本機驅動程序。用戶可根據(jù)驅動程序樣本快速開發(fā)自己的驅動程序。
3.3 流接口驅動程序
流接口驅動程序由設備管理應用程序加載、管理和卸載,與具有單獨目的接口的本機驅動程序相比,所有流接口驅動程序使用同一個接口并調(diào)用同一個函數(shù)集——流接口函數(shù)。流接口驅動程序把外設抽象成一個文件,使用標準文件I/O函數(shù)和電源管理函數(shù),這些函數(shù)由Windows CE 操作系統(tǒng)的內(nèi)核使用。流接口驅動程序的入口點函數(shù)為: XXX_ Init、XXX_Deinit、XXX_IOControl、XXX_Open、XXX_Close、 XXX_PowerDown、 XXX_PowerUp、XXX_Read、XXX_Seek、XXX_Write 。流接口驅動程序函數(shù)的作用及調(diào)用關系如表1所示。
流接口驅動程序從設備管理器和通過文件系統(tǒng)調(diào)用的應用程序接受命令,裝入驅動將這些命令翻譯成其所控制設備的適當操作的所有信息。所有的流接口驅動,無論它管理的是內(nèi)置式設備還是可安裝式設備,是系統(tǒng)引導加載還是動態(tài)加載,它們與其他的系統(tǒng)組件都有類似的交互過程。
3.4 設備驅動程序的初始化過程
在Windows CE中,所有的設備驅動程序都以動態(tài)鏈接庫(DLL)的形式存在,需要通過進程加載。設備驅動程序向外提供接口函數(shù),應用程序使用API對設備進行訪問。Windows CE共有三類系統(tǒng)進程用來加載驅動程序:Device.exe、GWES.exe、FileSys.exe。驅動程序的初始化過程為:設備上電——啟動bootloader——啟動NK.exe——啟動Device.exe——初始化數(shù)據(jù)結構和I/O——加載總線枚舉器——枚舉注冊表Driver/BuildIn下所有的子鍵。這里的枚舉就是循環(huán)調(diào)用ActivateDeviceEx函數(shù)加載驅動程序。
4 Windows CE開發(fā)流接口驅動程序實例
以維信諾VGG13264C 132×64 OLED顯示模塊的驅動程序為例,具體闡述Windows CE驅動開發(fā)的過程。
4.1 硬件結構
系統(tǒng)硬件以飛凌OK6410-B開發(fā)板為主板,以維信諾VGG13264C顯示模塊為OLED顯示屏。系統(tǒng)硬件框圖如圖4所示。
飛凌OK6410-B開發(fā)板基于三星公司最新的ARM11處理器S3C6410,擁有強大的內(nèi)部資源和視頻處理能力,可穩(wěn)定運行在667 MHz主頻以上,支持Mobile DDR和多種NAND Flash。FL6410開發(fā)板上集成了多種高端接口,如復合視頻信號、攝像頭、USB、SD卡、液晶屏、以太網(wǎng)等,豐富的接口可幫助用戶實現(xiàn)高端產(chǎn)品級設計。
維信諾VGG13264C是132列×64行點陣的OLED單色、字符、圖形顯示模塊,使用單芯片SSD1303T6進行驅動,具有8位并行數(shù)據(jù)接口,模塊內(nèi)含132×64顯示數(shù)據(jù) RAM,通過用戶I/O接口連接到飛凌OK6410-B開發(fā)板。
4.2 流接口驅動程序開發(fā)過程
Windows CE提供了兩種編寫流接口驅動的方法:(1)通過編寫動態(tài)鏈接庫的方法實現(xiàn); (2)通過修改BSP的方法實現(xiàn)。由于第二種方法可以加快開發(fā)進度,在該實例中,使用修改BSP的方法進行流接口驅動程序開發(fā),其開發(fā)步驟為:首先在BSP中新建一個目錄,編寫驅動程序文件并確定驅動程序向外提供的接口函數(shù),然后進行注冊表設置,最后進行測試。
(1)驅動程序代碼編寫
設備初始化使用OED_Init函數(shù)實現(xiàn),設備卸載使用OED_Deinit函數(shù)實現(xiàn)。在OED_Init函數(shù)中,使用DrvLib_MapIoSpace函數(shù)實現(xiàn)物理地址到虛擬地址映射;在OED_Deinit函數(shù)中,使用VirtualFree函數(shù)釋放驅動程序使用的虛擬內(nèi)存從而實現(xiàn)了設備的卸載。
設備的I/O控制向設備發(fā)出命令,按照維信諾VGG13264C OLED顯示模塊的時序關系,通過控制相應管腳的電平高低實現(xiàn)向設備發(fā)出命令。設備的I/O控制在OED_IOControl函數(shù)中實現(xiàn),函數(shù)部分代碼如下:
switch (dwIoControlCode) {
case IOCTL_OLED_INIT:
v_pIOPregs->GPPCON&=0xF000FFFF;
v_pIOPregs->GPPCON|=0x5550000;
……
Delay_ns(2);
v_pIOPregs->GPEDAT|=(0x01<<4);
Delay_ns(2);
v_pIOPregs->GPEDAT|=(0x01<<2);
break;
case IOCTL_OLED_WRITECOMMAND:
v_pIOPregs->GPEDAT&=~(0x01); //A0低
v_pIOPregs->GPEDAT|=(0x01<<3); //CS高
v_pIOPregs->GPEDAT|=(0x01<<1); //WR高
Delay_ns(1);
v_pIOPregs->GPEDAT&=~(0x01<<3); //CS低
v_pIOPregs->GPEDAT&=~(0x01<<1); //WR低
if((0x01<<7)&(*pInBuf))
v_pIOPregs->GPQDAT|=(0x01<<6);
else v_pIOPregs->GPQDAT&=~(0x01<<6);
……
Delay_ns(1);
v_pIOPregs->GPEDAT|=(0x01<<1); //WR高
Delay_ns(1);
v_pIOPregs->GPEDAT|=(0x01<<3); //CS高
break;
case IOCTL_OLED_WRITEDATA:
v_pIOPregs->GPEDAT|=(0x01); //A0高
v_pIOPregs->GPEDAT|=(0x01<<3); //CS高
v_pIOPregs->GPEDAT|=(0x01<<1); //WR高
v_pIOPregs->GPEDAT&=~(0x01<<3); //CS低
v_pIOPregs->GPEDAT&=~(0x01<<1); //WR低
if((0x01<<7)&(*pInBuf))
v_pIOPregs->GPQDAT|=(0x01<<6);
else v_pIOPregs->GPQDAT&=~(0x01<<6);
……
Delay_ns(1);
v_pIOPregs->GPEDAT|=(0x01<<1); //WR高
Delay_ns(1);
v_pIOPregs->GPEDAT|=(0x01<<3); //CS高
break;
}
(2)向外提供函數(shù)接口
通過配置OED.def文件導出OLED提供的接口函數(shù),供設備管理器使用。在OED.def 文件中添加如下代碼:
LIBRARY OED
EXPORTS OED_Init
OED _Deinit
OED _Open
OED _Close
OED _Read
OED _Write
OED _Seek
OED _PowerDown
OED _PowerUp
OED _IOControl
(3)注冊表配置
注冊表文件Platform. reg 用來配置與OLED驅動有關的信息,配置如下:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\IoControler]
“Prefix”=“OED”
“Dll”=“OED.dll”
“Index”=dword:0
隨著嵌入式系統(tǒng)廣泛應用到信息家電、工業(yè)控制、移動通信、互聯(lián)網(wǎng)等領域,大量嵌入式系統(tǒng)的開發(fā)必將對人類科技的發(fā)展起著重要的作用。本文介紹的基于嵌入式操作系統(tǒng)Windows CE 的驅動程序會幫助讀者開發(fā)出更多的嵌入式系統(tǒng)產(chǎn)品。
參考文獻
[1] GOGGIN T A. Windows CE 高級開發(fā)指南[M]. 尤滔,張平,周曉權,譯,北京:電子工業(yè)出版社,2001.
[2] Microsoft . Microsoft Windows CE Device Driver Kit[M]. 北京:北京希望電子出版社,2000.
[3] 胡軍輝,王友釗.Windows CE設備驅動程序開發(fā)[J].計算機工程,2006,32(16):41-43.
[4] 李長河,王永強,劉剛,等.嵌入式Windows CE設備驅動的研究實現(xiàn)[J].微機發(fā)展,2003,13(7):69-72.