前言:本篇博客为手把手教学的 USB 3.0 链路训练状态机 LTSSMUSB 3.0 又称 SuperSpeed USB 属于 USB2.0 协议的升级版本.USB 3.0 协议相比于 USB 2.0 难度升级了很多,而 USB 3.0 最为核心的点就是链路训练状态机 LTSSM,LTSSM 的存在保证了 USB 3.0 数据传输的整个稳定性和可追溯性。USB3.0 链路链接状态机属于超级有难度的状态机,本篇博客只是略微浅显地介绍了 USB 3.0 链路训练状态机的使用和规则,希望这篇博文能给读者朋友的工程项目给予些许帮助,Respect!

Beagle usb 5000V2 抓包:

一、链路训练状态机 LTSSM 概述

1.1 USB3.0 链路训练状态机

USB 3.0(也称为SuperSpeed USB)的链路训练状态机(Link Training and Status State Machine,LTSSM)是USB 3.0通信协议中的一个关键部分,它负责在两个 USB 3.0 设备之间建立和维持高速数据传输。 LTSSM 是链路训练状态机的简称,位于 USB 3.0 协议的 Link Layer,共有 12 种状态,在链路的两端,也就是 Downstream port 和 Upstream port 中各有一个 LTSSM,二者通过握手信号一起配合控制着这条链路的状态。(由链路一端发起 handshake 信号,另一端发回 response,完成握手从而保证双方的状态同步)

补充说明:USB 3.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状态下的错误无法恢复
  • 链路层定义的任何超时条件被触发
  • ..................................

1.2 USB3.0使用链路训练状态机的原因

1、USB 2.0 通过 D+ 或者 D- 的上拉电阻完成握手,BUS RESET 期间,USB HS 设备可以通过 Chirp Protocol 完成从 FS 到 HS 的速度切换;

2、USB 2.0 数据传输速率相对较低不需要均衡;

3、USB 2.0 链路中不需要建立一个连续的 symbol lock(因为 USB 2.0 使用的 NRZI 码,并不是USB 3.0 中的 8b10b 这种以 10bit 为 1 个 symbol 的线路码型);

4、在每个 packet 传输结束后,USB 2.0 BUS 都会回到电气初始化状态;

Summary:USB 2.0 因为速度慢,协议简单,电气特性不复杂,不需要链路训练,因此不需要 LTSSM。而USB3.0由于传输速度比 USB 2.0 快很多,传输过程中为了保证时钟和数据恢复准确,需要在接收端进行均衡,以保证眼图宽度和信号质量满足要求,因此需要链路训练状态机。链路训练状态机还有一个好处,就是有 recovry 和 retraining 状态,链路训练时的参数可以得以保留,在遇到无法纠正的链路错误的时候,可以快速的 retraining 以恢复到正常状态。

二、Link Training 的任务

链路训练的目的或需要完成的任务主要包括:

  1. 接收均衡recevier equalization
  2. 时钟恢复clock recovery
  3. 数据恢复data recovery
  4. 串并转换和字符锁定serial to parallel conversion adn symbol lock
  5. 极性翻转differential polarity inversion
  6. 弹性缓冲区初始化elastic buffer initializatiion

2.1 接收均衡

由于 USB 3.0 的速率提升,故其在传输路径上的高频损耗也就越大,所以接收端需要做均衡,也就是将高频损耗给补偿回来,以确保接收端可以正确地解析信号,这一步是为了提升信号完整性。

在训练的时候,发送端会发送特定的比特流 pattern,然后接收端依此来调节均衡,这个 pattern 会覆盖所有码流的场景,使得只要过了这个 training,那么接下来在正常通信的时候,接收端都可以正确接收。

接收端的均衡训练简单来说可以分为两步,一开始 TX 先发送 Polling.LFPS,其中 LFPS 为 10-50MHz 的低频方波,由于频率比较低,所以即使是未训练的链路,接收端也可以正确解析这个LFPS,Polling.LFPS 用于知会对端训练已经开始,此时接收端会设置好相应的低频参数( DC 参数),以迎接接下来的高频信号。接着,TX 端就会以 5Gbps 或以上的速率发送 TSEQ 即 Training Sequence Order Sets,来让接收端设置合适的均衡参数。

