JESD B5.1 EMMC协议介绍(十四)

6.6.28 Data Tag Mechanism 数据标记机制

这种方式能够使EMMC从host接收相关特定数据类型的信息(例如文件系统元数据、时间戳、配置参数等)。在进行写多个块操作(host 下发CMD25)之前,信息会以明确定义好的地址传递。通过接收此信息,EMMC可以提高后续读取和更新操作的访问速率,并提供更可靠和稳健的存储。

host对管理标签(包括标签分配、标签-设备逻辑地址映射等)负责。如果SYSTEM_DATA_TAG_SUPPORT(ext_csd 寄存器的第499字节)字段设置为1,则EMMC支持所有“默认”类型分区上的功能(包括用户数据区域未定义为增强用户数据区域的区域和配置了“默认”属性的通用分区)。

host可以在可寻址空间中标记一个数据段(标记单元),其长度以字节进行表示,由ext_csd寄存器的参数TAG_UNIT_SIZE确定(且该size是sector的倍数)。标记操作必须与标记单元对齐,并具有标记单元的粒度。

如果Write Multiple Blocks命令的地址没有和标记单元对齐,而是落在标记单元的中间,则为了包含系统数据,会将整个标记单元均被标记。

请求对标记单元的标记或一系列标记单元需要的操作可通过host下发CMD23(SET_BLOCK_COUNT)命令实现。

任何更改数据的命令(例如Trim、Erase、普通/可靠写入等)都会发送到由之前标记机制编写的系统数据的逻辑地址上,确定新数据作为系统数据而不受更改。在发送这些命令时应该包括覆盖单个标记单元或多个标记单元。

由于分配给EMMC的空间资源去标记系统数据标的数据资源可能是有限的。EMMC会通过在内部资源耗尽事件后提供作为响应的第一个R1、R1b命令中的EXCEPTION_EVENT位来说明异常。收到该消息后,host检查ext_csd寄存器的中的EXCEPTION_EVENTS_STATUS字段来检索和标记机制分配的资源耗尽相关的信息。

须注意:在这种情况下,ext_csd寄存器中EXCEPTION_EVENTS_CTRL字段中的SYSPOOL_EVENT_EN位应开启,便于获取异常事件指示。

host应管理标记操作计数,避免资源耗尽。如果发生资源不足的情况,host应进行相关操作从而释放一些资源的操作(例如,在某些包含系统数据的地址上发出Trim命令)。

6.6.29 Packed Commands 压缩命令

读取和写入命令可以被打包成命令组(要么全读,要么全写),接着将组内所有命令的数据在总线上一次传输,以减少开销。

打包的写命令可通过host下发CMD23命令(设置块数量)并设置PACKED标志将多个写多块命令进行分组,接着host 下发CMD25命令(WRITE_MULTIPLE_BLOCK命令),第一个块中包含下文提到的打包命令头。

然后,所有个别打包命令的数据扇区在头部之后附加在一起发送,按照头部中出现的顺序。在这种情况下,在CMD23指定的块计数包括所有单独写入的块计数之和加上一个头部块数量。

读取命令打包可通过使用设置块计数命令(CMD23)并设置PACKED标志且设置块计数为1,将多个读取多块命令分组。接着host下发只包含头部的CMD25命令(WRITE_MULTIPLE_BLOCK),再次发送CMD23,设置打包标志并将块计数包括所有个别读取的块计数之和(在这里CMD23是可选的-允许开放式读取)。接着host 下发CMD18命令(READ_MULTIPLE_BLOCK命令)来读取打包数据。host在打包读取命令序列完成之前不需要下发任何其他命令(除了CMD13 SEND_STATUS),否则EMMC行为未知。(即在发送头部和读取数据之间插入命令是不允许的)。

EMMC分别在EXT_CSD的MAX_PACKED_READS和MAX_PACKED_WRITES字段中通知可以打包在单个打包命令中的最大读取或写入命令数量。

