如何编写windows

上传人:腾**** 文档编号:40487785 上传时间:2018-05-26 格式:DOC 页数:23 大小:98.50KB
返回 下载 相关 举报
如何编写windows_第1页
第1页 / 共23页
如何编写windows_第2页
第2页 / 共23页
如何编写windows_第3页
第3页 / 共23页
如何编写windows_第4页
第4页 / 共23页
如何编写windows_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《如何编写windows》由会员分享,可在线阅读,更多相关《如何编写windows(23页珍藏版)》请在金锄头文库上搜索。

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

2、。0 的 协议都已经有了)http:/www.usb.org 上可以下载,我记得好像有个中文版的,翻译的还 可以,http:/ 上有的,具体位置记不太清楚了,中文版的协议可 以快速翻一边,了解一些基本的概念,但是设计到一些关键性的东西最好还是看英文版的 心里比较清楚些。 这里我就不介绍 USB 的基本协议了,假设用户已经熟悉了 USB 设备的一些基本的概念,并 且对 Winows CE.NET 的开发有一定的了解。 下面简略介绍一下 Windows CE.NET 中 USB 设备驱动开发的一些基础知识。 Windows CE.NET 的 USB 系统软件分为两层: USB Client 设备驱

3、动程序和底层的 Windows CE 实现的函数层。USB 设备驱动程序主要负责利用系统提供的底层接口配置设备,和设备 进行通讯。底层的函数提本身又由两部分组成,通用串行总线驱动程序(USBD)模块和较 低的主控制器驱动程序(HCD)模块。HCD 负责最最底层的处理,USBD 模块实现较高的 USBD 函数接口。USB 设备驱动主要利用 USBD 接口函数和他们的外围设备打交道。 USB 设备驱动程序主要和 USBD 打交道,所以我们必须详细的了解 USBD 提供的函数。 主要的传输函数有: AbourtTransferIssueControlTransfer CloseTransfer Is

4、sueInterrupTransfer GetIsochResultIssueIsochTransfer GetTransferStatus IstransferComplete IssueBulkTransfer IssueVendorTransfer 主要的用于打开和关闭 USBD 和 USB 设备之间的通信通道的函数有: AbortPipeTransfersClosePipe IsDefaultPipeHalted IsPipeHalted OpenPipeResetDefaultPipe ResetPipe 相应的打包函数接口有: GetFrameLengthGetFrameNumbe

5、rReleaseFrameLengthControl SetFrameLengthTakeFrameLengthControl 取得设置设备配置函数: ClearFeature SetDescriptor GetDescriptorSetFeature GetInterface SetInterface GetStatusSyncFrame 与 USB 进行交互的实现方法相关的多任务函数: FindInterfaceRegisterClientDeviceId GetDeviceInfoRegisterClientSettings GetUSBDVersion RegisterNotifica

6、tionRoutine LoadGenericInterfaceDriver TranslateStringDescr OpenClientRegisterKeyUnRegisterNotificationRoutine 常见的 Windows CE.NET 下 USB 的设备驱动程序的编写有以下几种方法: 流式接口函数 这种驱动程序主要呈现流式函数接口,主要输出XXX_Init,XXX_Deinit,XXX_Open,XXX_Close,XXX_Open,XXX_Close,XXX_Read,XXX_Write, XXX_Seek,XXX_IOControl,XXX_PowerUp,XXX_

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

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

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

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

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

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

13、 Descriptor: bcdUSB: 0x0100 bDeviceClass: 0x00 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: DeviceConne

14、cted Current Config Value: 0x01 Device Bus Speed: 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

15、 口中, 运行 usbview.exe 即可看得相应的设备信息。 有了这些基本信息,就可以编写 USB 设备了,首先声明一下,下面的代码取自微软的 USB 鼠标样本程序,版权归微软所有,此处仅仅借用来描述一下 USB 鼠标驱动的开发过程,读 者如需要引用此代码,需要得到微软的同意。 首先,必须输出 USBD 要求调用的三个函数,首先到设备插入到 USB 端口时,USBD 会调用 USBDeviceAttach()函数,相应的代码如下: extern “C“ BOOL USBDeviceAttach( USB_HANDLE hDevice, / USB 设备句柄 LPCUSB_FUNCS lpUsbFuncs, / USBDI 的函数集合 LPCUSB_INTERFACE lpInterface, / 设备接口描述信息 LPCWSTR szUniqueDriverId, / 设备 ID 描述字符串。 LPBOOL fAcceptControl, / 返回 TRUE,标识我们可以控制此设备, 反之表示不能控制 DWORD dwUnused) *fAcceptControl = FALSE; / 我们的鼠标设备有特定的描述信息,要检测是否是我们的设备。 if (lpInterface = NULL) return FALSE; / 打印相关

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号