您好,欢迎访问三七文档
第17章USB设备驱动USB设备驱动和PCI设备驱动是PC中最主要的两种设备驱动程序。与PCI协议相比,USB协议更复杂,涉及面较多。本章将介绍USB设备驱动开发。首先介绍USB协议,使读者对USB协议有个整体认识。然后介绍USB设备在WDM中的开发框架。由于操作系统的USB总线驱动程序提供了丰富的功能调用,因此开发USB驱动开发变得相对简单,只需要调用USB总线驱动接口。17.1USB总线协议USB总线协议比PCI协议复杂的多,涉及USB物理层协议,又涉及USB传输层协议等。对于USB驱动程序开发者来说,不需要对USB协议的每个细节都很清楚。本节概要地介绍USB总线协议,并对驱动开发者需要了解的地方进行详细介绍。17.1.1USB设备简介USB即通用串行总线(UniversalSerialBus),是一种支持即插即用的新型串行接口。也有人称之为“菊链(daisy-chaining)”,是因为在一条“线缆”上有链接127个设备的能力。USB要比标准串行口快得多,其数据传输率可达每秒4Mb~12Mb(而老式的串行口最多是每秒115Kb)。除了具有较高的传输率外,它还能给外围设备提供支持。需要注意的是,这不是一种新的总线标准,而是计算机系统连接外围设备(如键盘、鼠标、打印机等)的输入/输出接口标准。到现在为止,计算机系统连接外围设备的接口还没有统一的标准,例如,键盘的插口是圆的、连接打印机要用9针或25针的并行接口、鼠标则要用9针或25针的串行接口。USB能把这些不同的接口统一起来,仅用一个4针插头作为标准插头,如图17-1所示。通过这个标准插头,采用菊花链形式可以把所有的外设连接起来,并且不会损失带宽。USB正在取代当前PC上的串口和并口。第17章USB设备驱动431图17-1USB的四条传输线以USB方式连接设备时,所有的外设都在机箱外连接,连接外设不必再打开机箱;允许外设热插拔,而不必关闭主机电源。USB采用“级联”方式,即每个USB设备用一个USB插头连接到另一个外设的USB插座上,而其本身又提供一个USB插座供下一个USB外设连接用。通过这种类似菊花链式的连接,一个USB控制器可以连接多达127个外设,而每个外设间距离(线缆长度)可达5米。USB能智能识别USB链上外围设备的插入或拆卸。它可使多个设备在一个端口上运行,速度也比现在的串行口或并行口快得多,而且其总的连线在理论上说可以无限延长。对PC来说,以上这些都是一些难得的优点,因为不再需要PS/2端口、MIDI端口等各种不同的端口了,还可以随时随地在各种设备上任意插拔。可以在一个端口上运行鼠标、控制手柄、键盘以及其他输入装置(例如数码相机),而且,也不必重新启动系统去做这些工作。现在USB设备正在快速增多,且由于操作系统已内置支持USB的功能,因而用户现在就可以方便地使用。显然,USB为PC的外设扩充提供了一个很好的解决方案。目前USB技术的发展,已经允许用户在不使用网卡、HUB的情况下,直接通过USB技术将几台计算机连接起来组成小型局域网,用户只需要给各台计算机起个名字就可以开始工作。这种网络具备Ethernet网络的各种优点,同时少了Ethernet网络的许多限制。假设一位用户上班时使用笔记本电脑,回家时使用PC机,为实现数据传输,他可以通过采用USB技术的接口将两部电脑连接起来交换资源,其数据传输速度可达12Mbps,这是传统串行口无法比拟的。而且用户在组网的时候根本无须考虑DIP、IRQ等问题。此类技术除支持兼容Ethernet的软硬件外,也支持标准的网络通信协议,包括IPX/SPX、NetBEUI和TCP/IP,这为通过USB技术组成的小局域网连接至大型网络或Internet提供了条件。17.1.2USB连接拓扑结构USB设备的连接如图17-2所示,对于每个PC来说,都有一个或者多个称为Host控制器的设备,该Host控制器和一个根Hub作为一个整体。这个根Hub下可以接多级的Hub,每个子Hub又可以接子Hub。每个USB作为一个节点接在不同级别的Hub上。(1)USBHost控制器:每个PC的主板上都会有多个Host控制器,这个Host控制器其实就是一个PCI设备,挂载在PCI总线上。Host控制器的驱动由微软公司提供,如图17-3所示,这是笔者PC中的Host控制器及USBHub的驱动。值得注意的是,这里Host分别有两种驱动,一种是1.0,另一种是2.0,分别对应着USB协议1.0和USB协Windows驱动开发技术详解432议2.0。第17章USB设备驱动433图17-2USB连接拓扑结构(2)USBHub:每个USBHost控制器都会自带一个USBHub,被称为根(Root)Hub。这个根Hub可以接子(Sub)Hub,每个Hub上挂载USB设备。一般PC有8个USB口,通过外接USBHub,可以插更多的USB设备。当USB设备插入到USBHub或从上面拔出时,都会发出电信号通知系统。这样可以枚举USB设备,例如当被插入的时候,系统就会创建一个USB物理总线,并询问用户安装设备驱动。如图17-4所示为一个典型的USBHub的示意图。图17-3USBHost和USBHub驱动图17-4USBHub示意图(3)USB设备:USB设备就是插在USB总线上工作的设备,广义地讲USBHub也算是USB设备。每个根USBHub下可以直接或间接地连接127个设备,并且彼此不会干扰。对于用户来说,可以看成是USB设备和USB控制器直接相连,之间通信需要满足USB的通信协议。有的USB设备功能单一,直接挂载在USBHub上。而有的USB设备功能复杂,会将Windows驱动开发技术详解434多个USB功能连在一起,成为一个复合设备,它甚至可以自己内部带一个Hub,这个Hub下接多个USB子设备,其和多个子设备作为一个整体当做一个USB设备,如图17-5所示。以上是USB的物理拓扑结构,但对于用户来说,可以略去USBHub的概念,或者说USBHub的概念对于用户可以看成是透明的。用户只需要将USB设备理解成一个USBHost连接多个逻辑设备。可能逻辑设备1和逻辑设备2是集中在第一个物理设备里,例如有的手机连接计算机后,系统会当做多个USB设备加载。因此,作为用户需要用如图17-6所示的逻辑拓扑结构理解USB拓扑结构。图17-5符合设备图17-6USB逻辑拓扑结构但对于具体USB设备来说,每个USB设备的传输绝对不会影响其他USB设备的传输。例如,在有USB设备传输的时候,其他USB设备的带宽不会被占用。对于USB设备来说,每个USB设备是直接连接到USBHost控制器上的。因此,应该用如图17-7所示的视角考虑USB设备的通信。图17-7用户对USB设备的观察17.1.3USB通信的流程USB的连接模式是Host和Devcie的连接模式,它不同于早期的串口和并口,所有的第17章USB设备驱动435请求必须是Host向Device发出,这就使Host端设计相对复杂,而Device端设计相对简单。Host端会在主板的南桥设计好,而Device的厂商众多,厂商只需要遵循USB协议,重点精力可以放在设备的研发上,而与PC的通信不用过多考虑。在USB的通信中,可以看成是一个分层的协议。分为三个层次,即最底层USB总线接口层、USB设备层、功能通信层,如图17-8所示。图17-8USB协议以USB摄像头设备为例,视频播放软件想通过USB总线得到USB摄像头捕捉的视频数据,这就相当于在功能层上。ClinetSW是视频播放软件,Function是USB摄像头。而这些数据的读取需要USB设备层提供的服务,在这一层上,主要是USB设备的驱动调度Host控制器向USB摄像头发出读请求。每个USB设备会有多个管道,使用哪个管道,传输的大小都需要指定。这个层次的USBSystemSW就是USB摄像头的驱动程序。而在USB设备一端一般会有小单片机或者处理芯片负责响应这种读请求,而这一层的传输又依赖于USB总线接口层的服务。在这一层,完全是USB的物理协议,包括如何分成更小的包(packages)传输,如何保证每次包传输不丢失数据等。对于USB设备驱动程序员,主要是工作在USB设备层,向“上”对应用程序提供读写等接口,向“下”将读取某个管道的请求发往USBHost控制器驱动程序,它实现了最底层的传输请求。对于每个USB设备,都有一个或者多个的接口(Interface),每个Interface都有多个端点(Endpoints),每个端点通过管道(Pipes)和USBHost控制器连接。每个USB设备都会有一个特殊的端点,即Endpoint0,它负责传输设备的描述信息,同时也负责传输PC与设备之间的控制信息,如图17-9所示。Windows驱动开发技术详解436图17-9USB管道与端点17.1.4USB四种传输模式当USB插入USB总线时,USB控制器会自动为该USB设备分配一个数字来标示这个设备。另外,在设备的每个端点都有一个数字来表明这个端点。USB设备驱动向USB控制器驱动请求的每次传输被称为一个事务(Transaction),事务有四种类型,分别是BulkTransaction、ControlTransaction、InterruptTransaction和IsochronousTransaction。每次事务都会分解成若干个数据包在USB总线上传输。每次传输必须历经两个或三个部分,第一部分是USB控制器向USB设备发出命令,第二部分是USB控制器和USB设备之间传递读写请求,其方向主要看第一部分的命令是读还是写,第二部分有时候可以没有。第三部分是握手信号。以下针对这四种传输,分别进行讲解。1.Bulk传输事务顾名思义,改种事务传输主要是大块的数据,传送这种事务的管道叫做Bulk管道。这种事务传输的时候分为三部分,如图17-10所示。第一部分是Host端发出一个Bulk的令牌请求,如果令牌是IN请求则是从Device到Host的请求,如果是OUT令牌,则是从Host到Device端的请求。第二部分是传送数据的阶段,根据先前请求的令牌的类型,数据传输有可能是IN方向,也有可能是OUT方向。传输数据的时候用DATA0和DATA1令牌携带着数据交替传送。第三部分是握手信号。如果数据是IN方向,握手信号应该是Host端发出,如果是OUT方向,握手信号应该是Device端发出。握手信号可以为ACK,表示正常响应,也可以是NAK表示没有正确传送。STALL表示出现主机不可预知的错误。在第二部分,即传输数据包的时候,数据传送由DATA0和DATA1数据包交替发送。数据传输格式DATA1和DATA0,这两个是重复数据,确保在1数据丢失时0可以补上,不至于数据丢失。如图17-11所示。第17章USB设备驱动437图17-10Bulk传输图17-11Bulk传输时的令牌2.控制传输事务控制传输是负责向USB设置一些控制信息,传送这种事务的管道是控制管道。在每个USB设备中都会有控制管道,也就是说控制管道在USB设备中是必须的。控制传输也分为三个阶段,即令牌阶段、数据传送阶段、握手阶段,如图17-12所示。图17-12控制传输事务Windows驱动开发技术详解4383.中断传输事务在USB设备中,有种处理机制类似于PCI中断的机制,这就是中断事务。中断事务的数据量很小,一般用于通知Host某个事件的来临,例如USB鼠标,鼠标移动或者鼠标单击等操作都会通过中断管道来向Host传送事件。在中断事务中,也分为三个阶段,即令牌阶段、数据传输阶段、握手阶段,如图17-13所示。图17-13中断传输事务4.同步传输事务USB设备中还有一种事务叫同步传输事务,这种事务能保证传输的同步性。例如,在USB摄像头中传输视频数据的时候会采用这种事务,这种事务能保证每秒有固定的传输量,但与Bulk传输不同,它允许有一定的误码率,这样符合视频会议等传输的需求,因为视频会议首先要保证实时性,在一定条件下,允许有一定的误码率
本文标题:USB驱动开发
链接地址:https://www.777doc.com/doc-3370492 .html