这种训练方式可以使得 USB3.0 适应不同的物理链路以确保RX端正确解析信号,但与之而来的代价就是需要花费较长的时间,均衡训练需要 TX 讲 32 字节的 TSEQ 发送 65536 次,大约需 4ms。所以在从低功耗恢复到正常通信也就是 U0 状态时,此时可以使用之前训练后保存下来的均衡参数即可,但如果是 Warm Reset 或者是 PowerOn Reset 的话,则需要跑完均衡训练。

另外,为了应对链路上的高频损耗,除了 RX 端的均衡之外,TX 端相应地也会施加去加重处理,只不过对于一开始发布的 5Gbps 的 USB3.0 而言,TX 的去加重只有 -3.5dB 这一选项,不像 PCIe3.0,所以TX端的去加重不用通过训练来寻优。

2.2 时钟恢复

由于 USB 3.0 的时钟是内嵌在数据流中的,为了保证充足的跳变沿使得 RX 可以将时钟从数据流中恢复出来,USB 3.0 采用了 8b/10b 编码。

在发送 TSEQ 的时候,RX 端就会将时钟从数据流中恢复出来,即 Clock Recovery,另外如2.1所述,当从低功耗模式恢复的时候,由于不发送 TSEQ,于是时钟恢复会从 TX 发送的 TS1/2 Order Sets 来恢复。

2.3 数据恢复

用恢复出来的时钟,反过来对数据进行采样,就称之为数据恢复,这个状态我们称RX端完成了 bit lock,因为到此每个 bit 的数据都被恢复出来并且可以送进串并转换了。

2.4 串并转换和字符锁定

章节2.3 中数据恢复只是将信号的每一个 bit 提取出来,但是此时还无法正确解读这些bit流的含义,需要找到一个起始点来将数据恢复成 10bit 一组的 symbol,也即是完成字符锁定 symbol lock。

symbol lock 寻找的特征点即是 COM 字符,TSEQ 的开头就是 COM 字符(K28.5),当数据采样的 bit 流送进串并转换模块后,就会开始按顺序寻找 COM 字符,也就是说如果当前 10bit 不是 COM 字符的话,则将最高位的 bit 移除并移入最新的 bit,从而次序寻找 COM,直到找到 COM 字符之后,此时称之为 symbol lock,接下来就可以在串并转换模块按顺序将各个 symbol(10bit) 输送到弹性缓冲区了。

2.5 极性翻转

每个高速链路都是差分信号,以 TX 为例即有 TX+ 和 TX-,正常的话需要将 TX+ 连到对端的RX+,但如果将 TX+ 连到对端的 RX-,PHY 层也是可以将其纠正过来的。

在完成 symbol lock 之后,就会去寻找 TSEQ Order Set 里边的 D10.2 字符,如果正确检索到了 D10.2 则无需进行极性翻转,如果检测到了 D21.5 字符则需极性翻转。 之所以选择 D10.2,是因为这个字符在 8b/10b 编码里边的正编码和反编码是完全一致的,所以可依赖 D10.2 来识别极性。

2.6 弹性缓冲区初始化

这个初始化其实没太多好介绍的,弹性缓冲区的作用就是链路时钟和本地时钟的一个中间过度地带,这里挖个坑之后再详细介绍它的作用。所谓初始化最主要其实就是先将 symbol 搬运进来一些之后,才允许用本地时钟将数据搬运出去到下一层。之后就依靠 SKP 字符的调节来保证缓冲区不会出现 overflow 和 underflow。

三、LTSSM 的 handshake 的三种方式

3.1 LFPS(Low frequency periodic signal)

LFPS 应用于以上 5 种情况,从图中也可以看出,LFPS 其实本质就是低频率的方波,通过定义其单次长度和重复长度来表征不同的含义

3.2 Ordered Sets Partten

Ordered Sets partten 是被预先定义的 K 码和 D 码的组合,包括 TSEQ,TS1,TS2,如下图所示。链路双方通过发送这些序列去完成均衡训练,时钟和串行数据恢复,弹性 buffer 管理等,直到 LTSSM 进入 U0 状态。从下图中可以看出,TS1 和 TS2 中是有比特可以设置是否 Loopback,是否 Disable 掉 Scrambling 的。

3.3 Link Commands

Link Command的结构如下图所示,主要用于power management transition,就是从U0跳到U1,U2,U3这些状态。为什么使用Link Command作为握手信号?主要原因是它比TS1短,只要8Bytes(LCSTART+LCW+LCW),而TS1需要16Bytes。

补充说明:

1、LGO_Ux Link Commands 用于从 U0 跳转到 U1,U2,U3

2、从U1-U3状态跳转出去需要 LFPS handshake ,并且要经过 Recovery 状态才能回到 U0

注意:每个状态跳转都约定了其中以上三种中的一种握手方式。

作者有话说:目前市面上的 USB3.0 芯片的链路状态机制作逻辑都不太一样,方案都存在一定差异!U1、U2、U3 都属于 USB 3.0 链路状态机中的低功耗状态(能耗比有差异),很低情况下,链路状态频繁进行 U1 和 U2 是很容易出问题的,所以很多芯片链路状态其实都会默认禁止 U1 和 U2 状态的进入,如果读者朋友有遇到这样的芯片不需要太过惊讶!!!

四、链路训练状态机 LTSSM 的状态和功能

USB 3.0 的链路训练状态机 LTSSM 如下所示:

Notice:这个状态跳转图里没有包含所有的跳转条件!并且 Downstream port 和 Upstream port 的跳转条件可能有所不同,请看下面的详细分析: 

4.1 Operational States

4.1.1 U0 State

U0 状态是 USB 3.0 中最正常的功能状态,在这个状态中链路双方将正常通信。进入 U0 状态后, USB 3.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。

4.1.2 U1 State

U1 状态是 USB 3.0 中规定的低功耗状态,在这个状态中链路双方将不能正常通信,但是需要的时候可以快速恢复到 U0,软件可以定义 U0 的 Exit Time。(功耗由高到低:U1>U2>U3,返回 U0 的时间由短到长:U1>U2>U3)

usb 3.0 specification 中对 U1 状态有一些要求,包括:

1、Receiver 必须保证用于 Rx 检测的终端电阻(在协议中规定是 18-30 欧)能被正确检测到
2、Transmitter 必须保持 DC 共模电压,规定最为大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 port 要检测 Ping.LFPS 信号,并打开 300mS 的 tU1PingTimeout 计时器,保证 Ping.LFPS 没有超时

如上图所示是 U1 的状态跳转图,注意 U1 没有子状态,U1可以跳转到5个状态:SS.Disable, Rx.Detect, U2, Recovery, SS.Inactive。 

4.1.3 U2 State

U2 状态也是一个低功耗状态,从该状态回到 U0 状态需要更长的时间。

usb 3.0 specification 中对 U2 状态有一些要求,包括:

1、Transmitter 必须保持 DC 共模电压,规定最为大200mV
2、Receiver 必须保证用于Rx检测的终端电阻(在协议中规定是 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;

6、Downstream port 要能区分 Ping.LFPS 和 U1 LFPS Exit 信令
7、Downstream port 每 100 ms 执行一次 far-end 接收器阻抗检测

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

4.1.4 U3 State(Suspend State)

U3 状态是 LTSSM 中规定的链路休眠状态,从该状态回到 U0 状态需要最长的时间。

usb 3.0 specification 中对 U3 状态有一些要求,包括:

1、Transmitter 不再需要保持 DC 共模电压,规定最为大200mV
2、Receiver 仍需要保证用于 Rx 检测的终端电阻(在协议中规定是 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 接收器阻抗检测

小结:

1、U0 是全功能状态,U1、U2、U3 都是低功耗状态,U1 和 U2 状态下 Device 要发送 Ping.LFPS 信号,Host 要检测 Ping.LFPS 信号,以此来保证双方还能通信,U3 则不用发 Ping.LFPS。
2、在这三个低功耗状态下,检测电路都会不断检测电阻的值,以确保物理上还正常连接。
3、在任意一条链路中,Host 或者 Device 都有可能作为低功耗状态的发起者,然后通过握手信号和对方沟通使该条链路进入低功耗状态。同理,任何一方也都可以作为退出低功耗状态的发起者,通过握手退出低功耗状态。

4.2 Link Initialization & Training States

4.2.1 Rx.Detect

上电并 PowerOn Reset 后,LTSSM 进入到的第一个状态就是 Rx.Detect 状态。这个状态是链路初始化的起点,在这个状态中,链路双方将完成终端电阻的检测。该状态有三个子状态,如下图所示,分别是 Rx.Detect.Reset, Rx.Detect.Active, Rx.Detect.Quiet。LTSSM状态机在链路的任意状态下都可以跳转到 Rx.Detect 状态,原因也很好理解:Device 设备随时可能会被用户移除,移除后再接入则需要重新检测链路接入是否正常。

1. Rx.Detect.Reset

Rx.Detect.Reset 状态是在检测到 Detect 之后触发 Bus 复位的情况,链路状态机将尝试再次握手。 

2. Rx.Detect.Active

在这个状态下,链路双方的 transmitter 都要去检测 receiver 的端接电阻值。

4.2.2 Polling

Polling 是 USB 进行链路训练的状态,训练成功则进入 U0 状态。在该状态中链路两端将会使用 LFPS 和 Orderd Sets 中的 Test partten 进行握手和训练,主要目的其实是为了 PHY 能够合理的调整均衡器参数,如 Rx 的 CTLE\DFE,以及 CDR 电路需要通过训练完成 Symbol Lock。

1. Polling.LFPS

在该状态下,链路两端都必须打开 LFPS 检测功能,并且互相发送 LFPS 方波。如文章开头所述,LFPS 的长度在协议中有所规定,一次长度 600ns-1.4us,两次之间间隔在 6-14us,总计 16 次,如下图所示:

2. Polling.RxEQ

进入该状态,链路两端会互相发送 TSEQ Ordered Sets,目的是为了训练 Rx 均衡电路和 CDR 电路,使其完成时钟恢复和 Symbol Lock。其中,TSEQ 是由 2 个 Symbol 组成的 pattern,并重复65536 次,如下图所示:

3. Polling.Active

该状态下链路两端发送 TS1 序列,目的是为了确保 Symbol Lock(防止在 RxEQ 状态下没有锁住),以及完成握手以离开训练。

4. Polling.Configuration

该状态下链路两端发送 TS2 序列,目的是为了使用 TS2 序列中的 Reset,Loopback,Scrambling Disable bit,使链路进入不同的状态。

5. Polling.Idle

进入该状态后,链路两端开始互相发送 Idle symbols。且当 8 个 Idle 接收到,且 16 个 Idle 发送出去,则进入到 U0 状态。

4.2.3 Recovery

Recovery 状态的目的是为了提供低延迟的 retraining,使得链路能从其他状态快速恢复到 U0 状态,前提是该链路之前已经完成过完整的 Link Training。硬件中会存储之前 Training 的结果(主要是均衡电路的参数),在 Retraining 时会直接使用之前 Training 的参数不会再训练均衡器。那么问题来了,都是 Retrain 的是什么东西呢?主要是 re-synchronize,CDR 的时钟重新恢复和 symbol 锁定。

这里就不再详细分析 Recovery 状态下的跳转条件了,直接看下图,红色部分是一个通常情况下的跳转过程,整个过程其实就是链路双方发送 TS1、TS2 和 Idle 完成握手。 

4.2.4 Hot Reset

Hot Reset 的状态跳转过程可以看下图:

4.3 Testing States

4.3.1 Compliance State

Compliance State 是为了测试信号一致性而规定的状态,进入该状态后可以发送 CP0~CP8 等测试 pattern,对协议中的一些电压或者 timing 参数进行测试。测试 pattern 的定义如下:

4.3.2 Loopback

Loopback 状态是为了测试链路的可靠性,统计误码率等,需要一个特殊的测试设备作为 Loopback Master。

五、粉丝交流群

嵌入式交流群 1 群:958820627(可能已满);嵌入式交流群 2 群:876919359(可能已满);嵌入式交流群 3 群:957431539(推荐加入)。欢迎加群,有问题可以群内分享技术交流,秋招和春招会有诸多大厂内推码或者内推名额推荐。希望大家友好讨论技术知识!!! 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