USB 2.0规范中译本 第五章 USB数据流模型(上)

第五章 USB数据流模型

本章介绍了数据是如何通过USB进行传输的。本章中的内容关系所有开发者。呈现的内容层级在系统的信令和协议定义之上。请参阅第7章和第8章,了解有关USB系统部分的更多详细信息。本章提供的框架信息在第9章到第11章中有进一步的扩展。所有开发者都应该阅读本章,这样他们才能理解USB的关键概念。

5.1 开发者视角

USB提供主机和连接的USB设备之间的通信服务。然而,终端用户(end user)看到的将一个或多个USB设备连接到主机的简单视图就如图5-1所示,实际上的实现比图中所示的要复杂一些。从不同开发者的角度来解释特定的USB需求,需要不同的系统视图。USB有几个必须支持的重要的概念和功能,为最终用户提供目前PC所需的可靠操作。为了便于解释,将USB以分层的方式呈现,并允许特定USB产品的开发者专注于与其产品相关的特定细节。

 图5-2显示了一个更深层次的USB总线概述,确定了系统的不同层,这些层将在本规范的其余部分中详细描述。具体而言,有四个重点开发领域:

  • USB物理设备:USB电缆末端的硬件,它执行一些有用的终端用户功能。
  • 客户端软件:在主机上执行的软件,对应USB设备。该客户端软件通常与操作系统一起提供,或者与USB设备一起提供。
  • USB系统软件:在特定操作系统中支持USB的软件。USB系统软件通常与操作系统一起提供,独立于特定的USB设备或客户端软件。
  • USB主机控制器(主机端总线接口):允许USB设备连接到主机的硬件和软件。

四个USB系统组件之间有共享的权利和责任。本规范的其余部分描述了支持一个function和它的客户端之间的健壮性、可靠的通信流所需的细节。

如图5-2所示,主机到设备的简单连接需要多个层和实体之间的连接交互。USB总线接口层(USB Bus Interface)提供主机和设备之间的物理/信令/数据包的连接。USB设备层(USB device layer)是USB系统软件对设备执行USB操作的视图层。function层通过适当匹配的客户端软件层为主机提供附加功能。USB设备层和fucntion层都有各自层内的逻辑通信视图,它们实际上使用USB接口层来完成数据传输。

第6、7和8章中描述的USB通信的物理视图与第9和10章中介绍的逻辑通信视图相关。本章描述了那些影响USB开发者的关键概念,在继续阅读本规范的其余部分之前,所有人都应该阅读这些概念,以找到与他们的产品最相关的细节。

为了描述和管理USB通信,以下概念很重要:

  • 总线拓扑:第5.2节介绍了USB的主要物理和逻辑组件以及它们之间的相互关系。
  • 通信流模型:第5.3至5.8节描述了主机和设备之间如何通过USB通信,并定义了四种USB传输类型。
  • 总线访问管理:第5.11节描述了主机如何管理总线访问,以支持USB设备的各种通信流。
  • 同步传输的特殊考虑:第5.12节介绍了需要同步传输数据的设备所特有的USB总线特性。非同步设备的设备实现者不需要阅读第5.12节。

 

5.2 总线拓扑

USB拓扑有四个主要部分:

  • 主机和设备:USB系统的主要组件
  • 物理拓扑:USB元件之间如何连接
  • 逻辑拓扑:描述各种USB元素的角色和职责,以及从主机和设备的角度看USB是如何工作的
  • 客户端软件到function的关系:客户端软件和它在一个USB设备上的相关function接口如何向对方通信

5.2.1 USB主机

主机的逻辑组成如图5-3所示,包括以下内容:

  • USB主机控制器
  • USB系统软件集合(包含USB驱动程序、主机控制器驱动程序和主机软件)
  • 客户软件

 USB主机作为USB总线的协调实体占据着独特的地位。除了其特殊的物理位置之外,主机还对USB及其附属设备负有特定的责任。主机控制对USB总线的所有访问。只有被主机授予访问权时一个USB设备才能访问总线。主机还负责监控USB的拓扑结构。

关于host及其职责的完整讨论,请参阅第10章。

5.2.2 USB设备

