USB2.0/3.0协议与代码分析(二)

一、USB3.0协议简介(续)

本章重点讲解USB3.0的数据包结构,以及与USB2.0的协议差异性。

二、USB3.0与USB2.0的差异

USB3.0是兼容USB2.0,因此USB3.0支持USB2.0所有的特性。USB3.0 系统架构如下,USB3.0增加了Super Speed(SS)模式,可以认为SS与HS/FS/LS是解耦合的,具有独立的传输通道(还是存在小部分耦合);
在这里插入图片描述
USB3.0传输速率可达5Gbps,也就是SS超速模式,在USB2.0的基础上增加5根线,分别是SSRX-, SSRX+, SSTX-, SSTX+, GND_DRAIN,可以推导出USB3.0就支持全双工模式。
下面是USB超速模式与USB2.0的传输模式的区别
在这里插入图片描述

三、USB3.0 超速模式的架构

根据下图可以看出该架构由物理层、数据链路层、协议层和设备或是主机组成。下面粗略讲解各层的作用,作为大体的认识。
在这里插入图片描述
1、物理层定义了端口的PHY部分以及下游端口(在主机或集线器上)与设备上游端口之间的物理连接。当链路空闲时,会用LFPS (low frequency periodic signaling)信号初始化和电源管理信息(握手脉冲,后面会介绍)。每个PHY都有自己的扩频时钟(SSC)调制的时钟域(主要是用于避免能量集中导致EMI辐射)。并采用8b/10b将数据和控制字符编码(一种用于直流平衡的编码方式,维持0/1数量一样多)。并采用一些技术去提高信道性能,让眼图变大。加扰/去扰的方式就是采用线性反馈移位寄存器(功率谱分布更为平滑和均匀,从而降低高频串扰)。
2、超高速链路层是两个端口之间的逻辑连接和物理连接。连接的端口称为link partners。它包括1)用于管理物理连接的状态机,2)用于管理与link partners的信息交换的状态机和缓存。3)在传输过程中为数据包提供正确的字节序列帧; 例如,插入数据包分隔符。4)检测接收到的数据包。5)为协议层提供适当的接口,因为它向上对接协议层;
3、超高速协议层提供了主机和设备端点之间的应用程序数据信息交换。1)包头是协议层的构建块。它们是固定大小的数据包,具有用于特定目的的类型和子类型字段编码。2)重要的,它支持burst传输数据,设备可以异步响应主机;3)主机向总线发送一个特殊的包头,其中包含主机的时间戳。此报文中的值用于保持需要与主机同步的设备。与其他类型的数据包不同,时间戳数据包沿着所有非低功耗状态的路径转发。时间戳数据包的传输是由主机在指定的时间段内调度的。

四、超高速数据流模型

超速USB事务处理协议本质上是一个分离的事务处理协议,它允许在同一时间不止一个OUT总线事务处理(设备可以多个)和至多一个IN总线事务处理(主机只有一个)在总线上活动。

4.1 与USB2.0区别

SS保留与USB2.0的管道和端点特性,更多的是,SS支持非同步端点(就是批量传输和控制传输的端点)忙碌时返回Not Ready(NRDY), 等有空时返回Endpoint Reday(ERDY)。
SS与USB2.0的不同点:
(1)不同于USB2.0的令牌,数据和握手,对于OUT, SS把令牌合到数据包,对于IN,令牌被握手取代;
(2)SS支持burst传输;(重要的一点)
(3)SS支持全双工,IN和OUT同时传输;
(4)USB2.0为轮询,SS为异步通知(不会立马回复);
(5)SS支持bulk的流传输;
(6)SS支持让具体同步能力的设备在服务间隔内进入低功耗链路状态;还支持主机发送PING包让回到工作状态;
(7)USB 3.0提供了一种机制,允许超高速设备使用延迟容忍消息来通知主机它们的延迟容忍。
(8)usb2.0以固定的1ms /125 μs间隔传输SOF/uSOF。USB 3.0增加了设备发送总线间隔调整消息(Bus Interval Adjustment Message)的机制,主机将总线间隔调整到125 μs±13.333 μs。
(9)SuperSpeed支持链路级电源管理,可以从链路的任何一端发起。
(10)USB 2.0处理事务错误检测和恢复,流量控制仅在端到端级别为每个事务。SuperSpeed将这些功能划分为端到端和链路级别。

