引 言
WinCE5.0是一個(gè)32位、多任務(wù)、多線程的實(shí)時(shí)嵌入式操作系統(tǒng)。USB Camera 以其良好的性能和低廉的價(jià)格得到廣泛的應(yīng)用,同時(shí)因其靈活、方便的特性,易于集成到嵌入式系統(tǒng)中。
通過采用USB Camera可以在WinCE5.0下方便地得到實(shí)時(shí)圖像。但是由于嵌入式硬件環(huán)境的多樣性以及WinCE5.0對USB設(shè)備驅(qū)動開發(fā)只提供了一些底層支持,攝像頭廠商尚未提供WinCE5.0下USB攝像頭的驅(qū)動,因此開發(fā)出WinCE5.0下USB攝像頭驅(qū)動具有實(shí)際的意義和價(jià)值。本文正是針對這一情況,對WinCE5.0下USB設(shè)備驅(qū)動開發(fā)進(jìn)行研究,并設(shè)計(jì)出基于流接口驅(qū)動模型的USB攝像頭驅(qū)動程序。現(xiàn)在已經(jīng)開發(fā)出來的驅(qū)動適用于Zc030x PLUS這一系列的攝像頭。Samstmg 2410為實(shí)驗(yàn)的硬件平臺。
1 WinCE5.0下USB總線驅(qū)動框架
USB系統(tǒng)由USB主機(jī)、一個(gè)或多個(gè)USB設(shè)備和物理總線組成。主機(jī)上又分兩層:較高的包含USB設(shè)備驅(qū)動程序的軟件層和主機(jī)控制器硬件層,也稱作“適配層”。主機(jī)的主要任務(wù)是控制對USB設(shè)備的雙向數(shù)據(jù)傳輸。物理總線是一組USB電纜,用來將控制器和外圍設(shè)備連接起來。WinCE5.0的USB系統(tǒng)軟件由兩層組成:USB設(shè)備驅(qū)動程序?qū)雍偷讓拥挠蒞inCE5.0實(shí)現(xiàn)的USB函數(shù)層。
USB設(shè)備驅(qū)動程序使用USB函數(shù)來建立與它們所控制設(shè)備的連接,并對這些設(shè)備進(jìn)行配置和通信。較低的USB函數(shù)層本身又由兩部分組成——較高的通用串行總線驅(qū)動程序(USBD)模塊和較低的主控制器驅(qū)動程序(HCD)模塊。HCD提供了抽象的主機(jī)控制器,且對主機(jī)控制器所見到的USB系統(tǒng)的數(shù)據(jù)傳輸進(jìn)行抽象。USBD提供一個(gè)抽象的設(shè)備,且對USBD客戶和USB設(shè)備功能部件之間的數(shù)據(jù)傳輸進(jìn)行抽象。USB設(shè)備驅(qū)動程序使用USBD接口函數(shù)與外圍設(shè)備進(jìn)行通信。
IHV和USB設(shè)備制造商利用USBD提供的函數(shù)來實(shí)現(xiàn)USB設(shè)備的驅(qū)動程序。OEM負(fù)責(zé)給基于WinCE的平臺提供HCD模塊,這樣相應(yīng)的硬件才能與USBD模塊進(jìn)行交互。圖1說明了與主機(jī)的USB硬件和外圍設(shè)備相對應(yīng)的軟件的各個(gè)層。
2 WinCE5.0下流驅(qū)動模型
基于WinCE5.0平臺的兩種專用的驅(qū)動模型為:本機(jī)設(shè)備驅(qū)動程序和流接口驅(qū)動程序。本機(jī)設(shè)備驅(qū)動程序適合于集成到WinCE 5.0 平臺的設(shè)備;而后者則是一般類型的設(shè)備驅(qū)動程序,適用于大部分外圍設(shè)備,如調(diào)制解調(diào)器、打印機(jī)等。對大多數(shù)USB外圍設(shè)備來說,適用于采用流接口驅(qū)動程序模型來開發(fā)驅(qū)動程序。
流接口驅(qū)動程序是一種可以定制接口的驅(qū)動模型,一般由設(shè)備管理器負(fù)責(zé)管理。它把設(shè)備管理器和應(yīng)用程序的命令轉(zhuǎn)換成所控設(shè)備的適當(dāng)動作所需信息。流接口驅(qū)動程序需要實(shí)現(xiàn)一組固定的流接口函數(shù),供給WinCE5.0系統(tǒng)內(nèi)核使用。
USB設(shè)備的流接口驅(qū)動程序和WinCE5.0系統(tǒng)其他部件間的關(guān)系如圖2所示。流接口驅(qū)動程序通過系統(tǒng)提供的文件系統(tǒng)API與應(yīng)用程序交互;而系統(tǒng)通過設(shè)備管理器完成對流接口驅(qū)動程序的加載、卸載等管理工作;流接口驅(qū)動程序通過調(diào)用USBD模塊提供的接口函數(shù)實(shí)現(xiàn)與底層USB設(shè)備通信。
本文使用的流接口函數(shù)方法如表1所列。
USB設(shè)備驅(qū)動程序必須輸出的函數(shù)有:
①USBDeviecAttach()。當(dāng)USB設(shè)備連接到計(jì)算機(jī)上時(shí),USBD模塊就會調(diào)用此函數(shù)。這個(gè)函數(shù)主要用于初始化USB設(shè)備,取得USB設(shè)備信息,配置USB設(shè)備,并且申請必需的資源。
②USBInstallDriver ()。主要用于創(chuàng)建一個(gè)驅(qū)動程序加載所需的注冊表信息,例如讀/寫超時(shí)、設(shè)備名稱等。
③USBUninstallDriver ()。主要用于釋放驅(qū)動程序所占用的資源,以及刪除UsbInstallDriver ()函數(shù)創(chuàng)建的注冊表等。
上述3個(gè)函數(shù)接口是所有的USB驅(qū)動程序必須提供的,缺一不可。
另外較為重要的是USB設(shè)備驅(qū)動程序的注冊表配置。一般的USB設(shè)備驅(qū)動程序的注冊表配置在[HKEY_LOCAL_M(jìn)ACHINE\Drivers\USB\LoadClients\口]下,每個(gè)驅(qū)動程序的子鍵都有Group 1_ID\Group2_ID\Group3_ID\DriverName 格式,設(shè)備的子鍵由供應(yīng)商、設(shè)備類和協(xié)議信息通過下劃線組成。表2列出了允許的組合。