EMMC相关学习

分区相关

Boot area Partition
该分区包含两个BOOT AREA PARTITION,用于存储bootloader,支持SOC(片上系统,一般里面会存操作系统)从emmc中启动系统。
这两个分区的容量大小是厂家生产过程中配置·,大小相同

、计算方式:

RPMB
GPP
是一个通用分区,可以用于存储各种类型的数据,允许创建多个GPP
大小计算:

BUS Protocol
上电复位后,通过以下方式初始化设备
Command:命令是启动一个操作的令牌,命令从主机发到设备,命令在CMD上串行传输
Response:响应是设备发给主机的令牌,所为对之前收到命令的回答,在CMD line上串行传输
Data:数据可以从设备传输到主机,也可以从主机传输到设备,数据通过data lines传输,用于数据传输的data lines可以是1(DAT0),也可以是8(0-7)
对于每条数据线,每个时钟周期可以传输1bit或2bit,单/双数据率
设备寻址使用会话地址实现,在初始化阶段由总线控制器分配给连接的设备,设备由CID号标识

Device registers
Device接口中定义了七个寄存器,OCR,CID,EXT_CSD,RCA,DSR,DSR
OCR
一个32位的操作条件寄存器,存储设备的电压分布和访问模式指示,这个寄存器还包括一个状态信息位,当设备上电过程已经完成时,设置此状态位,所有设备都应该设置该位。

CID register
设备标识位寄存器是128位宽,包含在设备标识阶段(emmc协议)所使用的设备标识信息,每个单独的Flash和I/O设备都有唯一的标识

MID:一个八位二进制数,用来标识设备制造商,MID编号由JEDEC控制、定义并分配给emmc制造商,本程序的建立是为了确保CID注册表的唯一性
CBX:设备类型

OID:8位2进制数字,用于标识设备OEM和/或设备内容(当用作ROM或FLASH Devices时的分配媒介),OID由JEDEC控制分发给emmc制造商,保证CID注册表的唯一性
PNM:产品名称,是一个包含6个ASC的字符的字符串
PRV:产品修订,由两个二进制编码的十进制(BCD)数字组成,每个数字4位,代表一个“n.m”修订号,n是最显著的一点,m是最不显著的一点
PSN:32BIT的无符号整形
MDT:生产日期,两个16进制数字组成,每个数字四位m/y,先月后年,大于2012后REV[192]中以大于4的值表示,Y在2012后会滚动

CRC:CRC7校验和,根据0计算的CID内容的校验和

CSD register
设备特定数据寄存器提供有关如何访问设备内容的信息,CSD定义了数据格式,纠错类型、最大数据访问时间、数据传输速度、是否可以使用DSR寄存器等,寄存器的可编程部分可以通过CMD27更改(不全见手册)

Extended CSD register
扩展CSD寄存器定义设备属性和选择模式,长度512字节,最高位的320个字节是properties段,定义了设备功能,主机不能修改,较低的192个字节是modes段,定义了设备正在工作的配置,可以通过SWITCH命令改变模式(表自查)
RCA register
可写的16位相对设备地址寄存器,鞋带主机在设备标识期间分配的地址,改地址用于设备识别过程后的寻址主机-设备通信。RCA寄存器缺省值为0x0001,保留值0x0000通过CMD7将所有设备设置为standby状态
DSR register
16位驱动级寄存器,可以选择性的用于改进母线在扩展运行条件下的性能(取决于母线长度、传输速率、设备数量)CSD寄存器携带DSR寄存器的使用信息,他的默认值是0x404
QSR
32位队列状态寄存器在特定时间点携带队列中任务的状态,host可以通过设备响应SEND_QUEUE_STATUS命令(CMD13,bit[15]=1),读取该寄存器,R1的参数是32位的QSR,每个位表示任务ID对应与位索引,如果位QSR[i]=0,则任务ID为i的队列任务尚未准备好执行,1则表示已经准备好执行,跟踪任务状态时host的职责,可以确实任务是挂起还是排队,或任务ID是否被使用
Timing Values

Commands(Detailed command description)
四种控制emmc的命令:broadcast command,no response(广播信号)
broadcast command,with response
addressed(point to point),no data transfer on DAT lines
addressed(point to point)data trabsfer commands(adte),data transfer on DAT lines

所有命令和响应都是通过MMC总线的CMD行发送,命令传输总是从与命令码字对应的位串左位开始
所有命令都有固定的48位代码长度,在52Mhz时需要0.92微秒传输时间
命令是从起始位开始(always 0),然后跟着传输方向(host=1)接下来6位是命令的索引,二进制数(0-63),有些命令需要参数,32位编码,x表示该值依赖于命令,所有命令都受CRC保护(校验和),每个命令都以结束位“1”结束。
所有命令搜索(Basic commands)

P位和Z位区别:P位分别由Device的主机驱动器主动驱动到High,而Z位分别由上拉电阻R驱动到HIGH

