UFS 应用(UAP)层 – SCSI 命令
UFS 应用 (UAP) 层 – SCSI 命令, UFS 设备支持的强制性命令集的介绍
11.1 通用闪存存储命令层(UCL)简介
本章定义了 UFS 设备支持的强制性命令集。
命令可能属于 UFS 原生命令集或 UFS SCSI 命令集。
此版本的标准未定义 UFS 原生命令。未来可能会定义这些命令集以支持特定的闪存存储或 UFS 原生基本需求。
UFS SCSI 命令集 (USC) 包含选自 SCSI 主命令 (SPC) 和 SCSI 块命令 (SBC) 的部分命令。这两种命令类型共享相似的命令描述块 (CDB) 格式。
UFS 架构图显示了命令层位于传输协议层之上,互连层之下。

11.1.1 命令描述块 (CDB)
SCSI 命令通过向设备发送 SCSI 命令描述块 (CDB) 进行通信。与 SCSI 不同(SCSI 具有额外的可变长度 CDB 格式),UFS 只有固定长度的 CDB 格式。
所有 UFS CDB 的第一个字节应有一个操作码 (OPERATION CODE) 字段,这些值应由每个 SCSI 和 UFS 定义。详细的 SCSI CDB 用法和结构在 SPC 标准的相关章节中定义。
通用 CDB 字段在 SPC 标准的相应章节中定义。
操作码 (Operation code)
SCSI 和 USC CDB 的第一个字节应包含一个操作码,用于标识 CDB 请求的操作。
CDB 的操作码包含一个组码 (GROUP CODE) 字段和命令码 (COMMAND CODE) 字段。组码字段提供八个命令码组,命令码字段在每个组中提供三十二个命令码,更多细节请参见 SPC 标准。
11.2 通用闪存存储原生命令 (UNC)
UFS 原生命令在此版本的标准中未定义,如果需要,可能在未来的版本中定义。
11.3 通用闪存存储 SCSI 命令
基本的通用闪存存储 (UFS) SCSI 命令与 SCSI 主命令 - 4 [SPC] 和 SCSI 块命令 - 3 [SBC] 兼容。
如果启用 (bLUEnable = 01h),每个逻辑单元应支持表 11.1 中定义为强制性的命令。

11.3.1 UFS 中 SCSI 命令的通用信息
每个命令的专用段落提供:CDB 表、简要命令描述、相关命令字段、关于强制性和可选特性的详细信息以及其他一些基本信息。
CONTROL (控制)
CONTROL 字节出现在多个 CDB 中,其定义在 [SAM] 中。本标准中不使用 CONTROL 字节:CONTROL 字节应设置为零,并且 UFS 设备应忽略它。不支持供应商特定解释,并假定为 Normal ACA(自动偶然随从)。
自动偶然随从 (Auto contingent allegiance, ACA)
建立 ACA 条件时,应用客户端可以请求设备服务器在命令以 CHECK CONDITION(检查条件)状态终止时更改命令处理。
UFS 设备不支持 ACA。
11.3.2 INQUIRY (查询) 命令
INQUIRY 命令(见表 11.2)是请求将有关逻辑单元和 UFS 目标设备的信息发送到应用客户端。

11.3.2.1 重要产品数据 (VITAL PRODUCT DATA)
当 EVPD = 1 时,设备服务器应返回由页代码 (PAGE CODE) 字段指定的重要产品数据,如 [SPC] 所定义。UFS 支持除模式页策略 VPD (Mode Page Policy VPD) 之外的所有重要产品数据是可选的。
11.3.2.2 标准查询数据 (STANDARD INQUIRY DATA)
当 EVPD = 0 且页代码 (Page Code) = 0 时,将响应 INQUIRY 命令的标准查询数据。标准查询数据格式如表 11.3 所示,INQUIRY 数据应至少包含 36 个字节。表 11.4 定义了 UFS 的 INQUIRY 响应数据。

INQUIRY 命令请求将有关逻辑单元和 SCSI 目标设备的信息发送到应用客户端。
应用客户端可在硬复位或上电条件后使用 INQUIRY 命令来确定有关设备的信息以进行系统配置。如果在存在挂起的单元注意 (UNIT ATTENTION) 条件时接收到 INQUIRY 命令(即在设备服务器报告 CHECK CONDITION 状态之前),设备服务器应执行 INQUIRY 命令。
INQUIRY 信息以标准 INQUIRY 响应数据结构返回(见表 11.3)。
- 客户端请求返回的字节数
- 前 36 个字节定义为 UFS 的标准
- 请求零字节是有效的
- 请求 36 个字节将导致设备返回完整记录
- 请求超过定义的字节数将导致截断为设备定义的最大字节数
即使发生阻止正常命令完成的错误,设备服务器也应处理 INQUIRY 命令
- 当处于 UNIT ATTENTION 状态时
- 在可能影响介质访问的其他条件下
命令 CDB 应在单个 COMMAND UPIU 中发送
11.3.2.3 Inquiry 命令数据响应
- 从 INQUIRY 命令返回的数据将在单个 DATA IN UPIU 中传输到应用客户端
- 设备服务器将在 DATA IN UPIU 的数据段 (Data Segment) 区域中传输响应数据
- 分配长度 (Allocation Length) 为零表示不应传输任何数据。此情况不应视为错误,并且不应生成 DATA IN UPIU。
- 如果发生错误,则不会传输 DATA IN UPIU
- 对于标准查询数据 (Standard INQUIRY Data),
- 设备服务器应返回的字节数等于 36 和分配长度中指定的值之间的最小值。
- 标准查询响应数据如表 11.4 所示。

