eMMC工作模式

eMMC在Power On、HW Reset或者SW Reset时,Host可以触发eMMC Boot,让eMMC进入Boot Mode。在此模式下,eMMC Device会将Boot Data发送给Host,这部分内容通常为系统的启动代码,如BootLoader。

如果Host没有触发Boot流程或者Boot流程完成后,eMMC Device会进入Device Identification Mode。在此模式下,eMMC Device将进行初始化,Host会为eMMC Device设定工作电压、协商寻址模式以及分配RCA设备地址。

Device Identification Mode结束后,就会进入Data Transfer Mode。在此模式下,Host可以发起数据读写流程。

进入Data Transfer Mode后,Host可以发起命令,让eMMC Device进入Interrupt Mode。在此模式下,eMMC Device会等待内部的中断事件,例如,写数据完成等。eMMC Device在收到内部中断事件时,会向Host发送Response,然后切换到Data Transfer Mode,等待Host后续的数据读写命令。

Boot From eMMC Device:

在Power On、HW Reset或者SW Reset后,如果eMMC Device有使能Boot Mode(即,寄存器位BOOT_PARTITION_ENABLE (EXT_CSD byte[179])指定了启动分区),那么Host有两种方式可以让eMMC Device进入Boot Mode,分别定义为Original Boot和Alternative Boot,如下:

  1. Original Boot:拉低CMD信号并保持不少于74个时钟周期;
  2. Alternative Boot:保持CMD信号为高电平,74个时钟周期后,发送参数为0xFFFFFFFA的CMD0命令;

进入Boot Mode后,eMMC Device会根据寄存器位BOOT_PARTITION_ENABLE的设定,从两个Boot partitions和UDA中选择一个分区读取大小为128KB×BOOT_SIZE_MULT(EXT_CSD byte[226])的Boot Data通过Data Lines发送给Host。

在Boot Data数据传输过程中,Host可以打断数据传输,提前结束Boot Mode,方法如下:

  1. Original Boot:传输过程中,拉高CMD信号;
  2. Alternative Boot:传输过程中,发送参数为0xF0F0F0F0的CMD0命令;

备注:

  1. Host发送参数为0xF0F0F0F0的CMD0命令,可以让eMMC Device进行SW Reset;
  2. Host拉高RST_n信号可以触发eMMC Device进行HW Reset;

Boot Acknowledge:

如果寄存器位BOOT_ACK(EXT_CSD byte [179])被设定为1,eMMC Device会在Host触发Boot Mode的50ms内,在DAT0上发送一个"010" Boot ACK给Host。

Boot Bus配置:

EXT_CSD byte[177] BOOT_BUS_CONDITIONS寄存器用于配置在Boot Mode时,数据传输的总线状态。通过BOOT_BUS_CONDITIONS寄存器配置,在Boot Mode时,总线可以支持以下几种模式:

BOOT_BUS_CONDITIONS寄存器还可以配置退出Boot Mode后,是复位还是保留当前总线配置。如果配置为复位,那么退出Boot Mode后,总线会被复位为Backward Compatible SDR x1模式,如果配置为保留,那么退出Boot Mode后,总线会保留Boot Mode时的总线模式。

备注:

  1. BOOT_BUS_CONDITIONS寄存器为nonvolatile属性,配置内容掉电不会丢失。
  2. 如果eMMC Device没有经过Boot Mode,BOOT_BUS_CONDITIONS寄存器不会改变总线模式。
  3. 退出Boot Mode后,还可以通过HS_TIMING和BUS_WIDTH寄存器配置总线模式。

Boot Data更新:

eMMC Device在从厂商出货时,没有存储内容,也没有使能Boot Mode。使用eMMC Devcie产品需要先通过其他的方式(例如,通过USB、UART等)启动一个下载系统,将Boot Data以及其他的系统数据写入到eMMC中,同时使能Boot Mode并设定Boot Bus模式。而后,产品才能从eMMC Device上启动软件系统。

Boot Data的更新与其他数据的写入类似,更多的数据写入细节,请参考Data Transfer Mode小节。

Device Identification Mode:

如果Host没有触发Boot流程或者Boot流程完成后,eMMC Device会进入Device Identification Mode。

eMMC Device在退出Boot Mode后或者没使能Boot Mode时Power On、HW Reset或者SW Reset后,会进入Device Identification Mode的Idle State。

在Idle State下,eMMC Device会进行内部初始化,Host需要持续发送CMD1命令,查询eMMC Device是否已经完成初始化,同时进行工作电压和寻址模式协商。

Host发送的CMD1命令的参数中,包含了Host所支持的工作电压和寻址模式信息,eMMC Device在接收到这些信息后,会进行匹配。如果eMMC Devcie和Host所支持的工作电压和寻址模式不匹配,那么eMMC Device会进入Inactive State。

