引自:LINUX SDIO的驱动架构

一、硬件知识

MMC:muti media card多媒体卡。4位或者8位带宽,52MHZ频率,从而支持50MB/s的传输速度。

SD:secure digital memery card 。在mmc的基础上发展而来,强调数据保全,可设置所存储数据权限,从而防止他人复制。

SDIO:在sd的基础上,定义了一种外设接口,增加低速标准。

 

二、内核MMC、SD驱动框架

driver/mmc目录下有三个子目录:card 、core、host,分别表示区块层、核心层、主机控制层。

区块层:

向文件系统、用户空间文件操作的接口,主要文件是card目录下的block.c,queue.c向它提供几个函数操作队列。

区块层的调用core目录下的core.c、sysfs.c提供的接口来识别存储卡的分区、读写存储卡等功能。

核心层:

核心层代码在core目录下,它封装了mmc/sd命令,实现mmc/sd协议,它调用主机控制器层的接口完成存储卡的识别、设置、读写等。

core.c文件由sd.c和mmc.c两个文件来支撑,core.c把mmc和sd卡的共性抽象出来,它们的差别由mmc.c、mmc_ops.c和sd.c、sd_ops.c区分。

sysfs.c是mmc、sd卡驱动程序的sysfs文件系统的实现。

主机控制层:

这层是架构相关的,它接受并处理核心层发送的mmc、sd命令,里面针对各款CPU提供一个文件。首先进行一些底层设置,比如设置sdio控制器

使用到的gpio管脚,使能控制器,注册中断处理函数,然后向核心层添加增加一个主机。这样,核心层就可以使用控制器层提供的接口来识别和

使用具体的sdio设备了。

三、重要的数据结构和注册流程

sdhci_host->mmc_host来描述主机控制器。作为一般规则,在模块的probe探测函数中(host/s3cmci.c的xxx_probe函数),调用mmc_alloc_host

分配一个mmc_host,初始化后,调用mmc_add_host将主机控制器的描述结构添加到内核,从而核心层可以使用主机控制器来控制和读写sdio设备。

 

 

Linux SD/MMC/SDIO驱动分析

一、SD/MMC/SDIO概念区分

SD(SecureDigital)与 MMC(MultimediaCard)