4.2 事务(transfer)传输描述

超速包以16bytes的头部开始,有四种基本类型的包
1、Link Management Packet(LMP),它只在链路两端进行传输,用于管理链路;
2、Transaction Packet(TP),它在主机和设备之间进行传输,控制流式数据包,TP包只有用于控制命令的包头DPH,并没有数据。
3、Data Packet(DP),它也是在主机和设备之间进行传输,由DPH(Data Packet Header)和DPP(Data Packet Payload)组成;
4、Isochronous Timestamp Packet(ITP)。它被主机用来多点广播到所有的活动的链路上。

USB依然有四种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)。

数据突发传输(重要的特性)
数据突发可以通过减少每个数据包响应等待时间来提升传输效率,不过SS设备的端点必须告诉对方可以发送或是接收的数据包长度是多少。最大的突发大小就是这个端点的能力。对于OUT传输,主机可以控制突发大小,对于IN传输,主机可以发送到设备的IN包来限制突发发小。

IN传输
主机发送IN包(这里也叫ACK包),告诉设备,主机期望设备发送的数据数量以及第一个包的序列号;
下面是主机发送突发长度为N的IN请求,强调一下,设备可以不等待主机的ACK响应就可以发送data数据,但是最后主机的ACK响应必须与数据量一样。
什么时候表示传输结束呢?有三种情况:
(1)正常下,所有数据传输完成;
(2)端点响应的数据包小于端点最大数据包大小;(这是因为一开始肯定要塞满端点的最大数据包大小,当数据量塞不满就表示数据量快传输完毕了)
(3)端点响应错误;(出现问题了)
下面是IN的burst传输, 可以看到这是全双工的,并且设备的数据发送可以不需要等收到主机的ACK响应;
在这里插入图片描述
OUT传输
主机向设备发送数据包,对于非同步事务(等时传输),设备发出确认包,这个确认包括下一个数据的序列号,也响应了上一个数据包;
同样的,支持burst传输,不需要收到ACK响应就可以发下一笔数据;
传输完成的标志:与IN传输保持一致
下面是OUT的burst传输
在这里插入图片描述

五、USB3.0 物理层

下面是物理层发送和接收框图,它是属于同一个组件,它是由两个差分线(四个导线)组成;
在这里插入图片描述

5.1 Symbol Encoding

SS采用的是8b/10b编码(USB2.0是NRZI编码),由上图发送框图看到D-code经过加扰(K-code没有,K码控制码,D-code为数据码)后进行8b/10b编码,下面是8b/10b编码过程,8b/10b被拆解为5b/6b和3b/4b编码,有相应的映射表进行转换;接收极性错误(这里指的是违反0/1数量平衡)不会直接导致链接重新训练,而是物理层应通知链路层。当收到8b/10b信号错误时,替换K28.4符号发到链路层上。
在这里插入图片描述
下面是特殊的符号-K码描述
在这里插入图片描述

5.2 Data Scrambling

数据加扰本质上用的是16bit-线性反馈移位寄存器与8bit-数据位异或得到,数据加扰是可以禁止的,用于调试和定位。
在这里插入图片描述

5.3 链路初始化和训练

