WinXP下USB驱动开发(一)

来源:互联网 发布:sql having count用法 编辑:程序博客网 时间:2024/04/30 13:25

 

 

1    概述.... 4

2       USB相关技术.... 4

2.1.      USB拓扑结构... 4

2.2.      USB数据流模式... 5

2.3.      USB四种传输模式... 7

2.3.1.      批量传输... 7

2.3.2.      控制传输... 7

2.3.3.      中断传输... 8

2.3.4.      同步传输... 9

2.4.      USB协议层规范... 10

2.5.      USB HUB规范... 10

2.6.      端点、管道和接口... 11

2.7.      信息流动... 12

3    设计说明.... 13

3.1.      概要设计... 13

3.2.      驱动模型... 14

3.3.      详细设计... 14

3.3.1.      构建VC++6.0编译环境... 14

3.3.2.      程序设计... 17

3.3.2.1.     数据结构... 17

3.3.2.1.1. 设备描述符... 17

3.3.2.1.2. 配置描述符... 19

3.3.2.1.3. 接口描述符... 20

3.3.2.1.4. 端点描述符... 20

3.3.2.1.5. 串描述符... 21

3.3.2.1.6. 通道结构描述... 21

3.3.2.2.     构造URB.. 22

3.3.2.2.1. URB结构... 22

3.3.2.2.2. UsbBuildInterruptOrBulkTransferRequest 23

3.3.2.2.3. UsbBuildGetDescriptorRequest 23

3.3.2.2.4. UsbBuildSelectConfigurationRequest 24

3.3.2.3.     操作USBD.SYS. 24

3.3.2.4.     选择配置USB.. 26

3.3.2.5.     支持WMI(委托WMILIB处理IRP) 28

3.3.2.5.1. WMI概念... 28

3.3.2.5.2. 支持和取消WMI服务... 29

3.3.2.5.3. 委托WMILIB处理IRP.. 30

3.3.2.5.4. 完成WMI修改服务... 32

3.3.2.6.     电源管理... 32

3.3.2.6.1. WDM电源管理模型... 32

3.3.2.6.2. WDM驱动程序的角色... 33

3.3.2.6.3. 设备电源状态与系统电源状态... 33

3.3.2.6.4. 电源状态转换... 34

3.3.2.6.5. POWER_STATUS.. 35

3.3.2.6.6. IRP_MN_QUERY_CAPABILITIES.. 35

3.3.2.6.7. IRP_MJ_POWER.. 36

3.3.2.6.8. IRP_MN_SET_POWERIRP_MN_QUERY_POWER.. 37

3.3.2.6.9. IRP_MN_POWER_SEQUENCE.. 37

3.3.2.6.10. IRP_MN_WAIT_WAKE.. 37

3.3.2.6.11. AddDevice中设置的标志... 38

3.3.2.6.12. 设备电源管理流程... 39

3.3.2.7.     IDLE. 39

3.3.2.8.     即插即用(PNP) 40

3.3.2.9.     USB读写... 41

3.3.2.10.       驱动结构... 43

3.3.3.      安装设计... 43

3.3.4.      测试设计... 47

3.3.4.1.     下位机程序配合简要... 47

3.3.4.2.     枚举... 48

3.3.4.3.     中断/批量传输... 49

3.3.4.4.     8*PackSize[64]数据传输... 49

3.3.4.5.     传输速度测试... 50

3.3.4.6.     17/2*PackSize[64]数据传输... 50

3.3.4.7.     24小时压力测试... 51

3.3.4.8.     测试结果记录... 51

3.3.4.9.     图解... 51

3.3.4.10.       Windows USB驱动速度测试体验... 53

3.4.      其他说明... 54

4    函数接口.... 54

4.1.      USB_CONFIGURATION_DESCRIPTOR_INFO.. 54

4.2.      USB_INTERFACE_DESCRIPTOR_INFO.. 55

4.3.      USB_ENDPOINT_DESCRIPTOR_INFO.. 56

4.4.      UsbDesc. 57

4.5.      LPC2400_USB_OpenPipe. 60