Command and response Timing
单双数据模式都是在主机时钟上升沿进行计时
设备标识和设备运行状态定时
器件识别(CMD2)和器件操作条件(CMD1)的时序在开漏模式下处理,设备对主机命令的响应恰好在Nid个时钟周期后开始

分配设备相对地址(CMD3)

Data transfer mode
设备接受到RCA后,将切换到数据传输模式,在这种模式下,CMD后是两位Z(允许在总线上进行命令切换的时间),然后由响应设备推高P位

R1b responses
有些命令使用R1responses,而且会使BUSY线忙碌,如果BUSY信号忙碌,他在结束位之后两个时钟周期完成,DAT0线被低电平驱动,DAT1-7由设备驱动,两者数值不相关。

Last Device response-next host Command timing
在最后一个设备响应结束后,设备可以在Nrc个时钟周期后开始新的下一次命令下发

Last host Command -next host Command timing
在最后一个命令被发送后,至少需要Ncc个时钟周期才能开始下一次

Read:
没有数据传输时,DAT0-DAT7高,除HS400外,所有接口时钟信号同步传输,在单速率模式下吗,传输基本单位是一个block,最大大小在CSD中决定。
单数据模式中,数据由设备发出时钟,由主机在上升沿采样,每个数据线有一个CRC,双数据速率模式下,数据同时在时钟的上升和下降沿时钟输出,每条线附加两个CRC,这种模式中块长度总为512字节,并且字节以4位或8位的宽度交错配置,奇数字节由主机在时钟上升沿采集,偶数字节则是在下降沿采集,设备为每个有效数据线附加两个有效CRC16,一个对应上升沿的数据,一个是下降沿的数据。注意,只有数据和CRC在时钟的上下升沿都有效,起始和终止位只在上升沿有效。

CMD17开启单个读块操作,传输完成后设备返回传输状态,双速率模式下只能512字节整个读块,并且末尾加两个CRC,一个偶数字节一个计数,最后一个数据位之后,CRC校验位的后缀允许主机检查错误

CMD18开始传输几个连续的块
Open-ended Multiple block read: 读取的块没有数量限制,直到收到停止传输命令CMD12

在停止命令结束位之后,数据传输两个时钟周期后暂停

Multiple block read with pre-defined block count:设备会传输请求的数据块数量,终止传输会返回传输状态,不需要stop命令,除非以错误结束,主机需要在SET_BLOCK_COUNT(CMD23)后立刻使用CMD18后立刻使用,否则设备会自动开启openended
 
出现以下事件,设备将保持tran态并且返回错误位:
主机将超出范围的地址作为参数提供给CMD12,18,ADDRESS_OUT_OF_RANGE位被设置
?当前设置的块长度对于读操作非法,BLOCK LEN ERROR位被设置
如果主机使用的部分块累计长度没有对齐,并且不允许块对齐,则设备在传输第一个快对齐错误时将检测到块对齐错误,并且随后传输的位内容不确定,当主机发送CMD12,设置ADDRESS_MISALGN并且返回Tran

设备在多块读的过程中发生错误,将会停止数据传输并且保持在数据状态,主机需要通过发送停止传输命令来中止该操作,在CMD12的响应里面报告错误。
如果CMD12是在设备预定义的块操作的最后一个块之后发出的,那么该命令会被认作非法命令,因为设备已经不处在数据状态
如果主机发送的密码不设置CMD16密码密度大于2GB,那么主机必须在读取数据传输前重新发送CMD16,否则设备会响应BLK_LEN_ERROR,并且在没有数据传输的情况下留在TRANS态,因为数据块的传输扇区单位

Write
主机可以设置所需数据的可靠性类型,当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)
主机可以选择更改这次和上次一个或多个分区写操作的可靠性,整个寄存器被认为是一次写入,所以主机有一次机会写入寄存器的所有位,这种写必须作为分区过程的一部分发生,并且必须在设置分区设设置前完成,WR_REL_SET寄存器的所做的更改在分区完成之前不会产生影响。设置设备中不存在的分区数据可靠性对设备没有影响。
在块写入过程中,主机将一个或多个数据传输到设备,并且在每个末尾附加一个CRC,支持块写入的设备应该是总能接受WRITE_BL_LEN定义的数据块,如果CRC失败,应该在DAT0上提示失败,传输的数据将被丢弃,不写入,所有后续传输的块都会被忽略
三种类型的写
CMD24 单个块写
数据后缀是CRC校验位,允许设备检查传输错误,设备将CRC检查结果作为CRC传输令牌在DAT0上发回,任何数据线上发生的传输错误,DAT0会发送一个错误CRC状态“101”,传输正确的情况下会发出一个正确的CRC“010”并开始数据写入过程

Ncrc是为HS200和HS400定义的时序参数,指定的是从写操作中的数据结束位到CRC状态的开始位的定时。

对于HS400的设备,在CRC状态响应后,设备在结束位参考CLK的上升沿的tPH_DATASTROBE+tPERIOD+tRQ在DAT0上输出BUSY信号,在此时间之后,主机可以开始安全的采集BUSY信号。