训练序列作用
(1)配置和初始化链路(2)位锁和符号锁(3)Rx均衡训练(4)Lane极性反转
位锁是指时钟/数据恢复(CDR)电路从输入数据流中提取相位和频率信息的能力;位锁定是通过发送足够长的位序列(D10.2符号包含交替的0/1)来完成的,因此CDR大致将时钟集中在位内。
下一步是定位一个10位符号的开始和结束,为此,从8b/10b码中选择了特殊的k码COMMA,COMMA是唯一的,D码与D码/K码组合的中间位都无法得到COMMA(K28.5 对齐码)。‘
训练序列(TS1或TS2)是连续传输的,只有在有序集之间(在连续的TS1集之间,连续的TS2集之间,或者TS1后面跟着TS2时)发生有序集才能被SKP中断。

LFPS(低频周期信号)
LFPS用于低功耗链路状态下两个端口间的边带通信。当链路处于训练状态时,或者当下游端口发出Warm Reset来重置链路时,也可以使用它。它是由tRepeat个的tburst的0/1信号组成,下面是示意图。
在这里插入图片描述
LFPS可以用于U1/U2退出,U3唤醒,Loopback退出握手。
U1是最低级别的低功耗状态,主要用于在短暂的空闲时间内降低功耗,设备的PHY(物理层)和链路层仍然保持激活状态,但数据传输暂停。
U2是中等级别的低功耗状态,设备的链路层进入睡眠状态,但PHY仍然保持激活状态。
U3是最高级别的低功耗状态,用于在设备长时间空闲时最大限度地降低功耗。设备的链路层和PHY都进入睡眠状态,数据传输完全暂停。
warm Reset
Warm Reset是指仅由下行端口对上行端口产生的复位。下行端口可以在除SS.Disabled外的任何Link状态下发出Warm Reset。上行端口需要在除SS.Disabled外的任何链路状态下检测Warm Reset(USB有三种复位事件,具体参考别的资料)。

六、 USB3.0 链路层

6.1 大小端

链路层负责链路的连通,确保链路的两个link partners进行数据传输,link commands就是用于链路层。此外,链路层还进行错误检测。
链路层采用小端模式,如下图所示,
在这里插入图片描述

6.2 链路链路包

所有的header packects是由20个符号组成,包括LMP,TP, ITP, DPH。包头(header packet)由三部分组成,包括header packet framing, a packet header, 和link control word。
header packet framing:SHP*3+EPH
packet header: CRC+12Byte-DATA
link control word: 一个3位的报头序列号、3位的保留号、3位的集线器深度索引、一个延迟位(DL)、一个延迟位(DF)和一个5位的CRC-5。
在这里插入图片描述
Data Packet是一个特殊的包,它由一个Data Packet Header (DPH) 和 一个Data Packet Payload (DPP)组成,DPH已经介绍了。DPP是由八个k符号(一个四符号的DPP起始帧有序集和一个四符号的DPP结束帧有序集)和DPP数据段(0 ~ 1024字节的数据和4字节的CRC-32)组成。
在这里插入图片描述
(注意:DPH与其相应的DPP之间不得有间距)

link command用于链路级数据完整性、流量控制和链路电源管理。它的具体格式如下所示:
在这里插入图片描述

6.3 链路错误规则/恢复

包帧和链路命令帧容忍一个符号错误。在链路层有各种类型的错误。这包括数据包或链路命令上的错误,链路训练过程中的错误,或者链路从一种状态转换到另一种状态时的错误。
包头错误:(1)丢失包头(HPSTART指的是header packet的header packet framing);(2)CRC错误(CRC-5用于检测链路控制字中的位错误。CRC-16用于检测报头中的误码);(3)Rx报头序列号对不上;
这些错误状态都会进入Recovery状态,链路错误计数加一。
(其他的错误恢复不介绍了)

6.4 上电复位与带内复位