USB物理设备的逻辑组成如图5-4所示,包括以下内容:

  • USB总线接口
  • USB逻辑设备
  • Function

USB物理设备为主机提供了额外的功能。USB设备提供的功能类型差异很大。然而,所有的USB逻辑设备向主机提供统一的基本接口。这允许主机以相同的方式管理不同USB设备(USB层面的控制,具体业务逻辑USB设备自己处理)。

为了帮助主机识别和配置USB设备,每个设备都会携带并向主机报告其配置相关的信息。报告中的一些信息在所有逻辑设备中是统一的,其他信息特定于设备提供的功能。该信息的详细格式因设备的设备类别而异。

关于USB设备的完整讨论,请参考第9章。

5.2.3 物理总线拓扑

如图5-5所示,USB上的设备通过分层星型拓扑结构物理连接到主机。UISB连接点由一种称为hb特殊的USB设备提供。hub提供的附加连接点称为端口。主机包括一个称为root hub的嵌入式集线器。主机通过根集线器提供一个或多个连接点。向主机提供附加功能的USB设备称为function。为了防止循环连接,对USB的星型拓扑结构进行了分层排序。这导致了如图5-5所示的树状结构。

多种功能可以封装在一个看似单一的物理设备中。例如,一个键盘和一个轨迹球可以组合在一个单独的包中。在包内,单个功能永久连接到一个集线器,而内部hub连接到USB总线。当多个function与一个hub组合在一个包中时,它们被称为复合设备。复合设备中的hub和连接到hub的每个function都分配有自己的设备地址。具有多个相互独立控制的接口(interface,后面会提到该描述符,一种interface表示一种功能)的设备称为复合设备。复合设备整体在USB总线上只有一个设备地址。从主机的角度来看,复合设备就像一个独立的hub,具有多种附加功能。图5-5展示了一个复合设备。

hub在高速系统中起着特殊的作用。hub将全速/低速信号环境与高速信号环境隔离开来。图5-6显示了高速hub支持连接的高速设备。hub还允许USB1.1 hub以全速/低速与其他仅全速/低速设备连接并运行。主机控制器还支持直接连接全/低速设备。第11章详细描述了hub如何实现两个信令环境的隔离。

5.2.4 逻辑总线拓扑

当设备以分层星形拓扑物理连接到USB总线时,主机与每个逻辑设备通信,就好像它直接连接到根端口一样。这创建了图5-7所示的逻辑视图,它对应于图5-5所示的物理拓扑。hub也是逻辑设备,但为了简化起见,图5-7中没有显示。尽管大多数主机/逻辑设备活动都使用这种逻辑视角,但主机会保持对物理拓扑的监视,以支持集线器的移除事件的处理。移除hub时,必须从主机的逻辑拓扑视图中移除所有连接到hub的设备。关于hub的更完整的讨论可以在第11章中找到。

 5.2.5 客户端软件与fucntion的关系

尽管USB的物理和逻辑拓扑反映了总线的共享特性,但客户端软件(CSw)仅操作其感兴趣的USB function接口(interface)。用于USB function对应的客户端软件必须使用USB软件编程接口来操作function,而不是与其他总线一样(例如,PCI、EISA、PCMCIA等)通过内存或I/O访问直接操纵其功能。在操作过程中,客户端软件设计应独立于可能连接到USB的其他设备。这使得设备和客户端软件的设计者能够专注于硬件/软件交互设计细节。图5-8从设备设计者的角度说明了客户端软件和USB fucntion相对于图5-7的USB逻辑拓扑的关系。

 

 5.3 USB通信流

USB提供主机上的软件与其USB function之间的通信服务。对于不同的客户端到function的交互,function可以有不同的通信流需求。通过将不同的通信流分离为不同的USB function,USB可以提供更好的整体总线利用率。每个通信流都利用一些总线访问来完成客户端和功能之间的通信。每个通信流都在设备的端点(endpoint)终止。设备端点将识别并接收每个通信流。