eMMC Device在接收到CMD1命令后,会将OCR register的内容作通过Response返回给Host,其中包含了eMMC Device是否完成初始化的标志位、设备工作电压范围Voltage Range和存储访问模式Memory Access Mode信息。

eMMC Device完成初始化后,就会进入Ready State。在该State下,Host会发送CMD2命令,获取eMMC Device的CID。

CID,即Device identification number,用于标识一个eMMC Device。它包含了eMMC Device的制造商、OEM、设备名称、设备序列号、生产年份等信息,每一个eMMC Device的CID都是唯一的,不会与其他的eMMC Device完全相同。

eMMC Device接收到CMD2后,会将127Bits的CID register的内容通过Response返回给Host。

发送完CID后,eMMC Device接着就会进入Identification State。而后,Host会发送参数包含16 Bits RCA的CMD3命令,为eMMC Device分配RCA。

设定完RCA后,eMMC Devcie就完成了Devcie Identification,进入Data Transfer Mode。

备注:
本节只描述了单个eMMC Device的Devcie Identification过程,多个eMMC的Device Identification过程与此类似,更多的细节可以参考eMMC Spec。

Voltage Range:

eMMC Device支持3.3V和1.8V两种工作电压模式。在1.8V模式下,eMMC Device会更加的省电。

Memory Access Mode:

Memory Access Mode决定了eMMC Device在响应Host的数据读写请求时,是如何访问内部存储器的。在eMMC标准中存在两种Memory Access Mode:Byte Access Mode和Sector Access Mode。

在数据读写的Command中,Host会将读写的地址A作为Command的参数发送给eMMC Device,在Byte Access Mode下,eMMC Device将从第A个Byte开始进行读写操作,而在Sector Access Mode下,eMMC Device将会从第A个Sector开始进行读写操作,一个Sector的大小为512Bytes或者4KBytes,更大的Sector支持更大容量的存储器访问。

使用Byte Access Mode更加的灵活高效,但是由于寻址位数的限制,不能访问超过2GB的存储内容。Sector Access Mode则支持大容量存储的访问,其中512 Bytes Sector可以支持最大256GB容量的存储访问,更大容量的需求则可以使用4KBytes Sector。

RCA - Relative device Address:

RCA是在Devcie Identification过程中,由Host分配的16Bits的设备地址,主要用于Data Transfer Mode下进行通信时,选定具体要进行操作的eMMC Devcie。

Host分配的RCA通常从1开始递增,0地址作为广播地址。eMMC Devcie的RCA register保存了Host分配的RCA。

Data Transfer Mode:

eMMC Device完成Device Identification后,就会进入到Data Transfer Mode的Standby State。

在Standby State时,Host可以通过发送CMD5命令,让eMMC Devcie进入低功耗的Sleep State,而后再发送CMD5命令则可以让eMMC Device退出Sleep State。

在Standby State时,Host可以通过发送CMD7命令,让eMMC Devcie进入Transfer State,而后再发送CMD7命令则可以让eMMC Device退出Transfer State。

Read Data:

在Transfer State时,Host可以发送以下的命令,触发数据读取流程:

eMMC Device在接收到上述几个CMD时,就会进入Sending-data State。在此State下,eMMC Device会持续将数据发送给Host,直到指定数量的数据Block传输完成或者接收到Host发送的CMD12传输停止命令。eMMC Device在停止发送数据后,会返回到Transfer State。

如果Host在发送CMD18前,先发送一个设定需要读取的Block Count的CMD23。eMMC Device在完成指定Block Count的数据发送后,就自动结束数据传输,不需要Host主动发送停止命令CMD12。

如果Host没有发送设定需要读取的Block Count的Command,发送Multiple Block Read的Command后,eMMC Device会持续发送数据,直到Host发送Stop Command停止数据传输。

NOTE:如果在发送CMD18前,先发送CMD23设定需要读取的Block Count,那么eMMC Device会在发送完指定数量的Block后,自动停止发送数据。

Write Data:

在Transfer State时,Host可以发送以下的命令,触发数据写入流程:

NOTE:CID寄存器值通常是只能写一次,由厂家在生产时确定并写入CSD寄存器值的部分位则可以多次改写。

eMMC Device在接收到上述几个CMD时,就会进入Receive-data State,在此State下,eMMC Devcie会持续从Host接收数据,并存储到内部的Buffer或者寄存器中。

如果Host在发送CMD25前,先发送一个设定需要写入的Block Count的CMD23。eMMC Device在完成指定Block Count的数据接收后,就自动结束数据传输,不需要Host主动发送停止命令CMD12。

如果Host没有发送设定需要写入的Block Count的Command,发送Multiple Block Write的Command后,eMMC Device会持续接收数据,直到Host发送Stop Command停止数据传输。

