| ||
EMMC芯片同SSD主控一样,同属于存储芯片种类,但因接口频率在HS400模式下也只有200MHZ,其数据传输频率理论值也只有400MB.相比采用PCIE做接口的SSD,速率差异是极其巨大,也因为此,其结构相对SSD主控也更为简单。 其结构如下:
主要分为front end(主要为IP,例如,Arasan公司的EMMC 5.1 IP,虽然可以自行设计该模块,但为了开发进度,及适配性,基本会采用购买IP的形式)、dbuf(用于存放缓存数据及地址映射表)、cpu(采用arm R系列或者RISCV,基本是单核,不需要太高的性能)、backend(负责与NAND FLASH芯片对接)。
Frontend 一般是个IP模块,其主要接口为EMMC协议接口、sram缓存接口、AHB master/slave接口。内部功能大致为cmd解析模块、cmdq模块(用于存放多个cmd)、FSM、 resp应答模块、tx_rx数据接收发送模块,DMA模块等。
Dbuf模块主要涉及到多个master的arbiter设计,及sram,相对较为简单,如果像SSD主控需要支持DDR缓存,那就更复杂了。
CPU,这没啥可说的,找一个性能够用的就行了。
Backend,该模块一般会包括随机数生成模块、LDPC编解码、BCH编解码、NandFlash 接口控制模块、dma等模块。
EMMC整体的数据流程,写操作:host 发送数据到frontend,先存放在frontend的缓存中,然后产生中断(或者CPU polling),通知CPU有数据需要处理;CPU通过AHB去读取frontend的寄存器,确认数据的长度,地址等信息。然后再配置frontend的dma,让frontend的dma将数据搬到dbuf中,之后进行地址映射l2p,将逻辑地址转换成物理地址;并通知backend 的dma从dbuf中去读取数据,依次经过数据随机化(为了Nand flash 读取时的电荷平衡,提高精确性,延长寿命)-LDPC编码-BCH编码,最后将数据写入Nand Flash。
读操作也是同样的过程,不过,数据方向不一样。也是host发送读请求到frontend,产生中断提醒CPU去读取frontend寄存器。获悉要读取的数据地址及长度,经过l2p解析,产生控制命令及物理地址,要求backend读取指定物理地址的数据送入buffer。数据从Nand Flash接口经过LDPC解码-去数据随机化,还原成原始数据,再将原始数据送入dbuf。完成之后,CPU再通知frontend的dma将dbuf数据(搬入到frontend的缓存中)逐步的发送给host。
EMMC 5.1协议:https://www.doc88.com/p-33573167852277.html
EMMC 5.1 协议,规定的比较灵活,但正因为灵活,有时候反而会带来理解的障碍。比如说上电复位之后,它应该先做什么?在协议正文,大家都很容易理解中断模式,数据传输模式,非活动模式。但对于boot模式,设备识别模式却有点理不清。这两个谁先谁后都各有各的道理。比如,上电之后直接进入boot模式,将host CPU需要的boot数据从NandFlash读入到host的缓存中,再启动设备识别模式,来识别其他的EMMC slave。或者先进入设别识别模式,再进入boot模式。对于手机、平板等嵌入式设备,基本上只有一块EMMC。谁见过有多块EMMC slave的可以指正一下。对于设备识别模式来说,里面识别多设备的过程其实意义不大,本身只有一块EMMC slave,但也不能没有。对于boot模式来说,由于上电完成,拉低cmd线超过74cycle即可进入该模式,进行boot数据的读取。但这里有个问题,那就是boot数据从哪个区开始,读取的数据量有多大,这些是需要进行寄存器设定才能搞定的事情。EMMC协议标准允许寄存器是可烧录的,可写之后掉电保持的。那么如果想要EMMC上电之后即可进入boot模式读取数据,那么是需要EMMC slave支持寄存器EFUSE的,烧写寄存器的过程应该在生产的时候进行。对于不支持寄存器EFUSE的EMMC设备,上电后是不能直接进入boot模式的。这或许是EMMC协议增加了一个增强型进入boot模式的原因?实际上,一种通用or可行的启动过程是这样的:EMMC上电之后,host发送CMD0,让EMMC处于IDLE状态,再发送CMD1,让EMMC自身的CPU完成初始化(包括配置EMMC的各项寄存器),之后,再发送CMD0,进入boot模式,开始从NandFlash读取host所需的boot数据。当host CPU完成boot过程之后,EMMC即可进入数据传输模式。
设备识别模式有关如何逐个识别每一个slave的实现方式,官方文档上写的是采用线与的方式,该方法可能会令人产生困惑。这里简单解释一下,其实线与逻辑用于识别slave的特性在I2C识别slave时同样用到了。数字芯片线与逻辑一般是采用开漏接口,漏极接上拉电阻,不清楚结构的可自行bing。该结构的特性,在多个开漏结构连接在一起的时候,只要有一个mos管的栅极打开,那么这个节点的点位都永远是0。只有当所有mos管的栅极关闭,那么该节点电压才是1。假设现在有一个host,三个EMMC slave。当host发送CMD1之后,根据EMMC协议,所有的EMMC Slave必须在同一个时钟周期内回复数据,且回复数据的时候也在不断检查CMD线上的值是否是自己发出的,当回复的数据中出现0时,即将mos管打开,那么该slave会检查到其数据与自己发出的相同,而其他slave此时回复的数据是0的,它的mos管是关闭的,但同样被拉低了。这样它检测到数据不一致,就自行中断数据传输,进入非活动模式。这样,逐步比较,排除电压不兼容的EMMC设备。当host发送CMD2,也是利用线与的这个逻辑来逐个淘汰设备,其实这种识别slave的方式,应该叫做低位优先识别,只要发送的数据谁先出现0,谁就优先被host识别出来。