11.3.2.5 Inquiry 命令状态响应
- 状态 (STATUS) 响应将在单个 RESPONSE UPIU 中发送
- 如果请求的数据成功传输,INQUIRY 命令将以 GOOD(良好)状态响应终止
- 如果单元未准备好接受新命令(例如,仍在处理先前的命令),则将返回 BUSY(忙)状态响应
- 当 INQUIRY 命令失败时,将返回 CHECK CONDITION(检查条件)状态响应以及相应的感知键 (SENSE KEY),例如:
- ILLEGAL REQUEST(非法请求)(范围或 CDB 错误)
- HARDWARE ERROR(硬件错误)(硬件故障)
- 不会因挂起的单元注意 (UNIT ATTENTION) 条件而失败
11.3.3 MODE SELECT (10) (模式选择) 命令
MODE SELECT 命令为应用客户端提供了一种向设备服务器指定介质、逻辑单元或外设设备参数的方法。
- 参数通过称为模式页 (mode pages) 的参数页进行管理
- UFS 设备应支持以下模式页
- CONTROL(控制), CACHING(缓存), READ-WRITE ERROR RECOVERY(读写错误恢复)
- UFS 设备可能支持供应商特定的模式页
- 详见 11.4 节。
- UFS 设备应支持以下模式页
- 将参数写入列表中的一个或多个模式页
- 应用客户端可以在单个命令中指定单个、多个或所有支持的页
- 是 MODE SENSE 命令的互补命令
命令 CDB 应在单个 COMMAND UPIU 中发送

11.3.3.2 模式选择命令数据传输
设备服务器通过发出一个或多个 READY TO TRANSFER UPIU (RTT) 请求,请求从应用客户端的数据输出缓冲区 (data-out buffer) 传输模式参数列表。
模式参数列表按照 RTT 请求中的指示,在一个或多个段中通过 DATA OUT UPIU 数据包传送。
如果整个数据传输完成之前发生错误,则可能请求零个或不完整数量的段。
如果命令成功完成,则模式参数将按照接收到的模式参数列表中的指定进行更改。
有关模式参数列表的详细信息,请参见 11.4.1.2 节“模式参数列表格式”。
11.3.3.3 模式选择命令状态响应
- 状态 (STATUS) 响应将在单个 RESPONSE UPIU 中发送
- 如果请求的数据成功传输并写入,MODE SELECT 命令将以 GOOD(良好)状态响应终止
- 如果单元未准备好接受新命令(例如,仍在处理先前的命令),则将返回 BUSY(忙)状态响应
- 失败可能由多种原因引起。当 MODE SELECT 命令失败时,将返回 CHECK CONDITION(检查条件)状态响应以及相应的感知键 (SENSE KEY),例如:
- ILLEGAL REQUEST(非法请求)(CDB 或参数错误)
- MEDIUM ERROR(介质错误)(介质故障、ECC 等)
- HARDWARE ERROR(硬件错误)(硬件故障)
- UNIT ATTENTION(单元注意)(复位、上电等)
11.3.6 READ (10) (读取) 命令
READ (10) 命令(见表 11.11)请求设备服务器从介质读取指定数量的逻辑块并将它们传输到应用客户端。
命令 CDB 应在单个 COMMAND UPIU 中发送

11.3.6.1 Read (10) 命令参数
-
DPO = 禁用页换出 (Disable Page Out)
“0” = 指定保留优先级应由缓存模式页 (Caching mode page) 中的 RETENTION PRIORITY(保留优先级)字段确定。
“1” = 指定设备服务器应为此命令访问的逻辑块分配用于提取到缓存或保留在缓存中的最低保留优先级。DPO 位设置为 1 会覆盖缓存模式页中指定的任何保留优先级。
-
FUA: 强制单元访问 (Force Unit Access)
‘0’ = 设备服务器可以从缓存和/或介质读取逻辑块。
‘1’ = 设备服务器应从介质读取逻辑块。如果缓存包含逻辑块的更新版本,则设备服务器应在读取之前将该逻辑块写入介质。
-
FUA_NV 根据 SBC 定义。由于本标准当前未定义非易失性缓存支持,UFS 设备服务器将忽略 CDB 中的 FUA_NV 参数值。
-
逻辑块地址 (LOGICAL BLOCK ADDRESS): 第一个块的地址
-
传输长度 (TRANSFER LENGTH): 应读取和传输的连续逻辑块数据数量。传输长度为零表示不会读取任何逻辑块。此情况不应视为错误。
-
组号 (GROUP NUMBER): 通知目标设备数据链接到 ContextID:

如果组号设置为保留值,则操作将失败,并返回 CHECK CONDITION(检查条件)状态响应,感知键设置为 ILLEGAL REQUEST(非法请求)。
11.3.6.2 Read (10) 命令数据传输
- 设备服务器将从介质读取指定的逻辑块,并通过一系列 DATA IN UPIU 将它们传输到应用客户端
- 每个 DATA IN UPIU 的数据段应包含整数个逻辑块
- 如果在整个数据传输完成之前发生读取错误,则可能传输零个或不完整数量的 DATA IN UPIU。
11.3.6.3 Read (10) 命令状态响应
-
状态响应将在单个 RESPONSE UPIU 中发送
-
如果所有请求的数据成功读取并传输,READ 命令将以 GOOD(良好)状态响应终止
-
如果单元未准备好接受新命令(例如,仍在处理先前的命令),则将返回 BUSY(忙)状态响应
-
失败可能由多种原因引起。当 READ 命令失败时,将返回 CHECK CONDITION(检查条件)状态响应以及相应的感知键 (SENSE KEY),例如:
o ILLEGAL REQUEST(非法请求)(范围或 CDB 错误)
o MEDIUM ERROR(介质错误)(介质故障、ECC 等)
o HARDWARE ERROR(硬件错误)(硬件故障)
o UNIT ATTENTION(单元注意)(复位、上电等)
o 等等。
11.3.8 READ CAPACITY (10) (读容量) 命令
READ CAPACITY (10) 命令为应用客户端提供了一种发现逻辑单元容量的方法。有关 READ CAPACITY (10) 命令的更多详细信息,请参阅 [SBC]。
- READ CAPACITY (10) 命令请求设备服务器传输 8 字节的参数数据,描述直接访问块设备的容量和介质格式。
命令 CDB 应在单个 COMMAND UPIU 中发送。

