emmc总线
这个emmc有11根通讯总线:
cmd:命令线是双向信号。主机和设备驱动程序以两种模式运行,有开漏和推挽二种模式。
DAT0-7:数据线是双向信号,主机和设备驱动都是在推挽模式下(data0默认为拉高的状态)
CLK:clk是主机向设备发送的信号,clock操作在推挽模式下
数据 选通: 数据选通是设备给主机的信号,数据选通操作在推挽模式
emmc的擦写次数是有限的,一般使用久了速度会变慢,是因为emmc内部数据处理变慢了,我们可以从寄存器中获知,状态寄存器data0一直为0,即data0一直为拉低的状态,data0一直是busy的状态,就会出现传输数据(一般是写超时)超时,这个是因为emmc老化导致内部处理的数据变慢,一直在处理数据,不让主机在往里面写。
emmc传输数据是并行方式,是采用半双工模式,最快的是8根数据线同时传输。
MMC前面加了个embedded,主要就是为了突出现在这个设备是embedded 在电路板上。eMMC 和 MMC一样,沿用了 8 bit 的并行接口。在传输速率不高的时代,这个接口够用了。但随着设备对接口的带宽要求越来越高,想把并行接口速率提高也越来越难。eMMC 的最新 5.1标准理论最高值最高可以达到400 MB/s,再往上提高频率也不是不行,但就未必划算了。
emmc的擦写次数是有限的,一般闪存分为三种类型:TLC,MLC,SLC。TLC的擦写次数约都为500~1000次,寿命和速度都不行;MLC的擦写次数是1W次,SLC最好了为10W次。
擦写次数:将emmc等闪存颗粒完全写满后,全部删除才算一次擦写。
Figure 2 — Multiple-block read operation
总线协议
MMC命令是面向块的命令:这些命令发送一个数据块通过一个CRC比特校验。读写操作都允许单个或多个块传输。一个多
块的停止命令在CMD线后面,比如顺序读需要停止就可以在cmd线发一个停止命令cmd12。
这个按照块(block)写的操作使用一个简单的忙信号,在写的过程中使用data0作为忙信号,即往emmc内部写数据时,就将data00信号线拉低(默认为高)作为写数据忙信号,emmc会阻塞主机的io request(这个指的是往emmc内部写数据的io request),主机收到这个忙信号就不能再往emmc写数据。当data0恢复默认的拉高状态时,即emmc内部处理数据完成,现在是空闲的状态,对主机的写数据IO操作可以响应。如果emmc内部老化,内部数据处理较慢,data0就会一直是busy状态,出现传输数据超时,我们直观的感受就是手机比较卡。
以下这段参阅:http://blog.csdn.net/joychanger/article/details/42100883
eMMC block i/o的繁忙程度,百分比的统计是统计在固定间隔时间内有多久是在持续做I/O request,有多久是空闲的。如果达到99%,那就说明eMMC block i/o这段时间内完全没有空闲,一直在做读写数据的操作,这时候很容易发生由于blocki/o瓶颈导致的上层APP要访问i/o时可能等待时间较久的问题。block i/o如果performance不佳,在同时有多个thread需要对i/o进行读写时,就可能发生短时间内的卡顿或等待。
emmc总线数据传输是由命令,响应,和数据块结构组成一个以token为单位的,一个数据传输是一个总线操作,总线操作总是包括一个命令和一个响应,另外,一些操作还可能有数据token.
e•MMC bus data transfers are composed of command, response, and data block structure tokens. One
data transfer is a bus operation. Operations always contain a command and a response token. In addition,
some operations have a data token。
命令token如下所示:
Command tokens have the following coding scheme:
响应token如下所示:
Response tokens have five coding schemes depending on their content. The token length is either 48 or
136 bits.
数据token如下所示:
data token have the following coding scheme