WinXP下USB驱动开发(一)

 

目  

第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_POWER与IRP_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/S。USB支持“总线供电”和“自供电”两种供电模式。在总线供电模式下,

设备最多可以获得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 机当中,一般有8个USB 口,通过外界USB Hub,可以插更多的USB 设备。

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

USB设备图说明:以HOST-ROOT HUB为起点, 最多支持7 层(Tier),也就是说任何一个USB系统中最多可以允许5个USB 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 设备来说是透明的、不可见的。

 

 

时间: 2009-11-27

WinXP下USB驱动开发(一)的相关文章

WinXP下USB驱动开发(十)

3.4.       其他说明 Ø       编译环境:Win XP Checked Build Environment/Win XP Free Build Environment Ø       开发环境:Microsoft Visual C++ 6.0 Ø       调试工具:Debugging Tools for Windows (x86)(WinDbg) Ø       开发周期:2009-11-7到2009-10-24 Ø       设计人员/编码人员/调试人员:罗振辉 第4节 

WinXP下USB驱动开发(四)

第3节       设计说明 3.1.       概要设计 该任务主要包括上位机USB驱动开发.LPC2440 下位机程序开发.调试三部分.其中LPC2440 下位机程序开发部分已经完成,不需要再行设计和开发.因此接下来的任务主要由上位机USB 驱动开发和调试两部分构成.严格来说调试又分检测软件的编写和整体调试两部分.因此我们的设计工作主要如下几部分(图3-1-1). 概要设计如下: 上位机USB驱动设计:采用WDM驱动设计模式开发,遵循严格的USB2.0规范,实现即插即用.数据传输等驱动功能

WinXP下USB驱动开发(九)

3.3.4.  测试设计 测试是驱动开发的重要环节,主要包括扩展性测试.健壮性测试和稳定性测试.针对如下USB测试,我们主要设计了枚举.中断传输.批量传输.8*PackSize[64]数据传输.17/2*PackSize[64]数据传输和24小时压力测试等几个方面,从这几个方面完全涵盖扩展性测试.健壮性测试和稳定性测试,详细介绍如下. 3.3.4. 1.    下位机程序配合简要 该驱动准备通过LPC2400 系列ARM USB设备控制器的逻辑端点2收发大量数据,但其最大信息包只能为64字节,如

WinXP下USB驱动开发(八)

3.3.2.8.    即插即用(PNP) 即插即用(Plug and Play -- PnP)管理器使用主功能码为IRP_MJ_PNP的IRP与设备驱动程序交换信息和请求.这种类型的请求是新引入到Windows 2000和WDM中的,在以前版本的Windows NT中,大部分检测和配置设备的工作由设备驱动程序自己做.而WDM驱动程序可以让PnP管理器做这个工作.为了与PnP管理器协同工作,驱动程序开发者需要了解一些相关的IRP. 在WDM中,PnP请求扮演了两个角色.在第一个角色中,这些请求指

WinXP下USB驱动开发(七)

3.3.2.6.  电源管理 3.3.2.6.1. WDM电源管理模型 在Windows 2000和Windows 98中,操作系统接管了大部分电源管理工作.当然,这是因为只有操作系统才能真正了解电源管理的内部过程.例如,系统BIOS负责的电源3.3.2.6.管理不能区分应用程序使用的屏幕和屏幕保护程序使用的屏幕之间的区别.但操作系统可以区分开这种不同,从而确定是否可以关闭显示器. 作为计算机全局电源策略,操作系统支持一些用户接口元素,用户可以通过这些接口元素控制最终的电源管理策略.这些用户接口

WinXP下USB驱动开发(三)

2.6.       端点.管道和接口 在USB开发当中这三个概念容易混淆,对于真实环境中的USB操作,端点.管道和接口更是不可忽略的,该三者关系如图2-6-1:   端点.在这里特指USB物理端点,在NXP LPC2478 USB中最多有32个物理端点,从0到31每一种端点都有其固定的传输方式(I/OUT),其中IN是指HUB向HOST发送数据,OUT是指HOST向HUB发送数据. 管道.是一种端点的逻辑概念,说白了就是逻辑端点,是人性的为USB物理端点进行分组,两个为一组,其中一端点为IN类

WinXP下USB驱动开发(五)

3.3.2.  程序设计 与传统PC总线(如PCI总线)设备的驱动程序相比,USB设备驱动程序从不直接与硬件对话.相反,它仅靠创建URB(USB请求块)并把URB提交到总线驱动程序就可完成硬件操作. 可以把USBD.SYS看作是接受URB的实体,向USBD的调用被转化为带有主功能代码为IRP_MJ_INTERNAL_DEVICE_CONTROL的IRP.然后USBD再调度总线时间,发出URB中指定的操作. 3.3.2.1.    数据结构 3.3.2.1.1. 设备描述符 每个设备都有一个唯一的

转: 嵌入式linux下usb驱动开发方法--看完少走弯路【转】

转自:http://blog.csdn.net/jimmy_1986/article/details/5838297 嵌入式linux下的usb属于所有驱动中相当复杂的一个子系统,要想将她彻底征服,至少需要个把月的时间,不信?那是你没做过. 本人做过2年的嵌入式驱动开发,usb占了一大半的时间.期间走了不少弯路,下面将我的血的经验教训总结下,为要从事和正在从事的战友们做一点点贡献吧:) 首先,扫盲: 要做的是阅读usb Spec(英文的哦,其实很多文章.书籍和资料真有水平的还是原创的好,就像食品

windows-window环境下,触摸屏USB驱动开发,该设备属于HID类吗

问题描述 window环境下,触摸屏USB驱动开发,该设备属于HID类吗 大家好,最近在windos环境下开发USB驱动,目标设备是触摸屏,该触摸屏和PC机通过USB接口通讯.主要是上报触摸数据,以及PC机发送一些重要的数据到设备,进行存储. 我知道window提供了许多标准的设备类(Device Setup Classes)的驱动,其中鼠标.键盘等USB接口设备都是HID类设备,存在疑问的是,我这样的设备要求HID设备类能否满足,还是我应该在开发一个新的类