CRC status传输过程中停止传输时序图

前面的所有示例都处理在活动数据传输期间主机停止数据传输的场景。
下面两个图描述了接收数据块之间停止传输的场景。
在第一个示例中,设备忙于对最后一个块进行编程,而在第二个示例中,设备处于空闲状态。
然而,在输入缓冲区中仍然有未编程的数据块。
一旦接收到停止传输命令并且设备激活BUSY信号,这些块就被编程。

 CMD25 Open-ended multiple-block write
 CMD23-CMD25具有预定义数量的多块写
在这种情况下,数据块之间的BUSY信号类似于开放式多块情况缓冲忙信号,设备在接收到最后一个数据块之后,BUSY信号应该被认为是编程忙,并且与编程状态直接相关,当状态发生变化时(从rcv到prg),忙信号的含义(从缓存区到编程忙,也会发生变化),BUSY信号一直拉低,并且在rcv到prg状态之间不被设备释放,完成编程后会停止下拉DAT0线。
 可靠写:多个块写入,具有预定义的块计数和可靠写参数。
 此事务类似于基本的预定义多块写入(在前面的项目中定义),但有以下例外。
 逻辑地址所指向的旧数据必须保持不变,直到写入同一逻辑地址的新数据被成功编程。
 这是为了确保由可靠写事务更新的目标地址从不包含未定义的数据。
 即使在编程过程中突然断电,数据也必须保持有效。
 d由SET_BLOCKLEN(CMD16)定义的块大小被忽略,所有块的长度为512b。
 如果激活大扇区大小模式,数据传输将在512b扇区中的多个扇区中进行,或者在8个512b扇区中的多个扇区中进行。
 对可靠写入的大小没有限制。
 该功能通过在SET_BLOCK_COUNT命令(CMD23)参数中将可靠写请求参数(位31)设置为“1”来激活。
 可靠写事务必须是扇区对齐的,如果一个可靠写不是扇区对齐的,错误位19将被设置,事务将不会完成。
 如果在可靠写入过程中发生电源丢失,则写入所修改的每个扇区都是原子的。
 电源故障后,扇区可能包含旧数据或新数据。
 被中断写操作修改的所有扇区可能处于以下状态:所有扇区都有新数据,所有扇区都有旧数据,或者部分扇区有新数据,部分扇区有旧数据。
 在一个可靠的写操作被高优先级中断操作中断的情况下,寄存器标记为已完成的扇区将包含新数据,其余扇区将包含旧数据。
 REL_WR_SEC_C[222]寄存器应该设置为1,对可靠的写操作没有影响。
有些设备的写入时间很长且不可预测,可以使用CMD13对它的状态进行轮寻
写保护
可以防止数据被损坏或擦除,有两种级别的写保护命令,
对整个设备,在CSD中设置写保护(永久/临时)
对设备的特定段写保护(永久/临时/上电)
设备的制定段大小由EXT_CSD中的EARSE_GROUP_DEF决定了段的大小,设置为0时,段大小由CSD中指定的WP_GRP size擦除组为单位定义,当设置为1时,段大小以EXT_CSD中指定的HC_WP_GRP_SIZE擦除组为单位定义
CRC

Earse
MMC的可擦除单元为earse group,写块是设备的基本可写单元,earse group的大小是设备的特定参数,擦除后全为1、0是在EXT_csd中定义。
主机可以擦除连续的组,擦除有三个步骤,
首先使用EARSE_GROUP_START(CMD35)定义范围的起始地址
EARSE_GROUP_END(CMD36)定义终止位置
Earse(CMD38)启动擦除过程,CMD38参数表:

当执行Erase命令时,主机应该注意到一个擦除组包含多个写块,每个写块可能包含不同的信息片段。
当Erase执行时,它将应用于擦除组内的所有写块。
在主机执行Erase命令之前,它应该确保不再需要各个写块中的信息。
因此,为了避免意外删除有效数据,最好使用Erase命令擦除整个设备或分区。
如果主机只希望清除单个写块,则Trim命令可能更合适
如果在擦除过程中收到命令,会设置EARSE_SEQ_ERROR位并重置整个序列。
Trim
该函数应用于写块而不是擦除组,trim功能允许主机识别不再需要的数据,以便在后台擦除事件中必要时可以擦除数据,擦除时设置1还是0在EXT_CSD中设置,他的使用步骤和earse一样,但是35,36标识的是写块的地址而不是擦除组
使用CMD0,CMD15或硬件重置会终止任何挂起或活动的trim操作,会使操作过程中的数据处于未知的状态
Sanitize
消毒操作是除TRIM和EARSE外的一个功能,用于根据安全删除类型(见下图)从设备里安全的删除数据,使用消毒操作需要设备从未映射的用户地址空间中删除数据。该操作通过向EXT_CSD[165]SANITIZE_START中写入一个值启动,当设备执行清理操作时,busy线忙碌,设备将在该情况下继续消毒,直到发生以下事件之一:
消毒操作完成
HPI用于中止操作
电源故障
硬件复位
清理操作完成后、未映射的主机地址空间中不应该存在任何内容,如果该操作因为HPI,电源故障,CMD0或者硬复位而中断,。无法保证未映射的主机地址空间状态,主机必须写入SANITIZE_START[165]来重新启动清理操作,并允许操作完成,以保证未映射的主机地址是清空的

