EMMC5.1协议讲解(3功能描述)

6.1 e•MMC 概述

host和device之间的所有通信都是经过host(master)指挥。通过host发送命令,device对此进行响应。图25描述了识别过程的流程图,图27描述了数据传输模式的流程图。表49和58对EMMC 的命令进行了介绍,表60 罗列了EMMC的状态、以及接收到命令的后续操作。在e•MMC系统,也为host和device之间的交互定义了五种操作模式:

  1. boot mode 启动模式

通过单板上电,带有参数为0xF0F0F0F0的CMD0以及硬件复位功能,使EMMC经过host控制 进入该模式

2. device identification mode 识别模式

当1完成后或者EMMC自身不支持bootmode 启动时,EMMC会进入该模式,直到EMMC接收到host发出的CMD3命令切换后续状态。

3. interrupt mode 中断模式

host和device同步进入中断或者退出中断模式,该模式中没有数据传输,仅存在host或者device 发出的和中断相关的信息。

4. data transfer mode 数据传输模式

当EMMC收到RCA(Relative Device Address)对齐地址后,会进入数据传输模式,紧接着host识别来自总线的EMMC 器件信息后,也进入数据传输模式。

5. inactive mode (去激活模式,个人理解,EMMC 工作时遵循内部的状态图正常进行,如果出错的话,就会进入inactive mode)

当不满足EMMC工作电压范围以及无法访问时,通过host 下发CMD15,EMMC进入该模式,重新复位后进入pre-idle 状态。

表5描述了EMMC 总线模式的相关性,在EMMC的状态框图中,每一种状态对应一个总线和一个操作模式(详见图25和图27)

表格5 CMD线上的模式概览

6.2 分区管理

6.2.1 general 常规

默认存储IC中的user data area用来存储数据,两个boot area 用来启动系统(详见该协议6.3.2章节 类似于电脑的BIOS),RPMB区域(详见该协议6.6.22章节)使用可靠的数据保护方式管理用户数据。在制造商提供的可见数据存储区域总工包括了User data area,boot area partion1,boot area partion2,以及RPMB,且制造商对boot area partions 容量进行了预先定义,而user data area 后续被程序设计人员用来划分嵌入式系统数据存储分区。

图14 EMMC 出厂分区划分

EMMC为host提供了额外的地址空间,用于配置数据存储分区。地址从0x00000000开始,用于更多的使用场景。如下介绍了两种EMMC启动模式

  1. 两个引导区域分区,其大小为128 KByte的倍数,此外也可以从e•MMC进行引导。
  2. 一个RPMB 分区,采用一种可信方式,相当于家里的门锁,其大小为128KByte的倍数。
  3. 四种通用区域分区,用于存储敏感数据或用于其他host的功能,其大小是写保护组的倍数。

每个通用区域分区都可通过增强或扩展的方式( 要求更可靠性的数据保护1)来实现,以此和默认存储介质保持差异。如果EMMC支持增强存储介质功能,则默认情况下,boot和RPMB分区应该使用增强存储介质。

引注:1 This is cited as an example of an enhanced storage media characteristic, and should not be considered as a necessary definition of enhanced storage media technology. The definition of enhanced storage media should be decided upon by each system manufacturer, and is outside the scope of this standard.

boot 和RPMB 分区容量以及具体功能通过存储制造商进行定义外,其他人员只能通过只能方式进行访问。host端可对GPAP区域进行写入,而且只能写入一次。

此外,host端可以对userdata区域进行配置,从起始位置起,确定指定分区需要的block数量,使用加强分区功将MLC cell 配置成为SLC cell,因此呢,单个存储单元的存储信息由2位变成1位,通过这种方式加强所在区域的数据可靠性。

最终的配置如下图所示:

图15 EMMC 内部分区配置示例

通过host进行配置,可能会通用分区和增强用户两个分区之前存储的数据,同时EMMC 自身的初始化时间也会收到影响。由于EMMC device controller 会执行由host配置后相关参数,导致首次上电后的初始化时间可能超过协议规定的上限值。由于改变了部分cell的电荷存储方式(MLC修改为SLC),后续的初始化阶段也会受到影响。

6.2.2  命令约束

协议中定义了可以向每个分区发出的命令的一些约束,如下:

boot partions 启动分区:该分区中不允许使用CMD6(写保护)和CMD7(锁定设备)。

RPMB分区:

该分区中允许Class0、Class2和Class4这4类命令。需注意,除了使用CMD0,CMD6,CMD8 CMd12,CMD13,CMD15以及6.6.22中定义的命令,其他命令被认为是不合法的。

对应原文:Still usage of any other command than CMD0, CMD6, CMD8, CMD12, CMD13, CMD15 or commands defined in 6.6.22 shall be considered as illegal one.

general purpose partions 通用分区:

允许使用class 0,2,4,5,6这五类命令

每一个分区对应的写保护可以单独设置,因此呢,host 可以在每个写保护组中分别设置不同的写入保护类型。

原属于user data area 中允许使用的所有命令都可以在增强用户数据区域中继续使用。

6.2.3  扩展分区属性

每个general purpose partition 都拥有一个扩展分区属性,以下对具体属性做以说明

Default 默认属性: 未进行扩展的

System code 系统编码:很少更新改动且包含重要系统文件(如包含host操作系统的可执行文件)的分区

Non-Persistent 临时性:用于临时存储信息的分区(例如,用于扩展主机虚拟内存空间的交换文件)

EMMC通过这种扩展属性,进一步优化其存储介质的特性,为各分区的后续用途提供便利

单个分区只能选择增强和扩展这两者中的一个功能。

6.2.4 配置分区

在扩展CSD(Device Specific Data register)寄存器中,如果EMMC支持分区功能的话,可以设置PARTITIONING_SUPPORT 字段中的bit0(PARTITIONING_EN),如果EMMC支持增强General Purpose Partitions 和 User Data Area分区的话,可以设置同一字段中的Bit 1 (ENH_ATTRIBUTE_EN) ,如果EMMC支持增强 General Purpose Partitions分区功能的话,可以设置同一字段中的bit 2(EXT_ATTRIBUTE_EN),如协议所述,bit 2-0 这三位在PARTITIONING_SUPPORT 字段中,通过置1 设置。

软件设计人员可以通过host 设置ext_csd寄存器中对应的值,对GPP分区和UDA分区需要的属性进行编程,且只只能编程一次。具体为 host通过发送switch 命令,设置对该分区(可读取写入)做如下参数设置。

GPP分区:最多可设置4个分区的容量和属性,其中EXT_CSD寄存器要设置的字段功能模式如下:

GP_SIZE_MULT_GP0 - GP_SIZE_MULT_GP3 用于设定容量

PARTITIONS_ATTRIBUTE 用于增强分区属性

EXT_PARTITIONS_ATTRIBUTE 用于功能扩展

增强用户数据分区:设置起始地址,和分区属性,该字段位于ext_csd寄存器中,可通过如下参数设置

ENH_START_ADDR 用于设定起始地址

ENH_SIZE_MULT 用于设定分区容量

PARTITIONS_ATTRIBUTE 用于增强分区功能

对于增强型用户数据区来讲,其起始地址(扩展CSD中的ENH_start_ADDR)应与写保护组对齐,其地址若为字节单元的话,EMMC容量最多为2GB,若为扇区单元的话,EMMC 容量可超多2GB

EMMC可以通过忽略小于写入保护组的LSB,同时将增强用户数据区起始地址与写入保护组地址(字节或扇区)进行对齐,

增强用户数据分区的地址空间和用户数据分区中除增强型用户数据分区外的剩余部分分区的地址连贯,(即增强用户数据区与用户其余部分之间没有地址间隙)。

general purpose partions分区和增强用户数据区的存储粒度以高容量写保护组大小为单位。具体见7.4

配置分区参数时,需要设置ext_csd中的ERASE_GROUP_DEF位说明使用高容量擦除组的大小以及高容量写入保护组的大小。需要注意的是,先设置ERASE_GROUP_DEF位,接着使用CMD6命令发送分区参数到EMMC,否则会显示SWITCH_ERROR。

设置好分区,并且分区保持稳定后,class5和class6的命令就可以在高容量擦除组合和高容量保护组上使用。

参数字段划分完成后,需要host设置PARTITION_SETTING_COMPLETED位(Bit 0,此位设置用于保护分区顺序
),那么host通知EMMC设置过程已成功完成。

这样设置的原因在于保护分区序列不会受到突发掉电的影响:具体指分区过程仅完成了部分,在这期间发生突然断电的情况,那么下次上电时,EMMC进行检测,让前一个不完整的分区过程失效,如果未设置此位的话,host需要花费更长的时间,重复这个步骤,进而完成正确的分区步骤。

分区属性配置参数流程图

host会通过对EMMC发送CMD13 命令,确认参数是否完成正确配置。其中一个配置参数出错的话,device会报错SWITCH_ERROR,是因为这种情况下,device 无法确定配置分区和用户分区的具体大小。当然也会存在其他情况,比如host设置了PARTITION_SETTING_COMPLETED 位,但是所配置分区的总容量和EMMC中可用用户分区容量不一致时,device也会报错 ,接着下次上电后,上述的配置参数会被全部清除,所以当我们通过host配置参数时,务必对每一个分区选取合适的参数值,减少错误发生。

一般在上电后,EMMC会根据ext_csd寄存器中的分区参数自行配置。在PARTITION_SETTING_COMPLETED位设置之后和下一次上电之前发出的任何有效命令都会正常执行。需注意设置该位之前的所有不完整分区配置会在下次上电后全部重置。

当分区配置后并重新上电,原EMMC容量为2GBytes的参数C_SIZE和大于2GB容量的EMMC的参数SEC_COUNT值将被修改为配置后实际用户数据区域的容量。(例如,对于配置分区之前超过2GB的EMMC,SEC_COUNT应该同步为实际配置分区后的用户数据区域大小,即使其容量经过配置后,会减小到小于等于2GB)

用户数据区域的容量包括其内部所属增强用户数据区域的容量。当配置完成上电时,host可能会读取这些参数值,用来计算用户数据区域的大小,所以需要配置用户分区参数能被host所获取。

如果上电后,host按照配置流程,向device发出CMD6命令,对GPP分区和增强用户数据分区进行更改,则EMMC会在接收CMD6响应的状态寄存器中报错SWITCH_ERROR,不会执行任何内部操作。

分区参数只能配置一次,且保存在ext_csd寄存器中的字段。此外,host也可以通过CMD8命令随时获取分区配置信息,即使分区配置期间也可以获取,后续的分区配置在下次上电后继续执行。由于参数只能一次性写入,避免配置期间参数发生变化,建议在EMMC参数配置完成后再通过host下发CMD8命令读取分区配置参数。

host 应该遵循图16 所述的GPP分区和EUDA分区参数配置流程图操作,否则会导致EMMC出错。

6.2.5 访问分区

当host 配置好device中的分区之后,host 需要去检查ERASE_GROUP_DEF 是都被重置,若是,则host会在发送读操作,写操作,以及擦除操作的命令之前,将ERASE_GROUP_DEF设置为1,否则的话,EMMC内部可能会出现数据存储错误,导致工作异常。

每次,host都按照如下流程执行对分区的访问:

. 在ext_csd的PARTITION_CONFIG字段设置PARTITION_ACCESS,得以访问其中一个分区。

. 对确定要访问的分区发送访问命令。

. 恢复默认User Data Area分区的访问权限,或者对下一个分区进行访问。

当遇到CMD0或者硬件复位等复位因素引起的复位时,host 首先会获得对默认分区的访问权限。如果发生意外掉电的情况,默认host将恢复对用户数据区域的访问。如果host尝试访问之前尚未创建的分区时,EMMC将在状态寄存器设置SWITCH_ERROR位进行报错,该步骤不会改变partition_access位的值。

6.3  启动操作模式

在该模式下,host 有两种方式访问到EMMC内存boot 分区存储的系统引导数据,第一种是持续拉低CMD0,第二种是在发送CMD1 命令之前,发送 参数为0xFFFFFFFA 的CMD0 命令进行访问。通过配置寄存器后,host 就可以访问到boot 分区以及user 分区的数据。

6.3.1 EMMC 复位值pre-idle 状态

EMMC 可以通过如下方式进入到pre-line 状态:

  1. EMMC 原先处于 inactive,通过host重新上电后,会进入到pre-idle 状态。
  2. 软件复位通过发送参数为0xF0F0F0F0的CMD0 命令(即表示GO_PRE_IDLE_STATE),将EMMC状态更新为pre-idle 状态。
  3. host侧,通过硬件复位功能,让EMMC处于pre-idle状态 ,或者在关闭管理上电期间的写入保护块功的写入保护功能后进行复位。

当EMMC在休眠状态下,接收到GO_PRE_IDLE_STATE命令(参数为0xF0F0F0F0的CMD0)或设置为硬件复位信号时,会转移其当前状态至pre-idle状态。

如7.6 所示,接收到GO_PRE_IDLE_STATE或者硬件复位信号后,EMMC输出总线会拉到高阻状态,紧接着EMMC收到进行0x0001 相对地址寻址,并对默认驱动器级寄存器寄存器初始化。

当EMMC通电后,RST_n信号也伴随着上电信号上升而上升。EMMC可以在上电期间检测RST_n信号的上升沿信号,如下图所示的(1),(2),(3)或(4)。同时EMMC通过处理,保证其上电后能够正常工作。

如果RST_n信号在VCCQ完全上电之前跌落,则VCCQ的上升沿被看做时RST_n的下降沿。

此时,需要在测试以RST_n信号的上升沿为起点,VCCQ完全上电为终点的RST_n信号脉冲宽度。在上电瞬间,EMMC内部执行初始化序列动作,可能无法检测RST_n信号电平值,其原因在于EMMC内部尚未完成加载ext_csd寄存器的RST_n_ENABLE位。此时包括由RST_n信号断言的复位序列在内的序列正在进行EMMC内部做初始化,EMMC需要在1秒内完成内部初始化序列,所以其不会重复执行序列信号。初始化延迟时间最长按照1毫秒计算,即RST_n断言后的74个时钟周期或电源斜率上升时间。

6.3.2 Boot partition 引导分区

如图19所示,存在两个boot 分区,且与用户分区分开。每个引导分区的最小容量为128KB,boot 分区的容量计算公式为: 最大boot 分区容量等于 128KB 乘以BOOT_SIZE_MULT,其中BOOT_SIZE_MULT定义为ex_csd寄存器第226位字节数,

EMMC内部存储分区

slave通过ext_csd 寄存器第179位字节,进行boot配置,然后主机通过发送CMD6选择访问配置,并进行切换。slave 也可以设置ext_csd寄存器中第179字节的BOOT_PARTITION_ENABLE位为 111b,(Bit[5:3] ,见7.4.69 PARTITION_CONFIG),通过这种方法进行boot 配置。

6.3.3 boot operation 引导操作

上电后,CMD 信号线被持续拉低至少74个时钟周期,或者在提前使能ext_csd寄存器第162字节的前提下,接收参数为0xF0F0F0F0的CMD0命令或者进行硬件复位操作信号,则EMMC在第一个命令发送之前,开始识别boot模式正在初始化,同时EMMC 内部开始准备boot模式启动所需要的数据。

host读取ext_csd寄存器中的179字节中的bit[5:3],选择启动分区,然后读取启动需要的数据。同时在boot 启动过程中能通过计算公式 (128KB × BOOT_SIZE_MULT (EXT_CSD byte [226])) 获得用于boot的分区中存储的数据容量值。在CMD信号拉低的1秒内,EMMC开始发送用于首次启动的数据,通过data 数据信号线传输至host,对于host来讲,持续拉低CMD信号线,在推挽模式,以更高的速率接收全部用于启动的数据,直到boot启动操作结束。

host 可以选择在后台操作接口时序下选择单倍数据传输速率模式,在10.6章节描述了高速接口时序的单倍速率或者双倍速率模式,可以通过设置ext_xsd寄存器的第177字节的[4:3]位。且EMMC支持使高速时序做boot启动的情况下,host可以对ext_xsd寄存器第228 字端的bit2进行访问。

如表208所示, 当ext_cd寄存器第177字段中的[4:3]被设置成'10'时,host 就可以选择双倍速率模式传输速率,同时ext_csd寄存器的第228字段的bit 1会通知host, 对应的EMMC 是否在boot 模式支持双倍传输速率。

在boot 操作期间下 不支持HS200和HS400数据传输模式。

host可以通过将ext-csd 寄存器的第179字节的bit6置1 来选择接收EMMC的boot 识别过程,从而host可以了解到EMMC 是否处于boot 模式。

如果boot识别这个功能打开的话,在CMD 信号线拉低的情况下,EMMC会在50ms之内将用于识别的pattern'010'发送至host进行识别,相反,没有打开boot 识别这一功能,则EMMC就不会发送'010'

一般在单倍速率模式下,EMMC内部的数据通过EMMC对外输出,host 则会在时钟上升沿进行采样获取EMMC输送的数据,伴随着数据传输末尾会有一个CRC校验。

而在双倍速率模式下,EMMC内部的数据会通过时钟的上升沿和下降沿进行传输,并跟随两笔CRC校验。双倍速率传输模式下,block 长度为512字节。根据其配置,数据以4线或者8线的方式进行交织发送,同时奇数字节(如1,3,5,…… 511)会被host在时钟的上升沿进行采样,偶数字节(2,4,6,……512)会被host在时钟的下降沿进行采样。EMMC会分别在256字节的奇字节数据和256字节的偶字节数据传输完成后分别增加16bit的CRC校验。

数据信号线上所有的时序遵循DDR(双倍速率)传输模式,起始位 终止位,以及boot 识别位的数据均在时钟的上升沿有效。不一定会在下降沿传输哦。

如果CMD线拉高的情况下,host会终止boot 模式启动,如果host在数据传输中间拉高将cmd线拉高,则EMMC将会终止数据传输,或者在Nst (一个数据循环和结束位循环)内识别pattern.如果host 在连续的block期间终止了启动模式,则EMMC必须在同样的时间内释放数据线。

在boot 操作启动执行期间,EMMC(slave)会准备好用于CMD1操作的数据,同时host 需要发送CMD1,进而启动正常的MMC初始化序列,当所有用于boot 启动的数据全部发送至host后,boot 操作就会停下来。

EMMC在启动模式下的状态图

将在6.15.4 章节详细介绍这一时序

图所示,在CMD 信号线由拉低再拉高后,到CMD1到来之前,需要保持56个clock,如果在发出CMD1之前,CMD信号在上电后保持低电平时间少于74个clock,或者在初始化boot之前,主设备发送除CMD0(参数为0xFFFFFFFA)以外的任何正常EMMC命令,则EMMC不会进行响应,同时EMMC仍处于非引导状态,等待下一次上电或硬件复位正常后,再次进入idle状态。

当BOOT_PARTITON_ENBALE位置位后,主机发送CMD1(SEND_OP_COND) EMMC进入识别模式,并对CMD1 命令进行响应。比如在V4.2 或者之前的协议中,EMMC 不支持这种模式或者BOOT_PARTITON_ENBALE 位清除后,EMMC将会在上电后自动进入idle模式。

6.3.4 备用的boot 模式

自V4.4之后,EMMC中必须支持这种模式,EMMC会在ext_csd寄存器的第228字节中选择置0或者置1来选择设置这种模式,当上电或者硬件复位操作(使用参数为0xF0F0F0F0的CMD0 命令或者硬件复位操作)之后,CMD信号线拉低且CMD1 命令发送之前,host在74个clocks时钟周期内发送了参数为0xFFFFFFFA的CMD0命令,则EMMC认为boot 模式即将初始化,会在内部为初始化需要的数据做准备。host 将优先获取ext_csd寄存器的第179字节的bit[5:3]设置的boot 分区并读取数据。在boot 操作中,host 通过计算公式(128KB* BOOT_SIZE_MULT(ext_csd byte[226]))对读取的数据容量进行计算

