ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:22.43KB ,
资源ID:29886556      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/29886556.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编写Win CE的USB驱动程的研究.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编写Win CE的USB驱动程的研究.docx

1、编写Win CE的USB驱动程的研究编写WINDOWS CE.NET的USB驱动程的研究随着USB设备的普及,摆在开发人员面前的驱动开发任务也是越来越繁重了,特别是对于一些嵌入式开发厂商来讲,由于设备所采用的操作系统不同,相应的硬件接口也是不一样的,开发相关的USB驱动程序更是难上加难。Windows CE.NET 是微软推出的功能强大的嵌入式操作系统,国内采用此操作系统的厂商已经很多了,本文就以windows 为例,简单介绍一下如何开发windows 下的USB驱动程序。 首先假设用户已经熟悉了USB设备的一些基本的概念,并且对Winows CE.NET的开发有一定的了解。 下面简略介绍一下

2、Windows CE.NET中USB设备驱动开发的一些基础知识。 Windows CE.NET 的USB系统软件分为两层: USB Client设备驱动程序和底层的Windows CE实现的函数层。USB设备驱动程序主要负责利用系统提供的底层接口配置设备,和设备进行通讯。底层的函数提本身又由两部分组成,通用串行总线驱动程序(USBD)模块和较低的主控制器驱动程序(HCD)模块。HCD负责最最底层的处理,USBD模块实现较高的USBD函数接口。USB设备驱动主要利用USBD接口函数和他们的外围设备打交道。 USB设备驱动程序主要和USBD打交道,所以我们必须详细的了解USBD提供的函数。 主要的

3、传输函数有: AbourtTransfer IssueControlTransfer CloseTransfer IssueInterrupTransfer GetIsochResult IssueIsochTransfer GetTransferStatus IstransferComplete IssueBulkTransfer IssueVendorTransfer 主要的用于打开和关闭USBD和USB设备之间的通信通道的函数有: AbortPipeTransfers ClosePipe IsDefaultPipeHalted IsPipeHalted OpenPipe ResetDef

4、aultPipe ResetPipe 相应的打包函数接口有: GetFrameLength GetFrameNumber ReleaseFrameLengthControl SetFrameLength TakeFrameLengthControl 取得设置设备配置函数: ClearFeature SetDescriptor GetDescriptor SetFeature GetInterface SetInterface GetStatus SyncFrame 与USB进行交互的实现方法相关的多任务函数: FindInterface RegisterClientDeviceId GetDe

5、viceInfo RegisterClientSettings GetUSBDVersion RegisterNotificationRoutine LoadGenericInterfaceDriver TranslateStringDescr OpenClientRegisterKey UnRegisterNotificationRoutine 常见的Windows CE.NET下USB的设备驱动程序的编写有以下几种方法: 流式接口函数 这种驱动程序主要呈现流式函数接口,主要输出XXX_Init,XXX_Deinit,XXX_Open,XXX_Close,XXX_Open,XXX_Close

6、,XXX_Read,XXX_Write, XXX_Seek,XXX_IOControl,XXX_PowerUp,XXX_PowerDown等流式接口,注意上述的几个接口一定都要输出,另外XXX必须为三个字符,否则会出错。但是此类的驱动程序不是通过设备管理接口来加载的,所以必须手工的调用RegisterDevice()和DeregisterDevice()函数来加载和卸载驱动程序。用户可以将此类的设备作为标准的文件来操作,只要调用相应的文件操作就可以和驱动程序打交道。 使用现有的Window CE.NET的应用程序接口 此类设备主要是利用Windows CE.NET中已经有了现成的函数接口,例如

7、USB Mass Storage Disk,它主要利用现有的Windows CE.Net中已经有的可安装文件系统接口,呈现给系统可用的文件系统,对于用户来讲,它是透明的,用户仅仅感觉在操作一个文件夹。 创建指定到特定的USBD的用户指定的API 这种方法在USBD呈现设备时不需要任何限制,主要是特制的提供API给用户,一般不太常见。 USB设备驱动程序必须输出的函数有: USBDeviecAttach 当USB设备连接到计算机上时,USBD模块就会调用此函数,这个函数主要用于初始化USB设备,取得USB设备信息,配置USB设备,并且申请必需的资源。 USBInstallDriver 主要用于创