图5-9显示了比图5-2的更详细的视图。图5-2中真实通信流的完整定义支持逻辑设备和function层通信流。真实的通信流跨越了几个接口边界。第6章到第8章描述了USB“电线”的机械、电气和协议接口定义,第9章描述了允许从主机端操纵USB设备的USB设备编程接口。第10章描述了两个主机端软件接口:

  • 主机控制器驱动程序(HCD):USB主机控制器和USB系统软件之间的软件接口。该接口允许一系列主机控制器实现,而不要求所有主机软件依赖于任何特定实现。一个USB驱动程序可以支持不同的主机控制器,而不需要特定的主机控制器实现知识。主机控制器实现者提供支持主机控制器的HCD实现。
  • USB驱动程序(USBD):USB系统软件和客户端软件之间的接口。该接口为客户端提供了操作USB设备的便利功能。

 在USB系统中,USB逻辑设备表现为一组端点。端点被分组到不同接口(interface)的端点集。接口是function的视图。USB系统软件使用默认控制管道管理设备。客户端软件使用管道集(与端点集相关联)管理接口。客户端软件请求在主机上的缓冲区和USB设备上的端点之间通过USB传输。主机控制器(或USB设备,取决于传输方向)将数据打包,通过USB传输。当使用总线访问通过USB传输数据包时,主机控制器也会进行协调。

图5-10说明了通信流是如何在端点和主机端内存缓冲区之间的管道上传输的。以下部分将更详细地描述端点、管道和通信流。

主机上的软件通过一组通信流与逻辑设备通信。通信流组由设备软件/硬件设计者选择,以有效地将设备的通信要求与USB提供的传输特性相匹配。

5.3.1 设备端点

端点是USB设备中唯一可识别的部分,是主机和设备之间通信流的终点。每个USB逻辑设备都由一组独立的端点组成。每个逻辑设备在设备连接时都有一个由系统分配的唯一地址。设备上的每个端点在设计时都有一个唯一的设备确定标识符,称为端点号。每个端点都有一个由设备确定的数据流方向。设备地址、端点号和方向的组合可以确定唯一的端点。每个端点都是单工连接,支持单向数据流:输入(从设备到主机)或输出(从主机到设备)。

端点具有决定端点和客户端软件之间所需的传输服务类型的特征。端点通过以下方式描述自己:

  • 总线访问频率/延迟要求
  • 带宽要求
  • 端点号
  • 错误处理行为要求
  • 端点能够发送或接收的最大数据包大小
  • 端点的传输类型(详情参见第5.4节)
  • 端点和主机之间数据传输的方向

端点编号为零的端点以外的端点在配置前处于未知状态,在配置完成前主机可能无法访问。

5.3.1.1 零号端点需求

所有的USB设备都需要实现一种默认的控制方法,该方法使用到端点号为零的输入和输出端点。USB系统软件使用这种默认控制方法来初始化和操作逻辑设备(例如,配置逻辑设备),该方法的传输管道即为默认控制管道(参见第5.3.2节)。默认控制管道提供对设备配置信息的访问,并允许通用的USB状态和控制访问。默认控制管道支持第5.5节中定义的控制转移。当设备连接、通电并接收到总线复位信号,端点编号为零的端点总是可访问的。

能够高速运行的USB设备必须具备全速运行的最低支持级别。当设备连接到全速运行的hub时,设备必须:

  • 能够成功复位为全速模式
  • 正常并成功响应标准请求:设置地址、设置配置、获取设备描述符和配置描述符,并返回适当的信息

全速模式运行时,高速设备可能支持也可能不支持其预期功能。

5.3.1.2 非零号端点需求

function可以根据实现需要拥有额外的端点。除了实现默认控制管道所需的两个端点之外,低速function仅限两个可选端点。全速设备可以具有仅受协议定义限制的额外端点(即,最多15个附加输入端点和15个附加输出端点)。

在设备配置完成之前,不能使用默认控制管道以外的端点(参见第9章)。

5.3.2 管道

USB管道是设备上的端点和主机上的软件之间的关联。管道表示通过内存缓冲区和设备上的端点在主机上的软件之间传输数据的能力。有两种互斥的管道通信模式:

  • 流:通过管道传输的数据没有USB定义的结构
  • 消息:通过管道传输的数据有一些USB定义的结构

USB不解释它通过管道传输的数据内容。即使消息管道要求数据根据USB定义来构造,数据的内容也不由USB来解释。