当参数为0xFFFFFFFA的CMD0 命令发送后,EMMC会将第一笔boot data 发送至host 的多个data 信号线,host 将使用推挽模式对接收数据直到数据发送完毕。host 可以选择使用向后兼容时序的单倍速率模式传输数据,在10.7 章节中,介绍了可设置ext_csd寄存器第177字节的bit[4:3]选择对应的高速接口模式下的单倍数据传输模式以及双倍数据速率传输模式(看EMMC是否支持)。可对ext_csd寄存器的第228字节的bit2进行设置,了解EMMC 是否支持HS_BOOT_MODE

host 通过将ext_csd寄存器的第179字节的bit6设置为1,来接收EMMC的boot 识别数据,从而host 可以了解到EMMC 当前处于boot 模式。如果EMMC 的boot 识别模式已开启,EMMC会在收到参数为0xFFFFFFFA 的CMD0命令后的50ms以内对host发送识别pattern '010',如果boot 识别功能关闭的话,EMMC 将不会发送。

在单倍速率模式下,数据通过EMMC控制发送,在时钟的上升沿被host 进行采样获取,数据传输结束每个data信号线上会进行一笔CRC校验。

在双倍速率传输模式下,数据在时钟的上升沿和下降沿进行传输,同时每个data信号线上会进行两笔CRC校验。此时的block 长度为512byte,与此同时,其CRC校验根据4线或者8线设置进行交织, 奇数字节会在时钟上升沿进行传输并被host采样,而偶数字节将会在时钟下降沿进行传输并被host采样,EMMC会对每个data信号线上增加2笔CRC校验数据,第一笔用来对host 在上升沿采样的奇数字节数据进行校验,第二笔用来对host 在下降沿采样的偶数字节数据进行校验。

在DAT数据线上所有的时序遵循双倍速率传输模式,且起始位,终止位,以及boot 识别位数据只在时钟上升沿采样有效,时钟的下降沿不一定有效。

host 可以通过发送CMD0(reset) 终止boot 模式,如果在数据传输中途host 发送了CMD0(reset) 命令,那么EMMC将会终止数据传输或者在Nsc时钟周期(Nst 时钟周期指的是 一个数据时钟周期和一个结束位时钟循环周期)内识别pattern'010'。如果host 在连续blocks内停止boot 模式,EMMC 将会在Nst时钟循环周期内释放数据信号线。

当boot 模式执行后, EMMC将为接收来自host 的CMD1 命令做准备,host 会下发CMD1命令来执行正常的MMC初始化流程, 当所有和boot 有关的数据发送至host后,boot 模式将会停止。

备用boot 模式下的EMMC 状态图

具体时序详解见6.15.4 章节

如果上电后且CMD1命令发送之前,CMD 信号线拉低少于74个时钟周期,或者host发送的命令除CMD1或者带参数0xFFFFFFFA的 CMD0 之外的其他正常命令,EMMC将不会进行响应也不会进入boot模式,直到下一轮上电或者硬件复位正常后,进入idle状态。

当BOOT_PARTITION_ENABLE 置位后,host 将会发送CMD1(SEND_OP_COND)命令,EMMC 将会进入识别模式,同时对CMD1 命令进行响应。像V4.2甚至之前的版本,EMMC不支持BOOT 启动或者BOOT_PARTITION_ENABLE 这一位被清除掉,EMMC在上电后会自动进入idle状态。

EMMC 状态转移图(boot模式)

IDLE状态下发送CMD0 后,RESET_BOOT_CONDITIONS 行为说明

6.3.5 访问boot partition

当EMMC 进入传输状态时,host 会下发CMD6(SWITCH) 在ext_csd 寄存器中社会第179字节的PARTITON_ACESS位,接着才能使用正常的MMC命令访问boot 分区。

在EMMC 支持字节访问或者扇区访问模式时候,host使用CMD24(write_block)或者CMD25(write_multiple_block)命令对boot 数据进行编程。如果host使用CMD25 (write_multiple_block)写入数据,并且写入时超过所选择分区的范围,则EMMC将会报错"ADDRESS_OUT_OF_RANGE" 错误。而在分区以内的数据将被写入到所选择的分区中。

在EMMC 支持字节访问或者扇区访问模式时候,host 可以使用CMD17 (READ_SINGLE_BLOCK)或者CMD18(READ_MULTIPLE_BLOCK)命令通过数据信号线获取启动数据。当host使用CMD18(READ_MULTIPLE_BLOCK)命令,并且读取的数据超出了所选择分区的范围,则EMMC 将会报"ADDRESS_OUT_OF_RANGE"错误。

当从boot分区完成数据访问后,PARTITON_ACCESS 位将被清除,接着ext_csd 寄存器中的BOOT_PARTITION_ENABLE将被置1,用来说明哪个分区被用来引导系统启动。对EMMC 来讲,这一操作将会在boot 期间从boot 分区中读取数据。

host 可通过清除ext_csd 寄存器第179字节为'00b',从而使用标准的命令对user area 进行访问。如果在boot 模式下,user area被锁住且boot 被使能的话,数据是不会发送到host中的。然而当user area被锁住,且两个boot分区中有一个被使能的话,数据将会发送到host端,

6.3.6 boot 总线宽度和数据访问配置

在boot 操作中,总线宽度可以通过ext_csd 寄存器的第177字节的bit[0:1] 进行配置,在第177 字节的bit2决定EMMC 经过boot 启动后,总线是否要配置成1线宽度,

寄存器字节[177]中的Bit2确定从机在引导操作之后是否返回到x1总线宽度和具有向后兼容时序的单数据速率模式,或者在正常操作期间是否保持在配置的引导总线宽度中。寄存器字节[177]中的位[4:3]确定数据线是否在引导操作期间使用向后兼容或高速时序亦或者双数据速率模式配置为单数据速率传输数据。而当boot 操作没有启动时,EMMC 将不会参考寄存器设置的是后台兼容时序还是单倍数据启动,直接使用1倍数据总线位宽进行初始化。

6.3.7 boot 分区写保护

为了允许host保护boot 分区的数据被擦除或者写入,EMMC必须支持对每个boot 分区使用两种写保护方式:其一是永久性写入保护,其二是上电后写保护。通过设置ext_csd寄存器的第173字节,写入保护可以分别对每个分区生效,亦或者同时对全部boot分区生效。

当写入BOOT_WP 寄存器时候,host必须遵循一下规定:

除两个R/W位B_PERM_WP_DIS(位4)和B_PERM_WIP_EN(位2)外,BOOT_WP字段的所有位在每次上电后对boot 分区设置两个引导区域的保护模式只允许写入一次。

由于B_PERM_WP_DISbit[4]和B_PERM_WP_ENbit[2]只有两种模式read 和write,且当第一次写入后,就会永久生效。如图24所示流程图进行选择性的设置该寄存器。

如果B_PERM_WP_EN字段只能对一个boot分区进行设置,所以host 需要确保B_SEC_WP_SEL (bit 7) 和B_PERM_WR_SEC_SEL (bit 3)写入数据正确从而避免另一个boot 分区的数据出错。

host 通过设置B_PERM_WP_DIS (EXT_CSD[173] bit 4) 和B_PWR_WP_DIS (EXT_CSD[173] bit 6),禁止对boot 分区设置永久性保护或者上电写入保护。在不要求写入保护的情况下,需要对这两位进行设置,确保启动该区域不会受到无意或恶意的保护。

了解设置Secure_WP_EN时BOOT_WP寄存器的进一步处理。请参阅6.6.40相关的安全写入保护模式内容。

图24 对ext_csd 寄存器的第173字段BOOT_WP设置过程

6.4 设备识别模式

在该模式下,host 需要对EMMC 进行置位,验证操作电压范围和访问模式,识别EMMC并在总线上为EMMC分配相对设备地址(RCA)。设备识别模式下的所有数据通信仅使用命令行(CMD)通信。

6.4.1 设备复位

当收到带有参数为0x00000000的CMD(意思是GO_IDLE_STATE)后,EMMC将会进去idle 状态。以下情况下EMMC将会进入idle 状态。

. boot 操作完成后;

. 在pre_boot 状态后CMD 信号线拉低并少于74个时钟周期;

. 上电后EMMC没有启动boot。

这个状态下,EMMC输出驱动处于高阻状态,同时使用默认的相对设备地址为0x0001和默认的驱动器级寄存器设置进行初始化,如7.6所示。host通过识别时钟速率fod对总线进行驱动,如10.6所述。在除过Inactive之外的所有的状态中,参数为0x00000000的CMD 信号均会生效,而Inactive 状态下,EMMC 不接受参数为0x00000000的CMD0命令。

出于向后兼容的考虑,如果EMMC除了Inactive 之外的状态,收到参数不为0xFFFFFFFA和0xF0F0F0F0F0的CMD0时,应该会将其看作是复位信号,同时自身切换到idle状态。

参数为0xFFFFFFFA的CMD0命令为boot 初始化命令,但是host在除过Inactive状态或者pre_boot 状态之外的状态下,发送这一命令,EMMC会认为是复位命令且将自身切换到idle 状态。

图25 EMMC 状态框图(设备识别模式)

6.4.2 访问模式验证(针对容量大于2GB的EMMC)

对于EMMC来讲,尽管host 指定了EMMC的电压范围,但是CMD1命令生效时的电压范围是无效的。

同时EMMC总线busy时,在自身容量低于2GB时,对CMD1的响应参数为0x00FF8080 且容量高于2GB时响应的参数为0x40FF8080,这期间不会将自身状态切换为Inactive。

CMD1(SEND_OP_COND)命令和OCR寄存器中有2bit 用于指定其支持的访问模式。CMD1命令的参数可以专门设定便于host 进行扇区格式读写数据。在作为回应的OCR寄存器中有对应的bit 用来设定要使用的扇区类型。只有在host发出CMD1(EMMC切换到ready 状态)命令的最后一次包含OCR寄存器的响应才是有效的。

如下是两种host和EMMC之间的握手方式

1.如果host没有向EMMC说明其能够处理的扇区类型,则对高于2GB容量的EMMC进行寻址会将其状态更改为Inactive(类似于没有共同电压范围可供使用的情况)(如果主机发送用于电压范围验证的参数0x00000000,则EMMC在有效电压范围内不得将自身状态更改为Inactive)如果主机生成的操作数为0x0000 0000,同时不代表其他意思时,EMMC也会切换到Inactive状态。

2. 根据OCR寄存器中寻址要求的扇区类型的指示,host能够将EMMC从字节访问模式切换到扇区访问模式并进行自身准备。

如果EMMC进入ready 状态仍处于总线busy 时,则会使用0x00FF8080或者0x40FF8080 的固定pattern进行响应。此时host不会收到busy状态并持续检测。

出于兼容性考虑,host可能需要改变EMMC的电压。如果host将EMMC电压值从一个范围更改到另一个范围时,EMMC首先完全断电,接着重新上电新的电压范围。如果使用1.95V至2.7V的电压值时,使用双路电压的EMMC可能会出现故障。

对host来说,需要通过EXT_CSD寄存器中读取SEC_COUNT的值来重新确认寻址模式。

6.4.3 从busy状态转换到ready状态

在EMMC的CMD1的响应中有一个busy位,用来通知host 在上电或复位后EMMC 仍处于工作中(工作内容比如从存储分区加载需要用到的寄存器信息),且目前还无法进行数据接收。这种情况下,需要host持续发送CMD1 命令直到EMMC自身的busy 状态解除后可以进行数据交互。

在初始化过程中,不允许host 对EMMC的工作电压和寻址访问模式做任何更改。EMMC收到设置发生改变的消息时自身也会忽略掉。如果真的需要,则host 需要使用参数为0x00000000的CMD0 命令来复位EMMC并重新执行初始化操作。

但是,对于已经处于Inactive(无效)状态的EMMC来讲,必须通过关闭电源再打开电源来进行硬重置。

当host明确要停用设备时,会使用命令GO_INACTIVE_STATE(CMD15)将寻址的EMMC切换到Inactive状态。

本标准定义的所有设备均适用CMD1命令。

6.4.4 设备识别过程

如下内容是指在使用在多个EMMC存储方案中工作的EMMC,如 v4.0 之前的本标准版本中所定义的那样,为了向后兼容系统需要进一步对其维护。见10.6章节内容,host在开漏模式下使用频率为fOD的时钟进入设备识别模式,且在开漏模式下,CMD信号线上的开漏驱动器允许EMMC识别过程中使用并行方式。

当总线激活后,host 要求EMMC发送有效的CMD1命令,与之对应的响应则是所有EMMC在满足协议要求下进行线与操作。不兼容的EMMC则被设置为Inactive状态。接着host 将会发送CMD2(ALL_SEND_CID),要求所有的EMMC 发送各自的CID(device identification),接着所有还没识别结束的EMMC 开始串行发送其CID,host 按位监控每个EMMC 输出的值。没有识别成功的EMMC 需要立刻停止在CMD信号线上发送CID,并继续保持的ready 状态,等待下一个识别周期到来时,host再次进行识别。

由于每个EMMC对应唯一的CID,因此只能有一个EMMC 成功地将其CID值发送至host后,会进入Identification状态。接着,host 发送CMD3(SET_RELATIVE_ADDR,设置相对地址) 对该EMMC分别相对地址,该地址位数低于CID值,同时该地址将会用于接下来的数据传输模式(数据传输模式下的时钟频率高于fOD)。当EMMC接收到RCA后,将自身状态切换到stand-by状态。此时识别成功的EMMC在host发出的下一轮识别周期期间不会做出任何响应,同时将自身的驱动模式由开漏输出切换到推挽输出。

host 在收到CMD2命令的CID 响应之前会重复识别过程一直发送CMD2和CMD3。如果没有其余的EMMC 响应的话,说明所有的EMMC 均被识别完成。在6.15 章节描述了一种CMD2命令后经过NID个识别时钟周期后没有响应。

6.5 中断模式

e•MMC系统上的中断模式使host(e•MMC主机)能够同时向从EMMC授予传输数据。此模式降低了host的轮询负载,从而降低了系统的功耗,同时保持了host对EMMC服务请求的足够响应。host和EMMC均可选择支持e•MMC中断模式。

. 图26 描述了中断模式下的系统状态图。

. host在发送CMD40 (GO_IRQ_STATE)之前,必须确保EMMC 处于stand-by 模式下。当host等待EMMC对中断命令的响应时,必须保证时钟信号有效。时钟速率可以根据所需的响应时间做更改。

. host通过下发CMD40(GO_IRQ_STATE) 命令切换EMMC处于中断模式。

. 处于中断模式下的EMMC必须等待中断事件进行触发。当出现中断事件时,EMMC在开漏驱动模式下将其响应发送至host。

. 在等待内部中断事件器件,EMMC需要等到来自CMD 信号线的命令,当检测到命令的起始位时 EMMC将会停止中断模式 ,同时切换自身状态为stand-by模式。

. 在CMD40响应期间,EMMC会切换到stand-by状态,不会关注总线控制信号(与CMD2相反)。

. 当host 收到中断响应后,会进入正常的数据通信流程中。

图26 EMMc 数据传输和中断模式流程图

. 如果host想要在接收到中断响应之前终止中断模式,可以使用预留的RCA地址参数0x0000进一步生成CMD40响应(device bit=0);这样就可以让EMMC从等待IRQ状态返回到stand-by状态。现在host可以恢复正常的通信过程。

6.6数据传输模式

当EMMC 进入stand-by 模式后,CMD信号线和data信号线以推挽模式进行数据传输。同时fpp时钟频率保持在fod直到EMMC的csd 寄存器被host 获取。紧接着host 会下发CMD9(SEND_CSD)获取CSD寄存器中的指定数据。

图27 EMMC 状态转换图(数据传输模式)

EMMC中通过CMD4(SET_DSR) 配置驱动端的传输命令。具体指会设置DSR寄存器的总线长度以及数据传输频率,同时时钟频率会从fod 切换到fpp

当EMMC处于Stand-by模式时,host下发参数为EMMC相对地址的CMD7命令用于选择对应的EMMC并将其切换到数据传输状态。如果EMMC先前被选中并处于传输状态,则它与host的连接将被释放,并且当CMD7取消选择时,它将回到stand-by状态,参数中的只存在地址都不等于EMMC自身的相对地址。 当参数为预留相对设备地址“0x0000”的CMD7 命令发送后,EMMC将会回到stand-by 模式当EMMC处于传输状态时,接收到带有EMMC自身相对地址的CMD7命令会被忽略,且有可能被视为是非法命令。

所有host和带有RCA的EMMC在数据传输模式以点对点的方式进行通信,所有的地址命令通过CMD信号线被识别并响应。

见图27,总结了多数据之间传输模式的关系。

·  host 下发CMD12命令后,所有的读数据命令都被禁止,数据传输终止,且EMMC切换到stand-by 状态,读命令比如:CMD17(读block),CMD18(读取多个block),CMD21(发送tuning block),CMD30 (发送写保护命令)

·  host下发CMD12命令后,所有的写数据命令被终止,接着CMD7 命令断开EMMC和host 的通信,写命令比如:CMD24 CMD25,CMD26(写CID) 以及CMD27(写CSD寄存器命令)

·  一旦数据传输完成后,EMMC将会退出写入数据状态,切换到编程状态或者数据传输状态(数据传输失败的时候)

· 如果块写入操作被停止,同时最后一个块的长度和CRC有效,则将对写入数据进行存储。

·EMMC 设备中,对写入的block提供了缓存,意味着上一个块在存储的时候可以写入下一个块。

·然而当写入CSD寄存器以及CID 寄存器,写保护或者擦除的时候,是不会提供缓存的,意味着当EMMC处于busy 状态时,CMD信号线上是没有命令传输的,此时当EMMC处于busy或者编程状态时候,Dat0 信号线将被拉低。

·当EMMC 处于编程状态时 ,参数设置命令比如CMD16(设置block长度),CMD35-36(擦除选择的group)

· 当设备在编程时,读命令是不被允许的

·当使用CMD7 命令切换另一个EMMC从stand-by状态到传输状态时候,将会终止对数据的编程操作,此时EMMC 将切换自身为断开状态,并释放data0 信号线。

·再次使用CMD7 命令将会保持host与EMMC的通信,这种情况下天,EMMC 将会从切换到编程状态,并重新声明busy 标志符

·当(CMD0,CMD15,或者硬件复位EMMC)复位或者上电异常将会导致任何挂起或者编程生效的操作。

·如果EMMC没有开启可靠性编程这一功能,以上操作将会导致寻址操作中的局部或者全部数据处于未知状态,host 必须为此担责。

·在使用(CMD19,CMD14)命令执行总线测试过程之前,需要设置数据传输的时钟频率。通过这种方式,总线测试能够给出实际的结果,如果总线测试程序以低于数据传输频率的时钟频率运行,得到的结果不一定是真实的。

·这些命令如用于总线测试的命令(CMD14,CMD19),加解锁命令(CMD42),设置block长度命令(CMD16)在EMMC使用双倍速率模式传输的情况下是不能够生效的,同时这些命令应被视为非法命令不该被执行。

在以下格式定义中,所有大写标志和参数在CSD寄存器(见7.3章节)中定义,其他状态标志在设备状态(见6.13章节)中定义。

6.6.1 命令集合和扩展设置

默认情况下,上电后或者使用参数为0x00000000的CMD0 命令复位亦或者boot 操作后,EMMC 在给定的命令集合中工作。在EMMC 的标准命令集合中,使用DAT0 信号线。同时host可以下发命令集合中的CMD6 命令选择需要的访问模式进行指挥EMMC 工作。

EXT_CSD寄存器中定义了支持的命令集以及当前选择的命令集,EXT_CSD寄存器分为两部分,即属性段和模式段。属性段包含有关设备功能的信息。模式部分反映EMMC的当前选择的模式。

host 通过下发SEND_EXT_CSD 命令来读取ext_csd寄存器的值时,EMMC将发送ext_csf 寄存器中的512bytes 数据作为响应。保留的字段或者只写的字段,使用0进行填充。host也可以发下switch 命令并设置其中一种访问模式,并将其写入ext_csd寄存器的模式段,所有三种模式都访问和修改EXT_CSD字节中的一个字节,即索引字段所指向的字节。