SD 是一种 flash memory card 的标准,也就是一般常见的 SD 记忆卡,而 MMC 则是较早的一种记忆卡标准,目前已经被 SD 标准所取代。在维基百科上有相当详细的 SD/MMC 规格说明:[http://zh.wikipedia.org/wiki/Secure_Digital]。

SDIO(SecureDigital I/O)

SDIO 是目前我们比较关心的技术,SDIO 故名思义,就是 SD 的 I/O 接口(interface)的意思,不过这样解释可能还有点抽像。更具体的说明,SD 本来是记忆卡的标准,但是现在也可以把 SD 拿来插上一些外围接口使用,这样的技术便是 SDIO。

所以 SDIO 本身是一种相当单纯的技术,透过 SD 的 I/O 接脚来连接外部外围,并且透过 SD 上的 I/O 数据接位与这些外围传输数据,而且 SD 协会会员也推出很完整的 SDIO stack 驱动程序,使得 SDIO 外围(我们称为 SDIO 卡)的开发与应用变得相当热门。

现在已经有非常多的手机或是手持装置都支持 SDIO 的功能(SD 标准原本就是针对 mobile device 而制定),而且许多 SDIO 外围也都被开发出来,让手机外接外围更加容易,并且开发上更有弹性(不需要内建外围)。目前常见的 SDIO 外围(SDIO 卡)有:

  · Wi-Fi card(无线网络卡) 

  · CMOS sensor card(照相模块) 

  · GPS card 

  · GSM/GPRS modem card 

  · Bluetooth card 

  ·  Radio/TV card(很好玩)

SDIO 的应用将是未来嵌入式系统最重要的接口技术之一,并且也会取代目前 GPIO 式的 SPI 接口。

SD/SDIO 的传输模式

SD 传输模式有以下 3 种:

  · SPI mode(required) 

  · 1-bit mode 

  ·  4-bit mode

SDIO 同样也支持以上 3 种传输模式。依据 SD 标准,所有的 SD(记忆卡)与 SDIO(外围)都必须支持 SPI mode,因此 SPI mode 是「required」。此外,早期的 MMC 卡(使用 SPI 传输)也能接到 SD 插糟(SD slot),并且使用 SPI mode 或 1-bit mode 来读取。

Secure digital I/Ocard,pin out

SD 的 MMCMode

SD 也能读取 MMC 内存,虽然 MMC 标准上提到,MMC 内存不见得要支持 SPI mode(但是一定要支持 1-bit mode),但是市面上能看到的 MMC 卡其实都有支持 SPI mode。因此,我们可以把 SD 设定成 SPI mode 的传输方式来读取 MMC 记忆卡。

SD 的 MMC Mode 就是用来读取 MMC 卡的一种传输模式。不过,SD 的 MMC Mode 虽然也是使用 SPI mode,但其物理特性仍是有差异的:

  · MMC 的 SPI mode 最大传输速率为 20 Mbit/s; 

  · SD 的 SPI mode 最大传输速率为 25 Mbit/s。

为避免混淆,有时也用 SPI/MMC mode 与 SPI/SD mode 的写法来做清楚区别

参考网站:https://www.sdcard.org/developers/overview/capacity/

              http://www.interfacebus.com/Secure_Digital_IO_Card_Pinout.html

 

 

 

MMC子系统介绍

MMC代码分布

MMC子系统代码主要在drivers/mmc目录下,共有三个目录:

         Card:存放闪存卡(块设备)的相关驱动,如MMC/SD卡设备驱动,SDIOUART;

         Host:针对不同主机端的SDHC、MMC控制器的驱动,这部分需要由驱动工程师来完成;

         Core:整个MMC的核心层,这部分完成不同协议和规范的实现,为host层和设备驱动层提供接口函数。

MMC子系统框架

 

Linux MMC子系统主要分成三个部分:

  MMC核心层:完成不同协议和规范的实现,为host层和设备驱动层提供接口函数。MMC核心层由三个部分组成:MMC,SD和SDIO,分别为三类设备驱动提供接口函数;

  Host 驱动层:针对不同主机端的SDHC、MMC控制器的驱动;

  Client 驱动层:针对不同客户端的设备驱动程序。如SD卡、T-flash卡、SDIO接口的GPS和wi-fi等设备驱动。

     自我总结:

     结合自己做过的项目:如g-sensor, 采用I2C通信的,client也就是g-sensor芯片有自己的驱动BMA.c ,HOST端的HD8020也有自己的驱动I2C驱动需要配置,才能通过I2C去控制g-sensor,先初始化i2c,连接到client后,时钟为host作为主控时钟,然后读取g-sensor chip id and control g-sensor;

 

 

三、SD 总线协议

SD总线通信是基于指令和数据比特流,起始位开始和停止位结束。SD总线通信有三个元素:

  Command:由host发送到卡设备,使用CMD线发送;

  Response:从card端发送到host端,作为对前一个CMD的相应,通过CMD线发送;

  Data:即能从host传输到card,也能从card传输到host,通过data线传输。

Commands

以下是四种用于控制卡设备的指令类型,每个command都是固定的48位长度:

  1、broadcast commands(bc), no response:广播类型的指令,不需要有响应;

  2、broadcast commands with response(bcr):广播类型的指令且需要响应;

  3、addressed(point-to-point) commands(ac):由HOST发送到指定的卡设备,没有数据的传输;

  4、address(point-to-point) data transfercommands(adtc):由HOST发送到指定的卡设备且伴随有数据传输。

指令格式:

Card register

几个主要的寄存器:OCR,CID,CSD,RCA和SCR。

  Operation condition register(OCR):32位的OCR包含卡设备支持的工作电压表;

  Card identification number register (CID):包含用于在卡识别阶段的卡信息,包括制造商ID,产品名等;

  Card specific data register(CSD):CSD寄存器提供了如何访问卡设备的信息,包括定义了数据格式,错误校验类型,最大访问次数,数据传输率等;

  Relative card address register(RCA):存放在卡识别阶段分配的相对卡地址,缺省相对卡地址为0000h;

  SD card configuration register(SCR):SCR是一个配置寄存器,用于配置SD memory card的特殊功能。

Response

所有的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、R6(published RCA response):分配相对卡地址的响应;

  5、R7(card interface condition):响应CMD8,返回卡支持的电压信息;

  6、R4(CMD5):响应CMD5,并把OCR寄存器作为响应数据;

  7、R5(CMD52):CMD52是一个读写寄存器的指令,R5用于CMD52的响应;

Response 格式:

***详情请参考spec***

 

 

posted on 2017-02-02 08:23  你最棒  阅读(3029)  评论(0)    收藏  举报