




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、WinCE下所有的驱动都是以DLL的形式,被device.exe进程加载的,所以每个驱动程序中都要实现DllEntry函数。 在注册表的HKEY_LOCAL_MACHINEDriversUSBLoadClients键下保存了USB Host的驱动程序信息。当我们第一次插入USB设备时。因为不存在这样的信息,所以系统会弹出一个“ 未能识别的USB设备”的对话框,要求用户输入驱动程序的名称。该名称就是USB Host驱动DLL的文件名。在输入了名称后,系统会自动调用该DLL的USBInstallDriver函数。该函数 负责向注册表添加USB Host驱动的信息,以便再次插入设备时,能够识别该US
2、B设备。其原型如下: BOOL USBInstallDriver(LPCWSTR szDriverLibFile; 其中szDriverLibFile就是输入的DLL文件名称。返回TRUE表示注册成功。 在向注册表注册USB Host信息时,不能使用普通的注册表函数,只能使用USBD提供的注册函数。 BOOL RegisterClientDriverID(LPCWSTR szUniqueDriverId; BOOL RegisterClientSettings(LPCWSTR szDriverLibFile, LPCWSTR szUniqueDriverId, LPCWSTR erved, L
3、PCUSB_DRIVER_SETTINGS lpDriverSettings; 这两个函数在USBD.DLL中,可以通过动态方式调用,也可以通过静态方式调用。 动态方式如下: 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函数指针调用这些函数,最后记得要FreeLibrary。 静态方式: 在.cpp源文件中加入 #pragma commen
5、t(lib,usbd.lib 并在source文件的TARGETLIBS变量中加入$(_SYSGENOAKROOTlib$(_CPUINDPATHusbd.lib 如此一来,就可以直接使用这两个函数了。 1 BOOL RegisterClientDriverID(LPCWSTR szUniqueDriverId 该函数注册USB Host驱动程序的ID。 2 BOOL RegisterClientSettings(LPCWSTR szDriverLibFile, LPCWSTR szUniqueDriverId, LPCWSTR erved, LPCUSB_DRIVER_SETTINGS lp
6、DriverSettings 该函数负责注册驱动程序的信息。 szDriverLibFile 设置为USBInstallDriver函数传入的DLL驱动程序名称。 szUniqueDriverId 设置为调用RegisterClientDriverID注册的驱动程序ID。 erved 设置为NULL lpDriverSettings 该参数是一个USB_DRIVER_SETTINGS结构体。其声明如下: 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为结构体大小,其他项对应USB描述符。 其中除Count外的各字段,如果不设置具体的值,可以设置为USB_NO_INFO。 这个结构体中的信息讲反应到注册表的HKEY_LOCAL_MACHINEDriversUSBLoadClients键下,用于在USB设备插入时,
8、查找USB驱动。下面以一个例子说明: 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中,将设置信息分为了三组,每组3个值, 第一组: dwVendorId、dwProductId、dwReleaseNumber 第二组: dwDeviceClass、dwDeviceSubClass、dwDeviceProtocol 第三组: dwInterfaceClass、dwInterfaceSubClass、dwInterfaceProtocol 如果注册成功,将会在HKEY_LOCAL_MACHINEDriversUSBLoadClients键下出现 “第一组第二组第三组注册IDDLL”这样的建,键值为DLL驱动名称。其中每组又是由三个值中间加下划线组成。如果有一个值设置为USB_
12、NO_INFO,则键名不包括该值。如果整个组中每个值都设置成USB_NO_INFO,则键名为Default。 据上面的例子,在我的系统下,将会生成如下键名: HKEY_LOCAL_MACHINEDriversUSBLoadClients4292_3Default0_0_0USBTestDLL = MyUSBTest (我的驱动程序为MyUSBTest.dll 当用户插入USB设备时,它会读取USB设备的描述符,根据描述符中的值在注册表中查找驱动程序名称。 现在假设,我们要WinCE只支持USB键盘,另外我们自己实现一个USB鼠标驱动程序。如果不加注意,我们的USB鼠标驱动程序将不能被调用。原因
13、正是在于这个查找USB设备驱动的过程。WINCE提供的USBHID驱动程序的注册表信息是 HKEY_LOCAL_MACHINEDriversUSBLoadClientsDefaultDefault3Hid_ClassDLL = USBHID.DLL 其中第三组信息只使用了dwInterfaceClass,而USB键盘和USB鼠标只有dwInterfaceProtocol不同。所以,一个3概括了所有的HID,当我们的USB鼠标插入系统后,将会调用USBHID.DLL驱动程序处理,但是它只包括键盘的驱动,没有 鼠标的驱动,所以鼠标不能使用。要想使得自定义的USB鼠标可以使用,则将第三组的值都设置上
14、,如下: HKEY_LOCAL_MACHINEDriversUSBLoadClientsDefaultDefault3_1_1Hid_ClassDLL = USBHID.DLL 如此一来,当值为3_1_2的鼠标插入后,因为找不到对应的键值,将提示要求我们输入USB鼠标的驱动。 当用户需要卸载USB Host设备驱动时,将会调用USBUnInstallDriver函数 BOOL USBUnInstallDriver(; 它与USBInstallDriver类似,不过是调用如下两个函数 UnRegisterClientSettings BOOL UnRegisterClientSettings(L
15、PCWSTR szUniqueDriverId, LPCWSTR szReserved, LPCUSB_DRIVER_SETTINGS lpDriverSettings; BOOL UnRegisterClientDriverID(LPCWSTR szUniqueDriverId; 其中szUniqueDriverId是注册时,使用的ID,szReserved保留,故设置为NULL,lpDriverSettings则是驱动程序设置信息。 例程如下: 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注册表中已经包含了驱动信息,WinCE系统自动查找注册表,在找到设备对应键值的DLL后,将会调用该DLL的USBDeviceAttach函数。 BOOL USBDeviceAttach( USB_HANDLE hDevice, LPCU
19、SB_FUNCS lpUsbFuncs, LPCUSB_INTERFACE lpInterface, LPCWSTR szUniqueDriverId, LPBOOL fAcceptControl, DWORD dwUnused hDevice 设备句柄,操作USB设备时,需要使用该句柄 lpUsbFuncs 指向一个包含各种USB操作的函数指针 lpInterface USB接口信息,这里需要注意的是,如果在DriverSettings里dwInterfaceClass、dwInterfaceSubClass、dwInterfaceProtocol设置为USB_NO_INFO,则该指针为NU
20、LL szUniqueDriverId 注册设备ID fAcceptControl 该值被赋值为TRUE,表示该驱动能操作该设备。如果不能操作该设备,则“未能识别的USB设备”对话框会再次出现,要求用户输入驱动程序名称 dwUnused 未使用 在该函数内,主要是做一些检查,判断是否能驱动设备,还有就是注册USB事件通知回调函数,以 及激活流驱动。对于检查部分,这里不再详细说明。 首先,介绍一下激活流驱动。 流驱动为应用程序提供了一个访问设备的接口,利用该接口可以像访问文件一样访问设备。USB设备同样可以使用该接口来为应用程序提供支持。在注册表的 HKEY_LOCAL_MACHINEDrive
21、rsBuiltIn键下,保存了各种WinCE内建流驱动程序的入口。这些驱动通过device.exe在系统启动时被激活。像USB这样的设备,只有插入时,才存在流 驱动接口,所以我们需要手动激活流驱动。激活流驱动的函数是: HANDLE ActivateDevice(LPCWSTR lpszDevKey, DWORD dwClientInfo; lpszDevKey 字符串指明了流驱动所在注册表的键。获悉流驱动的人都知道,流驱动在注册表中必须包含两个键Prefix和Dll。 流驱动中所有接口函数都有类似XXX_的前缀,而这个Prefix则指明XXX对应的字符串,如Prefix为COM,则流驱动包含
22、如COM_Open、COM_Close、COM_Write、COM_Read这样接口函数。Dll则说明了这些函数所在的动态链接库。 在我的例子中存在如下的注册表键: HKEY_LOCAL_MACHINEDriversUSBClientDriversUSBTest Prefix=TST Dll=MyUSBTest.dll 通过dwClientInfo,可以把参数间接传给驱动的XXX_init。我们可以把hDevice、lpUsbFuncs、lpInterface这样信息放置在一个结构体中,通过该函数传递给流驱动使用。 USB通知回调函数,可以用来判断各种USB事件的发生,如USB拔出。当发生事件
23、后,系统会根据注册的回调函数做相应的处理,在USB设备拔出后,所要做的事情,就是卸载流驱动,并释放占用的各种资源。 注册回调函数是一个包含在lpUsbFuncs中的函数指针: LPUN_REGISTER_NOTIFICATION_ROUTINE lpUnRegisterNotificationRoutine 该函数的声明如下: typedef BOOL (* LPREGISTER_NOTIFICATION_ROUTINE( USB_HANDLE hDevice, LPDEVICE_NOTIFY_ROUTINE lpNotifyRoutine, LPVOID lpvNotifyParameter
24、 ; hDevice 设备句柄 lpNotifyRoutine 回调函数 lpvNotifyParameter 传递给回调函数的参数 在回调函数中卸载流驱动使用 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; /回调函数 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; /卸载流驱动
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设备的一些信息 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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 混凝土班组施工合同协议
- 混凝土标养室合同协议
- 篮球馆装修合同协议
- 游泳池转让协议合同
- 清洁剂供货合同协议
- 消防通道租凭合同协议
- 移交电器售后合同协议
- 第三方协议单位退回合同
- 空调保养外包合同协议
- 租赁车间加工合同协议
- 2023年江苏省常州市统招专升本管理学自考真题(含答案)
- 新人教版八下英语过去式过去分词表格
- cimatron紫藤教程系列gpp2由零开始
- 公安机关业务技术用房建设标准
- (完整)四年级数学思维训练题及答案
- CAT3606 中文说明书-3600基础
- 产品开发设计课件
- 最新2013版建设工程量清单计价规范及房建工程量计算规范应用解读(实例讲解350P)
- 新版导师制度课件
- 室内设计综合施工图制作教案
- 紫色卡通万圣节节日活动策划PPT模板
评论
0/150
提交评论