4.6.      LPC2400_USB_ReadData.. 60

4.7.      LPC2400_USB_WriteData.. 61

4.8.      LPC2400_USB_FOR_TEST.. 61

4.9.      dumpUsbConfig. 61

4.10.     LPC2400_USB_ReadByte. 61

4.11.     LPC2400_USB_WriteByte. 62

5    归档说明.... 62

6       VC调用LPC2400_USB动态库的方法.... 62

7    总结.... 63

第1节       概述

结合LPC2440开发板,编写其USB上位机驱动,旨在增强对USB总线协议的理解和提升WinXP下驱动开发能力。本试验选择实验机作为上位机,操作系统选择大众操作系统(window xp)

第2节       USB相关技术

USB 是一种支持热插拔的高速串行传输总线,它使用差分信号来传输数据,最高速度可达480Mb/SUSB支持总线供电自供电两种供电模式。在总线供电模式下,

设备最多可以获得500mA 的电流。USB2.0 被设计成为向下兼容的模式,当有全速(USB 1.1)或者低速(USB 1.0)设备连接到高速(USB 2.0)主机时,主机可以通过分离传输来支持它们。一条USB 总线上,可达到的最高传输速度等级由该总线上最慢的设备决定,该设备包括主机、HUB 以及USB 功能设备。

USB 体系包括主机设备以及物理连接三个部分。其中主机是一个提供USB接口及接口管理能力的硬件、软件及固件的复合体,可以是PC,也可以是OTG 设备。一个USB系统中仅有一个USB主机;设备包括USB 功能设备和USB HUB,最多支持127 个设备;物理连接即指的是USB的传输线。在USB 2.0 系统中,要求使用屏蔽的双绞线。

从普通用户的观点来看,USB 的主要特征是每个设备都有同样的四芯电缆及标准化插头,都可以插入到PC 后部的标准化插座或与PC 相连的某个HUB上。另外,你还可以随意拔插USB设备而不管应用程序是否打开以及是否会造成电气损害。然而对于一个驱动软件开发人员来说,USB 并不像想象的那么简单,了解USB 某些电子和机械概念仍然很重要。

2.1.       USB拓扑结构

对于每个PC来说,都有一个或者多个称为Host 控制器的设备,该Host 控制器和一个根Hub(Root Hub)作为一个整体。ROOT HUB 是一个特殊的USB HUB,它集成在主机控制器里,不占用地址。

1.        USB Host 控制器:每一个PC 的主板上都会有多个Host控制器,这个Host 控制器与其它I/O设备一样直接连接到系统总线上,其实它就是一个PCI 设备,挂载在PCI 总线上。操作系统与主控制器通信使用I/O口或内存寄存器,通过普通的中断信号,系统可以接受主控制器的事件通知。主控制器连接一棵USB 设备树(如图2-1-1)。一种称为hub 的设备作为其它设备的连接点。多个hub 能以菊链方式连接,可以连接到USB规范中定义的最大深度。其它设备,如照相机、麦克风、键盘等等,直接连到hub上。

2.        USB Hub:每一个USB 控制器都会自带一个USB Hub,被称为根(Root)Hub。这个根Hub可以接子(Sub)Hub,每一个Hub 挂载USB 设备。在普通的PC 机当中,一般有8USB 口,通过外界USB Hub,可以插更多的USB 设备。

3.        USB 设备:USB 设备就是插在USB 总线上工作的设备,广义地讲USB Hub 也算一个USB设备。每个USB Hub下可以直接或者间接地连接127各设备,并且彼此之间不会干扰。对于用回来说,可以看成是USB 设备和USB 控制器直接相连,之间通讯需要满足USB 的通讯协议。

USB设备图说明:以HOST-ROOT HUB为起点, 最多支持7 (Tier),也就是说任何一个USB系统中最多可以允许5USB HUB级联。一个复合设备(Compound Device)将同时占据两层或更多的层。

1.1.       USB数据流模式