此外,管道具有以下关联:

  • 关于USB总线访问和带宽使用的声明。
  • 传输类型
  • 相关端点的特征,如方向和最大数据负载大小。数据有效负载是总线事务中数据包的数据字段中携带的数据(如第8章所定义)。

由端点编号为零的两个端点组成的管道称为默认控制管道。一旦设备通电并收到总线复位信号,该管道始终可用。当配置了一个USB设备时,其他管道就出现了。USB系统软件使用默认控制管道来确定设备标识和配置要求,以及配置设备。设备配置后,默认控制管道也可以由特定设备的软件使用。USB系统软件保留默认控制管道的“所有权”,并协调其他客户端软件对管道的使用。

软件客户端通常通过I/O请求包(IRPs)向管道请求数据传输,然后等待或在传输完成时收到通知。有关IRPs的详细信息不同操作系统有不同的定义方式。该规范使用术语来简单地指代软件客户端的可识别请求(request),该request请求在它自己(在主机上)和设备的端点之间以适当的方向传输数据。如果需要,软件客户端可以让管道返回所有未完成的IRPs。当与其相关联的总线事务已经成功完成或者由于错误而完成时,软件客户端被通知IRP已经完成。

如果管道没有等待处理或正在处理的IRPs,则管道处于空闲状态,主机控制器不会对管道采取任何措施;即,这种管道的端点不会看到任何指向它的总线事务。总线活动出现在管道上的唯一时间是该管道的IRPs出现的时间。

如果非同步管道遇到 导致其向主机发送STALL的条件发生(参见第8章),或者在IRP的任何数据包上遇到三个总线错误,则IRP被中止/退出,所有未完成的IRPs也被退出,并且在软件客户端从该状态(以依赖于实现的方式)恢复并通过USBD调用来确认暂停或错误条件之前,不再接受任何其他IRPs。总线将会使用适合的状态通知客户端软件导致IRP暂停和错误的原因。(参见第10章)。第5.6节描述了同步管道行为。

IRP可能会需要多个数据有效负载来通过总线传输客户端数据。这种需要多数据负载传输数据的情况下,总线期望单个数据负载大小为配置最大包大小,直到最后一个数据负载包含整个IRP的剩余部分。有关更多详细信息,请参见每种传输类型的描述。对于这样的IRP,输入端的短分组(即,小于最大大小的数据有效载荷)如果没有完全填满IRP数据缓冲器,可能是两种可能的含义之一,这取决于客户的期望:

  • 客户端期望一个IRP数据大小可变的。在这种情况下,没有填满IRP buffer的短分组可以简单地用作带内定界符,以指示“数据单元的结束”。收到该段分组数据时,IRP应该毫无错误地结束,而主机控制器应该前进到下一个IRP。
  • 客户端期望一个IRP数据大小为固定或特定大小的。在这种情况下,没有填满IRP buffer的短分组指示着错误存在。IRP应该结束,管道应该停止使用,任何管道内未处理的IRPs也应该结束。

因为主机控制器在这两种情况下必须有不同的行为,并且它自己不知道对于给定的IRP应该采取哪种行为方式;可以根据IRP指出客户期望的主机控制器行为。

端点可以通过回应NAK来通知主机它正忙。NAKs不被用作将IRP返还给软件客户端的结束条件。在处理给定的IRP期间,可能会遇到任何数量的NAKs。对事务的NAK响应不构成错误,也不被视为上述三个错误之一。

5.3.2.1 流管道

流管道在总线事务的数据包部分中传输数据,数据内容上不需要USB规定的结构或者格式。数据从流管的一端流入,从另一端以相同的顺序流出。流管在它们的通信流中总是单向的。

通过流管道传输的数据被期望是仅和单个用户(USB总线所认为的)进行交互。不要求USB系统软件在多个用户使用同一个流管道的情况下提供同步机制。在流管道的数据将按顺序传输:先进先出。

一个设备使用到流管道时,流管道将会被绑定到该设备的一个合适传输方向的端点号(即,对应于协议层定义的输入或输出令牌)。相反方向的设备端点号可用于设备的其他一些流管道。