Discard
Discard的操作类似于TRIM,丢弃功能允许主机识别不需要的数据,以便在后台擦除事件中必要时开始擦除数据应用了丢弃函数的写块内容应该是“don‘t care’”,在秀气操作后,根据设备不同,原始数据可能保留部分或全部可被主机访问,主机不能再访问的数据部分可以被删除或取消映射,就像TRIM的情况一样,设备将丢弃写块内容
Discard和TRIM的区别在于,对一个被discard的区域进行读,可能会返回部分或全部原始数据,但是TRIM操作后整个区域将被取消映射或删除,并返回0-或1
Sanitize操作则是只有被丢弃命令未映射的部分才会被清理命令清理,sanitize时,设备不能保证从设备中完全删除被丢弃的数据


Secure EARSE
该功能是为了向下兼容,新版本不建议使用
安全擦除命令要求设备在发出命令时对内存阵列执行擦除操作,并要求主机在等待擦除操作完成之后再进行下一个设备操作,他将根据安全擦除类型,secure earse命令要求对擦除组和这些擦组中表示为擦除的动作执行安全擦除
执行方法与EARSE相同,,需要将EARSE(CMD38)的参数位31置1,其他为0

Secure TRIM

Secure trim命令和secure earse命令的区别在于前者是在写块级别上的操作而后者是在擦除组级别上的操作
安全 TRIM 步骤 1:
主机定义要标记为安全清除的写块范围。此步骤不会执行实际的清除操作。
使用 ERASE_GROUP_START (CMD35) 命令定义范围的起始地址,然后使用 ERASE_GROUP_END (CMD36) 命令定义范围的结束地址。这两个命令的参数应为写块地址。
一旦范围确定,发送 ERASE (CMD38) 命令,参数的第 31 位和第 0 位设置为 1,其余位设置为 0。这完成了安全 TRIM 步骤 1。
可以多次重复步骤 1,以标记多个写块,期间可以执行其他命令。
安全 TRIM 步骤 2:
再次使用 ERASE_GROUP_START (CMD35) 和 ERASE_GROUP_END (CMD36) 命令,地址应在范围内,但命令参数将被忽略。
发送 ERASE (CMD38) 命令,参数的第 31 位和第 15 位设置为 1,其余位设置为 0。这一步骤实际执行安全清除操作。
安全 TRIM 操作的命令处理和状态管理:

  1. 非擦除命令的处理:
    o 如果在安全 TRIM 步骤 1 或步骤 2 正在执行时接收到非擦除命令(即不是 CMD35、CMD36、CMD38 或 CMD13),设备会响应并设置 ERASE_RESET 位,重置当前步骤而不完成操作,并执行最后一个命令。
    o 未针对选定设备的命令不会中止当前的安全 TRIM 序列。其他命令可以在多个安全 TRIM 步骤 1 的迭代之间或步骤 2 发送之前执行,但每个步骤的序列不能被中断。
  2. 电源故障或重置的处理:
    o 如果在步骤 1 和步骤 2 之间发生电源故障或重置,已标记为安全清除的块将保持标记状态。下一次设备接收到步骤 2 时,将清除在电源故障或重置之前标记的块,以及自那时起标记的任何块。
  3. 执行安全 TRIM 命令的注意事项:
    o 主机在执行安全 TRIM 命令时应谨慎,以避免意外数据丢失。在步骤 1 或步骤 2 期间重置设备(使用 CMD0、CMD15 或硬件重置)或发生电源故障将终止任何待处理或活动的安全 TRIM 命令,可能导致相关数据处于未知状态。
    o 如果擦除范围包括写保护块,这些块将保持不变,只有非保护块会被擦除,状态寄存器中的 WP_ERASE_SKIP 位将被设置。
  4. 后台安全清除操作:
    o 如果设备需要一个标记为安全擦除的写块,而步骤 2 尚未发出,设备可以在后台对该写块执行安全清除操作。设备会通过将 DAT0 线保持低电平来指示步骤 1 或步骤 2 正在进行中。
    o 实际操作可能需要较长时间,主机可以发出 CMD7 命令取消选择设备。
    o 如果在步骤 1 和步骤 2 之间更改了写块大小,则在操作步骤 1 中使用的写块大小将适用。

response
所有响应都通过命令行CMD发送,响应传输总是从响应码字对应的位串左位开始,长度取决于响应的类型。所有response都是0开始1结束,除了R3类型,都受CRC7保护
五种类型的response