11.3.8.1 读容量 (10) 数据响应
- 从 READ CAPACITY (10) 命令返回的数据将在单个 DATA IN UPIU 中传输到应用客户端
- 设备服务器将在 DATA IN UPIU 的数据段区域中传输 8 字节的容量数据
- 数据将以如下所述的指示的读容量参数格式返回。
- 如果发生错误,则不会传输 DATA IN UPIU

11.3.8.2 读容量 (10) 参数数据
- 返回的逻辑块地址 (RETURNED LOGICAL BLOCK ADDRESS): 逻辑单元 (LU) 控制下的介质上最后一个可寻址块
- 如果逻辑块的数量超过 RETURNED LOGICAL BLOCK ADDRESS 字段能够指定的最大值,则设备服务器应将 RETURNED LOGICAL BLOCK ADDRESS 字段设置为 FFFF FFFFh。应用客户端随后应发出 READ CAPACITY (16) 命令,请求设备服务器将 READ CAPACITY (16) 参数数据传输到数据输入缓冲区。
- 逻辑块长度(以字节计)(LOGICAL BLOCK LENGTH IN BYTES): 块大小(以字节为单位)
- 对于 UFS,最小大小应为 4096 字节
11.3.8.3 读容量 (10) 状态响应
- 状态 (STATUS) 响应将在单个 RESPONSE UPIU 中发送
- 如果请求的数据成功传输,READ CAPACITY 命令将以 GOOD(良好)状态响应终止
- 如果单元未准备好接受新命令(例如,仍在处理先前的命令),则将返回 BUSY(忙)状态响应
- 失败可能由多种原因引起。当 READ CAPACITY 命令失败时,将返回 CHECK CONDITION(检查条件)状态响应以及相应的感知键 (SENSE KEY),例如:
- ILLEGAL REQUEST(非法请求)(范围或 CDB 错误)
- HARDWARE ERROR(硬件错误)(硬件故障)
- UNIT ATTENTION(单元注意)(复位、上电等)
- 等等。
11.3.10 START STOP UNIT (启动停止单元) 命令
START STOP UNIT 命令请求设备服务器更改逻辑单元的电源条件或加载或弹出介质。
- 通过控制电源启用或禁用直接访问块设备进行介质访问操作。
命令 CDB 应在单个 COMMAND UPIU 中发送。

IMMED = 0 : 操作完成后返回状态 (RESPONSE UPIU)
IMMED = 1 : 解码 CDB 后返回状态
11.3.10.1 START STOP UNIT 参数
电源条件修饰符 (Power Condition Modifier) 在 UFS 规范中应设置为 '0'(保留)。
其他参数的使用在电源模式 (Power Mode) 部分定义。
11.3.10.2 启动停止单元数据响应
- START STOP UNIT 命令没有数据阶段
- 不传输 DATA IN 或 DATA OUT UPIU
11.3.10.3 启动停止单元状态响应
-
状态 (STATUS) 响应将在单个 RESPONSE UPIU 中发送
-
如果 CDB 中的 IMMED = 1,状态响应将在设备操作完成之前发送给应用客户端
o 通常用于关机
-
如果请求的操作成功,START STOP UNIT 命令将以 GOOD(良好)状态响应终止
-
如果单元未准备好接受新命令(例如,仍在处理先前的命令),则将返回 BUSY(忙)状态响应
-
失败可能由少数原因引起。当 START STOP UNIT 命令失败时,将返回 CHECK CONDITION(检查条件)状态响应以及相应的感知键 (SENSE KEY),例如:
o ILLEGAL REQUEST(非法请求)(范围或 CDB 错误)
o HARDWARE ERROR(硬件错误)(硬件故障)
o UNIT ATTENTION(单元注意)
11.3.11 TEST UNIT READY (测试单元就绪) 命令
TEST UNIT READY 命令提供了一种检查逻辑单元是否就绪的方法。这不是自检请求。
- 如果逻辑单元能够接受适当的介质访问命令而不返回 CHECK CONDITION 状态,则此命令应返回 GOOD 状态。
- 如果逻辑单元无法进入操作状态或处于需要应用客户端操作(例如,START UNIT 命令)才能使逻辑单元就绪的状态,则该命令应以 CHECK CONDITION 状态终止,感知键 (sense key) 设置为 NOT READY (02h)。
命令 CDB 应在单个 COMMAND UPIU 中发送

11.3.11.1 测试单元就绪数据响应
- TEST UNIT READY 命令没有数据响应
- 不传输 DATA IN 或 DATA OUT UPIU
11.3.11.2 测试单元就绪状态响应
- 状态 (STATUS) 响应将在单个 RESPONSE UPIU 中发送。
- 如果命令成功且无错误,TEST UNIT READY 命令将以 GOOD(良好)状态响应终止
- 如果单元未准备好接受新命令(例如,仍在处理先前的命令),则将返回 BUSY(忙)状态响应
- 失败可能由多种原因引起。当 TEST UNIT READY 命令失败时,将返回 CHECK CONDITION(检查条件)状态响应以及相应的感知键 (SENSE KEY),例如:
- ILLEGAL REQUEST(非法请求)(CDB 错误)
- HARDWARE ERROR(硬件错误)(硬件故障)
- UNIT ATTENTION(单元注意)(复位、上电等)
- 等等。
11.3.12 REPORT LUNS (报告逻辑单元) 命令
REPORT LUNS 命令请求将外设设备逻辑单元清单发送到应用客户端。
- 逻辑单元清单是一个列表,应包含 UFS 应用客户端可访问的所有逻辑单元的逻辑单元号 (logical unit numbers)
- 如果在存在挂起的单元注意 (unit attention) 条件时接收到 REPORT LUNS 命令(即在设备服务器报告 CHECK CONDITION 状态之前),设备服务器应执行 REPORT LUNS 命令
命令 CDB 应在单个 COMMAND UPIU 中发送

11.3.12.1 报告逻辑单元命令参数
SELECT REPORT: 指定应报告的逻辑单元地址类型。可用的报告类型列在表 11.21 中。UFS 将支持所有报告类型。
ALLOCATION LENGTH: 指定应用客户端为数据接收分配的缓冲区空间的最大字节数。

