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接口进行状态交互。典型的分层关系如下:

M-PHY 与 UniPro 分层协作关系 UniPro – Network / Transport (L3+) UniPro – Data Link Layer (L2) UniPro – PA Adaptor (L1.5) + DME M-PHY – PHY Layer (Geard/Series/PWM/HS) 差分信号线 (DIF_P, DIF_N) / 参考时钟 DME set/get Config.ind PA_CTRL / PA_STATUS 属性操作接口

图中蓝色、紫色、青色层属于UniPro,红色层为M-PHY。右侧说明框指出DME通过属性(Attribute)读写控制M-PHY的速率和状态。

1.4 训练流程总览

完整的链路训练分为以下四个主要阶段,每个阶段都有特定的目标与寄存器操作:

  1. HS唤醒 / 信号探测:Host发送唤醒信号,检测设备是否在线。
  2. 速率协商:通过PA_GEAR、PA_SERIES等属性协商双方最大值。
  3. 物理适配:配置驱动强度、预加重、均衡等PHY专用参数。
  4. 链路确认:发送测试帧,确认CRC无错误后进入正常操作。

1.4.1 典型关键寄存器与属性

在UniPro规范中,链路训练相关的配置主要通过PA(Physical Adapter)属性和DME属性完成。常见的关键属性如下:

属性名称属性ID方向说明
PA_ACTIVATED0x01Host→Device激活PA状态机,触发训练
PA_GEAR0x02双向协商的GEAR速率等级 (G1/G2/G3/G4)
PA_SERIES0x03双向速率系列 (A/B)
PA_PHY_TYPE0x04双向选择M-PHY或PWM模式
PA_TACTIVATE0x05Host→Device训练超时时间,建议10ms-50ms
PA_HS_MODE0x06双向高速模式使能

1.4.2 训练流程步骤分解

实现提示:以下步骤对应的代码通常在UFS Host Controller或通用驱动库(如TL-UNIPRO)中实现,但理解这些步骤对调试异常至关重要。
// 伪代码:链路训练主流程
#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电压摆幅
速率协商总是回退到最低GEARPCB走线差、接地不良、电源噪声调整预加重或驱动强度;检查信号完整性(眼图测试)
dme_get返回0xFFPHY层未初始化,或设备处于异常状态重新下电/上电序列;或者使用硬件复位(RST_n)
训练成功但数据传输CRC错误均衡参数不当、高速下链路不稳定使用DME调整均衡器系数;切换到较低GEAR测试稳定性
注意:链路训练参数(如PA_GEAR、PA_TACTIVATE)的默认值可能在不同的SoC或UFS控制器中有差异。如果频繁出现训练失败,建议先使用dme_get读取设备端的能力再协商,而非强行设置固定值。