流管道支持大容量、等时和中断传输类型,这将在后面的章节中解释。

5.3.2.2信息管道

消息管道与端点的交互方式不同于流管道。首先,主机向USB设备发送请求。该请求之后是适当方向的数据传输。最后,一个状态阶段会在稍后的某个时间出现。为了协调请求/数据/状态时序,消息管道在通信流上制定了一种结构,使得命令可以被可靠地识别和传输。消息管道允许双向通信流,尽管通信流可能主要是单向的。默认控制管道始终是一个消息管道。

USB系统软件确保多个请求不会同时发送到一个消息管道。设备应该一个时间内只处理每个消息管道内的一个消息请求。主机上的多个软件客户端可以通过默认控制管道发出请求,但它们会以先进先出的顺序发送到设备。设备可以根据其对主机事务的响应能力来控制数据和状态阶段的信息流(有关更多详细信息,请参考第8章)。

在当前消息在设备上的处理完成之前,消息管道通常不会从主机发送下一条消息。但是,当存在错误的条件下,主机可以终止该消息的传输,此时消息管道可以提前发送新的消息传输(从设备的角度来看是提前的)。从操作消息管道的软件的角度来看,IRP的某个部分出错会使当前的IRP和所有排队的IRP失效,此时请求IRP的软件客户端会被通知IRP完成,并带有适当的错误提示(错误码之类)。

设备的两个方向上的消息管道各自一个设备端点号(输入和输出令牌)。USB不允许消息管道与不同方向的不同端点号相关联。

消息管道支持控制传输类型,这将在第5.5节中解释。

5.3.3 帧和微帧

在全速/低速总线上,USB建立了一个1毫秒的时基,称为帧;在高速总线上,建立了一个125微秒的时基,称为微帧。一个(微型)帧可以包含多个事务。每种传输类型定义了端点在(微)帧内允许的事务。每隔N(微)帧总线会提供同步和中断端点传输的机会。第5.6节和第5.7节描述了N的值和其他有关同步和中断传输的细节。

5.4 传输类型

USB通过管道在客户端软件的内存缓冲区和USB的端点之间传输数据。通过消息管道传输的数据以USB定义的结构承载,但USB允许特定设备的结构化数据在USB定义的消息数据负载内传输(个人认为这里是指特定设备自己的消息可能也会自己的结构,但是在消息管道传输时,仍要在自定义结构之外遵循USB定义的消息结构)。USB还定义了通过总线传输的数据被打包用于任何管道(流或消息),但最终在总线事务的数据负载中传输的数据的格式化和解释是使用管道的客户端软件和function的责任。

然而,USB提供了不同的传输类型,这些传输类型经过优化,能够更紧密地匹配使用管道的客户端软件和function的服务需求。IRP使用一个或多个总线事务在软件客户端及其function之间传输信息。

每种传输类型决定了通信流的各种特性,包括:

  • 由USB定义的传输需要使用的数据格式
  • 通信流的方向
  • 数据包大小限制
  • 延迟限制
  • 所需的数据序列
  • 错误处理

USB设备的设计者为设备的端点选择功能。当为端点建立管道时,大多数管道的传输特性被确定,并在管道的使用寿命内保持固定。针对每种传输类型描述了可以修改的传输特性。

USB定义了四种传输类型:

  • 控制传输:突发的、非周期性的、主机软件发起的请求/响应通信,通常用于命令/状态操作。
  • 等时传输:主机和设备之间的周期性连续通信,通常用于与时间相关的信息。这种传输类型还保留了封装在数据中的时间概念。然而,这并不意味着这些数据的交付需求总是时间紧迫的。
  • 中断传输:低频、有限延迟的通信。
  • 批量传输:非周期性的大数据包突发通信,通常用于可以使用任何可用带宽的数据传输,也可以延迟到带宽可用时再进行传输。

以下四个主要部分详细描述了每种传输类型。如第8.3.4节所述,任何IRP的数据都由数据包的数据字段携带。第8章还描述了受每种特定传输类型影响的协议细节。

5.4.1 表格计算示例