11.3.12.2 报告逻辑单元命令选择报告字段值

11.3.12.3 报告逻辑单元数据响应
- 从 REPORT LUNS 命令返回的数据将在一个或多个 DATA IN UPIU 中传输到应用客户端
- 很可能是一个 DATA IN UPIU
- 设备服务器将向应用客户端传输小于或等于分配长度 (Allocation Length) 的数据字节数。
- 如果设备服务器的总数据量少于请求的数据量,则传输较少
- 数据将按照以下描述的指示参数数据格式返回。
- 每个可报告的逻辑单元将产生 8 字节的数据。
11.3.12.4 报告逻辑单元参数数据格式
- 总列表长度 = LUN 列表长度 + 8(即 8 * LUN 数量 + 8)
- 每个 LUN 记录长度为 8 字节
- UFS 使用两种格式:
- 使用外设设备寻址方法的单级 LUN 结构
- 知名逻辑单元扩展寻址格式
11.3.12.5 报告逻辑单元 LUN 寻址格式
- 用于知名逻辑单元寻址的格式
- W-LUN = 知名逻辑单元号 (Well Known Logical Unit Number)
- 对于 UFS: 00h <= W-LUN <= 7Fh
- 注意 预期值是 SCSI LUN,而不是 UPIU 中的 LUN 字段。
11.3.12.6 报告逻辑单元状态响应
- 状态响应将在单个 RESPONSE UPIU 中发送
- 如果所有请求的数据成功读取并传输,REPORT LUNS 命令将以 GOOD(良好)状态响应终止
- 当存在挂起的单元注意 (UNIT ATTENTION) 条件时,REPORT LUNS 命令将成功
- 失败可能由极少数原因引起,主要是 CDB 中的非法值。当 REPORT LUNS 命令失败时,将返回 CHECK CONDITION(检查条件)状态响应以及相应的感知键 (SENSE KEY),例如:
- ILLEGAL REQUEST(非法请求)(CDB 错误)
11.3.12.7 UFS LUN 格式
UPIU 中的 UFS 8 位 LUN 字段支持两种类型的 LUN 寻址:
- 如果 WLUN_ID 位 = '0',则 UNIT_NUMBER_ID 字段寻址标准逻辑单元 (LUN)
- 如果 WLUN_ID 位 = '1',则 UNIT_NUMBER_ID 字段寻址知名逻辑单元 (W-LUN)
最多 128 个 LUN 和最多 128 个 W-LUN

11.3.15 WRITE (10) (写入) 命令
WRITE (10) UFS 命令请求设备服务器从应用客户端传输指定数量的逻辑块并将它们写入介质。
命令 CDB 应在单个 COMMAND UPIU 中发送。

11.3.15.1 写入 (10) 命令参数
-
DPO: 禁用页换出 (Disable Page Out)
“0” = 指定保留优先级应由缓存模式页 (Caching mode page) 中的 RETENTION PRIORITY(保留优先级)字段确定。
“1” = 指定设备服务器应为此命令访问的逻辑块分配用于提取到缓存或保留在缓存中的最低保留优先级。DPO 位设置为 1 会覆盖缓存模式页中指定的任何保留优先级。
-
FUA: 强制单元访问 (Force Unit Access)
o ‘0’ = 设备服务器应将逻辑块写入缓存和/或介质。
o ‘1’ = 设备服务器应将逻辑块写入介质,并且在所有逻辑块无误地写入介质之前,不得以 GOOD 状态完成命令。
-
FUA_NV 根据 SBC 定义。由于本标准当前未定义非易失性缓存支持,UFS 设备服务器将忽略 CDB 中的 FUA_NV 参数值。
-
逻辑块地址 (LOGICAL BLOCK ADDRESS): 第一个块的地址
-
传输长度 (TRANSFER LENGTH): 应传输和写入的连续逻辑块数据数量。传输长度为零表示不会写入任何逻辑块。此情况不应视为错误。
-
组号 (GROUP NUMBER): 通知目标设备数据具有系统数据特征或链接到 ContextID:
如果组号设置为保留值,则操作将失败,并返回 CHECK CONDITION(检查条件)状态响应,感知键设置为 ILLEGAL REQUEST(非法请求)。
11.3.15.2 写入(10) 命令数据传输
设备服务器通过发出一系列 READY TO TRANSFER UPIU (RTT),请求从应用客户端的数据输出缓冲区传输指定的逻辑块。
数据按照 RTT 请求中的指示,在一个或多个段中通过发送 DATA OUT UPIU 数据包传送。DATA OUT UPIU 中包含的数据被写入。
每个 RTT 中请求的字节数和数据缓冲区偏移 (Data Buffer Offset) 字段都应是逻辑块大小 (bLogicalBlockSize) 的整数倍。
每个 DATA OUT UPIU 的数据段应包含整数个逻辑块。
如果整个数据传输完成之前发生错误,则可能请求零个或不完整数量的段。
11.3.15.3 写入 (10) 命令状态响应
- 状态 (STATUS) 响应将在单个 RESPONSE UPIU 中发送。
- 如果所有请求的数据成功传输并写入,WRITE 命令将以 GOOD(良好)状态响应终止。
- 如果逻辑块直接传输到缓存,则设备服务器可以在将逻辑块写入介质之前以 GOOD 状态完成命令。
- 如果单元未准备好接受新命令(例如,仍在处理先前的命令),则将返回 BUSY(忙)状态响应。
- 失败可能由多种原因引起。当 WRITE 命令失败时,将返回 CHECK CONDITION(检查条件)状态响应以及相应的感知键 (SENSE KEY),例如:
- ILLEGAL REQUEST(非法请求)(范围或 CDB 错误)
- MEDIUM ERROR(介质错误)(介质故障、ECC 等)
- HARDWARE ERROR(硬件错误)(硬件故障)
- UNIT ATTENTION(单元注意)(复位、上电等)
- DATA PROTECT(数据保护)(永久、上电、安全写保护等)
- 等等。
11.3.17 REQUEST SENSE (请求感知数据) 命令
REQUEST SENSE 命令请求设备服务器将包含感知数据信息的参数数据传输到应用客户端。
- 感知数据 (Sense Data) 描述错误或异常条件和/或设备的当前操作状态
- 即,获取设备“状态”
- UFS 设备将返回一个固定格式的数据记录,包含 18 字节的感知数据,如表 10.19 所述。
- 用于详细状态的三层错误代码
- 感知键 (Sense Key): 主要指示符
- ASC: 附加感知代码 (Additional Sense Code)
- ASCQ: 附加感知代码限定符 (Additional Sense Code Qualifier)
- 如果在存在挂起的单元注意 (UNIT ATTENTION) 条件时接收到 REQUEST SENSE 命令(即在设备服务器报告 CHECK CONDITION 状态之前),设备服务器应执行 REQUEST SENSE 命令并清除单元注意条件。
命令 CDB 应在单个 COMMAND UPIU 中发送

