




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、WinCE下所有的驅(qū)動(dòng)都是以DLL的形式,被device.exe進(jìn)程加載的,所以每個(gè)驅(qū)動(dòng)程序中都要實(shí)現(xiàn)DllEntry函數(shù)。 在注冊(cè)表的HKEY_LOCAL_MACHINEDriversUSBLoadClients鍵下保存了USB Host的驅(qū)動(dòng)程序信息。當(dāng)我們第一次插入U(xiǎn)SB設(shè)備時(shí)。因?yàn)椴淮嬖谶@樣的信息,所以系統(tǒng)會(huì)彈出一個(gè)“ 未能識(shí)別的USB設(shè)備”的對(duì)話框,要求用戶輸入驅(qū)動(dòng)程序的名稱。該名稱就是USB Host驅(qū)動(dòng)DLL的文件名。在輸入了名稱后,系統(tǒng)會(huì)自動(dòng)調(diào)用該DLL的USBInstallDriver函數(shù)。該函數(shù) 負(fù)責(zé)向注冊(cè)表添加USB Host驅(qū)動(dòng)的信息,以便再次插入設(shè)備時(shí),能夠識(shí)別該US
2、B設(shè)備。其原型如下: BOOL USBInstallDriver(LPCWSTR szDriverLibFile; 其中szDriverLibFile就是輸入的DLL文件名稱。返回TRUE表示注冊(cè)成功。 在向注冊(cè)表注冊(cè)USB Host信息時(shí),不能使用普通的注冊(cè)表函數(shù),只能使用USBD提供的注冊(cè)函數(shù)。 BOOL RegisterClientDriverID(LPCWSTR szUniqueDriverId; BOOL RegisterClientSettings(LPCWSTR szDriverLibFile, LPCWSTR szUniqueDriverId, LPCWSTR erved, L
3、PCUSB_DRIVER_SETTINGS lpDriverSettings; 這兩個(gè)函數(shù)在USBD.DLL中,可以通過(guò)動(dòng)態(tài)方式調(diào)用,也可以通過(guò)靜態(tài)方式調(diào)用。 動(dòng)態(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; 此后,就可以通過(guò)lpRegisterClientId和lpRegisterClientSetting函數(shù)指針調(diào)用這些函數(shù),最后記得要FreeLibrary。 靜態(tài)方式: 在.cpp源文件中加入 #pragma commen
5、t(lib,usbd.lib 并在source文件的TARGETLIBS變量中加入$(_SYSGENOAKROOTlib$(_CPUINDPATHusbd.lib 如此一來(lái),就可以直接使用這兩個(gè)函數(shù)了。 1 BOOL RegisterClientDriverID(LPCWSTR szUniqueDriverId 該函數(shù)注冊(cè)USB Host驅(qū)動(dòng)程序的ID。 2 BOOL RegisterClientSettings(LPCWSTR szDriverLibFile, LPCWSTR szUniqueDriverId, LPCWSTR erved, LPCUSB_DRIVER_SETTINGS lp
6、DriverSettings 該函數(shù)負(fù)責(zé)注冊(cè)驅(qū)動(dòng)程序的信息。 szDriverLibFile 設(shè)置為USBInstallDriver函數(shù)傳入的DLL驅(qū)動(dòng)程序名稱。 szUniqueDriverId 設(shè)置為調(diào)用RegisterClientDriverID注冊(cè)的驅(qū)動(dòng)程序ID。 erved 設(shè)置為NULL lpDriverSettings 該參數(shù)是一個(gè)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)體大小,其他項(xiàng)對(duì)應(yīng)USB描述符。 其中除Count外的各字段,如果不設(shè)置具體的值,可以設(shè)置為USB_NO_INFO。 這個(gè)結(jié)構(gòu)體中的信息講反應(yīng)到注冊(cè)表的HKEY_LOCAL_MACHINEDriversUSBLoadClients鍵下,用于在USB設(shè)備插入時(shí),
8、查找USB驅(qū)動(dòng)。下面以一個(gè)例子說(shuō)明: 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個(gè)值, 第一組: dwVendorId、dwProductId、dwReleaseNumber 第二組: dwDeviceClass、dwDeviceSubClass、dwDeviceProtocol 第三組: dwInterfaceClass、dwInterfaceSubClass、dwInterfaceProtocol 如果注冊(cè)成功,將會(huì)在HKEY_LOCAL_MACHINEDriversUSBLoadClients鍵下出現(xiàn) “第一組第二組第三組注冊(cè)IDDLL”這樣的建,鍵值為DLL驅(qū)動(dòng)名稱。其中每組又是由三個(gè)值中間加下劃線組成。如果有一個(gè)值設(shè)置為USB_
12、NO_INFO,則鍵名不包括該值。如果整個(gè)組中每個(gè)值都設(shè)置成USB_NO_INFO,則鍵名為Default。 據(jù)上面的例子,在我的系統(tǒng)下,將會(huì)生成如下鍵名: HKEY_LOCAL_MACHINEDriversUSBLoadClients4292_3Default0_0_0USBTestDLL = MyUSBTest (我的驅(qū)動(dòng)程序?yàn)镸yUSBTest.dll 當(dāng)用戶插入U(xiǎn)SB設(shè)備時(shí),它會(huì)讀取USB設(shè)備的描述符,根據(jù)描述符中的值在注冊(cè)表中查找驅(qū)動(dòng)程序名稱。 現(xiàn)在假設(shè),我們要WinCE只支持USB鍵盤(pán),另外我們自己實(shí)現(xiàn)一個(gè)USB鼠標(biāo)驅(qū)動(dòng)程序。如果不加注意,我們的USB鼠標(biāo)驅(qū)動(dòng)程序?qū)⒉荒鼙徽{(diào)用。原因
13、正是在于這個(gè)查找USB設(shè)備驅(qū)動(dòng)的過(guò)程。WINCE提供的USBHID驅(qū)動(dòng)程序的注冊(cè)表信息是 HKEY_LOCAL_MACHINEDriversUSBLoadClientsDefaultDefault3Hid_ClassDLL = USBHID.DLL 其中第三組信息只使用了dwInterfaceClass,而USB鍵盤(pán)和USB鼠標(biāo)只有dwInterfaceProtocol不同。所以,一個(gè)3概括了所有的HID,當(dāng)我們的USB鼠標(biāo)插入系統(tǒng)后,將會(huì)調(diào)用USBHID.DLL驅(qū)動(dòng)程序處理,但是它只包括鍵盤(pán)的驅(qū)動(dòng),沒(méi)有 鼠標(biāo)的驅(qū)動(dòng),所以鼠標(biāo)不能使用。要想使得自定義的USB鼠標(biāo)可以使用,則將第三組的值都設(shè)置上
14、,如下: HKEY_LOCAL_MACHINEDriversUSBLoadClientsDefaultDefault3_1_1Hid_ClassDLL = USBHID.DLL 如此一來(lái),當(dāng)值為3_1_2的鼠標(biāo)插入后,因?yàn)檎也坏綄?duì)應(yīng)的鍵值,將提示要求我們輸入U(xiǎn)SB鼠標(biāo)的驅(qū)動(dòng)。 當(dāng)用戶需要卸載USB Host設(shè)備驅(qū)動(dòng)時(shí),將會(huì)調(diào)用USBUnInstallDriver函數(shù) BOOL USBUnInstallDriver(; 它與USBInstallDriver類似,不過(guò)是調(diào)用如下兩個(gè)函數(shù) UnRegisterClientSettings BOOL UnRegisterClientSettings(L
15、PCWSTR szUniqueDriverId, LPCWSTR szReserved, LPCUSB_DRIVER_SETTINGS lpDriverSettings; BOOL UnRegisterClientDriverID(LPCWSTR szUniqueDriverId; 其中szUniqueDriverId是注冊(cè)時(shí),使用的ID,szReserved保留,故設(shè)置為NULL,lpDriverSettings則是驅(qū)動(dòng)程序設(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一致。 回到原來(lái)的流程,WinCE注冊(cè)表中已經(jīng)包含了驅(qū)動(dòng)信息,WinCE系統(tǒng)自動(dòng)查找注冊(cè)表,在找到設(shè)備對(duì)應(yīng)鍵值的DLL后,將會(huì)調(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è)備時(shí),需要使用該句柄 lpUsbFuncs 指向一個(gè)包含各種USB操作的函數(shù)指針 lpInterface USB接口信息,這里需要注意的是,如果在DriverSettings里dwInterfaceClass、dwInterfaceSubClass、dwInterfaceProtocol設(shè)置為USB_NO_INFO,則該指針為NU
20、LL szUniqueDriverId 注冊(cè)設(shè)備ID fAcceptControl 該值被賦值為T(mén)RUE,表示該驅(qū)動(dòng)能操作該設(shè)備。如果不能操作該設(shè)備,則“未能識(shí)別的USB設(shè)備”對(duì)話框會(huì)再次出現(xiàn),要求用戶輸入驅(qū)動(dòng)程序名稱 dwUnused 未使用 在該函數(shù)內(nèi),主要是做一些檢查,判斷是否能驅(qū)動(dòng)設(shè)備,還有就是注冊(cè)USB事件通知回調(diào)函數(shù),以 及激活流驅(qū)動(dòng)。對(duì)于檢查部分,這里不再詳細(xì)說(shuō)明。 首先,介紹一下激活流驅(qū)動(dòng)。 流驅(qū)動(dòng)為應(yīng)用程序提供了一個(gè)訪問(wèn)設(shè)備的接口,利用該接口可以像訪問(wèn)文件一樣訪問(wèn)設(shè)備。USB設(shè)備同樣可以使用該接口來(lái)為應(yīng)用程序提供支持。在注冊(cè)表的 HKEY_LOCAL_MACHINEDrive
21、rsBuiltIn鍵下,保存了各種WinCE內(nèi)建流驅(qū)動(dòng)程序的入口。這些驅(qū)動(dòng)通過(guò)device.exe在系統(tǒng)啟動(dòng)時(shí)被激活。像USB這樣的設(shè)備,只有插入時(shí),才存在流 驅(qū)動(dòng)接口,所以我們需要手動(dòng)激活流驅(qū)動(dòng)。激活流驅(qū)動(dòng)的函數(shù)是: HANDLE ActivateDevice(LPCWSTR lpszDevKey, DWORD dwClientInfo; lpszDevKey 字符串指明了流驅(qū)動(dòng)所在注冊(cè)表的鍵。獲悉流驅(qū)動(dòng)的人都知道,流驅(qū)動(dòng)在注冊(cè)表中必須包含兩個(gè)鍵Prefix和Dll。 流驅(qū)動(dòng)中所有接口函數(shù)都有類似XXX_的前綴,而這個(gè)Prefix則指明XXX對(duì)應(yīng)的字符串,如Prefix為COM,則流驅(qū)動(dòng)包含
22、如COM_Open、COM_Close、COM_Write、COM_Read這樣接口函數(shù)。Dll則說(shuō)明了這些函數(shù)所在的動(dòng)態(tài)鏈接庫(kù)。 在我的例子中存在如下的注冊(cè)表鍵: HKEY_LOCAL_MACHINEDriversUSBClientDriversUSBTest Prefix=TST Dll=MyUSBTest.dll 通過(guò)dwClientInfo,可以把參數(shù)間接傳給驅(qū)動(dòng)的XXX_init。我們可以把hDevice、lpUsbFuncs、lpInterface這樣信息放置在一個(gè)結(jié)構(gòu)體中,通過(guò)該函數(shù)傳遞給流驅(qū)動(dòng)使用。 USB通知回調(diào)函數(shù),可以用來(lái)判斷各種USB事件的發(fā)生,如USB拔出。當(dāng)發(fā)生事件
23、后,系統(tǒng)會(huì)根據(jù)注冊(cè)的回調(diào)函數(shù)做相應(yīng)的處理,在USB設(shè)備拔出后,所要做的事情,就是卸載流驅(qū)動(dòng),并釋放占用的各種資源。 注冊(cè)回調(diào)函數(shù)是一個(gè)包含在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ū)動(dòng)使用 BOOL DeactivateDevice(HANDLE hDevice; 其中,hDevice 傳入ActivateDevice時(shí)返回的句柄。 下面是具體的示例: 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ū)動(dòng)
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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高精度Zoom型模數(shù)轉(zhuǎn)換器關(guān)鍵技術(shù)研究
- 含鎢雜多酸鹽催化劑的制備及其在微通道反應(yīng)器中合成酒石酸的應(yīng)用研究
- 2025-2030農(nóng)業(yè)無(wú)人機(jī)應(yīng)用市場(chǎng)分析及技術(shù)革新與商業(yè)模式探索研究報(bào)告
- 產(chǎn)后出血疾病查房演講
- 2025至2030中國(guó)木器涂料行業(yè)運(yùn)行動(dòng)態(tài)與應(yīng)用需求現(xiàn)狀分析報(bào)告
- 2025至2030中國(guó)有機(jī)芋頭行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及發(fā)展趨勢(shì)與投資報(bào)告
- 2025至2030中國(guó)智能工作場(chǎng)所行業(yè)發(fā)展趨勢(shì)分析與未來(lái)投資戰(zhàn)略咨詢研究報(bào)告
- 2025至2030中國(guó)智慧旅游行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及領(lǐng)先企業(yè)與投資發(fā)展前景報(bào)告
- 2025至2030中國(guó)舊電梯更新改造行業(yè)市場(chǎng)現(xiàn)狀分析及競(jìng)爭(zhēng)格局與投資發(fā)展報(bào)告
- 2025至2030中國(guó)托盤(pán)鋸行業(yè)發(fā)展趨勢(shì)分析與未來(lái)投資戰(zhàn)略咨詢研究報(bào)告
- 急性缺血性腦卒中靜脈溶栓治療護(hù)理新進(jìn)展
- 六西格瑪(6Sigma)詳解及實(shí)際案例分析
- 建筑安裝工程一切險(xiǎn)宋
- 裝配電工技能培訓(xùn)課件
- (幼兒學(xué)前教育)43 保育工作見(jiàn)實(shí)習(xí)觀察記錄表
- 2017版銀皮書(shū)(中英文完整版)FIDIC設(shè)計(jì)采購(gòu)施工交鑰匙項(xiàng)目合同條件
- 養(yǎng)生館年會(huì)主持稿范文模板
- GMP生產(chǎn)管理知識(shí)
- YY/T 0799-2010醫(yī)用氣體低壓軟管組件
- GB/T 9768-2017輪胎使用與保養(yǎng)規(guī)程
- GB/T 37202-2018鎳錳酸鋰
評(píng)論
0/150
提交評(píng)論