注:“索引”字段可以包含0–255之间的任何值,但只有0–191为有效值。如果索引值在192-255范围内,则EMMC不会执行任何修改,并设置SWITCH_ERROR 状态位。

switch 命令既可以写入ext_csd 寄存器,又可以改变命令集合。如果该命令的作用是改变命令集合那么索引和值字段将会被忽略,ext_csd 寄存器将不会被写入,如过switch 命令用来对ext_csd 寄存器写入的话,命令集合区域被忽略,同时命令集合保持不变。

switch 命令的使用R1b 作为响应,因此当busy 标志解除后,host 使用send_status 命令读取EMMC 状态,从而检查switch操作的结果。

6.6.2 高速模式选择

如果host 想要让EMMC 保持在26MHz的时钟频率,应该切换时钟模式到EMMC所支持的高速时钟模式:即频率在26MHz到52MHz的高速时钟,其中High Speed的时钟频率范围为0MHz到52MHz,HS200和HS400的时钟频率为0MHz到200MHz, 见表4.

注:当实际的时序改变时,由于异步操作,无法保证发送的任何命令(如CMD13)的之后的EMMC行为。因此,不建议使用CMD13来检查定时改变指示的繁忙完成。如果使用CMD13,host必须忽略CRC错误(如果出现CRC错误)。以下部分详细描述了模式选择。

6.6.2.1 高速模式选择

自V4.0标准之后,host 需要设置高速模式才能切换时钟频率为26MH至52MHz的范围。表A.222对EMMC 上电或者软复位之后的时钟频率进行了设置。

host需要先设置高速接口时序,才能切换为更高的时钟频率。host 需要使用switch命令对ext_csd 寄存器的HS_TIMING字段写入0x01, 7.4.65 章节定义了ext_csd 寄存器中的有效值。如果host 写入了错误的值,则HS_TIMING 字段不会改变,同时switch_error 位将会报错。

6.6.2.2 HS200 时序模式选择

HS200 在VCCQ为1V8 或者1V2时有效。

且该模式下的总线位宽为4bit 单倍速率传输或者8bit 单倍速率

当host 对EMMC 初始化后,将会通过读取ext_csd寄存器的device_type字段验证EMMC是否支持HS200模式。

接着可能通过选择HS200模式,从而切换时钟频率超过52MHz。

上电或通过CMD0进行软件复位之后,接口时钟频率将会被设置为默认的后台兼容时序,在必要的情况下,选择执行调优操作,并选择HS200模式。

以下是host 切换为HS200需要操作的步骤:

1)通过下发CMD7 命令选择合适的EMMC,通过CMD42 命令查看EMMC 是否处于锁着的状态

2)通过读取ext_csd 寄存器的第196字段DEVICE_TYPE 验证EMMC 是否在适用于主机和设备的IO电压下支持HS200 模式

3)读取ext_csd寄存器的第197字段DRIVE_STRENGTH字段,寻找EMMC 支持的IO口驱动等级(注:如果没必要改变驱动力的话,这一步可以跳过)

4) 通过host下发CMD6命令,在ext_csd 寄存器的第185字段设置HS200 模式和驱动等级,如果host 写入的值无效,则HS_TIMING 字段不会改变,HS200 时序不会发生改变,且驱动力也不会改变,同时SWITCH_ERROR位会置位,在EMMC 发出R1 响应期间,会设置busy 标志位。一旦busy 标志位取消后,host收到可以传输数据通知信息且没有报错信息(没有报错信息意味着EMMC完成设置HS200模式和驱动强度参数),在HS200时钟频率下发出CMD13(SEND_STATUS)

5) 此时,host 可以设置小于200MHz 的时钟频率

6)见6.6.5章节,host 通过下发CMD21 命令设置HS200 tuning调优过程。

注意:在开始tuning调优操作之前,host需要设置好对应的总线宽度便于EMMC 在合适的情况下进行tuning。

图28 执行HS200的流程图

6.6.2.3 HS400 时序模式选择

HS400工作在VCCQ为1V8或者1V2的IO电压下

HS400 模式下,总线宽度设置为8线双倍速率模式

HS400 支持与DDR52 相同的命令

host 完成对EMMC的初始化之后,再读取ext_csd 寄存器的DEVICE_TYPE 字段来查看EMMC 是否支持HS400 模式,接着会在改变时钟频率大于52MHz 这一步之前于EMMC 中使能HS400 模式。

当EMMC上电或者使用CMD0 软复位之后,类似于HS200,时序接口将设置为后台兼容模式

host通过如下流程将EMMC 切换到HS400模式,

. 使用后台兼容模式对EMMC 进行初始化

. 下发CMD7命令来选择EMMC

. 读取ext_csd寄存器中的第196 字段[DEVICE_TYPE] 来验证EMMC 是否支持HS400 模式

. 读取ext_csd 寄存器中的197字段[DRIVE_STRENGHT]来查看EMMC支持的驱动强度。

术语简介:https://blog.csdn.net/little_ox/article/details/118382500

. 设置ext_csd 寄存器的185 字段[HS_TIMING] 来为HS400 模式设置 驱动强度,并设置参数0x2 用于切换到HS200模式

. HS400 模式下,执行TUNNING 时的时钟频率(HS200 模式下的tunning后的时钟频率和HS400 模式下的tunning 频率保持一致)

. 设置ext_Csd寄存器的第185字段选择相应的tinming interface参数 0x1,用于切换到HS 模式,接着设置时钟频率不高于52MHz

. 选择第183字段[BUS_WIDTH]为0x06,用于选择设置8线双倍数据传输

. 在第185字段[HS TIMING] 设置timing interface 参数为 0x3 用于切换到HS400 模式

该流程图描述了打开ES功能后,在不需要tuning时 ,EMMC 如何被初始化到HS400模式,

在host 对EMMC 进行初始化后,host 通过ext_csd的DEVICE_TYPE字段和STROBE_TYPE 字段,来查看EMMC是否支持HS400 模式,

在上电或者下发CMD0命令进行软重启后,EMMC将会以默认的后台兼容模式进行工作

在启用带有ES的HS400模式后,host将会执行如下流程:

. 使用兼容性时序对EMMC 进行初始化

. 通过CMD7 命令来选择要使用的EMMC

. 通过读取ext_csd寄存器的196字节[DEVICE_TYPE]来验证EMMC是否支持HS400模式

. 读取ext_csd寄存器的184字段[strobe_support]验证EMMC是否支持ES功能

. ext_csd寄存器中设置第185字段为0x1,用于切换到high speed 模式,然后将时钟频率设置为小于52MHz

. 设置第183字段[BUS_WIDTH]为 0x06,用于选择8线双倍速率总线模式,并打开ES功能,(只有HS400 模式选中后,才可以打开ES功能)

. 读取197字段,查看EMMC 所支持的驱动强度(如果不需要设置则可以跳过该步骤,需要的话host 可以改变驱动强度)

. 设置第185字段[HS_TIMING]为0x3,用于切换到HS400模式;

. host将时钟频率设置为不高于200MHz

Host 通过以下流程切换到带有增强片选的HS400 模式:

该流程图描述了在使用ES功能(打开时,就不需要下发CMD21命令进行tuning操作)时,如何在HS400 模式下初始化EMMC。

在host 完成对EMMC 的初始化之后,host 通过读取ext_csd寄存器的DEVICE_TYPE字段和STROBE_SUPPORT字段来确定是否EMMC 支持HS400模式(带ES功能)

当上电或者下发CMD0命令进行软件复位,EMMC 的接口时序会切换到默认的后台兼容模式;

6.6.3 功耗类型选择

在4.0 之后的版本中,包括版本,将会对EMMC 的功耗进行修改,

在上电或者下发CMD0 软复位之后,EMMC的功耗等级默认为class 0,无论是单路电压还是双路电压来讲这是最小的功耗等级。在ext_csd寄存器中,的PWR_CL_ff_vv字段,有对应的功耗等级:分别是时钟频率为26MHz,52MHz,或者200MHz对应的4线总线模式或者8线总线模式。

host 使用SEND_EXT_CSD 命令读取EMMC当前的功耗,再决定是否调整EMMC的功耗。如果功耗等级需要改变的情况下,host下发SWITCH 命令对ext_csd 寄存器模式段的POWER_CLASS字段写入,

在7.4.55 章节中的PWR_CL_ff_vvv[203:200],PWR_CL_ff_vvv[237:236],PWR_CL_DDR_ff_vvv[239:238]和PWR_CL_DDR_FF_vvv[253]字段中定义了有效的功耗值。如果host 尝试写入一个无效的值,POWER_CLASS字节将不会修改,同时SWITCH_ERROR这一位将会置位报错。

6.6.4 总线测试过程

在单倍数据模式下,host 下发CMD19和CMD14 命令来检测和总线有关的功能引脚。而在双倍速率模式下,CMD19和CMD14命令被认为是无效的。

第一步,host对EMMC下发CMD19命令,紧接着是在所选取的data 信号线上传输专门的数据pattern,如表7所定义,第二步,host下发CMD14命令,EMMC将会返回接收到的数据pattern,当host 下发数据pattern后,同时EMMC返回数据pattern后,总线相关的功能引脚才会被检测到。

EMMC 将会忽略掉除数据pattern 前两个bit 外的其他bit,所以,EMMC 的buffer容量不受数据pattern 最大长度限制。数据pattern 最小的长度是两个字节,且每个data信号线上的前两个bit 均会被EMMC返回。host 可能在下发数据pattern 时跟随这16bit 的CRC校验值。不过EMMC将会忽略掉这些校验值。

EMMC将会检测到DAT0信号的开始位,并同步读取输入的所有数据。

host忽略返回的数据pattern中除了两个第一位之外的所有位。EMMC返回的数据模式的长度为8字节,且一直通过EMMC的所有DAT数据线传输(详见表8至表10)。同时由EMMC返回的反向数据pattern可能会包括CRC16校验,host会忽视掉该校验

EMMC的DAT1–DAT7信号线上具有内部上拉功能。当EMMC只连接仅1位数据信号线(如data0)或4位数据信号线的情况下,其内部会分别拉高DATA1-DATA7信号线或者DAT4-DATA7 信号线。

表8 1位总线测试pattern

表9 4位总线测试pattern

表10 8位总线测试pattern

6.6.5 总线采样 tuning 简介

在host上,会通过执行tuning 过程,从而选择合适的数据采样点,以保证数据采样数据正确。当EMMC 进入HS200 模式(时钟频率为200MHz,此时属于高速信号)时,会开始执行tuning通过tuning方式,扫描整个UI过程,从而得到最佳数据采样点。

如下是host 采样点进行tuning过程的示例(HS200 tuning原理框图见5.3.4章节):

  1. host 端的采样控制器进行复位
  2. host 下发 SEND TUNING block 命令,读取tuning block
  3. EMMC 发送作为读数据的tuning block,host将会接收到该数据,并和已知的tuning block pattern 进行对比。
  4. host端的采样控制器执行一步,
  5. host 下发命令读取下一个tuning block

重复执行第3到第5步,从而覆盖整个UI.

当完成对整个UI的读取之后,host 可以识别到有效的滑窗,从而决定有效的采样点(可能会设置有效窗口的中心点) 当host 完成了采样点之后,就可以执行读取数据或者写入数据的相关操作了

注:以上仅供参考,根据各自公司的设计,host也有可能通过其他方式实现tuning的功能。

6.6.5.1 HS200 模式下的采样tuning 序列。

当EMMC切换到HS200模式时,host可以通过采样tuning 序列来补偿由于不同的硅工艺、PCB负载、电压、温度和其他因素引起的时序变化。tuning过程的采用的时钟频率和实现方式取决于host系统的实现方式。

根据host命令,EMMC在128 个时钟周期内,分别在4位或8位的数据传输模式下,向host分别发送包含64或128个带有已知数据格式字节块的,host通过EMMC返回的数据pattern来找到数据线的最佳采样点

CMD21,又称为send tuning block,用来发送tuning block,CMD21 命令之后跟随着为R1的响应。当EMMC处于未上锁的状态时,CMD21 命令只在HS200 模式下才能生效。上锁相关内容见6.6.19章节,在其他任何情况下,CMD21 命令被视为非法命令。由于CMD 21 命令发送的数据为固定格式,故在CMD21 命令之前不需要出现CMD16(SET_BLOCKLEN)

图31 为CMD 21 命令遵循的单个数据块读取命令

host 可以发送CMD21的tuning 序列,直到tuning 过程完成,找到最佳数据采样点。

且EMMC保证能够在150毫秒内完成40次CMD21序列,这140ms 并不包括任何host 数据传输花费的时间

图 32 定义了8线数据传输模式下的tuning block pattern,其中低4位的pattern 和4线传输模式的tuning block pattern 相同。

图32 8线数据传输模式下的tuning block pattern

图33描述了已知pattern在DAT[7:0]中的分布方式。它仅包括用于说明的前16个字节,以及每个数据线的固定CRC16值。每个数据行的顺序是左->右。

tuning block的目的是在总线上创建“特殊”信号完整性case。这种特殊的pattern会触发高SSO噪声、确定性抖动、ISI和定时错误。因此,host在进行tuning应切换到所需的总线宽度进行tuning

因此,该pattern是创建HS200系统在特定host和EMMC组合过程中应该经历的最坏情况下采样有效数据的窗口(最小有效窗口)。

图33 4线或者8线总线宽度下的tuning block

6.6.6 总线宽度选择

当host验证过和总线相关的pin脚后,接下来使用switch命令对ext_csd 寄存器的BUS_SWITCH字段写入来更改总线宽度。在软复位以及重新上电后,BUS_SWITCH 的值为0x00。7.4.66 章节定义了该寄存器的有效值,如果host写入的值不对,则BUS_SWITCH字段不会被改变 ,同时SWITCH_ERROR位置1,该寄存器只有写入的权限。

6.6.7 数据读

在不传输数据的情况下,DAT0-DAT7被拉高。数据块传输时候在数据信号线上的开始位是低电平,紧跟着的是持续的数据流,数据流中包括这有效数据(在使用UECC校验功能的时候,也包括错位校验位的数据)

每个data 线上的数据流结尾以高电平结束,见图42,43,49;在非HS400模式下,数据传输和时钟信号保持同步,而HS400 模式时候,数据传输和DS信号保持同步

在单倍数据模式下,有效的数据块传输时候受一次CRC校验和保护,而在双倍数据模式下,受两次数据校验和保护。

6.6.7.1 块读取

在单倍数据模式下,基本的数据传输单元是block,其最大容量受CSD寄存器的READ_BL_LEN规定。

如果设置了READ_BL_PARTIAL,则也可以发送起始地址和结束地址完全包含在一个物理块(如READ_BL_LEN所定义的)内的较小块。CRC被附加到每个块的末尾,从而确保数据传输的完整性。

CMD17(READ_SINGLE_BLOCK)初始化每个读的block,当完成数据传输后,EMMC将回到传输状态。

在双倍数速率模式下,每个读取的block只能为512字节,且不支持对block 拆分读取,每一个block增加两种CRC 校验和,一种是用于偶字节校验,另一种用于奇字节校验。

当传输少数几个连续的block时候,下发CMD18命令(READ_MULTIPLE_BLOCK)多个block 读取有两种方式,host可以自由选取任一使用

. 开放式多block读取

在这种方式下,block的数量没有规定,EMMC从而可以持续传输数据block ,直到接收到ost 下发的stop 命令

. 固定数量的多block读取

EMMC可以传输固定的数据block, 传输完毕后回到transfer 状态,在这种方式下,不需要下发stop 命令,除非出现数据传输错误的情况,

为了开始读取固定数量的block进行传输,host需要在下发CMD18 命令之前,直接下发CMD23 命令(SET_BLOCK_COUNT)否则EMMC将进入开放式传输模式,从而使用STOP_TRANSMISSION命令停止数据传输。

多个block读取操作时,host可以在任意时刻终止数据读取,而不会在意传输的数据类型。

即通过下发stop transmission 命令实现传输停止操作,如果如下任意一种情况发生时,EMMC将会拒绝命令,保持在数据传输状态并分别基于如下对应的每个错位对host进行回应。

. host提供的地址超过EMMC内部范围的地址作为CMD17或CMD18的参数,ADDRESS_OUT_OF_RANGE置位

. 在读取操作时候,定义的block 长度非法,BLOCK_LEN_ERROR将会置位

. 地址/块长度组合的第一个数据块位置和EMMC物理位置块不对齐,ADDRESS_MISALIGN置位。

如果在多个块读取期间,EMMC检测到如上述相关的error后,将会停止数据传输,并保持自身处于data 状态,host将会下发stop 传输命令,停止数据读取操作,同时读操作报错的信息将会体现EMMC的响应中。

如果host 在固定数据块读取最后一个块后下发了停止数据传输的命令,则该命令被视为是非法命令,因为此时的EMMC 没有在数据传输状态中。

如果host使用长度未进行块对齐的一部分块,且EMMC中不允许块未对齐,此时EMMC应在传输第一个未对齐块时检测块未对齐这一的错误情况,并且进一步检测到传输的位中的内容未进行定义。在host发送CMD12命令,EMMC将以ADDRESS_MISALIGN位进行响应,并回到Tran状态。

如果host 下发SET_BLOCK_COUNT命令(CMD23)并设置参数为0,且EMMC接收了这一命令,接下来将遵循开放式读取block的方式进行,在数据传输完成后,需要下发CMD12命令停止传输。

如果host 下发CMD16 命令用于对容量超过2GB的EMMC设置密码,host需要在数据读取之前,重新下发CMD16 命令。否则,EMMC将响应BLK_LEN_ERROR并在没有数据传输的情况下保持在TRANS状态,因为数据块(密码应用除外)传输是扇区单元(512B)。当在不支持部分读取访问的情况下,同样的错误也适用于高达2GB容量的EMMC。

6.6.8 数据写入

写操作的数据传输格式和读操作类似。对于面向块的写入数据传输,在每个数据块中添加一个单数据速率模式的CRC检查位或通过两个双数据速率模式的CRC检查位。在写入操作之前,设备对每个接收到的数据块执行CRC奇偶校验(参见0)。通过这种机制,可以防止对错误传输的数据的写入。

通常,写进程的中断不会导致任何其他地址的现有数据损坏。然而,在不同的应用程序中,在写操作过程中删除电源的风险是不同的。此外,对于用于实现eMMC的一些技术,在电源故障期间保护现有数据(例如,由之前完成的写入操作写入的数据)和写入性能之间存在权衡。主机有能力设置所需的数据可靠性类型。当EXT_CSD(WR_REL_SET)中的写入数据可靠性参数(WR_DATA_REL_USR、WR_DATA_REL_1、WR_DATA_REL_2、WR_DATA_REL_3和WR_DATA_REL_4)设置为1时,将向主机指示相关分区中的写入机制,以保护该分区中的现有数据。这意味着,一旦设备向主机指示写入已成功完成,所写入的数据以及之前所有写入的数据将不会被主机启动、控制器启动或意外的其他操作损坏。这些位的值为0将表示如果删除电源,这些分区中以前写入的数据存在一些风险。这种可靠性设置只影响主要用户区域和通用分区的可靠性。引导分区和RPMB分区中的数据必须具有与将WR_DATA_REL位设置为1所暗示的相同的可靠性。这些分区的可靠性不受WR_DATA_REL位值的影响。

主机可以选择更改在设备上的一个或多个分区中写入的可靠性。整个寄存器被认为是写入一次,因此主机有一次机会写入寄存器中的所有位。(不允许单独写入来更改各个位)此写入必须作为分区过程的一部分进行,并且必须在设置PARTITION_SETTING_COMPLETED位之前进行。在分区过程完成之前(即在电源循环发生且分区成功完成之后),对WR_REL_SET寄存器所做的更改不会产生影响。设备中不存在的分区的数据可靠性设置对设备没有影响。所有的写操作都必须按照它们到达的顺序来完成。顺序限制适用于设备接收到的每个写入命令,但不适用于特定写入命令中的数据。