UFS 设备不需要支持描述符格式的感知数据。
11.3.17.1 请求感知数据响应
- 从 REQUEST SENSE 命令返回的数据将在单个 DATA IN UPIU 中传输到应用客户端。
- 设备服务器将在 DATA IN UPIU 的数据段区域中传输最多 18 字节的响应数据。
- 如果 CDB 中的分配长度 >= 18,则返回 18 字节。
- 如果 CDB 中的分配长度 < 18,则返回分配长度字节数。
- 分配长度 (Allocation Length) 为零表示不应传输任何数据。此情况不应视为错误,并且不应生成 DATA IN UPIU。
- 数据将按照 11.3.17.2 节所述的指示感知数据格式返回。
11.3.17.2 感知数据 (Sense Data)
11.3.17.3 感知键 (Sense Key)
11.3.17.4 请求感知状态响应
-
状态 (STATUS) 响应将在单个 RESPONSE UPIU 中发送。
-
如果请求的数据成功传输,REQUEST SENSE 命令将以 GOOD(良好)状态响应终止。
-
如果单元未准备好接受新命令(例如,仍在处理先前的命令),则将返回 BUSY(忙)状态响应。
-
失败非常罕见。当 REQUEST SENSE 命令失败时,将返回 CHECK CONDITION(检查条件)状态响应以及相应的感知键 (SENSE KEY),例如:
oILLEGAL REQUEST(非法请求)(范围或 CDB 错误)。 -
不会因挂起的单元注意 (UNIT ATTENTION) 条件而失败。
-
如果 REQUEST SENSE 命令是在存在挂起的单元注意条件时接收到的,则返回的感知数据将指示单元注意条件的原因,并且设备服务器内的单元注意条件将被清除。
-
如果 REQUEST SENSE 命令以 CHECK CONDITION 状态终止,则设备服务器不应清除挂起的单元注意条件。
11.3.18 FORMAT UNIT (格式化单元) 命令
FORMAT UNIT 命令请求设备服务器按照参数列表中的指定将介质格式化为应用客户端可访问的逻辑块。设备服务器还可以认证介质并创建用于管理介质和缺陷的控制结构。介质被此命令更改的程度是供应商特定的。
发送到设备知名逻辑单元的 FORMAT UNIT 命令请求格式化除 RPMB 知名逻辑单元之外的所有已启用的逻辑单元(参见 12.2.3.4 节“擦除设备 (Wipe Device)”)。
如果介质是写保护的,则该命令应以 CHECK CONDITION 状态终止,感知键设置为 DATA PROTECT。
成功执行格式化操作后,所有 LBA:
a) 在完全配置的逻辑单元 (bProvisioningType 设置为 00h) 上应被映射
b) 在精简配置的逻辑单元 (bProvisioningType 设置为 02h 或 03h) 上应被取消映射
对于格式化逻辑单元中由读取操作指定的 LBA,设备服务器应将所有位设置为零的用户数据发送到数据输入缓冲区。
命令 CDB 应在单个 COMMAND UPIU 中发送。

11.3.18.1 格式化单元命令参数
11.3.18.2 格式化单元命令数据传输
- 如果需要,设备服务器通过发出一系列 READY TO TRANSFER UPIU (RTT),请求从应用客户端的数据输出缓冲区传输 FORMAT UNIT 参数列表。
- FORMAT UNIT 参数列表按照 RTT 请求中的指示,在一个或多个段中通过发送 DATA OUT UPIU 数据包传送。
- 如果整个数据传输完成之前发生错误,则可能请求零个或不完整数量的段。
11.3.18.3 格式化单元命令状态响应
- 状态 (STATUS) 响应将在单个 RESPONSE UPIU 中发送。
- 如果请求的介质格式化成功执行,则命令将以 GOOD(良好)状态响应终止。
- 如果单元未准备好接受新命令(例如,仍在处理先前的命令),则将返回 BUSY(忙)状态响应。
- 其他失败可能由多种原因引起。当 FORMAT UNIT 命令失败时,将返回 CHECK CONDITION(检查条件)状态响应以及相应的感知键 (SENSE KEY),例如:
- ILLEGAL REQUEST(非法请求)(范围或 CDB 错误)
- MEDIUM ERROR(介质错误)(介质故障、ECC 等)
- HARDWARE ERROR(硬件错误)(硬件故障)
- UNIT ATTENTION(单元注意)(复位、上电等)
- DATA PROTECT(数据保护)(永久、上电、安全写保护等)
- 等等。
11.3.26 UNMAP (取消映射) 命令
UNMAP 命令应要求设备服务器取消映射(取消分配)一个或多个 LBA。
UFS 定义逻辑单元应为完全配置 (Full Provisioning) 或精简配置 (Thin Provisioning),如 SCSI SBC 中所述。要使用 UNMAP 命令,SCSI SBC 要求逻辑单元是精简配置的并支持逻辑块配置管理。完全配置的逻辑单元不支持 UNMAP 命令。
在 UFS 中,精简配置的逻辑单元在用户配置设备时应具有足够的物理内存资源来支持逻辑块地址空间。映射状态 (Mapped State) 和取消分配状态 (De-Allocated State) 在 UFS 精简配置逻辑单元中是强制性的。

