USB to UART in VxWorks

VxWorks驱动开发原理 USB驱动 1

6.1 USB规范简介

6.1.1 概述

本章不打算用太多的篇幅描述USB规范中的内容,仅仅对USB的一些规范做大概的描述,以致于读者在后面软件分析过程中不觉得过于突兀,但是如果要想清除的进行软件分析,必须认真阅读USB的相关规范。

USB是一种支持热插拔的高速串行传输总线,它使用差分信号来传输数据,最高速度可达480Mb/S。USB2.0被设计成为向下兼容的模式,当有全速(USB1.1)或者低速(USB1.0)设备连接到高速(USB2.0)主机时,主机可以通过分离传输来支持它们。

一个USB HOST最多可以同时支持128个地址,地址0作为默认地址,只在设备枚举期间临时使用,而不能被分配给任何一个设备,因此一个USB HOST最多可以同时支持127个地址,如果一个设备只占用一个地址,那么可最多支持127个USB设备。在实际的USB体系中,如果要连接127个USB设备,必须要使用USB HUB,而USB HUB也是需要占用地址的,所以实际可支持的USB功能设备的数量将小于127。

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

管道(Pipe)是主机和设备端点之间数据传输的模型,共有两种类型的管道:无格式的流管道(Stream Pipe)和有格式的信息管道(Message Pipe)。任何USB设备一旦上电就存在一个信息管道,即默认的控制管道,USB主机通过该管道来获取设备的描述、配置、状态,并对设备进行配置。

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

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

  • 控制传输:主要用于在设备连接时对设备进行枚举以及其他因设备而已的特定操作。
  • 中断传输:用于对延迟要求严格、小量数据的可靠传输,如键盘、游戏手柄等。
  • 批量传输:用于对延迟要求宽松,大量数据的可靠传输,如U盘等。
  • 同步传输:用于对可靠性要求不高的实时数据传输,如摄像头、USB音响等。

注意:中断传输并不意味这传输过程中,设备会先中断HOST,继而通知HOST启动传输。中断传输也是HOST发起的传输,采用轮询的方式询问设备是否有数据发送,若有则传输数据,否则NAK主机。

USB设备通过管道和HOST通信,在默认控制管道上接受并处理以下三种类型的请求:

  • 1. 标准请求:一共有11个标准请求,如得到设备描述、设置地址、得到配置描述等。所有USB设备均应支持这些请求。HOST通过标准请求来识别和配置设备。
  • 2. 类(class)请求:USB还定义了若干个子类,如HUB类、大容量存储器类等。不同的类又定义了若干类请求,设备应该支持其所属类的请求。
  • 3. 厂商请求:这部分请求并不是USB规范定义的,而是设备生产商为了实现一定的功能而自己定义的请求。

USB HUB提供了一种低成本、低复杂度的USB接口扩展方法。HUB的上行PORT面向HOST,下行PORT面向设备(HUB或功能设备)。在下行PORT上,HUB提供了设备连接检测和设备移除检测的能力,并给各下行PORT供电。HUB可以单独使能各下行PORT,不同PORT可以工作在不同的速度等级(高速/全速/低速)。

USB HOST在USB体系中负责设备连接/移除的检测、HOST和设备之间控制流和数据流的管理、传输状态的收集、总线电源的供给。

6.1.2 USB数据流模型

USB 体系在实现时采用分层的结构,如图6.1所示:

图6.1 USB体系的分层结构

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

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

图6.2 USB应用软件和USB设备的逻辑关系

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

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

6.1.3 USB协议层规范

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

USB数据包的格式如表6.1所示。

表6.1 USB的数据包格式

其中PID表征了数据包的类型,分为令牌(Token)、数据(Data)、握手(Handshacke)以及特殊包4大类,共16种类型的PID。具体数据包类型的定义可参考USB规范。

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

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

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

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

6.1.4 事务传输(Transaction)的流程

SB的事务传输流程随着传输类型的不同而有所不同。

1. 批量传输

图6.3一个方框表示一个Packet,灰色的包表示主机发出的包,白色的包表示Device发出的包。批量传输是可靠的传输,需要握手包来表明传输的结果。若数据量比较大,将采用多次批量事务传输来完成全部数据的传输,传输过程中数据包的PID按照DATA0-DATA1-DATA0-…的方式翻转,以保证发送端和接收端的同步。

图6.3 批量传输流程

一次批量传输(Transfer)由 1 次到多次批量事务传输(Transaction)组成。

2. 控制传输

一次控制传输分为三(或两个)个阶段:建立(Setup)、数据(DATA)(可能没有)以及状态(Status)。每个阶段都由一次或多次(数据阶段)事务传输组成。

图6.4为建立阶段的事务传输流程图。可以看出:与批量传输相比,在流程上并没有多大区别,区别只在于该事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。

图6.4 控制传输流程

建立阶段过后,可能会有数据阶段,这个阶段将会通过一次或多次控制传输事务,完成数据的传输。同样也会采用PID翻转的机制。建立阶段,Device只能返回 ACK包,或者不返回任何包。

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

图6.5 控制传输数据包示意图

3. 中断传输

中断传输在流程上跟批量传输之间的区别也仅在于事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样。

主机在排定中断传输任务时,会根据对应中断端点描述符中指定的查询间隔发起中断传输。中断传输有较高的优先级,仅次于同步传输。 

同样中断传输也采用PID翻转的机制来保证收发端数据同步。图6.6为中断传输的流程图。

图6.6 中断事务传输的流程图

4. 同步传输

图6.7 同步传输流程图

同步传输是不可靠的传输,所以它没有握手包,也不支持PID翻转。主机在排定事务传输时,同步传输有最高的优先级。

图6.8是USB总线上的数据时序图。

图6.8 同步传输在USB总线上的数据时序图

包是 USB 总线是数据传输的最小单位,不能被打断或干扰,否则会引发错误。若干个数据包组成一次事务传输,一次事务传输也不能打断,属于一次事务传输的几个包必须连续,不能跨帧完成。

一次传输由一次到多次事务传输构成,可以跨帧完成。 

这一节主要介绍了USB的基本原理。本文主要参考了Hevry翻译的USB2.0规范,更详细的情况可以参考USB2.0 specification。