如果EMMC是4kB写入,则MAX_PACKED_READS和MAX_PACKED_WRITES中的命令数大于一个块能够包含的命令数量。对于4kB本地扇区EMMC的仿真模式,host只能将命令打包到一个块中,并将块发送为头部。在禁用仿真模式后,host可以将命令打包到8个块中,并将块作为头部发送。

6.6.29.1 Packed Command Header 打包命令头

对于打包的写入命令来讲,打包命令头被发送到数据的第一个块中(如果DATA_SECTOR_SIZE[61] = 0x00),或者在DATA_SECTOR_SIZE[61] = 0x01的情况下,被发送到前8个块中。

对于打包的读取命令,在读取打包数据之前,打包命令头被作为单独的写入命令被发送。

该结构包含如下:

结构的版本-一个字节,用于指示未来兼容性的版本;应设置为0x01,

R / W标志:0x01表示打包读取,0x02表示打包写入,

表中的条目数,

然后,对于每个条目:

个别命令(如4字节)的CMD23的参数,其格式与CMD23相同,包括“count”字段和各种标志字段(高位),其中“packed”位始终为“0”(除了“packed”位,头部中所有其他CMD23参数位仍然允许)。每个单独的读取和写入命令都不应该是开放式的。如果头部中CMD23的参数的任何位[15:0]设置为0的话,则EMMC的行为是未定义的。

CMD18或CMD25的参数(4字节)-由个别命令读/写的地址

该结构包含格式如下(以小端格式,填充应全部为零):

6.6.29.2 Packed Commands Error Handling 打包命令的错误处理

在打包的命令中,如果一个命令执行失败,同一批命令中的后续命令将不会执行。对于批量读取,EMMC可能会传输一些数据(可能是随机的)以完成指定块数(因为host正在等待所有块的传递)。或者,它可以在失败点停止传输数据,则会触发超时。对于批量写入,EMMC将忽略未执行的命令的传输,只写入已执行的命令的数据。这确保了数据的完整性,防止了数据损坏。host需要处理失败响应并采取适当的措施,例如重试命令或通知用户。

在任何失败情况下,ext_csd中PACKED_COMMAND_STATUS字段中的通用错误标志都会被设置(例如,头部错误,批量命令中的命令数量超过EMMC支持的数量等)。如果在批量命令中的任何一个命令执行期间发生任何错误,则“错误索引”标志将被设置,以及通用错误,ext_csd中的PACKED_FAILURE_INDEX字段将报告失败命令的头部块中的索引位置。

此外,如果hsot通过向EXCEPTION_EVENTS_CTRL的PACKED_EVENT_EN写入值“1”来启用它,则异常事件位可以在PACKED_COMMAND_STATUS中报告非零状态。一旦启用,EMMC状态中的异常位(在每个R1响应上报告)将设置PACKED_COMMAND_STATUS为非零状态。

当使用批量命令时,命令响应中的错误报告可能会被推迟到实际批量读/写传输(传输批量数据的CMD25或CMD18)之后的命令中。例如,如果批量命令中的一个命令访问了超出范围的地址,则ADDRESS_OUT_OF_RANGE错误可能会被推迟报告。

6.6.30 Exception Events 事件异常

异常事件允许EMMC通过在自身状态中设置EXCEPTION_EVENT位,快速向host报告一些异常情况。异常事件位会保持设置状态,直到问题解决后,该异常位便会被清除掉。

为了控制和此位相关的事件报错,ext_csd寄存器中定义了一个16位的EXCEPTION_EVENTS_CTRL字段 - 每个位控制一个特定的事件来设置EXCEPTION_EVENT位。因此,EXCEPTION_EVENT位是所有具有其相关启用位在EXCEPTION_EVENTS_CTRL中设置的异常事件的逻辑或后的结果。

为了更容易地检测特定的异常情况,ext_csd中定义了一个16位的EXCEPTION_EVENTS_STATUS字段,每种异常情况都有一个位来指示当前设置的异常情况。状态位根据EXCEPTION_EVENTS_CTRL中启用的异常情况进行设置。

6.6.31 Cache 缓存