- 组号 (GROUP NUMBER) = ‘0’
- UFS 的 ANCHOR = 0。如果 ANCHOR = 1,设备服务器应以 CHECK CONDITION 状态终止命令,感知键设置为 ILLEGAL REQUEST,附加感知代码设置为 INVALID FIELD IN CDB。
- 参数列表长度 (PARAMETER LIST LENGTH) 字段指定从应用客户端发送到设备服务器的 UNMAP 参数数据的长度(以字节为单位)。
11.3.26.1 UNMAP 参数列表
UNMAP 参数列表包含应用客户端随 UNMAP 命令发送的数据。数据中包含 UNMAP 参数列表头和用于 LBA 范围的块描述符,供设备服务器处理 UNMAP 命令使用。块描述符中指定的 LBA 可能包含重叠的范围,并且可以是任意顺序。

- UNMAP 数据长度 (UNMAP DATA LENGTH) 字段指定可从数据输出缓冲区传输的后续数据的长度(以字节为单位)。取消映射数据长度不包括 UNMAP DATA LENGTH 字段中的字节数。
- UNMAP 块描述符数据长度 (UNMAP BLOCK DESCRIPTOR DATA LENGTH) 字段指定可从数据输出缓冲区传输的 UNMAP 块描述符的长度(以字节为单位)。取消映射块描述符数据长度应为 16 的倍数。如果取消映射块描述符数据长度不是 16 的倍数,则最后一个取消映射块描述符不完整,应被忽略。如果 UNMAP BLOCK DESCRIPTOR DATA LENGTH 设置为零,则 UNMAP 参数数据中不包含取消映射块描述符。此情况不应视为错误。
- UNMAP 逻辑块地址 (UNMAP LOGICAL BLOCK ADDRESS) 字段包含要取消映射的 UNMAP 块描述符的第一个 LBA。
- 逻辑块数量 (NUMBER OF LOGICAL BLOCKS) 字段包含要取消映射的 LBA 数量,从 UNMAP LOGICAL BLOCK ADDRESS 字段指定的 LBA 开始。
- 为了最小化性能下降,要取消映射的整个 LBA 区域应尽可能与单元描述符 (Unit Descriptor) 中的 bOptimalWriteBlockSize 值对齐(但不是必需的)。
- 如果逻辑块数量 (NUMBER OF LOGICAL BLOCKS) 设置为零,则不应为此 UNMAP 块描述符取消映射任何 LBA。此情况不应视为错误。
- 如果 UNMAP LOGICAL BLOCK ADDRESS 字段指定的 LBA 加上逻辑块数量超过介质的容量,则设备服务器应以 CHECK CONDITION 状态终止命令,感知键设置为 ILLEGAL REQUEST,附加感知代码设置为 LOGICAL BLOCK ADDRESS OUT OF RANGE。
- 如果 UFS 设备不支持块限制 VPD 页 (Block Limits VPD page),则最大取消映射 LBA 计数 (MAXIMUM UNMAP LBA COUNT) 值和最大取消映射块描述符计数 (MAXIMUM UNMAP BLOCK DESCRIPTOR COUNT) 值定义如下:
- 最大取消映射 LBA 计数 (MAXIMUM UNMAP LBA COUNT) = READ CAPACITY 中报告的 LBA 计数
- 最大取消映射块描述符计数 (MAXIMUM UNMAP BLOCK DESCRIPTOR COUNT) = 1
- 如果设备支持重要产品数据页 (Vital Product Data Page),则设备制造商在块限制 VPD 页中设置最大取消映射 LBA 计数 (MAXIMUM UNMAP LBA COUNT) 和最大取消映射块描述符计数 (MAXIMUM UNMAP BLOCK DESCRIPTOR COUNT)。如果 UNMAP 块描述符数据中指定的逻辑块总数超过块限制 VPD 页中 MAXIMUM UNMAP LBA COUNT 字段指示的值,或者如果 UNMAP 块描述符的数量超过块限制 VPD 页中 MAXIMUM UNMAP BLOCK DESCRIPTOR COUNT 字段的值,则设备服务器应以 CHECK CONDITION 状态终止命令,感知键设置为 ILLEGAL REQUEST,附加感知代码设置为 INVALID FIELD IN PARAMETER LIST。
11.3.26.3 UNMAP 参数列表传输
- 设备服务器通过发出一系列 READY TO TRANSFER UPIU (RTT),请求从应用客户端的数据输出缓冲区传输 UNMAP 参数列表。
- UNMAP 参数列表按照 RTT 请求中的指示,在一个或多个段中通过发送 DATA OUT UPIU 数据包传送。
- 如果整个数据传输完成之前发生错误,则可能请求零个或不完整数量的段。
11.3.26.4 UNMAP 命令状态响应
- 状态 (STATUS) 响应将在单个 RESPONSE UPIU 中发送
- 如果命令成功执行,则将以 GOOD(良好)状态响应终止。
- 如果单元未准备好接受新命令(例如,仍在处理先前的命令),则将返回 BUSY(忙)状态响应。
- 失败可能由多种原因引起。当 UNMAP 命令失败时,将返回 CHECK CONDITION(检查条件)状态响应以及相应的感知键 (SENSE KEY),例如:
- ILLEGAL REQUEST(非法请求)(范围或 CDB 错误)
- MEDIUM ERROR(介质错误)(介质故障、ECC 等)
- HARDWARE ERROR(硬件错误)(硬件故障)
- UNIT ATTENTION(单元注意)(复位、上电等)
- DATA PROTECT(数据保护)(永久、上电、安全写保护等)
- 等等。
11.3.27 READ BUFFER (读取缓冲区) 命令
READ BUFFER 命令与 WRITE BUFFER 命令结合使用,用于:
- 测试逻辑单元缓冲区内存
- 测试服务交付子系统的完整性
- 下载微码
- 检索错误历史和统计信息
READ BUFFER 命令将指定数量的数据字节从设备服务器中指定缓冲区内的指定偏移传输到应用客户端的缓冲区。
命令 CDB 应在单个 COMMAND UPIU 中发送。

