1.协议层
1.1.超高速传输事务
超高速事务(SuperSpeed transactions)由主机对设备端点请求或发送数据开始,并在端点发送数据或确认收到数据时完成。
超高速总线上的数据传输(transfer)是主机请求设备应用程序生成的数据,然后该请求被分解成一个或多个突发事务(burst transactions)。
当等待完成当前的总线事务时,超高速主机可以启动一个或多个OUT总线事务到一个或多个端点。
注意:在满足如下条件之一前,超高速主机不可以发起另一个IN总线事务到任何端点:
• 接收到所有DPs,或者一个NRDY,或者一个STALL TP,或者发送给非等时(non-isochronous)端点的当前ACK TP事务超时;
或者
• 接收到所有的已经请求过的DPs,或者接收到一个短包(short packet),或者接收到一个last packet flag被设置的DP,或者发送给等时(isochronous)端点的当前ACK TP事务超时。
对于非等时传输(non-isochronous transfers),端点可能通过如下方式对有效的事务(valid transactions)做出响应:
• 返回一个NRDY事务包(Transaction Packet)
• 返回ACK事务包(Transaction Packet)来接受OUT事务 • 返回一个或多个数据包来响应IN事务
• 如果遇到端点内部错误,返回一个STALL事务包(Transaction Packet)
NRDY 事务包(TP)响应表示端点没有准备好接受或者发送数据。结果,在该端点通知主机它已经准备好之前,主机和该端点之间不应该有进一步的活动。这就允许主机和设备之间的链路被设置到低功耗状态(reduced power state),直到端点准备好接受或者发送数据。一旦准备好,端点异步发送一个通知(ERDY TP)给主机,告诉主机它现在已经准备好搬移数据,而主机也通过重新调度先前的请求来做出对该通知的响应。注意等时传输不使用ERDY 或者 NRDY TPs,因为它们是由主机周期性地服务的。此外,在等时端点上发送或者接收的数据包不需要确认,也就是说,没有ACK TPs被发送来确认数据包的接收。
端点只响应由主机作出的请求。主机负责调度总线上的事务,并维护总线上数据搬移的优先级和公平性(priority and fairness);这是通过对IN和OUT请求进行计时和排序(timing and ordering)达到的。事务不是广播;包通过一条直接的路径在主机和设备间穿越(traverse a direct path)。任何没有被使用的链路都可以被设置到低功耗状态(reduced power states),使得总线可以满足严苛的电源管理要求(amenable to aggressive power management)。
1.2.数据包类型
超高速USB使用4种基本数据包类型,每个类型又有一个或者多个子类型。这4种类型如下:
• 链路管理包【Link Management Packets (LMP)】
只在一对链路(一对直接连接的端口)之间传送,主要用于管理这条链路。
• 事务包【Transaction Packets (TP)】
在所有的直接连接主机和设备的链路上传送。它们被用于数据包流程控制制,配置设备及集线器等等。事务包没有数据负载。
• 数据包【Data Packets (DP)】
在所有的直接连接主机和设备的链路上传送。数据包有两部分:数据包头【Data Packet Header (DPH)】以及数据包负载【Data Packet Payload (DPP)】。
• 等时时戳包【Isochronous Timestamp Packets (ITP)】
是在主机到一个或多个设备间的所有活动链路(active links)上的多播(multicast)。
所有的包都包含一个14字节的头部,紧接包尾的2字节链路控制字(Link Control Word)(总共16字节)。所有的头都有一个Type字段,被接收实体(receiving entity)(例如主机,集线器,或者设备)用来判断如何处理这个包。所有的头部都包含2字节CRC (CRC-16)。包头具有在1020个比特中少于1个不可校正或不可检验(uncorrectable or undetectable)的错误率。
所有的设备(包括集线器)以及主机都消耗掉它们接收到的链路管理包(LMPs)。集线器有附加的责任来转发DPs, ITPs, 以及TPs到接近设备的下行端口(downstream port nearer a device),或者到接近主机的上行端口(upstream port nearer the host)。注意等时时戳包(ITPs)只由主机发送,而由设备接收。所有除链路管理包(LMPs)之外的包都会被集线器转发,除非这个包是路由给该集线器自己的。对路由等时时戳包(ITPs)的附加规则在第8.7节中描述。注意,在TP, ITP, 或者DPH中的链路控制字(Link Control Word)可能会被集线器在转发之前改变。
如果Type字段的值是Transaction Packet 或者Data Packet Header,那么Route String和Device Address字段将依照Type字段而定。Route String字段被集线器用于路由在其上行端口出现的数据包到适当的下行端口。从设备来的数据包总是从集线器的下行端口路由到其上行端口。Device Address字段用来供主机识别一个数据包的源。所有其它的字段将在本章后面得以详述。
数据包在包头中包含附加的信息用来描述数据块(Data Block)。数据块(Data Block)总是紧跟4字节的CRC-32字段,用以判定数据的正确性。数据块和CRC-32一起被称作数据包负载(Data Packet Payload)。
1.3.数据包格式
注意:保留值和保留字段的处理
保留字段和保留值不允许以Vendor特定的方式使用。
发送方应该将所有的保留字段都设置为零值,接收方应该忽略所有的保留字段。
发送方不允许将已定义的字段设置成保留值,接收方应该忽略所有的将已定义字段的值设成了保留值的数据包。
1.3.1.包头
组成包类型和子类型(packet type and subtypes)的各个字段。
数据包字节和bit位定义使用未编码的数据格式来定义。
1.3.1.1.所有包头都有的字段
1.3.1.1.1.Type字段
所有的超高速头包都是以Type字段开始的,用以判定如何解释该包。在高层次上这告诉包的接收者如何处理它:要么使用它来管理链路,要么用来控制设备和主机之间的数据流。
Type字段是一个5-bit的字段,用于指定数据包的具体格式。类型是被中间的链路用于判定数据包如何被使用或者被转发。
1.3.1.1.2.CRC-16
所有的包头都有16-bit CRC字段。这个字段是对前面的12字节进行CRC计算而得到的。
1.3.1.1.3.链路控制字(Link Control Word)
1.4.链路管理包
Type 字段设置成Link Management Packet 的数据包被称作链路管理包LMPs。这些数据包被用来管理单个链路。它们不携带地址信息,因此不能被路由。它们可能因执行集线器端口命令而被生成。例如,一个集线器命令可被用来设置U2不活动超时值(U2 inactivity timeout)。此外,他们被用来交换端口能力信息以及完成测试目的。
1.4.1.Sub Type字段
LMP Subtype字段的值进一步标示LMP的内容
1.4.2.Set Link Function
Set Link Function LMP应该被用来配置可以无须脱离活动状态(U0)就能被改变的功能性(functionality)。
一旦接收到一个Force_LinkPM_Accept bit有效的(asserted)LMP包,端口应该接受所有的LGO_U1 和 LGO_U2链路命令,直到端口接收到Force_LinkPM_Accept无效的(de-asserted)LMP包。
设备必须保持在U1或U2,直到下行端口发起退出到U0。软件在发起导致生成LGO_U1 或者LGO_U2链路命令的SetPortFeature命令之前,需要确保链路层级上没有正在等待的包(no pending packets at the link level)。在常规操作期间,该特性只能在所有将链路状态从U0降低到U1或U2的其他方式都失败的情况下使用。这个LMP是在集线器接收到一个SetPortFeature (FORCE_LINKPM_ACCEPT)命令时,发送给连接给特定端口上的设备。
注意,不恰当地使用Force_LinkPM_Accept功能可能极大地影响链路性能,而在某些情况下(仅指在常规操作期间使用时)可能导致设备不能被返回到正常操作。
这个LMP被集线器在接收到SetPortFeature (FORCE_LINKPM_ACCEPT)命令时,发送给连接到特定端口上的设备。
1.4.3.U2不活动超时(Inactivity Timeout)
U2不活动超时LMP应该被用来定义从U1转换到U2的超时值。【已勘误,对于上行端口,没有U1不活动定时器。】
U2不活动超时功能(Inactivity Timer Functionality)
1.4.4.制造商设备测试(Vendor Device Test)
使用这个LMP主要是为了制造商特定的测试目的,不应该用于正常的链路操作。
制造商特定的测试功能
1.4.5.端口能力(Port Capabilities)
端口能力LMP(Port Capability LMP)描述每个端口的链路能力,且在成功完成训练和链路初始化之后,链路伙伴双方都要发送。在端口从Polling进入U0之后,端口应该发送在链路初始化(完成之后的tPortConfiguration时间内发送Port Capability LMP。注意端口可能不总是从Polling直接转换进入U0,而是在进入U0之前可能通过其他中间状态(例如,Recovery或Hot Reset)转换。不论在Polling和进入U0之间经过了什么状态,设备都应该在进入U0时立即发送一个Port Capability LMP。
如果一个链路伙伴在tPortConfiguration时间内没有接收到这个LMP,那么:
如果链路伙伴有下行能力,它应该按照第10.14.2.6节所描述的那样发送一个错误信号。
如果链路伙伴只支持上行能力,那么上行端口应该转换到SS.Disabled状态,并且应该尝试以这个设备支持的其它速度进行连接。
端口能力LMP 格式
在交换端口能力LMPs之后,链路伙伴应该根据下表所指定的那样来判定由哪一方被配置为下行端口。
端口类型选择矩阵
注1: 如果TieBreaker字段相等,那么链路伙伴双方应该用新的不同TieBreaker值来重新交换端口能力LMPs。端口生成TieBreaker字段值的顺序应该足够随机。【译注:TieBreaker本身就含有决胜局之意。】
1.4.6.端口配置(Port Configuration)
这一节只描述与端口能力LMP有区别的字段。所有的支持下行端口能力的超高速端口都应该能够发送这个LMP。如果即将被配置成上行模式的端口没有在链路被初始化之后的tPortConfiguration时间内接收到这个LMP,那么这个上行端口应该切换到SS.Disabled状态,并且应该尝试以这个设备支持的其它速度进行连接。
端口配置LMP格式 (与端口能力LMP有区别之处)
被配置为下行模式的端口应该发送这个端口配置LMP给上行端口。发送该LMP的端口应该只选择Link Speed字段的其中1个比特。如果有能力充当下行端口的端口不能与其链路伙伴协同工作,那么该有能力充当下行端口的端口应该发送一个错误信号。
1.4.7.端口配置响应(Port Configuration Response)
这个LMP是由上行端口作为对端口配置LMP的响应而发出的。他被用作对端口配置LMP的接受或者拒绝的指示。这一节也只描述与端口能力LMP有区别的字段。
所有支持上行端口能力的超高速端口都应该能够发送这个LMP。
如果下行端口在tPortConfiguration之内没有收到这个LMP,则它应该发送一个错误信号。
端口配置响应LMP格式 (与端口能力LMP有区别之处)
如果Response Code 指示Link Speed 被上行端口拒绝, 下行端口应该发送一个错误信号。
1.5.事务包【Transaction Packet (TP)】
事务包(TPs)被用来报告数据事务的状态,并且可以返回值用以指示数据包的成功接收(reception of data packets),命令被接收或拒绝(command acceptance or rejection),流程控制(flow control),以及暂停情况(halt conditions)。
组成事务的包依端点类型的不同而有所不同。有4种端点类型:批量(bulk),控制(control),中断(interrupt),以及等时(isochronous)。
事务包 (TPs) 穿越主机和设备之间的直接路径。
事务包被用来控制数据流和管理端到端的连接。
Type字段的值应该设置为Transaction Packet (即00100b)。
Route String字段是被集线器用来路由出现在其上行端口上的包到正确的下行端口。从设备发出的事务包的路由字串被设置为零。
当主机发送一个事务包时,Device Address字段包含预定的接收者的地址。当设备发送一个事务包给主机时,它将Device Address字段设置为它自己的设备地址。该字段被主机用来识别事务包的来源。
事务包中SubType字段被接收者用来判定事务包的格式和使用方式。
1.5.1.ACK
这个事务包用于两个目的:
对于IN端点,由主机发送该事务包,用来从设备请求数据,以及对主机之前接收到的数据包进行确认。
对于OUT端点,由设备发送该事务包,用来对主机之前发送的数据包进行接收确认,以及通知主机在接收到这个包后设备还有多少个数据包缓冲区可用。
确认事务包 ACK TP 格式
1.5.2.NRDY
只能由设备的非等时端点发送这个事务包。OUT端点在设备没有包缓冲区来接收主机已经发送来的数据包DP的情况下,发送这个TP给主机。IN端点在不能发送数据包DP给主机的情况下,发送这个TP给主机,作为对主机已经发送来的ACK TP的响应。
本节只描述与ACK TP有区别的字段。
1.5.3.ERDY
只能由设备的非等时端点发送这个事务包。它被用来通知主机,端点已经准备好发送或者接收数据包。
本节只描述与ACK TP有区别的字段。
ERDY TP 格式 (与 ACK TP 有区别部分)
1.5.4.STATUS
只能由主机发送这个事务包。它被用来通知设备的控制端点,主机已经发起控制传输的状态阶段。这个TP应该只被发送给控制端点。
本节只描述与ACK TP有区别的字段。
STATUS TP 格式(与 ACK TP 有区别部分)
1.5.5.STALL
只能由设备的端点发送这个事务包。它被用来通知主机,端点已经被暂停(halted)或者控制传输无效。
本节只描述与ACK TP有区别的字段。
1.5.6.DEV_NOTIFICATION
只能由设备发送这个事务包。它被设备用来通知主机,设备或者接口状态有异步改变,例如,用来识别设备中引起设备执行一次远程唤醒操作的功能(function)。这个事务包不是从一个特别的端点发送的,在总体上是由设备发送的。
本节只描述与ACK TP有区别的字段。
设备通知 TP 格式 (与 ACK TP 有区别部分)
1.5.7.PING
这个事务包只能被主机发送。他被主机用来在发起一个等时传输之前,将到一个设备的所有链路转换到U0状态。参考附录C中关于使用这个TP的细节。本节只描述与ACK TP有区别的字段。
设备应该通过在tPingResponse时间(参考表8-33)内,发送PING_RESPONSE TP给主机,来响应PING TP(参考8.5.8节)。注意设备不应该验证EP_NUM和Direction字段,而是简单地将它们拷贝到PING_RESPONSE TP的相关字段中【已勘误】。
设备应该将其链路保持在U0状态,直到它从主机接收到一个后续包,或者直到tPingResponse时间(参考表8-33)超时。
PING TP 格式 (与 ACK TP 有区别的地方)
1.5.8.PING_RESPONSE
这个事务包只能由设备发送,来响应主机发送的PING TP。每接收到一个PING TP都应该发送一个PING_RESPONSE TP。参考附录C中关于使用这个TP的细节。本节只描述与ACK TP有区别的字段。
PING_RESPONSE TP 格式 (与 ACK TP 有区别的地方)
1.6.数据包
数据包可以被主机或者设备发送。主机用这个包发送数据给设备。设备用这个包返回数据给主机,作为对ACK TP的相应。
所有的数据包都由数据包头(Data Packet Header)和数据包负载(Data Packet Payload)组成。本节只描述与ACK TP有区别的字段。
数据包在主机和设备间的直接路径上穿行。
注意发送零长数据块的数据包是允许的,但还是需要一个CRC-32。
数据包格式 (与 ACK TP 有区别的地方)
1.7.等时时戳包【ITP】
ITP的Type字段是01100b (Isochronous Timestamp Packet)。ITPs 被用于从主机传送时间戳信息到所有的活动设备。ITPs不携带寻址或者路由信息,被集线器多播(multicast)到其链路处于U0状态的所有下行端口。设备不应该响应ITP。ITP用来提供主机端的时序信息到设备以达到同步。注意所有的设备或者集线器都可能接收ITP。主机应该当且仅当根端口链路已经在U0状态时在该链路上传送ITP。只有主机应该发起ITP传送。主机不应该为了要传送ITP而将根端口链路带进U0状态。如果根端口链路处于U0状态,主机应该在每个总线间隔的边界的tTimestampWindow内传送一个ITP。主机应该在主机的根端口的链路从轮询状态进入U0状态tIsochronousTimestampStart时间内开始传送ITPs。ITP可以在一个突发的包之间传送。如果一个设备接收到一个链路控制字中的延迟标志(DL)被设置的ITP,其时间戳值可能非常不精确,可以被设备忽略。
等时时戳包格式
在ITP的第一个分帧符号(framing symbol)被传送时测量的ITP的ITS值精确度应该具有主机时钟(用于ITP生成)值的±1个 tIsochTimestampGranularity单位。