windows xp 驱动开发(四) USB开发技术概述

来源:互联网 发布:手机视频特技软件 编辑:程序博客网 时间:2024/04/30 15:01

转载请标明是引用于 http://blog.csdn.net/chenyujing1234

 

欢迎大家提出意见,一起讨论!

 

参考文章: http://blog.csdn.net/xxxluozhen/article/details/4882121

 

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)将同时占据两层或更多的层。

 

2、2 USB数据流模式

USB 采用轮询的广播机制传输数据,所有的传输都由主机发起(即Host向Device发出),任何时刻整个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 设备来说是透明的、不可见的。


2、3 USB四种传输模式

2、3、1 批量传输

批量传输是一种可靠的单向传输,但延迟没有保证,它尽量利用可以利用的带宽来完成传输,适合数据量比较大的传输。低速USB设备不支持批量传输,高速批量端点的最大包长度为512,全速批量端点的最大包长度可以为8、16、32、64。

批量传输是可靠的传输,需要握手包来表明传输的结果。若数据量比较大,将采用多次批量事务传输来完成全部数据的传输,传输过程中数据包的PID DATA0-DATA1-DATA0-…的方式翻转,以保证发送端和接收端的同步。USB 允许连续3 次以下的传输错误,会重试该传输,若成功则将错误次数计数器清零,否则累加该计数器。超过三次后,HOST 认为该端点功能错误(STALL),放弃该端点的传输任务。一次批量传输(Transfer)由1 次到多次批量事务传输(Transaction)组成。

批量传输在访问USB总线时,相对其他传输类型具有最低的优先级,USB HOST总是优先安排其他类型的传输,当总线带宽有富余时才安排批量传输。高速的批量端点必须支持PING 操作,向主机报告端点的状态,NYET 表示否定应答,没有准备好接收下一个数据包,ACK表示肯定应答,已经准备好接收下一个数据包。

 

2、3、2 控制传输 

控制传输是一种可靠的双向传输,一次控制传输可分为三个阶段。

第一阶段为从HOST 到Device 的SETUP 事务传输,这个阶段指定了此次控制传输的请求类型;

第二阶段为数据阶段,也有些请求没有数据阶段;

第三阶段为状态阶段,通过一次IN/OUT 传输表明请求是否成功完成。

左图为建立阶段的事务传输流程图。可以看出:与批量传输相比,在流程上并没有多大区别,区别只在于该事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。建立阶段过后,可能会有数据阶段,这个阶段将会通过一次或多次控制传输事务,完成数据的传输。同样也会采用PID翻转的机制。建立阶段,Device 只能返回ACK 包,或者不返回任何包。

最后是状态阶段,通过一次方向与前一次相反的控制事务传输来表明传输的成功与否。如果成功会返回一个长度为0 的数据包,否则返回NAK 或STALL。整个控制传输如图2-3-1所示。

控制传输通过控制管道在应用软件和Device 的控制端点之间进行,控制传输过程中传输的数据是有格式定义的,USB 设备或主机可根据格式定义解析获得的数据含义。其他三种传输类型都没有格式定义。

 

控制传输对于最大包长度有固定的要求。对于高速设备该值为64Byte;对于低速设备该值为8;全速设备可以是8 或16 或32 或64个字节。

控制传输在访问总线时也受到一些限制,如:

n    高速端点的控制传输不能占用超过20%的微帧,全速和低速的则不能超过10%。

n    在一帧内如果有多余的未用时间,并且没有同步和中断传输,可以用来进行控制输。

USB 允许连续3 次以下的传输错误,会重试该传输,若成功则将错误次数计数器清零,否则累加该计数器。超过三次后,HOST 认为该端点功能错误(STALL),放弃该端点的传输任务。

 

2、3、3 中断传输

中断传输是一种轮询的传输方式,是一种单向的传输,HOST 通过固定的间隔对中断端点进行查询,若有数据传输或可以接收数据则返回数据或发送数据,否则返回NAK,表示尚未准备好。中断传输的延迟有保证,但并非实时传输,它是一种延迟有限的可靠传输,支持错误重传。对于高速/全速/低速端点,最大包长度分别可以达到1024/64/8 Bytes。高速中断传输不得占用超过80%的微帧时间,全速和低速不得超过90%。

中断端点的轮询间隔由在端点描述符中定义,全速端点的轮询间隔可以是1~255mS,低速端点为10~255mS,高速端点为(2interval-1)*125uS,其中interval 取1到16 之间的值。

除高速高带宽中断端点外,一个微帧内仅允许一次中断事务传输,高速高带宽端点最多可以在一个微帧内进行三次中断事务传输,传输高达3072 字节的图2-3-2为中断事务图,从图中可以看出中断传输在流程上除不支持PING 之外,其他的跟批量传输是一样的。他们之间的区别也仅在于事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。

2、3、4  同步传输

同步传输是一种实时的、不可靠的传输不支持错误重发机制。只有高速和全速端点支持同步传输,高速同步端点的最大包长度为1024,低速的为1023。除高速高带宽同步端点外,一个微帧内仅允许一次同步事务传输,高速高带宽端点最多可以在一个微帧内进行三次同步事务传输,传输高达3072字节的数据。同步传输事务如图2-3-4所示全速同步传输不得占用超过80%的帧时间,高速同步传输不得占用超过90%的微帧时间。同步端点的访问也和中断端点一样,有固定的时间间隔限制。

=====================================================================

USB控制器的工作原理:

当USB控制器从USB总线检测到主机启动的某一传输请求时,USB控制器通过中断方式