与LINK相关的复位有两种,第一种是上电复位,将存储单元或是寄存器复位到初始值。LTSSM(链路训练状态机)在上电复位会进入Rx.Detect。还有一种是带内复位(Inband Reset),可以分成两种Hot Reset和Warm Reset,带内复位只有下游端口才会产生。
Hot复位产生的动作(允许下游端口复位其上游端口):
1)下游端口复位错误计数;
2)上游端口端口配置不变;
3)PHY的变量(例如RX均衡设置)要保持不变;
4)端口的LTSSM过渡到U0;
Warm复位产生的动作:Warm复位要满足tReset的LFPS要求,会让LTSSM过渡到Rx.Detect, 重新训练链路,复位上行端口,转换到U0;
1)下游端口复位错误计数;
2)上游端口复位为默认值;
3)PHY层要重新初始化;
4)端口的LTSSM过渡到U0;
检测到PORT_RESET:
如果下游端口是U3、Loopback、Compliance Mode或SS.Inactive,则应使用Warm Reset;
如果下行端口为U0,则使用Hot Reset;
如果下行端口在U1或U2,则通过LFPS退出握手退出U1或U2,然后切换到Recovery,再切换到Hot Reset;
如果下游端口处于Polling或恢复状态,则需要使用Hot Reset;
如果由于LFPS握手超时导致Hot Reset失败,则下游端口将转换为SS.Inactive,直到软件干预或检测到上游端口移除;
如果由于TS1/TS2握手超时导致Hot Reset失败,下行端口会切换到Rx.Detect,并尝试Warm Reset;
如果下行端口处于“SS.Disabled”状态,禁止带内复位;

检测到“HB_PORT_RESET”:
下游端口应在除SS.Disabled和转换到Rx.Detect之外的所有链路状态下发起Warm Reset。
上游端口应使能除SS.Disabled外的所有链路状态的LFPS接收器和Warm Reset检测器。
上游端口检测到Warm Reset将过渡到Rx.Detect

6.5 链路训练状态机(LTSSM)

LTSSM是一种用于链路连通性和链路电源管理的状态机
下面的状态机条件跳转只是一部分,详细可以看USB官方协议。
在这里插入图片描述

七、协议层(重点)

协议层管理设备和主机之间的端到端数据流, 这是建立在数据链路层的传输正确的基础上。
SS主机不应该开始另一个端点的事务(可以多个OUT事务和一个IN事务),除非满足下面的条件:
(1)收到一个DP,NRDY,STALL TP包,或是发送到非同步端点的ACK TP超时;
(2)收到所有DP包,收到短包,或是具有带有最后一个包标识的DP包,或是发送到同步端点的事务超时;

对于非同步传输,端点可以通过以下方式响应有效事务:
(1)返回NRDY事务包;
(2)OUT事务返回ACK应答;
(3)IN事务返回一个或是多个数据包;
(4)内部端点错误返回STALL;

NRDY表示端点没有准备好发送或是接收数据,ERDY TP表示端点告诉主机现在能去发送或是接收数据。如果不工作的链路可以被置于低功耗模式。同步传输不使用ERDY和NRDY TP包。

7.1 包类型

1、链路管理包
1)Link Management Packets (LMP):链路之间
2)Transaction Packets (TP) :主机到设备之间,无data payload,
3)Data Packets (DP) : DPH+DPP
4)Isochronous Timestamp Packets (ITP): 主机到设备广播

上面的所有包包含14字节的包头+2字节的链路控制字,
(下面的包暂不考虑bit编码,加扰,链路级帧)

all headers格式:12bytes-data + 2bytes-CRC +2bytes-Link Control Word (加起来就是4个Dword)
5bit-类型域
在这里插入图片描述
CRC-16
头报文的前12个字节上计算出的16bit-CRC

2字节-链路控制字
在这里插入图片描述
header seq: 0~7
hub depth: hub层次
DL:传输延时;
DF:由集线器设置。当需要发送数据包的下行端口处于电源管理状态时

7.2 LMP

