3.2 超速结构
超速总线是一个分层的通讯结构,如下图所示:
1
协议层:
协议层在主机和设备间定义了end-to-end(端到端)通讯规则。超速协议在主机和设备端点(endpoint)之间提供应用数据信息交换。这个通讯关系叫做管道(pipe)。
它是主机导向的协议,意味着主机决定什么时候在主机和设备间进行应用数据传输。设备可以通过一个特定端点向主机发起异步请求服务,所以它不是一个轮询协议(USB2.0为轮询协议)。
数据可以连续突发传输,提高总线效率。 对某些传输类型(块传输),协议提供流控支持。
SS设备可以异步发送,通知主机,设备的功能状态发生改变。而不是轮询的方式。设备端点可以通过设备异步发送的“ready”包(ERDY TP)通知主机进行数据发送与接收,主机对于“ready”通知,如果有有效的数据发送或者缓存接收数据,会添加管道。
主机发送包含主机时间戳的特殊包头(ITP)到总线上,该值可以用于保持设备和主机同步(如果需要的话)。
超速USB电源管理:
链路电源管理的关键点是:
·设备向主机发送异步“ready”通知
· 包是有路由路径的,这样就允许不参与数据通讯的链路进入或仍旧停留在低电源状态。
· 如果包送到一个处于低电源状态的端口,这个端口会切换到退出低电源状态并指示这是个切换事件。
设备:
·超速需要支持USB2.0对默认的控制管道的规定。
HUB设备:
因为USB3.0向下兼容USB2.0,为支持USB3.0双总线结构,USB3.0 HUB在逻辑上是两个HUB的组合:一个USB2.0 HUB和一个USB3.0 HUB。连接到上游端口的电源和地线是共享的。
集线器(HUB)参与到一个端到端的协议中,所承当的工作: ·路由选择输出的包到下游端口。 ·输入包混合传递到上游端口 ·当不在低功耗状态下时,向所有下游端口广播时间戳包(ITP),即为同步时间信息包。 ·当在一个低功耗状态的端口检测到包时,集线器将目标端口转变成退出低功耗状态,通知主机和设备(带内)包遭遇到了一个在低功耗状态的端口。
主机(Hosts):
一个USB3.0主机通过主控器和USB设备互连。为了支持USB3.0双总线结构,USB3.0主控器必须包括超速(USB3.0)和USB2.0部分,这样可以同时管理每一个总线上主机和设
2
备间的控制、状态和信息交换。
主机含有几个根下行端口实现超速USB和USB2.0,主机通过这些端口:
·检测USB设备的连接和移除; ·管理主机和设备间的控制流; ·管理主机和设备间的数据流; ·收集状态和活动统计; ·对连接的设备供电;
USB系统软件继承了USB2.0的结构,包括:
·设备枚举和配置;
·规划周期性和异步数据传输; ·设备和功能电源管理; ·设备和总线管理信息。
数据流模型:
超速USB集成了USB2.0的数据流模型,包括:
·主机和设备间的数据和控制交换通过管道(pipe)进行 ,数据传输在主机软件和指定的设备端点间进行。
·设备可以有不止一个的活动管道,有两种类型的管道:流式管道(数据)和消息管道(控制),流式管道没有USB2.0定义的结构,消息管道有指定的结构(请求的结构)。管道相关联的是数据带宽,传输类型(见下面描述),端点属性,如传输方向与缓冲大小。
·大多数管道在系统软件对设备进行配置后才存在,但是当设备上电在默认的状态后,一个消息管道即默认的控制管道总是存在的。提供权限访问设备的配置,状态和控制信息。
·一个管道支持USB2.0定义的四种传输类型的一种(管道和端点属性一致)。 ·海量传输类型(bulk)在超速中进行了扩展,叫做流(stream)。流式提供在协议级支持在标准块传输管道中多路传输多个独立的逻辑数据流。
第四章 超速数据流模型
4.2超速通信流
SS保持相似的观念和机理,支持端点,管道和传输类型。参考USB2.0协议。 端点的属性(最大包尺寸(端点缓存大小),突发大小等)被记录在描述符中和SS Endpoint Companion Descriptor。正如在USB2.0中,端点是使用三个参数组成的地址来验证(设备地址,端点号和方向)。所有的SS设备必须起码在默认控制管道(端点0)开始执行。
4.2.1 管道
一个超速管道是一个设备上的端点和主机软件的连接。管道代表拥有缓存空间的主机软件和设备端点之间传输数据的能力,和USB2.0有相同的过程。主要的区别在于当超速的非同步端点忙时,会返回一个没有准备好(NRDY)应答,当它想又要服务时必须发送准备好(ERDY)通知。主机在下一个传输类型限制下的有效时机中重新安排事务。
4.3超速协议综述:
正如在USB3.0结构总览那章中提到的,超速协议是利用双差分数据线的物理层。所有的USB2.0的类型都可以被高速协议支持。协议之间的区别在于下面要首先讨论的超速中使用的包的描述。
3
4.3.1与USB2.0的区别:
在框架上,超速是向后兼容USB2.0的,但是二者在协议上还是有一些重大的不同: ·USB2.0的transaction(事务处理)有三部分(令牌(token)、数据(data)和握手(handshake)),超速也是这三部分但是用法不同(令牌包集成在头包和DPH中,各种类型的握手包都是TP包形式);对于OUT事务,令牌被合并在数据包中;对于IN事务,令牌被握手包代替。
·USB2.0不支持突发(bursting),超速支持持续突发;
·USB2.0是半双工(half-duplex)的广播总线,超速是dual-simplex(全双工)的非广播总线,支持同时进行IN、OUT transaction;
·USB2.0使用轮询模式,超速使用异步通知方式;
·USB2.0不支持流能力,超速支持海量(bulk)端点的Stream方式; ·USB2.0在同步传输(isochronous)间隔中没有进入低耗电状态的机制,超速则允许同步传输服务间隔中自动进入低耗电状态(不服务的时间段进入低功耗);SS主机在服务间隔前发送一个PING包到目标同步设备允许开始同步传输之前转变成电源活动状态。
·USB2.0设备无法通知主机自己在进入低耗电状态前可容忍的延迟时间(设备通知主机自己进入低功耗状态的最长延迟时间),超速则提供Latency Tolerance消息;
·USB2.0以固定的1ms/125us间隔发送帧包/小帧包(USB 2.0全速和高速模式)。超速下,设备可以发送Interval Adjustment消息给主机调整间隔125us一直到+/-13.333us;
·USB2.0电源管理总是主机导向(主机初始化)的,超速链路两端都支持电源管理;因此不管何时需要空闲,需要退出,需要通信,每个链路能独立的进入低电源状态。
·USB2.0 仅在每个transaction进行end-to-end级别的错误检测、恢复、流控,超速在end-to-end(数据包重试)和链路级别(头包重试)分割这些功能。
4.3.2比较USB2.0和超速的事务处理(Transaction) 超速全双工总线物理层允许同时进行双向的通信。超速协议允许收到握手包之前发送多个数据包(突发)。对于OUT传输,包含在USB2.0令牌包中的信息(设备地址和端点信息)被合并在数据包头里面,因此不需要额外令牌包。对于输入传输IN,超速主机发送一个握手包(ACK)给设备以请求数据(和指示数据是否正确)。设备可以通过返回数据或者返回STALL握手包来应答,或者返回一个没准备好(NRDY)握手包延迟传输直到设备准备好了。
USB2.0的包是广播方式,每个连接的设备解析每个包的地址、端点、方向信息来决定自己是否应该响应。超速包有路由信息,HUB决定每个包要送达哪个设备,只有一个例外,等时(同步)时间戳包(Isochronous Timestamp Packet, ITP)广播到每一个设备。
USB2.0的查询方式已经被异步通知代替。超速传输通过主机发出一个请求来开始传输,后面跟随着设备的应答。如果设备能接受请求,它就接收数据或者发送数据;如果端点停止了,设备应该以STALL握手包响应;如果设备由于缺少缓存空间或者没有数据而不能接受请求,应该以NRDY应答告诉主机现在还不能处理请求。当等到设备能接受请求时,设备会主动发送一个端点准备好(ERDY)异步通知给主机然后主机会重新安排传输事务。
单路传送和有限制的多点广播的包以及异步通知,都允许没有活跃传输包的链路进入一个降低功耗状态,上游和下游端口共同决定它们的链路进入一个低功耗状态,集线器会传递到上游端口。通过允许链路伙伴独立控制它们的链路电源状态,集线器将任意下游端口可见的最高链路电源状态传递到上游端口,使总线快速进入最低允许电源状态。
4
4.3.1.2超速包介绍:
超速包以16字节的头部开始。一些包只包含有头部(TP,LMP,ITP)。所有的头部以用于决定包处理方式的包类型信息开始。头部有16位CRC保护,以2个字节链路控制字(link control word)结束。依赖于类型,大多数包包含有路由信息(路由字符)和一个三参数的设备地址(设备地址,端点号和方向)。路由字符给主机用来指导包被发送到被指向的拓扑路径。设备发送的包被集线器默认路由选择,集线器总是把数据从任何可见的下游端口传到上游端口(这一过程不需要路由信息)。
有四种基本类型的包:(协议层)
·Link Management Packet(LMP),只穿过一对直接连接的端口(链路两端),主要用来管理链路。
·Transaction Packet(TP,事务包),穿过所有直接连接主机与设备的链路,用来控制流式数据包,配置设备和集线器等(任何传输类型的事务处理都用到)。注意一个Transaction Packet是没有数据的。(控制命令包,TP包就是一个包头(DPH))
·Data Packet(DP),穿过所有直接连接主机与设备的链路,数据包有两部分组成,一个和TP包相似的数据包头(DPH)和带有数据块加上用来确保数据完整性的32位CRC的数据包(DDP)
·Isochronous Timestamp Packet(ITP)。它被主机用来多点广播到所有的活动的链路上。
4.4 对传输(transfer)的一般性描述:
每一个发送给接收器的非同步数据包通过一个握手包(ACK TP)被应答(同步端点不应答,非同步端点要为每个收到的数据包进行应答,以报告是否正确传输和是否要重传),但是由于超速有独立的发送与接收路径,所以发送器不必在发送下一个包之前为每次传输的数据包等待一个握手(超速USB的一个特色:同时进行发送数据与接收应答,当设备检测到数据包错误时或者端点错误,没准备好等,都会通过在应答TP包中反应给主机,主机收到的应答TP包中记录出错的包顺序号,于是主机从错误的那个顺序号开始重新发送包)。
超速保护所有的基本数据流和USB2.0定义的传输观点,包括传输类型,管道和基本数据流模式。和USB2.0的区别在这章被讨论,开始是协议层,然后是传输类型。
USB2.0规范利用一系列事务处理的模式。这从本质上意味这主机是在开始下一次事务前完成这一次总线处理(令牌,数据和握手)。分离事务处理也坚持这相同模式,因为他们由完整的高速事务组成,类似所有其他事务在相同的模式下完成。
超速通过实施发送与接受同步改善了USB2.0事务的协议。因此超速USB事务处理协议本质上是一个分离的事务处理协议,它允许在同一时间不止一个OUT总线事务处理(设备可以多个)和至多一个IN总线事务处理(主机只有一个)在总线上活动。设备对事务处理的应答的命令是确定在每个端点基础上(例如,如果一个端点接收三个DP包,端点必须为每一个DP包返回ACK TP告知收到DP包)。
USB2.0协议要在继续下一个总线事务处理之前完成整个IN或OUT事务(令牌,数据和握手包连续传输),所有的来自主机的传输本质上是广播到USB2.0总线上的每一个活动设备,与之比较起来,超速协议不进行广播任何包(ITP除外),包只穿过需要达到目标接收方的链路,主机通过发送握手请求(ACK TP)或者发送数据(OUT)开始所有的事务,设备以数据或者握手来应答。假如设备没有有效的数据(IN)或者不能接受数据(OUT),它会以一种包(NRDY)来应答以指示不能进行此操作。之后,当设备准备好发送或者接收数据时,它会发送一个包给主机指示它已经准备好重新进行事务处理。除此之外,超速提供将链路转变成指定的低电源状态或者退出低电源状态的能力。低电源链路状态可以在软件使能
5
以后由软件控制或者自发的硬件控制来进入。还提供一个自动将主机与设备之间的所有链路由非活动电源状态转变成活动电源状态的机制。
设备在每个端点的描述符中记录每个端点的最大包尺寸。这个尺寸只指示负载数据块长度,不包括链路层和协议层的包头(DPH)。超速的带宽分配相似于USB2.0。
4.4.1 Data Bursting(突发数据)
突发数据通过消除在每个基于数据包应答的等待时间提高效率(即无需等待应答就能处理数据)。每个超速设备上的端点指示了它在必须等待一个明显握手之前能够发送/接受的包数量(称之为最大数据突发大小)。最大数据突发大小是一个每个端点各自的能力,一个主机从与端点相关的SuperSpeed Endpoint Companion descriptor描述符决定一个端点的最大数据突发大小。
主机在每个事务处理的基础之上能动态改变突发大小,直到最大突发大小被配置了。主机能使用不同突发大小的一个例子,不受限于,但是包括一个主机上的公平决策和中断流的重试。 当端点是OUT类型,主机能容易控制突发大小(接收器必须总是能管理突发大小事务处理),当端点为IN类型,主机能基于每次事务处理限制端点突发大小,是通过在发送给设备的应答包中的一个域来限制。
4.4.2 IN transfer(输入传输):
主机和设备应该延续传输类型和端点属性的约束。 一个主机通过发送一个ACK确认请求包给设备(IN)开始请求一次传输。这个确认(握手包)包包含了数据包路由选择到想要的端点所需要的地址信息。主机告知设备它可以发送的数据包数量和期望来自于设备第一个包的序号(0)。在应答中,端点会发送正确的序列号的数据包给主机,主机发的确认包也暗中应答了之前成功收到的数据包(以及请求下一个顺序号的数据包)。
注意:即使主机需要为每一个收到的数据包发送一个确认包,但是设备可以不需等待任何确认包就发送所需要的数据包数量。
超速总线的一次IN传输由一个或多个IN事务处理组成,一个IN事务处理由一个或多个包组成(比如主机发送ACK TP,设备发送DP或NRDY TP或STALL)。 当下面的任何条件发生,都能结束IN传输:
·所有数据已经成功传送;
·设备端点发送一个短包(比最大包尺寸小的包)作为应答; ·端点响应错误。
(Host发送IN packet之后,设备可以持续发送多个数据包,不需要等待每个包都得到host的确认包(ACK TP),因为超速是dual-simplex(全双工)的,但是设备收到的总的认可包数量应该和设备发送的数据包数量一样。)
6
4.4.3 OUT transfer:
主机通过发送一个突发数据包给设备开始一次OUT传输,每一个数据包(的DPH)包含需要路由选择目标端点的地址信息,也包含数据包的顺序号(作为区分不同发送顺序的数据包标号)。对于一个非同步事务,设备返回一个确认包,其中包含下个要接收的数据包顺序号和隐含地应答当前数据包。
注意:虽然设备需要为每个收到的数据包发一个确认包,但是主机不需等待一个应答就能发送最大的突发数据包数量给设备。
OUT transfer在下列情况下时会结束: ·所有数据已经成功传送; ·Host发送了一个短包; ·端点响应错误。
7
四种transfer类型:control、bulk、interrupt、isochronous transfer。用意同USB2.0,但是bulk 最大包大小增加为1024B,control端点最大包大小增加为512B。control 端点不支持burst,bulk可以burst 1~16,bulk还增加了Stream能力;interrupt、isochronous可以burst 1~16(当最大突发大小为1时,对于同步传输,其最大包大小能为0-1024之间任意大小,对于中断端点,最大包大小可以在1-1024之间任意大小;如果最大突发大小为>1时,最大包大小只能为1024)。
4.4.5 控制传输
控制传输的目的与特点与USB2.0协议完全相同。这个规格的协议层章节详细描述了用于完成控制传输的包,总线事务处理和事务处理流程。设备架构那章定义了完整系列的设备使用的标准命令编码。
每个设备需要启动默认控制管道作为一个消息管道。这个管道用来进行设备初始化和管理,用来访问设备描述符和向设备请求对其进行操作(在设备级)。控制传输必须维持相同的在USB2.0中定义的请求(获取描述符等命令)。
超速系统会制造一个最好的条件情况支持主机与设备间的控制传输。正如USB2.0,功能和客户软件不能为控制传输主动要求指定带宽(不是能分配10%的带宽吗?)。
4.4.5.1 控制传输包大小
控制端点有一个固定的最大控制传输数据包大小为512字节(同时反应了端点缓存大小)。还有一个最大突发大小为1(控制传输不支持突发数据?)。这些最大值适用于在控制传输数据阶段的所有的数据事务处理。参考8.12.2章,详细描述了超速控制传输的建立(setup)与数据阶段(data)。
超速设备在设备描述符的bMaxPacketSize域中必须记录一个09H的值。默认控制管道的默认最大包大小的解码规则在9.6.1章被给出(2的9次方=512B)。默认控制管道必须支持最大顺序值为32(在[0-31]范围的顺序值被使用)。USB2.0与超速之间,设备到主机和主机到设备的数据阶段数据传输和完成一般没有什么改变。
8
4.4.5.2 控制传输带宽需求
设备没有方法为控制管道指示想要的带宽。主机通过权衡所有控制管道总线访问需求与在那些管道上挂起事务处理来提供一个最好的情况给客户软件和功能设备之间的传输。这个规则跟USB2.0相似。
超速需要保留有效的总线带宽给控制管道作为以下使用:
·控制传输事务处理可能与其他被定义功能端点的事务处理一同被安排 ·控制传输的重试不能优先于其他最好情况的事务处理
·如果有控制传输和块传输为多个端点挂起,根据一个主机控制器相关的公平规则,不同端点的控制传输被选择服务。
·当一个控制端点传输一个流控制事件,主机会移除来自于被安排的活动端点。一旦收到一个来自于设备准备好的通知,主机会对这个端点恢复传输。
这些要求允许主机与设备间的控制传输周期性的通过有最好条件的超速总线移动数据。系统软件的任意操作行为在USB2.0 5.5.4定义。超速控制传输同样适用。
4.4.5.3 控制传输数据流程
超速保护消息格式和在USB2.0定义的控制传输的一般阶段流程。超速协议定义了对控制传输建立和状态阶段的相同改变。
4.4.6 块传输
此规格的8.12.1章详细描述了用来完成块传输的包,总线事务处理和事务处理流程。块传输类型是用来支持想要跟相当大的海量数据通信设备,传输能使用任何可用的超速带宽。超速块传输功能端点提供以下:
·对基于有限带宽的超速总线访问
·保证数据的发送,但是不保证带宽和发送时间 超速维持下面的块传输管道特征:
·对块传输管道通信流没有强制固定的数据结构
·块传输管道是一个流式管道,因此总是有通信流进出主机。如果应用需要一个双向块传输通信流,必须使用两个块传输管道(一个OUT,一个IN)。
标准USB块传输管道提供移动数据流的能力。超速增加了协议级支持多倍流模式的流式概念。
4.4.6.1 块传输数据包大小
块传输端点应该在端点描述符中设置最大数据包大小为1024字节。也要指定端点在超速总线上能够接受或发送的突发大小。可允许的块传输端点突发大小在1到16的范围。所有的超速块传输端点要支持[0-31]的顺序值。
主机需要支持任何超速bulk传输端点和所有的bulk传输突发大小。主机要确保发送给端点的数据包的数量不能超过描述符中定义的最大包大小。此外,发送的突发数据包不能超过记录的最大突发大小。
块传输功能端点发送的数据包,其数据域必须总是小于等于1024字节。如果块传输数据量超过1024,则突发事务中所有数据包除了最后一次,都必须是1024字节大小?,最后一次是剩下的不足1024字节的数据。块传输可以持续多个总线事务处理。块传输在端点有以下情况时完成:
·已经准确传输完了所期待的数据
·传输了一个比1024字节少的数据包(短包)
9
·应答STALL握手包
4.4.6.2 块传输带宽需求
正如USB2.0,块传输功能端点没有方法为块管道指定想要的带宽。块事务处理只发生在超速总线上有可用带宽的基础上。超速提供一个最好的条件在客户软件和功能设备间传输块数据。控制传输对总线操作比块传输更有优先权(对总线操作的优先级,控制传输比较高)。当有多个端点的bulk传输挂起时,主机会根据一个公平访问原则提供事务处理的机会给每个端点,这就是主机依赖性操作。
所有在系统中挂起的块传输竞争相同的有效总线时间。端点和客户软件不能为块传输假定配置一个指定的服务率(总线带宽不能为块传输主动分配)。总线时间被提供给客户软件,由于其他设备被插入到系统或者从系统中移除或者因为块传输被其他功能端点需要,端点能被改变。客户软件不能假定在块传输和控制传输之间的顺序,即在一些情形中,块传输能在控制传输的前面进行。
主机在带有块传输端点的事务处理中能使用任何在1和记录的最大的突发大小,更高效的利用有效总线带宽。例如,可能有比有效总线带宽更多的块传输,所以主机可以每次使用事务中更小的数据突发,以提供公平服务给所有挂起的块数据流(因为块传输多,有效带宽少,所以为了能公平给所有等待的块传输机会,主机会使用事务处理中比较小的数据突发大小,从而将有效带宽充分平均分配给所有块传输)。
当一个块传输端点传输一次流控制事件(在8.10.1章定义)时,主机会从安排的活动端点中移除它,主机会基于接收到来自于设备的准备好通知恢复端点的传输。
4.4.6.3 块传输数据流程
块事务处理为数据可靠传输使用标准的突发序列,在8.10.2章定义。块端点通过一次合适的控制传输(SetConfiguration, SetInterface, ClearEndpointFeature)被初始化成最初的发送/接受顺序号和突发大小值(8.12.1.2 和8.12.1.3)。同样,主机在已经成功完成了上面提到的合适的控制传输后,配置块传输管道初始的发送/接收序列号和突发大小值。
超速块管道的停止条件跟USB2.0定义的块端点一样同样有副作用。从停止条件中恢复也跟USB2.0相同。块管道停止条件包括STALL握手包作为一次事务处理的应答或者由于发送错误主机事务处理的重试次数消耗完的应答。
4.4.7 中断传输
中断传输类型用来支持带有轮询服务间隔需要高可靠性传输小数量数据的设备。这个规格的协议层章详细描述了与中断传输相关的包,总线事务和事务处理流程。超速中断传输类型一般提供以下方面:
·能保证最大的服务间隔
·能保证在下一次服务间隔中尝试重新传输
在每个服务周期中为中断端点尝试中断传输,保留一定带宽保证在每个服务间隔尝试传输。一旦传输成功,就不尝试另外一次传输(在此周期内),直到下一个轮询服务周期到来(保证每个服务周期中尝试一次中断传输)。如果端点以没有准备好的通知或者一个指示不能接收任何包的ACK应答,则主机不会在此次服务中尝试另外一次到端点的传输,除非接收到准备好的通知。然后主机必须在收到(准备好)通知后的2个服务周期内服务端点。端点服务周期的请求在它的端点描述符中描述。
超速维持中断管道下面的特性:
·没有数据内容结构用于中断管道通信流
10
·中断管道是一条流式管道,因此总是单向的。 4.4.7.1 中断传输包大小
中断传输端点指定了超速总线上可以接受的/发送的最大数据包大小,对于支持突发次数(burst size)大于1的中断端点,仅仅允许的最大数据包大小为1024字节;对于突发次数等于1的中断端点,最大数据包大小能为1到1024的任何值。中断端点允许的最大的突发次数是3. 所有的超速中断端点应该支持在范围[0-31]的顺序值。
超速中断端点只用来移动带有界限服务间隔的小数量数据。超速协议不要求中断事务处理的包为最大化大小(即不要求每个数据包都为1024字节大)。
主机被要求支持超速中断端点,主机应该支持所有允许的中断包大小和突发大小的组合。主机要确保在一次突发事务处理中发送到端点的数据包大小不能超过端点的最大数据包大小。在突发事务处理中主机也不能发送超过端点最大突发大小的数据包数量。
中断端点应该总是发送带有数据域小于等于端点最大数据包大小的包,如果中断传输有比适应端点最大数据包大小更多的信息,所有的突发事务处理的数据都要求为最大包大小,除了突发事务处理的最后一个数据包,就是包含剩下的数据。中断传输可以包含多个突发事务。
中断传输是在端点做以下几个完成的: ·已经传输了所需精确的数据量
·传输了比最大包尺寸小的数据包(短包) ·应答STALL握手包
4.4.7.2 中断传输带宽需求
周期性端点(中断和同步)可以被分配到超速总线可利用带宽的80%。中断管道的端点通过端点描述符指定它想要的服务间隔,中断端点能指定一个想要的周期2(bInterval-1) x 125 μs,bInterval值是在范围1到(包含16)16。USB系统软件会在配置期间使用这个信息,决定能被采用的连续周期。被系统提供的周期可以缩到比设备想要的还短,最短到超速定义的周期大小(也是参考的总线轮询周期125μs)。注意总线上的错误能阻止中断事务处理在总线上的成功传输,因此超过了想要的周期。
超速中断端点在每个服务周期能提升到三个最大数据包的大小(3x1024bytes)。对于中断传输,主机没有方法决定端点是否在没有访问端点和请求一个中断传输下进行源/同步数据。如果一次IN中断端点没有中断数据要传输或者OUT中断端点没有充足buffer接受数据,当被主机访问的话,会以一个流控制进行应答。
当有中断数据挂起避免客户软件错误通知传输完成的时候,端点应该只提供中断数据。一个数据负载为零长度的数据包是一次有效传输,可以用来进行某些操作。主机可以在轮询服务周期中任何时刻访问一个端点。 中断端点不应该在尝试事务处理之间分配固定的空间。中断端点只能假定它在轮询服务周期会收到一次事务处理尝试。错误能阻止轮询服务周期中的数据成功传输,主机不被要求在同一个轮询服务周期中重新尝试事务处理,只在下一个轮询服务周期中重试事务处理。
4.4.7.3中断传输数据流程
中断事务处理使用标准的突发流程进行可靠的数据传输(在8.10.2)。中断端点通过适当的控制传输(SetConfiguration, SetInterface, ClearEndpointFeature)被初始化成初始的发送或者接收顺序号值和突发大小(参考8.12.4.1和8.12.4.2)。主机在完成了合适的控制传输后成功为中断管道设置初始的发送/接收序列号和突发大小。
超速中断管道停止条件和USB2.0定义的中断端点一样有相同的副作用。从停止条件中恢复也跟USB2.0相同(Section 5.7.5 in the Universal Serial Bus Specification, Revision 2.0.)。中断管道停止条件包含STALL握手包对事务处理应答或者对由于发送错误导致主
11
机事务处理尝试次数的消耗的应答。
4.4.8 同步传输
正如USB2.0一样,超速同步传输类型是用来支持想要能容忍错误,周期性的轮询服务的传输流。超速跟USB2.0一样不发送起始帧,但是时序信息要通过同步时间戳包(ITP)被发送给设备。这个规格的协议层章详细描述了用来完成同步传输的包,总线事务和事务处理流程。也描述了怎么样传送时序信息给设备。超速同步传输类型提供下面的:
·保证在超速总线上一定范围延迟尝试事务处理的带宽 ·只要数据被提供给管道,保证通过管道的数据率
同步事务处理在每个服务周期在同步端点上被尝试。超速总线上承认的同步端点被保证它们需要的总线带宽。主机在对设备的特殊端点进行轮询服务间隔的任何时候都能请求来自设备的数据或者发给设备数据。被要求的端点轮询服务周期在端点描述符中被定义。超速同步传输是用来支持一个以相同平均速率产生和消耗数据的发送器/接受器。
超速同步管道是一种流管道,总是单向的管道。端点描述符确定被给定的同步管道通信流是流向主机还是流出主机。如果设备需要双向的同步通信流,则要使用两个同步管道,一个输入,一个输出。
无论任何时候当同步传输需要穿过非活动链接, 超速电源管理都会妨碍到同步传输。结果延迟会导致数据在服务周期内没有到达。为防止这种情况,超速定义了PING和PING_RESPONSE机理(参考8.5.7),开始一次同步传输之前,主机可以发送一个PING包给设备,设备以PING_RESPONSE包应答通知主机所有连到设备的链路在活动状态。
4.4.8.1 同步传输包大小
同步传输端点指定了端点在总线上能够接收/发送的最大数据包大小。对于支持突发尺寸大于1的同步端点,允许的最大数据包大小只能为1024字节;对于支持突发尺寸等于1的同步端点,最大数据包大小可为0到1024之间的任何值。同步端点允许的最大突发尺寸为16.但是同步端点能在同一个服务周期中请求3次突发事务处理。
超速协议不要求同步数据包一定要为最大数据包大小,但是如果传输的数据量比最大数据包尺寸小的话,数据包不被填满。
主机应该支持超速同步端点所有的同步数据包大小和突发大小。主机应该确保发送到端点的数据包量小于端点描述符中定义的最大数据包大小,还要确保突发事务处理中的数据包量不能超过端点的最大突发大小。
同步端点应该总是发送数据域小于等于端点的最大数据包大小的数据包。如果同步传输对端点最大包大小有充足的信息,突发事务处理中的所有数据都要求为最大数据包大小,除非突发事务中最后一次数据包,即包含了剩下的数据。同步传输能进行几次突发事务处理。
4.4.8.2 同步传输带宽需求
周期性端点(中断和同步传输)能分配到80%的有效超速总线带宽。同步管道的端点通过端点描述符指定它想要的轮询间隔。同步端点能指定想要的周期2(bInterval-1) x 125 μs。bInterval的范围是1-16. 系统软件将在配置时候使用这个信息决定端点是否能被主机安排。注意总线错误能阻止同步事务在总线上的的成功进行。
超速同步端点在每个服务周期能进行3次最大突发大小为16的事务处理的数据包传输(3x16x1024bytes)。主机会在每个服务周期发送数据到端点或者从端点请求数据。注意,如果端点没有同步数据发送而被主机访问请求数据,则会发送一个0长度包作为数据请求的应答。
主机可以在合适的服务间隔的任何时刻访问端点。同步传输端点不应该尝试在事务
12
处理之间假定一个固定空间(两次事务处理间相隔的时间不固定?),同步端点只能假定它在服务周期会收到一次事务处理的尝试。轮询服务周期发生的错误可以阻止数据的成功传输。但是由于同步事务处理中的包没有应答,主机没有方法知道包是否成功传输,因此不会重试包传输。
4.4.8.3 同步传输数据流程
同步端点总是在轮询服务周期中从包顺序号0开始发送数据包。每个在轮询服务间隔中被依次连续发送的的数据包都带有下一个递增的顺序号。顺序号应该从0到31循环。当发送了32个包后,又从0开始发送。同步端点不支持重试,不能应答流控制。
4.4.9 设备告知(非管道模式)
设备告知是一种为设备向主机进行设备级和总线级的事件通知的异步通信标准方式。这个特色没有映射到为标准传输类型定义的管道模式。设备告知总是由设备开始。数据流通知总是从设备到主机。
第七章 链路层
7.1 字节顺序
包或者链路命令中的多字节域以小端顺序通过总线传输。即先传输最低有效字节(LSB),最后传输最高有效字节(MSB)。Figure 7-2展示了字节顺序的例子:
13
7.2.1 包和包帧
超速使用包来传输信息。链路电源管理包、事务包、同步时间戳包和数据包的详细包格式在第8.2章定义。在协议层,头包帧是不可见的。
7.2.1.1 头包结构
所有头包有20符号长度,格式在在Figure 7-3中. 包括有LMPs, TPs, ITPs, 和DPHs。头包由三个部分组成,一个头包帧,一个包头,一个链路控制字。
7.2.1.1.1 头包帧(4B) 头包帧,HPSTART(header)顺序集,是一个4个基于K标志的有序集合头包起始帧。被定义为3个连续的SHP标志后面跟着一个K-symbol的 EPF。一个头包应该总是以HPSTART序列集开始。头包帧的结构是能容忍1个符号错误的。
7.2.1.1.2 包头(14B)
一个包头由14个字节组成,格式如Figure 7-4所示。它包括12字节的头信息和一个2字节的CRC-16。CRC-16用来保护12字节的头信息的数据完整性。
7.2.1.2 数据包结构
数据包是一种由数据包头(DPH)和一个数据负载包(DPP)组成的特别包。DPH定义在7.2.1.1.章。另外一方面,DPP由数据包帧和可变长度的数据构成,可变长度数据后面跟着
14
CRC-32。Figure 7-8描述了DPP格式。
7.2.1.2.1 数据包帧
DPP帧由8个K-symbols,一个作为DPP起始帧的four-symbol 有序集和作为DPP结束帧的four-symbol有序集构成。正如Figure 7-8 所表示的,作为DPP起始帧的DPPSTART序列集,由三个连续的SDP的K-symbols和后面跟着的一个EPF的K-symbol组成。一个DPP结束帧序列集有两种不同类型。第一种类型,DPPEND序列集,它是一个由三个连续的K-symbol of END和后面跟着的单个K-symbol of EPF 组成的结束帧有序集。第二种类型,DPPABORT序列集,是一个DPP(未完成)终止帧序列集,它由3个连续的K-symbol of EDB和后面跟着的单个K-symbol of EPF组成。DPPEND序列集是用来指示完成了的DPP的正常结束,而DPPABORT序列集用来指示一个DPP的半途终止结束。
7.2.1.2.2 数据包
DPP区域有0-1024字节的数据,后面跟着4字节的CRC-32。任何一个DPP包提前结束应该包含一个DPPABORT有序集。DPP应该快速无缝的跟着它相对应的DPH。
CRC-32略
7.2.1.2.3 在数据包头(DPH)域数据负载包(DPP)之间的空间间隙
在数据包头(DPH)与数据负载包(DPP)之间不应该有空间间隙,如Figure 7-10.所示:
头包由共20个字节,四个字节的HPSTART序列集,14个字节的包头(Packet Header),2个字节的链路控制字构成。HPSTART似乎是用于链路双方数据时钟恢复同步用途,类似
15
于USB2.0时的SYNC(同步序列);Packet Header则包含12个字节的包信息和2个字节的16位CRC;Link Control Word为2个byte,包括3 bit Header Sequence Number,3 bit reserved,3 bit Hub Depth Index,1 bit Delayed bit,1 bit Deferred bit,和5bit CRC。在第八章将会看到,LMP,TP,ITP,DPH其实都是头包结构,只不过12byte的包信息定义了不同的格式意义。
数据包构造:
数据包其实是由一个数据包头(Data Packet Header,DPH)后面无缝跟着一个数据负载包(Data Packet Payload,DPP)构成的。DPH的结构同上面的头包结构,DPP的结构如图7-8所示:
DPP由四个字节的DPPSTART(类似头包中的HPSTART),0~1024字节的数据,四个字节的32位CRC,以及四个字节的DPPEND(作用类似于USB2.0的EOP?在数据有异常的时候这个将是DPPABORT)构成。
第八章、协议层
协议层管理Host和Device间end-to-end数据流,是建立在链路层正确传输基础上的。 本章详细描述: ·包类型;(LMP,DP,TP,ITP) ·包格式;
·包期待的响应;
·四种transaction类型; 8.1超速事务处理
随着向设备端点请求或者发送数据,主机开始超速事务处理。随着端点发送数据或者对接收数据应答完成事务处理。在超速总线上的一次传输是一次从设备到主机的数据请求,然后将其分解为一次或者几次突发事务处理。当超速主机在等待当前总线事务完成的时候, 它可能会开始一次或多次OUT总线事务输出到一个或几个端点。然而,超速主机不应该开始另外一次对端点的IN总线事务,直到主机:(同时能进行多个OUT事务,只能进行一个IN事务)
16
·收到一个DP包或者NRDY或STALL TP包或者因为当前被发送到非同步端点的ACK TP包的事务处理超时
·收到了所有被请求的DP包或者主机收到一个短包,或者一个最后包标志域置位的DP包,或者因为当前被发送到同步端点的ACK TP(注意同步端点没有错误应答)事务处理超时
对于非同步传输,端点可以通过下面应答有效的事务处理: ·返回一个NRDY TP包
·在OUT事务中通过返回一个ACK TP(正确应答)包接收数据 ·在IN事务中返回一个或更多数据包
·如果发生了内部端点错误,则返回一个STALL TP包
一个NRDY TP包应答指示端点还没有准备好接受或发送数据。因此,设备端点和主机之间不应该有更多进一步操作,除非端点通知主机它准备好了。允许在设备和主机之间实现一个链路降低功耗状态,直到端点准备好接受或发送数据。当准备好时,端点异步发送一个通知(ERDY TP)给主机,告知它现在准备好移动数据,主机通过重新安排请求事务进行应答(返回ACK TP?)。注意当它们被主机进行周期性轮询服务时,同步传输不使用ERDY和NRDY TP包。此外,发送到或者接收自同步端点的数据包不被应答(同步传输不检测错误,不应答错误)。也就是ACK TP包不被主机发送给同步端点来应答对数据包的接收。(如果同步端点不能发送给主机要求的数据则发送一个长度为0的数据包) 端点只对主机的要求做应答。主机是负责在总线上安排事务处理,保证数据传输的正确与公平,这通过IN和OUT请求的命令和时序来实现。事务处理不是广播的(USB2.0是广播),在主机和设备间的包传输是有一条直接路径。任何没有使用的链路都会进入降低功耗状态,使得总线遵从强制的电源管理。
8.2 包类型:
LMP,TP,DP,ITP四种。
所有的包有一个14B字节的头,结尾跟着一个2字节的链路控制字组成(16byte)。所有的包头都有两个需要被接收方使用的公共域(版本与类型),用来决定怎样处理包,所有的包头包含一个2字节CRC-16。包头有一个不可改变的错误率,它为10^12个位中不能出现一个错误。
所有的设备(包括集线器)和主机使用他们收到的LMP包。集线器额外负责将DP,ITP,TP传递到连接设备的下游端口和连接主机的上游端口。注意ITP只能被主机发送和被设备接收(广播)。LMP所有的包都被集线器传递出去,除非包是路由选择集线器它自己。传递ITP包额外的规则在8.7被描述。注意TP,ITP,或者DPH中的链路控制字(比如DF域)在被传递出去之前可以被集线器更改。链路控制字的域在8.3.1.2被描述。
如果Type域的值是TP或者DPH,路由信息(字符)和设备地址域就跟在Type域后。路由信息是被集线器用来路由选择上游端口的包传递到正确的下游端口。从设备到主机的包组成的流总是从集线器的下游端口通过路由选择传到上游端口。设备地址域被提供给主机用
17
来验证一个包的源头。所有的其他域在这章会被描述。
数据包的头部包含了用来描述数据块的额外信息。数据块(DPP)总是被跟着一个4字节CRC-32用来判定数据的正确性。数据块和CRC-32一同组成了数据负载包DPP.
8.3 包格式
这个区域定义了超速包。它定义了组成各种包类型和子类型的区域。 这个区域的包类型和位定义以未编码数据格式呈现。添加到串流上的符号有影响(即帧包,控制或修改链路),像位编码,链路层帧,为了精简讲述,已经被移除了(它们对协议层是不可见的)。详细参考6,7章信息。在总线操作,效率或者时序讨论到的地方,会描述那些底层操作对提供额外内容的影响。
8.3.1 所有头的公共区域
所有超速头以类型域开始用来决定怎样处理包。在顶层这个告诉包接收方怎样处理包:是使用它(DP)或者是管理链路(LMP)或移动和控制设备和主机间的数据流(TP)。
8.3.1.1 保留值和保留区域处理
保留区域和保留值不应该用在一个商家指定操作中。
发送器应该设置所有保留域为0,接收器应该忽略任何保留值。
发送器不应该设置已定义域为保留值,接收器应该忽略任何在定义域上设置保留值的包。注意,接收器应该应答包,返回credit作为每一个在7.2.4.1章指定的要求。
8.3.1.2 类型域
类型域是一个5位区域,用来确认包格式。类型用来决定怎样使用包或被中间链路传送。
8.4 链路管理包(LMP)
LMP是指类型域被设置为链路管理包的包。这些包用来管理单个链路,它们没有带有寻址信息和路由信息。可以是由集线器端口命令产生。例如,集线器端口命令用来设置U2非活动超时。除此之外,它们用来交换端口属性信息和测试目的。
格式如图8-4所示:
可以看到,结构上就是第七章中的头包结构(从协议层角度看包格式,屏蔽了HPSTART序列以及8b/10b转换码等物理层的特性)。
18
Type是5bit,所有类型的包都有的,其意义为: 00000: LMP 00100: TP 01000: DP 01100: ITP
所以LMP类型包,Type总是00000。
8.4.1 子类型域
SubType为4bit,表示了是何种类型的LMP: 0000:reserved
0001:Set Link Function 0010: U2 Inactivity Timeout 0011: Vendor Device Test 0100: Port Capability 0101: Port Configuration
0110: Port Configuration Response 0111~1111: reserved
SubType Specific则是根据不同的SubType有不同的含义。 规范对每种LMP意义和格式做了详细解释。
8.4.2 Set Link Function设置链路功能
设置链路功能LMP应该用来配置没有停留在活动(U0)状态中能被改变的功能。 在接收到带Force_LinkPM_Accept位声称的LMP时,端口应该接受所有的LGO_U1和LGO_U2链路命令,除非端口收到一个带有Force_LinkPM_Accept位撤销声称的LMP。
注意:Force_LinkPM_Accept功能不正确的使用会严重影响链路的使用性能。这个性能应该只用来进行符合性测试目的。软件必须确保发送SetPortFeature命令产生LGO_U1 or LGO_U2链路命令之前,链路层没有等待的包。
当集线器收到一条SetPortFeature(FORCE_LINKPM_ACCEPT)命令时,这个LMP被 10.4.2.2 和 10.4.2.9 详细描述了。
19
(Set Link Function)
·Subtype---4位宽度,DW0:bit5,这个域应该为一个Set Link Function的LMP包被置位。 ·Set Link Function----7位宽度,DW0:bit9,这7个位识别Set Link Function.(具体的命令)
Bits 0 1
值 0 1 6:2
Description Reserved
Force_LinkPM_Accept
意义
撤销声称不起作用 命令声称起作用
Reserved
8.4.3 U2非活动超时(U2 Inactivity Timeout )
如果U1 Inactivity Timeout已经不使能了,U2 Inactivity Timeout LMP应被用来定义从U1转到U2时的超时时间,或者从U0转到U2的超时时间。具体细节见Section 10.4.2.1。
8.4.4 商家设备测试(Vendor Device Test )
使用这种LMP是为了商家指定的设备测试,不应该在正常操作链路下使用:
20
8.4.5 端口属性(Port Capabilities )
端口属性LMP描述了每个端口链路属性,它在成功完成了链路训练和初始化之后被两个链路伙伴互相发送。所有端口应该在完成了链路初始化之后,在tPortConfiguration时间内发送这个LMP。
如果一个链路伙伴在 tPortConfiguration 时间内没接收到这种LMP,那么: ·如果链路伙伴有下游属性,它应该发送一个在Section10.14.2.6中描述的错误
·如果链路伙伴只支持上游属性,那么上游端口应该转变成SS.Disabled,它应该尝试用这个设备支持的其他速度连接。
21
Tiebreaker:只有当Direction 域的bit0和bit1都置位时,此域值才有效。此域值用来决定都可配置为上游和下游端口的两个设备哪个作为上游,哪个作为下游端口。在其他情况,此域值为0.
在交换端口属性LMPs以后,链路伙伴应该决定哪个链路伙伴应该被配置成在Table 8-8.中指定的下游端点;
注意:如果TieBreaker域内容相等,那么两个链路伙伴应该再次以新的不同TieBreaker域值交换端口属性LMPs。TieBreaker域值序列被端口随机产生。当TieBreake值不相同时,较高值(1)的端口为下游端口;较低值(0)的端口为上游端口。
8.4.6 端口配置(由下游端口发送给上游端口) 只与Port Capability LMP不同的域被描述
所有支持下游端口属性的超速端口应该能发送这种LMP
如果要在上游模式中被配置的端口在链路初始化后PortConfiguration时间内没接收
22
到这种LMP,那么上游端口应该转变成SS.Disabled,它应该尝试在这个设备支持的其他速度下连接。
在下游模式下被配置的端口应该发送端口配置LMP给上游端口。发送这种LMP的端口应该为链路速度域只选择一位。
如果一个下游属性端口不能和它的链路伙伴工作,那么下游属性端口应该发送一个在Section 10.14.2.6描述的错误信号。
8.4.7 端口配置应答(由上游端口发送给下游端口作为端口配置的应答)
这种LMP被上游端口发送作为一个端口配置的应答。它被用来指示端口配置LMP的接收与拒绝。只有与端口属性LMP不同的域被描述:
所有支持上游端口属性的超速端口应该能发送这种LMP。如果下游端口在端口配置时间内没接收到LMP,它应该发送在 Section 10.14.2.6中描述的一个错误。
23
如果应答码指示链路速度被上游端口拒绝,那么下游端口应该发送一个在Section 10.14.2.6中描述的错误信号。
8.5 事务包(TP)
事务包在主机和设备间的直接路径上传输,TP用来控制数据流和管理端到端连接。类型域的值应该被设置为Transaction Packet。路由字符被集线器用来路由选择将一个呈现在其上游端口的包传递到正确的下游端口。TP包中的路由字符被设备设置为0发送给主机(设备发给主机TP包,集线器由下游端口传递到上游端口,不需路由选择)。当主机发送一个TP时,设备地址域(Device Address)包含接收方的地址。当设备发送TP给主机,那么它设置设备地址域为它自己的地址,这个域被主机用来确认TP的来源。TP的子类型域被接收方用来决定TP的格式和使用。
TP结构上也是一个头包结构。同LMP类似,TP有多种SubType,一个典型的ACK SubType的TP包格式如图8-11所示: TP的 SubType有如下类型: 0000: Reserved
0001: ACK (此类事务包用来向主机/设备报告包正确的传输) 0010: NRDY(此类事务包用来向主机报告数据包还没准备好传输) 0011: ERDY(此类事务包用来向主机报告数据包准备好传输了) 0100: STATUS (报告控制端点的状态?)
0101: STALL (此类事务包用来报告发生了错误而停止传输)
0110: DEV_NOTIFCATION(此类事务包只能用来向主机传输设备通知) 0111: PING (同步端点中探测链路是否进入低功耗状态) 1000: PING_RESPONSE 1001~1111: reserved
规范对每种SubType的TP作了详细解释。
8.5.1 (确认)应答事务包(ACK Transaction Packet)(主机和设备端点都能发送)
TP用来两个目的:
·对IN端点,这个ACK TP被主机发送以请求设备的数据(包含下一个包顺序号)和应答前一次收到的数据包。
·对OUT端点,这ACK TP被设备对接收前一次被主机发送的数据包作应答和告知主机在这个包被接收后的有效数据包缓存数(告诉主机,传完这个包后,设备自己还能接收多少数据包)。
24
8.5.2 没准备好(NRDY)事务包(只由设备端点发送)
这个TP只能被设备为非同步端点发送到主机。如果OUT端点没有有效包缓存空间接
25
收主机发送的DP, 它会发送这个NRDY TP给主机。如果IN端点不能返回DP作为被主机发送的ACK TP的应答,则他会发送这个NRDY TP给主机。
只有跟ACK TP不同的区域在下面描述:
8.5.4 状态事务包(status TP,只能被主机发送给控制端点)
这个TP只能被主机发送。它用来告知控制端点,主机已经初始化一次控制传输的状态阶段。这个TP应该只被主机发送给控制端点。只与ACK TP不同的区域在下面描述:
8.5.5 停止事务包(STALL TP,只由设备端点发送)
这个TP只能被设备端点发送给主机,用来通知主机端点被停止或者控制传输无效。只有与ACK TP不同的区域在下面描述:
26
8.5.6 设备通知(DEV_NOTIFICATION) TP (只能被设备发送)
这个TP只能被设备发送。它被设备用来通知主机设备状态或者接口状态发生了一次异步改变,即确定引起设备唤醒远程操作的设备功能。这个TP不是从特殊端点发送,而是从一般设备发送出来。只有与ACK TP不同的区域在下面描述:
8.5.6.1 唤醒设备功能的通知
27
8.5.6.2 延迟容忍消息(LTM)设备通知
LTM设备通知是一个能使更多电源有效操作的可选标准特性。
28
LatencyValue (ns)——容忍值(ns) LatencyScale——延迟容忍级别 00b Reserved
01b LatencyValue 乘以1024 10b LatencyValue 乘以32,768 11b LatencyValue 乘以 1,048,576
8.5.6.3 总线轮询周期调整消息设备通知
Bus Interval Adjustment:这个域是一个二进制补码值( 范围为-32768 到+32767)
8.5.6.4 功能唤醒通知
如果使能了远程唤醒功能,则设备可以通过发送功能唤醒设备通知给主机告知它想要从设备挂起(在转变链路为U0之后)或功能挂起中退出。详情参考9.2.5章。
8.5.6.5 延时容忍消息(LTM)
容忍度消息是一种利用记录的BELT(Best Effort Latency Tolerance)值来使能更多电源有效平台操作的标准USB电源管理特性(最大可能的更节省电源?)。
BELT值是设备没有获得主机服务的最大时间(作为所有配置了的端点的服务需要因素),尤其,BELT值是在主机接收到来于设备的ERDY和主机发送对ERDY的应答之间的时间。
设备指示它们是否能使用在BOS descriptor中的SUPERSPEED_USB Device Capability descriptor的LTM Capable域 来发送LTM TP。LTM使能特性选择器 能使LTM设备发送LTM TPs。
8.5.6.5.1 可选择的标准LTM和BELT请求
一般设备请求:
·LTM TPs应该只被外围设备发送
·LTM TPs适用于除了同步端点以外的所有端点类型(可能同步端点无法忍受延迟请求)
29
·一旦BELT值被设备发送给主机,所有被配置的端点应该期待在指定的BELT时间内被服务。
·设备应该发送BELT域为tBELTdefault的LTM TP,作为tMinLTMStateChange的LTM使能状态下任何改变的应答。
·设备应该确保它的BELT值尽快的被决定,以便于在需要改变BELT值之前能提供设备服务延迟容忍的合理参考。除此之外,应该符合下面条件:
---最大的LTM TPs数是由tBeltRepeat约束 ---每个LTM TP应该有一个不同BELT值
·系统应该默认所有设备的BELT为1ms(参考Table 8-33) ·BELT的最小值为125us(参考Table 8-33)、
设备要求管理建立BELT值:
·LTM机制应该利用U1SEL和U2SEL来提供系统延迟信息给设备。在这里,系统延迟是在设备发送ERDY和在最深允许链路状态为U1或U2时将收到来自于主机的事务包(ACK TP?)之间的时间。这些值被设备用来正确调整它们的BELT值。
-----允许它们的链路进入U1,但不进入U2的设备应该从总容忍延迟中减去U1系统退出延迟(U1SEL),将结果作为LTM TP的BELT域值发送。
-----允许它们的链路进入U1和U2的设备应该从它的总容忍延迟中减去U2SEL,将结果作为LTM TP的BELT域值发送。
8.5.6.6 总线间隔调整消息(真的难看懂- -)
这个设备通知可以被设备发送用来请求一个总线间隔长度的增加或减少。这典型被设备用来试着与主机外部时钟的总线周期时钟同步。总线周期的调整请求是相对于当前总线周期,例如,如果设备请求增加一个总线间隔调整
(BusIntervalAdjustmentGranularity)单元,然后又请求增加两个单元,那么总共主机请求增加了三个单元。
主机应该支持-37268 到37267的绝对范围的总线间隔调整单元。设备不应该每8个总线周期超过一次请求调整。直到设备等待足够长时间而精确知道之前的总线轮询周期调整请求对随后ITPs时间戳值的影响 ,设备才应该发送另外的总线周期调整请求。设备不应该单次请求BusIntervalAdjustment单元超过-4096到+4096.设备可以随着时间多次请求BusIntervalAdjustment总共超过4096个单元. 直到设备在过去125us里接收到ITP,才可以请求总线周期调整。ITP包含一个其值等于0或者等于设备地址的总线周期调整控制域,此时设备在地址或配置状态。
一次只能有一个设备控制总线间隔长度。主机控制器使用先来先服务原则来处理总线周期调整请求。当主机控制器开始操作,它应该发送带有总线周期调整控制域为0的请求的ITPs。当主机控制器首先收到一个总线周期调整控制请求时,它会设置随后的ITPs(由主机广播)的Bus Interval Adjustment Control域值为发送请求的设备地址,一旦域值被设置为非0值,主机应该忽略来于其他所有设备的总线周期调整请求。如果被控制的设备断开了连接,主控制器应该复位Bus Interval Adjustment Control 域值为0. 主控制器可以给软件提供一种方式,不顾总线周期调整控制域的默认行为,而选择一个控制设备。主控制器应该在收到调整请求的两个总线周期内开始应用新调整的周期。
最小的总线周期调整(一个BusIntervalAdjustmentGranularity)要求主机做一个8x4096个总线间隔的平均调整。主机被允许在单个总线周期中做此调整,常用于产生ITP所需时钟,总线轮询周期不需要一个比8个高速位时间小的周期。主机应该在有规律的
30
轮询周期中进行总线轮询周期调整。当主机需要每4096个总线平均做多次8个高速位时间调整时,应该按下面的约束均匀分布:
·包含不止一个8高速位时间的轮询周期调整要涉及到最大调整总线轮询周期。而其他轮询周期不用
·在任何总线轮询周期中做的8个高速位时间的调整次数不应该超过任何其他总线轮询周期调整的高速位时间调整数
·在两个连续最大调整总线轮询周期之间的差值不应该变化??
直到之后主机收到那个有效的总线周期调整请求的总线周期,总线周期调整的平等分配和平均调整请求才应该在主机收到调整请求后的一个总线周期中应用。
下面是一个主机为指定有效总线周期调整请求操作的例子。上电后,在第X-1个总线周期中,主机收到一个增加10个BusIntervalAdjustmentGranularity单元的总线周期调整请求。主机控制器使用带有一个8个高速位时间周期的时钟来驱动产生时间戳和总线周期的计数器,主机控制器把额外的8个高速位时间时钟节拍在每一个以下总线周期中添加到它的计数器上:X+409, X+819, X+1228, X+1638, X+2048, X+2457, X+2867, X+3276, X+3686, X+4096, X+4505,….
8.5.7 PING事务包(只能被主机发送)
这种TP只能被主机发送。它是被主机用来在开始同步传输之前将所有连到设备的链路转回成U0。详情参考这种TP使用的Appendix C。只有与ACK TP不同的区域被描述。
设备应该在tPingResponse time时间内通过发送PING_RESPONSE TP (参考Section 8.5.8)给主机,以此对PING TP应答。
设备应该保持它的链路处在U0直到随后它收到一个来自主机的包,或者直到tPingTimeout time超时。
8.5.8 PING_RESPONSE Transaction Packet(只能被设备发送)
这种TP只能被设备发送给主机作为PING TP的应答。一个
31
PING_RESPONSE TP应该为每个收到的PING TP被发送作为应答。只有与ACK TP不同的区域被描述:
Direction:这个区域和PING TP的Direction域值一样?PING TP与PING RESPONSE一样方向?
8.6 数据包(DP)
这种包能被主机或者设备发送。主机使用这种包发送数据给设备。设备使用这种包返回数据给主机作为一个ACK TP应答。所有的数据包由DPH和DPP组成。只有与ACK TP不同的区域被描述:
数据包格式:
End Of Burst (EOB)/Last Packet Flag (LPF). = 突发结束/最后包标志:
解析:对于非同步端点,这个区域用来指示(EOB)突发结束;对于同步端点,用于指示最后一个包(LPF)
对于非同步IN端点,这个区域被用来确认这是突发的最后一个包。当设备准备继续传输时,应该发送一个ERDY通知主机。注意:一个端点应该在重发DP中重新计算EOB值。如果设备返回的数量比在收到最后的ACK TP包NumP
32
域要求的数量还少,而且不是短包,则 EOB域应该在突发的最后包中被置位。当设备发送一个短包时,EOB域可以被置位。
对于非同步OUT和控制端点,这个域应该被设为0.
对于同步端点这个域被用来确认这是在当前服务周期中最后一次突发的最后包。LPF能被设备和主机置位。当这个DP源或目标是同步端点时候的使用请参考8.12.6章。
Endpoint Number (Ept Num). = 这个域决定DP源或者DP的接收方(哪个设备端点) Setup (S). = 这个区域被主机置位指示DP是一个建立数据包。这个域只能被主机置位。 Data Length = 这个域用来指示不包含CRC-32的DPP数据的字节数
Data Block. = 这个区域包含DPP中的数据。字节中这个区域的大小由Data Length值指示。
8.7 同步时间戳包(ITP)
ITPs的类型域值为Isochronous Timestamp Packet,ITPs被用来从主机到所有活动的设备发送时间戳(广播)。ITPs不带有地址或路由信息,而是通过集线器在U0状态下广播给所有它们的下游端口链路。设备不应该应答ITP。ITPs为同步传输被用来提供主机时序信息给设备。注意任何设备或集线器可以接收一个ITP。只要链路已经在U0状态,主机就应该在根端口链路上发送一个ITP。只有主机能初始化一个ITP发送。主机不应该为发送ITP而使一个根端口链路进入U0。如果根端口链路在U0状态,主机应该在时间戳范围内的每个总线周期发送一个ITP。当主机根端口链路从查询状态进入U0,
33
主机应该发送带有同步时间戳开始(tIsochronousTimestampStart)的ITPs。 ITP可以在一次突发中的包之间发送。如果设备收到一个带有链路控制字DL标志置位的ITP,时间戳值可以允许严重错误,可以被设备忽略。
ITP格式解析:
Isochronous Timestamp (ITS). 同步时间戳区域被用来确认从主机发送ITP以来的当前时间值,时间戳域被分为2个子域:
Bits 13:0 26:14
description
总线间隔计数。当前毫秒计数值的1/8。计数值达到0x3FFF时归0,然后继续增加。
Delta. (间隔)=从当前ITP包的开始到上一个总线周期边缘之间的时间。这个值是一些
tIsochTimestampGranularity单元数。被使用的值应该指定最接近前一个总线周期边界的间隔
注意:如果包是精确的从总线轮询周期边缘开始的,那么间隔时间被设为0.
Bus Interval Adjustment Control 这个域指定了控制总线轮询周期调整机理的设备地址。一旦上电,复位或设备断开连接,主机要设置次域为0。
8.8 三个参数地址信息
数据包和大部分事务包提供使用一个由三个域构成的地址访问指定数据流的权限。它们是设备地址、端点号和方向域。
34
一旦复位和上电,设备地址默认值为0,应该在枚举过程期间被主机用1到127之间的值来编程。设备地址0保留成默认地址,不能分配给任何其他使用。
设备除去必须的默认端点号为0的默认控制端点外,可以支持最大值达到15个IN和15个OUT端点(由方向域指示)。
8.9 路由字符域
路由字符是在下游导向(向下游端口方向发送)的包中一个20位的域,集线器使用其进行路由选择,将包传递到指定的下游端口。它由一串下游端口号(每个集线器4位)组成,集线器使用它到达设备。集线器使用集线器深度值Hub Depth乘以4作为在路由字符域中要定位的偏移值,集线器用它来决定下游端口号。集线器深度值在枚举过程期间,由每个集线器决定和分配。
注意这个域(路由字符)只在主机发送的包中有效,当被设备发送时,这个域是保留的。
上图中集线器@Tier1域值是直接连接到主机根端口之一的集线器的下游端口号。 注意:上图中结构是每4bit表示一个端口号。因此不同端口号是以4为模进行偏移。
8.9.1 路由字符端口域
在路由字符中的这4位宽度区域代表要被寻址的集线器端口 8.9.2 路由字符端口域宽度
路由字符端口域宽度是固定为4位,端口号的最大值限制为15. 8.9.3 端口号
包直接传向的集线器上指定的端口,由路由字符端口域值确定。当寻址集线器控制器时,然后在集线器层的路由字符中端口号域应该被设置为0. 集线器下游端口一个个相继寻址。
8.10 事务包使用
TP被用来报告数据事务传输的状态,能返回指示数据包、命令接收或拒绝,流控的成功接收和停止条件的值。
8.10.1 流控制条件
这部分描述当一个端点返回一个流控制应答时,在主机和设备之间的相互作用。流控制是在主机和设备端点之间的端对端级的。只有块,控制和中断端点可以发送流控制应答。同步端点不能发送流控制应答。
如果一个IN端点返回下面对ACK TP的应答之一(返回数据),则应该被认为这是在一次流控制条件中:(对主机请求数据事务包的应答)
·NRDY TP应答
·发送一个DPH中EOB域值为1的DP
如果一个OUT端点返回下面的对DP的应答之一, 则应该被认为在流控制条件中: ·NRDY TP应答
35
·发送一个NumP域值为0的ACK TP
只有当被主机设置时Packets Pending域才有效,它不影响端点进入流控制状态。详细参考8.11的主机与设备的TP 应答。
当端点在流控制条件中,它应该发送一个ERDY TP使自己进入活动状态。而且,如果端点是IN端点,那么它应该一直等待,直到它在能发送ERDY TP之前,为它发送的最后一个DP收到ACK TP。当端点不在一个流控制条件中,它不应该发送一个ERDY TP,除非端点是支持流的块端点。注意主机能重新开始到任何端点的事务处理——甚至端点在返回一个流控制应答以后还没有返回ERDY TP。
8.10.2 Burst Transactions(突发事务处理)
只要设备能够接收数据,超速USB协议就允许主机连续发送数据给一个设备或者 只要设备能够发送数据,主机就连续能从设备接受数据。设备端点能不需ACK而一次发送或者接受数据包数量(burst size)被记录在设备的endpoint companion descriptor中。在端点最大突发大小中记录的值为不止一个包(最大突发尺寸大于1),则被认为能支持“突发”事务处理。(如果突发大小为1,则意义为发送一个数据包而不需要ACK应答,这相当于没有突发,还是发送每个数据包后要发送ACK TP) 下面的规则适用于突发: ·在收到ACK之前能在突发中发送的最大包数 被限制于 端点的最大突发大小 加上 端点或主机收到最后一个ACK TP包的NumP域的值,减去在被最后一个ACK TP包应答之后端点或主机已经发送的包数。
(收到一个ACK之前一次突发中能被发送的最大包数 <= 端点的最大突发大小 + 收到的最后一个ACK TP包的NumP域值 — 在被最后一个ACK TP包应答的包之后已经发送的包数)
·在突发中的每个包都要有一个最大数据包尺寸的数据负载。仅仅在一次突发的最后一个包的大小能比描述符中记录的最大数据包尺寸小(类似于USB2.0)。如果最后一个包较小,则对于短包的相同规则也适用一个在一次突发结尾的短包(参考8..10.3短包)。 ·只要ACK TP包的NumP域值不为0,突发传输事务就能持续,每个包都有最大包尺寸大小的数据负载。
· 只要主机或者设备想要持续接受数据, NumP域值能在任何时候通过主机或者设备发送ACK TP包来增加。仅仅要求是NumP域值不能比设备支持的最大突发尺寸大。 ·如果设备或者主机发送一个NumP域值减少的ACK TP包,那么减少的值不能比1大. 例如,如果前一个ACK TP包NumP域值为5,那么对下一个收到的包的ACK TP的NumP域值不应该比4小,只有下面的情况除外:
-----如果设备能够接受数据但是不能再接收更多的数据了,则它应该发送一个NumP域值设为0的ACK TP包。
-----主机应该发送一个NumP域值设为0的ACK TP包作为设备发送一个带有EOB域值被置位的DP包或者是短包的的应答。
但是,如果主机收到一个短包,主机还需要在同一个端点上开始另外一次传输,那么主机可以发送一条NumP域值为非零值的ACK TP包来替代发送一个为0的ACK TP包。
8.10.3 短包
超速保持USB2.0支持的短包功能。当设备或主机收到数据长度区域比端点最大包
36
尺寸小的DP,则它应该认为传输完成了。
在IN传输中,设备应该在发送一个短包DP后,停止发送DPs。主机应该用一个NumP域为0的ACK TP对短包应答。当此端点开始另外一次传输,主机应该对设备端点安排事务。
在OUT事务中,主机可以在发送一个短包后停止发送DPs,主机在此端点开始另外一次传输时应该给设备端点安排事务。注意这为端点的一次新突发的开始。
8.11 TP 或DP应答
发送和接收设备应该返回DPs或TPs,正如Table 8-25 到Table 8-27详细描述的。注意依赖域传输类型和TP流的方向,并非所有TP被允许。
8.11.1 设备对TP请求数据的应答
Table 8-25显示了设备对块、控制和中断端点的TP请求数据的可能应答方式。如果有一个不正确的设备地址或者端点号和方向,一个TP被当作无效。
8.11.2 主机对收到设备的数据应答
Table 8-26显示了主机对块,控制和中断端点收到设备的数据的应答。主机能返回仅仅一个ACK TP。如果有一个不正确设备地址或端点号和方向一个DPH被当作无效的。在Table 8-26中,DPP错误可能由于下面一个或几个导致:
·CRC不正确 ·DPP终止 ·DPP丢失
·DPH中的数据长度不与实际数据长度相符
37
8.11.3 设备对从主机那收到数据应答
设备对块,控制和中断端点从主机收到的数据的TP应答在Table 8-27先表示。如果有一个不正确的设备地址,端点号或方向,则一个DPH被当作无效的。DPP错误可能由下面一个或多个导致:
·CRC不正确 ·DPP终止 ·DPP丢失
·DPH中的数据长度不与实际数据长度相符
注意:ACK TP的接收是向主机指示前一个顺序号的DP被设备成功接收,也指示设备还能够接收主机将要发送DPs的有效的数据包的缓存数(NumP域指示)。设备应该为每个DP发送一个ACK TP.
38
8.11.4 设备对SETUP DP的应答
SETUP DP是一种特别的DP,它通过Setup域被设置为1来认证,可被寻址到任意端点。SETUP是一种主机到设备的特别的数据事务处理,它允许主机初始化设备一条要执行的命令。收到SETUP DP的话,设备应该以Table 8-28.中的应答:
注意如果出现任何下面之一,SETUP DP应该被当作无效的; ·不正确的设备地址
·端点号和方向与端点当前配置部分不符 ·端点号没有适用于一个控制端点
·非零顺序号(SETUP DP中所有顺序号都要为0) ·数据长度没有被设置为8
在Table 8-28中,DPP错误可能由于下面一个或多个导致: ·CRC 错误 ·DPP终止 ·DPP丢失
·SETUP DPH中的数据长度域实际数据长度不符
39
8.12 TP流程
由事务处理组成的包依赖端点类型变化。有四中端点类型:块,控制,中断和同步。 8.12.1 块事务处理
块事务处理类型具有通过错误检测与重试保证无错误的在主机与设备之间传输数据的属性。块事务处理使用由TPs和DPs组成的双相事务处理。
8.12.1.1 状态机注释信息
这个区域展示详细的需要在IN和OUT管道上提出协议的主机和设备状态机制。 Figure 8-25展示了状态机的图解。
8.12.1.2 块输入事务处理 Bulk IN Transactions
当主机准备好接收块数据时,它就发送一个ACK TP给设备指示它想要的从设备得到的包顺序号与包数量。
主机应该为每个从设备收到的有效DP发送一个ACK TP。如果前一个ACK TP指示主机期待设备发送不止1个DP(依赖于TP中NumP域值),则设备不必等待ACK TP后就可以发送下一个DP给主机。ACK TP暗中用前一个被主机成功接受到的顺序号来应答最后的DP,也对设备指示下一个顺序号的DP和主机想要从设备获得的包数量。如果主机在收到DP时检测到一个错误,它应该发送一个顺序号值被设置为发生错误的第一个包顺序号的ACK TP,其retry位也要置位,即使是这个包以后的包都没有错误发生。设备需要重新发送从发生错误的那个顺序号包开始的所有DPs。
当端点初始化后(通过命令Set Configuration, Set Interface, ClearFeature (STALL) 参考 Chapter 9 命令),主机开始第一次从端点接收数据的传输,主机期待第一个DP的顺序号被设为0. 第二个被设备端点发送的DP顺序号应该被设置为1;第三个被设备发送的DP顺序号应该设为2,……直到顺序号为31,顺序号31的下一个DP的顺序号又为0. 一个设备端点保持它发送的包顺序号递增,除非它收到一个带有retry位置位的ACK TP,这指示主机不得不重新发送前一个DP。
如果主机要求从设备获得多个DPs,设备在那时刻没有那么多有效的DPs可以发送,则设备发送最后的DP应该在DPH中的EOB标志置位(因为有部分数据可以发送,所以不发送NRDY TP)。当再有数据发送时,设备要发送ERDY TP给主机。注意:如果被发送给主机的DP的数据量比端点中定义的最大包尺寸少(短包),则没有必要设备EOB标志。
当设备发送了所有被主机期待的数据时或发送了一个比最大数据包尺寸小的DP(短包)时,传输就完成了。当主机想要开始一次新的传输,它应该发送另外的期待从设备获得的下一个顺序号和DPs数量的ACK TP。例如,如果数据量比最大包尺寸小的
40
DP为2,则主机应该通过发送一个带有期待顺序号被设为3的ACK TP来开始新传输。
8.12.1.3 块输出事务处理(Bulk OUT Transactions )
当主机准备发送块数据时,它会发送一个或多个DPs给设备。如果设备收到有效的DPH(有效的device address, endpoint number, direction和期待的顺序号),它应该以 Section 8.11.3定义的 应答。
在端点初始化之后,主机总是在第一次对端点输出数据的传输中,以第一个DP顺序号为0开始。第二个被设备端点发送的DP顺序号应该被设置为1;第三个被设备发送的DP顺序号应该设为2,……直到顺序号为31,31的下一个顺序号为0。主机保持它发送的包顺序号递增,除非它收到一个带有retry位置位的ACK TP,这指示主机不得不重新发送前一个DP。
传输是在主机发送完所有它要发给设备的数据时完成。然而,传输的最后DP可能有或没有一个等于端点最大包尺寸大小的数据。当主机想要开始一次新传输,它应该发送另外的DP,这个DP带有下一个目标端点想要的顺序号。
41
8.12.1.4 块流协议
流协议坚持了标准超速块协议,所以支持流的超速块管道上的包交换跟超速块管道没有什么区别。流协议通过包头中的流ID域的操作被严格管理。
注意:如这个区域描述一样,流协议适用于管道状态,它被描述成单个实体。实际上,流协议在管道的一端独立的被主机追踪,在另外一端被设备追踪。所以由于在主机
42
与设备间的包传播延迟,任何时刻两端可能随时不同相。
Figure 8-28 展示了流协议状态机制 (SPSM)的基本状态转变。这里描述了当它们都适用于IN和OUT端点时的一般SPSM转变。IN和OUT端点的SPSM的详细操作在随后的区域中被描述。
Disabled ——这是在被配置后管道的初始化状态。如果在任何其他状态中检测到错误,则转变到这个状态。一个端点buffer第一次被分配到一个管道时,主机应该把SPSM转变成 Prime Pipe状态。如果由于错误进入Disabled 状态,那么错误条件必须在状态退出之前由软件的介入来消除。注意错误(stall,超时等)应该要把任何SPSM状态转变成Disabled状态。
Prime Pipe——这个状态总是被主机初始化,通知设备端点buffer设置已经被软件添加或修改。
Idle——这个状态指示没有当前流被选择。在这种状态,SPSM正等待Prime Pipe或主机初始化转变成Move Data状态,或者设备初始化转变成Start Stream状态。主机和设备初始化转变的对象是开始一次流(被主机或设备各自设置为当前流),开始移动数据。
Start Stream——当想要选择一个流或开始一次数据传输时,这个状态总是被设备初始化得来的。如果设备选择的流被主机接收,则当前流被设置,管道进入Move Data状态。如果设备选择的流被主机拒绝,管道返回Idle状态。
Move Data——在这个状态中,流数据被传输。如果这个状态是由于主机初始化流
43
选择而进入的,则当前流应该被主机设置。如果这个状态是从Start Stream状态进入的,则当前流选择被设备设置。当流传输完成时或者如果主机或设备决定终止流传输时,SPSM转变回Idle状态。转变成Idle状态使管道的当前流无效。
8.12.1.4.1 流ID
一个16位域的流ID域在DP头中被保留,也保留在主机和设备间传输流ID的ACK ,NRDY,ERDY TP中。指定的被流协议保留流的ID值和其他流ID标记:
·NoStream——这个流ID指示没有流ID被分配给各个相关的总线包,流ID域应该不被解释成有效流。NoStream流ID值是FFFFh。
·Prime——这个流ID被用来定义转变到Prime Pipe状态或从Prime Pipe状态中转变出来。Prime流ID是FFFEh。
·Stream n——n是在1到65533(FFFDh)之间的值。这个标记是用来指示一个有效流ID。如果使用这种标记,则在包头中的流ID域是有效的。有效的Stream n流ID值当中的n值 是在1到65533(FFFDh)之间。
·Stream 0——这个值保留,不被管道用来支持流。Stream 0流ID值是0000h。它需要被标准块管道使用。
·CStream ——代表被分配给管道的当前流ID的值,一个CStream 值都被主机和设备操控。流协议确保CStream 值在主机与设备中是一致的。有效值是NoStream 或 Stream n .
·LCStream——代表在最后一个状态转变之前被分配给管道的CStream流ID的值。一个LCStream值被主机操控,有效值为Prime, NoStream, 或Stream n。例如,当在Move Data状态下CStream = Stream n的管道从 Move Data 到Idle 状态转变时,LCStream被设置为Stream n ,CStream 被设置为NoStream,因此LCStream记录了“最后的(上一个)当前流”值。
Stream n 流ID值被主机分配,被传递到一个设备。Stream n 流ID值应该被设备当成一个逻辑值对待,即设备不应该从值中推断出任何意思或修改它。
注意:下面描述的块IN和OUT流协议是简化了的状态机制,没有明确仔细说明超速端点的突发特性(允许DP没有收到ACK 就被发送)。一个实施应该扩展这些状态机制管理突发。
8.12.1.4.2 块IN流协议
这里定义了在IN块端点上,从一个状态到另外状态的转变流协议超速包的交换
对于IN管道,主机中端点buffers从设备收到功能数据。
44
此包应该为设备发送的包
端点被配置以后,管道在Disabled状态。主机应该通过发送流ID域设置为Prime的ACK TP将管道转变成Prime Pipe状态。这个转变在端点buffers被系统软件分配到管道上后发生。
设备会通过发流ID域设置为Prime的NRDY TP引起管道退出Prime Pipe 状态,转变到Idle状态。
注意:如果中间的集线器(deferred)延迟了ACK TP,则主机和设备会犹如设备发送一个NRDY TP一样。即,当收到延迟应答时,主机会转变到Idle状态。当收到延迟ACK TP时,设备会转变到 Prime Pipe状态,然后立刻转变到Idle状态犹如它已经发送了流ID域设置为Prime的NRDY TP。
在Idle状态下,管道正在等待流选择(例如一次到Start Stream 或Move Data的转变)或等待端点buffers已经为管道被添加或修改的主机通知(转变到Prime Pipe )。在Idle状态,被主机初始化的流选择通过流ID被设置为Stream n和NumP 值大于0的ACK TP确认。这个包会将ISPSM从Idle状态转变成Move Data状态。如果最后一次的ISPSM是从Start Stream 或Move Data转变的,则主机会由于两个可能的条件而开始一次从Idle到Move Data状态的转变:1)如果为 LCStream而给管道布置端点buffer,并且最后的 ISPSM转变不是由于一个NRDY(Stream n )Move Data状态退出;(2)如果是为新的流布置端点buffer(例如新发送的不等于LCStream的流ID)。在Idle中,被设备开始的流选择是通过一个流ID被设置为 Stream n,NumP值大于0的ERDY TP来确认的。这个包会将ISPSM从Idle状态到Start Stream状态转变。当设备想要开始流传输时,不管它是否在一个流控制条件中,都应该开始这个转变。
45
在Start Stream状态下,管道正等待主机接收或拒绝设备发起的流选择。主机会通过发送一个Stream ID = Stream n 和NumP > 0的ACK TP来指示接收到设备初始化的流选择。这个包会历经从Start Stream状态到Move Data状态的ISPSM转变。主机会通过发送Stream ID = NoStream, NumP = 0,Packet Pending (PP) = 0的ACK TP来指示拒绝由设备初始化的流选择。这个包会历经从Start Stream state 到Idle state的ISPSM转变。如果没有有效端点buffer为设备选择流ID,主机会拒绝流选择。
ISPSM独立的在主机和设备上执行。一种条件发生:如果设备发送一个ERDY给主机,并且进入Start Stream状态,与此同时,主机发送ACK(Prime,PP=0)给设备,并且进入 Prime Pipe 状态。为了从此条件中恢复,如果设备在Start Stream状态下接收到一个ACK(Prime,PP=0),它会转变到Prime Pipe Ack状态,并且发送一个NRDY(Prime)给主机,为主机完成从Prime Pipe 到Idle 状态的转变,和为设备完成从Prime Pipe Ack到 Idle状态的转变。
在Move Data状态,当前流在管道的两端被设置,并且管道被激活移动数据到主机。总线事务处理在Move Data状态的执行和它的退出条件在下面的IN Move Data State Machine详细定义。
如上面描述,IN Move Data状态机制(IMDSM)是从Start Stream或Idle 状态进入的。当转变到INMvData Device状态,就立刻进入IMDSM。所有被IMDSM产生的包的流ID域会是Stream n.
每次进入 INMvData Device状态时,设备都会进行下面的操作进入IMDSM: if ( Device Function Data bytes > Max Packet Size )
设备会产生一个EOB域值为0的DP , 这会引起管道转变成INMvData Host状态.
else if ( Device Function Data bytes = Max Packet Size )
46
设备会产生一个EOB域值为1的DP, 这会引起管道转变成 INMvData Device Terminate状态
else ( Device Function Data bytes < Max Packet Size )
设备会产生一个短包DP, 这会引起管道转变成 INMvData Device Terminate状态。
可选择的,设备可以产生一个流ID设置为Stream n的NRDY TP终止流,会引起管道退出IMDSM,转变成Idle状态。设备可以使用这个转变来拒绝由主机初始化的Move Data。
注意:如果中间的集线器(deferred)延迟了ACK TP,主机和设备会视如设备发送了一个NRDY TP。即当主机收到延迟的应答,它会转变到Idle状态。当设备收到(deferred)延迟的ACK TP时犹如它收到了一个流ID域设置为Stream n的NRDY TP,它会退出IMDSM,转变到Idle状态。如果设备接收主机初始化的流ID,它会发送一个流ID域设置为Stream n 的ERDY。如果设备拒绝由主机初始化的流ID,它会停留在Idle状态,并且等待下一个主机或设备初始化的流选择。
INMvData Host状态的进入是因为设备有更多的功能数据要发送,所以主机要执行下面的操作进入IMDSM:
if ( 在此次突发中能安排另外的DP ) {
if ( 主机有更多的有效端点buffers )
产生NumP > 0 的ACK TP ,这会引起管道转变到 INMvData Device 状态 Else(主机没有有效空间)
产生一个NumP = 0 and PP = 0的ACK TP结束, 这会引起管道退出 IMDSM 转变到Idle状态。 }
else ( 已经收到突发的最后一个DP ) {
终止突发;
if ( 主机有更多的有效端点buffers)
通知设备突发完成(NumP = 0)主机应该为CStream安排另外一次突发 (PP = 1) 产生 NumP = 0,PP = 1 的ACK TP,这会引起管道转变成 INMvData Burst End 状态。 else(主机没有有效空间)
产生NumP = 0 and PP = 0的ACK TP终止,这会引起管道退出IMDSM,转 变成Idle状态。 }
在 INMvData Burst End状态中,主机会产生 NumP > 0 and PP = 1 的ACK 开始下一次突发,引起管道转变成INMvData Device 状态。
Pseudo码描述IMDSM假设收到的DP是有效的。如果它无效,则ACK TP被产生,这会把管道转变成 INMvData Device状态。ACK TP中的顺序号不会上涨,然后,重试位可以减少发送的NumP值。如果NumP = 0 ,并且主机中还有有效的端点buffer,PP会被设置为1;否则,PP被设置为0.
INMvData Device Terminate状态的进入是因为设备没有更多的功能数据要发送,所以主机会产生一个NumP = 0 and PP = 0的ACK TP终止,这会引起管道退出IMDSM,并
47
且转变成Idle状态。如果主机在最后一个被设备发送的DP中检测到一个错误,它会以带有重试位的ACK TP (Steam n, NumP>0, Rty)应答,IMDSM会转变成INMvDataDevice状态。
注意:如果DP错误在 INMvDataHost 中被检测到,主机会产生一个NumP > 0 and Rty = 1的ACK TP,这会引起管道转变成INMvDataDevice状态,并且重新发送包。
8.12.1.4.3 块OUT流协议
这个区域定于了超速包交换进行从一个状态转变到另外一个状态的输出块端点上的流协议。
对于输出管道,主机的端点数据被发送到功能设备的buffers中,除非另外的规定,DP将包含端点数据。
在端点配置后,管道在Disabled状态。主机通过发送带有流ID域设为Prime的DP要将管道转变成Prime Pipe 状态。这个转变发生在端点buffers被主机软件分配给管道之后。
8.12.2 控制传输
控制传输最小有两个事务处理阶段;建立阶段和状态阶段。一次控制传输可以可选的在建立阶段和状态阶段中间包含一个数据阶段。数据阶段的方向由在setup包数据负载的第一个字节中的bmRequestType域指示。在setup阶段期间,一次setup事务处理是用来发送信息给设备的控制端点。Setup事务处理和一次块OUT事务处理格式相似,但是在DPH中有个setup区域被设置为1,并且数据长度域被设置为8. 除此之
48
外,setup包总是使用数据顺序号0。设备收到setup包会以在Section 8.11.4中定义的应答。在主机和设备上任何控制端点之间交换的TP或DP的方向域应该被设置为0。(控制端点为双向的,所以不区分端点方向)。
注意:如果端点想要对控制传输进行流控制,则它可以返回NumP域被设为0的ACK TP作为一个SETUP包的应答。设备必须发送ERDY开始数据或状态阶段。
控制传输如果存在数据阶段的话,它由一个或多个IN/OUT事务处理组成,并且和带有突发设置为1的块传输的协议规则相同。数据阶段总是从顺序号设置为0开始。所有数据阶段的事务处理应该是在同一个方向(比如全部为IN或OUT)。在数据阶段期间要被发送的最大数据量和它的方向在setup阶段被指定了。如果数据量超过了最大包大小,数据以多个最大数据包大小发送。剩下的任何数据在最后数据包中被发送。
注意:所有的控制端点值支持突发次数为1,因此,主机一次只能对控制端点发送或接收一个包。
控制传输的状态阶段是整个控制传输流程的最后的事务处理。状态阶段事务处理通过子类型被设为STATUS的TP来确认。作为对Deferred位为0的STATUS TP的应答,设备应该发送NRDY,STALL或ACK TP。如果设备发送一个NRDY TP(收到STATUS TP后没完成状态阶段),主机再发送另外一个STATUS TP给设备之前会等待设备为控制端点发送一个ERDY TP。如果STATUS TP中的Deferred位置位,那么设备会发送一个ERDY TP向主机指示,准备完成控制传输的状态阶段了。
Figure 8-33 and Figure 8-34展示了控制读和写流程的事务处理顺序,数据顺序号值和数据包类型:
49
50
当一个STALL TP在数据阶段或状态阶段被控制端点发送时, STALL TP应该在所有随后对端点访问中被退回,直到收到SETUP DP。当端点随后收到一个SETUP DP,它应该返回一个ACK TP。对于控制端点,如果ACK TP为SETUP事务处理被返回,那么主机期待端点已经自动从引起STALL的条件中恢复,并且端点会正常操作。
8.12.3 总线间隔和服务间隔
51
对所有周期性端点,端点必须要被服务的间隔 称为一个“服务间隔”。在这个规范中,“总线间隔”用来指一个125us的周期。
8.12.4 中断事务处理
中断传输类型是用来在有界限的服务周期内进行稀少的数据传输。它支持在保证的界限延迟下可靠的数据传输。只要数据是有效的,则它提供可靠的恒定数据率。如果错误在数据传输中被检测到,则主机不要求在同一个服务间隔中重试事务处理。然而,如果设备不能立刻发送或接收数据(例如应答NRDY TP),则主机只会在它收到一个来于设备的ERDY TP之后重新开始对端点的事务处理。
中断事务处理域块事务处理非常相似。但是不限制在每个服务间隔中一次突发3个DPs。只要设备能接收数据(OUT)或者能发送数据(IN),则主机会在协定的服务间隔中继续对中断端点进行事务处理。主机被要求在服务间隔中为每个成功接收到的DPs发送一个ACK TP,即使它是在那个服务间隔中的最后的包。最后的ACK TP包会应答收到的最后的DPs,会使Number of Packets域设置为0.如果在当前服务间隔中对中断端点进行事务处理时发生了错误,那么主机不要求在当前服务间隔重试事务处理,但是主机最迟会在下一个服务间隔中进行重试。
8.12.4.1 中断输入事务处理
当主机想要开始一次对端点的中断IN事务处理,则它发送一个带有期待顺序号和它期待要从端点接收的包数量的ACK TP给端点。如果中断端点能发送数据作为来自于主机的ACK TP的应答,则它可以在相同的服务间隔中发送主机所要求的包数量。主机对每个DPs应答ACK TP,指示成功的接收了数据或请求要被重试的DP,以防DPP损坏。
注意:当主机开始来于被初始化之后的指定端点的第一次传输时,主机期待第一个DP使它的顺序号被设为0。初始化端点是指通过Set Configuration 或 Set Interface 或 ClearFeature (STALL) 命令。
中断端点应该对从主机那接收到的TPs进行应答。在Section 8.11.1中描述。在每个服务间隔中,只要设备返回数据作为主机发送ACK TPs的应答,并且传输没有完成,则主机会继续发送ACK TPs给设备。
当下面任何一个发生时,主机会停止对端点进行事务处理: ·端点以NRDY或STALL TP应答时 ·所有要传输的数据都成功接受到了
·端点在发送给主机的最后的DP中设置EOB标志。
当端点收到来于主机的一个ACK TP,并且不能通过发送数据来应答,它会发送一个NRDY( 或当内部端点或设备错误时发送STALL) TP给主机。主机在随后的服务间隔中不会对端点进行更多任何的事务处理。
只在收到一个来自于端点的ERDY TP后,主机才会重新对端点进行中断事务处理,用上一次服务间隔中的流控制应答来应答。这个通知主机关于端点是否再次发送数据。一旦主机接收到ERDY TP,则它会在不超过两个服务间隔内发送一个IN请求(通过ACK TP)给端点,这个值由中断端点描述符中的bInterval域决定。一个中断端点通过返回DP(包顺序号比最后成功发送的数据包顺序号大1)或,如果不能返回数据,则返回NRDY 或STALL TP来应答。
如果设备接收一个DL置位的中断IN TP,并且设备需要发送中断IN数据,则设备会以ERDY TP应答,并且保持它的链路在U0状态直到它收到随后的来于主机的中断事务处理,或直到tPingTimeout (参考Table 8-33) 超时。
52
正如块事务处理情况下,每个被中断端点发送的包顺序号连续递增,当顺序号到了31,下一个它会变为0.
53
54
8.12.4.2 中断输出事务处理(Interrupt OUT Transaction )
当端点想要对端点开始一次中断输出事务处理时,它发送期待第一个的顺序号的数据包。如果端点支持大于1的突发大小,则主机在同一个服务间隔可以发送更多的包给端点。如果端点能接收主机的数据,则它发送一个ACK TP应答数据的成功接收。
注意:在端点初始化后,主机在一次传输中总是以第一个DP的顺序号为0开始。 在端点的每个服务周期中,只要设备返回ACK TPs作为主机发送数据包的应答,并且传输没有完成,则主机要继续发送数据给设备。设备要应答对DP的成功接收,如果数据包损坏了,则要求主机重试事务处。
对于主机OUT数据的应答,中断端点要以Section 8.11.3. 中描述的应答。
当端点接收来自主机的数据,但是不能立刻接收时,则要发送NRDY TP(或在发生内部端点错误或设备错误时发送STALL)给主机;主机在随后的总线周期中不能对端点进行任何事务处理(除非发送了ERDY异步通知)。
在收到一个来自于端点的ERDY TP后,主机要重新开始端点的中断事务处理,以流控制应答来应答。这告知主机关于端点是否又能准备接收数据了。一旦主机收到ERDY TP,主机就要在两个服务间隔内发送数据包给端点。服务间隔在中断端点的描述符中的bInterval域被描述。
如果设备收到一个deferred(延迟的)的中断输出DPH,并且设备此时需要接收中断OUT数据,设备要以ERDY TP应答,保持它的链路在U0(逻辑空闲)状态下直到它收到随后的来自于主机的中断事务处理,或者直到tPingTimeout 超时了。
正如在块事务处理情况下,顺序号随着主机发送的包增加,当顺序号达到31,它下个顺序号会变成0。
55
注意:在Figure 8-43 中,主机在同一个服务间隔中重试收到带有错误的数据包。其实没必要这样做,可以在下一个服务间隔中重新进行事务处理。
56
8.12.5 主机时序信息
8.12.6 同步事务处理(IN同步事务只在第一次发ACK TP请求同步数据)
输入同步事务在Figure 8-46中展示,输出同步事务处理在Figure 8-47中展示。对于输入同步事务处理的,主机为其发送一个紧跟着返回数据的ACK TP。对于输出同步事务处理,当有数据要在当前服务间隔中被发送时,主机会简单的发送数据。同步事务处理不支持重试。
57
每个服务间隔包含单个数据包的超速同步事务处理总是使用顺序号0(每个服务间隔发送一个数据包,顺序号总是为0).对于每个服务间隔包含多数据包的同步事务处理,后面的数据包顺序号以1递增。在任何服务间隔中第一个数据包总是使用顺序号0。主机在每个服务间隔中最多应该能接收和发送48个DPs。顺序号是从0到31循环的。带有同步端点的超速设备要能够发送或接收在其端点和endpoint companion descriptors中指定的包数量。
如果数据比端点最大包尺寸少,那么它发送时,在服务间隔的最后包中lpf域会置位。如果在一个服务间隔期间没有数据发送给输出同步端点,那么主机在整个间隔周期不会发送任何数据。如果带有同步输入端点的设备在接收到来自主机的同步输入ACK TP时没有数据要发送,则它会发送一个0长度的数据包。
Figure 8-48 和Figure 8-49展示了同步输入和输出事务处理例子,其端点已经提供有一个不超过服务间隔请求2000字节的带宽(每个服务间隔不超过2个数据包被发送或接收)。
如果主机由于一个错误条件而在指定的间隔中不能发送同步输出数据,则主机放弃数据,通知主机软件发生了错误。如果主机由于错误条件而在指定的服务间隔中不能发送一个同步ACK TP,主机同样会通知主机软件错误的发生。
58
59
不同服务间隔中顺序号总是从0开始。
60
注意:上图表示在同一个服务间隔中,进行了三次事务请求, 顺序号一直递增,
61
上图表示在同一个服务间隔中,如果没有数据发送了,但是传输还没有完成,等到有数
62
据发送时,则顺序号仍然在原来的基础上递增。 8.12.6.1 在同步事务处理中的主机柔性
主机被允许在进行同步服务间隔中的一些柔性。主机与端点传输所有的DPs可以作为一次单个同步突发事务处理或者它可以将传输分为更小的突发,像2,4,或8个DPs,服务间隔中最后的同步突发带有剩下的数据包DP。主机在任何其他情况下不会进行同步事务处。对于有一个比1大的Mult的同步端点,这些规则分别适用于跟每个Mult值相关的突发事务处理。设备要支持所有可能的这些规则允许的主机突发事务处理。例如,如果同步输出端点在一次11的突发中请求一次最大数量的包,主机在服务间隔中有11个包要发送给端点,那么有四种主机进行事务处理的可能方式:、
·单次突发11个包
·一次8个包的突发,然后跟着一次3个包的突发 ·两次4个包的突发,然后跟着一次3个包的突发 ·5次2个包的突发,然后一次1个包的突发
每个服务间隔进行多次突发时,主机不会复位服务间隔中的顺序号,主机仅仅会在服务间隔中设置最后一次突发中最后包的LPF标志。
8.12.6.2 对同步输入事务处理的设备应答
Table 8-30列出了可能的设备能对ACK TP做的应答。如果有一个不正确的设备地址或端点号与方向不是指向当前配置部分中的端点,或者没有期待的序列号,则一个ACK TP被当成无效。
8.12.6.3 主机对同步输入事务的处理
Table 8-31 列出了主机处理来自于输入事务的数据。主机从不对收到同步输入数据做应答。在Table 8-31中,DP错误可能由于下面当中一个或几个导致:
·CRC-32错误 ·DPP终止 ·DPP丢失
·DPH中的数据长度与实际数据负载长度不匹配
如果主机接收到一个损坏的数据包,则它丢弃在当前服务间隔中剩下的数据,并且通知主机软件错误的发生。
63
No-Data Packet应该是指DPH
8.12.6.4 对同步输出数据包的设备应答
Table 8-32列出了设备对来自于输出数据包的数据处理。设备从不返回TP作为应答。在Table 8-32中,DP错误可能由下面一个或几个导致:
·CRC-32错误 ·DPP终止 ·DPP丢失
·DPH中的数据长度域实际数据负载长度不匹配
8.13 时间参数
Table 8-33 列出了当设备对收到了各种类型包做应答时,设备要坚持的最小的和/或最大的时间。它也列出了当设备能开始进入U1或U2,设备在延迟容忍消息中可以设置的默认的和最小的时间,和在接收确定的TPs之后的最小时间。除此之外,它列出了在突发中设备必须保持的DPs之间的最大时间。
注意:当设备没有其他要在它的上游连接上发送的时候,所有的 txxx应答(例如tNRDY应答)时间都是设备要满足的时序。
64
65
注意:如果主机在 10us内没有看见一个对数据事务处理的应答(IN/OUT),它要假定事务处理已经失败了,端点已经停止了。不进行重试。
//*************************************************************************
我是霸气的分隔线
下面是些简单解说,详细解说见上面
//**************************************************************************
DP:
第七章已经稍有描述其结构,DP是DPH后面紧跟着一个DPP构成,格式如图8-22所示: USB2.0中的SETUP包,在USB3.0中是一个DP格式出现的。
ITP:
ITP构造同头包,格式如图8-23所示: 从四种包类型的构造、格式上来看,与USB2.0的包结构、格式完全不同。尽管USB3.0中也有ACK、STALL、SETUP、PING等各种SubType,似乎和USB2.0的ACK、STALL、SETUP、PING等有对应关系,但是实际上除了包结构、格式不同外,用法和意义有了一些变化,并增加了许多新的Type和SubType,包的管理已经完全不同,所以决不能简单地认为USB3.0和USB2.0的packet有对应关系或者是简单的扩展关系。
66
BULK transactions:
BULK IN Transactions:
当Host希望从Device读数据的时候,Host发送包含数据包顺序号和包数量信息的ACK TP给Device,然后Device发送DP给Host,Device不需要等待收到下一个ACK TP而可以继续发送后续的DP。每个DP的包序号是递增的,从0~31,然后回转到0,重新递增。如果Host发送了一个retry位为1的ACK TP,则从该ACK TP中表示的包序号开始的数据包需要重传。当Device完成了Host请求的数据包之后,或者Device发送了一个短包,这次transfer就完成了。
BULK OUT Transactions: Host发送DP给Device,每个DP使用递增的包序号(0-31),Device向每个DP回ACK TP。同样的,Host不必等待收到ACK TP就可以继续发送下一个DP,如果Device回复了一个retry位被置位的ACK TP,Host需要从该ACK TP指示的包序号开始重传DP。Host发送完所有数据后该transfer就完成了。
Control Transfers:(控制传输)
控制传输仍然分为SETUP stage,可选的Data stage和STATUS stage。 SETUP是一个DP,其DPH中的Setup域置1,Data length域为8。 Data stage不采用包序号,所有DP顺序号都是0。不使用burst方式。 STATUS stage,Host发送一个TP,其SubType是STATUS,Device返回一个NRDY,STALL,或者ACK TP完成SETUP transfer。
每一个设备需要启动默认控制管道作为一个消息管道。这个管道是用来设备初始化和管理,用来访问设备描述符和请求操作一个设备。控制传输必须遵守USB2.0定义的相同的要求。
Interrupt Transactions:
Interrupt transaction周期性吞吐数据,每个服务间隔限制为最多三个DP,其transaction和BULK类似。
Isochronous Transaction:
ISO transaction在每个服务间隔最多可以传送48个DP。ISO IN时,Host只需要发送一个ACK TP,然后Device返回一个或多个DP,Host不需要对每个DP回ACK TP。ISO OUT时,Device发送一个或多个DP,Host不返回ACK TP。这类似于USB2.0时ISO传输没有握手过程。每个服务间隔的第一个DP其顺序号总是0开始。
67
因篇幅问题不能全部显示,请点此查看更多更全内容