【USB3.0协议学习】Topic2·USB3.0的LTSSM分析
一、什么是LTSSM,处于USB层次中的哪个位置?
LTSSM是链路训练状态机的简称,位于USB3.0协议的link layer,共有12种状态,在链路的两端,也就是Downstream port和Upstream port中各有一个LTSSM,二者通过握手信号一起配合控制着这条链路的状态。(由链路一端发起handshake信号,另一端发回response,完成握手从而保证双方的状态同步)
注:USB3.0协议中广泛使用Downstream port和Upstream port这一对名词,或者Downstream facing port和Upstream facing port,或者DFP和UFP,这三种描述方式是同一个意思。Downstream port可以简单理解为Host端,Upstream port可以简单理解为Device端。Hub是一个特殊的device,它既有Upsteram port和Downstream port,hub中朝host方向的连接端口为Upstream port,朝向其他device连接的端口为Downstream port。
导致LTSSM的State跳转的原因可能有:
-
设备插入和移出
-
Warm reset或者Hot reset
-
收到链路训练序列
-
链路power management 状态转换
-
U0状态下的错误无法恢复
-
链路层定义的任何超时条件被触发
-
...
二、为什么USB2.0不需要LTSSM,而USB3.0需要LTSSM?
- USB2.0通过D+或者D-的上拉电阻完成握手,bus reset期间,HS设备可以通过chirp protocol完成从FS到HS的速度切换;
- USB2.0速率低不需要均衡;
- USB2.0链路中不需要建立一个连续的symbol lock(因为usb20使用的NRZI码,不是8b10b这种以10bit为1个symbol的线路码型);
- 在每个packet传输结束后,USB2.0 bus的会回到电气初始化状态;
结论:USB2.0因为速度慢,协议简单,电气特性不复杂,不需要链路训练,因此不需要LTSSM。而USB3.0由于传输速度比USB2.0快很多,传输过程中为了保证时钟和数据恢复准确,需要在接收端进行均衡,以保证眼图宽度和信号质量满足要求,因此需要链路训练状态机。链路训练状态机还有一个好处,就是有recovry和retraining状态,链路训练时的参数可以得以保留,在遇到无法纠正的链路错误的时候,可以快速的retraining以恢复到正常状态。
三、LTSSM的handshake的三种方式
1.LFPS(Low frequency periodic signal,低频率周期信号)
LFPS应用于以上5种情况,从图中也可以看出,LFPS其实本质就是低频率的方波,通过定义其单次长度和重复长度来表征不同的含义
2.Ordered Sets Partten
Ordered Sets partten是被预先定义的K码和D码的组合,包括TSEQ,TS1,TS2,如下图所示。链路双方通过发送这些序列去完成均衡训练,时钟和串行数据恢复,弹性buffer管理等,直到LTSSM进入U0状态。从下图中可以看出,TS1和TS2中是有比特可以设置是否Loopback,是否Disable掉Scrambling的。
3.Link Commands
Link Command的结构如下图所示,主要用于power management transition,就是从U0跳到U1,U2,U3这些状态。为什么使用Link Command作为握手信号?主要原因是它比TS1短,只要8Bytes(LCSTART+LCW+LCW),而TS1需要16Bytes,
Note:
(1)LGO_Ux link commands 用于从U0跳转到U1,U2,U3
(2)从U1-U3状态跳转出去需要 LFPS handshake ,并且要经过Recovery 状态才能回到U0
注意:每个状态跳转都约定了其中以上三种中的一种握手方式。
四、LTSSM状态分类和功能
先上一个USB3.0协议里面的状态机转移图:
注意:这个状态跳转图里没有包含所有的跳转条件!并且Downstream port和Upstream port的跳转条件可能有所不同,请看下面的详细分析:
1.Operational States
1.1 U0 State
U0状态是USB3.0中最正常的功能状态,在这个状态中链路双方将正常通信。进入U0状态后,USB3.0的链路双方不能长时间不通信,必须保持交流。在链路处于 U0 状态且没有其他数据包的情况下,设备需要定期(每 10uS)发送链路命令,通知链路伙伴设备自己仍然存在并且仍处于 U0 状态。 Downstream port向下发送LDN命令,Upstream port向上发送LUP命令,注意LDN和LUP都是Link command。
因此,在U0状态下有两个计时器将开始计时:1 ms的tU0RecoveryTimeout和10 us的tU0LTimeout。前者超时代表链路一方太久没有收到packet或者link command,这将使得LTSSM从U0进入到Recovery状态。后者则是对链路空闲状态的一个倒计时,从发送了Link command的最后一个符号且链路进入逻辑空闲状态时开始倒计时,直到发送下一条Link command的第一个符号的同时清除计时。一旦超时,就必须得发送一条LDN或者LUP。
上图给出U0跳出的7种状态,其状态转移规则如下:
Downstream port的U0状态跳转分析表
current state | next state | condition |
---|---|---|
U0 | U1 | LGO_U1 握手成功完成 |
U0 | U2 | LGO_U2 握手成功完成 |
U0 | U3 | LGO_U3 握手成功完成 |
U0 | Rx.Detect | 软件命令要求Warm Reset,由DFP发起Warm Reset LFPS |
U0 | SS.Disable | 软件命令要求进入SS.Disable |
U0 | SS.Inactive | PENDING_HP_TIMER 连续第四次超时 |
U0 | Recovery | 检测到 TS1握手信号|| 满足协议中规定的header link control和error handle的错误条件(包括 PENDING_HP_TIMER、CREDIT_HP_TIMER 超时、Replaycount 翻转等) |
Upstream port的U0状态跳转分析表
current state | next state | condition |
---|---|---|
U0 | U1 | LGO_U1 握手成功完成 |
U0 | U2 | LGO_U2 握手成功完成 |
U0 | U3 | LGO_U3 握手成功完成 |
U0 | Rx.Detect | 接收到Warm Reset LFPS |
U0 | SS.Disable | 当进入 U0 后未在允许的时间内收到Port Capability LMP|| 自供电的device(不需要对方自己供电的设备)检测到vbus关闭 |
U0 | SS.Inactive | PENDING_HP_TIMER 连续第四次超时 |
U0 | Recovery | 检测到 TS1握手信号 || 满足协议中规定的header link control和error handle的错误条件(包括 PENDING_HP_TIMER、CREDIT_HP_TIMER 超时、Replaycount 翻转等) || tU0Recovery 计时器到期,表明1ms内未收到任何数据包或链路命令(包括LDN) |
1.2 U1 State
U1状态是USB3.0中规定的低功耗状态,在这个状态中链路双方将不能正常通信,但是需要的时候可以快速恢复到U0,软件可以定义U0的Exit time。(功耗由高到低:U1>U2>U3,返回U0的时间由短到长:U1>U2>U3)
协议中对U1状态有一些要求,包括:
- Receiver必须保证用于Rx检测的终端电阻(在协议中规定是18-30欧)能被正确检测到
- Transmitter必须保持DC共模电压,(最大200mV)
- LFPS检测功能要打开,保证能够检测到U1 exit的握手信号
- Upstream port要保证能检测到Warm Reset LFPS信号
- 如果U2 Inactivity Timer被设置为大于0的值,那么这个计数器在U1状态下将开始倒计时,如果超时将进入U2状态
- Upstream port每隔160-240ms就会发送Ping.LFPS信号;Downstream pot要检测Ping.LFPS信号,并打开300mS的tU1PingTimeout计时器,保证Ping.LFPS没有超时
上图是U1的状态跳转图,注意U1没有子状态,U1可以跳转到5个状态:SS.Disable,Rx.Detect,U2,Recovery,SS.Inactive。下面分析一下每个状态转移可能的条件:
Downstream port的U1状态跳转分析表
current state | next state | condition |
---|---|---|
U1 | U2 | U2 Inactivity Timer超时 |
U1 | Rx.Detect | Ping.LFPS没有收到且300mS的tU1PingTimeout计时器超时 || 软件或者硬件发出命令使链路Warm Reset |
U1 | SS.Disable | 软件命令要求进入到SS.Disable |
U1 | Recovery | U1 Exit LFPS握手成功 |
U1 | SS.Inactive | U1 Exit LFPS握手失败,且2 ms tNoLFPSResponseTimeout 计时器超时 |
Upstream port的U1状态跳转分析表
current state | next state | condition |
---|---|---|
U1 | U2 | U2 Inactivity Timer超时 |
U1 | Rx.Detect | 检测到Warm Reset |
U1 | SS.Disable | 自供电的device(不需要对方自己供电的设备)检测到vbus关闭 |
U1 | Recovery | U1 Exit LFPS握手成功 |
U1 | SS.Inactive | U1 Exit LFPS握手失败,且2 ms tNoLFPSResponseTimeout 计时器超时 |
1.3 U2 State
U2状态也是一个低功耗状态,从该状态回到U0状态需要更长的时间。
该状态下有如下条件需要满足:
- Transmitter必须保持DC共模电压,(最大200mV)
- Receiver必须保证用于Rx检测的终端电阻(在协议中规定是18-30欧)能被正确检测到
- LFPS检测功能要打开,保证能够检测到U2 exit的握手信号
- Upstream port要保证能检测到Warm Reset LFPS信号
- Downstream port的端口必须识别链路对端是处于 U1 或 U2 状态,因为 U1到U2的跳转是静默的。 如果链路另一方在U1状态,则Downstream port每200ms发送一次Ping.LFPS; Downstream port要能区分 Ping.LFPS 和 U1 LFPS Exit 信令
- Downstream port每 100 ms执行一次far-end 接收器阻抗检测
U2的状态转移图如下所示,可以跳转的状态共有四个。
Downstream port的U2状态转移表
current state | next state | condition |
---|---|---|
U2 | Rx.Detect | 检测到高阻抗(协议规定大于25k欧)|| 软件或者硬件给命令使链路Warm Reset |
U2 | SS.Disable | 软件或者硬件给命令 |
U2 | Recovery | U2 Exit LFPS握手成功 |
U2 | SS.Inactive | U2 Exit LFPS握手失败,且2 ms tNoLFPSResponseTimeout 计时器超时 |
Upstream port的U2状态转移表
current state | next state | condition |
---|---|---|
U2 | Rx.Detect | 检测到Warm Reset |
U2 | SS.Disable | 自供电的device(不需要对方自己供电的设备)检测到vbus关闭 |
U2 | Recovery | U2 Exit LFPS握手成功 |
U2 | SS.Inactive | U2 Exit LFPS握手失败,且2 ms tNoLFPSResponseTimeout 计时器超时 |
1.4 U3 State(Suspend State)
U3状态是LTSSM中规定的链路休眠状态,从该状态回到U0状态需要最长的时间。
该状态下有如下条件需要满足:
- Transmitter不再需要保持DC共模电压
- Receiver仍需要保证用于Rx检测的终端电阻(在协议中规定是18~30欧)能被正确检测到(检测不到的话链路就断开了,无法唤醒了)
- LFPS检测功能要打开,保证能够检测到U3 exit的握手信号
- Upstream port要保证能检测到Warm Reset LFPS信号
- Upstream port不再发送Ping.LFPS,Downstream port也不再检测Ping.LFPS
- Downstream port每 100 ms执行一次far-end 接收器阻抗检测
Downstream port的U3状态转移表
current state | next state | condition |
---|---|---|
U3 | Rx.Detect | 检测到高阻抗(协议规定大于25k欧)|| 软件或者硬件给命令使链路Warm Reset |
U3 | SS.Disable | 软件要求进入SS.Disable |
U3 | Recovery | U3 Exit LFPS握手成功 |
Upstream port的U3状态转移表
current state | next state | condition |
---|---|---|
U3 | Rx.Detect | 检测到Warm Reset |
U3 | SS.Disable | 自供电的device(不需要对方自己供电的设备)检测到vbus关闭 |
U3 | Recovery | U3 Exit LFPS握手成功 |
小结:
- U0是全功能状态,U1、U2、U3都是低功耗状态,U1和U2状态下Device要发送Ping.LFPS信号,Host要检测Ping.LFPS信号,以此来保证双方还能通信,U3则不用发Ping.LFPS。
- 在这三个低功耗状态下,检测电路都会不断检测电阻的值,以确保物理上还正常连接。
- 在任意一条链路中,Host或者Device都有可能作为低功耗状态的发起者,然后通过握手信号和对方沟通使该条链路进入低功耗状态。同理,任何一方也都可以作为退出低功耗状态的发起者,通过握手退出低功耗状态。
2.Link Initialization &Training States
2.1 Rx.Detect
上电并PowerOn Reset后,LTSSM进入到的第一个状态就是Rx.Detect状态。这个状态是链路初始化的起点,在这个状态中,链路双方将完成终端电阻的检测。该状态有三个子状态,如下图所示,分别是Rx.Detect.Reset,Rx.Detect.Active,Rx.Detect.Quiet。LTSSM状态机在链路的任意状态下都可以跳转到Rx.Detect状态,原因也很好理解:Device设备随时可能会被用户移除,移除后再接入则需要重新检测链路接入是否正常。
2.2.1 Rx.Detect.Reset
Downstream port 的Rx.Detect.Reset的状态跳转表
current state | next state | condition |
---|---|---|
Rx.Detect.Reset | Rx.Detect.Active | 1.如果Rx.Detect.Reset进入的原因是PowerOn Reset,那么当内部完成复位后自动进入到Rx.Detect.Active状态(无需握手) 2.如果Rx.Detect.Reset进入的原因是Warm Reset,那么downstream port发送Warm Reset LFPS结束后,会进入到Rx.Detect.Active(无需握手) |
Rx.Detect.Reset | SS.Disable | 软件强制设置 |
Upstream port 的Rx.Detect.Reset的状态跳转表
2.2.2 Rx.Detect.Active
在这个状态下,链路双方的transmitter都要去检测receiver的端接电阻值。
这里插入一节,解释一下USB3.0及其之后的协议的终端电阻检测原理:
协议中给出的原理如下:当device连接到host后,device和host都会开始检测端接电阻的阻值,其采用的方法是从共模电压开始(协议里规定是0~2.2V,一般就0V吧),提升电压(协议里规定的,最大0.6V,也就是最多升压0.6V)。通过电容充电时间检测如下图电路的RC时间常数,从而间接测量出下图中的大小。
其中右图是设备正常连接后的等效电路,左图是设备未连接的等效电路,是AC coup电容,是寄生电容,RC常数和电容充电时间成正比,其计算公式分别是:
(1)
(2)
其中(1)式由于太小,忽略不计了,接入设备后RC时间常数更大,电容充电时间更长。计算出的值并判断是否满足协议中规定的(18~30欧姆)的要求,并将该检测结果作为设备是否正常连接的依据。
下图是更为形象的RX检测的示意图:
Downstream port 的Rx.Detect.Active的状态跳转表
current state | next state | condition |
---|---|---|
Rx.Detect.Active | Polling | 检测结果表示存在 |
Rx.Detect.Active | SS.Disable | 软件强制设置 |
Rx.Detect.Active | Rx.Detect.Quiet | 没有检测到 |
Upstream port 的Rx.Detect.Active的状态跳转表
current state | next state | condition |
---|---|---|
Rx.Detect.Active | Polling | 检测结果表示存在 |
Rx.Detect.Active | Rx.Detect.Quiet | 没有检测到,且检测失败次数小于8次 |
Rx.Detect.Active | SS.Disable | 检测失败次数等于8次(大约80ms后,device将回退到USB2.0协议) |
Rx.Detect.Quite这个状态的规定是为了节省USB检测电路的功耗,当进入Rx.Detect.Quite时,12ms的Timer开始计时,硬件检测电路关闭,Timer超时后进入Rx.Detect.Active再次开启检测。
Downstream port的Rx.Detect.Quite状态跳转表
current state | next state | condition |
---|---|---|
Rx.Detect.Quite | Rx.Detect.Active | 12ms的Timer超时 |
Rx.Detect.Quite | SS.Disable | 软件强制设置 |
Upstream port的Rx.Detect.Quite状态转移表
current state | next state | condition |
---|---|---|
Rx.Detect.Quite | Rx.Detect.Active | 12ms的Timer超时 |
2.2 Polling
Polling是USB进行链路训练的状态,训练成功则进入U0状态。在该状态中链路两端将会使用LFPS和Orderd Sets中的Test partten进行握手和训练,主要目的其实是为了PHY能够合理的调整均衡器参数,如Rx的CTLE\DFE,以及CDR电路需要通过训练完成Symbol Lock。
2.2.1 Polling.LFPS
在该状态下,链路两端都必须打开LFPS检测功能,并且互相发送LFPS方波。
current state | next state | condition |
---|---|---|
Polling.LFPS | Polling.RxEQ | 至少发送了16次LFPS且连续接收到2次LFPS |
Polling.LFPS | Polling.Compliance | 360ms的Timer计时器超时(协议里的tPollingLFPSTimeout)且满足条件:从上电复位后该Port就未完成Polling.LFPS 从上电复位后该Port就未完成Polling.LFPS |
Polling.LFPS | SS.Disable | 软件介入,强制命令 |
Polling.LFPS | Rx.Detect | 1.软件命令硬件发起Warm Reset或 2.360ms的Timer超时,并且PowerOn Reset后完成过成功训练 |
Upstream port的Polling.LFPS状态转移表
current state | next state | condition |
---|---|---|
Polling.LFPS | Polling.RxEQ | 至少发送了16次LFPS且连续接收到2次LFPS |
Polling.LFPS | Polling.Compliance | 360ms的Timer计时器超时(协议里的tPollingLFPSTimeout)且满足条件: |
Polling.LFPS | Rx.Detect | 检测到Warm Reset |
正如文章开头所述,LFPS的长度在协议中有所规定,一次长度600ns-1.4us,两次之间间隔在6-14us,总计16次,如下图所示:
2.2.2 Polling.RxEQ
进入该状态,链路两端会互相发送TSEQ Ordered Sets,目的是为了训练Rx均衡电路和CDR电路,使其完成时钟恢复和Symbol Lock
Downstream port和Upstream port 在Polling.RxEQ的状态转移表
current state | next state | condition |
---|---|---|
Polling.RxEQ | Polling.Active | 65536次TSEQ pattern发送完毕 |
Polling.RxEQ | Rx.Detect | 软件要求发起Warm Reset,或者检测到Warm Reset |
其中,TSEQ是由32个Symbol组成的pattern,并重复65536 次,如下图所示:
2.2.3 Polling.Active
该状态下链路两端发送TS1序列,目的是为了确保symbol lock(防止在RxEQ状态下没有锁住),以及完成握手以离开训练。
Upstream port和Downstream port的Polling.Active状态转移表
current state | next state | condition |
---|---|---|
Polling.Active | Polling.Configuration | Training完成且接收到8个连续的TS1或者TS2 |
Polling.Active | Rx.Detect | 软件要求发起Warm Reset,或者检测到Warm Reset |
2.2.4 Polling.Configuration
该状态下链路两端发送TS2序列,目的是为了使用TS2序列中的Reset,Loopback,Scrambling Disable bit,使链路进入不同的状态
Upstream port和Downstream port的Polling.Configuration状态转移表
current state | next state | condition |
---|---|---|
Polling.Configuration | Polling.Idle | 接收到8个相同的TS2,且发送了16个TS2 |
Polling.Configuration | Rx.Detect | 软件要求发起Warm Reset,或者检测到Warm Reset |
2.2.5 Polling.Idle
进入该状态后,链路两端开始互相发送Idle symbols。且当8个Idle 接收到,且16个Idle发送出去,则进入到U0状态。
current state | next state | condition |
---|---|---|
Polling.Idle | U0 | 当8个Idle 接收到,且16个Idle |
Polling.Idle | Loopback | 1.Downstream port软件要求进入到Loopback,并且device要作为Loopback的Master(换句话说,要专用的测试Device才行) 2.Upstream port接收到的TS2中设置了Loopback bit |
Polling.Idle | Rx.Detect | 软件要求发起Warm Reset,或者Upstream port检测到Warm Reset |
Polling.Idle | Hot Reset | 软件要求进入Hot Reset |
Polling.Idle | SS.Disable | 软件强制Disable |
2.3 Recovery
Recovery状态的目的是为了提供低延迟的retraining,使得链路能从其他状态快速恢复到U0状态,前提是该链路之前已经完成过完整的Link Training。硬件中会存储之前Training的结果(主要是均衡电路的参数),在Retraining时会直接使用之前Training的参数不会再训练均衡器。那么问题来了,都是Retrain的是什么东西呢?主要是re-synchronize,CDR的时钟重新恢复和symbol锁定。
这里就不再一一分析Recovery状态下的跳转条件了,直接看下图,红色部分是一个通常情况下的跳转过程,整个过程其实就是链路双方发送TS1、TS2和Idle完成握手。
2.4 Hot Reset
Hot Reset的状态跳转过程可以看下图:
3.Testing States
3.1 Compliance State
Compliance State是为了测试信号一致性而规定的状态,进入该状态后可以发送CP0~CP8等测试pattern,对协议中的一些电压或者timing参数进行测试。测试pattern的定义如下:
3.2 Loopback
Loopback状态是为了测试链路的可靠性,统计误码率等,需要一个特殊的测试设备作为Loopback Master。
注:关于PowerOn Reset,Warm Reset和Hot Reset的区别,可以看这篇文章: