UFS 链路启动基本流程

站在硬件调试的角度看,UFS 从复位释放到链路建立,其实就干了一件事——让 Host 和 Device 在物理层上「对齐」。

这中间要经历几个固定的状态机跳转,任何一个卡住,你的设备就会出现链路不通、识别不到、或者频繁重启。我以前有个项目,就是死在 M-PHY 的 HS 培训阶段,后面我会讲到那个坑。

在写驱动或者调时序前,先把整条链路启动的流水线刻在脑子里。它大致分 5 个阶段,每个阶段的失败原因都不一样,排查工具也不一样。
UFS 上电复位链路启动流程 UFS 链路启动核心流程 1. 复位释放 2. 参考时钟稳定 3. M‑PHY 初化(PWM) 4. HS 培训 5. 链路同步 6. 链路建立 7. 配置完成/就绪 每阶段都用状态机管理,失败后可能重复或回退到上一步

1. 复位释放 & 时钟稳定

复位引脚 RST_N 从低变高,这只是开始。UFS Device 内部需要时间完成本地复位和电压稳定。我个人习惯在复位释放后至少等 2ms 再操作寄存器,这个值是参考 JEDEC 标准,但不同厂商的 HVIC 可能略有差异。

时钟方面,UFS 需要外部参考时钟(通常是 26MHz)。时钟信号的有效性由 Device 检测,如果频率偏差超过 ±350ppm,Device 会认为时钟失效,链路启动直接就挂了。

我踩过的坑: 之前用一颗国产 SoC,复位后输出时钟的延迟比预期大了 1.5ms,导致 Device 在时钟未稳定时就开始了 M-PHY 初始化,结果一直收不到 Device 回复。最后在代码里加了 5ms 的延时才搞定。

2. M-PHY 初始化(PWM 模式)

Device 确认时钟稳定后,M-PHY 模块开始上电,首先进入 PWM(脉冲宽度调制)模式。说白了就是用较低速率先建立物理连接,避免直接高速握手失败。

这个阶段涉及几个关键步骤:

  • PWM 速率选择: 默认从 Gear1 的 PWM 速率开始(约 9.6 Mbps)。
  • DIF 序列发送: Host 发送 DIFB(差分空闲序列)引导 Device 进入对齐状态。
  • Line Reset 握手: 双方交换线复位信号,确认差分线状态正确。
在调试前期,建议用示波器抓 M-PHY 差分线的 DIF 序列。如果看到 PWM 波形但 Device 无应答,十有八九是时序边沿不满足 Unipro 规范。

3. HS 培训 & 速率协商

这是整个链路启动最有意思的阶段。Host 和 Device 都希望在高速(HS)下工作,但双方能支持的 Gear 和速率可能不同,所以需要培训。

培训帧(Training Frame)会在 PWM 模式下交换,包含双方的速率能力、TA(Turnaround)配置等。UFS 2.0 以上支持 Gear1~Gear4,有的 Device 甚至能到 Gear5。

GearHS 速率(每 Lane)典型应用
Gear11.45 Gbps低速兼容
Gear22.9 Gbps多数 UFS 2.0 设备
Gear35.8 GbpsUFS 2.1 / 部分 3.0
Gear411.6 GbpsUFS 3.x 高速

培训成功的关键是双方在同一 Gear 上达成一致。如果 Host 要求 Gear3,但 Device 只支持到 Gear2,则会回退到 Gear2。我记得有次客户反馈设备识别慢,抓日志发现培训重试了 20 多次——原来是 Device 模块的 Gear 能力位没按规范更新,Host 一直尝试 Gear4,每次超时 10ms。

4. 链路同步与状态切换

培训完成后,M-PHY 切换到 HS 模式,开始发送同步序列。这个序列的作用是让双方的 RX(接收端)能从串行比特流里准确找到数据边界。同步阶段常用模式有:

  1. TS1/TS2 序列: 类似 PCIe 的同步码,含有链路 ID 和配置信息。
  2. COM 模式: 用于相位对准,消除线缆/PCB 走线带来的延迟。
  3. ALIGN 序列: 如果链路有多 Lane(比如 2 Lane),还要做 Lane 间对齐。

同步完成后,Unipro 层会收到 LINE_UP 状态,Host 就可以开始发送 NOP OUT 帧来验证设备是否就绪。

诊断口诀: 同步阶段卡住时,千万别急着改 Gear。先看参考时钟的抖动是否超标,再看 PCB 差分线的阻抗匹配。硬件问题比软件问题更容易出现在这里。

5. 链路建立与配置

同步通过后,双方状态机跃进到 Active 状态。接下来 Unipro 层会交换配置帧(例如 DME_SET / DME_GET),设置属性如本地数据包尺寸、帧数预期等。

配置阶段的一个常见操作是读取 Device 的 UFS 协议版本和功能支持,然后由 Host 写入工作参数。比如我的项目里会根据 Device 支持的最大总线规模来调整 DFM 队列深度。

整个链路建立的最后一个标志是:Host 收到 Device 的 NOP IN 正常响应。至此,物理链路才算真正稳定,后续才能下发 SCSI 命令读写数据。

如果你在调试时发现设备管理包(UPIU)总能发出但收不到回复,大概率是链路同步阶段因为 LCC(线电容)补偿不足导致 BER 太高。可以尝试在 Host 侧手动调整 M-PHY 的 TX 摆幅或预加重系数。

总结:链路启动的排查清单

下面这张表是我做实验室验证时必用的检查项,帮你快速定位问题阶段:

阶段典型异常验证工具
复位释放RST_N 毛刺/上升时间 > 10ns示波器测引脚
时钟稳定频率偏差 > 350ppm频谱分析仪或频率计
M-PHY 初化DIF 序列未出现 / Device 无 ACK逻辑分析仪抓 DIFB
HS 培训培训帧重试 > 3 次Unipro 状态跟踪(内部寄存器)
链路同步ALIGN 抛出错误 / 位错误增示波器测眼图 & M-PHY 错误计数器
配置/就绪NOP OUT 超时 / 无 IN 回应UFS 驱动层 log (QUniPro / UFSHCD)

把上面这些阶段走通了,你的 UFS 链路基本就站稳了。下一段要是再出问题,十有八九是 EMI 或者电源噪声,那又是另一套功夫了。