2、UFS协议基础:UFS架构、UniPro、MIPI M-PHY、SCSI命令集、UFS传输层与物理层
做UFS抓包分析,第一步不是打开分析仪,而是先建立一张“协议地图”。只有知道一个读命令从主机应用层出发,经过哪几层封装、在哪条物理链路上传输、最终在设备端如何被解析,才能在抓包数据中快速定位异常发生在哪一层。本节围绕UFS架构、UniPro、MIPI M-PHY、SCSI命令集以及传输层与物理层的关系,梳理抓包分析所需的协议基础。
一、UFS整体架构:从主机到设备的五层视角
UFS(Universal Flash Storage)并不是单一协议,而是一套分层协议栈。从主机侧看,自上而下通常包括应用层、UFS命令层(基于SCSI命令集)、UFS传输层(UTP)、UniPro层以及MIPI M-PHY物理层。设备侧与之对称,形成端到端的通信模型。
抓包时,分析仪通常挂在主机与UFS设备之间的M-PHY链路上,捕获的是物理层信号经过解析后的UniPro数据包。因此,理解“抓到的包对应哪一层”是分析的前提。例如,抓包工具显示的UTP传输单元(UTP Transfer Request)属于传输层,而其中的SCSI命令(如READ(10)、WRITE(10))属于命令层。
二、UniPro与MIPI M-PHY:传输的“交通规则”与“道路”
UniPro(Unified Protocol)是UFS的链路层协议,负责在主机与设备之间建立可靠的逻辑连接。它定义了数据包格式、流控机制、错误恢复以及电源管理状态。抓包中常见的UniPro数据包类型包括:
- UTP Transfer Request:承载SCSI命令或数据,是分析命令执行流程的核心对象。
- AFC(Acknowledgement and Flow Control):用于确认接收和流控,异常时可能导致超时。
- NAC(Negative Acknowledgement):表示接收错误,触发重传。
- Power Mode Change:链路速率或功耗状态切换,如从PWM G1切换到HS G3。
MIPI M-PHY则是物理层规范,定义了电气特性、信号线对(Lane)、速率模式(PWM/HS)以及状态机。UFS通常使用两对差分线:一对用于发送(TX),一对用于接收(RX),支持全双工通信。M-PHY的速率档位(Gear)直接影响抓包时的采样率和信号完整性。
三、SCSI命令集:UFS命令层的“语言”
UFS命令层采用SCSI命令集(SCSI Command Set),通过CDB(Command Descriptor Block)描述操作。常见的UFS操作包括:
| SCSI命令 | 操作码 | 典型用途 | 抓包关注点 |
|---|---|---|---|
| READ(10) | 0x28 | 读取用户数据 | LBA、传输长度、数据方向 |
| WRITE(10) | 0x2A | 写入用户数据 | LBA、传输长度、写保护状态 |
| INQUIRY | 0x12 | 查询设备信息 | 设备类型、厂商ID、产品版本 |
| TEST UNIT READY | 0x00 | 检查设备就绪 | 状态码、是否返回CHECK CONDITION |
| REQUEST SENSE | 0x03 | 获取错误详情 | Sense Key、ASC/ASCQ |
在抓包分析中,SCSI命令的CDB字段是判断操作意图的直接依据。例如,READ(10)的CDB中第2~5字节为LBA,第7~8字节为传输长度。若发现LBA越界或传输长度为0,往往意味着上层软件参数配置错误。
四、传输层与物理层的协作:一次读操作的完整路径
以一次典型的READ(10)为例,数据流如下:
- 主机应用发起读请求,文件系统转换为SCSI READ(10)命令。
- UFS命令层将CDB封装为UTP传输单元,指定数据方向为设备到主机。
- UniPro层将UTP传输单元封装为UniPro数据包,分配标签(Tag)用于匹配请求与响应。
- M-PHY物理层将数据包转换为差分信号,通过TX Lane发送至设备。
- 设备M-PHY接收信号,UniPro层解析数据包,UTP层提取CDB并执行读操作。
- 设备将读取的数据通过RX Lane返回,主机UniPro层重组数据,UTP层完成传输,命令层返回状态。
抓包时,分析仪会同时捕获TX和RX方向的数据。一个常见的误区是只关注命令方向而忽略数据方向,导致无法判断数据是否真正返回。正确的做法是:先找到UTP Transfer Request中的SCSI命令,再根据Tag追踪对应的数据包和响应包,形成完整的“命令—数据—状态”三元组。
五、抓包分析中的分层定位方法
面对一个抓包文件,建议按以下顺序定位问题:
- 物理层:检查链路是否建立、速率模式是否匹配、是否有信号丢失或误码。
- UniPro层:检查数据包序列号、AFC流控、NAC重传、电源状态切换是否正常。
- UTP层:检查传输单元是否完整、Tag是否匹配、数据方向是否正确。
- SCSI命令层:检查CDB字段、状态码、Sense Data,判断命令是否被设备正确执行。
例如,若抓包显示READ(10)命令已发出,但迟迟没有数据返回,且UniPro层出现多次NAC,则应优先排查物理层信号质量或链路速率配置,而不是怀疑SCSI命令本身。反之,若数据正常返回但状态为CHECK CONDITION,则应重点分析Sense Data中的ASC/ASCQ。
示例:一次READ(10)抓包关键字段
----------------------------------------
UTP Transfer Request:
Tag: 0x1A
Command: READ(10) Opcode=0x28
LBA: 0x0000A000
Transfer Length: 0x0008 (4KB)
Data Direction: Device -> Host
Data IN:
Tag: 0x1A
Data Length: 4096 bytes
Status: GOOD
Response:
Tag: 0x1A
Status: GOOD (0x00)
----------------------------------------