wince USB網路攝影機驅動學習筆記(修改中)

來源:互聯網
上載者:User

USB流驅動與普通流驅動相比,即有很多相同點,又有若干不同。這與USB裝置的工作方式、USB協議等有密不可分的關係。最直觀的,就是除了XXX_Init、XXX_Open等十個標準流驅動介面函數外,還多了三個特殊的入口函數:USBInstallDriver()、USBDeviceAttach()、USBUnInstallDriver()。下面結合USB驅動啟動流程分別對其簡單介紹。

一、USB驅動啟動流程

WinCE下所有的USB流驅動一般是以DLL(動態連結程式庫)的形式儲存在系統中。當USB裝置插入後,WINCE的裝置管理員就會在註冊表的HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients\鍵下搜尋新插入USB裝置的相關資訊(具體將在後面提到)。

這裡我們假設第一次插入裝置,系統未搜尋到驅動資訊,就會彈出一個“未能識別的USB裝置”的對話方塊,要求使用者輸入驅動程式的名稱(即DLL檔案的檔案名稱)。在輸入名稱後,系統會自動調用該DLL的USBInstallDriver函數。該函數負責向註冊表添加USB Host驅動的資訊,以便再次插入裝置時,能夠識別該USB裝置。其原型如下:

BOOL USBInstallDriver(LPCWSTRszDriverLibFile)

szDriverLibFile:輸入的DLL檔案名稱。

傳回值:TRUE表示註冊成功,FALSE表示註冊失敗。

總而言之,USBInstallDriver函數就是在註冊表的Drivers\USB\LoadClients\和Drivers\USB\ClientDrivers下寫入相關資訊。

寫入LoadClients時,必須使用兩個USBD提供的註冊函數:

BOOL RegisterClientDriverID(LPCWSTR szUniqueDriverId)

BOOL RegisterClientSettings(LPCWSTR szDriverLibFile, LPCWSTR szUniqueDriverId,LPCWSTR erved, LPCUSB_DRIVER_SETTINGS lpDriverSettings)

常式裡這兩個函數一般先用LoadLibrary開啟USBD.DLL,再通過GetProcAddress通過函數指標來動態調用。

需要注意的是lpDriverSettings參數是一個USB_DRIVER_SETTINGS結構體。其聲明如下:
typedef struct {
DWORD dwCount;
DWORD dwVendorId;
DWORD dwProductId;
DWORD dwReleaseNumber;
DWORD dwDeviceClass;
DWORD dwDeviceSubClass;
DWORD dwDeviceProtocol;
DWORD dwInterfaceClass;
DWORD dwInterfaceSubClass;
DWORD dwInterfaceProtocol;
} USB_DRIVER_SETTINGS;
Count為結構體大小,其他項對應USB描述符。其中除Count外的各欄位,如果不設定具體的值,可以設定為USB_NO_INFO。
在WinCE中,這些設定資訊分為了三組,每組3個值,
第一組:

dwVendorId、dwProductId、dwReleaseNumber
第二組:

dwDeviceClass、dwDeviceSubClass、dwDeviceProtocol
第三組:

dwInterfaceClass、dwInterfaceSubClass、dwInterfaceProtocol

如果註冊成功,將會在HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients\鍵下出現 “第一組\第二組\第三組\註冊ID(這個由RegisterClientDriverID確定)\DLL”這樣的建,索引值為DLL驅動名稱。其中每組又是由三個值中間加底線組成。如果有一個值設定為USB_NO_INFO,則鍵名不包括該值。如果整個組中每個值都設定成USB_NO_INFO,則鍵名為Default。

例如,如果我們將lpDriverSettings配置為:

DriverSettings.dwCount= sizeof(DriverSettings);
DriverSettings.dwVendorId = 0x10C4;
DriverSettings.dwProductId = 0x0003;
DriverSettings.dwReleaseNumber = USB_NO_INFO;

DriverSettings.dwDeviceClass = USB_NO_INFO;
DriverSettings.dwDeviceSubClass = USB_NO_INFO;
DriverSettings.dwDeviceProtocol = USB_NO_INFO;

DriverSettings.dwInterfaceClass = 0;
DriverSettings.dwInterfaceSubClass = 0;
DriverSettings.dwInterfaceProtocol = 0;

那麼,在我的系統下,將會產生如下鍵名:HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients\4292_3\Default\0_0_0\USBTest\DLL= "WebCam" (我的驅動程式為WebCam.dll)。這樣系統就能通過註冊表識別到驅動程式。

寫入ClientDrivers就比較簡單,用GetSetKeyValues()就行了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.