将此请求通知主机系统,主机系统通过访问USB控制器的状态寄存器和数据寄存器获得与

此次传输有关的各种参数;

并根据具体传输参数,对USB控制寄存器和数据寄存器进行相应

的操作,以完成主机的传输请求.

2、4  USB协议层规范

2、4、1 分层的协议

    可以分为三个层次,即最底层USB总线接口层USB设备层功能通信层

以USB摄像头为例,USB驱动调度Host控制器向USB摄像头发出请求。每个USB设备有多个管道,使用哪个生产管道,传输大小都要指定。

而在USB设备一端会有小单片机或者处理芯片负责响应这种请求。

 

2、4、2 数据格式

USB 采用little edian字节顺序,在总线上先传输一个字节的最低有效位,最后传输最高有效位,采用NRZI编码,若遇到连续的61要求进行为填充,即插入一个0

 

(1)  所有的USB 包都由SYNC开始,高速包的SYNC宽度为32bit,全速/低速包的SYNC段度为8bit。实际接收到的SYNC长度由于USB HUB的关系,可能会小于该值。

(2)  PID 表征了数据包的类型,分为令牌(Token)、数据(Data)、握手(Handshacke)以及特殊包4大类,共16种类型的PID

PID这个字段对理解信息包到关重要。USB协议规定数据传输由事务(Transactiion)组成, 而事务由信息包组成。

大量的事务包含三个信息包: 令牌信息包、数据信息包和握手信息包。

信息包根据PID字段来区分不同类型。

(2.1) 对于令牌包来说,PID 之后是7位的地址和4位的端点号。令牌包没有数据域,以5位的CRC 校验和结束。SOF 是一类特殊的令牌包,PID 后跟的是11位的帧编号。

令牌信息包括四种类型:

(2.1.1)   OUT  表示主机输出数据到设备;

(2.1.2)   IN     表示主机从设备读取数据;

(2.1.2)   SOF  表示帧号开始;

(2.1.3)   SETUP 专用于控制传输的设置事务。

(2.2) 对于数据包来说,PID 之后直接跟数据域,数据域的长度为N 字节,数据域后以16 位的CRC校验和结束。

(2.3) 握手包仅有PID 域,没有数据也没有校验和。

分离传输会用到一类特殊的包,Start-Split 和Complete-Split 包,格式如下:

在Start-Split 和Complete-Split 包中主要指定了此次分离传输所在的HUB 的地址和下行端口编号以及端点类型(控制、中断、批量、同步)。以及此次传输中数据包在整个数据中的位置(第一个包、中间的包、末尾的包)。

握手包包括ACKNAKSTALL以及NYET四种,其中ACK 表示肯定的应答,成功的数据传输;NAK 表示否定的应答,失败的数据传输,要求重新传输;STALL 表示功能错误或端点被设置了STALL 属性;NYET 表示尚未准备好,要求等待。

数据在USB 总线上的传输以为单位,包只能在帧内传输。高速USB总线的帧周期为125uS,全速以及低速USB总线的帧周期为1mS。帧的起始由一个特定的包(SOF)表示,帧尾为EOFEOF 不是一个包,而是一种电平状态,EOF 期间不允许有数据传输。

(3)   地址字段,用于指明USB主机究竟是要和哪个设备通信,设备的地址初始默认为0,主机会在设备检测阶段给设备分配一个地址。
(4)   端点字段,用于指明USB主机究竟是要和设备的哪个端点进行通信。如前所述,一个设备可以有多个端点。
(5)   帧号码字段,USB主机把USB总线上的实际数据传输按时间分割成一块块的帧(Frame)或微帧(Micro Frame)。对于全速和低速的设备,主机将传输分成1帧,           对于高速设备主机将传输分成125微秒的微帧。帧号码字段就是用于识别特定的帧或微帧,它由硬件自动处理。
(6)   数据字段,为实际要传输的数据。
(7)   校验字段,用于信息包的数据校验,它由硬件自动处理。

2、4、3  事务


 USB协议规范将事务定义为“将一个服务传送到一个端点”,这里的服务指的是主机传送信息给设备,或是主机从设备接收信息。每一个传输可以包含一笔或多笔事务,而每一笔事务可以包含一个、二个或三个信息包,可以把信息包理解为数据传输物理上的基本单位。大部分事务都包含三个信息包:令牌信息包、数据信息包和联络信息包。

每一种传输类型(控制、中断、批量以及同步)包含一个或多个阶段,而每一个阶段包含一个或多个事务

在控制传输中,一般包含设置事务阶段(对应于设置事务类型)、数据阶段(对应于输入或输出事务类型)以及状态阶段(对应于输入或输出事务类型,以表明整个控制传输是否成功);

而中断、批量以及同步传输中只包含数据阶段。

 

 2.5  控制器的固件编程
 USB接口芯片收到数据或发送出数据后都会产生中断,所以固件编程的核心就是编写中断服务程序。这项工作主要就是根据相关寄存器的标志来对各个端点缓冲区的数据进行处理。可以把中断服务程序分为一些功能模块(函数)来考虑:

(1)端点0的响应。当设备插上USB接口后,主机会发出一系列的请求给设备的端点0,设备的固件程序应该能在端点0对这些要求进行正确响应。

(2)其他端点的数据通信过程。通过(1)主机就能知道设备端点的使用情况,以后就可以通过其他端点以设定的传输方式来交换数据。

(3)实现设备类别遵循的协议规范。例如,如果要设计U盘,则U盘的固件程序就要实现对Mass Storage Class规范中的UFI命令规范的支持。

 

原创粉丝点击