8、建一个驱动程序加载所需的注册表信息,例如读写超时,设备名称等。 USBUninstallDriver 主要用于释放驱动程序所占用的资源,以及删除USBInstallDriver函数创建的注册表等。 上述的三个函数接口是所有的USB驱动程序必须提供的,缺一不可。 另外比较重要的是USB设备驱动程序的注册表配置,一般的USB设备驱动程序的注册表配置在HKEY_LOCAL_MACHINEDriversUSBLoadClients下,每个驱动程序的子键都有Group1_IDGroup2_IDGroup3_IDDriverName格式,如果注册表信息与USB设备信息符合,USBD就会加载此驱动程序。否则

9、设备的子键应该由供应商,设备类和协议信息通过下划线组成。 具体的配置举个例子: 例如你有个PDA设备,它具有一个USB接口,它的供应厂商ID假设为0x0888,设备ID为0x0999,没有使用特殊的协议,那么它的加载注册表应该写为: HKEY_LOCAL_MACHINEDriversUSBLoadClients2184_2457DefaultDefaultPDA DLL=pdausb.dll 需要注意的是注册表构成都是十进制数值来标识的,注意一下十进制和十六进制的转换。 再举个USB鼠标的例子,USB鼠标是标准的HID设备,它的协议为:InterfaceClassCode为3(HID类),In

10、terfaceSubclassCode为1(引导接口类),InterfaceProtocolCode为2(鼠标协议类),所以它的注册如下: HKEY_LOCAL_MACHINEDriversUSBLoadClientsDefaultDefault3_1_2USBMouse DLL=usbmouse.dll 到此为止,我们可以看出,其实驱动开发无非做两件事情,一件是和硬件打交道,另外一件是和操作系统打交道。举个简单的例子,例如:我们需要开发一个USB鼠标驱动程序,我们就需要了解USB鼠标硬件上是怎么发送数据的?操作系统怎么才能得到鼠标的控制事件?其实USB鼠标是有一个中断PIPE的,用于传送鼠标

11、产生的数据,Windwos CE.NET中有个接口函数叫做mouse_event(),专门用于产生鼠标事件,但是它是不关心具体什么硬件的,甚至我们自己在应用程序中调用这个函数都可以实现模拟鼠标,对应的有个keybd_event(),用于产生键盘事件,知道了这个就好办多了,只要将相应的数据转换一下,调用一下mouse_event()即可, 上述讲了堆理论,可能读者脑袋都已经大了,为此,我们举个简单的例子来详细说明一下驱动程序的开发过程。 例如我们有个USB Mouse设备,设备信息描述如下: Device Descriptor: bcdUSB: 0x0100 bDeviceClass: 0x00

12、 bDeviceSubClass: 0x00 bDeviceProtocol: 0x00 bMaxPacketSize0: 0x08 (8) idVendor: 0x05E3 (Genesys Logic Inc.) idProduct: 0x0001 bcdDevice: 0x0101 iManufacturer: 0x00 iProduct: 0x01 iSerialNumber: 0x00 bNumConfigurations: 0x01 ConnectionStatus: DeviceConnected Current Config Value: 0x01 Device Bus Spe

13、ed: Low Device Address: 0x02 Open Pipes: 1 Endpoint Descriptor: bEndpointAddress: 0x81 Transfer Type: Interrupt wMaxPacketSize: 0x0003 (3) bInterval: 0x0A 可以看出上述设备有一个中断PIPE,包的最大值为3。可能有人问上述的值怎么得到的,win2k 的DDK中有个usbview的例程,编译一下,将你的USB设备插到PC机的USB口中,运行usbview.exe即可看得相应的设备信息。 有了这些基本信息,就可以编写USB设备了,首先声明一下,下