LMP是指类型域被设置为链路管理包的包。这些包用来管理单个链路,它们没有带有寻址信息和路由信息。可以是由集线器端口命令产生。例如,集线器端口命令用来设置U2非活动超时。除此之外,它们用来交换端口属性信息和测试目的。
在这里插入图片描述
Subtype(type已经介绍过了)
在这里插入图片描述
Set Link Function
设置不离开U0状态下可更改的功能。当端口收到一个断言为Force_LinkPM_Accept的LMP时,端口将接受所有的LGO_U1和LGO_U2链路命令,直到端口收到一个取消断言为Force_LinkPM_Accept的LMP。
下面是展示Set Link Function LMP的格式,Type表示四种包的一种,SubType表示为LMP类型的一种,Set Link Function 见下图。
在这里插入图片描述
在这里插入图片描述
U2 Inactivity Timeout ,Vendor Device Test,Port Capabilities ,Port Configuration,Port Configuration Response也是大同小异,详细见USB3.0官方协议。

7.3 TP

事务包在主机和设备间的直接路径上传输,TP用来控制数据流和管理端到端连接。类型域的值应该被设置为Transaction Packet。路由字符被集线器用来路由选择将一个呈现在其上游端口的包传递到正确的下游端口。TP包中的路由字符被设备设置为0发送给主机(设备发给主机TP包,集线器由下游端口传递到上游端口,不需路由选择)。当主机发送一个TP时,设备地址域(Device Address)包含接收方的地址。当设备发送TP给主机,那么它设置设备地址域为它自己的地址,这个域被主机用来确认TP的来源。TP的子类型域被接收方用来决定TP的格式和使用。
下面是TP的Subtype
在这里插入图片描述
下面是Subtype的ACK的包格式:
IN端点:ACK包是主机发送,用于向设备请求数据和确认之前收到的数据包;
OUT端点:ACK包由设备发送,用于告诉主机数据成功接收,以及可用缓冲区数量;
在这里插入图片描述
下面是ACK各个位域的含义,有助于理解ACK包的作用。
在这里插入图片描述
以下的其他TP格式也是类同,下面给出简单介绍:
Not Ready (NRDY) Transaction Packet :由非同步端点的设备发送,如果OUT端点没有可用的数据包缓冲空间来接受主机发送的DP,则将此TP发送到主机。如果不能返回DP作为对主机发送的ACK TP的响应,则IN端点将此TP发送给主机。
Endpoint Ready (ERDY) Transaction Packet :该TP只能由非同步端点的设备发送。它用于通知主机端点已准备好发送或接收数据包。
STATUS Transaction Packet :这个TP只能由主机发送。它用于通知控制端点主机已启动控制传输的Status阶段。此TP只应发送到控制端点。
STALL Transaction Packet:该TP只能由设备上的端点发送。它用于通知主机端点已停止或控制传输无效。
Device Notification (DEV_NOTIFICATION) Transaction Packet: 该TP只能由设备发送。它被设备用来通知主机,设备或接口状态的异步变化,例如,识别设备内导致设备执行远程唤醒操作的功能。
PING Transaction Packet:这个TP只能由主机发送。在启动同步传输之前,主机使用它将到设备的路径中的所有链接转换回U0。
PING_RESPONSE Transaction Packet :该TP只能由设备响应主机发送的PING TP发送。对于接收到的每个PING TP,应该发送一个PING_RESPONSE TP。

7.4 DP

这种包能被主机或者设备发送。主机使用这种包发送数据给设备。设备使用这种包返回数据给主机作为一个ACK TP应答。所有的数据包由DPH和DPP组成。
下面以ACK应答为例子:DPH+DPP
在这里插入图片描述
End Of Burst (EOB)/Last Packet Flag (LPF), 对于非同步端点,这个字段被称为EOB,对于同步端点,这个字段被称为LPF。

对于非同步IN端点,这个区域被用来确认这是突发的最后一个包。当设备准备继续传输时,应该发送一个ERDY通知主机。注意:一个端点应该在重发DP中重新计算EOB值。如果设备返回的数量比在收到最后的ACK TP包NumP域要求的数量还少,而且不是短包,则 EOB域应该在突发的最后包中被置位(这句话可以理解为主机向设备要数据包,设备发现数据包少于主机的请求数据包,那么认为这个包就是最后一个包)。当设备发送一个短包时,EOB域可以被置位。
对于非同步OUT和控制端点,这个域应该被设为0.
对于同步端点这个域被用来确认这是在当前服务周期中最后一次突发的最后包。LPF能被设备和主机置位。