eMMC Device在开始进行写入操作时,会先将接收到的数据存储在内部Buffer中,然后在后台将Buffer中的数据写入到Flash中。通常情况下,Host发送数据的速度会比eMMC写入Flash的速度快,所以内部的Buffer会出现写满的状态,此时eMMC Devcie会将DAT0信号线拉低作为Busy信号。Host收到Busy信号后,就会暂停发送数据,等到eMMC Device将Buffer中的数据处完一部分并解除Busy信号后,再重新发送数据。

当eMMC Device完成数据接收后,就会进入到Programming State,将内部Buffer中剩余未写入的数据写入到Flash中。在该State下,eMMC Device会持续将DAT0拉低,作为Busy信号。如果在完成写入前,有收到新的写入命令,那么eMMC Device会立刻退回到Receive-data State,进行数据接收;如果在完成写入前,没有收到新的写入命令,则会在完成写入后,退回到Transfer State。

如果eMMC Devcie在Programming State时,还没有完成写入操作,就收到参数不等于自身RCA的CMD7命令,那么eMMC Device会进入到Disconnect State。在该State下,eMMC Device会继续进行写入操作,写入完成后则进入到Stand-by State。

如果eMMC Device在Disconnect State时,还没有完成写入操作,就收到参数等于自身RCA的 CMD7命令,那么eMMC Devcie会从新回到Programming State。

Packed Commands - Packed Write and Packed Read:

在实际应用场景中,通常会对eMMC Device有很多随机数据读取和写入操作,这些随机读写的目标地址往往都不是连续的,每一个随机读写都需要通过一个独立的读写流程来实现。

在eMMC4.5及以后的标准中,引入了Packed Commands机制,将多个地址不连续的数据写入请求封装到一个Multiple Block Write流程中,同时将多个地址不连续的数据读取请求封装的一个Multiple Block Read流程中,以此减少读写请求数量,提高数据读写的效率。

Packed Write:

发起Packed Write流程时,首先Host端会需要发送packed flag置1的CMD23 SET_BLOCK_COUNT命令。其中,CMD23中的Block Count参数为Packed Command Header和实际写入的数据所占Block的总数。

然后Host再发送CMD25命令给eMMC Device,开始进行多个Block的数据写入。其中第1个(或者前8个)Block数据为Packed Command Header,它包含了各个写请求写入数据的起始地址和长度等信息。

eMMC Devcie在接收到数据后,会根据Packed Command Header的信息,将数据写入到指定的位置。

Packed Read:

发起Packed Read流程时,首先Host端会需要发送packed flag置1的CMD23 SET_BLOCK_COUNT 命令。其中,CMD23中的Block Count参数为 Packed Command Header所占Block的数量。

然后Host再发送CMD25命令给eMMC Device,开始进行1个(或者8个)Block的Packed Command Header数据发送。Packed Command Header包含了各个读请求读取数据的起始地址和长度等信息。

发送完Packed Command Header后,Host会再发送一个packed flag置1的CMD23 SET_BLOCK_COUNT命令。其中,CMD23中的Block Count参数为待读取数据的Block的数量。

紧接着,Host再发送CMD18命令,开始进行多个Block的数据读取。eMMC Devcie会解析接收到的Packed Command Header,
然后将指定的数据发送给Host端。

NOTE:Host也可以不发送第二个CMD23命令,在这种情况下,Host需要主动发送Stop命令,通知eMMC Device停止数据发送。

Packed Command Header:

Packed Command Header的格式如上图所示,其中CMD23_ARG_x指示了各个请求数据读取或者写入的Block数,CMDxx_ARG_x(CMD18或者CMD25)则指示了各个请求数据读取或者写入的起始位置。

当DATA_SECTOR_SIZE[61] = 0x00时,即Data Sector Size为512 Bytes时,Packed Command Header占1个Block大小,当DATA_SECTOR_SIZE[61] = 0x01时,即Data Sector Size为4KBytes时,Packed Command Header占8个Block大小。

NOTE:Packed Command的错误处理流程,请参考eMMC Spec文档中的描述,此处不再详细介绍。

数据擦除:

eMMC标准提供了几种主动擦除数据的方法,以满足不同的场景需求。

Erase:

Erase操作以Erase Group为单位进行一个或者多个Group的数据擦除,一个Erase Group由一个或者多个Write Block组成。

eMMC Device在执行Erase操作时,通常并不会进行实际物理数据的擦除,只是将待擦除的Erase Group中的Block从地址空间中unmap,然后从后台的空闲Block中选择已经完成物理擦除的Block,重新map到该地址空间中,然后告知Host端已完成Erase操作。实际物理擦除操作则在后台选择合适的时机进行。

这样的逻辑可以减少Host执行Erase操作的等待时间,提高eMMC Devcie的响应速度。

发起Erase流程时,首先Host会发送参数为待擦除Erase Group起始地址的CMD23 SET_BLOCK_COUNT命令。

参考资料:

1.Embedded Multi-Media Card (e•MMC) Electrical Standard (5.1) [PDF]

本文转自:蜗窝科技

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值