USB 采用轮询的广播机制传输数据,所有的传输都由主机发起,任何时刻整个USB 体内仅允许一个数据包的传输,即不同物理传输线上看到的数据包都是同一被广播的数据包。USB 采用令牌包”-“数据包”-“握手包的传输机制,在令牌包中指定数据包去向或者来源的设备地址和端点(Endpoint),从而保证了只有一个设备对被广播的数据包/令牌包作出响应。握手包表示了传输的成功与否。

管道(Pipe)是主机和设备端点之间数据传输的模型,共有两种类型的管道:无格式的

流管道(Stream Pipe)和有格式的信息管道(Message Pipe)。任何USB 设备一旦上电就存在一个信息管道,即默认的控制管道,USB主机通过该管道来获取设备的描述、配置、状态,并对设备进行配置。

USB 设备连接到HOST 时,HOST 必须通过默认的控制管道对其进行枚举,完成获得其设备描述、进行地址分配、获得其配置描述、进行配置等操作方可正常使用。USB 设备的即插即用特性即依赖于此。

USB 体系在实现时采用分层的结构,如下图(2-2-1)所示:在HSOT 端,应用软件(ClientSW)不能直接访问USB总线,而必须通过USB系统软件和USB主机控制器来访问USB 总线,在USB 总线上和USB 设备进行通讯。从逻辑上可以分为功能层、设备层和总线接口层三个层次。其中功能层完成功能级的描述、定义和行为;设备级则完成从功能级到传输级的转换,把一次功能级的行为转换为一次一次的基本传输;USB 总线接口层则处理总线上的Bit 流,完成数据传输的物理层实现和总线管理。途中黑色箭头代表真实的数据流,灰色箭头代表逻辑上的通讯。

物理上,USB 设备通过分层的星型总线连接到HOST,但在逻辑上HUB 是透明的,各USB设备和HOST 直接连接,和HOST上的应用软件形成一对一的关系。

各应用软件-功能设备对之间的通讯相互独立,应用软件通过USB 设备驱动程序(USBD)发起IRQ请求,请求数据传输。主机控制器驱动程序(HCD)接收IRQ请求,并解析成为USB传输和传输事务(Transaction),并对USB 系统中的所有传输事务进行任务排定(因为可能同时有多个应用软件发起IRQ 请求)。主机控制器(Host Controller)执行排定的传输任务,在同一条共享的USB 总线上进行数据包的传输。

USB 系统中数据的传输,宏观的看来是在HOST USB 功能设备之间进行;微观的看是在应用软件的Buffer USB 功能设备的端点之间进行。一般来说端点都有Buffer,可以认为USB通讯就是应用软件Buffer 和设备端点Buffer 之间的数据交换,交换的通道称为管道。应用软件通过和设备之间的数据交换来完成设备的控制和数据传输。通常需要多个管道来完成数据交换,因为同一管道只支持一种类型的数据传输。用在一起来对设备进行控制的若干管道称为设备的接口,这就是端点、管道和接口的关系。

一个USB 设备可以包括若干个端点,不同的端点以端点编号和方向区分。不同端点可以支持不同的传输类型、访问间隔以及最大数据包大小。除端点0外,所有的端点只支持一个方向的数据传输。端点0是一个特殊的端点,它支持双向的控制传输。管道和端点关联,和关联的端点有相同的属性,如支持的传输类型、最大包长度、传输方向等。

USB 体系定义了四种类型的传输,它们是:

n    控制传输:主要用于在设备连接时对设备进行枚举以及其他因设备而已的特定操作。

n    中断传输:用于对延迟要求严格、小量数据的可靠传输,如键盘、游戏手柄等。

n    批量传输:用于对延迟要求宽松,大量数据的可靠传输,如U 盘等。

n    同步传输:用于对可靠性要求不高的实时数据传输,如摄像头、USB音响等。

在主机控制器和USB HUB 之间还有另外一种传输——分离传输(Split Transaction),它仅在主机控制器和HUB 之间执行,通过分离传输,可以允许全速/低速设备连接到高速主机。分离传输对于USB 设备来说是透明的、不可见的。