摘 要:隨著信息化、智能化、網絡化的發展,嵌入式技術已經成為通信和消費類產品的共同發展方向。簡要介紹嵌入式操作系統Windows CE,同時對Windows CE下兩種基本的驅動開發模型本機設備驅動程序和流接口驅動程序進行重點說明。在了解兩種模型的基礎上,以基于S3C2440處理器的UART0驅動程序開發為例,詳細介紹嵌入式操作系統Windows CE下流接口設備驅動開發的具體過程。
關鍵詞:嵌入式操作系統;Windows CE;設備驅動開發;UART0
中圖分類號:TP311 文獻標識碼:B
文章編號:1004-373X(2008)06-153-03
Research and Practice of Device Driver of Windows CE Based on S3C2440
SUN Ting,TIAN Ze,YAN Xiaoying
(School of Computer Science,Xi′an Shiyou University,Xi′an,710065,China)
Abstract:With the development of information,intelligence and network,embedded technology has became common direction of communication and consumption products.This paper simply introduces embedded operating system Windows CE,at the same time especially explains two basal driver model of native and stream interface device drivers under the Windows CE.With this understanding,it takes the driver development of UART0 which is based on processor of S3C2440 as an example,introduces the development process of stream interface device driver for embedded Windows CE in details.
Keywords:embedded OS;Windows CE;device driver development;UART0
1 引 言
伴隨后PC時代的到來,人們越來越多地接觸到一個新的概念——嵌入式技術。嵌入式技術已被廣泛地應用于科學研究、工程設計、軍事技術以及文藝商業等方面,成為后PC時代IT領域發展的主力軍。這也極大地刺激了嵌入式系統的發展和產業化的進程。而嵌入式操作系統作為嵌入式系統的核心,是連接嵌入式設備和應用的重要部件。他一方面要支持各種功能及規格的硬件設備,另一方面要為各種應用程序提供一致的功能調用接口,同時還需要在有限的系統資源上盡可能快地完成應用的計算需求。目前,主流的嵌入式操作系統有嵌入式Linux,Palm OS,VxWorks,Windows CE等。
2 Windows CE簡介
Windows CE是一個開放的、可裁剪的、32位實時嵌入式窗口操作系統。和其他桌面版窗口操作系統相比,他具有可靠性好、實時性高、內核體積小及可伸縮性、強大的通信能力等特點。所以其被廣泛用于各種嵌入式智能設備的開發,是當今應用最多、增長最快的嵌入式操作系統。
Windows CE是從整體上為有限資源的平臺設計的多線程、完整優先權、多任務的操作系統。他采用高度的模塊化設計,這些模塊之間可能是獨立的,也可能有一些依賴關系。在Windows CE中最主要的系統模塊有5個:
(1)內核(NK):Windows CE的內核可以非常小,最小的內核只有500 kB。這是因為系統的大部分功能都可以在各自的功能模塊中完成。他是整個Windows CE操作系統的核心,主要完成6類功能,即處理器調度、內存管理、異常處理、系統內的通信機制、為其他部分提供核心調用例程、為系統范圍內的調試提供支持。
(2) 設備管理模塊:提供系統范圍內基本的設備列表管理、即插即用管理、電源管理、I/O資源管理等,并實現設備驅動程序得以工作的基本機制。設備配置信息存儲在Windows CE的注冊表中。
(3) 數據存儲模塊:提供基本的數據存儲能力,包括對象存儲和文件系統。目前,對象存儲的大小限制為256 MB的RAM ,對象存儲里的單個文件限制為最大32 MB。對象存儲在Windows CE中的作用類似于PC機中的硬盤,他為應用程序及相關數據提供持久穩固的存儲。在Windows CE中提供了三種文件系統,分別為基于ROM文件系統、基于RAM文件系統、以及用于支持外圍存儲設備的FAT文件系統。另外,嵌入式開發者也可以創建和注冊屬性文件系統。
(4) 圖形用戶界面模塊(GWES):他提供以下幾個主要功能:基本的繪圖引擎、窗口管理、界面的事件機制等。在Windows CE中GWES是操作系統、應用程序以及用戶之間的接口。他支持組成Windows CE圖形用戶界面的窗口、對話框、控件、菜單和資源,使用戶能夠控制應用程序。同時GWES還負責部分驅動程序的加載工作,主要包括顯示、鍵盤、鼠標及觸摸屏等的驅動。
(5) 通信模塊:在整個Windows CE中,網絡通信模塊是最為獨立的一部分,他運行時體現為一系列的動態鏈接庫。其設計目標主要體現在4點:
高效能 提供最好的網絡應用平臺;
包容力 支持廣泛的網絡類型和選項;
易用性 通過系統提供的API,用戶可以容易地開發出各種網絡應用;
可拆卸 這是整個網絡系統構架的特征,系統可以拆成很多獨立的部分,應用系統可以根據需要選擇其中一部分,這樣可以降低系統開銷,使系統更加精簡。
除了這5個主要的系統模塊外,Windows CE還有一些其他的模塊,如OAL模塊、驅動程序模塊等。在實際的開發應用中,嵌入式開發者可以根據設備的性質只選擇那些必要的模塊或模塊中的組件包含進操作系統鏡像中。
3 Windows CE驅動開發模型
通常設備驅動程序在操作系統中扮演著無名英雄的角色。正是由于驅動程序的存在,大多數操作系統上的應用程序都是與硬件無關的,應用程序的開發者和最終用戶通常都不必關心底層的硬件是怎么工作的。Windows CE之所以能夠支持各種各樣的硬件設備,毫無疑問,也是因為都有其對應的設備驅動程序。設備驅動程序是操作系統與硬件交互的方式,是連接硬件與操作系統之間的橋梁。
當前,Windows CE有4種設備模型[2]。其中本機設備驅動程序和流接口驅動程序模型是專用于Windows CE驅動程序的開發方法。另外兩種外部模型也可應用于其他操作系統,他們分別是通用串行總線(USB)和網絡驅動器接口標準(NDIS)的驅動程序。
3.1 本機設備驅動程序
在開始本機設備驅動程序開發前,必須先了解哪些設備的驅動程序用本機設備驅動模型實現。正如他的名字,本機設備驅動程序適用于集成到基于Windows CE平臺的設備。如鍵盤、顯示器、PC卡插槽等設備的驅動。本機設備驅動程序通常使用Windows CE提供的特定接口,因此本機設備驅動程序都有明確和專一的目的。微軟本身提供了很多本機設備驅動程序的樣本程序,這樣絕大多數的開發人員不需要編寫本機設備驅動程序。除非是OEM開發商想為新平臺定制Windows CE ,那么他們就可以編寫自己的本機設備驅動程序,當然他們也可以將微軟的本機設備驅動程序的例子直接移植到新平臺上。本機設備驅動程序分為2種類型:單片驅動程序和分層的驅動程序\\[3\\],如圖1所示。單片驅動程序的代碼直接與硬件交互,因此他包含與特定的某款硬件相關聯的代碼。通常,單片驅動程序會暴露DDI接口給操作系統,DDI函數是操作系統與驅動程序交互的接口協議。而分層驅動程序由2個設置好的層組成:上層是模型設備驅動程序(MDD),下層是依賴平臺的驅動程序(PDD)。MDD層與硬件平臺無關,他通過驅動程序接口DDI與應用程序通信。在開發驅動程序時,一般不必修改MDD層。只需關心與具體硬件平臺有關的下層,依賴平臺的驅動程序層PDD。PDD層通過設備驅動服務接口DDSI直接管理硬件。通常,MDD層的代碼與PDD層的代碼會被編譯成獨立的靜態LIB庫,然后進行鏈接,形成可執行的驅動程序。因此,MDD和PDD的劃分只是在源代碼邏輯層面,在驅動程序的二進制可執行代碼中不會存在MDD與PDD的分層。