以下各节描述了每种USB传输类型。在这些部分中,有一些表格说明了一个(微)帧中可以包含的最大事务数量。这些表可用于确定特定传输类型可能的最大传输性能。实际性能可能因具体的系统实现细节而异。

每个表格将会显示:

  • 特定传输类型(和速度)所需的协议开销
  • 对于某些样本数据的有效负载大小:
  • 1.这种情况下可能的最大持续带宽
  • 2.每个事务所需的(微)帧的百分比
  • 3.特定情况下(微)帧中的最大事务数
  • 4.特定情况下不需要的(微)帧中的剩余字节
  • 5.特定情况下在单个(微)帧中传输的数据字节总数

特定传输类型的事务通常需要多个数据包。每个事务的协议开销包括:

  • 每个数据包的同步字段:8位(全速/低速)或32位(高速)
  • 每个数据包的一个PID字节:包括PID和PID反相(校验)位
  • 每个数据包的一个EOP:3位(全速/低速)或8位(高速)
  • 在令牌包中,端点号、设备地址和CRC5字段(总共16位)
  • 在数据包中,CRC16字段(总共16位)
  • 数据包中的任何数据字段(每字节8位)
  • 对于有多个包的事务,需要包间间隙或总线周转时间。

对于这些计算,假设不需要位填充。

以低速中断输出为例,事务中有5个数据包:

  • 一个 PRE 特殊包
  • 一个令牌包
  • 一个 PRE 特殊包
  • 一个数据包
  • 一个握手包

数据和握手包之间有一个总线周转。因此,协议开销为:

5个SYNC、5个PID、端点+ CRC5、CRC16、5个EOPs和分组间延迟(一个总线周转、一个分组间延迟和两个hub的建立时间)。

 

5.5 控制传输

控制传输允许访问设备的不同部分。控制传输一般用来支持客户端软件和它对应的function之间的配置/命令/状态类型的通信流传输。控制传输由从host到function传输request信息的总线建立(SETUP)事务、以SETUP事务指定的方向发送数据的0个或者多个数据事务以及从function返回给host的状态事务组成。当端点成功完成请求的操作时,状态事务返回“成功”。第8.5.3节描述了使用什么包、总线事务和事务序列来完成控制传输的细节。第9章描述了定义的USB命令代码的细节。

每个通USB设备都需要将默认控制管道实现为消息管道,且该管道由USB系统软件使用。默认控制管道提供对USB设备的配置、状态和控制信息的访问。一个function可以为它自己的实现需求提供额外控制管道的端点,但不是必须。

USB设备框架(参见第9章)定义了可用于操纵设备状态的标准、设备类别或供应商特定的请求。还定义了能包含设备上的不同信息的描述符。控制传输提供了访问设备描述符和请求设备操纵其行为的传输机制。

控制传输仅通过消息管道进行。因此,使用控制传输的数据流必须符合第5.5.1节所述的USB数据结构定义。

USB系统将尽最大努力支持主机和设备之间的控制传输。一个function及其客户端软件不能为控制传输请求特定的总线访问频率或带宽。USB系统软件可能会限制设备控制传输所需的总线访问和带宽。这些限制在第5.5.3节和第5.5.4节中定义。

5.5.1 控制传输数据格式

建立(SETUP)包具有由USB定义的结构,该结构可容纳主机和设备之间进行通信所需的最少命令集。结构定义允许厂家拓展用于特定设备的命令。SETUP事务之后的数据拥有USB定义的结构,除了携带供应商自定义的信息。状态事务也有USB定义的结构。第8.5.3节和第9章描述了具体的控制传输设置/数据定义。

5.5.2 控制传输方向

USB通过信号管道上的双向通信流来支持控制传输。因此,当配置控制管道时,它使用具有指定端点号的输入和输出端点。

5.5.3 控制传输包大小限制

用于控制传输的端点指定了端点能够接收或者发送的最大数据负载大小。全速设备允许的最大控制传输负载大小为8、16、32或者64字节;对于高速设备,它是64字节,对于低速设备,它是8字节。该最大值适用于SETUP后数据包的数据有效负载;即,指定的大小用于第8章中定义的数据包的数据字段,不包括协议要求的其他信息。SETUP数据包总是八个字节。控制管道(包括默认控制管道)总是将它的wMaxPacketSize值用于数据有效负载。