R1b在DAT0上比R1多了一个可选的忙信号,根据设备接受命令前的状态,设备在接受到这///些命令后可能会处于忙状态

Decive status
R1格式的回复包含一个32位的设备状态,两个不同的属性与每一个设备状态位相关联
有两种类型
1) Error bit,表示设备检测到错误情况,一旦发出响应(报告错误),这些位就会被清除
2) Status bit,仅作为信息字段不改变被响应命令的执行,这些bit持久,会根据设备的状态进行设置和清除
错误位的检测方式:
设备在命令解释和验证阶段(响应模式)或命令执行模式(执行模式)中检测异常,响应模式异常会在引发异常的命令的response中报告,执行模式异常则是在终止操作STOP_TRANSMISSION命令的响应中报告执行模式异常,或者实在执行操作或操作完成后对SEND_STATUS命令的响应报告执行模式异常,Det Mode就是检测模式,R是响应模式,X是执行模式

(Device status)是状态表格
R错误位会受到影响,X状态位会受到影响,E错,S状态

Sleep(CMD5)
设备可以通过Sleep/AWAKE(CMD5)在休眠和待机转态之间转换。在睡眠状态下,存储设备的功耗最小化,在这种状态下,内存设备只对命令RESET (CMD0参数为0x00000000或0xF0F0F0F0或H/W RESET)和SLEEP/AWAKE (CMD5)做出反应,其他所有命令都会被忽略。
待机状态和休眠状态之间状态转换的超时在EXT_CSD寄存器S_A_TIMEOUT中定义。休眠状态期间的最大电流消耗在EXT_CSD寄存器S_C_VCC和S_C_VCCQ中定义。
Sleep命令:在Sleep /AWAKE (CMDS)参数中将15位设置为1。
Awake命令:在SLEEP/ Awake (CMDS)参数中将15位设置为0。
Sleep命令用于启动从Standby状态到Sleep状态的转换。
存储设备通过下拉DAT0线指示过渡阶段忙(transition phase busy)。
在繁忙期间不应发送进一步的命令。当内存设备停止下拉DAT0线时,进入睡眠状态。
Awake命令用于启动从休眠状态到待机状态的转换。
存储设备通过下拉DAT0线指示过渡阶段忙(transition phase busy)。
在忙期间不应发送进一步的命令。
当内存设备停止下拉DAT0线时,进入Standby状态。
在休眠状态期间,Vcc电源可能会关闭。这是为了进一步节省系统功耗。
只有在达到睡眠状态(存储设备已经停止拉下DAT0线)后,才允许关闭Vcc电源。
在允许启动从休眠状态到待机状态的状态转换(唤醒命令)之前,Vcc电源必须至少上升到最小工作电压水平。
被锁定的设备可以通过CMD7命令(一个可以在锁定状态下执行的0类命令)取消选择设备,然后发出Sleep命令。可以在锁定的时候节省功效,被锁定的设备随后可以通过Awake命令退出休眠状态并处于待机状态。
Background operations P94
设备内部需要进行很多维护操作,为了不影响读写的延迟,需要在主机没有服务的其他时间进行操作,这些操作分两类
前台操作:主机需要服务的操作,例如读和写
后台操作:设备不为主机服务时执行的操作,后台操作有两种类型,手动启动的后台操作和自主启动的后台操作
手动启动(Manually initiated):为了让Device知道什么时候host不需要它,它可以执行后台操作。主机将任何值写入BKOPS_START(EXT_CSD byte[164])来手动开启后台操作,Device会一直busy直到没有更多的后台处理
前台操作的优先级高于后台操作,host可以使用高优先级的中断机制中断正在运行的后台操作。
BKOPS EN(EXT CSD bvte[163]):主机设置bit0(EANUAL_EN)来让主机知道是否需要定期启动后台操作,它会定期写入BKOPS_START,主机写入BKOPS_START时,设备会延迟一些维护操作
BKOPS_STATUS(EXT_CSD[246]byte):Device报告后台操作,分为:0x0: 无需操作,0x1: 操作突出-非关键,0x2:操作突出-性能收到影响,0x3:操作突出-关键
0x3:状态级别达到此,由于不能再延迟维护操作,一些其他操作可能会超出其原始时间
为了使hosts可以快速检测更高级别,只要级别为2或3的时候就设置EXCERTION_EVENTS_STATUS中的URGENT_BKOPS bit,自动在Device Status设置EXCEPTION_BIT,这允许主机在每个R1类型响应上检测紧急级别,主机仍需要从BKOPS_STATUS字节中读取完整状态,并根据需要启动后台操作。
自动启动(autonomously initiated method):将BKOPS_EN的字段【EXT_CSD byte 163】中的Auto_EN设置为1b来通知设备在其空闲的时候执行后台操作,他会在合适的时候启动或停止后台操作而不需要通知主机。
Field Firmware Update
增强现场功能,主机将新版本的固件下载到emmc,并且在下载成功后指示emmc设备将新下载的固件安装到设备当中。
为启动FFU,主机首先读取EXT_CSD的SUPPORTED_MODES和FW_CONFIG字段来检查MMC设备是否支持FFU功能,如果支持,主机可能会启动FFU进程。FFU进程通过在EXT_CSD的MODE_CONFIG 字段中切换到FFU模式启动。
FFU模式下主机应该使用封闭式或开放式命令(CMD17,18,24,25)来下载新固件和读取供应商专有数据。
主机应该将这些命令的参数设置为与FFU ARG字段定义的一致,主机应该将块长度设置为DATA扇区的大小,下载的固件包必须与DATA SECTOR SIZE大小对齐
一旦进入FFU模式,主机可以使用一个或多个写命令向设备发送新的固件包
将EXT_CSD中的MODE_CONFIG字段设置为normal,主机可以恢复正常的读写
可以通过扩展CSD中的NUMBER_OF_FW_SECTORS_CORRECTLY_PROGAMMED来获取关于成功下载扇区数量的提示。