6.6.8.1 块写入

在单倍速率模式下,命令CMD24-27写进行单个块或者多个块写入的时候,其末尾带有host 添加的CRC数据校验。支持块写入的EMMC可以定义好写入长度的数据块。如果CRC 校验失败的话,EMMC将会在DAT0 数据信号线上说明该错误,传输的数据将被丢失或者不写入。在多个块传输模式下,紧随其后的数据将被忽视掉。在双倍速率传输模式下,写入block的长度为512字节,此时的EMMC也不支持部分块写入方式,同时在数据传输完成后,增加两种CRC数据校验方式,一种用于奇数校验,另一种用于偶数校验。host下发CMD25(write_multiple_block)对多个块的数据写入。如下定义了三种多个块数据写入的方式(host可以随时使用这三种写入方式)

1. 开放式多个块写入

多个块写入时,对写入块的数量没有约定,EMMC接收到编程信号时,持续写入,直到接收到来自host 下发的stop命令,

2. 预定义的多个数据块写入

EMMC可以接收到需要写入块的数量,当完成写入动作后,终止数据传输,并返回到transfer 状态,这种方式写不需要在写入完成后下发stop命令,除非写入时出现报错。

为了开始执行固定块数据写入的动作,host 必须使用CMD23(set_block_count) 命令接着下发CMD25命令写入数据,如果没有设置写入块的数量,则EMMC将进入开放式写入模式,数据写入完成后需要下发停止命令。

3. 可靠性写入:定义好写入的块数量以及可靠性写入的参数

这种写入方式类似于文提到的预定义多块写入,区别在于写入同一逻辑地址的新数据被成功编程之前,原逻辑地址指向的旧数据必须保持不变。这样做的目的为了保证原数据块在写入数据后能够及时更新,即使在编程过程中发生突然断电,数据也要保持是有效的。

所有的block 容量被定义为512B,此时的CMD16(SET_BLOCKLEN)命令无效。如果大扇区模式激活后,则数据以多个容量为512Byte的block或者8个512byte的block 进行写入。

在进行可靠性写入的时候,大扇区模式下写入block的长度不受限。

通过CMD23 命令设置Reliable Write Request 参数(即第31bit)设置为1,

可靠性写入需要保证扇区对齐,在没有对齐的情况下,第19位将会置位,同时数据写入失败。

如果在可靠性写入的过程中发生断电,则写入sector中的数据呈原子状分布:即掉电后sectors中的数据可能包含新写入的数据,也包含原来保存的数据,所有要写入sectors 将被终止,每一个中的数据状态可能如下所示:所有的sectors 写入了新的数据或者所有的sectors 仍然保存着旧数据,或者一些sector包含着新写入的数据,而另一部分的sectors保存着旧数据。

防止万一出现可靠性写入被打断,则写入完成的sectors会被寄存器进行标记,其余的sectors 保存着旧的数据。

寄存器REL_WR_SEC_C[222] 被设置为1 不会对可靠性写入操作有影响。

在多个块写入期间,可靠性写入操作可以被host 打断,不会考虑写入的数据类型

在多块操作中,主机可以随时中止写入,无论其类型如何。传输中止是通过发送停止传输命令来完成的。如果具有预定义块计数的多块写入时中止,则其余块中的数据不会被定义。

如下任一一种情况发生时,EMMC将会拒绝命令,保持在传输状态,同时对host 响应其错误位。

. host使用CMD24或者CMD25 定义的地址超过范围,ADDRESS_OUT_OF_RANGE 将会被设置。

. 写操作期间定义的block长度非法,则BLOCK_LEN_ERROR将会被置位

. 地址/块长度组合将第一个数据块对齐到设备物理块之外,ADDRESS_MISALIGN将置位。

如果EMMC在多块写入操作(两种类型)期间检测到错误(例如写保护违规、超出范围、地址不对齐、内部错误等),它将忽略任何进一步的传入数据块并保持接收状态。然后,host必须通过发送停止传输命令来中止操作。写入错误将在停止传输命令的响应中报出。

如果host在EMMC接收预定义块数的多块写入的最后一个数据块被接收后发送了停止传输命令,则这被视为非法命令,因为此时的EMMC不再处于接收状态。

如果host使用了部分块,但其累计长度不是块对齐的,并且在不允许块不对齐的情况下(由于CSD参数WRITE_BLK_MISALIGN未设置),则EMMC应在接收到第一个不对齐的块时检测到块不对齐错误,中止写入操作,并忽略所有进一步的传入数据。当host发送CMD12时,EMMC将响应设置ADDRESS_MISALIGN位并返回到传输状态。

如果host将SET_BLOCK_COUNT命令(CMD23)的参数设置为全0时,则该命令将被接受;但是,随后的写操作将遵循开放式多块写入协议,此时需要下发(STOP_TRANSMISSION)在数据传输完成后停止。

编程CID和CSD寄存器不需要先进行块长度设置。传输的数据会受到CRC保护。如果CSD或CID寄存器的一部分存储在ROM中,则此不可更改部分必须与接收缓冲区的相应部分匹配。如果匹配失败,则EMMC将报告错误但不会更改任何寄存器内容。

一些EMMC可能需要长时间且不可预测的时间来对数据块进行写入。在接收到数据块并完成CRC检查后,EMMC将开始写入并将DAT0线保持低电平。host可以随时使用SEND_STATUS命令(CMD13)查询EMMC的状态,设备将响应其状态(除了睡眠状态)。状态位READY_FOR_DATA通知EMMC是否可以接受新数据。host可以通过发出CMD7取消选择选定的EMMC,然后将该EMMC置于断开状态,并释放DAT0线而不中断写入操作。重新选择EMMC时,它将通过将DAT0拉低来重新激活busy标志。有关busy 标志的详细信息,见6.15章节。

如果host向大于2GB容量的EMMC发送了CMD16命令进行密码设置,则host在写数据传输前必须重新发送CMD16命令;否则,EMMC将响应BLK_LEN_ERROR,并保持在转换状态而没有进行数据传输,因为数据块(除密码应用程序外)传输是以扇区为单位(512B)。如果不支持部分写入访问,则同样的错误适用于容量为2GB密度的EMMC。

6.6.9 擦除

除了EMMC在写操作中执行的隐式擦除之外,还提供了host显式擦除功能。EMMC的可擦除单元是“擦除组”;擦除组以写块为单位进行工作,写块是EMMC的基本可写单元。擦除组的大小是EMMC指定的参数,在CSD寄存器中定义禁用ERASE_GROUP_DEF功能,在EXT_CSD寄存器中定义启用ERASE_GROUP_DEF。显式擦除的存储器范围的内容应为“0”或“1”,具体取决于不同的存储器技术。此值在EXT_CSD中定义。一旦擦除命令成功完成,已擦除的映射设备地址范围应该表现为已被全部覆盖为“0”或“1”,具体取决于不同的存储器技术。擦除命令的影响应该是简单地将映射的host地址范围移动到未映射的host地址范围。

注意:在执行此命令时,有时也可能完成其他闪存管理任务。

host可以擦除连续范围的擦除组。开始擦除过程分为三步骤。

首先,host使用ERASE_GROUP_START(下发CMD35命令)命令定义范围的起始地址,然后使用ERASE_GROUP_END(下发CMD36命令)定义范围的最后地址,最后通过发出参数位设置为0的ERASE(下发CMD38命令)来开始擦除过程。有关CMD38支持的参数,请参见表11。擦除命令中的地址字段是擦除组地址,对于容量在2GB以内的EMMC,以字节为单位擦除,对于容量大于2GB的EMMC,以扇区为单位。EMMC将忽略擦除组大小以下的所有LSB,有效地将地址舍入到擦除组边界。

如果接收到擦除命令(CMD35、CMD36、CMD38)不在定义的擦除序列中,EMMC将在状态寄存器中设置ERASE_SEQ_ERROR位并重置整个擦除过程。如果host将超出范围的地址作为CMD35或CMD36的参数提供,则EMMC将拒绝该命令,同时ADDRESS_OUT_OF_RANGE位置位并重置整个擦除序列。如果收到非擦除命令(既不是CMD35、CMD36、CMD38,也不是CMD13),EMMC将响应ERASE_RESET位设置,重置擦除序列并执行最后一个命令。未针对选定EMMC的命令不会中止擦除过程。

如果擦除范围包括写保护块,则这些写保护块将保持不变,只有非保护块将被擦除。状态寄存器中的WP_ERASE_SKIP状态位将被设置。与块写入一样,EMMC将通过保持DAT0低来指示正在进行擦除。实际擦除时间可能相当长,host可以发出CMD7取消选择EMMC。

表11,擦除命令CMD38的有效参数

执行擦除命令时,host应注意擦除组包含多个写块,每个写块可能包含不同的信息。执行擦除操作将应用于擦除组中的所有写块。在host执行擦除命令之前,应确保不再需要各个写块中的信息。因此,为了避免意外删除有效数据,最好使用擦除命令来擦除整个设备或分区。如果host只希望清除单个写块,则优先使用Trim 命令更合适。

6.6.10 修剪

修剪操作类似于第6.6.9节中描述的默认擦除操作。修剪功能将擦除操作应用于写块而不是擦除组。修剪功能允许host识别不再需要的数据,以便EMMC在后台擦除事件期间必要时擦除数据。应用修剪功能的写块的内容应为“0”或“1”,具体取决于不同的存储技术。此值在EXT_CSD中定义。

一旦修剪命令成功完成,被修剪的映射设备地址范围应该被全部覆盖为“0”或“1”,具体取决于不同的存储技术。修剪命令的影响应该只是将映射的host地址范围移动到未映射的host地址范围。

注意:在执行此命令期间,某些情况下可能还会完成其他管理调度任务。

完成TRIM动作需要三步。首先,主机使用ERASE_GROUP_START(CMD35)命令定义起始的地址,然后使用ERASE_GROUP_END(CMD36)命令定义要结束的地址,最后通过host下发bit0字段为1的CMD38 命令开始执行擦除过程。在进行TRIM操作的情况下,CMD35和CMD36都识别的是已写入数据块的地址而不是擦除组

如果Trim命令(CMD35、CMD36或CMD38)接收到了定义的擦除序列之外,设备将在状态寄存器中设置ERASE_SEQ_ERROR位,并重置整个序列。这意味着之前的擦除命令将被作废,EMMC需要从头开始重新执行擦除。为避免此错误并确保成功擦除存储器,重要的是遵循定义的擦除序列。

如果收到的擦除命令没有在需要执行的擦除序列(CMD35、CMD36或CMD38)中,则EMMC需要将状态寄存器中的ERASE_SEQ_ERROR位置位,并重新确定整个擦除序列的命令。

如果host提供超出范围的地址作为CMD35或CMD36的参数,则EMMC将拒绝命令不会执行,设置ADDRESS_OUT_OF_RANGE位进行响应并重置整个擦除序列的命令。如果收到“非擦除”命令(CMD35、CMD36、CMD38或CMD13均未收到),则EMMC应以ERASE_RESET位设置进行响应,重置擦除序列并执行最后一个命令。未寻址到所选EMMC的命令不会中止擦除序列。

如果需要修剪的地址范围中包括写保护块,则不需要对其进行操作,并保持它们完好无损,TRIM命令仅擦除未受保护的块,同时需要设置和写保护块关联的状态寄存器中的WP_ERASE_SKIP状态位。如上所述,对于块写入时,EMMC需要持续拉低DAT0,用来表示Trim命令正在进行中。实际擦除时间可能相当长,host可能会发出CMD7以取消选择执行中的EMMC。

非必要情况下,host应谨慎执行Trim命令,以避免意外的数据丢失。

重置EMMC(使用CMD0、CMD15或e•MMC的硬件重置)或电源故障将终止任何挂起或激活的Trim命令。这可能会使操作中涉及的数据处于未知状态,导致信息丢失。

6.6.11 净化,清除

除TRIM和Erase外,Sanitize操作也是其中一项功能,用于根据安全删除类型从EMMC中删除数据(见7.4.120)

使用Sanitize操作需要设备从未映射的用户地址空间中物理删除数据。通过向ext_CSD的第165字段Sanitize_START写入值来开始Sanitize操作。

当EMMC正在执行清除操作时,busy线置位,表示EMMC 正忙碌中,此时EMMC将继续进行清除操作,一直保持忙碌,直到发生以下事件之一:

1.清除操作执行完毕

2.一个高优先级中断打断了清除操作

3.电源掉电或者

4.硬件复位

清除操作完成后,未映射的host地址空间中不能够存在任何数据。如果清除操作因HPI、电源故障、CMD0或硬件重置而中断,则无法保证未映射的主机地址空间数据状态。

host必须通过以下方式重新启动清除操作,写入SANITIZE_START[165]并允许操作完成以确保未映射的host地址空间是干净的。由于host无法访问正在操作的区域,因此需要和提供设备的供应商沟通,确认操作对EMMC的影响后,再使用对应的应用程序对host无法访问的操作区域进行清除操作。

6.6.12 丢弃

Discard(弃)操作与TRIM(修剪)操作类似。Discard(丢弃)功能允许host识别不再需要的数据,EMMC在后台擦除操作期间擦除数据,如果没有则将这个带有丢弃功能的写入块的内容标记为“不需要”。在Discard操作之后,原始数据可能部分或全部对host设置可访问,具体取决于使用的EMMC。不再可由host访问的数据块可以像TRIM操作一样,被删除或被取消映射。EMMC将决定何时丢弃写入块中的数据。

Discard和TRIM之间的区别在于,对已被Discard的区域进行读取可能会返回部分或全部原始数据。然而,在TRIM的情况下,整个区域应该被取消映射或删除,并且将根据内存技术返回“0”或“1”

当执行Sanitize操作时,只有被Discard命令取消映射的数据部分将被Sanitize命令删除。EMMC无法保证在应用Sanitize时已丢弃的数据能够完全从EMMC中删除。

完成Discard过程需要三个步骤。首先,host使用ERASE_GROUP_START(CMD35)命令定义范围的开始地址,然后使用ERASE_GROUP_END(CMD36)命令定义范围的结束地址,最后通过发出ERASE(CMD38)命令来启动擦除过程,其中CMD38 的参数位0和位1设置为1,其余参数设置为零。在Discard操作的情况下,CMD35和CMD36都标识写入块的地址,而不是擦除组。

如果接收到的擦除相关的命令不属于Discard命令队列(CMD35、CMD36或CMD38)中的元素,EMMC将在状态寄存器中设置ERASE_SEQ_ERROR位,并重置整个序列。

如果host下发CMD35或CMD36的参数地址超出范围规定的地址,则EMMC会拒绝执行该该命令,并将ADDRESS_OUT_OF_RANGE进行置位,接着重置整个擦除序列。

如果接收到“非擦除”命令(不是CMD35、CMD36、CMD38或CMD13中的任何一个),EMMC会置位ERASE_RESET位进行响应,并重置擦除序列,执行CMD13 命令。

未寻址到选定EMMC的命令不会中止擦除序列,如果Discard范围包括写保护块,则它们被标跳过,且只有非保护块将被擦除。状态寄存器中的WP_ERASE_SKIP位将被置位。

与块写入一样,在进行Discard命令时,EMMC将通过拉低DAT0低来指示该命令正在执行,实际擦除时间可能相当长,所以host可以下发CMD7取消选择设备。

需要注意的是,host应谨慎执行Discard命令,从而避免意外数据丢失。

当出现重置设备(使用CMD0、CMD15或EMMC的硬件重置)或电源故障将终止任何待处理或活动的Discard命令。这可能会影响到操作中涉及的数据处于未知状态。

6.6.13 安全擦除

需要注意的是:为了向后兼容,且包含安全擦除动作。新的系统级(基于v4.51及更高版本的设备)实现将Erase与Sanitize结合使用进行擦除。

除了标准的“擦除”命令外,还有一个可选的“安全擦除”命令。安全擦除命令与基本擦除命令(如6.6.9章节所述)的区别在于,它要求EMMC发出命令时在内存阵列上执行擦除操作,并要求EMMC和host等待操作完成后再对下一个EMMC执行操作。此外,安全擦除命令要求EMMC根据7.4.120章节中概述的EXT_CSD中的安全删除类型,对擦除组和这些擦除组中标识为擦除的项目的任何副本执行安全清除操作

该命令允许具有高安全要求的应用程序请求EMMC执行安全操作,同时要面对可能存在的擦除时间性能影响。安全擦除命令的执行方式与6.6.9章节中概述的擦除命令相同,不同之处在于擦除(CMD38)命令是在参数位31设置为1且其他参数位设置为0的情况下执行的。见表11,讲述了有关Erase(CMD 38)命令支持的参数组合的详细信息,以及与ERASE(CMD38)命令相关联的自变量位的定义。

host应谨慎执行“安全擦除”命令,以避免意外的数据丢失。

重置设备(使用CMD0、CMD15或e•MMC的硬件重置)或电源故障等动作将终止任何挂起或活动的安全擦除命令。这可能会使操作中涉及的数据处于未知状态。

表11 CMD38 擦除命令的有效参数

表12 CMD38 擦除命令的有效参数

6.6.14 安全修

注:考虑到后续兼容,已经包含了安全修剪功能。对4.51版本之后的EMMC来讲,新系统级需要使用TRIM与Sanitize相结合,不能只使用安全修剪功能。

安全修剪功能与安全擦除命令非常相似。安全修剪功能用于在写块上执行安全清除操作,而不是擦除组。为了最大程度地减少对EMMC性能和可靠性的影响,安全修剪操作通过两步来完成。

第一步,host定义了它想要标记为安全清除的写块范围,不过这一步并不执行实际的清除操作。

host通过下发CMD35命令(ERASE_GROUP_START)规定需要清除的写块的起始地址并进行标记,接着下发CMD36命令(ERASE_GROUP_END)命令来规定需要清除的写块的结束地址。

在执行安全清除的过程中,ERASE_GROUP_START和ERASE_GROUP_END这两个参数都用于标记写块地址。一当写块的起始地址和结束地址被host选中后,host会下发CMD38命令将参数位31和0设置为1,把其余参数位设置为0(具体和CMD38命令相关的参数如何设置,可以查看表11)。

host可以对EMMC多次重复执行安全TRIM第一步操作,期间还可能会执行其他命令,直到host完全确定了需要清除的所有写块。在满足该标准操作的前提下,应该尽可能多的块上执行安全修剪第一步,以便提高其安全清除操作的效率。

第二步,host对已经选中范围内的地址发出ERASE_GROUP_START(CMD35)和ERASE_GROUP_END(CMD36)命令。需要注意的是,这些命令使用的参数会被忽略。接着发送ERASE(CMD 38)操作,其位31和15设置为1,其余参数位设置为0。这二步实际执行时,根据7.4.120章节中概述的安全去除类型以及这些块的任何副本。这完成了安全TRIM操作,会对第一步中标记的所有写块执行安全清除。在执行第一步和第二步的操作期间,host可以向EMMC发送其他命令。

host也会在没有执行安全修剪第一步的情况下发出安全修剪的第二步操作。

这种情况或许是出现电源故障的情况后,EMMC根据firmware的log记录,完成未完成的安全修剪操作。

如果仅执行了安全修剪第二步操作,但并没有标记到要擦除的写块时,再次执行安全TRIM第二步动作不会对EMMC 内部生效。

一般建议执行安全修剪操作后的第一步标记了要擦除的写块时,需要host将此块视为已经擦除。但如果host在标记为擦除后又进行了写入,那么这个块将不会被标记,host 也不会对其进行擦除。但这个块之前已经标记过的其他块仍为擦除状态。

如果host需要借助安全修剪命令从EMMC中删除数据时,首先需要确保第一步动作已经生效,进而在下次发出第二步时,能够安全地将覆盖的数据从EMMC中移除。