Cache是EMMC中的临时存储空间。通常情况下,缓存应该可以减少写入和读取的访问时间(与对主要非易失性存储的访问速率相比)。缓存不能直接被host访问。这个临时存储空间也可以用于一些特定实现的操作,例如作为内存控制器的执行内存和/或地址映射表的存储空间等,关于缓存定义及功能不在本标准的讨论范围之内。

由于缓存的本质是易失性(掉电数据丢失)的,因此预计缓存的实现会对本标准的某些要求产生显著影响,具体如下:

  1. 数据缓存仅适用于单块读/写(CMD17/24)、预定义多块读/写(CMD23+CMD18/25)和开放式多块读/写(CMD18/25+CMD12)命令,并排除任何其他访问,例如对寄存器空间的访问(例如CMD6)。
  2. 在执行CMD24、CMD23+CMD25或CMD25+CMD12命令后,Data0忙和状态响应位[8]不再必须指示到非易失性存储器的编程状态,而可能指示到易失性缓存的编程状态(下文定义的例外除外)。
  3. (flush)刷新操作是指host向EMMC发送的要求,将缓存的数据写入非易失性存储器。在刷新之前,emmc可以自主地将数据写入非易失性存储器,但在刷新操作之后,易失性区域中的所有数据必须写入非易失性存储器。(以电脑为例,内存条上的数据在电脑断开电源后就没有了 而硬盘中的数据依旧存在。当不进行flush 操作之前,数据会被写入到内存条中,供处理器需要的时候使用,需要的时候再写入到硬盘中,当使用了flush 操作后,数据会强制从内存条中写入到硬盘中)
  4. 由于突然断电,缓存中的数据可能(并且很可能)会丢失。如果在断电时正在进行刷新操作,则任何此类数据也可能会丢失。
  5. 当缓存开启时,对RPMB和引导分区的访问仍应指向非易失性存储器,并具有在本标准其他地方定义的相同要求。
  6. 当缓存开启时,整个EMMC上的数据均会通过缓存写入读取(刷新缓存时,所有分区的数据都应该被刷新,这个操作与活动分区无关)。
  7. 在切换分区时没有刷新的要求。(注:这也意味着在切换分区时,缓存数据不应该丢失)。不过缓存数据可能会在sleep状态下丢失,因此需要EMMC进入sleep状态之前,host需要执行刷新缓存,将数据写入NAND 中
  8. 在收到RST_n或CMD0时,EMMC缓存中的数据会被丢掉。

缓存功能的支持和缓存大小由ext_csd 寄存器中的([252:249])CACHE_SIZE进行中表示。

一般来讲,在上电、RST_n信号复位或CMD0后,默认时的缓存存应该关闭。所有访问都应该指向非易失性存储器,就像在规范的其他地方定义的那样。后续可以通过写入CACHE_CTRL字节(ext_csd第33字节)来开启和关闭缓存功能。开启缓存应该启用本节定义的行为模型。关闭缓存应该触发将数据刷新到非易失性存储器的操作,保证数据可靠写入

可通过写入FLUSH_CACHE字节(ext_csd第[32]字节)来将缓存刷新到非易失性存储器。R1b响应结果应包含缓存数据编程到非易失性存储器的状态显示。任何错误结果可以在完成编程后通过host 下发CMD13从状态寄存器中读取,就像普通写操作的定义一样。如果在执行FLUSH_CACHE操作或使用CACHE_CTRL操作关闭缓存时发生了刷新错误,EMMC应该设置通用错误位,即STATUS BIT[19]。如果刷新操作导致的错误,则该错误可能会影响自上次刷新操作以来写入缓存的任何数据,EMMC没必要将错误隔离到特定的数据区域。

由于清除缓存的最大超时没有限制,是因为清除大量缓存数据可能需要非常不可预测的长时间。这适用于FLUSH_CACHE和CACHE_CTRL(关闭缓存)操作。host可以使用HPI函数来中断清除操作。在这种情况下,缓存不应被视为完全清除,则需要host重新启动进一步清除操作。

