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

6.6.25 Background Operations 后台操作

EMMC需要进行各种内部的维护操作。为了在读写等时间关键操作时减少延迟,最好在host 没有启动服务时,执行维护操作。其操作分为两种类型:

前台操作 - EMMC执行host命令的操作,例如读取或写入命令;

后台操作 - EMMC不执行host服务时的操作;根据它们如何启动,后台操作分为两种类型:手动启动的后台操作和自主启动的后台操作。

手动启动方法:为了让EMMC知道host不需要它并且可以执行后台操作,host应向BKOPS_START(ext_csd寄存器的第[164]字节)写入任何值从而手动启动后台操作。EMMC将一直保持繁忙状态,直到后台动作执行结束

由于前台操作比后台操作具有更高的优先级,host可以使用高优先级中断机制(参见6.6.26)中断正在进行的后台操作。为了让EMMC知道host是否会定期启动后台操作,host应将BKOPS_EN(ext_csd寄存器的第163字节)的第0位(MANUAL_EN)设置从而表示host将定期写入BKOPS_START。然后,EMMC可以将一些维护操作推迟到host写入BKOPS_START的间隙进行处理。

EMMC在BKOPS_STATUS(ext_csd寄存器的第246字节)的位[1:0]中说明其后台操作状态,通过四个可能的级别之一进行表示:0x0:不需要操作;0x1:有未完成的操作-非关键;0x2:有未完成的操作-性能受到影响;0x3:有未完成的操作-关键。

host应定期检查状态并根据需要启动后台操作,以便EMMC有足够的时间进行维护操作,从而帮助减少前台操作的延迟。如果状态为3级(“关键”),某些操作可能会超出原始超时时间,因为不能再延迟维护操作。host应该给EMMC足够的时间进行后台操作,以避免首先达到这个级别。

为了使host能够快速检测到更高的级别,每当级别为2或3时,EXCEPTION_EVENTS_STATUS中的URGENT_BKOPS位都会被设置。这会自动设置EMMC状态中的EXCEPTION_BIT。这使得host能够在每个R1类型的响应中检测到紧急级别。host仍应定期从BKOPS_STATUS字节中读取完整状态,并根据需要启动后台操作。

后台操作功能是此规范的强制要求。BKOPS_SUPPORT的第0位(即ext_csd寄存器的第502字节)应该被设置。

自主启动方法;如果host想要在EMMC空闲时间执行后台操作,则应通过将BKOPS_EN字段(即ext_csd寄存器的第163字节)中的AUTO_EN设置为1b,来向EMMC发出信号。当设置了此位时,EMMC可以在适当的时候启动或停止后台操作,而无需向host发出任何通知。

当设置了AUTO_EN位时,host应保持EMMC电源有效。host可以根据其电源限制或其他考虑因素随时设置或清除此位。

6.6.26 High Priority Interrupt (HPI) 高优先级中断

在某些情况下,EMMC上不同类型的数据可能对host具有不同的优先级。例如,写操作可能耗时较长,因此可能需要停止写操作以允许按需换页请求,便于在用户请求时启动进程。高优先级中断(HPI)机制通过允许EMMC在OUT_OF_INTERRUPT_TIME超时时中断低优先级操作,从而使高优先级请求得到响应。host可能需要重复中断的操作或其中的一部分以完成原始请求。

EMMC中的HPI命令可以有两种实现方式:

 基于STOP_TRANSMISSION命令的CMD12,当其参数中的HPI位被设置时。

 基于SEND_STATUS命令的CMD13,当其参数中的HPI位被设置时。

host应检查HPI_FEATURES(ext_csd寄存器的第503字节)中的只读HPI_IMPLEMENTATION位,并使用适当的命令索引。

如果使用带有设置了HPI位的CMD12,则与非HPI命令在允许的状态转换方面存在差异。有关两种情况的具体转换,请参见表60,EMMC状态转换过程。

HPI只能在prg-state状态下执行。此时,它表示EMMC有一个更高优先级的命令待处理,因此EMMC应尽快中断当前操作并以不同的超时值返回到tran-state。

如果在除prg-state之外的状态下接收到HPI,则EMMC的行为在表60,设备状态转换中定义。如果状态转换是被允许的,则会发送响应,但忽略HPI位。如果不被允许进行状态转换,则该命令被视为非法命令。

HPI命令在prg-state状态下被识别位合法命令。然而,只有一些命令可以被HPI中断。如果在不可中断的命令期间接收到HPI,则会发送响应,但HPI命令无效,原始命令将正常完成,可能超过OUT_OF_INTERRUPT_TIME超时时间。表36描述了可中断和不可中断的命令。

在host 下发CMD25( WRITE_MULTIPLE_BLOCK)命令后,EMMC会更新CORRECTLY_PRG_SECTORS_NUM字段(ext_csd寄存器的[245:242]字节),该字段记录成功写入EMMC的512Byte扇区的数量。host在重复中断的写命令时可以使用此信息 - 它无需重新写入所有数据扇区,可以跳过正确编程的扇区并继续仅写入尚未编程的其余数据。