11.3.27.1 读取缓冲区命令模式字段值

- 设备应支持模式值 02h,表示数据模式 (Data Mode)。数据模式中传输的数据的定义和结构是设备特定的。
- 设备应支持模式值 1Ch,表示错误历史模式 (Error History Mode)。错误历史的格式是设备特定的。
11.3.27.2 数据模式 (MODE = 02h)
-
缓冲区 ID (BUFFER ID) 字段指定逻辑单元内应从中传输数据的缓冲区。应支持缓冲区 ID 0。如果支持多个缓冲区,则额外的缓冲区 ID 代码应从 1 开始连续分配。
-
缓冲区偏移 (BUFFER OFFSET) 字段包含指定缓冲区内的字节偏移,数据应从此处传输。
-
设备服务器将从设备服务器中由缓冲区 ID 指定的缓冲区偏移处读取最多分配长度 (Allocation Length) 个数据字节,并将它们传输到应用客户端的缓冲区
o 如果设备服务器包含的字节较少,则传输的数据将少于分配长度
-
数据将通过一系列 DATA IN UPIU 从设备服务器传输到应用客户端
o 从设备服务器传输的数据将包含在 DATA IN UPIU 的数据段中
-
如果整个数据传输完成之前发生错误,则可能传输零个或不完整数量的 DATA IN UPIU
11.3.27.3 错误历史模式 (MODE = 1Ch)
- 缓冲区 ID (BUFFER ID) 字段指定设备服务器应执行的操作,以及设备服务器应返回的参数数据(如果有)。
支持能力是供应商特定的,并在设备描述符 (DEVICE DESCRIPTOR) 的 dExtendedUFSFeaturesSupport 字段中指示。
- 在 UFS 标准中,错误历史 LT 连接 (Error History LT nexus) 始终已建立且有效。
- 在 UFS 标准中,不存在错误历史快照。返回的错误历史可能是实时内容,也可能是在供应商特定时间点捕获的内容。
- 缓冲区偏移 (BUFFER OFFSET) 字段指定从缓冲区 ID 字段指定的缓冲区起始处的字节偏移,设备服务器应从此处返回数据。
- 设备服务器将从设备服务器中由缓冲区 ID 指定的缓冲区偏移处读取最多分配长度 (Allocation Length) 个数据字节,并将它们传输到应用客户端的缓冲区
- 如果设备服务器包含的字节较少,则传输的数据将少于分配长度
- 数据将通过一系列 DATA IN UPIU 从设备服务器传输到应用客户端
- 从设备服务器传输的数据将包含在 DATA IN UPIU 的数据段中
- 如果整个数据传输完成之前发生错误,则可能传输零个或不完整数量的 DATA IN UPIU
- 详见 [SPC]。
11.3.27.3.1 错误历史目录 (Error History Directory)
错误历史目录定义在表 11.51 中,错误历史目录条目定义在表 11.53 中。
- T10 供应商标识 (T10 VENDOR IDENTIFICATION) 字段包含八字节左对齐 ASCII 数据,如 [SPC] 中所定义。
- 版本 (VERSION) 字段指示供应商特定错误历史的版本和格式。VERSION 字段由 T10 VENDOR IDENTIFICATION 字段中指示的供应商分配。
- 目录长度 (DIRECTORY LENGTH) 字段指示可用于传输的错误历史目录列表字节数。即使分配长度不足以传输整个错误历史目录列表,此值也不得更改。
- 错误历史来源 (EHS_SOURCE) 字段指示错误历史快照的来源。
错误历史目录列表包含范围从 10h 到 EFh 的每个支持的缓冲区 ID 的错误历史目录条目。第一个条目应为缓冲区 ID 10h,条目应按缓冲区 ID 升序排列。支持的缓冲区 ID 不需要是连续的。不应有任何大于或等于 F0h 的缓冲区 ID 的条目。
- 支持的缓冲区 ID (SUPPORTED BUFFER ID) 字段指示与此条目关联的错误历史缓冲区 ID。
- 最大可用长度 (MAXIMUM AVAILABLE LENGTH) 字段指示由支持的缓冲区 ID (SUPPORTED BUFFER ID) 字段指示的缓冲区中包含的最大数据字节数。实际可用于传输的字节数可能更少。
11.3.27.3.2 使用 READ BUFFER 命令检索错误历史
在 UFS 标准中,不支持错误历史快照 (Error History Snapshot)。返回的错误历史可能是实时内容,也可能是在供应商特定时间点捕获的内容。
错误历史检索操作使用以下机制:
- 检测到设备故障。如果设备在故障后无响应,主机可能需要重置 UFS 设备并重新建立链路,然后再检索错误历史。
- 主机通过发送 READ BUFFER 命令检索错误历史目录,指定:模式 (MODE) = 1Ch, 缓冲区 ID (BUFFER ID) = 00h, 缓冲区偏移 (BUFFER OFFSET) = 零, 以及分配长度 (ALLOCATION LENGTH) 设置为至少 2088(即足够大以传输完整的错误历史目录)。
- 主机检索错误历史。对于错误历史目录中指示的每个范围在 10h 到 EFh 的缓冲区 ID,主机发送一个或多个 READ BUFFER 命令,将缓冲区 ID 设置为错误历史数据缓冲区 ID。在错误历史检索期间,建议主机不要发送除 READ BUFFER 命令之外的任何正常请求,因为其他正常请求可能会更改正在检索的错误历史信息。
11.3.27.4 读取缓冲区命令状态响应
- 状态响应将在单个 RESPONSE UPIU 中发送
- 如果所有请求的数据成功读取并传输,READ BUFFER 命令将以 GOOD(良好)状态响应终止
- 如果单元未准备好接受新命令(例如,仍在处理先前的命令),则将返回 BUSY(忙)状态响应
- 失败可能由多种原因引起。当 READ BUFFER 命令失败时,将返回 CHECK CONDITION(检查条件)状态响应以及相应的感知键 (SENSE KEY),详见 [SPC]。
- ILLEGAL REQUEST(非法请求)(范围或 CDB 错误)
- MEDIUM ERROR(介质错误)(介质故障、ECC 等)
- HARDWARE ERROR(硬件错误)(硬件故障)
- UNIT ATTENTION(单元注意)(复位、上电等)
- 等等。
11.3.28 WRITE BUFFER (写入缓冲区) 命令
WRITE BUFFER 命令与 READ BUFFER 命令结合使用,用于:
- 测试逻辑单元缓冲区内存
- 测试服务交付子系统的完整性
- 现场固件更新 (Field Firmware Update)
- 检索错误历史和统计信息
WRITE BUFFER 命令将指定数量的数据字节从应用客户端的缓冲区传输到设备服务器中指定缓冲区内的指定缓冲区偏移处。
命令 CDB 应在单个 COMMAND UPIU 中发送。

