一、UFS概述:协议简介、与eMMC对比、海力士产品线
各位工程师朋友,大家好。今天我们正式开始《海力士UFS存储设备驱动移植指南》的第一章。
UFS,全称Universal Flash Storage,通用闪存存储。说白了,它就是下一代手机、汽车、服务器里用的存储接口标准。你可能更熟悉eMMC,毕竟过去十年它统治了移动存储。但时代变了,UFS才是现在和未来的主角。
我个人最早接触UFS是在2016年,当时帮一家手机厂商做存储方案选型。客户问:“eMMC 5.1够用了吧?”我说:“你试试4K随机读写,eMMC的瓶颈太明显了。”后来换了UFS 2.0,整机启动速度直接快了30%。嗯,从那以后我就再也没回头看过eMMC。
1.1 UFS协议简介
UFS协议,本质上是一套全双工、串行、点对点的通信协议。它借鉴了SCSI架构,使用命令队列(Command Queue)和任务管理功能。你想想看,eMMC还是半双工,读写不能同时进行。UFS可以同时收发数据,效率自然高出一截。
UFS的物理层基于MIPI M-PHY,速率从早期的Gear 1(约1.5Gbps)一路发展到现在的Gear 5(约23.2Gbps per lane)。我建议你在做驱动移植时,先确认硬件支持的Gear等级,不然速率配不上,性能白费。
为什么会这样分层?因为UFS要兼容SCSI的上层命令,同时又要管理底层的物理链路。我在项目中遇到过一个问题:链路训练失败,导致UFS设备无法识别。后来发现是UIC层的参数配置不对,调整了PA_Hibern8Time之后就好了。这种坑,你早晚也会踩到。
1.2 UFS与eMMC对比
很多初学者问我:“UFS比eMMC强在哪?”我一般直接甩一张对比表过去。你一看就明白了。
| 对比项 | eMMC 5.1 | UFS 3.1 | UFS 4.0 |
|---|---|---|---|
| 接口类型 | 并行(8位总线) | 串行(2 lane) | 串行(2 lane) |
| 工作模式 | 半双工 | 全双工 | 全双工 |
| 最大速率 | 约400MB/s | 约2.9GB/s | 约4.6GB/s |
| 命令队列 | 单命令(排队) | 32深度命令队列 | 64深度命令队列 |
| 功耗控制 | 简单 | 多级电源管理 | 更精细的电源管理 |
| 驱动复杂度 | 低 | 中高 | 高 |
你看,eMMC的并行总线在高速下信号干扰严重,速率很难再往上提。UFS用串行差分信号,抗干扰能力强,速率天花板高得多。我曾经帮一个团队做eMMC转UFS的移植,他们一开始以为只是改改寄存器地址,结果发现整个命令处理流程都得重写。嗯,这里要注意:UFS的命令队列管理比eMMC复杂得多,驱动里要处理好请求的排序和完成回调。
1.3 海力士UFS产品线介绍
海力士(SK hynix)是目前全球UFS出货量最大的厂商之一。他们的产品线覆盖了从消费级到车规级的全系列。我个人用过海力士的H28U系列和H28H系列,稳定性确实不错。
目前主流的产品系列包括:
- H28U系列(UFS 2.1/2.2):面向中端手机和IoT设备,性价比高。我记得有个客户用H28U做行车记录仪,连续写入几个月没出过坏块。
- H28H系列(UFS 3.1):面向旗舰手机,支持HS-Gear 4,顺序读取可达2.1GB/s。我在移植这个系列时发现,它的电源管理状态机比上一代多了两个状态,驱动里要额外处理。
- H28V系列(UFS 4.0):最新旗舰,支持HS-Gear 5,顺序读取超过4GB/s。这个系列引入了Inline Encryption Engine,驱动里需要配置加密上下文。
- 车规级系列:支持宽温范围(-40°C到105°C),带ECC和CRC硬件校验。我建议做车规项目的朋友,重点关注它的增强型电源管理特性。
海力士的UFS芯片内部结构大致如下:
+------------------+ +------------------+
| UFS Host | | UFS Device |
| (SoC侧) | | (海力士芯片) |
| | | |
| UFSHCI控制器 |<--->| UFS协议引擎 |
| (DMA + 中断) | | (命令解析) |
+------------------+ +------------------+
| |
| MIPI M-PHY | NAND Flash
| (差分信号) | (多Die/多Plane)
v v
+----------+ +------------------+
| 物理层 | | FTL层 |
| (PCB走线)| | (坏块管理/GC) |
+----------+ +------------------+
上图是我自己画的一个简化结构。你注意看,UFS设备内部其实是一个完整的嵌入式系统,有协议引擎、FTL层、NAND阵列。驱动开发时,你不需要关心FTL怎么管理坏块,但必须理解命令是怎么封装成UPIU(UFS Protocol Information Unit)的。
好了,第一章的内容就到这里。UFS协议的核心思想就是全双工+命令队列,eMMC的并行总线已经走到头了,海力士的产品线覆盖很全,选型时注意匹配你的性能需求和温度等级。
下一章我们会深入UFS驱动框架,讲Linux内核里的UFSHCI驱动怎么初始化、怎么发送命令。到时候我会拿海力士H28U的代码做例子,手把手带你过一遍。
公众号:蓝海资料掘金营,微信deep3321