UFS链路训练与设备探测 - 第1节
1.1 为什么需要链路训练
UFS(Universal Flash Storage)设备在物理连接建立后,并不能直接进行数据传输。主机(Host)和设备(Device)之间的M-PHY(MIPI PHY)和UniPro(Unified Protocol)层需要先完成一系列参数协商与状态同步,这个过程被称为“链路训练”(Link Training)。其主要目的包括:
- 速率匹配:确定双方支持的GEAR、速率系列(A/B)和HS(高速)/PWM(脉冲宽度调制)模式。
- 电气参数校准:调整驱动强度、预加重、均衡器设置,确保信号完整性。
- 协议版本对齐:确认UniPro和M-PHY版本兼容。
- 属性交换:通过属性(Attribute)机制交换Local和Remote端的配置信息。
- 同步初始化:建立稳定的数据链路层逻辑连接。
链路训练失败是UFS设备识别失败(如“No UFU Device Found”)的最常见原因之一,约70%的初始化故障发生在物理层或链路层。正确理解训练流程,是排除此类故障的前提。
1.2 UFS协议栈与分层架构
UFS协议栈分为三个主要层次,与物理连接的映射关系如下表所示:
| 层次 | 协议/标准 | 功能职责 |
|---|---|---|
| 应用层 | UFS Command Set (UCS), SCSI Architecture Model (SAM) | 处理读写命令、设备管理、UFS Protocol Information Units (UPIU) |
| 链路层 | UniPro (MIPI UniPro) | 数据链路管理、流量控制、错误检测与重传、属性配置 |
| 物理层 | M-PHY (MIPI M-PHY) | 串行/解串、电气信号传输、速率协商、电源模式管理(HS/PWM) |
1.2.1 M-PHY 物理层
M-PHY定义了两种基本操作模式:高速(HS)模式用于大数据量传输,速率可达Gbps级;PWM模式用于控制命令和低功耗场景。链路训练阶段主要工作在PWM模式或低速HS模式,待参数稳定后切换至目标高速。
1.2.2 UniPro 链路层
UniPro位于M-PHY之上,提供:
- L1.5 (PA – Physical Adapter):适配M-PHY,处理电源模式、唤醒。
- L2 (Data Link Layer):帧定界、CRC校验、ACK/NAK、流控。
- L3+ (Network/Transport):路由、分段重组、多流管理。
训练过程中主要依赖PA Layer (L1.5)和DME (Device Management Entity)进行属性读写。
1.3 M-PHY 与 UniPro 的分层协作关系
在链路训练中,UniPro通过DME模块向下控制M-PHY的POWER、GEAR和SERIES等参数。两者通过PA_CONVENTIONAL接口进行状态交互。典型的分层关系如下:
图中蓝色、紫色、青色层属于UniPro,红色层为M-PHY。右侧说明框指出DME通过属性(Attribute)读写控制M-PHY的速率和状态。
1.4 训练流程总览
完整的链路训练分为以下四个主要阶段,每个阶段都有特定的目标与寄存器操作:
- HS唤醒 / 信号探测:Host发送唤醒信号,检测设备是否在线。
- 速率协商:通过PA_GEAR、PA_SERIES等属性协商双方最大值。
- 物理适配:配置驱动强度、预加重、均衡等PHY专用参数。
- 链路确认:发送测试帧,确认CRC无错误后进入正常操作。
1.4.1 典型关键寄存器与属性
在UniPro规范中,链路训练相关的配置主要通过PA(Physical Adapter)属性和DME属性完成。常见的关键属性如下:
| 属性名称 | 属性ID | 方向 | 说明 |
|---|---|---|---|
| PA_ACTIVATED | 0x01 | Host→Device | 激活PA状态机,触发训练 |
| PA_GEAR | 0x02 | 双向 | 协商的GEAR速率等级 (G1/G2/G3/G4) |
| PA_SERIES | 0x03 | 双向 | 速率系列 (A/B) |
| PA_PHY_TYPE | 0x04 | 双向 | 选择M-PHY或PWM模式 |
| PA_TACTIVATE | 0x05 | Host→Device | 训练超时时间,建议10ms-50ms |
| PA_HS_MODE | 0x06 | 双向 | 高速模式使能 |
1.4.2 训练流程步骤分解
// 伪代码:链路训练主流程
#define DME_GET(attr_id) // 通过DME读取属性
#define DME_SET(attr_id, value) // 通过DME写入属性
void ufs_link_training(void) {
// Step 1: 发送WAKEUP,等待设备响应
DME_SET(PA_ACTIVATED, 0x01);
delay_ms(5); // 等待设备端唤醒
// Step 2: 读取设备支持的GEAR和SERIES
uint8_t remote_gear = DME_GET(PA_GEAR);
uint8_t remote_series = DME_GET(PA_SERIES);
// Step 3: 协商公共速率(取最小值)
uint8_t target_gear = min(local_gear, remote_gear);
uint8_t target_series = match_series(local_series, remote_series);
DME_SET(PA_GEAR, target_gear);
DME_SET(PA_SERIES, target_series);
// Step 4: 配置PHY参数(驱动强度、均衡等)
phy_tune_params();
// Step 5: 发起链路建立,等待状态
DME_SET(PA_ACTIVATED, 0x00); // 触发建立
wait_for_state(PA_LINK_UP);
}
1.5 调试日志分析
初始化过程中,Host端(如SoC UFS控制器)会输出详细的训练状态日志。以下是一段典型的训练成功日志(以高通平台为例):
[ 10.234] ufshcd: ufshcd_init: UFS Host controller registers
[ 10.240] ufshcd: link_startup: Starting UniPro link initialization
[ 10.245] ufshcd: dme_get: attr_id 0x02 (PA_GEAR) = 0x03 // 设备支持G3
[ 10.252] ufshcd: dme_get: attr_id 0x03 (PA_SERIES) = 0x01 // Series A
[ 10.258] ufshcd: dme_set: attr_id 0x02 set to 0x03
[ 10.263] ufshcd: dme_set: attr_id 0x03 set to 0x01
[ 10.268] ufshcd: phy_tuning: preemphasis=2, drive_strength=4
[ 10.275] ufshcd: link_startup: Link up success - rate = HS-G3 A
[ 10.280] ufshcd: ufshcd_probe_hba: UFS device found
关键日志字段含义:
dme_get / dme_set:UniPro DME属性读写操作。PA_GEAR=0x03:协商到G3 (8.5 Gbps)。PA_SERIES=0x01:Series A。Link up success:链路建立成功标识。
1.6 常见错误与修复
| 错误现象 | 可能原因 | 修复方法 |
|---|---|---|
PA_ACTIVATED无响应,超时 | 设备未上电、参考时钟异常、差分线连接错误 | 检查电源域、时钟频率(典型26MHz);测量DIF_P/DIF_N电压摆幅 |
| 速率协商总是回退到最低GEAR | PCB走线差、接地不良、电源噪声 | 调整预加重或驱动强度;检查信号完整性(眼图测试) |
dme_get返回0xFF | PHY层未初始化,或设备处于异常状态 | 重新下电/上电序列;或者使用硬件复位(RST_n) |
| 训练成功但数据传输CRC错误 | 均衡参数不当、高速下链路不稳定 | 使用DME调整均衡器系数;切换到较低GEAR测试稳定性 |
dme_get读取设备端的能力再协商,而非强行设置固定值。