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,负责差分信号、速率档位与功耗状态切换。
二、物理层与链路层关键参数
物理层决定“能不能通”,链路层决定“通得稳不稳”。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
四、常见误区与复盘
- 误区一:认为UFS和eMMC驱动可以复用。UFS使用SCSI命令集和UniPro链路,eMMC使用MMC命令集,两者寄存器模型完全不同。
- 误区二:忽略UniPro属性配置。DME属性如PA_TActivate、PA_Granularity若与设备不匹配,会导致链路频繁重连。
- 误区三:只看物理层速率,不看命令队列。队列深度配置过小,即使HS-GEAR4也无法发挥并发优势。
- 复盘要点:适配失败时按“物理层→链路层→命令层→应用层”自下而上排查,先确认Link startup成功,再验证UPIU收发,最后检查块设备注册。