Fork me on GitHub

【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?

  1. USB2.0通过D+或者D-的上拉电阻完成握手,bus reset期间,HS设备可以通过chirp protocol完成从FS到HS的速度切换;
  2. USB2.0速率低不需要均衡;
  3. USB2.0链路中不需要建立一个连续的symbol lock(因为usb20使用的NRZI码,不是8b10b这种以10bit为1个symbol的线路码型);
  4. 在每个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的。

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状态有一些要求,包括:

  1. Receiver必须保证用于Rx检测的终端电阻R_{RX-DC}(在协议中规定是18-30欧)能被正确检测到
  2. Transmitter必须保持DC共模电压,V_{TX-CM-DC-ACTIVE-DELTA}(最大200mV)
  3. LFPS检测功能要打开,保证能够检测到U1 exit的握手信号
  4. Upstream port要保证能检测到Warm Reset LFPS信号
  5. 如果U2 Inactivity Timer被设置为大于0的值,那么这个计数器在U1状态下将开始倒计时,如果超时将进入U2状态
  6. 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状态需要更长的时间。

该状态下有如下条件需要满足:

  1. Transmitter必须保持DC共模电压,V_{TX-CM-DC-ACTIVE-DELTA}(最大200mV)
  2. Receiver必须保证用于Rx检测的终端电阻R_{RX-DC}(在协议中规定是18-30欧)能被正确检测到
  3. LFPS检测功能要打开,保证能够检测到U2 exit的握手信号
  4. Upstream port要保证能检测到Warm Reset LFPS信号
  5. Downstream port的端口必须识别链路对端是处于 U1 或 U2 状态,因为 U1到U2的跳转是静默的。 如果链路另一方在U1状态,则Downstream port每200ms发送一次Ping.LFPS; Downstream port要能区分 Ping.LFPS 和 U1 LFPS Exit 信令
  6. Downstream port每 100 ms执行一次far-end 接收器阻抗检测Z_{RX-HIGH_IMP_DC_POS}

U2的状态转移图如下所示,可以跳转的状态共有四个。

Downstream port的U2状态转移表

current state next state condition
U2 Rx.Detect 检测到高阻抗Z_{RX-HIGH_IMP_DC_POS}(协议规定大于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状态需要最长的时间。

该状态下有如下条件需要满足:

  1. Transmitter不再需要保持DC共模电压V_{TX-CM-DC-ACTIVE-DELTA}
  2. Receiver仍需要保证用于Rx检测的终端电阻R_{RX-DC}(在协议中规定是18~30欧)能被正确检测到(检测不到的话链路就断开了,无法唤醒了)
  3. LFPS检测功能要打开,保证能够检测到U3 exit的握手信号
  4. Upstream port要保证能检测到Warm Reset LFPS信号
  5. Upstream port不再发送Ping.LFPS,Downstream port也不再检测Ping.LFPS
  6. Downstream port每 100 ms执行一次far-end 接收器阻抗检测Z_{RX-HIGH_IMP_DC_POS}

Downstream port的U3状态转移表

current state next state condition
U3 Rx.Detect 检测到高阻抗Z_{RX-HIGH_IMP_DC_POS}(协议规定大于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。
  • 在这三个低功耗状态下,检测电路都会不断检测电阻R_{RX_DC}的值,以确保物理上还正常连接。
  • 在任意一条链路中,Host或者Device都有可能作为低功耗状态的发起者,然后通过握手信号和对方沟通使该条链路进入低功耗状态。同理,任何一方也都可以作为退出低功耗状态的发起者,通过握手退出低功耗状态。

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都会开始检测端接电阻的阻值,其采用的方法是从共模电压V_{TX-DC-CM}开始(协议里规定是0~2.2V,一般就0V吧),提升电压(协议里规定的V_{TX-RCV-DETECT},最大0.6V,也就是最多升压0.6V)。通过电容充电时间检测如下图电路的RC时间常数,从而间接测量出下图中R_{term}的大小。

其中右图是设备正常连接后的等效电路,左图是设备未连接的等效电路,C_{AC}是AC coup电容,C_{parastic}是寄生电容,RC常数和电容充电时间成正比,其计算公式分别是:

(R_{Detect}+R_{term})\cdot C_{AC}(1)

R_{Detect}\cdot C_{parastic}(2)

​ 其中(1)式由于C_{parastic}太小,忽略不计了,接入设备后RC时间常数更大,电容充电时间更长。计算出R_{term}的值并判断是否满足协议中规定的R_{TX-DC}(18~30欧姆)的要求,并将该检测结果作为设备是否正常连接的依据。

下图是更为形象的RX检测的示意图:

Downstream port 的Rx.Detect.Active的状态跳转表

current state next state condition
Rx.Detect.Active Polling 检测结果表示R_{RX-DC}存在
Rx.Detect.Active SS.Disable 软件强制设置
Rx.Detect.Active Rx.Detect.Quiet 没有检测到R_{RX-DC}

Upstream port 的Rx.Detect.Active的状态跳转表

current state next state condition
Rx.Detect.Active Polling 检测结果表示R_{RX-DC}存在
Rx.Detect.Active Rx.Detect.Quiet 没有检测到R_{RX-DC},且检测失败次数小于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的区别,可以看这篇文章:

【USB3.0协议学习】Topic3·三种Reset Events分析-CSDN博客

posted @ 2024-09-16 09:54  yooooooo  阅读(3)  评论(0编辑  收藏  举报