端点在其配置信息中报告其最大数据负载大小的值。USB不要求传输的数据有效负载正好是最大尺寸;即,如果数据负载小于最大值,则不需要填充到最大值。

要求所有主机控制器支持全速控制端点的8、16、32和64字节最大数据负载大小,低速控制端点的最大数据有效负载大小仅为8字节,高速控制端点的最大数据有效负载大小仅为64字节。不需要主机控制器来支持更大或更小的最大数据负载大小。

为了确定默认控制管道的最大数据包大小,USB软件读取设备描述符。主机将读取设备描述符的前八个字节。设备总是在单个数据包中至少用这些初始字节进行响应。在主机读取设备描述符的初始部分之后,它保证已经读取了这个默认管道的wMaxPacketSize字段(设备描述符的第7字节处)。然后,它将为所有后续事务提供正确的大小。对于所有其他控制端点,最大数据有效负载大小在配置后是已知的,因此,USB系统软件可以确保不会向大于支持大小的端点发送任何数据有效负载。

端点必须始终保证传输的包中数据字段长度小于或等于端点的wMaxPacketSize的最大数据有效负载(参见第9章)。当控制传输涉及的数据超过当前确定的最大大小的一个数据有效负载所能容纳的数据时,除了最后一个数据有效负载之外,所有数据有效负载都需要达到最大大小,最后一个数据有效负载将包含剩余数据。

当端点执行下列操作之一时,从端点到主机的控制传输的数据阶段完成:

  • 已经准确传输了SETUP阶段指定的数据量
  • 传输有效负载大小小于wMaxPacketSize的数据包或传输零长度数据包

当数据阶段完成时,主机控制器进入状态阶段,而不是继续另一个数据事务。当数据阶段完成时,如果主机控制器没有进入状态阶段,端点将按照第5.3.2节所述停止管道。如果从端点接收到大于预期的数据有效负载,控制传输的IRP将被中止/取消。

当所有数据都已传输完毕时,从主机到端点的控制传输的数据阶段就完成了。如果端点从主机接收到大于预期的数据负载,它会停止管道。

5.5.4 控制传输总线访问限制

高速、全速和低速的通用串行总线设备都可以使用控制传输。

端点无法指示控制管道所需的总线访问频率。USB平衡了所有控制管道的总线访问要求和等待处理的特定IRP,以在客户端软件和功能之间提供“最大限度”的数据传输。

USB要求保留每个(微)帧的一部分,以供控制传输使用,如下所示:

  • 如果一次控制传输(以依赖于实现的方式)对于全速/低速端点消耗少于10%的帧时间,或者对于高速端点消耗少于20%的微帧时间,剩余时间可用于支持批量传输(参见第5.8节)。
  • 需要重试的控制传输可以在当前或未来(微)帧中重试;即不需要在同一(微)帧中重试。
  • 如果控制传输多于保留时间,但有没有用于同步或中断传输的额外(微)帧时间,主机控制器可以在有额外控制传输可用时传输它们。
  • 如果在可用的(微)帧时间内有太多等待处理的控制传输,控制传输将被选择为在总线上适当地传输。
  • 如果有多个端点的控制传输等待处理,则根据主机控制器的的公平访问策略来选择不同端点的控制传输,这取决于主机控制器实现。
  • 经常重试的控制传输事务不应消耗过多的总线时间份额。

高速控制端点必须为输出事务支持PING流控制协议。第8.5.1节描述了该协议的细节。

这些要求允许主机和设备之间的控制传输通过总线“尽最大努力”规律地进行。

USB系统软件可以自行决定改变特定端点的控制传输速率。端点及其客户端软件不能为控制传输假定特定的服务速率。一个控制端点可能在单个(微)帧中看到零个或多个传输。当其他设备插入系统或从系统中移除时,或者当其他设备端点请求控制传输时,可以改变软件客户端及其端点可用的总线时间。

总线频率和(微)帧时序限制了任何USB系统在(微)帧内成功控制传输的最大数量。对于全速/低速总线,每帧成功控制传输的数量被限制为少于29个全速八字节数据有效负载或少于四个低速八字节数据有效负载。对于高速总线,控制传输的数量限制为每微帧少于32个高速64字节数据有效载荷。

表5-1列出了不同大小的低速数据包以及一帧中可能的最大数据包数量。该表不包括与位填充相关的开销。

 对于所有速度(低速、全速、高速),因为控制传输由多个包组成,所以包可以分布在几个(微)帧上,以将所需的总线时间分布在几个(微)帧上。

全/低速非周期传输的10%帧预留意味着,在总线时间完全分配的系统中,系统中的所有全速控制传输抢占式使用每帧三次的控制传输。因为除了其他客户端软件可能请求的任何其他控制传输之外,USB系统还将控制传输用于配置目的,所以给定的软件客户端及其功能不应该期望能够将该全部带宽用于其自己的控制目的。主机控制器还可以自由决定特定控制传输的单个总线事务如何在帧内和帧间通过总线传输。一个端点可以看到同一帧内或跨几个不连续帧的控制转移的所有总线事务。出于各种实施原因,主机控制器可能无法提供每帧控制传输的理论最大数量。

对于高速端点,非周期性传输的20%微帧预留意味着,所有高速控制传输抢占式使用每个微帧6次的控制传输。对于全速和低速控制传输,高速控制传输与分割事务一起争夺微帧时间(有关分割事务的更多信息,请参见第11.15-11.21节)。全速和低速控制传输争用相同的可用帧时间。但是,某些端点的高速控制传输可以与其他端点的全速和低速控制传输同时发生。低速控制传输需要更长的传输时间。

表5-2列出了不同大小的全速控制传输信息以及一帧中可能的最大传输次数。此表是在假设有一个数据阶段事务并且数据阶段具有零长度状态阶段的情况下生成的。该表说明了小于或等于允许的最大数据有效负载大小的两个数据有效负载的可能功率。该表不包括与位填充相关的开销。

 表5-3列出了不同大小的高速控制传输以及微帧中可能的最大传输次数。此表是在假设有一个数据阶段事务并且数据阶段具有零长度状态阶段的情况下生成的。该表说明了小于或等于允许的最大数据有效负载大小的两个数据有效负载的可能功率。该表不包括与位填充相关的开销。

5.5.5 控制传输数据序列

控制传输要求从主机向设备发送SETUP总线事务,以描述设备应该执行的控制访问类型。设置事务之后是零个或多个控制数据事务,这些事务携带请求访问的特定信息。最后,状态事务完成控制转移,并允许端点将控制转移的状态返回给客户端软件。控制转移的状态事务完成后,主机可以前进到该端点的下一个控制转移。如第5.5.4节所述,每个控制事务和下一个控制传输将会通过总线以一定的时间进行传输,这个时间根据主机控制器的实现定义。

在控制传输的数据和状态事务期间,端点可能会在设备特定的时间内繁忙。在这些时间内,当端点指示它正忙时(有关详细信息,请参考第8章和第9章),主机将在稍后重试该事务。

如果在先前发起的控制传输完成之前,端点接收到SETUP事务,则设备必须中止当前传输/操作,并处理新的控制SETUP事务。在完成前一次控制传输之前,通常不应发送SETUP事务。但是,如果传输因总线错误而中止,主机可以提前(从端点的角度)发送下一个SETUP事务。

在遇到暂停条件或主机检测到错误后,允许控制端点通过接受下一个设置PID来恢复;即,控制端点不需要通过一些其他管道的恢复动作。对于默认控制管道,如果不接受下一个SETUP PID,最终将需要设备复位来清除暂停或错误情况。

USB为控制传输过程中出现的错误提供强大的错误检测和恢复/重传功能。发射机和接收机可以在控制传输中保持同步,并且可以很容易地恢复同步。数据和状态包的重传可以由接收器通过包中的数据重试指示符来检测。发射机可以通过握手中返回的信息来可靠地确定其对应的接收机已经成功地接受了发送的包。该协议允许将重传的包与其原始包区别开来,除了控制SETUP包。由于传输错误,SETUP数据包可能会被重新传输;但是,SETUP数据包不能指示数据包是原始传输还是重试传输。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值