7.5 ITP

ITPs用于从主机向所有活动设备传递时间戳。ITPs不携带地址或路由信息,由集线器组播到所有处于U0状态的下游端口。设备不应对ITP做出响应。ITPs用于向设备提供主机的定时信息,以便进行同步。
在这里插入图片描述
Isochronous Timestamp (ITS)分为2个子域,
bit[13:0] 总线间隔计数,当前毫秒计数值的1/8。计数值达到0x3FFF时归0,然后继续增加。
bit[26:14]: Delta, 从当前ITP包的开始到上一个总线周期边缘之间的时间;
Bus Interval Adjustment Control 这个域指定了控制总线轮询周期调整机理的设备地址。

7.6 TP的用法与TP/DP响应

只有批量、控制和中断端点可以发送流控制响应。等时端点不能发送流控制响应。
如果一个IN端点返回下面对ACK TP的应答之一(返回数据),则应该被认为这是在一次流控制条件中:(对主机请求数据事务包的应答)
1)NRDY TP应答
2)发送一个DPH中EOB域值为1的DP
如果一个OUT端点返回下面的对DP的应答之一, 则应该被认为在流控制条件中:
1)RDY TP应答
2)发送一个NumP域值为0的ACK TP

Burst Transactions
SS允许主机发送或是接收burst的数据。在没有中间确认包的情况下,设备上的端点一次可以发送或接收的数据包数量由设备在该端点的 endpoint companion descriptor 确定。在其最大突发大小中报告多个数据包的端点被认为能够支持“突发”事务
1)在收到确认之前,可以在突发中发送的最大数据包数量限制为端点的最大突发大小和端点或主机接收的最后一个ACK TP中的NumP字段的值的最小值,减去端点或主机在最后一个ACK TP确认数据包后已经发送的数据包数量。
2)在突发中每个单独的数据包应该有一个最大数据包大小的数据有效载荷。只有突发中最后一个数据包的大小可能小于报告的最大数据包大小。如果最后一个更小,那么同样的短报文规则也适用于burst结束时的短报文。
3)只要ACK TP中的NumP字段不设置为零,并且每个数据包具有最大数据包大小的数据有效负载,突发事务就会继续进行。
4)只要主机或主机希望继续接收数据,发送ACK TP的主机或设备可以随时增加NumP字段。唯一的要求是NumP字段的值不能大于设备支持的最大突发值。
5)如果发送ACK TP的设备或主机减少NumP字段,那么它么减少的值不能比1大。例如,如果前一个ACK TP在NumP字段中的值为5,那么确认下一个接收到的数据包的下一个ACK TP在NumP字段中的值必须不小于4。这条规则的唯一例外是:
a)如果设备可以接收到数据,但不能再接收数据,则发送一个NumP字段置零的ACK TP。
b)主机应发送NumP字段设置为零的ACK TP,以响应设备发送设置为EOB字段的DP或短报文。
上面的这些话有点儿难理解,后面会尽量以图形展示

短包(Short Packets )
超速保持USB2.0支持的短包功能。当设备或主机收到数据长度区域比端点最大包尺寸小的DP,则它应该认为传输完成了。
(1)在IN传输中,设备应该在发送一个短包DP后,停止发送DPs。主机应该用一个NumP域为0的ACK TP对短包应答。当此端点开始另外一次传输,主机应该对设备端点安排事务。
(2)在OUT事务中,主机可以在发送一个短包后停止发送DPs,主机在此端点开始另外一次传输时应该给设备端点安排事务。注意这为端点的一次新突发的开始。

TP和DP响应
下面给出四种设备或是主机的响应