如果HPI中断了一个打包写命令(参见6.6.29)中的CMD25,则CORRECTLY_PRG_SECTORS_NUM字段将表示已传输的累积打包扇区(包括标头) - host可以从该信息计算可中断的单个命令的索引和中断偏移量。

如果在可靠写命令期间收到HPI,则前CORRECTLY_PRG_SECTORS_NUM个扇区应包含新数据,而其余所有扇区应包含旧数据。

在使用HPI机制之前,必须设置HPI_MGMT字段(ext_csd寄存器的第161字节)中的HPI_EN位来启用HPI机制。本规范要求支持HPI功能。所有EMMC都应将HPI_FEATURES字段(EXT_CSD字节[503])中的HPI_SUPPORT位设置为1。

6.6.27 Context Management 上下文管理

/* context management 应该理解为对读写的不同场景进行管理,从而提升EMMC读写的性能*/

为了更好地区分大型顺序操作和小型随机操作,并改善多任务支持,可以将上下文与读取或写入命令组相关联。将一组命令与单个上下文关联便于EMMC优化数据处理。

上下文可以被视为一种活动会话,具体对于特定的读写模式进行配置(例如,以某种粒度为顺序)。

多个读取或写入命令与此上下文相关联,从而创建它们之间的某种逻辑关联,使得EMMC优化性能。例如,允许EMMC改善内部局部性并减少某些开销(例如,如果某个大的数据单元在写入时可以作为一个整体受到停电的影响,则填充此单元的所有命令都可以更快地工作,因为它们可以减少在停电的情况下保护每个写入的开销)。此外,处理多个并发上下文使EMMC能够更好地识别每个写入模式,而不会在它们混合在一起时处理时发生混乱。

EMMC可以支持一个或多个并发上下文,由上下文ID定义。上下文ID#0始终存在,用于向后兼容和无上下文数据。每个上下文ID(除#0之外)在ext_csd寄存器中都有一个配置字段,用于控制其行为。

要使用上下文,应选择可用的上下文ID。接着通过写入配置寄存器来初始化它。一般在发送读/写命令之前,通过在SET_BLOCK_COUNT命令(CMD23)中指定上下文ID和块数(>0)来将数据与上下文相关联。当不再使用上下文时,应更新配置寄存器以关闭上下文ID。在重新配置/使用之前,也应关闭上下文。

注意:使用上下文的读/写命令应为关闭式命令。如果host使用开放式命令,则EMMC可以将读/写命令视为无上下文命令。

6.6.27.1 Context configuration 上下文配置

在使用任何上下文之前,除了预配置的上下文#0无法更改外,其余均需要进行配置。

通过写入所需的特定上下文ID的配置寄存器来进行配置。接着才能使用此ID发送与此上下文ID相关联的所有读取命令或写入命令。当不再需要上下文时,应通过向配置寄存器写入零字节来关闭它。

配置寄存器是一个由15个字节寄存器组成的数组,每个上下文(除了固定的预定义#0)都有一个寄存器。要配置一个上下文,应将以下字段写入所需上下文的配置寄存器中:

1。激活和方向模式(只读、只写或读/写)

方向指示对该上下文的所有后续访问是只读、只写还是读/写。

向该字段写入非零方向作为上下文的“激活代码”。该字段中的零意味着一个已关闭的上下文,直到重新配置才能通过其ID进行寻址。

2。大单元上下文标志

这表示上下文是否遵循大单元规则。

如果设置了大单元上下文标志,则可以使用大单元乘数来指定要使用的更大的单元,而不是使用大单元本身。

3。可靠性模式 控制写入到上下文的数据如何响应中断。

6.6.27.2 Context direction 6.6.27.2 上下文方向

非零上下文可以配置为只读上下文、只写上下文或读/写上下文。上下文#0始终被视为读/写上下文。

任何来自任何上下文(包括#0)的读命令到处于活动的只写上下文的地址都是不允许的,可能会使命令失败或返回虚假数据。

任何来自任何上下文(包括#0)的写命令到处于活动的只读上下文的地址都是不允许的,可能会使命令失败、忽略写入的数据或导致读命令返回意外数据。

配置为读/写上下文的上下文可以在写入时进行读取,只要写入遵循上下文规则即可。

注意:与只读或只写上下文相比,读/写上下文的性能可能会降低。

6.6.27.3 Large-Unit 大单元

大单元是用于大量顺序读/写操作的最小单位,以减少内部开销并提高性能。

// 此处的大单元应该指的是chunk size 为4kByte、 32kByte、512kByte

访问大单元(读和写)的做法:

  1. 使用配置为使用大单元的上下文ID进行操作。

2. 始终按顺序从开头到结尾访问整个大单元。

1)多个读/写命令可以用于读取或写入大单元,并且它们可以与其他访问和命令交错,只要特定的大单元使用其自己的单独上下文ID进行访问即可。

2)正在写入的大单元处于上下文范围之外时不能进行修改(例如,不应使用来自其他上下文的其他写入到大单元地址范围的写入,不应进行该范围的擦除/修剪等)。

3)属于同一上下文的不同大单元可以位于介质上的非连续地址上,只要保持对齐即可(大单元应按顺序从开头到结尾访问,但仅在特定大单元的范围内 - 下一个大单元可以是非连续的,甚至在较低的地址上)。

