詳解WinCE下USB Host驅動開發 1

2021-05-27 17:09:52 字數 2487 閱讀 3313

wince下所有的驅動都是以dll的形式,被device.exe程序載入的,所以每個驅動程式中都要實現dllentry函式。

在登錄檔的hkey_local_machine\drivers\usb\loadclients\鍵下儲存了usb host的驅動程式資訊。當我們第一次插入usb裝置時。因為不存在這樣的資訊,所以系統會彈出乙個「

未能識別的usb裝置」的對話方塊,要求使用者輸入驅動程式的名稱。該名稱就是usb host驅動dll的檔名。在輸入了名稱後,系統會自動呼叫該dll的usbinstalldriver函式。該函式

負責向登錄檔新增usb host驅動的資訊,以便再次插入裝置時,能夠識別該usb裝置。其原型如下:

bool usbinstalldriver(lpcwstr szdriverlibfile);

其中szdriverlibfile就是輸入的dll檔名稱。返回true表示註冊成功。

在向登錄檔註冊usb host資訊時,不能使用普通的登錄檔函式,只能使用usbd提供的註冊函式。

bool registerclientdriverid(lpcwstr szuniquedriverid);

bool registerclientsettings(lpcwstr szdriverlibfile, lpcwstr             szuniquedriverid, lpcwstr erved, lpcusb_driver_settings lpdriversettings);

這兩個函式在usbd.dll中,可以通過動態方式呼叫,也可以通過靜態方式呼叫。

動態方式如下:

hinstance hinst = loadlibrary(l"usbd.dll");

if(hinst) usb_driver_settings;

count為結構體大小,其他項對應usb描述符。

其中除count外的各欄位,如果不設定具體的值,可以設定為usb_no_info。

這個結構體中的資訊講反應到登錄檔的hkey_local_machine\drivers\usb\loadclients\鍵下,用於在usb裝置插入時,查詢usb驅動。下面以乙個例子說明:

bool usbinstalldriver(lpcwstr szdriverlibfile)

else

retailmsg(1,(text("registerclientdriverid error\r\n")));

return fret; }

在wince中,將設定資訊分為了三組,每組3個值,

第一組:

dwvendorid、dwproductid、dwreleasenumber

第二組:

dwdeviceclass、dwdevicesubclass、dwdeviceprotocol

第三組:

dwinte***ceclass、dwinte***cesubclass、dwinte***ceprotocol

如果註冊成功,將會在hkey_local_machine\drivers\usb\loadclients\鍵下出現 「第一組\第二組\第三組\註冊id\dll」這樣的建,鍵值為dll驅動名稱。其中每組又是由三個值中間加下劃線組成。如果有乙個值設定為usb_no_info,則鍵名不包括該值。如果整個組中每個值都設定成usb_no_info,則鍵名為default。

據上面的例子,在我的系統下,將會生成如下鍵名:

hkey_local_machine\drivers\usb\loadclients\4292_3\default\0_0_0\usbtest\dll = "myusbtest" (我的驅動程式為myusbtest.dll)

當使用者插入usb裝置時,它會讀取usb裝置的描述符,根據描述符中的值在登錄檔中查詢驅動程式名稱。

現在假設,我們要wince只支援usb鍵盤,另外我們自己實現乙個usb滑鼠驅動程式。如果不加注意,我們的usb滑鼠驅動程式將不能被呼叫。原因正是在於這個查詢usb裝置驅動的過程。wince提供的usbhid驅動程式的登錄檔資訊是

hkey_local_machine\drivers\usb\loadclients\default\default\3\hid_class\dll = "usbhid.dll"

其中第三組資訊只使用了dwinte***ceclass,而usb鍵盤和usb滑鼠只有dwinte***ceprotocol不同。所以,乙個3概括了所有的hid,當我們的usb滑鼠插入系統後,將會呼叫usbhid.dll驅動程式處理,但是它只包括鍵盤的驅動,沒有滑鼠的驅動,所以滑鼠不能使用。要想使得自定義的usb滑鼠可以使用,則將第三組的值都設定上,如下:

hkey_local_machine\drivers\usb\loadclients\default\default\3_1_1\hid_class\dll = "usbhid.dll"

如此一來,當值為3_1_2的滑鼠插入後,因為找不到對應的鍵值,將提示要求我們輸入usb滑鼠的驅動。

詳解WinCE下USB Host驅動開發 1

wince下所有的驅動都是以dll的形式,被device.exe程序載入的,所以每個驅動程式中都要實現dllentry函式。在登錄檔的hkey local machine drivers usb loadclients 鍵下儲存了usb host的驅動程式資訊。當我們第一次插入usb裝置時。因為不存...

WinCE下Socket程式設計

wince下socket程式設計 wince 不支援win32中socket非同步類 那個mfc類忘記啥名字了 在軟體開發中 網路程式設計 是必不可少的基本功了 本文所講的 socket 程式設計也就是網路程式設計中的一種形式 當然你如果想問我什麼叫 socket 很遺憾的是我也不能準確的告訴你!但...

詳解WINCE的控制面板

extern c message case cpl dblclk case cpl stop called once for each dialog box.used for cleanup.case default return 0 return codearea codearea pre lin...