(1)设备对TP请求数据的响应
在这里插入图片描述
TP Received with Deferred Bit Set (设置延迟位接收TP)
Device Tx Endpoint Halt Feature Set (设备Tx端点停止特性设置)
(2)主机对从设备接收数据的响应
在这里插入图片描述
(3)设备对从主机那收到数据应答
在这里插入图片描述
(4)设备对SETUP DP的响应
在这里插入图片描述

7.7 TP序列(重要)

下面Bulk IN Transactions的传输示意图,主机发出IN的ACK TP,向设备告知期望的包的序号和数量。如果主机希望得到多个DP,这是由TP的NumP位域值确定,设备不需要等到ACK TP的应答就可以继续burst发送Data给主机。(但是ACK TP的数量与Data数量是保持一致的)。
如果出现主机收到错误的DP时,会要求重新开始发送 发生错误对应的序号的数据包,retry位要置1,即使后面的包没有出错。如果主机要求的DP包,设备没有那么多数据包去发送,那么设备要把最后一个DP的DPH的EOB置1。当设备有数据的时候,设备要发送ERDY TP给主机。(注意:如果被发送给主机的DP的数据量比端点中定义的最大包尺寸少(短包),则没有必要设备EOB标志。)
在这里插入图片描述
下面是Bulk OUT Transactions,类似的,也具有重传机制。
在这里插入图片描述
下面是控制读/写传输(不支持burst传输):
1)据阶段可选的,数据的方向在Setup的字节的bmRequestType域指示,在主机和设备上任何控制端点之间交换的TP或DP的方向域应该被设置为0。(控制端点为双向的,所以不区分端点方向)。setup包总是使用数据顺序号0。
2)在数据阶段期间要被发送的最大数据量和它的方向在setup阶段被指定了。如果数据量超过了最大包大小,数据以多个最大数据包大小发送。剩下的任何数据在最后数据包中被发送。
3)所有的控制端点值支持突发次数为1,因此,主机一次只能对控制端点发送或接收一个包。
在这里插入图片描述
在这里插入图片描述
下面是中断事务读/写传输(每个服务间隔限制为最多三个DP):
1)当端点收到来于主机的一个ACK TP,并且不能通过发送数据来应答,它会发送一个NRDY( 或当内部端点或设备错误时发送STALL) TP给主机。主机在随后的服务间隔中不会对端点进行更多任何的事务处理。
2)只在收到一个来自于端点的ERDY TP后,主机才会重新对端点进行中断事务处理,用上一次服务间隔中的流控制应答来应答。一旦主机接收到ERDY TP,则它会在不超过两个服务间隔内发送一个IN请求(通过ACK TP)给端点,这个值由中断端点描述符中的bInterval域决定。
在这里插入图片描述
设备发出NRDY TP包
在这里插入图片描述
设备发出ERDY TP恢复传输
在这里插入图片描述
设备发出STALL TP包
在这里插入图片描述
同步传输:
对于输入同步事务处理的,主机为其发送一个紧跟着返回数据的ACK TP。对于输出同步事务处理,当有数据要在当前服务间隔中被发送时,主机会简单的发送数据。同步事务处理不支持重试。
在这里插入图片描述
在这里插入图片描述
在任何服务间隔中第一个数据包总是使用顺序号0。主机在每个服务间隔中最多应该能接收和发送48个DPs。顺序号是从0到31循环的。带有同步端点的超速设备要能够发送或接收在其端点和endpoint companion descriptors中指定的包数量。
如果数据比端点最大包尺寸少,那么它发送时,在服务间隔的最后包中lpf域会置位。如果在一个服务间隔期间没有数据发送给输出同步端点,那么主机在整个间隔周期不会发送任何数据。如果带有同步输入端点的设备在接收到来自主机的同步输入ACK TP时没有数据要发送,则它会发送一个0长度的数据包。
在这里插入图片描述
在这里插入图片描述
(这部分USB3.0内容比较多,可以根据自身情况对各个章节仔细理解。后面会结合USB2.0的代码分析协议,以及重点介绍xHCI协议,以及PIPE/UTMI协议)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值