3.2 流接口驅動程序
流接口驅動程序是為了連接到Windows CE的平臺的外圍設備設計的,如打印機、尋呼機、調制解調器等。他是動態鏈接庫,由設備管理器動態加載、管理和卸載。與具有單獨目的接口的本機設備驅動程序相比,流接口驅動都使用相同的接口導出一組相同的函數[CD2]流接口函數。流接口函數也稱作流接口驅動的入口點,用來完成標準的文件I/O函數和電源管理函數,這些函數是提供給Windows CE的操作系統內核使用的。流接口驅動的入口點主要包括 XXX_Init,XXX_Deinit,XXX_Open,XXX_Close,XXX_Read,XXX_Write,XXX_Seek,XXX_PowerUp,XXX_PowerDown和XXX_IOControl,其中XXX是在驅動程序注冊表里定義的設備文件名的前綴。在Windows CE中設備文件名是由3個大寫字母、1個數字和1個冒號組成的。
流接口驅動對硬件設備的訪問涉及5個步驟[4]:應用程序、FileSys.exe、設備管理器、流式接口驅動程序本身以及硬件。其中,應用程序和流式接口驅動程序是用戶編寫的;FileSys.exe與設備管理器是Windows CE操作系統提供的組件,用戶無法修改。圖2是流式接口驅動程序的體系結構。

