6.6.8.1 block write
-
reliable write:
-
SET_BLOCKLEN(CMD16)定义的块大小被忽略,所有块的长度都是512 B。大扇区模式激活时,数据传输将会是多个512B * n或者8 * 512B * n。此时可靠写的大小不受约束。
-
该功能通过在SET_BLOCK_COUNT命令(CMD23)参数中将可靠写请求参数(位31)设置为“1”来激活。
-
可靠的写入事务必须是扇区对齐的,如果可靠的写入没有扇区对齐,则将设置error bit 19,并且任务将fail
-
如果在可靠写操作过程中发生了掉电,每一个被修改的扇区都是原子性 的操作。掉电后的扇区状态可能有以下几种情况,要么全是新数据,要么全是旧数据,或者部分扇区是新数据,部分是旧数据。
-
当可靠写被HPI中断时,扇区会被标记为已完成,则包含新数据,其他则是未完成状态。
-
REL_WR_SEC_C[222]寄存器应设置为1,且不会影响可靠的写入操作
-
-
在多块操作中,host可以随时中止写入,而不管其是读还是写如何。中止是通过发送停止传输命令来完成的。如果写操作中,是predefined类型的,则中止时,剩余的块数的数据是未定义的。
-
如果出现以下任一情况,设备将拒绝该命令,保持Tran状态,并用相应的错误位集进行响应。
- CMD24,CMD25越界参数输入
- 写入长度非法
- 块非对齐情况
-
如果设备在多块写入操作(两种类型)期间检测到错误(例如,写入保护违规、超出范围、地址未对准、内部错误等),它将忽略任何进一步的传入数据块并保持Receive State。 然后,主机必须通过发送停止传输命令来中止操作。写入错误是在对停止传输命令的响应中报告的。
-
如果主机在设备接收到具有预定义块数的多块写入的最后一个数据块后发送停止传输命令,则该命令被视为非法命令,因为设备不再处于rcv状态。
-
块未对齐时, 则设备应在接收第一个未对齐块期间检测到块未对齐错误,中止写入操作,并忽略所有其他传入数据。 当主机发送CMD12时,设备将以ADDRESS_MISALIGN位集进行响应,并返回Tran状态。
-
如果主机将SET_BLOCK_COUNT命令(CMD23)的参数设置为全部0,则该命令是合法的;但是,后续写入将遵循开放式多块写入协议(STOP_TRANSMISSION命令-CMD12-是必需的)
-
编程CID和CSD寄存器不需要先进行块长度设置。传输的数据会受到CRC保护。如果CSD或CID寄存器的一部分存储在ROM中,则此不可更改部分必须与接收缓冲区的相应部分匹配。如果匹配失败,则EMMC将报告错误但不会更改任何寄存器内容。
-
某些设备可能需要很长且不可预测的时间才能写入数据块。在接收到数据块并完成CRC检查后,设备将开始写入并保持DAT0线为低电平 。 主机可以随时使用SEND_status命令(CMD13)轮询设备的状态,设备将以其状态进行响应(除了sleep state)。 状态位READY_FOR_DATA指示设备是否可以接受新数据。主机可以通过发出CMD7取消选择设备,然后将设备置于断开状态,并在不中断写入操作的情况下释放DAT0线。
当重新选择设备时,它将通过将DAT0拉低来重新激活busy状态 -
如果主机发送了用于密码设置的CMD16到大于2GB容量的设备,则该主机必须在写入数据传输之前重新发送CMD16。 否则,设备将响应BLK_LEN_ERROR并在没有数据传输的情况下保持TRANS状态,因为数据块(密码应用除外)传输是扇区单元。 在不支持部分写入访问的情况下,同样的错误适用于高达2GB密度的设备。
6.6.9 Erase
-
除了作为写入操作的一部分由设备执行的隐式擦除之外,还提供主机显式擦除功能。 e•MMC的可擦除单元是“擦除组”;擦除组以写入块为单位进行测量,写入块是设备的基本可写单元。 擦除组的大小是特定于设备的参数,当Erase_Group_DEF被禁用时在CSD中定义,当Erase_Group.DEF被启用时在EXT_CSD中定义。
-
明确擦除的内存范围的内容应为“0”或“1”,具体取决于不同的内存技术。该值在EXT_CSD中定义。一旦擦除命令成功完成,根据不同的内存技术,被擦除的映射设备地址范围应表现为被全部“0”或全部“1”覆盖。 擦除命令的影响应该只是将映射的主机地址范围移动到未映射的主机寻址范围。
-
主机可以擦除连续范围的擦除组。 开始擦除过程分为三个步骤。首先,主机使用ERASE_GROUP_start(CMD35)命令定义范围的起始地址,然后使用ERASE-GROUP_END(CMD36)命令定义该范围的最后地址,最后通过发出参数位设置为零的ERASE(CMD38)命令来启动擦除过程。
-
擦除命令中的地址字段是擦除组地址,容量高达2GB时以字节为单位,容量大于2GB时则以扇区为单位。 设备将忽略所有低于擦除组大小的LSB,有效地将地址向下舍入到擦除组边界。 如果在定义的擦除序列之外接收到擦除命令(CMD35、CMD36或CMD38),设备应设置状态寄存器中的erase_SEQ_ERROR位,并重置整个序列。 如果主机提供超出范围的地址作为CMD35或CMD36的自变量,则设备将拒绝该命令,以address_out_of_range位设置进行响应,并重置整个擦除序列。
-
如果收到“非擦除”命令(CMD35、CMD36、CMD38或CMD13均未收到),则设备应以erase_RESET位设置进行响应,重置擦除序列并执行最后一个命令。 未寻址到所选设备的命令不会中止擦除序列 。
-
如果擦除范围包括写保护块,则应保持其完整,并且仅擦除未受保护的块。应设置状态寄存器中的WP_ERASE_SKIP状态位。 如上所述,对于块写入,设备将通过保持DAT0为低来指示擦除正在进行。 实际擦除时间可能相当长,并且主机可能发出CMD7以取消选择设备。
-
执行擦除命令时,主机应注意,擦除组包含多个写入块,每个写入块可能包含不同的信息。当执行擦除时,它将应用于擦除组内的所有写入块。在主机执行“擦除”命令之前,应确保不再需要单个写入块中的信息。 因此,为了避免意外删除有效数据,Erase命令最好用于擦除整个设备或分区。如果主机只希望清除单个写入块,则Trim命令可能更合适。
6.6.10 TRIM
-
trim操作类似于6.6.9中描述的erase操作。Trim功能将擦除操作应用于写入块,而不是擦除组。 tirm功能允许主机识别不再需要的数据,以便设备可以在后台擦除事件期间根据需要擦除数据。应用trim功能的写入块的内容应为“0”或“1”,具体取决于不同的存储技术。 这个值在EXT_CSD中定义。
-
trim命令的影响应该只是将映射的主机地址范围移动到未映射的主机地址范围。
-
完成TRIM过程分为三个步骤。首先,主机使用ERASE_GROUP_START (CMD35)命令定义范围的起始地址,然后使用ERASE_GROUP_END (CMD36)命令定义范围的最后一个地址,最后通过发出erase (CMD38)命令启动擦除过程,将bit 0设置为1,其余bit设置为0。对于TRIM操作,CMD35和CMD36都标识写块的地址,而不是擦除组的地址。
-
如果从定义的擦除序列中接收到Trim命令(CMD35, CMD36或CMD38)的元素,则设备将在状态寄存器中设置ERASE_SEQ_ERROR位并重置整个序列。
-
如果主机提供超出范围的地址作为CMD35或CMD36的参数,设备将拒绝该命令,以ADDRESS_OUT_OF_RANGE位设置响应并重置整个擦除序列。如果设备收到非擦除命令(CMD35、CMD36、CMD38和CMD13均非),则返回ERASE_RESET位,重置擦除顺序,执行最后一条命令。 未指定所选设备地址的命令不会中止擦除序列。
-
如果修剪范围包括写保护块,则保留写保护块,只擦除非保护块。应该设置状态寄存器中的WP_ERASE_SKIP状态位。 如上所述,对于块写入,设备将通过保持DAT0低来指示Trim命令正在进行中。 实际擦除时间可能很长,主机可能发出CMD7命令取消选择设备。
SE_SKIP状态位。 如上所述,对于块写入,设备将通过保持DAT0低来指示Trim命令正在进行中。 实际擦除时间可能很长,主机可能发出CMD7命令取消选择设备。 -
重置设备(使用CMD0、CMD15或硬件复位eMMC)或电源故障将终止任何挂起的或活动的Trim命令。这可能使操作中涉及的数据处于未知状态。