在缓存开启的情况下,有两种方法可以强制将数据直接编程到非易失性存储器中:

1)使用可靠写入访问将会强制将数据写入非易失性存储器中,Data0信号线busy指示器反映了编程的状态,如本标准定义的。

2)在实际写入命令之前,可以在host 下发的CMD23中设置参数位[24]。如果缓存被关闭,则EMMC将忽略此位。如果将此位与CMD23中的可靠写入位一起设置,则EMMC也会忽略掉此位。

在刷新操作后,逻辑块可能会被从缓存中移除,也可能不会被移除。在设置可靠写入访问和host下发CMD23位[24]的访问中,数据也可能存储到缓存中。这些由具体实现决定。

如果缓存完全满了,或者缓存无法接收下一个访问的数据(根据CMD23中指定的块计数或一般单个/开放式多块写入),那么仍然应该由EMMC负责在本规范其他地方指定的超时时间内存储下一个访问的数据。处理新数据和可能刷新一些旧的缓存数据的实际算法由具体实现决定。

ERASE、TRIM和DISCARD命令应该相应地对缓存中的数据产生影响,以便后续读取操作都能反映出数据的擦除、修剪或丢弃状态。缓存中可能会存在旧数据的副本,这些副本预计在断电时会被清除。SANITIZE操作能够清除缓存中未映射的数据。

所有与某个地址相关的功能是存在一定顺序的,就像不带缓存功能的EMMC。例如,某个地址中存在一些旧数据,然后将一些新数据(可能需要缓存的数据)写入该地址。接下来,将该地址设置为写保护,而写保护本身不是缓存操作。尽管如此,在所有情况下,写保护只对新数据有效,而非在这个特定时间中可能存在于非易失性存储器中的旧数据。没有明确的情况下缓存通常应该是先进先出类型,这由具体实现决定。

在连续的刷新操作过程中,EMMC自主按顺序将数据写入非易失性存储器中。如果host想要保留顺序,它必须在顺序重要的点处刷新缓存;EMMC只能确保在刷新操作完成后按顺序写入数据。由于缓存操作导致缓存中的数据随时更新,从而EMMC不会读取之前的旧数据。

EMMC可根据需求启用或者关闭缓存这一功能。

6.6.32 Features cross matrix 功能交叉矩阵

/*

Features Cross Matrix(功能交叉矩阵)是指在SD卡或eMMC设备中,对各种不同的功能进行分类和概述的矩阵表格。这个表格中通常列出了设备支持的不同特性或功能,并以行的形式列出了不同设备型号或版本。这样,用户或系统设计者就可以根据自己的需求和条件,选择适合的设备型号或版本,以获得最佳的性能和功能支持。 Features Cross Matrix通常会包含的信息如下:

- 特性/功能:列出设备支持的不同特性或功能;

- 设备型号/版本:以行的形式列出不同的设备型号或版本;

- 是否支持:标记出每个设备型号或版本是否支持该特性或功能;

- 备注:对每个特性或功能进行说明或解释。

Features Cross Matrix通常用于设备的选型和设计,以及后续的测试、验证和认证工作。

*/

本节总结了通过CMD23参数控制的特性,以及同时激活的规则和限制,包括缓存和分区。

以下规则是从扩展分区属性、可靠写入、上下文管理、数据标记、打包命令和缓存功能中得出的:

如果CMD23中参数的[31]位(可靠性写入)被设置,则强制编程[24]即使设置了也会被忽略,

 CMD23数据标记[29]和上下文ID[28:25]位不能在同一命令参数中设置,

 在打包命令的情况下,在封装的CMD23中,打包[30]位和块数[15:0]是有效的;所有其他参数位都是“0”,并包含在头中(请参见表52中的“打包命令”和“非打包命令”描述),

 对同一分区不能同时使用增强和扩展分区设置,

 数据标记仅适用于默认分区,

 上下文ID覆盖可靠写入,

 缓存模式不适用于引导分区和RPMB分区。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南风轻拂_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值