




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、WinCE下所有的驅(qū)動都是以DLL的形式,被device.exe進(jìn)程加載的,所以每個驅(qū)動程序中都要實現(xiàn)DllEntry函數(shù)。 在注冊表的HKEY_LOCAL_MACHINEDriversUSBLoadClients鍵下保存了USB Host的驅(qū)動程序信息。當(dāng)我們第一次插入USB設(shè)備時。因為不存在這樣的信息,所以系統(tǒng)會彈出一個“ 未能識別的USB設(shè)備”的對話框,要求用戶輸入驅(qū)動程序的名稱。該名稱就是USB Host驅(qū)動DLL的文件名。在輸入了名稱后,系統(tǒng)會自動調(diào)用該DLL的USBInstallDriver函數(shù)。該函數(shù) 負(fù)責(zé)向注冊表添加USB Host驅(qū)動的信息,以便再次插入設(shè)備時,能夠識別該US
2、B設(shè)備。其原型如下: BOOL USBInstallDriver(LPCWSTR szDriverLibFile; 其中szDriverLibFile就是輸入的DLL文件名稱。返回TRUE表示注冊成功。 在向注冊表注冊USB Host信息時,不能使用普通的注冊表函數(shù),只能使用USBD提供的注冊函數(shù)。 BOOL RegisterClientDriverID(LPCWSTR szUniqueDriverId; BOOL RegisterClientSettings(LPCWSTR szDriverLibFile, LPCWSTR szUniqueDriverId, LPCWSTR erved, L
3、PCUSB_DRIVER_SETTINGS lpDriverSettings; 這兩個函數(shù)在USBD.DLL中,可以通過動態(tài)方式調(diào)用,也可以通過靜態(tài)方式調(diào)用。 動態(tài)方式如下: HINSTANCE hInst = LoadLibrary(LUSBD.DLL; if(hInst LPREGISTER_CLIENT_DRIVER_ID lpRegisterClientId = (LPREGISTER_CLIENT_DRIVER_IDGetProcAddress( hInst, LRegisterClientDriverID; if(!lpRegisterClientId return FALSE;
4、LPREGISTER_CLIENT_SETTINGS lpRegisterClientSetting = (LPREGISTER_CLIENT_SETTINGSGetProcAddress( hInst, LRegisterClientSettings; if(!lpRegisterClientSetting return FALSE; else return FALSE; 此后,就可以通過lpRegisterClientId和lpRegisterClientSetting函數(shù)指針調(diào)用這些函數(shù),最后記得要FreeLibrary。 靜態(tài)方式: 在.cpp源文件中加入 #pragma commen
5、t(lib,usbd.lib 并在source文件的TARGETLIBS變量中加入$(_SYSGENOAKROOTlib$(_CPUINDPATHusbd.lib 如此一來,就可以直接使用這兩個函數(shù)了。 1 BOOL RegisterClientDriverID(LPCWSTR szUniqueDriverId 該函數(shù)注冊USB Host驅(qū)動程序的ID。 2 BOOL RegisterClientSettings(LPCWSTR szDriverLibFile, LPCWSTR szUniqueDriverId, LPCWSTR erved, LPCUSB_DRIVER_SETTINGS lp
6、DriverSettings 該函數(shù)負(fù)責(zé)注冊驅(qū)動程序的信息。 szDriverLibFile 設(shè)置為USBInstallDriver函數(shù)傳入的DLL驅(qū)動程序名稱。 szUniqueDriverId 設(shè)置為調(diào)用RegisterClientDriverID注冊的驅(qū)動程序ID。 erved 設(shè)置為NULL lpDriverSettings 該參數(shù)是一個USB_DRIVER_SETTINGS結(jié)構(gòu)體。其聲明如下: typedef struct DWORD dwCount; DWORD dwVendorId; DWORD dwProductId; DWORD dwReleaseNumber; DWORD
7、dwDeviceClass; DWORD dwDeviceSubClass; DWORD dwDeviceProtocol; DWORD dwInterfaceClass; DWORD dwInterfaceSubClass; DWORD dwInterfaceProtocol; USB_DRIVER_SETTINGS; Count為結(jié)構(gòu)體大小,其他項對應(yīng)USB描述符。 其中除Count外的各字段,如果不設(shè)置具體的值,可以設(shè)置為USB_NO_INFO。 這個結(jié)構(gòu)體中的信息講反應(yīng)到注冊表的HKEY_LOCAL_MACHINEDriversUSBLoadClients鍵下,用于在USB設(shè)備插入時,
8、查找USB驅(qū)動。下面以一個例子說明: BOOL USBInstallDriver(LPCWSTR szDriverLibFile RETAILMSG(1,(TEXT(USBInstallDriverrn; RETAILMSG(1,(TEXT(USBInstallDriver:%srn, szDriverLibFile; BOOL fRet = FALSE; USB_DRIVER_SETTINGS DriverSettings; DriverSettings.dwCount = sizeof(DriverSettings; DriverSettings.dwVendorId = 0x10C4;
9、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; Dr
10、iverSettings.dwInterfaceProtocol = 0; fRet = RegisterClientDriverID(LUSBTest; if (fRet fRet = RegisterClientSettings( szDriverLibFile, LUSBTest, NULL, &DriverSettings; if(!fRet RETAILMSG(1,(TEXT(RegisterClientSettings errorrn; else RETAILMSG(1,(TEXT(RegisterClientDriverID errorrn; return fRet; 在WinC
11、E中,將設(shè)置信息分為了三組,每組3個值, 第一組: dwVendorId、dwProductId、dwReleaseNumber 第二組: dwDeviceClass、dwDeviceSubClass、dwDeviceProtocol 第三組: dwInterfaceClass、dwInterfaceSubClass、dwInterfaceProtocol 如果注冊成功,將會在HKEY_LOCAL_MACHINEDriversUSBLoadClients鍵下出現(xiàn) “第一組第二組第三組注冊IDDLL”這樣的建,鍵值為DLL驅(qū)動名稱。其中每組又是由三個值中間加下劃線組成。如果有一個值設(shè)置為USB_
12、NO_INFO,則鍵名不包括該值。如果整個組中每個值都設(shè)置成USB_NO_INFO,則鍵名為Default。 據(jù)上面的例子,在我的系統(tǒng)下,將會生成如下鍵名: HKEY_LOCAL_MACHINEDriversUSBLoadClients4292_3Default0_0_0USBTestDLL = MyUSBTest (我的驅(qū)動程序為MyUSBTest.dll 當(dāng)用戶插入USB設(shè)備時,它會讀取USB設(shè)備的描述符,根據(jù)描述符中的值在注冊表中查找驅(qū)動程序名稱。 現(xiàn)在假設(shè),我們要WinCE只支持USB鍵盤,另外我們自己實現(xiàn)一個USB鼠標(biāo)驅(qū)動程序。如果不加注意,我們的USB鼠標(biāo)驅(qū)動程序?qū)⒉荒鼙徽{(diào)用。原因
13、正是在于這個查找USB設(shè)備驅(qū)動的過程。WINCE提供的USBHID驅(qū)動程序的注冊表信息是 HKEY_LOCAL_MACHINEDriversUSBLoadClientsDefaultDefault3Hid_ClassDLL = USBHID.DLL 其中第三組信息只使用了dwInterfaceClass,而USB鍵盤和USB鼠標(biāo)只有dwInterfaceProtocol不同。所以,一個3概括了所有的HID,當(dāng)我們的USB鼠標(biāo)插入系統(tǒng)后,將會調(diào)用USBHID.DLL驅(qū)動程序處理,但是它只包括鍵盤的驅(qū)動,沒有 鼠標(biāo)的驅(qū)動,所以鼠標(biāo)不能使用。要想使得自定義的USB鼠標(biāo)可以使用,則將第三組的值都設(shè)置上
14、,如下: HKEY_LOCAL_MACHINEDriversUSBLoadClientsDefaultDefault3_1_1Hid_ClassDLL = USBHID.DLL 如此一來,當(dāng)值為3_1_2的鼠標(biāo)插入后,因為找不到對應(yīng)的鍵值,將提示要求我們輸入USB鼠標(biāo)的驅(qū)動。 當(dāng)用戶需要卸載USB Host設(shè)備驅(qū)動時,將會調(diào)用USBUnInstallDriver函數(shù) BOOL USBUnInstallDriver(; 它與USBInstallDriver類似,不過是調(diào)用如下兩個函數(shù) UnRegisterClientSettings BOOL UnRegisterClientSettings(L
15、PCWSTR szUniqueDriverId, LPCWSTR szReserved, LPCUSB_DRIVER_SETTINGS lpDriverSettings; BOOL UnRegisterClientDriverID(LPCWSTR szUniqueDriverId; 其中szUniqueDriverId是注冊時,使用的ID,szReserved保留,故設(shè)置為NULL,lpDriverSettings則是驅(qū)動程序設(shè)置信息。 例程如下: BOOL USBUnInstallDriver( RETAILMSG(1,(TEXT(USBUninstallDriverrn; BOOL fRe
16、t = FALSE; USB_DRIVER_SETTINGS DriverSettings; DriverSettings.dwCount = sizeof(DriverSettings; DriverSettings.dwVendorId = 0x10C4; DriverSettings.dwProductId = 0x0003; DriverSettings.dwReleaseNumber = USB_NO_INFO; DriverSettings.dwDeviceClass = USB_NO_INFO; DriverSettings.dwDeviceSubClass = USB_NO_I
17、NFO; DriverSettings.dwDeviceProtocol = USB_NO_INFO; DriverSettings.dwInterfaceClass = 0; DriverSettings.dwInterfaceSubClass = 0; DriverSettings.dwInterfaceProtocol = 0; fRet = UnRegisterClientSettings(LUSBTest, NULL, &DriverSettings; if(fRet fRet = UnRegisterClientDriverID(LUSBTest; if(!fRet RETAILM
18、SG(1,(TEXT(UnRegisterClientDriverID errorrn; else RETAILMSG(1,(TEXT(UnRegisterClientSettings errorrn; return fRet; 其中DriverSettings必須與USBInstallDriver的DriverSettings一致。 回到原來的流程,WinCE注冊表中已經(jīng)包含了驅(qū)動信息,WinCE系統(tǒng)自動查找注冊表,在找到設(shè)備對應(yīng)鍵值的DLL后,將會調(diào)用該DLL的USBDeviceAttach函數(shù)。 BOOL USBDeviceAttach( USB_HANDLE hDevice, LPCU
19、SB_FUNCS lpUsbFuncs, LPCUSB_INTERFACE lpInterface, LPCWSTR szUniqueDriverId, LPBOOL fAcceptControl, DWORD dwUnused hDevice 設(shè)備句柄,操作USB設(shè)備時,需要使用該句柄 lpUsbFuncs 指向一個包含各種USB操作的函數(shù)指針 lpInterface USB接口信息,這里需要注意的是,如果在DriverSettings里dwInterfaceClass、dwInterfaceSubClass、dwInterfaceProtocol設(shè)置為USB_NO_INFO,則該指針為NU
20、LL szUniqueDriverId 注冊設(shè)備ID fAcceptControl 該值被賦值為TRUE,表示該驅(qū)動能操作該設(shè)備。如果不能操作該設(shè)備,則“未能識別的USB設(shè)備”對話框會再次出現(xiàn),要求用戶輸入驅(qū)動程序名稱 dwUnused 未使用 在該函數(shù)內(nèi),主要是做一些檢查,判斷是否能驅(qū)動設(shè)備,還有就是注冊USB事件通知回調(diào)函數(shù),以 及激活流驅(qū)動。對于檢查部分,這里不再詳細(xì)說明。 首先,介紹一下激活流驅(qū)動。 流驅(qū)動為應(yīng)用程序提供了一個訪問設(shè)備的接口,利用該接口可以像訪問文件一樣訪問設(shè)備。USB設(shè)備同樣可以使用該接口來為應(yīng)用程序提供支持。在注冊表的 HKEY_LOCAL_MACHINEDrive
21、rsBuiltIn鍵下,保存了各種WinCE內(nèi)建流驅(qū)動程序的入口。這些驅(qū)動通過device.exe在系統(tǒng)啟動時被激活。像USB這樣的設(shè)備,只有插入時,才存在流 驅(qū)動接口,所以我們需要手動激活流驅(qū)動。激活流驅(qū)動的函數(shù)是: HANDLE ActivateDevice(LPCWSTR lpszDevKey, DWORD dwClientInfo; lpszDevKey 字符串指明了流驅(qū)動所在注冊表的鍵。獲悉流驅(qū)動的人都知道,流驅(qū)動在注冊表中必須包含兩個鍵Prefix和Dll。 流驅(qū)動中所有接口函數(shù)都有類似XXX_的前綴,而這個Prefix則指明XXX對應(yīng)的字符串,如Prefix為COM,則流驅(qū)動包含
22、如COM_Open、COM_Close、COM_Write、COM_Read這樣接口函數(shù)。Dll則說明了這些函數(shù)所在的動態(tài)鏈接庫。 在我的例子中存在如下的注冊表鍵: HKEY_LOCAL_MACHINEDriversUSBClientDriversUSBTest Prefix=TST Dll=MyUSBTest.dll 通過dwClientInfo,可以把參數(shù)間接傳給驅(qū)動的XXX_init。我們可以把hDevice、lpUsbFuncs、lpInterface這樣信息放置在一個結(jié)構(gòu)體中,通過該函數(shù)傳遞給流驅(qū)動使用。 USB通知回調(diào)函數(shù),可以用來判斷各種USB事件的發(fā)生,如USB拔出。當(dāng)發(fā)生事件
23、后,系統(tǒng)會根據(jù)注冊的回調(diào)函數(shù)做相應(yīng)的處理,在USB設(shè)備拔出后,所要做的事情,就是卸載流驅(qū)動,并釋放占用的各種資源。 注冊回調(diào)函數(shù)是一個包含在lpUsbFuncs中的函數(shù)指針: LPUN_REGISTER_NOTIFICATION_ROUTINE lpUnRegisterNotificationRoutine 該函數(shù)的聲明如下: typedef BOOL (* LPREGISTER_NOTIFICATION_ROUTINE( USB_HANDLE hDevice, LPDEVICE_NOTIFY_ROUTINE lpNotifyRoutine, LPVOID lpvNotifyParameter
24、 ; hDevice 設(shè)備句柄 lpNotifyRoutine 回調(diào)函數(shù) lpvNotifyParameter 傳遞給回調(diào)函數(shù)的參數(shù) 在回調(diào)函數(shù)中卸載流驅(qū)動使用 BOOL DeactivateDevice(HANDLE hDevice; 其中,hDevice 傳入ActivateDevice時返回的句柄。 下面是具體的示例: typedef struct DWORD dwSize; USB_HANDLE hDevice, LPCUSB_FUNCS lpUsbFuncs, LPCUSB_INTERFACE lpInterface, HANDLE hStreamDevice; TESTUSBINF
25、O, PTESTUSBINFO; /回調(diào)函數(shù) extern C BOOL USBDeviceNotifications( LPVOID lpvNotifyParameter, DWORD dwCode, LPDWORD *dwInfo1, LPDWORD *dwInfo2, LPDWORD *dwInfo3, LPDWORD *dwInfo4 if (dwCode = USB_CLOSE_DEVICE PTESTUSBINFO pDrv = (PDRVCONTEXT lpvNotifyParameter; DeactivateDevice(pDrv-hStreamDevice; /卸載流驅(qū)動
26、LocalFree(pDrv; /釋放資源 RETAILMSG(1,(TEXT(Free Driver Resources!rn; return TRUE; BOOL USBDeviceAttach( USB_HANDLE hDevice, LPCUSB_FUNCS lpUsbFuncs, LPCUSB_INTERFACE lpInterface, LPCWSTR szUniqueDriverId, LPBOOL fAcceptControl, DWORD dwUnused RETAILMSG(1,(TEXT(USBDeviceAttachrn; *fAcceptControl = FALSE
27、; /顯示USB設(shè)備的一些信息 if(lpInterface != NULL RETAILMSG(1,(TEXT(usbserialhost: DeviceAttach, IF %u, #EP:%u, Class:%u, Sub:%u, Prot:%urn, lpInterface-Descriptor.bInterfaceNumber, lpInterface-Descriptor.bNumEndpoints, lpInterface-Descriptor.bInterfaceClass, lpInterface-Descriptor.bInterfaceSubClass, lpInterface-Descriptor.bInterfaceProtocol; RETAILMSG(1,(TEXT(Endpoint 1:%urn, lpInterface-lpEndpoints0.Descriptor.bmAttributes; RETAILMSG(1,(TEXT(Endpoint 2:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)并購重組財務(wù)顧問與法律顧問合作協(xié)議
- 能源企業(yè)財務(wù)預(yù)測與預(yù)算編制合同
- 公共車庫租賃與智能停車誘導(dǎo)系統(tǒng)升級合同
- 有限空間作業(yè)氣體報警
- 二外日本語優(yōu)秀テキスト
- 經(jīng)濟部門工作總結(jié)
- 吸煙有害健康大班公開課
- 大學(xué)生心理健康與成長
- 藥毒中醫(yī)護(hù)理方案
- 醫(yī)院新進(jìn)人員院感崗前培訓(xùn)
- AQ/T 2077-2020 頁巖氣井獨立式帶壓作業(yè)機起下管柱作業(yè)安全技術(shù)規(guī)范(正式版)
- 【8物(滬科版)】合肥市第四十五中學(xué)2023-2024學(xué)年八年級下學(xué)期期末物理試題
- 區(qū)域代理商合同模板
- 國家開放大學(xué)(浙江)地域文化(本)作業(yè)1-5
- HG/T 2520-2023 工業(yè)亞磷酸 (正式版)
- 會所會員管理制度
- DZ/T 0462.8-2023 礦產(chǎn)資源“三率”指標(biāo)要求 第8部分:硫鐵礦、磷、硼、天然堿、鈉硝石(正式版)
- 廣東省廣州市海珠區(qū)2024年七年級下冊數(shù)學(xué)期末試卷附答案
- 湖南省長沙市芙蓉區(qū)2022-2023學(xué)年一年級下學(xué)期期末測試數(shù)學(xué)試卷
- JT-T 1495-2024 公路水運危險性較大工程專項施工方案編制審查規(guī)程
- 肝動脈化療栓塞術(shù)及護(hù)理
評論
0/150
提交評論