從圖2可以知道,首先,應用程序使用文件API對設備進行訪問,文件API被操作系統轉發到FileSys.exe進程中;然后FileSys.exe發現是對設備的操作,就會把執行交給設備管理器處理;接著設備管理器根據具體的請求,調用不同的流式接口驅動程序中暴露的接口;最終,驅動程序負責與硬件交互。
4 Windows CE驅動開發實例
下面以UART0驅動程序為例,具體介紹驅動程序的開發。
S3C2440A是三星公司推出的16/32位精簡指令集微處理器,他是為應用于小型掌上設備和高性價比,低功耗,高性能的嵌入式系統應用而提供的微控制解決方案。S3C2440使用ARM920T內核,芯片上提供的集成功能包括:分開的16 k指令/數據緩存、SDRAM控制器、LCD控制器、4通道DMA、3通道UART、I2C總線、I2S總線、SD主機接口、PWM定時器、看門狗、片上PLL時鐘發生器、8通道10位AD控制器和觸摸屏接口、攝像頭接口以及帶日歷函數的實時時鐘。S3C2440A最高頻率可達533 MHz,且功耗只有mW級。
S3C2440 UART提供3個獨立的異步串行I/O口,每1個口均可以工作在中斷或DMA模式下。也就是說UART通過產生1個中斷或DMA請求來在CPU和UART之前傳輸數據。
每個UART通道包括2個用于接收和傳輸的16 B的FIFOs。
首先需要在oalintr.h中添加UART的中斷號,然后在cfw.c中初始化UART中斷。接下來修改BSP中帶有的UART的驅動程序,實現相應的功能即可。
(1) 注冊中斷
首先需要在oalintr.h中添加UART的中斷號,然后在cfw.c中初始化UART中斷。最后在armint.c的實現物理中斷與邏輯中斷的關聯。
① 在platform\\\\smdk2440\\\\inc\\\\Oalintr.h文件中添加:
#define SYSINTR_UART0(SYSINTR_FIRMWARE+3)
在platform\\\\smdk2440\\\\inc\\\\Oalintr.inc添加:
SYSINTR_UART0:.equ SYSINTR_FIRMWARE+3
② 修改cfw.c文件
case SYSINTR_UART0: // Serial port.
s2440INT->rSUBSRCPND = (INTSUB_RXD0 | INTSUB_TXD0 | INTSUB_ERR0);
s2440INT->rINTSUBMSK = ~INTSUB_RXD0;
s2440INT->rINTSUBMSK = ~INTSUB_TXD0;
s2440INT->rINTSUBMSK = ~INTSUB_ERR0;
s2440INT->rSRCPND = BIT_UART0;
if (s2440INT->rINTPND BIT_UART0) s2440INT->rINTPND = BIT_UART0;
s2440INT->rINTMSK = ~BIT_UART0;
break;
(2) 在smdk2440\\\\drivers下創建UART0文件夾,將drivers\\\\serial中的文件復制一份到這個文件夾中。并把ser2440.def、ser2440_hw.c、ser2440_ser依次改為UART0.def、UART0_hw.c、UART0_ser,同時修改drivers\\\\dirs文件,添加UART0即可。
(3) 完成.def文件、source文件和platform.reg的修改
① .def文件修改如下:
將LIBRARY ser2440分別改為LIBRARY UART0。
② source文件修改如下:
將TARGETNAME=ser2440改為TARGETNAME=UART0。
將SOURCES=
ser2440_ser.c
ser2440_hw.c
修改為:
SOURCES=
UART0_ser.c
UART0_hw.c
③ smdk2440\\\\files\\\\platform.reg修改
將注冊表中原有的關于ser2440的部分替換為UART0即可。
(4) 修改bib文件
有了驅動程序和注冊表文件,驅動程序還不能夠正確地運行。因為他還沒有被加入到內核中。添加一個文件到定制的內核中的方法有2種:一種是修改BIB文件,另一種是編寫一個CEC文件添加到PB中。這里選擇bib 文件。在smdk2440\\\\files\\\\platform.bib中IF BSP_NOSERIAL !和ENDIF BSP_NOSERIAL !之間添加:
UART0.Dll(_FLATRELEASEDIR)\\\\UART0.Dll NK SH
并注釋掉:
;irsir.dll (_FLATRELEASEDIR)\\\\irsir.dll NK SH
;irda2440.dll (_FLATRELEASEDIR)\\\\ser2440.dll NK SH
;ser2440.dll (_FLATRELEASEDIR)\\\\ser2440.dll NK SH
完成以上修改后rebuild就可以實現UART0的驅動,然后下載內核到目標板利用串口調試程序測試。
5 結 語
在嵌入式技術飛速發展的今天,Windows CE必將有廣泛的應用前景。編寫高效的設備驅動程序也將帶動外圍設備的開發。
參考文獻
[1]陳向群,王雷.Windows CE.NET 系統分析及實驗教程[M].北京:機械工業出版社,2003.
[2]Microsoft.Microsoft Windows CE Device Driver Kit[ M].希望電腦公司,譯.北京:希望電子出版社,2000.
[3]周毓林,寧楊,陸貴強,等.Windows CE.net內核定制及應用開發[M].北京:電子工業出版社,2005.
[4]何宗鍵.Windows CE嵌入式系統[M].北京:北京航空航天大學出版社,2006.
[5]SUMSUNG S3C2440A用戶手冊\\[Z\\].