14、面的代码取自微软的USB鼠标样本程序,版权归微软所有,此处仅仅借用来描述一下USB鼠标驱动的开发过程,读者如需要引用此代码,需要得到微软的同意。 首先,必须输出USBD要求调用的三个函数,首先到设备插入到USB端口时,USBD会调用USBDeviceAttach()函数,相应的代码如下: extern C BOOL USBDeviceAttach( USB_HANDLE hDevice, / USB设备句柄 LPCUSB_FUNCS lpUsbFuncs, / USBDI的函数集合 LPCUSB_INTERFACE lpInterface, / 设备接口描述信息 LPCWSTR szUniqu

15、eDriverId, / 设备ID描述字符串。 LPBOOL fAcceptControl, / 返回TRUE,标识我们可以控制此设备, 反之表示不能控制 DWORD dwUnused) *fAcceptControl = FALSE; / 我们的鼠标设备有特定的描述信息,要检测是否是我们的设备。 if (lpInterface = NULL) return FALSE; / 打印相关的USB设备接口描述信息。 DEBUGMSG(ZONE_INIT,(TEXT(USBMouse: DeviceAttach, IF %u, #EP:%u, Class:%u, Sub:%u,Prot:%urn),

16、 lpInterface-Descriptor.bInterfaceNumber,lpInterface-Descriptor.bNumEndpoints, lpInterface-Descriptor.bInterfaceClass,lpInterface-Descriptor.bInterfaceSubClass,lpInterface-Descriptor.bInterfaceProtocol); / 初试数据USB鼠标类,产生一个接受USB鼠标数据的线程 CMouse * pMouse = new CMouse(hDevice, lpUsbFuncs, lpInterface); if

17、 (pMouse = NULL) return FALSE; if (!pMouse-Initialize() delete pMouse; return FALSE; / 注册一个监控USB设备事件的回调函数,用于监控USB设备是否已经拔掉。 (*lpUsbFuncs-lpRegisterNotificationRoutine)(hDevice, USBDeviceNotifications, pMouse); *fAcceptControl = TRUE; return TRUE; 第二个函数是 USBInstallDriver()函数, 一些基本定义如下: const WCHAR gcs

18、zRegisterClientDriverId = LRegisterClientDriverID; const WCHAR gcszRegisterClientSettings = LRegisterClientSettings; const WCHAR gcszUnRegisterClientDriverId = LUnRegisterClientDriverID; const WCHAR gcszUnRegisterClientSettings = LUnRegisterClientSettings; const WCHAR gcszMouseDriverId = LGeneric_Sa

19、mple_Mouse_Driver; 函数接口如下: extern C BOOL USBInstallDriver( LPCWSTR szDriverLibFile) / parm IN - Contains client driver DLL name BOOL fRet = FALSE; HINSTANCE hInst = LoadLibrary(LUSBD.DLL); / 注册USB设备信息 if(hInst) LPREGISTER_CLIENT_DRIVER_ID pRegisterId = (LPREGISTER_CLIENT_DRIVER_ID) GetProcAddress(hI

20、nst, gcszRegisterClientDriverId); LPREGISTER_CLIENT_SETTINGS pRegisterSettings = (LPREGISTER_CLIENT_SETTINGS) GetProcAddress(hInst, gcszRegisterClientSettings); if(pRegisterId & pRegisterSettings) USB_DRIVER_SETTINGS DriverSettings; DriverSettings.dwCount = sizeof(DriverSettings); / 设置我们的特定的信息。 Driv

21、erSettings.dwVendorId = USB_NO_INFO; DriverSettings.dwProductId = USB_NO_INFO; DriverSettings.dwReleaseNumber = USB_NO_INFO; DriverSettings.dwDeviceClass = USB_NO_INFO; DriverSettings.dwDeviceSubClass = USB_NO_INFO; DriverSettings.dwDeviceProtocol = USB_NO_INFO; DriverSettings.dwInterfaceClass = 0x0

22、3; / HID DriverSettings.dwInterfaceSubClass = 0x01; / boot device DriverSettings.dwInterfaceProtocol = 0x02; / mouse fRet = (*pRegisterId)(gcszMouseDriverId); if(fRet) fRet = (*pRegisterSettings)(szDriverLibFile, gcszMouseDriverId, NULL, &DriverSettings); if(!fRet) /BUGBUG unregister the Client Driv

23、ers ID else RETAILMSG(1,(TEXT(!USBMouse: Error getting USBD function pointersrn); FreeLibrary(hInst); return fRet; 上述代码主要用于产生USB设备驱动程序需要的注册表信息,需要注意的是:USB设备驱动程序不使用标准的注册表函数,而是使用RegisterClientDriverID()和RegisterClientSettings来注册相应的设备信息。 另外一个函数是USBUninstallDriver()函数,具体代码如下: extern C BOOL USBUnInstallDr

24、iver() BOOL fRet = FALSE; HINSTANCE hInst = LoadLibrary(LUSBD.DLL); if(hInst) LPUN_REGISTER_CLIENT_DRIVER_ID pUnRegisterId = (LPUN_REGISTER_CLIENT_DRIVER_ID) GetProcAddress(hInst, gcszUnRegisterClientDriverId); LPUN_REGISTER_CLIENT_SETTINGS pUnRegisterSettings = (LPUN_REGISTER_CLIENT_SETTINGS) GetPr

25、ocAddress(hInst, gcszUnRegisterClientSettings); if(pUnRegisterSettings) USB_DRIVER_SETTINGS DriverSettings; DriverSettings.dwCount = sizeof(DriverSettings); / 必须填入与注册时相同的信息。 DriverSettings.dwVendorId = USB_NO_INFO; DriverSettings.dwProductId = USB_NO_INFO; DriverSettings.dwReleaseNumber = USB_NO_INF

26、O; DriverSettings.dwDeviceClass = USB_NO_INFO; DriverSettings.dwDeviceSubClass = USB_NO_INFO; DriverSettings.dwDeviceProtocol = USB_NO_INFO; DriverSettings.dwInterfaceClass = 0x03; / HID DriverSettings.dwInterfaceSubClass = 0x01; / boot device DriverSettings.dwInterfaceProtocol = 0x02; / mouse fRet

27、= (*pUnRegisterSettings)(gcszMouseDriverId, NULL, &DriverSettings); if(pUnRegisterId) BOOL fRetTemp = (*pUnRegisterId)(gcszMouseDriverId); fRet = fRet ? fRetTemp : fRet; FreeLibrary(hInst); return fRet; 此函数主要用于删除USBInstallDriver()时创建的注册表信息,同样的它使用自己的函数接口UnRegisterClientDriverID()和UnRegisterClientSett

28、ings()来做相应的处理。 另外一个需要处理的注册的监控通知函数USBDeviceNotifications(): extern C BOOL USBDeviceNotifications(LPVOID lpvNotifyParameter, DWORD dwCode, LPDWORD * dwInfo1, LPDWORD * dwInfo2, LPDWORD * dwInfo3, LPDWORD * dwInfo4) CMouse * pMouse = (CMouse *)lpvNotifyParameter; switch(dwCode) case USB_CLOSE_DEVICE: /

29、删除相关的资源。 delete pMouse; return TRUE; return FALSE; USB鼠标的类的定义如下: class CMouse public: CMouse:CMouse(USB_HANDLE hDevice, LPCUSB_FUNCS lpUsbFuncs, LPCUSB_INTERFACE lpInterface); CMouse(); BOOL Initialize(); private: / 传输完毕调用的回调函数 static DWORD CALLBACK MouseTransferCompleteStub(LPVOID lpvNotifyParamete

30、r); / 中断处理函数 static ULONG CALLBACK CMouse:MouseThreadStub(PVOID context); DWORD MouseTransferComplete(); DWORD MouseThread(); BOOL SubmitInterrupt(); BOOL HandleInterrupt(); BOOL m_fClosing; BOOL m_fReadyForMouseEvents; HANDLE m_hEvent; HANDLE m_hThread; USB_HANDLE m_hDevice; USB_PIPE m_hInterruptPipe; USB_TRANSFER m_hInterruptTransfer; LPCUSB_FUNCS m_lpUsbFuncs; LPCUSB_INTERFACE m_pInterface; BOOL m_fPrevButton1; BOOL m_fPrevButton2; BOOL m_fPrevButton3; / 数据接

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1