2、UFS基础:UFS协议简介、物理层、链路层、命令层、应用层及关键术语

UFS(Universal Flash Storage,通用闪存存储)并不是“更快的eMMC”,而是一套完整的存储协议栈。它借鉴了SCSI命令集与MIPI的物理传输规范,采用全双工串行差分链路,支持命令队列与多通道并发。理解UFS驱动适配,第一步不是看寄存器,而是先建立分层模型:应用层发起读写,命令层把请求翻译成UPIU,链路层负责可靠传输,物理层完成电气信号收发。任何一层参数不匹配,都会表现为“设备能识别但读写异常”或“初始化超时”。

一、UFS协议分层模型

UFS协议自上而下分为应用层、命令层、传输层(链路层)和物理层。应用层对应主机侧的块设备请求、文件系统IO;命令层定义UFS命令集(基于SCSI SPC/SBC),负责把IO请求封装为UPIU(UFS Protocol Information Unit);链路层管理MIPI UniPro协议,处理链路建立、流控、错误重传;物理层则是MIPI M-PHY,负责差分信号、速率档位与功耗状态切换。

UFS 协议栈分层与数据流 主机侧 (Host) 应用层 / 文件系统 块设备驱动 UFS 主机控制器 UniPro / M-PHY MIPI 物理接口 设备侧 (Device) UFS 设备固件 命令解析 / 队列 UniPro / M-PHY NAND 闪存阵列 MIPI 物理接口 命令层 (Command Layer) SCSI 命令集 → UPIU 封装 / 解封装 链路层 (UniPro) 链路建立 / 流控 / 错误重传 / 电源管理 物理层 (M-PHY) 差分信号 / HS-GEAR / PWM / 功耗状态 UPIU 数据单元 命令 / 数据 / 响应 / 任务管理

二、物理层与链路层关键参数

物理层决定“能不能通”,链路层决定“通得稳不稳”。M-PHY支持PWM(低速)和HS-GEAR(高速)两种模式,HS-GEAR1~4对应不同速率档位。驱动适配时最常遇到的是速率协商失败:主机配置HS-GEAR3,但设备只支持到HS-GEAR2,链路就会回退或直接报错。链路层则涉及Lane数量(1或2 Lane)、UniPro的T_Connection、DME属性配置等。

层级 关键参数 典型值/说明 适配关注点
物理层 HS-GEAR GEAR1~GEAR4 速率协商、信号完整性
物理层 Lane数 1 Lane / 2 Lane 硬件走线、双通道并发
链路层 UniPro版本 1.6 / 1.8 / 2.0 属性集兼容性
链路层 流控Credit 动态分配 队列深度与吞吐
命令层 UPIU类型 Command/Data/Response 命令队列深度

三、命令层与应用层的交互流程

应用层的一次读请求,在命令层会被拆解为:主机发送COMMAND UPIU(含SCSI READ命令)→ 设备返回RTT(Ready To Transfer)→ 主机发送DATA IN UPIU → 设备返回RESPONSE UPIU。写请求方向相反。UFS支持命令队列(Command Queue),最多可同时挂载32条命令,驱动需要正确配置队列深度与任务标签。

# 典型UFS初始化日志片段
ufshcd: UFS Host Controller initialized
ufshcd: Link startup: HS-GEAR3, 2 Lanes
ufshcd: Device found: SAMSUNG KLUDG4U1EA-B0C1
ufshcd: UFS version 3.1, UniPro 1.8
ufshcd: Command queue depth = 32
ufshcd: scsi 0:0:0:0: Direct-Access UFS 3.1
提示:如果日志中Link startup显示PWM模式而非HS-GEAR,通常说明速率协商未成功,需检查设备树中的max-gear配置与硬件信号质量。

四、常见误区与复盘

  • 误区一:认为UFS和eMMC驱动可以复用。UFS使用SCSI命令集和UniPro链路,eMMC使用MMC命令集,两者寄存器模型完全不同。
  • 误区二:忽略UniPro属性配置。DME属性如PA_TActivate、PA_Granularity若与设备不匹配,会导致链路频繁重连。
  • 误区三:只看物理层速率,不看命令队列。队列深度配置过小,即使HS-GEAR4也无法发挥并发优势。
  • 复盘要点:适配失败时按“物理层→链路层→命令层→应用层”自下而上排查,先确认Link startup成功,再验证UPIU收发,最后检查块设备注册。
核心记忆:UFS = SCSI命令集 + UniPro链路 + M-PHY物理层。驱动适配的本质,是让主机侧这四层参数与设备侧声明能力逐层对齐。