【eMMC协议】6.6.30 - 6.6.39

6.6.31 Cache

  1. 缓存是eMMC设备中的临时存储空间。通常情况下,缓存应该减少写和读的访问时间(与访问非易失性存储相比)。主机不能直接访问缓存。这个临时存储空间也可以用于一些具体的实现操作,如作为内存控制器的执行存储器和/或作为地址映射表的存储器等
  • 数据缓存仅适用于单块读/写(CMD17/24)、预定义的多块读/写(CMD23+CMD18/25)和开放式多块读/写(CMD18/25+CMD12)命令,不包括任何其他访问,例如对寄存器空间(例如CMD6)的访问

  • 在执行CMD24、CMD23+CMD25或CMD25+CMD12命令后,Data0忙和状态响应位[8]不再必须指示到非易失性存储器的编程状态,而可能指示到易失性缓存的编程状态。(表示的是cache的状态)

  • 刷新操作是指从主机到设备将缓存的数据写入非易失性内存的需求。在进行刷新之前,设备可以自主地将数据写入非易失性内存,但是在进行刷新操作之后,易失性区域中的所有数据必须写入非易失性内存。

  • 由于突然断电,缓存中的数据可能(并且很可能)会丢失。如果在断电时正在进行刷新操作,则任何此类数据也可能会丢失。

  • 当缓存开启时,对RPMB和引导分区的访问仍应指向非易失性存储器

  • 当缓存打开时,它应用于整个eMMC设备(当刷新缓存时,所有分区的数据都将被刷新,此操作与活动分区无关)。

  • 由于在分区之间切换,不需要进行刷新。(注意:这也意味着在分区之间切换时缓存数据不会丢失)。缓存的数据可能会在SLEEP状态下丢失,所以主机应该在将设备置于SLEEP状态之前刷新缓存。

  • 设备可能会在接收到RST_n或CMD0的情况下使缓存中的数据失效。

  1. 缓存功能的支持和缓存的大小在CACHE_SIZE字节(EXT_CSD字节[252:249])中表示。
    在这里插入图片描述

  2. 在上电、设置RST_n或CMD0之后,缓存默认为OFF。所有的访问都应该指向非易失性存储器,就像本规范中其他地方定义的那样。缓存功能可以通过写入CACHE_CTRL字节(EXT_CSD字节[33])来打开和关闭。打开缓存将启用本节中定义的行为模型。关闭高速缓存将触发数据刷新到非易失性存储器。

  3. 通过写入FLUSH_CACHE字节(EXT_CSD字节[32]),可以将缓存刷新到非易失性存储。R1b响应结果应反映缓存数据到非易失性存储器的编程状态。在完成为正常写入定义的编程后,CMD13可以从状态寄存器中读取任何错误。如果在执行FLUSH_CACHE或使用CACHE_CTRL操作关闭缓存时发生flush错误,设备将设置通用错误位STATUS bit[19]。如果由于刷新操作而发生错误,则设备没有责任将错误隔离到特定数据区域。此错误可能会影响自上次刷新操作以来写入缓存的任何数据

  4. 刷新缓存没有最大超时,因为刷新大量缓存数据可能需要非常不可预测的长时间。这适用于FLUSH_CACHE和CACHE_CTRL(关闭缓存)操作。主机可能使用HPI函数中断刷新操作。在这种情况下,缓存不应被视为完全刷新,主机应重新启动刷新

  5. 在打开缓存时,有两种方法可以强制将数据直接编程到非易失性存储中:

    • 可靠的写访问将强制数据写入非易失性存储器,Data0可表示busy状态
    • 在实际写入命令之前,在CMD23中设置参数位[24]。如果缓存被关闭,那么这个位将被内存设备忽略。如果该位与CMD23中的可靠写位一起设置,则该位也将被设备忽略。
      在这里插入图片描述
  6. ERASE, TRIM和DISCARD命令将对缓存中的数据产生相应的影响,以便任何后续读取将反映数据的擦除,修剪或丢弃状态。缓存中可能存在旧数据的副本,这些副本预计将在断电期间被清除。SANITIZE操作将清理缓存中未映射的数据

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

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

6.6.38 Cache Flushing Policy

  1. 主机可能要求设备以有序的方式从缓存中刷新数据。有时,为了保证有序刷新,主机可以命令设备刷新设备缓存或使用barrier。
  2. 但是,如果eMMC设备刷新策略是以有序的方式从缓存中刷新数据,则barrier或刷新命令操作(如果目标是保证刷新顺序)是冗余的,并且会给设备和主机带来不必要的开销。
  3. 但是,如果FIFO位设置为1b,并且设备支持barrier机制,主机仍然可以发送barrier命令而不会得到错误。发送这些命令不会改变设备的行为,因为设备按顺序刷新缓存。

6.6.39 Command Queuing

6.6.39.1 Overview
  1. 为了方便e•MMC中的命令排队,设备管理了一个内部任务队列,主机可以对数据传输任务进行排队。
  2. 主机跟踪所有排队任务的状态,并可以通过发送指示其任务ID的命令来命令任何标记为“准备执行”的任务的执行。当接收到执行命令(CMD46/CMD47)时,设备执行数据传输事务。
  3. 在启用命令队列之前,块大小必须设置为512 B,如果块大小不是512 B,设备可能会响应CMD46/CMD47错误。
  4. 设备不保证队列任务的处理顺序。在排序很重要的情况下(例如,具有重叠lba的命令),主机负责确保排序。