Cache
缓存是eMMC设备中的临时存储空间,通常情况下缓存应该减少写和读的访问时间(与 main nonvolatile storage相比),主机不能直接访问缓存,这个临时存储空间也可以用于一些具体的操作实现,如作为内存控制器的执行存储器或作为地址映射表的存储器。
缓存本质上不稳定,这种易失性缓存的实现对本标准的一些要求有一些显著的影响:
 Cache of data只适用于单块读/写(CMD17/24)、预定义的multiple block Read/write(CMD18/25+CMD23)和开放式的multiple block Read/write(CMD18/25+CMD12)
 数据缓存仅适用于单块读/写(CMD17/24)、预定义的多块读/写(CMD23+CMD18/25)和开放式多块读/写(CMD18/25+CMD12)命令,不包括任何其他访问,例如对寄存器空间(例如CMD6)的访问。
 CMD24、CMD23+CMD25或CMD25+CMD12后的Data0忙位和状态响应位[8]不一定指示对非易失性存储器的编程状态,但可能指示对易失性缓存的编程状态(稍后定义例外)。
 Flush操作是指从主机到设备将缓存数据写入非易失性存储器的要求。
 在刷新之前,设备可以自主地将数据写入非易失性存储器,但是在刷新操作之后,必须将易失性区域中的所有数据写入非易失性存储器。
 由于突然断电,缓存中的数据可能(而且很可能会)丢失。
 如果在电源丢失时正在进行刷新操作,那么任何此类数据也可能丢失。
 当缓存处于ON状态时,对RPMB和Boot分区的访问仍应定向到非易失性存储,其要求与本标准中其他地方定义的要求相同。
 当缓存打开时,它应用于整个e-MMC设备(当刷新缓存时,所有分区的数据都将刷新,此操作与活动分区无关)。
 由于在分区之间切换,不需要进行刷新。 (注意:这也意味着在分区之间切换时缓存数据不会丢失)。
 缓存的数据可能会在SLEEP状态下丢失,所以主机应该在将设备置于SLEEP状态之前刷新缓存。
 设备可能会在收到RST_n或CMDO的情况下使缓存中的数据无效。
缓存功能的支持和缓存大小在Cache size byte(EXT-CSD字节[252:249])中表示
在上电,RST_n,或CMD0后,Cache默认off,缓存功能可以通过写入CACHE_CTRL字节(EXT_CSD字节[33])来打开和关闭,可以通过写入FLUSH_CACHE(EXT_CSD[32])来将缓存刷新到非易失联性存储中。R1b响应结果反应缓存数据到非易失联性存储器的编程状态。完成正常写入定义的编程后,CMD13可以从状态寄存器中读取任何错误,如果在执行FLUSH_CACHE或使用CACHE_CTRL操作关闭缓存时发生flush错误,设备会设置通用错误位STATUS bit【19】
CACHE打开时,强制将数据直接写入非易失联性存储

  1. 一个可靠的写访问强制将数据写入非易失联性存储器,DATA0忙反应了本标准中其他地方定义的编程状态
  2. 在实际写入命令前设置CMD23中的参数位[24],如果Cache被关闭那么该位会被忽略,如果该位与CMD23中的可靠写位一起被设置,则该位也将被设备忽略

High Priority Interrupt(HPI)高优先级打断
HPI机制允许设备在实际完成之前中断较低优先级的操作,在OUT_OF_INTERRUPT_TIME超时内,能够服务更高优先级的请求,主机可能需要重复被中断的操作或其中一部分来完成原始需求。
CMD12-基于STOP_TRANSMISSION命令来设置参数中的HPI位
CMD13,基于SEND_STATUS命令来设置参数中的HPI位
主机将检查HPI_FEATURES(EXT_CSD)字节中的只读HPI_EMENTATION位[503],并使用相应的命令索引。
如果CMD12设置了HPI位,则允许转换与非HPI命令不同。
HPI只能在prg-state下执行,,如果接收到的HPI状态不是pre-state,则设备状态由下表定义,如果允许状态转换,则发送响应,但忽略HPI位,如果不允许状态转换,则会认为该命令是非法命令。
,在不可中断的命令期间接收到HPI,则发送响应但忽略HPI位,可能会超过OUT_OF_INTERRUPT_TIME,
可中断的命令和不可中断的命令


