UFS 链路启动基本流程
站在硬件调试的角度看,UFS 从复位释放到链路建立,其实就干了一件事——让 Host 和 Device 在物理层上「对齐」。
这中间要经历几个固定的状态机跳转,任何一个卡住,你的设备就会出现链路不通、识别不到、或者频繁重启。我以前有个项目,就是死在 M-PHY 的 HS 培训阶段,后面我会讲到那个坑。
1. 复位释放 & 时钟稳定
复位引脚 RST_N 从低变高,这只是开始。UFS Device 内部需要时间完成本地复位和电压稳定。我个人习惯在复位释放后至少等 2ms 再操作寄存器,这个值是参考 JEDEC 标准,但不同厂商的 HVIC 可能略有差异。
时钟方面,UFS 需要外部参考时钟(通常是 26MHz)。时钟信号的有效性由 Device 检测,如果频率偏差超过 ±350ppm,Device 会认为时钟失效,链路启动直接就挂了。
2. M-PHY 初始化(PWM 模式)
Device 确认时钟稳定后,M-PHY 模块开始上电,首先进入 PWM(脉冲宽度调制)模式。说白了就是用较低速率先建立物理连接,避免直接高速握手失败。
这个阶段涉及几个关键步骤:
- PWM 速率选择: 默认从 Gear1 的 PWM 速率开始(约 9.6 Mbps)。
- DIF 序列发送: Host 发送 DIFB(差分空闲序列)引导 Device 进入对齐状态。
- Line Reset 握手: 双方交换线复位信号,确认差分线状态正确。
3. HS 培训 & 速率协商
这是整个链路启动最有意思的阶段。Host 和 Device 都希望在高速(HS)下工作,但双方能支持的 Gear 和速率可能不同,所以需要培训。
培训帧(Training Frame)会在 PWM 模式下交换,包含双方的速率能力、TA(Turnaround)配置等。UFS 2.0 以上支持 Gear1~Gear4,有的 Device 甚至能到 Gear5。
| Gear | HS 速率(每 Lane) | 典型应用 |
|---|---|---|
| Gear1 | 1.45 Gbps | 低速兼容 |
| Gear2 | 2.9 Gbps | 多数 UFS 2.0 设备 |
| Gear3 | 5.8 Gbps | UFS 2.1 / 部分 3.0 |
| Gear4 | 11.6 Gbps | UFS 3.x 高速 |
培训成功的关键是双方在同一 Gear 上达成一致。如果 Host 要求 Gear3,但 Device 只支持到 Gear2,则会回退到 Gear2。我记得有次客户反馈设备识别慢,抓日志发现培训重试了 20 多次——原来是 Device 模块的 Gear 能力位没按规范更新,Host 一直尝试 Gear4,每次超时 10ms。
4. 链路同步与状态切换
培训完成后,M-PHY 切换到 HS 模式,开始发送同步序列。这个序列的作用是让双方的 RX(接收端)能从串行比特流里准确找到数据边界。同步阶段常用模式有:
- TS1/TS2 序列: 类似 PCIe 的同步码,含有链路 ID 和配置信息。
- COM 模式: 用于相位对准,消除线缆/PCB 走线带来的延迟。
- ALIGN 序列: 如果链路有多 Lane(比如 2 Lane),还要做 Lane 间对齐。
同步完成后,Unipro 层会收到 LINE_UP 状态,Host 就可以开始发送 NOP OUT 帧来验证设备是否就绪。
5. 链路建立与配置
同步通过后,双方状态机跃进到 Active 状态。接下来 Unipro 层会交换配置帧(例如 DME_SET / DME_GET),设置属性如本地数据包尺寸、帧数预期等。
配置阶段的一个常见操作是读取 Device 的 UFS 协议版本和功能支持,然后由 Host 写入工作参数。比如我的项目里会根据 Device 支持的最大总线规模来调整 DFM 队列深度。
整个链路建立的最后一个标志是:Host 收到 Device 的 NOP IN 正常响应。至此,物理链路才算真正稳定,后续才能下发 SCSI 命令读写数据。
总结:链路启动的排查清单
下面这张表是我做实验室验证时必用的检查项,帮你快速定位问题阶段:
| 阶段 | 典型异常 | 验证工具 |
|---|---|---|
| 复位释放 | 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 或者电源噪声,那又是另一套功夫了。