如果在EMMC执行安全第一步或者第二步时收到“非擦除”命令(即CMD35、CMD36、CMD38或CMD13之外的命令),EMMC会设置ERASE_RESET位并响应,随后在没有完成安全修剪操作以及没有执行CMD13命令时对安全修剪的第一步或者第二步进行复位。对于选中的EMMC在执行安全修剪操作时,没有完成寻址的情况下不会中止安全修剪序列。

host 可以在进行EMMC多次执行迭代安全修剪步骤1和发送安全修剪步骤2之前,下发其他命令。但是在每个步骤执行期间EMMC不能被中断。

如果在安全修剪步骤1和步骤2之间发生电源故障或复位,则EMMC会为安全清除操作标识的块进行标记。下次EMMC看到安全修剪第二步时,将清除在电源故障或复位之前标记的块以及自那时起标识的任何块。需要注意的是,如果因为发生电源故障或复位,EMMC无法完成安全清除操作时,则标记为清除的块可能仍包含敏感数据,应谨慎处理。建议在重新使用这些块之前需要对其进行安全擦除操作。

host应谨慎执行安全修剪命令,从而避免意外数据丢失。host可以在步骤1或步骤2执行期间对EMMC做重置(即使用CMD0、CMD15或e•MMC的硬件复位)或发生电源故障将终止任何挂起或活动的安全修剪命令。这样可能会使操作有关的数据处于未知状态。只有非受保护块应被擦除,当存在擦除范围包括写保护块时,不允许对其进行修改,且应该保持不变,同时对状态寄存器中的WP_ERASE_SKIP状态位进行设置。

如果EMMC在安全修改第二步没有执行的情况下,需要标记一个为Secure Erase的写块,则设备可以将该任务置于后台进行处理。如上所述,EMMC会通过拉低DAT0数据信号线来说明Secure Trim Step 1或Secure Trim Step 2正在进行中。由于实际操作时间可能相当长,所以呢host可以发出CMD7取消选择设备。如果在Secure Trim Step 1和Secure Trim Step 2之间更改写块大小,但仍然会在后续操作中执行第一步使用的写块大小。

6.6.15 写保护管理

为了允许host保护数据免受擦除或写入,所以EMMC应支持两个级别的写保护命令:

整个EMMC(包括引导区分区、通用存储区分区、RPMB和用户/增强用户数据区分区)可以通过设置CSD寄存器中的永久或临时写保护位来设置写保护。

当对整个EMMC应用永久保护时,原先在整个EMMC或者特定段上设置的保护方式将被替换到。而CSD寄存器位和扩展CSD寄存器位不受永久保护的影响。

当临时写保护方式只适用于尚未由其他机制保护的那些段,具体详见表格13。

在EMMC中,特定段可以是永久、上电或临时写保护方式。EXT_CSD中的ERASE_GROUP_DEF决定了段大小。当设置为0时,段大小以CSD寄存器中指定的WP_GRP_SIZE擦除组为单位定义。当设置为1时,段大小以EXT_CSD中指定的HC_WP_GRP_SIZE擦除组为单位定义。

如果host在上一个电源周期中已经设置了高容量写保护区域中的某些区域的设备,但未设置ERASE_GROUP_DEF位,则当host向EMMC发出写或擦除命令时,EMMC可能显示出未知行为,其原因是之前设置的写保护组大小与当前的写保护组大小不匹配。

同样地,如果host为某些区域默认设置为写保护的EMMC设置ERASE_GROUP_DEF位,则当host向EMMC发出写或擦除命令时,EMMC可能显示出未知行为。所以在应用中,host必须始终对EMMC设置同样的ERASE GROUP DEF值。

SET_WRITE_PROT命令用于对寻址写保护组和使用US_PERM_WP_EN(EXT_CSD [171]位2)和US_PWR_WP_EN(EXT_CSD [171]位0)所规定写保护类型的写保护组设置写保护方式。

某个段启用写保护的情况下,SET_WRITE_PROT(下发CMD28)命令的结果见表13中,

组合不同保护位的影响请参见表14

CLR_WRITE_PROT命令用于清除被寻址的写保护组的临时写保护方式,而当CLR_WRITE_PROT命令用于具有永久或上电写保护的写保护组时,则该命令不会生效。

host可以通过在EXT_CSD USER_WP字节中设置CD_PERM_WP_DIS、US_PERM_WP_DIS和US_PWR_WP_DIS位来禁用对整个EMMC的永久保护以及特定段的永久和上电保护的功能,建议禁用所有不需要的保护模式,以防止恶意或意外设置未使用的写保护模式。

host也可以通过下发CMD31命令(SEND_WRITE_PROT_TYPE)来检查给定段或段的写保护状态,如果当启用全设备保护时,所有段将显示为具有永久保护方式。

SEND_WRITE_PROT和SEND_WRITE_PROT_TYPE命令类似于读取单个块命令。EMMC分别发送包含32或64个写保护位的数据块(表示从指定地址开始的32个写保护组),后跟16个CRC位。写保护命令中的地址字段是以字节为单位的组地址,对于容量不超过2GB的EMMC,写保护命令中的地址字段是以字节为单位的组地址,对于密度大于2GB的EMMC则是以扇区为单位。

对于容量高达2GB的情况下,EMMC将忽略所有小于组大小的最低有效位。如果host在CMD28、CMD29或CMD30中提供一个超出范围的地址作为参数,则EMMC将拒绝该命令,设置ADDRESS_OUT_OF_RANGE位作为响应并保持在传输状态。

表13 和表14

 6.6.16 扩展安全协议透传命令

扩展协议透传命令是一种host使用EMMC协议和EMMC通信时下发CMD53和CMD54两个透传命令使host和EMMC使用其他常用的安全协议进行通信的功能。

为了支持与EMMC的扩展安全协议通信,host需要满足以下三个基本要求:

1)发现EMMC是否支持扩展协议透传命令(CMD53-PROTOCOL_RD和CMD54-PROTOCOL_WR);

2)从EMMC接收扩展协议数据;

3)向EMMC发送扩展协议数据。

为了验证EMMC是否支持扩展协议透传命令,host需要确认EMMC是否支持class10相关的命令(在CSD寄存器中的CCC字段)。

且EMMC接收和发送扩展协议信息,host 应下发CMD53和CMD54。

注意,CMD53和CMD54是EMMC标准中允许透传其他协议的基本基础设施。可以在单独的JEDEC安全扩展标准中引用能够在EMMC上实现的其他协议。

6.6.16.1 PROTOCOL_RD - CMD53

该命令的工作方式类似于读取多块命令(host 下发CMD18),并从EMMC中检索与安全协议相关的信息,同时将其引用的安全协议将作为命令参数进行传递,host必须下发CMD23(SET_BLOCK_COUNT)提前确认好要传输的块数。无论在EXT_CSD中定义的NATIVE_SECTOR_SIZE或DATA_SECTOR_SIZE,其扇区大小为固定的512字节,有关CMD53字段的详细描述,请参见表58。

6.6.16.2 PROTOCOL_WR - CMD54

该命令的工作方式类似于多块写入命令(CMD25),并向EMMC发送与安全协议相关的信息。同时将其所引用的安全协议将在命令参数中传递。host必须下发CMD23(SET_BLOCK_COUNT)提前提供要传输的块数。无论在EXT_CSD中定义的NATIVE_SECTOR_SIZE或DATA_SECTOR_SIZE,其扇区大小为固定的512字节。

此命令的在busy编程超时被定义为不超过10秒,并且在HPI中不可中断。

如果在CMD54的繁忙编程时间内使用HPI,则EMMC将忽略HPI。有关CMD54字段的详细描述,请参见表58。

6.6.16.3 Security Protocol Type 安全协议类型

在CMD53和CMD54中的安全协议参数字段的含义和编码应与SCSI命令安全协议IN和安全协议OUT中的SECURITY PROTOCOL字段的定义完全相同,该定义在INCITS、T10 SPC-4文档中给出。且有关扩展安全支持的协议的进一步信息,请参阅单独的JEDEC安全扩展标准。

6.6.16.4 Security Protocol Information 安全协议信息

当EMMC收到下发的Security protocol value 为00h的CMD53(PROTOCOL_RD)命令后,将会返回如table15所示的一系列支持的协议。

这些值应按升序排列,从00h开始。高位不足时以0填充。

注意,能够支持多个安全系统的EMMC可能在同一次开机会话期间不能同时支持多个安全协议。

6.6.16.5 Error handling 异常处理

ext_csd寄存器中的EXCEPTION_EVENTS_STATUS字段的第4bit名为EXTENDED_SECURITY_FAILURE,用于表示在使用PROTOCOL_RD和PROTOCOL_WR命令或使用扩展协议时发生的错误。如果发生此类错误,host可以在EXT_CSD的EXT_SECURITY_ERR [505]字段中读取错误的详细原因。

6.6.17 生产状态感知

产环境和实际使用环境下,EMMC内部存储的数据可能会出错。例如,在焊接之前加载到存储设备中的内容可能在设备焊接期间以更高的概率损坏。 EMMC设备可以在设备焊接之前使用“专用”的内部操作来加载内容,以减少生产故障,并在焊接后使用“常规”操作。

在EMMC内部,可通过设置ext_csd寄存器中的PRODUCTION_STATE_AWARENESS [133]字段,host需要向EMMC报告其处于焊接前还是焊接后状态。

本标准中定义了两种模式,即手动模式和自动模式,均用于管理设备的生产状态。

只有正确设置PRE_LOADING_DATA_SIZE字段才能开始或重启生产状况感知这一步骤。然而在设置这些字段之前,host应确保EMMC中没有垃圾数据,并且任何之前写入设备的数据都应通过下发CMD35,CMD36和CMD38进行擦除。

如果host在生产状态感知期间擦除数据,覆盖现有数据或重新分区,则应通过重新设PRE_LOADING_DATA_SIZE来重新启动生产状态感知过程。

6.6.17.1 手动模式

当使用手动模式,host通过更改PRODUCTION_STATE_AWARENESS字段来显式设置生产状态。host首先需要设置PRE_SOLDERING_WRITES状态,接着对EMMC烧写镜像加载,接着host对PRE_SOLDERING_POST_WRITES这一字段进行更新,接着焊接EMMC,完成焊接后,host应将PRODUCTION_STATE_AWARENESS设置为正常状态。这种方式也叫作先烧后贴。

在此模式下,host不被允许在PRODUCTION_STATE_AWARENESS还没有设置为PRE_SOLDERING_WRITES状态时向EMMC写入任何数据。如果启用该功能且host在不处于PRE_SOLDERING_WRITES状态时向EMMC写入数据,则EMMC可能会返回错误响应。PRODUCTION_STATE_AWARENESS状态更改可能会超过切换命令超时时间。PRODUCTION_STATE_AWARENESS状态更改的最大超时时间由EMMC制造商在PRODUCTION_STATE_AWARENESS_TIMEOUT [218]中定义。

6.6.17.2 自动模式

使用自动模式时,host设置要在EMMC焊接之前加载的数据量。host将PRODUCTION_STATE_AWARENESS设置为AUTO_PRE_SOLDERING,从而向EMMC发出使用自动模式的信号。一旦所有数据都已加载,EMMC会自动将PRODUCTION_STATE_AWARENESS更改回正常状态。

手动模式以及自动模式下推荐的焊接过程

6.6.18 现场固件更新

FFU(即现场固件更新)类似于OTA升级,可以在产线所在现场实现升级功能。

通过使用此机制,host将新版本固件下载到EMMC内部,并在成功下载后再指示EMMC安装下载好的固件。

为了启动FFU过程,host首先通过读取ext_csd寄存器中的SUPPORTED_MODES和FW_CONFIG字段来检查EMMC是否支持FFU功能。如果EMMC支持FFU的话,则host就可以启动FFU过程:即在EXT_CSD的MODE_CONFIG字段中设置相应的参数,切换到FFU模式。

进入FFU模式后,host应使用CMD17/CMD18/CMD24/CMD25等开放式或封闭式命令来下载新的固件和读取供应商专有数据(如CID等)。在此模式下,host应将这些命令的参数设置为FFU_ARG字段中定义的参数。如果这些命令具有不同的参数,则EMMC会出现位置行为,考虑到FFU过程可能会失败。host应将块长度设置为DATA_SECTOR_SIZE。下载的固件捆绑包必须和DATA_SECTOR_SIZE大小对齐(如果需要的话,进行高位内部填充)。

当EMMC 切换到FFU模式时,host可以使用单个或多个写命令将新的固件捆绑包发送到EMMC中。

通过设置ext_csd寄存器中的MODE_CONFIG字段为正常状态后,host就可重新恢复写和读命令的常规功能。

同时在正常固件下载期间不能随意退出FFU模式,否则可能会中止固件下载操作。重新切换到FFU模式时,host应检查FFU状态以获取关于已成功下载的扇区数量的指示,对应的方法是读取ext_csd中的NUMBER_OF_FW_SECTORS_CORRECTLY_PROGRAMMED字段。

如果检测到成功下载的扇区数量为零,则host应重新从其第一个扇区开始下载新的固件捆绑包。如果成功下载的扇区数量为正数,则主机应从下一个扇区起接着下载,以恢复固件正常下载操作。

如果EMMC支持MODE_OPERATION_CODES字段(即在ext_csd寄存器中的FFU_FEATURES字段的SUPPORTED_MODE_OPERATION_CODES位定义),则host可以通过将MODE_OPERATION_CODES设置为FFU_ABORT来中止固件下载过程,用来通知EMMC的FFU操作已中止。

作为响应,EMMC应将NUMBER_OF_FW_SECTORS_CORRECTLY_PROGRAMMED字段设置为零,并准备好接收新的固件捆绑包。

如果host成功将固件捆绑包下载到EMMC,就可以将MODE_OPERATION_CODES字段设为FFU_INSTALL状态,

EMMC需要将NUMBER_OF_FW_SECTORS_CORRECTLY_PROGRAMMED字段设置为零,并安装新的固件后将MODE_CONFIG设置为正常状态,以恢复读写命令的常规操作。

host应将MODE_OPERATION_CODES设置为FFU_INSTALL(这个步骤感觉有点多余了)。

如果host在FFU_INSTALL未完成之前执行CMD0/HW_Reset/Power循环,则EMMc可能会中止firmware安装包的下载过程。

如果EMMC不支持MODE_OPERATION_CODES字段,则host将其设置为NORMAL状态,并启动CMD0/HW_Reset/上电循环从而安装新的固件。

在这种情况下,EMMC不需要使用NUMBER_OF_FW_SECTORS_CORRECTLY_PROGRAMMED。在两种情况下,在host成功将新的固件捆绑包下载到设备之前若是出现了CMD0/HW_Reset/Power循环可能会导致固件下载过程中止。而在FFU_MODE下,如果host下发了其他不属于ffu流程中的命令,则EMMC可能出现其他异常行为。

 6.6.19 EMMC锁定/解锁操作

host 通过借助密码保护功能来实现对EMMC的锁定,在未来情况下将使用该密码来解锁EMMC。密码及其大小存储在128位PWD和8位PWD_LEN寄存器中。这些寄存器是非易失性(掉电后数据不丢失)的,因此掉电操作不会这些数据进行清除。

通过在ext_csd(ext_csd寄存器中171字段中的PERM_PSWD_DIS位)中设置永久密码禁用位,可以永久禁用密码保护功能。如果host下发CMD42尝试在已设置密码保护的EMMC中解除该功能,则该操作将失败,并且设备状态寄存器中ERROR(位19)错误位会置位。(如果不需要的情况下,建议在设备上禁用密码保护功能),以防止它被无意或恶意地设置。

若host下发CMD42命令,在已永久禁用密码的EMMC上尝试使用密码保护功能,则会操作失败,并且状态寄存器中的LOCK_UNLOCK_FAILED(位24)错误位会置位。

已锁定的EMMC响应并执行“基本”命令类(class0)和“锁定设备”命令类包含的所有命令。因此,host被允许重置、初始化、选择、查询状态等操作,但不能访问EMMC上的数据。如果之前设置了密码(PWD_LEN的值不为“0”),则EMMC将在上电后自动锁定。

在v4.3及更高版本的EMMC中,锁定命令仅对用户数据区域生效。因此,在向EMMC发出锁定命令后,host仍然可以访问引导分区、RPMB和通用分区区域。

与现有的CSD和CID寄存器写入命令方式相同,锁定/解锁命令仅在“传输状态”下可用。这意味着其不包括地址参数,所以在使用之前首先需要选择对应的EMMC。EMMC锁定/解锁命令(host下发CMD42)具有常规单块写入命令的结构和总线事务类型。传输的数据块包括命令所需的所有信息(即密码设置模式、PWD本身、设备锁定/解锁等参数)。在表16描述了命令数据块的结构。

EMMC锁定/解锁命令(host 下发CMD42)仅在EMMC以单倍速率模式运行时才能执行。然而host下发CMD42命令在双倍速率模式下被认为是非法命令。

表16 锁定EMMC的参数结构

具体的数据块大小应由host对EMMC下发CMD42(锁定/解锁)命令之前进行定义。因此设置的密码容量会存在不同的长度。

以下定义了各种锁定/解锁命令序列:

1.设置密码

如果host还没有选择对应的EMMC的话,则下发CMD7命令选中需要发送命令的EMMC。

host 下发CMD16 命令定义块长度,该块数据长度由8位EMMC锁定/解锁模式、8位密码大小(以字节为单位)和新密码的字节数确定。如果进行了密码更改,则块大小应考虑将旧密码和新密码一起发送。

host 下发CMD42命令并在数据线上传输使用响应的数据(包括16位的CRC校验)用来锁定/解锁EMMC,且数据块中应该说明指示模式(SET_PWD)、长度(PWD_LEN)和密码。如果进行密码更改,则长度值(PWD_LEN)应包括旧密码和新密码,而PWD字段需要包括当前使用的旧密码,然后是新密码。旧密码和新密码的每个长度都不应超过16字节。如果新密码长度超过16字节,则在状态寄存器中设置LOCK_UNLOCK_FAILED错误位,并且旧密码不会更改。

当出现使用仅设置为旧密码长度的PWD_LEN进行密码修改的时候,则状态寄存器中设置LOCK_UNLOCK_FAILED错误位,并且旧密码不会被更改掉。

如果发送的旧密码不正确(大小和密码内容不相等),则状态寄存器中将设置LOCK_UNLOCK_FAILED错误位,并且旧密码不会更改。如果PWD与发送的旧密码匹配,则分别在PWD和PWD_LEN字段中保存给定的新密码及其长度大小。

需要注意的是:密码长度寄存器(PWD_LEN)指定当前是否设置了密码。当它等于“0”时,表示没有设置密码。如果PWD_LEN的值不等于零,说明设置密码生效,则EMMC在上电后将锁定自身

如果需要上电时锁定EMMC,就可以通过设置LOCK / UNLOCK位(同时设置密码)或发送用于EMMC锁定的附加命令,这样就实现了上电立即锁定EMMC的功能。

2. 重置密码

如果host还没有选择对应的EMMC的话,则下发CMD7命令选中需要发送命令的EMMC。

host 通过下发CMD16定义块长度,该块长度由8位设备锁定/解锁模式、8位密码大小(以字节为单位)和当前使用的密码字节数共同确定。

host 下发CMD42命令并在数据线上传输使用响应的数据(包括16位的CRC校验)用来锁定/解锁EMMC。数据块应指定CLR_PWD模式、长度(PWD_LEN)和密码(PWD)的信息,(LOCK / UNLOCK位不一定包含)。如果PWD和PWD_LEN内容与发送的密码及其大小匹配,则清除PWD寄存器的内容,并将PWD_LEN设置为0(表示没有密码)。如果密码不正确,则状态寄存器中将LOCK_UNLOCK_FAILED错误位置位。

3. 锁定EMMC

如果host还没有选择对应的EMMC的话,则下发CMD7命令选中需要发送命令的EMMC。

host 通过下发CMD16定义块长度,该块长度由8位设备锁定/解锁模式、8位密码大小(以字节为单位)和当前使用的密码字节数共同确定。