11.3.28.1 写入缓冲区命令参数
11.3.28.2 写入缓冲区命令模式字段值
- 设备应支持模式值 02h,表示数据模式 (Data Mode)。缓冲区 ID (BUFFER ID) 字段指定数据应传输到的缓冲区。缓冲区偏移 (BUFFER OFFSET) 字段指定数据写入的位置。
- 数据模式中传输的数据的定义和结构是设备特定的。
- UFS 设备应支持模式值 0Eh,用于现场固件更新 (Field Firmware Update),如“现场固件更新”一节所定义。
11.3.28.2.1 现场固件更新 (Field Firmware Update)
UFS 现场固件更新 (FFU) 基于 [SPC] 中的微码下载定义。
[SPC] 描述了使用模式 (MODE) 字段选择的多种微码下载操作模式。UFS 仅支持模式字段值 0Eh:“下载带偏移量的微码,保存并延迟激活”。
延迟的微码应在发生上电或硬复位时激活,并不再被视为延迟。请注意,在 UFS 中,START STOP UNIT 命令、FORMAT UNIT 命令或 WRITE BUFFER 命令 (MODE=0Fh) 不会激活微码。
UFS FFU 使用以下机制:
-
主机通过支持 WRITE BUFFER 命令的任何逻辑单元,使用一个或多个 WRITE BUFFER 命令交付微码。主机指定:模式 (MODE) = 0Eh, 缓冲区偏移 (BUFFER OFFSET)(应对齐到 4 K 字节), 缓冲区 ID (BUFFER ID) = 00h, 以及参数列表长度 (PARAMETER LIST LENGTH) 字段指示要传输的字节数。
所有用于交付微码的 WRITE BUFFER 命令应发送到同一个逻辑单元,任务属性 (task attribute) 设置为简单 (simple) 或有序 (ordered)。在用于交付微码的 WRITE BUFFER 命令序列中,缓冲区偏移 (BUFFER OFFSET) 值应按递增顺序排列,并且应从零开始。
-
bFFUTimeout 指示设备处理 WRITE BUFFER 命令的最长时间。在此时间内,对设备的访问受到限制或不可能。
-
成功交付微码后,主机使用硬件复位或电源循环激活新固件。UFS 设备应在硬复位或上电时使用新固件。主机应知道,成功交付微码后的第一次初始化流程可能比平时更长。
-
设备初始化后,主机应读取 bDeviceFFUStatus 属性并验证新固件是否成功更新。
UFS 设备在 FFU 过程中不支持其他模式的 WRITE BUFFER 命令。
11.3.28.3 写入缓冲区命令数据传输
设备服务器通过发出一系列 READY TO TRANSFER UPIU (RTT),请求从应用客户端的数据输出缓冲区传输缓冲区数据。
缓冲区数据按照 RTT 请求中的指示,在一个或多个段中通过发送 DATA OUT UPIU 数据包传送。
如果整个数据传输完成之前发生错误,则可能请求零个或不完整数量的段。
接收到的数据写入到由缓冲区偏移 (BUFFER OFFSET) 字段在缓冲区 ID (BUFFER ID) 字段指定的缓冲区中指定的位置。
11.3.28.4 写入缓冲区命令状态响应
- 状态 (STATUS) 响应将在单个 RESPONSE UPIU 中发送
- 如果请求的数据成功传输并写入,WRITE BUFFER 命令将以 GOOD(良好)状态响应终止
- 如果单元未准备好接受新命令(例如,仍在处理先前的命令),则将返回 BUSY(忙)状态响应
- 失败可能由多种原因引起。当 WRITE BUFFER 命令失败时,将返回 CHECK CONDITION(检查条件)状态响应以及相应的感知键 (SENSE KEY),例如:
- ILLEGAL REQUEST(非法请求)(范围或 CDB 错误)
- MEDIUM ERROR(介质错误)(介质故障、ECC 等)
- HARDWARE ERROR(硬件错误)(硬件故障)
- UNIT ATTENTION(单元注意)(复位、上电等)
- 等等。
11.3.29 BARRIER (屏障) 命令
BARRIER 命令请求设备服务器确保在刷新 BARRIER 命令之后发出的命令的数据之前,将 BARRIER 命令之前发出的命令的数据刷新到非易失性存储器。BARRIER 命令应仅影响具有简单任务属性 (simple task attribute) 的正常优先级命令

11.3.29.1 BARRIER 命令数据传输
BARRIER 命令没有数据传输阶段。
- 不传输 DATA IN 或 DATA OUT UPIU。
11.3.29.2 BARRIER 命令状态响应
- 状态 (STATUS) 响应将在单个 RESPONSE UPIU 中发送。
- 如果命令成功执行,则将以 GOOD(良好)状态响应终止。
- 如果单元未准备好接受新命令(例如,仍在处理先前的命令),则将返回 BUSY(忙)状态响应。
- 其他失败可能由多种原因引起。当 BARRIER 命令失败时,将返回 CHECK CONDITION(检查条件)状态响应以及相应的感知键 (SENSE KEY),例如:
- ILLEGAL REQUEST(非法请求)(范围或 CDB 错误)
- HARDWARE ERROR(硬件错误)(硬件故障)
- UNIT ATTENTION(单元注意)(复位、上电等)
- 等等。
更多推荐



所有评论(0)