在执行WRITE MULTIPLE BLOCK命令(CMD25)后,设备更新CORRECTLY_PRG_SECTORS_NUM字段(EXT_CSD bytes[245:242]),将512B扇区的数据成功写入Device。主机在重复被打断的时候可以使用该命令,它不需要重写所有数据扇区,它可以跳过正确编程的扇区,继续写入尚未编程的其余数据。
如果HPI正在中断CMD25,(打包写命令的一部分),设备更新CORRECTLY_PRG_SECTORS_NUM字段将反应被传输的累计打包扇区(加上head),host可以从这个数据计算可中断单个命令的索引和中断的偏移量。
如果在可靠的写命令期间收到HPI,则第一个正确的PRG sectors-num扇区应包含新数据,其余扇区包含旧数据。
在HPI前必须启用通过在HPI MGMT字段中设置的HPI的EN位(EXT CSD字节[161]),所有设备都应该在HPI_FEAYURES字段(EXT_CSD字节[503])中设置HPI_SUPPORT位

Power Off Notification

主机应该在关闭电源之前通知设备,使设备在被关机前做好准备。Power the Device off指的是关闭设备的所有电源,特别是在主机关闭VCC和VCCO电源之前,设备应该先发布电源关闭通知(POWER_OFF_LONG,POWER_OFF_SHORT),如果打算在设备移动到睡眠状态后关闭VCC,可以使用(SLEEP_NOTIFICATION)作为电源关闭通知
EXT_CSD[34]中的power off notification字节设置为POWERED ON(0x01),执行poweroff操作时,在下电操作前,主机会修改power off SHORT(0x02)或power off LONG(0x03),主机等待忙线解除断言,设置完成后,设备可以安全下电
如果POWER OFF NOTIFICATION byte设置为POWERED ON,主机可能会发出SLEEP_AWAKE(CMD5)来进入或退出休眠,在转为待机状态,再移到睡眠状态之前,主机将POWER OFF NOTIFICATION设置为SLEEP NOTIFICATION,并等待DAT0解除断言
在处于休眠状态(slp)时,在移除所有电源之前,主机应该使用CMD5和CMD7将设备从休眠态转换为传输状态,然后再执行一个关机通知,将POWER_OFF NOTIFICATION字节设置为POWER_OFF_SHORT或POWER_OFF_LONG

如果主机在切换到关机设置后继续向设备发送命令,如(CMD8)或在其繁忙状态下执行HPI,则设备应该将POWER_OFF_NOTIFICATION字节恢复POWERED_ON
如果主机试图在POWER_OFF_NOTIFICATION中写入另一个值后将其更改为0x00,则会生成Switch_ERROR。
POWER_OFF_SHORT,POWER_OFF_LONG的区别:
关机的紧急程度不同,他们有不同的超时响应时间
当POWER_OFF_NOTIFICATION设置为POWERED_ON时,设备期望主机:
保持设备电源供电(Vcc和Vcco)并处于活动模式,在将POWER_OFF_NOTIFICATION更改为POWER_OFF_LONG或POWER_OFF_SHORT之前不会故意关闭设备,并且在将POWER_OFF_NOTIFICATION更改为SLEEP_NOTIFICATION并将设备移动到睡眠状态之前不会故意关闭Vcc
在进入休眠状态之前,主机可以将POWER OFF_NOTIFICATION字节设置为SLEEP_NOTIFICATION (Ox04),如果意识到设备能够自主启动后台操作以可能的性能改进。
主机应该等待忙线解除断言。
忙线可以断言到EXT_CSD[216]中SLEEP NOTIFICATION_TIME字节中定义的时间段。
一旦设置更改为Ox04,主机可以将设备设置为休眠模式(CMD7+CMDS)。
从休眠状态中退出后,POWER OFF通知字节将恢复其值为POWERED_ON。
HPI可能会中断SLEEP_NOTIFICATION操作。
在这种情况下,POWER_OFF_NOTIFICATION字节将恢复到POWERED_ON。

PRODUCTION STATE AWARENESS[133]
减少emmc设备在烧写过程中被损坏的概率
通过该字段,host向设备报告其生产状态,该字段有以下值
NORMAL(Field)-该值表示设备作为字段以及设备使用“regular”操作
PRE_SOLDERING_WRITES-该值表示设备在焊接之前和主机加载内容到设备之前处于生产状态,主机将设备设置为(加载内容到设备)的这种状态
PRE_SOLDERING_POST_WRITES-这个值表示设备正处于生产状态,主机完成将内容加载到设备,主机在内容加载后和焊接前将设备置于此状态,一旦转移到该状态,就不应该向设备中写入内容
AUTO_PRE_SOLDERING-如果需要自动预焊接数据,该置应该由主机设置,如果传输的数据和PRE_LOADING_DATA_SIZE一样多,会通过自动将PRODUCTION STATE AWARENESS的值改为NORMAL(0x0),将设备更改为NORMAL状态,不需要单独的指令