host 下发CMD42命令并在数据线上传输使用响应的数据(包括16位的CRC校验)用来锁定/解锁EMMC,且数据块中应该说明指示模式(LOCK)、长度(PWD_LEN)和(PWD)密码。

如果PWD内容等于发送的密码一致,则EMMC将被锁定,并在状态寄存器中设置锁定状态位表示EMMC已经锁定。如果密码不正确,则状态寄存器中将设置LOCK_UNLOCK_FAILED错误位,表示密码不一致

注意:可以串行执行设置密码和锁定设备两个步骤。在这种情况下,host应执行设置密码所需的所有步骤(如上所述),包括在发送新密码命令时设置LOCK位。

如果预先设置了密码(PWD_LEN不为“0”),则EMMC将在上电复位后自动锁定。

如果对已锁定的EMMC或锁定没有密码的EMMC再次锁定时会失败,同时状态寄存器中设置有LOCK_UNLOCK_FAILED错误位。

4. 解锁EMMC

如果host还没有选择对应的EMMC的话,则下发CMD7命令选中需要发送命令的EMMC。

host 通过下发CMD16定义块长度,该块长度由8位设备锁定/解锁模式、8位密码大小(以字节为单位)和当前使用的密码字节数共同确定。

host 下发CMD42命令并在数据线上传输使用响应的数据(包括16位的CRC校验)用来锁定/解锁EMMC,且数据块中应该说明指示模式(UNLOCK)、长度(PWD_LEN)和(PWD)密码。

如果PWD中的内容和发送的密码匹配,则EMMC将被解锁,并在状态寄存器中清除设备锁定状态位。如果密码不正确,则状态寄存器中将设置LOCK_UNLOCK_FAILED错误位。

注意:解锁仅适用于本次电源会话。只要未清除PWD,EMMC将在下次上电时继续自动锁定。解锁EMMC的唯一方法是清除掉密码。尝试对已解锁的EMMC继续解锁将失败,并在状态寄存器中设置LOCK_UNLOCK_FAILED错误位。

5. 暴力擦除

如果用户忘记了密码(PWD内容)的时候,可以擦除EMMC中所有的数据内容以及PWD内容,这种方式被称为强制擦除。

如果之前没有选择EMMC,则host下发CMD7命令选中需要使用的EMMC。

host 下发CMD16 命令将块长度定义为1字节(即8bit,8位EMMC锁定/解锁命令),接着下发EMMC锁定/解锁命令CMD42 ,同时在数据线上带有16位CRC校验功能的数据块。

该数据块应说明是ERASE模式(ERASE位应是唯一设置的位)。如果数据字段中除了ERASE位之外还设置了其他功能,则EMMC会在状态寄存器中设置LOCK_UNLOCK_FAILED错误位,并拒绝擦除请求。

如果命令被EMMC接收的话,则EMMC将擦除所有内容,包括PWD和PWD_LEN寄存器内容,并解锁已锁定的EMMC。此外,EMMC被临时写保护的话,则会被取消掉写保护(此时被写保护的区域可以继续写入),CSD寄存器中的临时写保护位和所有临时写保护组也会被一并清除。

当host下发强制擦除命令,然而EMMC上存在电源保护或永久写保护写保护组时,则强制擦除命令将失效(EMMC保持锁定状态),并在状态寄存器中设置LOCK_UNLOCK_FAILED错误位。

在未锁定的EMMC上尝试使用强制擦除时会失败,并在状态寄存器中设置LOCK_UNLOCK_FAILED错误位。如果在永久写保护介质上发出强制擦除命令,则该命令也会失败(EMMC将继续保持锁定状态),并在状态寄存器中设置LOCK_UNLOCK_FAILED错误位。

在v4.3及更高版本的设备上,强制擦除超时的时间被定义为0,当host发出强制擦除命令时,只会擦除存储在用户数据区域(包括增强属性区域)中的数据。

强制擦除不适用于引导、RPMB和通用分区区域进行擦除。

6.6.20 应用层专属命令

EMMC系统旨在为各种应用类型提供标准接口。在这种情况下,可能会对需要特定的客户端/应用程序功能进行通信。为了实现这些功能的通用方式,标准中为此定义了两种通用命令类型:

. APP_CMD (CMD55)

当host对EMMC下发CMD55,且EMMC接收后,会将CMD55之后跟随的命令解释为应用特定命令ACMD。ACMD具有与常规e•MMC标准命令相同的结构,可能具有相同的CMD编号。EMMC将通过识别APP_CMD进而将后续命令识别为ACMD。

APP_CMD作用是赋予command 命令其他功能。例如,如果EMMC对ACMD13进行了定义但没有对ACMD7进行定义,则在APP_CMD命令之后立即接收到命令13将被解释为非正式功能的ACMD13,而CMD7则为正式功能的CMD7。

为了使用制造商指定的ACMD,host需要执行以下步骤:

发送APP_CMD命令。其响应会设置APP_CMD位(和CMD的响应状态位不一致),向host发出信号表示现在期望接收ACMD。

发送所需的ACMD。响应将设置APP_CMD位,表示接受的命令被识别为ACMD。如果发送的不是ACMD,则EMMC将其视为常规的EMMC命令,并且设备状态中的APP_CMD位持续设置为清除状态。

如果发送了一个非有效的命令(既不是ACMD也不是CMD),那么它将被识别为标准规定不符合的EMMC非法命令错误。从EMMC协议的角度来看,ACMD号码将由制造商定义,没有任何限制。

.  GEN_CMD (CMD56)

GEN_CMD的总线交互与单块读或写命令(CMD24或CMD17)相同。区别在于参数表示数据传输方向(而不是地址),数据块不是内存的有效数据,而是表示特定厂商指定的格式和含义。

在发送CMD56之前,EMMC必须被选中为传输状态('tran_state')。如果EMMC以单数据速率模式运行,则需要host下发CMD16命令对数据块长度参数BLOCK_LEN进行定义。

如果EMMC以双倍速率模式运行的话,则数据块大小为512字节。且EMMC对CMD56进行R1响应。

6.6.21 休眠(CMD5)

host可以通过SLEEP/AWAKE命令(CMD5)对EMMC在睡眠状态和待机状态之间切换。当EMMC处于睡眠状态下,能够使功耗保持最小化。此时EMMC仅对RESET命令(带有参数0x00000000或0xF0F0F0F0或H/W复位)和SLEEP/AWAKE命令(CMD5)进行响应反。EMMC将忽略所有其他命令。

在ext_csd寄存器的S_A_TIMEOUT字段中定义从待机状态到睡眠状态的状态切换的超时时间

同时在ext_csd寄存器的S_C_VCC和S_C_VCCQ两个字段中定义了睡眠状态下的最大电流消耗值。

睡眠命令参数定义:在SLEEP/AWAKE(CMD5)参数中,将第15位设置为1。

唤醒命令参数定义:在SLEEP/AWAKE(CMD5)参数中,将第15位设置为0。

睡眠命令用于从待机状态到睡眠状态进行切换。EMMC此时会拉低DAT0数据信号线来标志自身为忙碌状态。在忙碌期间不应发送其他命令。当EMMC停止拉低DAT0线时,即切换到了睡眠状态。

唤醒命令用于从睡眠状态到待机状态进行转换。EMMC此时会拉低DAT0数据信号线来标志自身为忙碌状态。在忙碌期间不应发送其他命令。当EMMC停止拉低DAT0线时,即切换到了待机状态。

当EMMC进入睡眠状态时,VCC电源可以被关闭,实现更进一步降功耗。只有在达到睡眠状态后(EMMC停止拉低DAT0线),才允许关闭VCC供应。在从睡眠状态到待机状态的状态转换(唤醒命令)被允许启动之前,VCC电源必须升至最小操作电压水平,然后才能顺利切换到待机状态。

锁定状态下的EMMC需要先通过CMD7取消被选中,然后host发出睡眠命令,将EMMC置于睡眠状态。CMD7是属于在锁定状态下继续执行的Class 0命令序列。

在锁定时可以进一步降低功耗。锁定的EMMC随后可以通过唤醒命令退出睡眠并进入待机状态。

切记! 与前面对应的相反顺序:即先进入睡眠,锁定EMMC ,这是一种错误的做法。

6.6.22  重放保护内存块

重放保护存储块进行授权访问的方式。此功能为EMMC提供了以身份验证和重放保护方式存储数据到特定存储区域的手段。首先将身份验证密钥信息(共享密钥)编程到EMMC中,即可实现重放保护功能。

由于EMMC尚未得到授权,所以在这个阶段,身份验证密钥编程必须在安全环境中进行,比如在原始设备制造商的生产时。身份验证密钥用于使用消息认证码(MAC)对对重播保护内存区域进行的读取和写入访问方式进行签名。

使用随机数生成和计数寄存器可以提供额外的保护方式,用来防止攻击者记录并在后续重播消息,这样的做法可以防止重放区域受到攻击。

6.2.22.1  用于对重放保护的内存块进行访问的数据帧

访问重放保护内存区域的数据帧包括以下数据字段。

RPMB数据帧的字节顺序是MSB优先,例如,写入计数器MSB [11]存储计数器值的最高字节。意思就是左边为高位,右边为低位呗

名称: 请求/响应类型

长度:2Byte

方向:请求(到内存),响应(来自内存)

描述:定义与内存交互的请求和响应类型。表18列出了定义的请求和响应类型。响应类型对应于先前的重放保护内存块读/写请求。

名称:身份验证密钥/消息认证码(MAC)

长度:32字节(256位)

方向:请求(密钥或MAC)/响应(MAC)

描述:根据请求/响应类型,提供身份验证密钥或消息认证码(MAC)。MAC将在数据的最后一个(或唯一的)块中传递。

名称:操作结果

长度:2Byte(16位)

方向:响应

描述:包括有关写入计数器状态(有效、过期)和对重放保护内存块访问的成功性的信息。表19表示RPMB操作结果数据结构。表20列出了定义的结果和可能的失败原因。

名称:写计数器

长度:4字节

方向:请求和响应。

描述:计数器的值,用于成功验证的数据写入请求和通过主机进行的验证设备配置写入请求的总数。

名称:数据地址

长度:2字节

方向:请求和响应。

描述:需要进行编程或从重放保护存储块中读取的数据地址。地址是所访问半扇区(256B)的序列号,第一个地址为0x0000。host 下发的命令如CMD18和CMD25中的涉及的地址参数会被忽略掉。

名称:任意数或者是随机数

长度:16字节

方向:请求和响应。

描述:由host生成的用于请求的随机数,通过EMMC Replay Protected Memory Block引擎复制到响应中。

名称:数据

长度:256字节

方向:请求和响应。

描述:通过签名访问方式写入或读取的数据。

名称:块数量统计

长度:2字节

方向:请求。

描述:要读取/编程的块数(半扇区,256Byte)。该值和host 下发的CMD23命令中的计数值一致

6.6.22.2 重放保护块的内存映射

名称:认证密钥

大小:32字节

类型:只写方式

描述:为一次性可编程认证密钥寄存器。该寄存器无法被覆盖、擦除或读取。当需要计算MAC时,EMMC Replay Protected Memory Block引擎借助该密钥实现对访问操作做身份验证。

名称:写计数器

大小:4字节

类型:只读

描述:包含验证成功后进行的数据写入请求以及通过host进行的验证设备配置写入请求总数的计数器值。EMMC生产后,该初始值为0x0000 0000。成功编程访问时,EMMC Replay Protected Memory Block引擎将自动将该值递增一次。该值无法重置。计数器达到其最大值0xFFFF FFFF后,它将不再递增(防止溢出),并且永久设置操作结果值中的第7位。

名称:数据

大小:最小128kB(RPMB_SIZE_MULT x 128kB)

类型:读/写

描述:只能通过成功验证的读/写访问读取以及写入的数据。该数据可能会被host覆盖,但永远不会被擦除掉。

6.6.22.3 消息认证码计算

消息认证码(MAC)使用[HMAC-SHA]中定义的HMAC SHA-256进行计算。HMAC SHA-256计算需要输入密钥和消息。得到的MAC结果是256位(32个字节),同时嵌入请求或响应的数据帧中作为其中的一部分。

用于MAC计算的密钥一直保存在MMC的256位认证密钥中,用作MAC计算输入的消息是数据帧中字段的串联形式,但不包括填充字节、MAC本身、起始位、CRC16和结束标志位。换句话说,MAC按照[283:0]字节的顺序计算数据帧。

如果多个数据帧作为一个请求或响应的一部分发送,则MAC的输入消息是按照发送数据帧的顺序将每个数据帧的[283:0]字节传戒起来。MAC值仅添加到最后一个数据帧中。

举个子:假设写计数器的值为0x12345678。而host希望在地址0x0010处写入两个扇区,其中第一个扇区是256个字节的0xAA,第二个扇区是256个字节的0xBB。然后host需要发送以下两个请求帧:第二个请求帧中的MAC是HMAC。请参见表21进行说明。

表21 MAC 举例

SHA-256是在以下消息上计算的:

0xAA... (total 256 times) ... 0xAA

0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0x1234 0x5678 0x0010 0x0002 0x0000 0x0003

0xBB... (total 256 times) ... 0xBB

0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0x1234 0x5678 0x0010 0x0002 0x0000 0x0003

适用于HMAC SHA-256计算的密钥一般存储在EMMC的认证密钥中。

参考文献:

[HMAC-SHA] Eastlake, D.和T. Hansen,“美国安全哈希算法(SHA和HMAC-SHA)”,RFC 4634,2006年7月。

/* 这块还是没理解明白,*/

6.6.22.4 对重放保护存储器块的访问

当EMMC置于传输状态后,host 下发CMD6(SWITCH)来设置ext_csd寄存器的PARTITION_ACCESS位,即第179字节。紧接着host可以使用多块读取和多块写入命令(host 下发CMD23、CMD18和CMD25)来访问重放保护存储器块分区。定义的访问列在以下内容中。

在认证写入期间,任何未定义的参数集或命令序列,或高优先级中断都会导致认证访问失败。

. 在数据编程情况下,数据不应该被编程。

. 在数据读取情况下,读取的数据应该是“0x00”(在多块情况下,所有帧中都应该是这样)。

如果与访问相关的失败超过一个,则在结果寄存器中将指示一般故障(0x01)(在多块情况下,在所有帧中类似)。如果存在多个与访问相关的故障,则需要在结果寄存器中指示第一种类型的错误。每个访问下定义了错误检查的顺序。完成对重放保护存储器块分区的数据访问后,需要清除PARTITION_ACCESS位。

6.6.22.4.1 对认证密钥的编程

认证密钥通过host 下发CMD25(多块写)进行编程。在CMD25下发之前,块计数由host 下发CMD23设置为1,参数位[31]设置为1可以用来指定可靠写入类型的编程。如果块计数未设置为1和或者参数位[31]未设置为1,则随后的写多块命令会执行失败,并指示为一般故障类型。

密钥信息本身包含在数据包中。该数据包大小为512B,包括请求类型信息和认证密钥。其中请求类型值0x0001表示编程认证密钥。

在EMMC的CRC校验过程后,DAT0信号线上的busy信号表示当前密钥编程的繁忙状态。host也可以通过下发CMD13查询当前busy 状态。齐总来自EMMC的R1响应只表示通用状态条件,不包括密钥成功编程的状态。

host通过读取“重放保护存储块”的结果寄存器来确认密钥编程是否成功。结果读取序列由host 下发CMD25(多块写入)开始。而且在CMD25执行之前,需要通过host下发CMD23命令将块数量这一字段设置为1。如果块计数未设置为1,则后续的“多块写入”命令执行失败,并应指示一般故障。

请求类型信息包含在数据包中。该数据包大小为512B,包括请求类型信息。请求类型值0x0005表示结果寄存器可以发送读取请求。

EMMC在CRC校验之后,DAT0线发出的忙信号表示请求忙。通过host 下发CMD18(多块读)读取EMMc状态。在读取命令之前,需要host 下发CMD23将块计数字段设置为1。如果块计数未设置为1,则“读多块”命令会执行失败,并应指示一般故障。在读取数据包中包含了读取信息。该数据包大小为512B,包括响应类型信息和密钥编程操作的结果。密钥编程请求对应的响应类型值为0x0100。

在编程认证密钥之前,不允许也不能够访问“重放保护存储块”。

认证成功后,host可以通过尝试向“重放保护存储块”写入/读取数据,然后读取结果寄存器来检查EMMC的状态。如果认证密钥尚未编程,则结果字段返回消息0x07(认证密钥尚未编程)。如果认证密钥的编程失败,则返回结果为0x05(写入失败)。如果在认证密钥编程期间发生其他错误,则返回结果为0x01(指一般故障)。

6.6.22.4.2  读取计数器的值

计数器读取序列由host下发CMD25(多块写)启动。在host 下发CMD25之前,host下发CMD23设置块计数字段为1。如果块计数未设置为1,则后续的“写多块”命令会执行失败,并指示为一般故障。请求类型信息包含在数据包中。该数据包大小为512B,包括请求类型信息和随机数。请求类型值0x0002则用来表示计数器值读取请求已开启。

EMMC在CRC状态后通过DAT0线发出的忙信号表示请求忙。host通过下发CMD18(多块读)读取的计数器字段参数值。在CMD18命令之前,块计数字段由host下发CMD23设置为1。如果块计数未设置为1,则“读多块”命令执行失败,并应指示一般故障。

计数器值本身包含在读取数据包中。该数据包大小为512Byte,其中包括响应类型信息、请求中收到的随机数副本、写入计数器值、MAC和结果。

如果读取计数器值失败,则返回结果为0x06(读取失败)。如果发生其他错误,则结果为0x01(一般故障)。如果计数器已溢出,则返回结果中的位7将设置为1(分别为结果值0x80、0x86和0x81)。

6.6.22.4.3身份验证后的数据写入

host 下发CMD25(多块写入)来编程回放保护存储块中的数据。在执行CMD25命令之前,需要通过CMD23命令设置块计数,并将参数位[31]设置为1,以指示使用可靠写入类型的编程访问。块计数指的是进行编程的半扇区(256Byte)的数量。

RPMB写入访问的支持数据大小由通过ext_csd寄存器的第166字节(EN_RPMB_REL_WR) 位4 确定,一个RPMB写入访问中的所有数据都是原子性的,其中包含旧数据或新数据。每个RPMB写入访问的起始地址需要对应RPMB写入访问的传输数据大小进行对齐。

当EN_RPMB_REL_WR = 0时,RPMB分区支持两种不同的大小:256Byte(单个512B帧)和512Byte(两个512B帧)

当EN_RPMB_REL_WR = 1时,RPMB分区支持三种不同的大小:256Byte(单个512B帧),512Byte(两个512B帧)和8KByte(三十二个512B帧)

如果未设置块计数或参数位[31]未设置为1以及大小与EN_RPMB_REL_WR定义的支持数据大小不同时,则后续的写多块命令执行失败,并指示常规故障。

数据会以数据包形式传递。数据包的大小为512Byte,包括请求类型信息、块计数、计数器值、数据的起始地址、数据本身和MAC。在多块写入情况下,MAC仅包含在最后一个数据包n中,第n-1个数据包将包括参数值0x00。在每个数据包中,地址是完整访问的起始地址(而不是每个半扇区的序列号),块计数指的是半个扇区的总计数(而不是每个半扇区的序列号)。请求类型值0x0003表示编程数据。

EMMC在CRC校验后,会通过DAT0线发出busy信号,表示已发送块之间的缓冲区处于busy,以及最后一个块(或单块情况下)后密钥的编程处于busy 状态。host也可以下发CMD13轮询当前EMMC 状态。在R1响应中中接收到的信息表示通用访问状态条件(例如,状态转换),但不包括数据编程成功的状态。

当EMMC接收到身份校验之后的写入时,首先会检查写计数器是否已过期。如果写计数器已过期的话,则EMMC将结果设置为0x85(写入失败,写计数器已过期),同时不会写入要写入的数据。

