WinCE平臺(tái)USB攝像頭驅(qū)動(dòng)開發(fā)流程
二.USB攝像頭流驅(qū)動(dòng)的實(shí)現(xiàn)過(guò)程
WinCE系統(tǒng)下的 USB 攝像頭驅(qū)動(dòng)程序的編寫不同于在 Windows系統(tǒng)下的編寫,因?yàn)樵赪inCE中對(duì)USB設(shè)備驅(qū)動(dòng)開發(fā)只提供了底層支持。所以,在 WinCE系統(tǒng)下必須要根據(jù)所選擇的USB攝像頭的硬件特性自行編寫驅(qū)動(dòng)程序。根據(jù)我在這次項(xiàng)目中得到的實(shí)踐經(jīng)驗(yàn),具體可以分為以下三個(gè)步驟:
(1)創(chuàng)建USBD函數(shù)控制模塊
從上述的WinCE USB設(shè)備驅(qū)動(dòng)模型及結(jié)構(gòu)分析圖中,我們可以清晰的看到主機(jī)和USB外設(shè)之間的實(shí)現(xiàn)方式。因此,我們首先需要編寫USB Client Driver。也就是說(shuō),我們首先需要利用USBD提供的接口針對(duì)特定的物理設(shè)備來(lái)完成USB攝像頭客戶端驅(qū)動(dòng)程序。雖然WinCE 沒(méi)有提供USBD的標(biāo)準(zhǔn)機(jī)制,但是編寫USBD 可供采用的方法有:①是使用流接口函數(shù);②是使用現(xiàn)有的WinCE 應(yīng)用程序編程接口(API);③是創(chuàng)建用戶指定的API。
根據(jù)在這個(gè)項(xiàng)目的多次實(shí)踐經(jīng)驗(yàn),我在編寫 USB攝像頭驅(qū)動(dòng)時(shí)采用了流接口驅(qū)動(dòng)模式,該驅(qū)動(dòng)程序的位置是位于 USBD 協(xié)議棧層上,屬于控制具體設(shè)備功能的客戶端驅(qū)動(dòng)程序。然后,我把流接口驅(qū)動(dòng)程序的流接口函數(shù)設(shè)計(jì)為匹配系統(tǒng)的文件系統(tǒng)API函數(shù)形式。通過(guò)這種機(jī)制方式,USB攝像頭就可在流接口的管理下通過(guò)文件系統(tǒng)API暴露給應(yīng)用層,這樣應(yīng)用層就可把USB攝像頭作為一種特殊的文件進(jìn)行操作,從而達(dá)到對(duì)USB攝像頭的控制。
(2)創(chuàng)建控制USB攝像頭的各種流接口函數(shù)
從結(jié)構(gòu)分析我們可知,所有的USB設(shè)備驅(qū)動(dòng)程序必須在它們的DLL庫(kù)設(shè)置一定的入口點(diǎn)函數(shù)與USBD模塊進(jìn)行適當(dāng)?shù)慕换?。設(shè)置入口點(diǎn)函數(shù)有兩個(gè)作用:一是使得 USBD 模塊能與外部設(shè)備交互;二是使得驅(qū)動(dòng)程序能創(chuàng)建和管理任何可能需要的注冊(cè)鍵。
因此,在編寫USB攝像頭驅(qū)動(dòng)程序時(shí)有一個(gè)重要的步驟,就是要?jiǎng)?chuàng)建和實(shí)現(xiàn)三個(gè)入口函數(shù) USBDeviceAttach(),USBInstallDriver(),USBUninstallDriver()。實(shí)現(xiàn)這三個(gè)入口函數(shù)的主要目的是為了使客戶端驅(qū)動(dòng)與系統(tǒng)的 USBD協(xié)議棧進(jìn)行聯(lián)系。因?yàn)樵赨SB攝像頭接到主機(jī)后,USBD模塊會(huì)調(diào)用這個(gè)函數(shù)來(lái)初始化USB設(shè)備,取得USB設(shè)備信息和配置USB設(shè)備,并且申請(qǐng)必需的資源。USBInstallDrive是在第一次加載USB設(shè)備驅(qū)動(dòng)程序時(shí)首先被調(diào)用,它使得驅(qū)動(dòng)程序能創(chuàng)建需要的注冊(cè)鍵。但需要值得注意的是,USB設(shè)備驅(qū)動(dòng)程序不是使用標(biāo)準(zhǔn)的注冊(cè)表函數(shù),而是使用RegisterClientDriverID()、RegisterClientSettings()函數(shù)來(lái)注冊(cè)相應(yīng)的設(shè)備信息。USBUninstallDriver則是在用戶刪除USB設(shè)備驅(qū)動(dòng)程序時(shí)調(diào)用,負(fù)責(zé)刪除注冊(cè)鍵并釋放其它相關(guān)資源。同樣,它是通過(guò)調(diào)用UnRegisterClientSettings()和UnRegisterClientDriverID()函數(shù)來(lái)刪除由驅(qū)動(dòng)程序的USBInstallDriver()函數(shù)創(chuàng)建的所有注冊(cè)鍵。因此,我們?cè)隍?qū)動(dòng)程序中需要嚴(yán)格按照這三個(gè)函數(shù)的原型來(lái)實(shí)現(xiàn),否則就不能為設(shè)備管理器所識(shí)別。
(3)在注冊(cè)表中配置USB攝像頭驅(qū)動(dòng)信息
USB攝像頭一般是使用需要時(shí)才加載的方式來(lái)加載的,因此在設(shè)備加載時(shí)會(huì)先檢查設(shè)備的相關(guān)信息。在WinCE系統(tǒng)中,這些相關(guān)的設(shè)備配置信息都是存儲(chǔ)在系統(tǒng)注冊(cè)表中的。所以,內(nèi)核系統(tǒng)會(huì)先訪問(wèn)注冊(cè)表以獲得必要的相關(guān)信息。例如,USBD模塊會(huì)使用一組跟蹤驅(qū)動(dòng)程序和設(shè)備的注冊(cè)鍵來(lái)定位正確的驅(qū)動(dòng)程序。如果注冊(cè)表信息與 USB 設(shè)備信息符合,USBD就會(huì)加載此驅(qū)動(dòng)程序,否則 USBD 就不會(huì)加載此程序。因此,編寫USB攝像頭驅(qū)動(dòng)程序的最后一個(gè)關(guān)鍵步驟,就是要正確的在注冊(cè)表中配置相關(guān)的USB 攝像頭驅(qū)動(dòng)信息。
評(píng)論