Exception Events
通过设置异常事件,可以快速向主机报告一些异常,异常状态位将保持,直到他的诱因被清除

Cache Enhancement Barrier
Barrier function(屏障函数)提供了一个对Cached data执行延迟顺序刷新的方法,可以避免flush命令带来的长时间延迟,在某些情况下,主机不需要立即刷新数据,但是希望在不同的缓存数据批之间保持顺序,barrier命令可以使主机顺序刷新目标而不需要支付刷新延迟,因为设备可以将真正的刷新时间延迟到稍后的空闲时间。
Barrier规则:
Ri,i=0……,N表示请求序列,假设在Rx和Rx+1之间设置了屏障,那么所有请求R0到Rx必须在Rx+1到RN之前刷新到非易失性存储器
在两个屏障之间,设备可以自由的以任何顺序将数据写入非易失联性存储器,如果主机想要保持一定顺序,它应该刷新缓存,或者在顺序很重要的地方设置另一个barrier
通过写入FLUSH CACHE字节(EXT CSD字节[32])的BARRIER位来实现barrier的设置。在完成任何正常写请求定义的编程后,CMD13可以从状态寄存器中读取任何错误,这个错误可能会影响自上次刷新操作以来写入缓存的任何数据
如果barrier的数量超过了上限,可能会进行一个普通的FLUSH
对于强制编程写请求,如(CMD23,24位开启)或可能得写靠写请求时,在任何CACHEDATA之前,即使有barrier,也应该写入非易失联性存储器
为了使用barrier功能,主机需要设置BARRIER_EN(EXT_CSD字节[31])的第0位,该功能对emmc设备而言是可选的。
CACHE Flushing policy
主机会以有序的方式从缓存中刷新数据,有时候为了保证有序刷新,主机可以使用命令或者屏障的方式顺序刷新设备CACHE
当CHCHE_FLUSH_POLICY字段中的FIFO位(EXT_CSD[240])被设备用来向主机指示设备刷新策略是先进先出的时候,可以保证数据刷新的顺序和数据写入的顺序相同,也就是说设置屏障和FLUSH命令是多余的,但是CACHE_FLUSH_POLICY字段是只读的,不可以被主机和设备修改。

Command Queuing
设备管理乐意一个内部任务队列,主机可以对数据传输任务进行排队,最初任务列表为空,主机发出任务,排队等待,主机跟踪所有排队任务的状态,可以通过发送指示其任务ID的命令来命令任何标记为“准备执行”的任务的执行“
QUEUED_TASK_PARAMS_CMD44
这是数据传输任务排队的第一步,该命令对任务排队和执行所需要的参数进行编码,参数是:块计数,任务ID,优先级,数据方向和其他参数(标签请求,上下文ID,可靠写,强制编程)
已编码的任务ID不可以被队列中的另一个任务使用,如果任务ID标识的任务已经完成,则任务该任务ID可用于重用,当最后一个数据块完全通过emmc总线传输时,认为数据读取任务已经被完成,当最后一个数据块后面的忙信号被释放时,认为一个数据写完成
分为两个优先级:高优先级任务和简单优先级任务,设备在准备简单任务之前,应该先为高优先级的任务做执行准备,从而优先处理高优先级任务。在低优先级任务已经开始的时候接收到高优先级任务请求时,设备可能已经开始执行低优先级任务,但没有在QSR中将他们标记为准备执行,设备可以在新的高优先级任务之前将这些任务标记为准备执行
CMD44后面必须要跟着CMD45来完成排队,如果出现错误需要重新执行4445
CMD44可以在数据线进行数据传输时发出,空闲时发出,或者设备busy时发出,但是不能在CMD48处于BUSY时发出
QUEUED_TASK_ADDRESS_CMD45
CMD45必须仅在44后发布,CMD45的参数是相关事务的起始地址,当设备接收到44,45两个命令后,根据这俩命令提取的参数对任务进行排队,可以在数据线进行数据传输时发出,空闲时发出,或者设备busy时发出,但是不能在CMD48处于BUSY时发出
EXECUTE_READ_TASK – CMD 46
为了执行已排队的数据读取任务,主机发出CMD46,参数是所请求任务的TaskID,指定任务必须是数据读取任务(数据方向为1),在队列状态寄存器中被标记为“准备执行”.
如果请求的任务确实是读任务且在准备执行状态,则设备响应R1响应并开始数据传输,当最后一个数据块完全通过emmc总线传输时,应该为任务清楚“准备执行”
EXECUTE_READ_TASK – CMD 46

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值