- 前言
- 一、MMC子系统介绍
- 1.1 基本概念
- 1.2 mmc规范简介
- 1.2.1 卡的规范
- 1.2.2 总线的规范
- 1.2.3 控制器的规范
- 二、mmc代码分布
- 三、mmc子系统框架
- 四、SD总线协议
- commands
- card register
- response
- 五、初始化流程
- 总结
前言
本文主要是分析Linux系统中mmc子系统的框架和实现。在linux中,kernel使用MMC subsystem统一管理MMC、SD、SDIO等设备。
一、MMC子系统介绍 1.1 基本概念
MMC是MultiMediaCard的简称,从本质上看,它是一种用于固态非易失性存储的内存卡(memory card)规范[1],定义了诸如卡的形态、尺寸、容量、电气信号、和主机之间的通信协议等方方面面的内容。
从1997年MMC规范发布至今,基于不同的考量(物理尺寸、电压范围、管脚数量、最大容量、数据位宽、clock频率、安全特性、是否支持SPI mode、是否支持DDR mode、等等),进化出了MMC、SD、microSD、SDIO、eMMC等不同的规范(如下面图片1所示)。虽然乱花迷人,其本质终究还是一样的,丝毫未变,这就是Linux kernel将它们统称为MMC的原因。
MMC、SD、SDIO的技术本质是一样的(使用相同的总线规范,等等),都是从MMC规范演化而来;
MMC强调的是多媒体存储(MM,MultiMedia);
SD强调的是安全和数据保护(S,Secure);
SDIO是从SD演化出来的,强调的是接口(IO,Input/Output),不再关注另一端的具体形态(可以是WIFI设备、Bluetooth设备、GPS等等)。
MMC分别从卡(Card Concept)、总线(Bus Concept)以及控制器(Host Controller)三个方面,定义MMC system的行为。
1.2.1 卡的规范卡的规范主要是规定卡的形状、物理尺寸、管脚、内部block组成,寄存器等。下图是eMMC的示例图:
卡的内部由以下几个block组成:
Memory core,存储介质,一般是NAND flash、NOR flash等。
Memory core interface,管理存储介质的接口,用于访问(读、写、擦除)存储介质。
Card interface(cmd、clk、data),总线接口,外界访问卡内部存储介质的接口,和具体的管脚有关。
Card interface controller,用于访问内部存储介质。
Power模块,提供reset、上电检测等功能。
寄存器,用于提供卡的信息、参数、访问控制等功能。
卡的管脚有Vdd、GND、RST 、CLK、CMD和DATA等,Vdd和GND提供power,RST用于复位,CLK、CMD、DATA为MMC总线协议的物理通道:
CLK一条线,提供同步时钟,可以在CLK的上升沿、下降沿、上升沿河下降沿采集数据;
CMD一条线,用于传输双向的命令。
DATA 1条(1bit)、4条(4bit)、8条(8bit),用于传输双向的数据。
drivers/mmc/card 存放卡设备相关的驱动,如MMC/SD卡设备等。
drivers/mmc/host 针对不同主机端的SDHC、MMC控制器的驱动。
drivers/mmc/core mmc子系统的核心层,完成了不同协议和规范的实现,为HOST层和设备驱动层提供了接口。
三、mmc子系统框架mmc子系统款家图
四、SD总线协议SD总线通信是基于指令和数据比特流,起始位和停止位结束。SD总线通信有三个元素:
command:由host发送到卡设备,使用cmd线发送
response:从card端发送到host端,是对接收到的cmd的回应,也通过cmd线发送;
data:可以从host到card,也可以从card到host,通过data线传输。
四种用于控制卡设备的指令类型,每个command占48bit
1、broadcast commands(bc),no response 广播类型指令,不需要响应;
2、broadcast commands with response(bcr):需要响应的广播类型指令;
3、addressed(pint-to-point) commands(ac):由HOST发送到指定的卡设备,没有数据的传输;
4、address(point-to-point) data transfercommands(adtc):由HOST发送数据到指定卡设备;
主要的寄存器:OCR、CID、CSD、RCA、SCR:
operation condition register(OCR) 32位的OCR包含卡设备支持的工作电压列表;
card identification number register(CID) 用于卡识别的卡信息,包括制造商ID,产品名等;
relative card address regisger(RCA) 存放在卡识别阶段分配的卡地址,缺省地址为0000h;
SD card configuration register(SCR) 配置寄存器,用于配置SD memory的特殊功能;
所有的response都经过cmd线发送给HOST端,R4和R5响应是SDIO中特有的
1、R1(normal response command) 用来响应常用指令;
2、R2(CID/CSD register) 用来响应CMD2、CMD10、CMD9,并把CID和CSD寄存器作为响应数据;
3、R3(OCR register) 响应ACMD41指令,并把OCR寄存器作为响应数据;
4、R4(CMD5) 响应CMD5,把OCR寄存器作为响应数据
5、R5(CMD52) CMD52是一个读写寄存器的指令,R5用于返回寄存器数据;
6、R6(pulished RCA response) 分配卡地址的响应;
7、R7(card interface condition) 响应CMD8,返回卡支持的电压信息;
此处初始化流程以emmc设备为例。
Linux内核版本:4.9.37
提示:这里对文章进行总结:



