UFS中也有吉祥三宝,那就是描述符(Descriptors)、标识(Flags)和属性(Attributes),主机通过这三宝,来控制与管理UFS设备。
- 描述符
描述符是一块或者一页参数用以描述一个UFS设备,比如,UFS有整个UFS设备的描述符 (Device Descriptor),UFS设备的配置描述符(Configuration Descriptor),每一个LU还有其描述符(Unit Descriptor),等等。下面是UFS里面所有种类的描述符。
除了配置描述符和OEM_ID字符串描述符,所有的描述符都是只读的,即UFS设备一旦出厂,主机是不能对它进行修改。
还记得Query Request UPIU吗?主机是通过设备管理器来访问这些描述符的。
主机读描述符:
主机通过发Query Request UPIU给UFS设备,然后设备通过Query Response UPIU返回描述符数据。
主机写描述符:
主机如果想更改配置,可以写配置描述符。主机要写入的数据包含在Query Request UPIU中,一旦UFS设备更新完,返回Query Response UPIU。
我们简单过一下上面的这些描述符,更加详细的描述大家可以自行看UFS spec。
UFS设备只有一个,所以只有一个设备描述符;
一共有32个普通LU,每个LU有一个逻辑单元描述符,所以最多有32个逻辑单元描述符;
每8个LU有一个配置描述符,所以一共最多4个配置描述符。
1. 设备描述符
设备描述符就是描述整个UFS设备属性的描述符,这些参数在UFS设备出厂时就由厂家设置好,主机对它只可读不可写。
上面只是截取了一部分设备描述符数据结构内容,有关完整的设备描述符内容,大家可以看spec。
前面说了设备描述符是只读属性,为什么我们看到设备描述符里的有些项是可配置的呢?设备描述符的确只可能读不可写,但是主机通过写配置描述符(主机可写),然后这些项的变化就反映到设备描述符里来了。
UFS设备只有一个,所以一共只有一个设备描述符。
2. 逻辑单元(LU)描述符
逻辑单元描述符用来描述某个具体LU的特性和能力,比如该LU逻辑块大小、该逻辑块是不是存有启动代码、该逻辑块内存类型等等。
对于逻辑单元描述符中可配置的项,主机可以通过写配置描述符进行相应的更改。
3. 配置描述符
用户想对UFS做一些配置,或者使能/禁止一些feature, 可以通过写配置描述符达到目的。这些项的更新会反映到设备描述符或者逻辑单元描述符上。注意只有在属性(Attribute)bConfigDescrLock = 0时才可以写配置描述符,即配置描述符没有被锁住,配置描述符才能写,否则也是只读的。
UFS2.1有32个普通的LU,每8个LU有个配置描述符,所以一共有4个描述符。
拿出一个配置描述符来看看它的格式。
该配置描述符,包含了设备描述符可配置的参数和LU 0-7中可配置的参数。
举例来说,bBootEnable是设备描述符中一个可配置的项。它在出厂设置时bBootEnable = 0,用户在使用UFS设备时,把启动代码存放在UFS设备上,因此,为使能Boot feature, 用户须通过写配置描述符把该比特置起来:bBootEnable = 1。然后,主机在读取设备描述符的时候,会看到bBootEnable 变成了1。
除了配置UFS设备,配置描述符还可以对每一个LU进行配置。
比如,主机可以通过写配置描述符,使能某个LU,或者设置某个LU的逻辑块大小,以及其它和LU相关的配置。
UFS中还有其它的一些描述符,这里就不一一细看。
我们接下里看看另一宝:标志(flags)。
- 标志(flags)
UFS中的标志其实就是一些开关,布尔型,非0即1,打开或者关闭。这些标志可以用来使能或者禁止UFS设备的一些功能、模式或者状态。
在UFS2.1协议中,一共有以下一些标志:
主机也是通过设备管理器的Query Request UPIU来读取或者写标志。
- 属性(Attributes)
如果说flags是布尔类型,那么属性就是C语言中的枚举类型。属性的值不仅仅是0或者1,它是一定数字范围的。属性可以表示设备的一些状态,比如当前设备后台任务的状态。有些属性,主机只可读,有些属性,主机可以写。
主机也是通过设备管理器的Query Request UPIU来读取或者写属性。