0 前言概览
上一篇文章中我们介绍Hibernate模式时有提到UIC层的MIPI Unipro和M-PHY, 那么UFS的整体架构参考下图,本文会进入到UTP层和UCS层,依据JESD220F内容来介绍一下UFS设备和主机之间的信息传输是什么样的。
1 UFS整体结构概览
我们本篇文章主要学习讲述的部分就是下图中圈出部分,知道UFS内的信息传输的结构之前需要先了解一下,UFS的整体架构。
1.1 UIC 内联层
UIC:UFS InterConnect Layer,
这是UFS的最底层,他的作用是掌管UFS host和UFS device之间的连接,UIC层包含MIPI Unipro和MIPI M-PHY ,如下图两侧的UIC所示,它是一个物理层,形象的可以把他理解为Host和device之前的桥梁吧。
1.2 UTP 协议传输层
UTP:UFS Transport Protocol Layer
他的作用就是提供灵活的数据包结构,协助UFS控制器封装指令,通过这种命令单元在UFS host和UFS device的UTP层之间传输,这个单元他就是 UPIU(UFS Protocol Information Unit)。如果继续前面桥梁的寓意的话,UTP就相当于桥上运输的一个个包裹,并且有一定的运输规则,例如我从一端传输过去一个请求类型的包裹,那么另一端需要给我这一端返回一个“我已经准备就绪”的包裹,诸如此类,具体有什么运输规则我这里不做展开,这里只做概念性介绍。
1.3 UAP应用层
UAP:UFS Application Layer
它处于UFS协议栈的最顶层所有的命令或者请求都来自于这里,这一层包含UCS和Task manager。其中UCS:UFS Command Set是命令集层负责命令的生成,UFS使用的是简化的SCSI命令,它使用了SCSI的SBC(SCSI Block Commands)和SPC(SCSI Primary Commands)命令,这两种类型命令都共享着相似的CDB(command descriptor block)格式。所以UAP层可以理解为生成包裹中的内容并管理包裹的角色。
1.4 小结
本节简单进行UAP, UTP, UIC层的概念描述,大致了解假如host想要从UAP->UTP->UIC传输一个命令给device,总体上三步:第一UAP层生成一个命令,第二UTP层打包命令,第三UIC层传输命令给到device侧的UIC。
2 UPIU & UCS
上面我们大致了解了UFS架构中都有哪些层,下面我们了解UPIU作为信息传递的单元都有哪些种类型,以及UFS使用的命令集都有什么,以及这两者之间的关系。
2.1 UPIU介绍
UPIU都有一定的结构格式固定的大小:basic header+额外字段(用于支持不同的传输类型)
UPIU的basic header格式如下:
如下图所示UPIU一共有12种不同的类型,不同的类型就具体体现在basic header中,每个类型都有一个特定的transaction code,transaction code的bit 5表示传输方向,简单来记忆下面12种类型的UPIU传输方向的话,所有xxx OUT、COMMAND、xxx REQUEST都是host到device的,其他的都是device到host的。
每一种UPIU的不同basic header中的详细内容请查阅JESD 220F 10.7章节
UPIU就像一个框架,搭好了框架,往每个部分中放入不同的内容,这些内容就是UFS SCSI commands。
2.2 UCS介绍
2.2.1 UFS SCSI commands内容
JEDEC中介绍说UFS command包含native command和SCSI command但是一直到最新的JEDEC也没有更新native command的内容,因此目前UFS使用的命令就是部分SCSI命令,
包含SPC & SBC,如下图所示为当前UFS使用的所有的SCSI命令:
当然所有上述UFS SCSI command都有各自一定的格式,具体每一种command的结构可以在JESD220F 11.3章中查找到,在此选择一个command来展示其格式,如下为READ(6) command。
2.2.2 UFS SCSI command与UPIU的关系
每一个command都会有一个command CDB, 这个CDB会通过一个COMMAND UPIU来发送,还是以READ(6) command为例子,如下图所示每一个READ command 的CDB内容与结构就对应UPIU中的CDB部分,UPIU包着SCSI command。
2.3 小结
本小节主要讲了UPIU个类型、结构体,UFS SCSI 命令的类型结构,以及这两者之间的关系,下篇文章将从host controller的角度来看一下driver驱动中怎么打包一个上述的命令并传递给UFS设备的。