接下来EMMC进行地址检查。如果地址错误(如超出范围),则结果设置为0x04(表示地址错误)。在多块写入情况下,如果数据地址未对齐到其自身的数据大小,则结果设置为0x04(表示地址错误)。数据不会被写入到EMMC中。如果写入计数器未过期,则在字节[283:0](包括请求类型,结果= 0x00,块计数,写入计数器,地址,nonce = 0x00和数据)上计算MAC值,并将其与请求中的MAC进行比较。

如果两个MAC不同,则EMMC将结果设置为0x02(表示认证失败)。不会将数据进行写入。

如果请求中的MAC和计算的MAC相等(即匹配),则EMMC将请求中的写计数器与e•MMC中存储的写计数器进行比较。如果两个计数器不同,则EMMC将结果设置为0x03(表示计数器参数失败)。不会将数据写入EMMC。如果MAC和写入计数器比较成功,则认为写入请求已经通过身份验证。请求中的数据被写入到请求中指定的地址处,同时将写计数器增加1。

如果写入失败,则返回结果为0x05(表示写入失败)。如果在写入过程中发生其他错误,则返回结果为0x01(表示一般性失败)。host应通过读取重播保护内存块的结果寄存器值来检查数据的编程成功性。结果读取序列由host 下发写入多个块命令CMD25启动。

在CMD25之前,需要host 下发CMD23将块计数参数设置为1。如果块计数未设置为1,则后续的写入多个块命令必执行失败,并指示为一般性失败。

请求类型信息集中包含在数据包中。该包大小为512Byte,包括请求类型信息。请求类型值0x0005表示启动结果寄存器的读取请求。

EMMC通过DAT0线上的忙信号在CRC状态后表示请求繁忙。通过读取多个块命令CMD18来读取结果。在读取命令之前,块计数通过host下发CMD23设置为1。如果块计数未设置为1的时候,则读取多个块命令会执行失败,并指示为一般性失败。结果信息包含在读取数据包中。该数据包的大小为512B,包括了响应类型信息、递增的计数器值、数据地址、MAC和数据编程操作的结果。

6.6.22.4.4 认证数据读取

数据读取序列由写入多个块命令CMD25启动。在CMD25之前,块计数通过host 下发CMD23设置为1。

如果块计数未设置为1,则后续的写入多个块命令必须失败,并指示一般性失败。

请求类型信息包含在数据包中。该数据包大小为512B,包括请求类型信息、随机数和数据地址。请求类型值0x0004表示数据读取请求的启动。

DAT0线上的忙信号在CRC状态在EMMC上表示请求繁忙。当EMMC收到此请求时,首先检查地址。如果地址错误(如超出范围),则结果设置为0x04(表示地址失败),即读取的数据无效。

数据通过host下发CMD18(表示多个块命令)来读取。在读取命令之前,块计数由CMD23进行设置。

注意:在原始RPMB数据读取请求数据包中没有说明RPMB读取操作的块计数。在CMD23中设置的块计数说明了RPMB读取操作的块计数。这是EMMC标准中RPMB实现的特点,这些与其他协议标准中的实现可能会不同。

块计数是表示要读取的半扇区(256Byte)的数量。如果未设置块计数,则读取多个块命令会执行失败,并指示为一般性失败。MAC会在字节[283:0](响应类型、随机数、地址、块计数、写入计数器= 0x00、数据和结果)上进行。如果MAC计算失败,则返回结果为0x02(表示认证失败)。

数据信息本身包含在读取数据包中。数据包大小为512B,包括响应类型信息、块计数、请求中收到的nonce的副本、数据地址、数据本身、MAC和结果。

在多块读取情况下,MAC仅包含在最后一个数据包n中,n-1个数据包将包括值0x00。在每个数据包中,地址是完整访问的起始地址(而不是单个半扇区的地址),块计数指的是半扇区的总数(而不是半扇区的序号)。

如果从EMMC内部的地址位置获取数据失败,则返回的结果为0x06(表示读取失败)。如果在读取过程中发生其他错误,则返回的结果为0x01(指一般故障)。

 6.6.22.4.5 认证设备配置写入

设备配置区域是host 下发CMD25命令通过RPMB过程进行编程的。在CMD25命令之前,通过CMD23设置块计数,将参数位[31]设置为1,以指示可靠写入类型的编程访问。块计数是要编程的半扇区(256B)的数量,块计数应为0x1。因此,只使用256B(单个512B帧)的大小。

如果块计数和参数位[31]未设置为1,则随后的写多块命令将执行失败,并在RPMB操作结果中指示一般故障。

数据本身包含在数据包中。该数据包大小为512B,包括请求类型信息、块计数、计数器值、数据的起始地址、数据本身和MAC。地址是将要更新的设备配置寄存器的索引,即0x0001或0x0002是有效索引。请求类型值0x0006表示编程数据。

在CRC状态后通过EMMC的DAT0线发送忙信号,表示正在编程忙。host还可以使用CMD13轮询查看EMMC的状态。在R1中接收到的状态响应指示通用访问状态条件(例如,状态转换),不包括编程数据成功的状态。

当EMMC接收到此消息时,首先检查写入计数器是否已过期。如果写入计数器已过期,则EMMC将结果设置为0x85(写入失败,写入计数器已过期)。不会将数据写入EMMC。

如果host访问保留区域(地址[0]和地址[3〜255]),EMMC不应返回错误。且数据写入EMMC中。如果写入计数器未过期,则在字节[283:0](请求类型、结果=0x00、块计数、写入计数器、地址、nonce = 0x00和数据)上计算MAC,并将其与请求中的MAC进行比较。如果两个MAC不同,则EMMC将结果设置为0x02(认证失败)。数据不会被写入e•MMC。

如果请求中的MAC和计算得到的MAC相等,则e•MMC将请求中的写入计数器与e•MMC中存储的写入计数器进行比较。如果两个计数器不同,则e•MMC将结果设置为0x03(计数器失败)。数据不会写入EMMC。

如果MAC和写入计数器比较成功,则认为写请求已经认证。从请求中获取的数据将写入请求中指定的设备配置区域,并将写入计数器增加1。

如果写入失败,则返回结果为0x05(写入失败)。如果在写入过程中发生其他错误,则返回结果为0x01(一般故障)。host应通过读取重放保护存储块的结果寄存器来检查数据编程的成功性。结果读取序列由写多块命令CMD25启动。在CMD25之前,有host 下发CMD23将块计数设置为1。如果块计数未设置为1,则随后的写多块命令执行失败,并在RPMB操作结果中指示一般故障。

请求类型信息包含在数据包中。该数据包大小为512B,包括请求类型信息。请求类型值0x0005表示结果寄存器读取请求的启动。(请参阅表28,结果寄存器读取请求数据包)

经过身份验证的EMMC配置写入响应的响应类型值为0x0600。EMMC在CRC状态后在Dat0线上发出忙信号,表示请求正在处理中。结果本身可以通过读取多块命令CMD18来读取。在读取命令之前,通过CMD23将块计数设置为1。如果块计数未设置为1,则读取多块命令执行失败,并在RPMB操作结果中指示一般故障。

结果信息本身包含在读取数据包中。该数据包大小为512B,包括了响应类型信息、递增的计数器值、设备配置区域的索引、MAC和数据编程操作的结果。

6.6.22.4.6 身份验证的设备配置读取

身份验证的设备配置读取序列由写多块命令CMD25启动。在CMD25之前,通过CMD23将块计数设置为1。如果块计数未设置为1,则随后的写多块命令将失败,并在RPMB操作结果中指示一般故障。

请求类型信息包含在数据包中。该数据包大小为512B,包括请求类型信息和nonce。请求类型值0x0007表示身份验证的设备配置读取请求的启动。

EMMC在CRC状态后在Dat0线上发出忙信号,表示请求正在处理中。数据本身可以通过读取多块命令CMD18来读取。在读取命令之前,通过CMD23设置块计数。块计数应设置为0x1。如果块计数未设置为0x1,则读取多块命令执行失败,并在RPMB操作结果中指示一般故障。数据信息本身包含在读取数据包中。该数据包大小为512B,包括了响应类型信息、块计数、请求中收到的nonce的副本、数据地址、数据本身、MAC和结果。

如果从EMMC内部的设备配置区域获取数据失败,则返回结果为0x06(表示读取失败)。如果在读取过程中发生其他错误,则返回结果为0x01(表示一般故障)。

6.6.23 双倍速率选择模式

在host验证EMMC符合本标准4.4版本或更高版本同时EMMC支持双数据率模式后,可以在EMMC中启用双数据率数据传输模式。在上电、硬件复位或软件复位后,EMMC的操作模式为单数据率,除非EMMC通过执行引导操作开始,在这种情况下,单数据率或双数据率模式的选择由ext_csd寄存器第177字节BOOT_BUS_CONDITIONS中进行设置(具体见表147)。为了使host切换到双数据率模式,首先将HS_TIMING[3:0]设置为0x1。为了使host切换到HS400模式,需要将HS_TIMING[3:0]设置为0x3(请参阅6.6.2章节),并且如表137所示,EMMC必须支持ext_csd寄存器第196字段DEVICE_TYPE中指定此模式。

host使用SWITCH命令将0x05(4位数据宽度)或0x06(8位数据宽度)写入ext_csd寄存器第183字节的Modes段中的BUS_WIDTH中。在HS400模式下,host期望将0x06(8位数据宽度)写入ext_csd寄存器第183字节的Modes段中的BUS_WIDTH字节。该寄存器的有效值在表145中进行了定义。如果host尝试写入无效值,则BUS_WIDTH字节不会更改,双数据率模式不会启用,同时SWITCH_ERROR位进行置位。

相反,双倍速率模式下的EMMC可以通过在BUS_WIDTH字节中写入新值来切换回到单倍速率模式中。

6.6.24 双倍速率传输模式操作

EMMC启用双数据率操作模式后,CMD17、CMD18、CMD24、CMD25和CMD56的块长度参数默认为512字节,且不能通过下发CMD16(SET_BLOCKLEN)命令进行更改,因为在该模式下CMD16命令会失效变为非法命令。因此,在EMMC保持双数据率模式的情况下,所有单个或多个块的数据传输读取或写入需要在长度为512字节的固定块上操作。

CMD30和CMD31在双倍速率模式下使用其本机数据大小。除CMD16外,CMD42(LOCK_UNLOCK)、CMD14(BUSTEST_R)、CMD19(BUSTEST_W)、CMD11(READ_DAT_UNTIL_STOP)和CMD20(WRITE_DAT_UNTIL_STOP)在双倍速率模式下被认为是非法命令。如果需要使用这些命令,则必须将EMMC切换为单数据率模式才能使用。如果ext_csd寄存器的第130字节(PROGRAM_CID_CSD_DDR_SUPPORT)设置后,则支持CMD26和CMD27两个命令在双倍速率模式下运行。

6.6.25 后台操作

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 高优先级中断

在某些情况下,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 应该理解为对读写的不同场景进行管理,从而提升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 上下文方向

非零上下文可以配置为只读上下文、只写上下文或读/写上下文。上下文#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 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的大单元上下文相同的规则仍然生效。

6.6.28 数据标记机制

这种方式能够使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 压缩命令

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

打包的写命令可通过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 事件异常

异常事件允许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访问。这个临时存储空间也可以用于一些特定实现的操作,例如作为内存控制器的执行内存和/或地址映射表的存储空间等,关于缓存定义及功能不在本标准的讨论范围之内。

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

. 数据缓存仅适用于单块读/写(CMD17/24)、预定义多块读/写(CMD23+CMD18/25)和开放式多块读/写(CMD18/25+CMD12)命令,并排除任何其他访问,例如对寄存器空间的访问(例如CMD6)。

. 在执行CMD24、CMD23+CMD25或CMD25+CMD12命令后,Dat0忙和状态响应位[8]不再必须指示到非易失性存储器的编程状态,而可能指示到易失性缓存的编程状态(下文定义的例外除外)。

. (flush)刷新操作是指host向EMMC发送的要求,将缓存的数据写入非易失性存储器。在刷新之前,emmc可以自主地将数据写入非易失性存储器,但在刷新操作之后,易失性区域中的所有数据必须写入非易失性存储器。(以电脑为例,内存条上的数据在电脑断开电源后就没有了 而硬盘中的数据依旧存在。当不进行flush 操作之前,数据会被写入到内存条中,供处理器需要的时候使用,需要的时候再写入到硬盘中,当使用了flush 操作后,数据会强制从内存条中写入到硬盘中)

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

. 当缓存开启时,对RPMB和引导分区的访问仍应指向非易失性存储器,并具有在本标准其他地方定义的相同要求。

. 当缓存开启时,整个EMMC上的数据均会通过缓存写入读取(刷新缓存时,所有分区的数据都应该被刷新,这个操作与活动分区无关)。

. 在切换分区时没有刷新的要求。(注:这也意味着在切换分区时,缓存数据不应该丢失)。不过缓存数据可能会在sleep状态下丢失,因此需要EMMC进入sleep状态之前,host需要执行刷新缓存,将数据写入NAND 中

. 在收到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(功能交叉矩阵)是指在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分区。

6.6.33 动态容量管理

/*动态容量管理是一种功能,允许EMMC动态调整其报告的容量当EMMC有磨损块并需要重新分配备用块来替换它们时,此功能非常有用。使用动态容量管理,当检测到磨损块时,EMMC可以向host报告降低的容量,然后重新分配备用块来替换它们。这使得EMMC即使具有磨损块的情况下,仍然可以继续工作,而不会导致任何数据丢失或损坏。

要使用动态容量管理,host必须使用下发带有特殊参数的CMD6命令从而启用此功能。接着,EMMC将监视其块的磨损程度,并相应调整其报告的容量。EMMC还将通过ext_csd寄存器提供有关实际容量和磨损块数量的信息。

值得注意的是,动态容量管理可能会导致EMMC的报告容量随时间波动。这是正常行为,不表示EMMC出现任何故障。*/

大量的内存使用和Flash的老化可能会导致坏块。动态容量管理为EMMC提供了一种机制,可以减少其报告的容量并延长设备的使用寿命。

操作动态容量的机制基于内存阵列分区和WP组的粒度(见6.14章节)。

通过释放用户区域地址空间内的任何WP组来减少容量。释放的WP组将成为永久写保护组,不得对其进行读取:写入释放的WP组中的地址将返回WP错误;从释放的WP组中的地址读取是被禁止的,可能会返回错误;

使用CMD30检查写保护和使用CMD31检查写保护类型时,应相应地说明受保护的组和永久写保护的方式。

释放写保护组的前提是在释放之前必须先取消保护,才能被释放掉。且通用分区的写保护组也不能被释放 - 只有来自用户区域的组可以被释放。

EMMC在ext_csd寄存器的第58字节中保留指示DYNCAP_NEEDED功能,以通知host需要释放多少个WP组。host应监视此字节并释放所请求的WP组,以使EMMC继续正常工作。

如果EMMC报告非零的DYNCAP_NEEDED,而host没有相应地释放WP组,则EMMC的性能可能会降低,最终变得无法正常工作。

此外,如果host将值“1”写入EXCEPTION_EVENTS_CTRL的DYNCAP_EVENT_EN,可以报告DYNCAP_NEEDED的状态的异常事件位。一旦启用,EMMC状态中的异常位(在每个R1响应中报告)应设置为非零的DYNCAP_NEEDED。

为了释放WP组并查询组的状态,host应首先将EXT_CSD字节[59]中的CLASS_6_CTRL设置为0x01(参见表174),然后使用类6命令(CMD28-31)来释放和/或查询WP组的状态。在使用类6命令进行写保护操作之前,host应将CLASS_6_CTRL设置为0x00。

当CLASS_6_CTRL设置为0x01时:

. CMD28用于释放WP组

. CMD29被忽略(无操作)

. CMD30返回已释放或未释放WP组的状态

. CMD31返回一个固定的64位零模式

动态容量命令和状态仅适用于大容量EMMC,并基于大容量写保护组的大小。

EMMC内部用户区域的大小在通电时不应更改,即使从用户区域末尾释放了WP组。在通过CMD1进行上电、RST_n信号断言或CMD0之后,EMMC可以在从其地址空间末尾释放WP组后更新其用户区域。在任何情况下,EMMC的寻址模式不会改变(EMMC仍然保持基于高容量扇区的寻址)。

6.6.34 大扇区容量

本地扇区大小是EMMC进行内部管理的最小信息单位。对于大容量设备,其本地扇区大小可能存在两个选项:

1)小的512B扇区(由总容量不超过256GB的设备支持),或

2)大的4KB扇区(由所有设备支持)。

EMMC在EXT_CSD [63]的NATIVE_SECTOR_SIZE字段中报告其本地扇区大小。

为了向后兼容,大扇区EMMC在出货时应以仿真模式运行。host可以以任何模式访问和寻址的实际扇区大小由DATA_SECTOR_SIZE报告。在仿真模式下,DATA_SECTOR_SIZE仍为512B,但EMMC在内部模拟512B操作,这可能会影响性能。则host可以禁用仿真模式。一旦禁用仿真模式,扇区大小就永久设置为本地扇区大小。

所有容量高于256GB的设备的本地扇区大小应为4KB。

对于非高容量设备,NATIVE_SECTOR_SIZE、DATA_SECTOR_SIZE、USE_NATIVE_SECTOR和INI_TIMEOUT_EMU字段被认为是只读方式,且参数设置为零,应该被忽略。

和EMMC报告的内部大小应始终是本地扇区大小的完整倍数,即使在仿真模式下也是如此,例如设备容量、写保护组大小、擦除组大小、超级页大小等。

在仿真模式下和禁用仿真模式后,内部大小的单位应该相同,除了标签单元大小。表40列出了所有内部大小的粒度和单位列表。大扇区EMMC不应支持部分访问。

6.6.34.1 Disabling emulation mode 禁止仿真模式

为了禁用大4KB扇区设备的仿真模式,host可以将0x01写入ext_csd寄存器的第 62字节中的USE_NATIVE_SECTOR字段,然后重启发送CMD1命令

设置USE_NATIVE_SECTOR不会立即更改DATA_SECTOR_SIZE。只有在将USE_NATIVE_SECTOR设置为0x01后进行重新上电后,EMMC才会更改DATA_SECTOR_SIZE。然后,CMD1的以下初始化超时由INI_TIMEOUT_EMU定义。

在将USE_NATIVE_SECTOR设置为0x01但尚未进行重启时,发出的任何有效命令都将被正常执行。

仅支持在不支持分区的设备上或分区配置之前禁用仿真模式。一旦配置了分区,禁用仿真模式就不再允许。

在PARTITION_SETTING_COMPLETED中设置位0并在两个操作之间没有重启时不允许将0x01写入USE_NATIVE_SECTOR中。

当成功禁用仿真模式后,EMMC的某些内部大小可能会发生变化。

6.6.34.2  本机4KB扇区行为

/*本机4KB扇区行为是指具有物理扇区大小为4KB(4096字节)的存储设备与使用它的操作系统和应用程序之间的交互方式。这种行为不同于传统的物理扇区大小为512字节的存储设备。

当使用具有本机4KB扇区大小的存储设备时,操作系统和应用程序必须意识到这一点并能够正确地处理它。这是因为与存储设备交互的文件系统和其他软件层可能假定扇区大小为512字节,这可能会导致性能和可靠性问题。

为解决这个问题,具有本机4KB扇区大小的存储设备通常使用一种称为“逻辑扇区仿真”或“512e”(512字节仿真)的技术。这涉及将存储设备呈现为具有512字节的扇区大小,同时内部使用4KB的扇区大小。这使得操作系统和应用程序可以继续按照正常方式工作,同时利用更大的扇区大小来提高性能和可靠性。

然而,一些应用程序和软件层可能不兼容512e,可能需要特定的处理才能正确地与具有本机4KB扇区大小的存储设备一起使用。重要的是确保系统中的所有软件和硬件组件都与存储设备的本机扇区大小兼容,以避免任何问题。*/