3. 在编写大型单元上下文时,数据应始终对齐并且长度是SUPER_PAGE_SIZE的倍数

在编写大型单元上下文时,在关闭上下文之前的最后一个大型单元可能会被部分写入,只要从开头开始按顺序写入,直到特定点关闭为止。需要host注意的是,EMMC可能会用一些数据(可能是随机的)填充大型单元的其余部分,以使其达到大型单元的结尾。

6.6.27.4 6.6.27.4 Context Writing Interruption 上下文写入中断

如果对除#0之外的上下文ID的写入命令被中断,EMM的行为就和所有来自其配置的对上下文的写入都是在一个大的写入命令中写入的。

如果在关闭活动上下文之前发生了电源故障、RST_n断言或CMD0,即使没有在特定上下文的写入命令中发生(即使没有在任何命令中间),也被认为是在写入整个上下文时发生的事件。

在对 WR_REL_SET 设置为“1”的分区进行上下文写入操作时,上下文的可靠性模式将根据上下文可靠性模式进行设置。这意味着,即使 WR_REL_SET 设置为“1”,上下文中写入的数据也可能会在断电时丢失;而在对 WR_REL_SET 设置为“0”的分区进行上下文写入操作时,将忽略上下文的可靠性模式(无论上下文可靠性模式如何)。

无论如何,一旦上下文被关闭,数据将根据 WR_REL_SET 进行保护。当上下文ID非零时,CMD23 中的可靠写入位会被忽略掉。相反,上下文的行为将作为其配置的一部分进行确定,并应用于对该上下文的所有写入操作,直到host 关闭了上下文功能。在对非零上下文的任何写入过程中发生中断可能会导致一些数据在EMMC上没有完全编程。仍然不应存在部分扇区——作为非零上下文的一部分写入的任何扇区都应包含新写入的数据或上下文配置之前的旧数据。可能受中断影响的数据范围取决于配置的模式:

对于非大型单元上下文:

MODE0 - 正常模式 - 从上下文被配置的时候开始写入的任何数据都可能会受到影响。

MODE1 - 非大型单元,可靠模式 - 只有由特定中断的写入命令(CMD25)写入的数据可能会受到影响。由于任何中断而改变已经完成的上下文写入操作。

对于大型单元上下文:

注意1:单元N指的是当中断发生时正在写入的当前大单元,单元N-1指的是在当前大单元之前完全写入的上一个上下文的最后一个大单元,而单元N-2及更早的大单元是在N-1单元之前完成的大单元。

注意2:受影响的大单元中存储的数据可能部分或全部无效。

MODE0 - 正常模式 - 任何单元都可能受到影响:从配置该上下文的时间开始写入的任何数据都可能受到影响。

MODE1 - 大单元,逐个单元模式 - 只有单元N可能受到影响,单元N-1及更早的单元不受影响:对大单元上下文中写入的任何数据都可能影响到访问的特定大单元的整个内容。因为任何中断都不会改变上下文中先前已完成的任何大单元。

MODE2 - 大单元,一单元尾模式 - 单元N和N-1可能受到影响,单元N-2及更早的单元不受影响:对大单元上下文中写入的任何数据都可能影响到 访问的特定大单元的整个内容以及当前访问的大单元之前 已完成的整个大单元。因为任何中断都不会改变上下文中的任何其他已完成的大单元。

如果在写入非零上下文期间使用HPI,则写入仍可能像任何无上下文写入一样被中断。如果HPI中断了对大单元上下文(包括在打包写命令中打包的上下文)的写入,则EMMC应始终在SUPER_PAGE_SIZE边界上停止写入(并相应地报告CORRECTLY_PRG_SECTORS_NUM),因此host可以稍后从对齐到SUPER_PAGE_SIZE所需的地址继续停止的写入,以满足大单元上下文的要求。还请参见6.6.26章节。

6.6.27.5 Large-Unit Multipliers 大单元乘数

为了通过并行性的方式提高性能,EMMC可能允许以大于大单元的单位进行读写。

EMMC会在ext_csd寄存器中报告支持的最大乘数。

为了用到大于1的乘数,则需要使用乘数配置上下文,并且所有对齐和单位大小都应该乘以乘数。

例如,如果大单元大小为1MB,则从配置了乘数为2的大单元上下文中读取数据 应该以2MB为单位进行对齐和读取。在每个这样的单位中,正常大单元大小为2MB的大单元上下文相同的规则仍然生效。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

南风轻拂_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值