USB3.0协议规范中文解读 - 图文 下载本文

第八章、协议层

协议层管理Host和Device间end-to-end数据流,是建立在链路层正确传输基础上的。 本章详细描述: ·包类型;(LMP,DP,TP,ITP) ·包格式;

·包期待的响应;

·四种transaction类型; 8.1超速事务处理

随着向设备端点请求或者发送数据,主机开始超速事务处理。随着端点发送数据或者对接收数据应答完成事务处理。在超速总线上的一次传输是一次从设备到主机的数据请求,然后将其分解为一次或者几次突发事务处理。当超速主机在等待当前总线事务完成的时候, 它可能会开始一次或多次OUT总线事务输出到一个或几个端点。然而,超速主机不应该开始另外一次对端点的IN总线事务,直到主机:(同时能进行多个OUT事务,只能进行一个IN事务)

·收到一个DP包或者NRDY或STALL TP包或者因为当前被发送到非同步端点的ACK TP包的事务处理超时

·收到了所有被请求的DP包或者主机收到一个短包,或者一个最后包标志域置位的DP包,或者因为当前被发送到同步端点的ACK TP(注意同步端点没有错误应答)事务处理超时

对于非同步传输,端点可以通过下面应答有效的事务处理: ·返回一个NRDY TP包

·在OUT事务中通过返回一个ACK TP(正确应答)包接收数据

17

·在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四种。

所有的包有一个14字节的头,结尾跟着一个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域后。路由信息是被集线器用来路由选择上游端口的包传递到正确的下游端口。从设备到主机的包组成的流总是从集线器的下游端口通过路由选择传到上游端口。设备地址域被提供给主机用来验证一个包的源头。所有的其他域在这章会被描述。

数据包的头部包含了用来描述数据块的额外信息。数据块(DPP)总是被跟着一个4字节CRC-32用来判定数据的正确性。数据块和CRC-32一同组成了数据负载包DPP.

8.3 包格式

这个区域定义了超速包。它定义了组成各种包类型和子类型的区域。 这个区域的包类型和位定义以未编码数据格式呈现。添加到串流上的符号有影响(即帧包,控制或修改链路),像位编码,链路层帧,为了精简讲述,已经被移除了(它们对协议层是不可见的)。详细参考6,7章信息。在总线操作,效率或者时序讨论到的地方,会描述那些底层操作对提供额外内容的影响。

8.3.1 所有头的公共区域

所有超速头以类型域开始用来决定怎样处理包。在顶层这个告诉包接收方怎样处理包:

18

是使用它(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转换码等物理层的特性)。

Type是5bit,所有类型的包都有的,其意义为: 00000: LMP 00100: TP 01000: DP 01100: ITP

所以LMP类型包,Type总是00000。

19

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 详细描述了。

(Set Link Function)

·Subtype---4位宽度,DW0:bit5,这个域应该为一个Set Link Function的LMP包被置位。 ·Set Link Function----7位宽度,DW0:bit9,这7个位识别Set Link Function.(具体的命令)

20