以下限制适用于处于本机模式(而非仿真模式)的4 KB扇区设备

  1. 总线上的数据传输仍然使用512字节的CRC保护块,但数据只能以8个这样的块的倍数进行传输(始终是4 KB的倍数)。
  2. 仍然使用扇区寻址,但扇区地址必须始终对齐到8个(4 KB)。
  3. 扇区计数必须是8的倍数(4 KB),例如在SET_BLOCK_COUNT(CMD23)和ext_csd中的CORRECTLY_PRG_SECTORS_NUM字段中。
  4. 不支持单块写入和读取命令(CMD17和CMD24)。如果host尝试发出CMD17或CMD24,则EMMC不为所动
  5. CMD18和CMD25命令对应以8个扇区对齐为4kB的方式多块读写
  6. 如果在可靠写入期间发生电源故障,则被写入修改的每个4 KB扇区都是原子级别的。在电源故障后,扇区可能包含旧数据或新数据。被中断的写入操作修改的所有扇区可能处于以下状态之一:所有扇区包含新数据,所有扇区包含旧数据,或某些扇区包含新数据,某些扇区包含旧数据。
  7. 擦除/修剪/丢弃命令中的起始和结束地址必须始终对齐到8个(4 KB)
  8. 如果存在RPMB分区,则是上述规则的例外情况:由于对RPMB分区的读写命令是数据帧数据包而不是实际的读写操作,因此仍应以512byte块的形式访问RPMB分区。

表格40总结了数据扇区大小、地址模式和可靠写入粒度,具体取决于设备密度范围、设备扇区大小和仿真模式启用状态。

6.6.35 实时时钟信息

/*

实时时钟信息是指一种电子时钟,用于记录当前的时间和日期。它被应用于计算机、嵌入式系统和其他需要准确时间记录的设备中,即使这些设备已经关闭也能保持时间的准确性。

*/

向EMMC提供实时时钟信息可能有助于内部维护操作。如果可用,host可以提供协调世界时(UTC)的绝对时间,或者相对时间。此功能为host提供了更新实时时钟和相对时间更新(参见CMD49)的机制。

host应在以下事件发生时发送时间信息:

1.尽早地在上电后

2. 尽早地在从睡眠状态唤醒后

3. 定期发送(每小时、每天等)

要设置实时时钟,host 需要下发使用CMD49命令(SET_TIME)。该命令的状态转换和超时时间与CMD24(WRITE_BLOCK)相同,并且始终应配置为使用CMD16(SET_BLOCKLEN)传输512B信息块格式。信息块采用小端格式,并具有以下结构:

SECONDS_PASSED字段的含义由RTC_INFO_TYPE字段确定:

6.6.35.1 周期性唤醒

/*周期性唤醒是指一种功能,允许设备定期从低功耗状态唤醒以执行某些任务,例如更新实时时钟或检查新数据。这个功能通常用于电池供电的设备中,以节省电量同时仍保持基本功能。用户可以配置唤醒间隔,通常范围从几秒到几小时不等。*/

host可以更新PERIODIC_WAKEUP寄存器(ext_csd寄存器的第131字节)以通知EMMC关于host应该多久唤醒它一次。host应至少按照PERIODIC_WAKEUP寄存器的配置重复以下序列:

启动EMMC并执行至少一个后台操作(通过写入BKOPS_START),该操作将一直运行直到完成(无中断),然后将EMMC断电。只要EMMC没有关机的时间超过PERIODIC_WAKEUP中配置的时间,host可以在关闭设备电源之前执行其他操作。host只能增加PERIODIC_WAKEUP寄存器中的频率。

6.6.36 下电通知

host在关闭EMMC电源之前应该通知EMMC将要下电,可以让EMMC有时间余量进行关机。关闭EMMC电源意味着关闭所有电源供应。如果host打算关闭VCC和VCCQ电源,则应发出关机通知(POWER_OFF_LONG,POWER_OFF_SHORT),如果host打算在将EMMC移动到睡眠状态后关闭VCC可以使用设置睡眠通知(SLEEP_NOTIFICATION)。

为了向EMMC说明host支持关机通知,支持的host首先应将ext_csd寄存器的第 34byte中的POWER_OFF_NOTIFICATION字节设置为POWERED_ON(0x01)。在下电之前,host将该值更改为POWER_OFF_SHORT(0x02)或POWER_OFF_LONG(0x03)。host等待busy线被取消激活。一旦设置更改为0x02或0x03,host可以安全地关闭设备电源。

如果POWER_OFF_NOTIFICATION字节设置为POWERED_ON,host可以发出SLEEP_AWAKE(CMD5)以进入或退出睡眠状态。在进入待机状态后,进入睡眠状态之前,host将POWER_OFF_NOTIFICATION设置为SLEEP_NOTIFICATION并等待DAT0线取消激活。在EMMC处于睡眠(slp)状态时移除VCC以外的电源可能会导致设备行为未定义,因此在睡眠(slp)状态下,VCC(存储器供电)可以按照6.6.21章节中定义的方式关闭。在移除所有电源之前,host应下发CMD5和CMD7将EMMC从睡眠(slp)状态转换回传输状态,然后执行关机通知将POWER_OFF_NOTIFICATION字节设置为POWER_OFF_SHORT或POWER_OFF_LONG。

当host在切换到关机设置(POWER_OFF_LONG、POWER_OFF_SHORT或SLEEP_NOTIFICATION)后继续向EMMC发送命令(如host持续发送CMD8,多块读取)或在其繁忙状态下执行HPI,则EMMC应将POWER_OFF_NOTIFICATION字节恢复为POWERED_ON。否则host尝试在写入其他值后将POWER_OFF_NOTIFICATION更改为0x00,则会生成SWITCH_ERROR。

两种关机模式之间的区别在于host想关闭电源紧急程度。EMMC应在通用CMD6超时时间内快速响应POWER_OFF_SHORT。如果需要更多时间,则可以使用POWER_OFF_LONG,并且EMMC应在POWER_OFF_LONG_TIME超时时间内对其进行响应。

当POWER_OFF_NOTIFICATION设置为POWERED_ON时,EMMC期望host像做如下操作:

  1. 保持EMMC电源(包括VCC和VCCQ)持续通电。
  2. 在将POWER_OFF_NOTIFICATION更改为POWER_OFF_LONG或POWER_OFF_SHORT之前,不能对EMMC 下电。
  3. 在将POWER_OFF_NOTIFICATION更改为SLEEP_NOTIFICATION并将设备置于睡眠状态之前,不能对VCC 下电,进入睡眠后,可以下电VCC

在EMMC进入睡眠状态之前,如果host知道EMMC能够自主启动后台操作以提高性能,则可以将POWER_OFF_NOTIFICATION字节设置为SLEEP_NOTIFICATION(0x04)。host应等待忙线被取消。忙线状态可能会在ext_csd寄存器的第216字节中定义的SLEEP_NOTIFICATION_TIME字节中周期性出现。一旦设置更改为0x04,host可以将EMMC设置为睡眠模式(下发CMD7+CMD5)。

从睡眠中恢复后,POWER_OFF_NOTIFICATION字节将恢复其值为POWERED_ON。HPI可能会中断SLEEP_NOTIFICATION操作。在这种情况下,POWER_OFF_NOTIFICATION字节将设置为POWERED_ON。

6.6.37 缓存增强屏障

Barrier功能提供了一种延迟有序刷新缓存数据的方法。使用屏障命令的主要目的是避免执行刷新命令引入的长时间延迟。在某些情况下,host不想立即刷新数据,但是希望在不同的缓存数据到达前后保持顺序。屏障命令使hos能够实现有序目标,但不需要花费额外的刷新延迟,因为实际的刷新可以通过EMMC推迟到稍后的空闲时间。屏障规则的正式定义如下:

假设在请求R_x和R_x+1(0<x<N)之间存在一个屏障,则必须在请求Rx+1..RN之前将所有请求R0..Rx刷新到非易失性存储器中。

在两个屏障之间,EMMC可以按任意顺序将数据写入非易失性存储器。如果host想要保留特定的顺序,它应该刷新缓存或在重要的位置设置另一个屏障。

通过向FLUSH_CACHE字节(ext_csd寄存器的第32位字节)的BARRIER位写入来设置障碍。完成编程后,host下发CMD13命令从状态寄存器中读取任何错误,该错误与普通写请求的定义相同。错误可能会影响自上次刷新操作以来缓存中写入的任何数据。

EMMC应支持在两个刷新命令之间的设置任意数量的障碍命令。在两个刷新命令之间存在多个障碍命令的情况下,根据障碍规则,可以将缓存数据的子集提交到非易失性存储器中。在内部,EMMC可能有一个障碍量的上限,它可以吸收而无需刷新缓存。也就是说,如果host超过了这个障碍量,EMMC可能会在内部发出正常的刷新命令。

EMMC应通过BARRIER_SUPPORT字节(est_csd寄存器的486字节)公开其是否支持屏障功能。如果EMMC不支持障碍功能,则该寄存器应为零。如果EMMC支持障碍功能,则该寄存器应设置为1。

假设EMMC支持障碍功能,如果FLUSH_CACHE字节的BARRIER位被设置,则应继续执行障碍操作。

如果缓存完全满了和/或缓存无法接收下一个访问的数据(根据CMD23中指示的块计数或一般启动的单个/开放式多块写入),那么EMMC还需要存储下一个访问的数据且必须在本规范的其他地方指定的超时内完成。处理新数据和可能刷新一些旧的缓存数据的实际算法留给设计人员实现。

注意:当发出强制编程写请求(CMD23的第24位打开)或可靠写请求(CMD23的第31位打开)时,host应了解到数据将被写入非易失性存储器,即使已发出障碍命令,可能会在任何缓存数据操作之前写入。

因此,写入非易失性存储器的顺序显得特别重要,对host来讲,需要在强制编程或可靠写请求之前发出刷新命令。

host通过设置BARRIER_EN的第0位(ext_csd寄存器的第31字节)来决定是否设置障碍功能。

6.6.38 缓存刷新策略

host会要求EMMC按顺序从缓存中刷新数据。为了保证按顺序刷新,host可能会对EMMC进行设置,刷新EMMC缓存或使用障碍命令。

如果说,EMMC的刷新策略是按顺序从缓存中刷新数据,则缓存障碍命令或刷新命令操作(如果目标是保证刷新顺序)是冗余的,这显得对EMMC和host增加了不必要的开销。

CACHE_FLUSH_POLICY字段(ext_csd寄存器的第240字节)中的FIFO位作用是EMMC向host指示EMMC缓存刷新策略为先进先出(FIFO);这意味着EMMC保证数据刷新的顺序与写入缓存的顺序相同。当设置FIFO位时,建议host不要发送缓存障碍命令或刷新操作,因为它们是冗余的,并对系统施加负担。

但是,如果FIFO位设置为1b并且EMMC支持缓存障碍机制,则host仍可以发送障碍命令而不会收到错误。发送这些命令不会改变EMMC的行为,因为EMMC无论如何都会按顺序刷新缓存。

CACHE_FLUSH_POLICY字段是只读字段,无论是由host还是EMMC都不会更改其值。

6.6.39 命令队列

6.6.39.1 概述

为了在EMMC中进行命令排队,EMMC需要管理一个内部任务队列,host可以将数据传输任务排队到该队列中。

初始时,任务队列为空。每个任务都由host发出,并最初排队为待处理状态。EMMC controller以准备待处理任务进行执行。当一个任务准备好执行时,其状态会更改为“准备执行”。“准备执行”的确切含义取决于EMMC的实现。

host跟踪所有排队任务的状态,并通过发送指示其任务ID的命令来执行任何标记为“准备执行”的任务。当接收到执行命令(CMD46 / CMD47)时,EMMC执行数据传输事务。

例如,为了对写入事务进行排队,host 需要发送CMD44来确定指示任务的参数。EMMC响应后,host发送CMD45,指示起始块地址。如果没有检测到错误,EMMC将这两个命令视为队列中的一个单一任务,并发送指示成功的响应。这个交换可以在CMD信号线上执行,同时数据传输或忙状态正在DAT信号线上进行。host下发CMD13跟踪队列的状态。

稍后,当数据传输没有在进行时,host发出CMD47命令,命令EMMC执行队列中的任务,并在其参数中提供任务ID。EMMC用R1响应对host进行响应,数据传输继续进行。

需注意:如果host需要访问RPMB分区时,则host需要禁用命令队列机制,因为RPMB分区不通过命令队列访问。

/*通用目的分区(General Purpose partitions)是e•MMC中的一种分区类型,通常用于存储应用程序、数据和其他文件。这些分区通常由操作系统或应用程序来管理和访问。通用目的分区可以通过e•MMC中的命令进行访问和操作。这些分区可以被划分为多个逻辑部分,每个部分可以被格式化为不同的文件系统,以满足不同的应用需求。通用目的分区的大小和数量可以根据e•MMC的容量和制造商的设置而异。*/

通用目的分区在启用命令排队的情况下可以进行访问。host下发CMD6(用于切换分区或禁用命令排队)时,队列必须为空。如果在队列不为空时发送CMD6,会被EMMC识别为非法命令(请参见6.6.39.9,支持的命令)。在启用命令排队之前,块大小应设置为512byte。如果块大小不是512byte,则EMMC可能会对CMD46 / CMD47作出错误响应。EMMC没有调度排队任务顺序的权力,在需要排序的情况下(例如,具有重叠LBA的命令),host需要对其进行维护。

6.6.39.2 队列任务参数-CMD44

CMD44是排队数据传输任务的第一步。该命令编码确定了排队任务和执行操作所必需的参数。参数包括块计数、任务ID、优先级、数据方向和其他参数(例如标签请求、上下文ID、可靠写入、强制编程)。

编码的任务ID不能已经被队列中的另一个任务使用。只有在该ID标识的任务已经完成的情况下,则任务ID可重用。

在最后一个数据块完全传输到EMMC总线上时,可以认为数据读取任务已完成。

当最后一个数据块后面的忙信号被释放时,数据写入任务被视为已完成。

排队的过程中有两个优先级:高优先级任务和简单优先级任务。

EMMC需要优先处理排队的高优先级任务,需要在准备简单任务之前为高优先级的任务做准备。因此,高优先级任务通常应该在排在前面的简单任务之前转换为“准备执行”状态。

然而,在接收到高优先级任务请求时,EMMC可能已经开始准备简单任务的执行,但尚未在QSR中标记它们为“准备执行”。EMMC可以在新的高优先级任务之前将这些任务标记为“准备执行”。

与CMD44相关的错误情况的处理方法见表44中。

host 下发CMD44命令之后,需要紧跟着下发CMD45来完成排队操作。如果host发出的下一条命令不是CMD45,或者发出CMD45但检测到错误时,则EMMC的行为不确定,host应重新发送CMD44和CMD45。

一般在DAT信号线上进行数据传输时、线路处于空闲状态(例如,在NAC时间内)或当EMMC指示BUSY状态时(除了EMMC由于执行CMD48而处于BUSY状态这一例外)发出CMD44。

6.6.39.3 排队任务的地址-CMD45

CMD45应该紧跟CMD44之后由host(且仅在CMD44之后)下发。CMD45的参数是相关事务的起始块地址(例如CMD18)。接收到CMD45时,EMMC使用CMD44和CMD45中提取的以下参数排队任务:任务ID、块计数、块地址、优先级、数据方向、标签请求、上下文ID、可靠写入和强制编程。与CMD45相关的错误情况的处理方式列在表44中。可以在DAT信号线上进行数据传输时、EMMC指示BUSY状态或线路处于空闲状态(例如,在NAC时间内)发出CMD45。当EMMC执行CMD48命令的操作时,不允许发出CMD45命令。

6.6.39.4 执行读任务命令-CMD46

为了对已经排队的数据执行读取任务,host发出CMD46命令。CMD46的参数是请求任务的任务ID。指定的任务必须是一个数据读取任务(Data Direction = 1),并且在队列状态寄存器中标记为“准备执行”。如果请求的任务(根据任务ID指示)确实是一个读取任务并且已准备好执行,EMMC将用R1响应并开始数据传输。当最后一个数据块完全传输到EMMC总线上时,EMMC应该清除该任务的“准备执行”标志。与CMD46相关的错误情况的处理方式列在表44中。

6.6.39.5 执行写任务命令-CMD47

为了执行已经排队的数据写入任务,host发出CMD47命令。CMD47的参数是请求任务的任务ID。指定的任务必须是一个数据写入任务(Data Direction = 0),并且在队列状态寄存器中标记为“准备执行”。如果请求的任务(根据任务ID指示)确实是一个写入任务并且已准备好执行,EMMC将用R1响应,并且host将开始数据传输。当最后一个数据块后的忙信号释放时,EMMC应该清除该任务的“准备执行”标志。与CMD47相关的错误情况的处理方式列在表44中。

6.6.39.6 CMDQ 任务管理 CMD48

CMD48用于各种命令排队任务管理请求。参数包括TM操作码,该操作码编码所请求的操作和与操作码相关的Task ID。有效的TM操作码列表和相应的操作描述在表43中给出。

只有在没有数据传输时才能发出CMD48。

6.6.39.7 SEND_STATUS - CMD13

CMD13增加了一个选项,允许host读取队列状态寄存器(QSR)。如果CMD13参数中的第15位设置为1,则EMMC应发送带有QSR而非设备状态的R1响应。

当EMMC在对CMD13的响应中指示有一个或多个任务“准备执行”时,host应选择其中一个任务进行执行,而不是发送额外的CMD13,期望有更多任务“准备执行”。

6.6.39.8 异常处理

命令排队机制引入了一些错误情况。新的错误情况列在表44中,同时还包括每种情况在EMMC中的处理方式的描述。

6.6.39.9 支持的命令

使用ext_csd寄存器中的CMDQ_MODE_EN字段启用和禁用命令排队。在禁用命令排队之前,队列必须为空。当禁用非空队列的操作会被EMMC识别为非法命令。

当启用命令排队(CMDQ_MODE_EN字段中的CMDQ Mode En位设置为“1”)时,只有类11命令是发出数据传输任务的唯一方法。当启用命令排队时,不支持现有的数据传输命令,即CMD18 / CMD17和CMD25 / CMD24。

当关闭了命令排队功能时,CMD17/18和CMD24/25命令才可以继续使用,因为它们在之前的e•MMC版本中也得到了支持。

当任务队列启用后且为空队列时,host只能在Trans状态下发送类11命令。但如果EMMC处于Trans状态并处理一系列命令(例如,擦除序列),则host需要在发送类11命令之前结束要操作的序列。

当启用命令排队模式时,一些传统命令仍然可以使用,而其他命令则被视为非法。不同排队模式下命令的合法性状态列在表45中有涉及。

如果在CMD46数据传输期间发出CMD12,则EMMC将返回Transfer状态,并且可以认为操作已完成(QSR [i] 由1更新为了)。

如果在CMD47数据传输期间发出CMD12,则设备转移到Programming状态,并且只有在所有传输的数据都被编程后,操作才被视为已完成(QSR [i] 由 1 → 0)。

6.6.40 安全写保护模式

host上运行的任何应用程序都可以通过执行CMD6、CMD8、CMD28和CMD29命令更新与写保护相关的ext_csd字段(如USER_WP [171]、BOOT_WP [173])来发出写保护,为了防止未经授权的更改这些与写保护相关的EXT_CSD字段,host应通过将SECURE_WP_EN字段设置为0x1进入安全写保护模式。

如果host进入安全写保护模式,则只有在将SECURE_WP_MASK设置为0x1时,才会更新与写保护相关的字段,如USER_WP [171]、BOOT_WP [173]、TMP_WRITE_PROTECT [12]和PERM_WRITE_PROTECT [13]。这些SECURE_WP_MODE_CONFIG和SECURE_WP_MODE_ENABLE字段在设备配置区中定义,只能通过经过身份验证的设备配置写请求进行更新。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SUNtao99

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

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

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

打赏作者

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

抵扣说明:

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

余额充值