USB3.2链路训练及状态机解析(重要的)
1.简介
LTSSM(Link Training and Status State Machine)定义了USB3.2总线链路层连接性及链路层电源管理。LTSSM由12种不同的链路状态组成,可以根据它们的功能对其进行表征。
LTSSM有4个可操作的link状态,分别为U0、U1、U2及U3。
- U0是使能Enhanced SuperSpeed链路的状态,此使总线上可以传输数据包,也可以处于空闲状态。
- U1是低功耗的link状态,此时总线上没有数据传输,且Enhanced SuperSpeed总线链路层连接性被关闭。
- U2也是低功耗的link状态,相比U1功耗更低,但增加了状态退出时的延时。
- 功耗最低的是U3状态,此时总线处于suspend状态,退出U3状态的延时也是最大的。
链路层初始化和训练引入了4个状态,分别是Rx.Detect、Polling,、Recovery及Hot Reset。
- Rx.Detect是上电的初始Link状态,用来确定对端是否有link partner(根据阻抗判断,具体参考USB3.2 Spec 6.11),一旦确定对方存在,则链路训练过程随即开始。
- Polling是为两个link partner定义的link状态,目的是使它们的Enhanced SuperSpeed发送器和接收器接受训练、同步并为数据包传输做好准备。
- Recovery定义了两个link partner从低功耗状态退出时重新训练链路的状态,或者某一个link partner探测到link不处于U0状态时,重新训练链路的状态。
- Hot Reset定义下行端口复位上行端口的状态。
为了测试误码情况和发送器兼容性,引入了Loopback和Compliance状态。最后,还定义了eSS.Inactive和eSS.Disabled状态。eSS.Inactive状态表示link出错,此使链路处于一种不可操作状态,需要软件进行干预恢复。
- eSS.Disabled状态表示Enhanced SuperSpeed链路的连接性处于禁止状态,链路可能会进入USB 2.0模式。
LTSSM定义的12中模式如下表所示:
Name | Description |
---|---|
U0 | 接收和发送数据包的正常状态 |
U1 | 无数据包发送的状态,PHY的电源状态处于P1 |
U2 | 无数据包发送的状态,PHY的电源状态处于P2 |
U3 | 无数据包发送的状态,PHY的电源状态处于P3 |
eSS.Disabled | connectivity disabled |
Rx.Detect | Warm reset, Receiver detection |
eSS.Inactive | 链路失败 |
Polling | 链路训练 |
Recovery | 重新训练链路,可直接切换到Hot Reset或Loopback状态 |
Hot Reset | 使用已经训练好的参数进行复位 |
Compliance | 测试发送器是否符合电压和时间规范 |
Loopback | 用于测试和故障分析 |
2.超时时间
LTSSM为了确保状态切换成功,给每种状态都定义了超时时间,超时时间如下表所示。
Name | Initial State | Timeout to Next State | Timeout Values |
---|---|---|---|
teSSInactiveQuietTimeout | eSS.Inactive.Quiet | eSS.Inactive.Disconnect.Detect | 12ms |
tRxDetectQuietTimeoutDFP | Rx.Detect.Quiet | Rx.Detect.Active | 120ms(max) 120ms(max) |
tRxDetectQuietTimeoutUFP | Rx.Detect.Quiet | Rx.Detect.Active | 12ms |
tPollingLFPSTimeout | Polling.LFPS/Polling.LFPSPlus | Compliance/Rx.Detect/eSS.Disabled/eSS.Inactive | 360ms |
tPollingSCDLFPSTimeout(SuperSpeedPlus operation) | Polling.LFPS or Polling.LFPSPlus | Polling.RxEQ | 60us |
tPollingLBPMLFPSTimeout(SuperSpeedPlus operation) | Polling.PortConfig or Polling.PortConfig | Rx.Detect/eSS.Disabled/eSS.Inactive | 12ms |
tPollingActiveTimeout | Polling.Active | Rx.Detect/Polling.PortMatch/eSS.Disabled/eSS.Inactive | 12ms(x1) 24ms(x2) |
tPollingConfigurationTimeout | Polling.Configuration | Rx.Detect/Polling.PortMatch/eSS.Disabled/eSS.Inactive | 12ms(x1) 24ms(x2) |
tPollingIdleTimeout | Polling.Idle | Rx.Detect/Polling.PortMatch/eSS.Disabled/eSS.Inactive | 2ms |
tU0RecoveryTimeout | U0 | Recovery | 1ms |
tU0LTimeout | U0 | U0 | 10us |
tNoLFPSResponseTimeout | U1 | eSS.Inactive | 2ms |
tU0LTimeout | U0 | U0 | 10us |
tNoLFPSResponseTimeout | U1 | eSS.Inactive | 2ms |
PORT_U2_TIMEOUT | U1 | U2 | U2 Inactivity field set in LMP (refer to Section 8.4 for details) |
tU1PingTimeout | U1 | Rx.Detect | 300ms |
tNoLFPSResponseTimeout | U2 | eSS.Inactive | 2ms |
tNoLFPSResponseTimeout | U3 | U3 | 10ms |
tRecoveryActiveTimeout | Recovery.Active | eSS.Inactive, Rx.Detect | 12ms |
tRecoveryConfigurationTimeout | Recovery.Configuration | eSS.Inactive, Rx.Detect | 6ms |
tRecoveryIdleTimeout | Recovery.Idle | eSS.Inactive | 2ms |
tLoopbackExitTimeout | Loopback.Exit | eSS.Inactive | 2ms |
tHotResetActiveTimeout | Hot Reset.Active | eSS.Inactive | 12ms |
tHotResetExitTimeout | Hot Reset.Exit | eSS.Inactive, Rx.Detect | 6ms |
tU3WakeupRetryDelay | U3 | U3 | 100ms |
tU2RxdetDelay | U2 | U2 | 100ms |
tU3RxdetDelay | U3 | U3 | 100ms |
3.状态切换
3.1.Rx.Detect
Rx.Detect主要用于探测对端是否有设备接入。
Rx.Detect是上行port和下行port上电的初始状态。同时也是下行port发出warm reset之后和上行port检测到(上行port除了在eSS.Disabled状态之外,若收到下行port发出的warm reset,则必须切换到Rx.Detect)warm reset之后的状态。Rx.Detect状态的目的是探测对端接收器对地的阻抗。
Rx.Detect有3个子状态,分别为Rx.Detect.Reset、Rx.Detect.Active、Rx.Detect.Quiet。
Rx.Detect.Reset是默认的复位状态,用于同步warm reset之后两个port的操作,当warm reset结束之后,Rx.Detect.Reset状态会很快退出。Rx.Detect.Active用于探测对端接收器。Rx.Detect.Quiet是一种省电状态,在这种状态下,将会关闭探测对端接收器的功能。
Rx.Detect 3个子状态的转换过程如下图所示。
3.2.Polling
Polling状态用于port能力协商和链路训练。在链路训练开始之前,SuperSpeed总线中两个port会先进行Polling.LFPS握手,SuperSpeedPlus总线类似,都是基于SCD1/SCD2握手信号的Polling.LFPS、基于LBPM(SuperSpeedPlus LFPS Based PWM Message)的port能力协商和匹配。SuperSpeedPlus总线的Bit lock和block alignment以及symbol lock、lane polarity inversion、Rx equalization trainings都通过使用TSEQ, SYNC, TS1和TS2训练集合完成。
Polling状态有8个子状态,分别为Polling.LFPS、Polling.LFPSPlus、Polling.PortMatch、Polling.PortConfig、Polling.RxEQ、Polling.Active、Polling.Configuration和Polling.Idle。
-
Polling.LFPS子状态用于建立PHY的直流操作点和同步两个退出Rx.Detect状态的link partners。Polling.LFPSPlus子状态和Polling.LFPS子状态类似,只出现与SuperSpeedPlus总线。
-
Polling.PortMatch是SuperSpeedPlus操作中的两个端口执行LBPM握手的子状态,用于宣布、匹配和决定两个link partners之间最高公共能力的操作。
-
Polling.PortConfig子状态根据Polling.PortMatch状态获取的PHY的能力设置port。
-
Polling.RxEQ子状态用于接收器均衡训练。
-
Polling.Active子状态是接收器训练的延续。
-
Polling.Configuration子状态表示两个link partners完成了Enhanced SuperSpeed训练。
-
Polling.Idle子状态对port接收到的TS2有序集合进行解码,并决定是否转换到下一个状态。
-
8个子状态的转换过程如下图所示。
- LFPS
低频周期性信令(LFPS,Low frequency periodic signaling)用于处于低功率链路状态的链路上两个端口之间的边带通信,同时也可用于链路训练和下行端口发出Warm Reset复位链路。对于多lane的物理层,LFPS信号只在配置lane上传输。
3.3.Recovery
Recovery状态的目的是重新训练链路或执行Hot Reset或切换到Loopback模式。为了重新训练链路和减少Recovery状态的延迟,Recovery状态的link partners不会进行接收器均衡性训练。Recovery状态包含三个子状态,分别是Recovery.Active、Recovery.Configuration和Recovery.Idle。Recovery.Active子状态通过发送TS1有序集合训练链路。Recovery.Configuration子状态通过交换TS2有序集合实现两个link partners之间的握手。Recovery.Idle子状态对port接收到的TS2有序集合进行解码,并决定是否转换到下一个状态
3.4.U0
U0是总线正常工作时的状态,可以发送和接收数据包。U0状态无任何子状态。
3.4.1.U0 Requirements
- port应符合发送器的规范(电气参数),规范定义在表6-18中。
- port应保持表6-22中定义的低阻抗接收器终端特性。
- 必须使能LFPS接收器
低频周期性信令(LFPS,Low frequency periodic signaling)用于处于低功率链路状态的链路上两个端口之间的边带通信,同时也可用于链路训练和下行端口发出Warm Reset复位链路。对于多lane的物理层,LFPS信号只在配置lane上传输。
- port必须使能1ms定时器(tU0RecoveryTimeout)。1ms定时器测量两个连需不断的link命令之间的时间间隔,当接收到link命令后,定时器被复位及重新开始计时。
- port必须使能10us定时器(tU0LTimeout)。10us定时器用于测量U0状态时总线的空闲时间,第一个link命令符号或数据包被发送时,定时器复位,最后一个link命令符号或数据包被发送时定时器开始计时。当链路处于逻辑空闲状态时,该定时器处于激活状态。
- 当10us定时器(tU0LTimeout)到期时,下行port必须发送single LDN(LDN link命令,表示下行port处于U0状态,当10us周期内没有数据包或者link命令传输时,下行端点会发送LUP)。
link命令结构:
link命令位定义:
-
当10us定时器(tU0LTimeout)到期时,上行port必须发送single LUP(LUP为link命令,表示设备处于U0状态,当10us周期内没有数据包或者link命令传输时,上行端点会发送LUP)。
-
port必须在HP响应时间(tDHPResponse)之内,用LGOOD_n(Header Sequence Number)或LBAD(Bad header packet)响应接收到的header packet。tDHPResponse是在端口连接器处测量,计时的时间范围为接收HP的第一位到发送LGOOD_n或LBAD的第一位。
- Gen 1x1:tDHPResponse必须小于2540ns。
- Gen 2x1:tDHPResponse必须小于1610ns。
- Gen 1x2:tDHPResponse必须小于2270ns。
- Gen 2x2:tDHPResponse必须小于1355ns。
-
port应根据tDHPResponse定义的时间,用LAU(当port接收到进入U1、U2、U3状态的请求,同意时发送)或LXU(当port接收到进入U1、U2、U3状态的请求,拒绝时发送)确认接收到的LGO_Ux(LGO_U1、LGO_U2、LGO_U3为请求进入低功耗的link命令,LGO_U1和LGO_U2由请求port发送,LGO_U3由下行port发送,上行port必须接收该命令)。
3.4.2.Exit from U0
- 当成功的执行完LGO_U1 link命令后,port状态从U0切换为U1。
- 当成功的执行完LGO_U2 link命令后,port状态从U0切换为U2。
- 当成功的执行完LGO_U3 link命令后,port状态从U0切换为U3。
- 当下行端口连续3次尝试进入U3失败时,port状态从U0切换为eSS.Inactive。
- 当7.3节描述的将link状态切换到Recovery的错误状态发生时,port状态从U0切换为Recovery。7.3节描述的错误类型如下。
Error Type | Description/Example | Error Recovery Path | Update Link Error Count? | Update Soft Error Count? (SuperSpeedPlus USB) |
---|---|---|---|---|
Missing Header Packet Framing | Only a valid packet framing ordered set will be declared in the receiver side. | Delayed transition to Recovery | Yes | NO |
Header Packet Error | Any header packet CRC is bad. | Header packet retry process | NO | Yes |
x Header Sequence Number Error | The Header Sequence Number in the received header packet does not match the Rx Header Sequence Number. | Recovery | Yes | NO |
Header Sequence Number Advertisement Error | LGOOD_n not received upon PENDING_HP_TIMER timeout. A header packet received before sending LGOOD_n. LCRD_x or LCRD1_x/LCRD2_x or LGO_Ux received before receiving LGOOD_n. |
Recovery | Yes | NO |
Rx Header Buffer Credit Advertisement Error (SuperSpeed USB) | LCRD_x not received upon CREDIT_HP_TIMER timeout. A header packet received before sending LCRD_x. LGO_Ux received before receiving LCRD_x. | Recovery | Yes | NO |
Type 1/Type 2 Rx Buffer Credit Advertisement Error (SuperSpeedPlus USB) | LCRD1_x/LCRD2_x not received upon Type 1/Type 2 CREDIT_HP_TIMER timeout. A packet received before sending LCRD1_x/LCRD2_x. LGO_Ux received before receiving LCRD1_x/LCRD2_x. |
Recovery | Yes | NO |
Training Sequence Error | Timeout from Polling to Rx.Detect or eSS.Disabled without reaching U0. Timeout from Recovery to eSS.Inactive without reaching U0. Timeout from Recovery to Rx.Detect without reaching U0. Timeout from Polling.Active or Polling.Configuration to Polling.PortMatch (SuperSpeedPlus USB only) |
Timeout from Recovery to eSS.Inactive requires software intervention. | NO | NO |
Invalid link command | Valid link command framing but invalid link command word. LGO_Ux received before receiving LCRD_x. | Ignored | NO | Yes |
Missing link command | No valid link command framing is detected. | Delayed transition to Recovery if missing LGOOD_n or LCRD_x or LCRD1_x/LCRD2_x | Yes | NO |
8b/10b Error (Gen 1) | Detected in the PHY layer. | N.A. | NO | N.A. |
Gen 2x1 Block Header Single-bit Error | Detected and corrected in PHY layer. | Correctable | NO | Yes |
Gen 2x1 Block Header Two-bit Error | Detectable | Recovery | Yes | NO |
Single Bit SKP/SKPEND Error (Gen 2) | Detectable | Correctable | NO | Yes |
Gen 2x2 Block Header Two-bit Error | Correctable with BH0/BH1 association (optional) | Correctable | NO | Yes |
Gen 2x2 Block Header Multi-bit Error | Detectable with BH0/BH1 association (optional) | Recovery | Yes | NO |
- 在任何协商lane上,检测到TS1 ordered set,port状态从U0切换为Recovery。
链路训练时,Training sequences(TS)用于链路的配置和初始化、Bit-lock and symbol lock、Bit-lock and symbol lock和Lane极性反转。 - port可以直接从U0状态设置到Recovery状态。
- 当PENDING_HP_TIMER定时器连需4次超时,port从U0状态切换为eSS.Inactive状态。
PENDING_HP_TIMER定时器从header packet发送开始计时,到link partner响应header packet为止。PENDING_HP_TIMER定时器的目的是允许port检测其链路伙伴发送的header packet是否丢失或损坏。前三次PENDING_HP_TIMER定时器超时,port状态连续切换到Recovery状态,当第四次PENDING_HP_TIMER定时器超时,port从Recovery状态切换到eSS.Inactive状态。
- 当被指示时下行port可以切换到eSS.Inactive状态。
- 当被指示时(when directed,这里不知道怎么翻译合适,是由上行port指示还是port的控制器设置,或者说是port自己进入,待考证)下行port切换到eSS.Disabled状态。
- 当被指示时下行port可以切换到eSS.Inactive状态。
当被指示时上行port可以切换到eSS.Disabled状态。
一对link port进入U0和成功完成链路训练、初始化之后,需要在tPortConfiguration定义的时间内,通过Link Management Packet交换port特性信息,port特性信息定义在8.4.5节。上述过程包含下面几个场景:
-
从Polling状态直接进入U0状态。
-
通过Hot Reset间接从Polling状态进去U0状态。
-
从Recovery进入U0,并且从Polling退出后没有成功完成port配置。在这种情况下,link port必须继续执行port配置流程。
-
如果port在tPortConfiguration定义的时间内,没收到port特性LMP数据包,下行port可以直接进入eSS.Inactive状态,上行port可以直接进入eSS.Disabled。
-
下行port如果在1ms(tU0RecoveryTimeout)之内没有收到任何link命令,则可进入Recovery状态。
-
上行port如果在1ms(tU0RecoveryTimeout)之内没有收到任何link命令或数据包(定义在7.2.4.1.4节),则可进入Recovery状态。
-
当下行port主动发出Warm Reset后可以切换到Rx.Detect状态。
-
当上行port检测到下行port发出的Warm Reset后,可以切换到Rx.Detect状态。
-
当上行port检测到VBUS off,可以切换到eSS.Disabled状态(这种情况只会出现在自供电的上行port中。对于自供电的上行port,eSS.Disabled状态是一种逻辑掉电状态)。
3.5.U1
U1是一种低功耗状态,此时总线上没有数据包传送且上行port和下行port都进入了该状态,同时PHY也处于低功耗状态。
3.5.1.U1 Requirements
- 在每条协商lane上,发送器的直流共模电压(DC common mode voltage)必须符合表6-19定义的规范(VTX-CM-DC-ACTIVE-IDLE-DELTA)。
- port应保持表6-22中定义的低阻抗接收器终端特性,对于x2 lane,则需要在每条协商lane上保持低阻抗接收器终端特性。
- port必须使能U1状态退出检测功能,对于x2 lane,必须在配置lane上使能U1状态退出检测功能。
LFPS握手信号用于退出U1、U2状态和唤醒U3状态。LFPS低频周期性信号(LFPS,Low frequency periodic signaling)用于处于低功率链路状态的链路上两个端口之间的边带通信,同时也可用于链路训练和下行端口发出Warm Reset复位链路。对于多lane的物理层,LFPS信号只在配置lane上传输。
- 当port发起从U1退出时,应使能其LFPS发送器。对于x2 lane,必须在配置lane上使能LFPS发送器。
- 如果U2的inactivity timer超时值不为零,则port在进入U1状态时应使能其U2 inactivity timer。
- 下行port应该使能Ping.LFPS探测。对于x2 lane,必须在配置lane上使能Ping.LFPS探测。
- 下行port必须使能300ms定时器(tU1PingTimeout),当收到Ping.LFPS时300ms定时器复位并重新开始计时。
- 上行端口必须按照表6-30的定义发送Ping.LFPS。对于x2 lane,必须在配置lane上发送Ping.LFPS。
3.5.2.Exit from U1
- 当被指示时,下行port应该切换到eSS.Disabled状态。
- 当300ms定时器(tU1PingTimeout)超时后,port应该切换到U1状态。
- 当下行port发出warm reset后,应该切换到Rx.Detect状态。
- 自供电的上行port未检测到有效的VBUS(11.4.5节定义的有效Vbus),应该切换到eSS.Disabled状态
11.4.5节定义的VBUS电气特性如下:
-
U2状态的inactivity timer定时器超时后,port应该切换到U2状态。
-
在符合第6.9.2节中U1 LFPS退出握手信令的LFPS握手成功完成后,port应该切换到Recovery状态。
-
当2ms LFPS握手定时器(tNoLFPSResponseTimeout)超时且符合第6.9.2节中U1 LFPS退出握手信令的LFPS握手未完成,port应该却换到eSS.Inactive。
下图总结了port从U1状态切换到其他状态的路径。
3.6.Hot Reset
只有下行port可以发起Hot Reset。下行port通过在每个协商lane上传输TS2有序集合发起Hot Reset。上行port收到Hot Reset信息后,必须在每个协商lane上使用TS2有序集合响应Hot Reset。一旦完成Hot Reset,上行port通过发送TS2有序集合通知下行port,同时下行port也要响应上行port的完成Hot Reset的信号。两个port完成Hot Reset且进行了空闲符号握手,则他们会进入U0状态。
4.示例
下面是USB主机(外接U盘)上电时通过USB分析仪抓取的USB状态机的变化过程,包含了Rx.Detect、Polling.LFPS、Polling.RxEQ、Polling.Active、Polling.Config、U0、Recovery和Hot Reset状态。
4.1. Rx.Detect
如下图所示,Host上电后port处于Rx.Detect状态,同时出现了一次Warm Reset。
4.2. Polling.LFPS
如下图所示,port进入了Polling.LFPS状态,发出很多LFPS数据包,以同步两个link partners退出Rx.Detect状态、同步PHY的直流操作点等。此阶段主要使用LFPS低频信号进行通信,在配置lane上进行。
4.3. Polling.RxEQ
如下图所示,port进入了Polling.RxEQ状态,该状态的作用是进行接收器的均衡化训练,训练的命令集合为TSEQ,在所有lane上进行。
4.4. Polling.Active
Polling.Active状态是接收器训练的延续,训练的命令集合为TS1。
4.5. Polling.Config
当两个link partners完成上述的链路训练后,会进入Polling.Config状态,然后使用TS2命令集合设置链路配置域。
4.6. U0
在完成链路的训练和配置后,port会进入U0状态,这也是正常通信的状态。此时总线上会传输Link Command、Link Managment、IPS、TP、DP、ITP等。
4.7. Recovery和Hot Reset
当两个link partners之间出现错误时,会进入Recovery状态重新进行链路训练,或者执行一次Hot Reset。为了减少Recovery延迟,重新进行的链路训练不包含接收器的均衡化训练,而是使用上一次的均衡化训练的配置值。