6.6.39.2 QUEUED_TASK_PARAMS - CMD44
  1. CMD44是数据传输任务排队的第一步。该命令对任务排队和执行操作所需的参数进行编码。参数是:块计数,任务ID,优先级,数据方向和其他参数(即,标签请求,上下文ID,可靠写入,强制编程)
    在这里插入图片描述

  2. 已编码的任务ID不得已被队列中的另一个任务使用。如果任务ID标识的任务已经完成,则认为该任务ID可用于重用。当最后一个数据块通过eMMC总线完全传输时,数据读取任务被认为完成。当最后一个数据块后面的忙信号被释放时,认为一个数据写任务已经完成。

  3. 有两个优先级:高优先级任务和简单优先级任务。要求设备在准备简单任务之前,先为排队的高优先级任务做执行准备,从而优先处理高优先级任务。因此,高优先级任务通常应该在在它之前排队的简单任务之前转移到“准备执行”状态。然而,可以接受的是,在接收高优先级任务请求时,设备可能已经开始准备执行的简单任务,但没有在QSR中将它们标记为“准备执行”。设备可以在新的高优先级任务之前将这些任务标记为“准备执行”

  4. CMD44之后应该总是跟着CMD45来完成排队操作。如果主机发出的下一个命令不是CMD45,或者发出了CMD45但检测到错误条件,则未定义设备行为,并且期望主机重新发送CMD44和CMD45。

  5. CMD44可以在数据线上进行数据传输时发出,当线路空闲时(例如,在NAC时间期间)或当设备指示BUSY状态时发出,除非设备由于执行CMD48而处于BUSY状态

6.6.39.3 QUEUED_TASK_ADDRESS - CMD45
  1. CMD45应直接在(且仅在)CMD44之后发布。CMD45的参数是相关事务的起始块地址(例如,类似于CMD18)。当设备接收到CMD45时,根据CMD44和CMD45两个命令提取的参数对任务进行排队:任务ID、块计数、块地址、优先级、数据方向、标签请求、上下文ID、可靠写入、强制编程
  2. CMD45可以在数据传输正在进行时发出,或者当设备显示BUSY状态时发出,或者当线路空闲时发出(例如,在NAC时间期间)。当设备执行CMD48时,不应该发出CMD45
6.6.39.4 EXECUTE_READ_TASK - CMD46
  1. 为了执行已经排队的数据读取任务,主机发出CMD46。CMD46的参数是所请求任务的Task ID。指定的任务必须是数据读取任务(数据方向= 1),在队列状态寄存器中标记为“准备执行”
  2. 如果请求的任务(如任务ID所示)确实是一个读任务,并且准备执行,则设备响应R1响应并开始数据传输。
  3. 当最后一个数据块已经完全通过e•MMC总线传输时,设备应该为任务清除“准备执行”。
6.6.39.5 EXECUTE_WRITE_TASK - CMD47
  1. 为了执行已经排队的数据写任务,主机发出CMD47。CMD47的参数是所请求任务的Task ID。指定的任务必须是数据写任务(数据方向= 0),在队列状态寄存器中标记为“准备执行”
  2. 如果请求的任务(如任务ID所示)确实是一个写任务,并且准备执行,则设备响应R1响应,主机开始数据传输。
6.6.39.6 CMDQ_TASK_MGMT - CMD48
  1. CMD48用于各种命令队列任务管理请求。参数包括一个TM操作码,它对请求的操作进行编码,并在与操作码相关时包含一个TaskID。 CMD48只可在没有数据传输发生时发出
    在这里插入图片描述
6.6.39.7 SEND_STATUS - CMD13
  1. 在CMD13中添加了一个选项,用于主机读取队列状态寄存器(QSR)。如果设置了CMD13参数中的[15]位,则设备将发送带有QSR的R1响应,而不是设备状态。
    在这里插入图片描述
  2. 当设备在对CMD13的响应中表示一个或多个任务“准备执行”时,主机应该选择其中一个任务执行,而不是期望其他任务会“准备执行”而发送额外的CMD13。
6.6.39.9 Supported Commands
  1. 可以使用扩展CSD中的CMDQ_MODE_EN字段启用和禁用命令队列。在禁用队列之前,该队列必须为空。禁用非空队列的行为视为非法指挥。
  2. 当命令队列启用时(CMDQ_MODE_EN字段中的En位设置为’ 1 '),第11类命令是可以发出数据传输任务的唯一方法。启用命令排队功能后,不支持现有的数据传输命令CMD18/CMD17和CMD25/CMD24。 当命令队列被禁用时,支持CMD17/18和CMD24/25。
  3. 启用任务队列时,主机应该只发送处于Trans状态的class11命令。但是,如果设备处于Trans状态并处理一系列命令(例如,erase序列),主机应该在发送class11命令之前完成该命令。
  4. 如果在CMD46数据传输过程中发出CMD12,则设备回到transfer状态,认为操作完成(QSR[i] = 1 -》0)
  5. 如果在CMD47数据传输过程中发出CMD12,则设备进入编程状态,只有传输的所有数据都已编程完成,才能认为操作完成(QSR[i] = 1 -》0)。
  • 15
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Blank_time

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

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

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

打赏作者

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

抵扣说明:

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

余额充值