高守生
摘 要:介紹Windows CE及其特點,深入研究Windows CE本機設備驅動程序和流接口驅動程序模型及工作方法。在多主I2C總線模式下,根據S3C2440處理器的集成功能和接口模式,以S3C2440處理器的寄存器物理地址和虛擬地址來捆綁和配置I2C總線控制器設計為例,著重闡述了嵌入式Windows CE流接口驅動程序的開發過程,為此類設備驅動的快速開發提供了很好的思路。
關鍵詞:Windows CE;設備驅動;I2C;S3C2440
中圖分類號:TP334
0 引 言
伴隨著后PC時代的到來,人們越來越多地接觸到一個新的概念即嵌入式技術。嵌入式技術已被廣泛地應用于科學研究、工程設計、軍事技術,以及文藝商業等方方面面,成為后PC時代IT領域發展的主力軍。這也極大地刺激了嵌入式系統的發展和產業化的進程。嵌入式操作系統作為嵌入式系統的核心,是連接嵌入式設備和應用的重要部件。它一方面要支持各種功能及規格的硬件設備,另一方面要為各種應用程序提供┮恢陋的功能調用接口,同時還需要在有限的系統資源上盡可能快地完成應用的計算需求。目前,主流的嵌入式操作系統有嵌入式Linux,Palm OS,VxWorks,Windows CE等。
1 Windows CE簡介
Windows CE是一個開放的、可裁剪的、32位實時嵌入式窗口的操作系統。與其他桌面版窗口操作系統相比,它具有可靠性好,實時性高,內核體積小及可伸縮性,通信能力強等特點。所以被廣泛用于各種嵌入式智能設備的開發中,是當今應用最多,增長最快的嵌入式操作系統。
Windows CE是從整體上為有限資源平臺設計的多線程、完整優先權、多任務的操作系統[1,2] 。它采用高度的模塊化設計,這些模塊之間可能是獨立的,也可能有一些依賴關系。在Windows CE中最主要的系統模塊有五個,它們是:
(1) 內核:Windows CE的內核可以非常小,最小的內核只有500 KB。這是因為系統的大部分功能都可以在各自的功能模塊中完成。它是整個Windows CE操作系統的核心,主要完成六類功能,即處理器調度、內存管理、異常處理、系統內的通信機制,為其他部分提供核心調用例程,為系統范圍內的調試提供支持。
(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中,網絡通信模塊是最為獨立的一部分,它運行時體現為一系列的動態鏈接庫。其設計目標主要體現在四點:
① 高效能。提供最好的網絡應用平臺。
② 包容力。支持廣泛的網絡類型和選項。
③ 易用性。通過系統提供的API,用戶可以容易地開發出各種網絡應用。
④ 可拆卸。這是整個網絡系統構架的特征,系統可以拆成很多獨立的部分,應用系統可以根據需要選擇其中一部分,這樣可以降低系統開銷,使系統更加精簡。
除了這五個主要的系統模塊外,Windows CE還有一些其他的模塊,如OAL模塊、驅動程序模塊等。在實際的開發應用中,嵌入式開發者可以根據設備的性質,只選擇那些必要的模塊或模塊中的組件,包含進操作系統鏡像中。
2 Windows CE驅動程序模型
在操作系統中設備驅動程序通常扮演著無名英雄的角色。正是由于驅動程序的存在,大多數操作系統之上的應用程序都與硬件無關。應用程序的開發者和最終用戶通常都不必關心底層的硬件如何工作。Windows CE之所以能夠支持各種各樣的硬件設備,也是因為存在對應的設備驅動程序。這些設備驅動程序提供了操作系統與硬件交互的方式,是連接硬件和操作系統之間的橋梁。
當前Windows CE有四種設備模型,其中本機設備驅動程序和流接口驅動程序模型是專用于Windows CE驅動程序的開發方法。另外,兩種外部模型也可應用于其他操作系統,它們分別是通用串行總線(USB)和網絡驅動器接口標準(NDIS)的驅動程序。
2.1 本機設備驅動程序
在開始開發本機設備驅動程序前,必須先了解哪些設備的驅動程序是采用本機設備驅動模型實現的。正如它的名字,本機設備驅動程序適用于集成到基于Windows CE平臺的設備,如鍵盤、顯示器、PC卡插槽等設備。本機設備驅動程序通常使用Windows CE提供的特定接口,而且都有明確和專一的目的。微軟本身提供了很多本機設備驅動程序的樣本程序,這樣絕大多數的開發人員不需要編寫本機設備驅動程序。除非是OEM開發商想為新平臺定制Windows CE,那么他們就需要編寫自己的本機設備驅動程序,當然可以將微軟的本機設備驅動程序的例子直接移植到新平臺上。
本機設備驅動程序分為兩種類型:單片驅動程序和分層的驅動程序[5]。單片驅動程序的代碼直接與硬件交互,因此它包含與特定的某款硬件相關聯的代碼。通常,單片驅動程序會暴露DDI接口給操作系統,DDI函數是操作系統與驅動程序交互的接口協議。而分層驅動程序由兩個設置好的層組成:上層是模型設備驅動程序(MDD),下層是依賴平臺的驅動程序(PDD)。MDD層與硬件平臺無關,它通過驅動程序接口DDI與應用程序通信。
開發驅動程序時,一般不必修改MDD層。只需關心與具體硬件平臺有關的下層,依賴平臺的驅動程序層PDD。PDD層通過設備驅動服務接口DDSI直接管理硬件。通常,MDD層的代碼與PDD層的代碼會被編譯成獨立的靜態LIB庫,然后進行鏈接,形成可執行的驅動程序。因此,MDD和PDD的劃分只是在源代碼邏輯層面,在驅動程序的二進制可執行代碼中不會存在MDD與PDD的分層。
2.2 流接口驅動程序
流接口驅動程序是為了連接到Windows CE平臺的外圍設備而設計的,如打印機、尋呼機、調制解調器等。它是動態鏈接庫,由設備管理器動態加載、管理和卸載[8]。與具有單獨目的接口的本機設備驅動程序相比,流接口驅動通過使用相同的接口,導出一組相同的函數即流接口函數。流接口函數也稱作流接口驅動的入口點,用來完成標準的文件I/O函數和電源管理函數,這些函數是提供給Windows CE的操作系統內核使用的。流接口驅動的入口點主要包括 XXX[CD#*2]Init,XXX[CD#*2]Deinit,XXX[CD#*2]Open,XXX[CD#*2]Close,XXX[CD#*2]Read,XXX[CD#*2]Write,XXX[CD#*2]Seek,XXX[CD#*2]PowerUp,XXX[CD#*2]PowerDown和XXX[CD#*2]IOControl。其中,XXX是在驅動程序注冊表里定義的設備文件名的前綴。在Windows CE中設備文件名通常由3個大寫字母,1個數字和1個冒號組成。
流接口驅動對硬件設備的訪問涉及五個部分[6]:應用程序、FileSys.exe、設備管理器、流式接口驅動程序本身以及硬件。其中,應用程序和流式接口驅動程序是由用戶編寫的;FileSys.exe與設備管理器是由Windows CE操作系統提供的組件,用戶無法修改。
在應用程序使用文件API對設備進行訪問時,文件API被操作系統轉發到FileSys.exe進程中;然后FileSys.exe發現是對設備操作,就會把執行交給設備管理器處理;接著設備管理器根據具體的請求,調用不同流式接口驅動程序中提供的接口;最后驅動程序負責與硬件交互。
3 Windows CE驅動開發實例
這里以基于S3C2440A的I2C驅動程序為例,共同探討Windows CE下驅動程序的開發。
I2C(Inter Integrated Circuit)總線是1980年Phi[CD*2]lips公司推出的。通過I2C兩根引線:一根串行地址線(SDA)和一根串行時鐘線(SCL),可使微控制器與外部設備之間進行串行通信或使主設備和從設備之間實現雙向數據傳送。I2C總線遵從同步串行傳輸協議,即各位串行發送,由時鐘(clock)線指示讀數據(data)線的時刻。每個數據包前有一個地址,以指示由哪個器件來接收該數據。
S3C2440A是三星公司推出的16/32位精簡指令集微處理器,它是為應用于小型掌上設備和高性價比、低功耗、高性能的嵌入式系統而提供的微控制解決方案。S3C2440使用了ARM920T內核,芯片上提供的集成功能包括:分開的16 KB指令/數據緩存、SDRAM控制器、LCD控制器、4通道DMA、3通道UART、I2C總線、IIS總線、SD主機接口、PWM定時器、看門狗、片上PLL時鐘發生器、8通道10位A/D控制器和觸摸屏接口、攝像頭接口以及帶日歷函數的實時時鐘。S3C2440A最高頻率可達533 MHz,且功耗只有毫瓦級[9]。
在多主I2C總線模式下,S3C2440A微處理器從設備接收串行數據或發送串行數據到從設備。主S3C2440A可以初始化或終止I2C總線上的數據傳輸。在S3C2440A中,I2C總線使用標準的總線仲裁過程。S3C2440A的I2C總線接口有4種模式[9]:主接收模式、主發送模式、從接收模式和從發送模式。為了控制多主I2C總線,必須對下面這幾個寄存器進行讀/寫:I2C控制寄存器I2CCON,I2C控制/狀態寄存器I2CSTATI2C、數據寄存器I2CDS,I2C地址寄存器I2CADD。
[BT3]3.1 編寫流驅動程序
首先,需要在oalintr.h中添加I2C的中斷號;然后在cfw.c中初始化I2C中斷;接下來,編寫I2C的驅動程序。這里采用Windows CE下的流接口驅動模型。在I2C[CD#*2]Init中需要把IOPORT registers,I2C Bus registers,CLK/PWR registers等寄存器的物理地址和虛擬地址綁定起來。同時配置I2C 總線控制器,使能I2C的Clock/Power controller。其中一些語句為:
然后,可實現I2C[CD#*2]Open,I2C[CD#*2]Read,I2C[CD#*2]Write,I2C[CD#*2]Close函數等,通過對各個寄存器進行操作,從而得到I2C總線讀取和發送的數據。
完成編譯之后,得到的DLL還不能作為流接口,還需要編寫一個def文件,將它的接口函數導出。
[BT3]3.2 編寫驅動程序注冊表
一個具體的流接口驅動程序與注冊表部分是不能分開的。在此,使用記事本編寫注冊表的內容如下:
[BT3]3.3 編寫CEC文件
有了驅動程序和注冊表文件,驅動程序還不能正常運行。因為它還沒有被加入到CEC內核中。將一個文件添加到定制內核中的方法通常有兩種:一種是修改BIB文件;另一種是編寫一個CEC文件,并添加到PB中。將編寫好的CEC文件導入到PB中后,重新進行Build,就可以生成包含該流接口的驅動程序。
4 結 語
在嵌入式技術飛速發展的今天,Windows CE必將有廣泛的應用前景,這里編寫高效的設備驅動程序也將帶動外圍設備的開發。