Linux SD卡驱动开发(一) —— SD 相关基础概念

Linux SD卡驱动开发(二) —— SD 卡驱动分析HOST篇

Linux SD卡驱动开发(三) —— SD 卡驱动分析CORE篇

Linux SD卡驱动开发(四) —— SD 控制器之真正的硬件操作

Linux SD卡驱动开发(五) —— SD 卡驱动分析Core补充篇

Linux SD卡驱动开发(六) —— SD卡启动过程总体分析

一.SD/MMC卡基础概念

1.1.什么是MMC卡

MMC:MMC就是MultiMediaCard的缩写,即多媒体卡。它是一种非易失性存储器件,体积小巧(24mm*32mm*1.4mm),容量大,耗电量低,传输速度快,广泛应用于消费类电子产品中。

1.2.什么是SD卡

SD:SD卡为Secure Digital Memory Card, 即安全数码卡。它在MMC的基础上发展而来,增加了两个主要特色:SD卡强调数据的安全安全,可以设定所储存的使用权限,防止数据被他人复制;另外一个特色就是传输速度比2.11版的MMC卡快。在数据传输和物理规范上,SD卡(24mm*32mm*2.1mm,比 MMC卡更厚一点),向前兼容了MMC卡.所有支持SD卡的设备也支持MMC卡。SD卡和2.11版的MMC卡完全兼容。

1.3.什么是SDIO

SDIO:SDIO是在SD标准上定义了一种外设接口,它和SD卡规范间的一个重要区别是增加了低速标准。在SDIO卡只需要SPI和1位SD传输模式。低速卡的目标应用是以最小的硬件开销支持低速IO能力。

1.4.什么是MCI

MCI:MCI是Multimedia Card Interface的简称,即多媒体卡接口。上述的MMC,SD,SDI卡定义的接口都属于MCI接口。MCI这个术语在驱动程序中经常使用,很多文件,函数名字都包括”mci”.

1.5.MMC/SD/SDIO卡的区别

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资源

以Exynos4412开发板为例,其SD卡硬件原理图如下:

图中可以看到,SD卡设备的连接方式就是SDIO总线的驱动方式,这里使用EINT7作为NCD的控制器,当SD卡设备插入/取出时均会中断响应。

三、 SD协议概要

1、 总线接口

按照SD卡的协议的描述可分为2种总线的接口

SD BUS

物理层定义:

D0-D3 数据传送

CMD 进行CMD 和Respons

CLK 大家最熟悉的HOST时钟信号线了

VDD VSS 电源和地

SPI BUS

一般用SPI协议的接口来做

物理层定义:

CLK HOST时钟信号线了

DATAIN HOST-àSD Card数据信号线

DATAOUT SD Card àHOST数据信号线

2、请求处理流程

根据协议,MMC/SD卡的驱动被分为:卡识别阶段和数据传输阶段。

在卡识别阶段通过命令使MMC/SD处于:空闲(idle)、准备(ready)、识别(ident)、等待(stby)、不活动(ina)几种不同的状态;

而在数据传输阶段通过命令使MMC/SD处于:发送(data)、传输(tran)、接收(rcv)、程序(prg)、断开连接(dis)几种不同的状态。

所以可以总结MMC/SD在工作的整个过程中分为两个阶段和十种状态。下面使用图形来描述一下在两个阶段中这十种状态之间的转换关系。

a -- 卡识别阶段

b -- 数据传输阶段

四、 MMC/SD设备驱动在Linux中的结构层次

在Linux中MMC/SD卡的记忆体都当作块设备。MMC/SD设备驱动代码在linux-2.6.38.2\drivers\mmc  分别有card、core和host三个文件夹,

card层    要把操作的数据以块设备的处理方式写到记忆体上或从记忆体上读取;

core层    则是将数据以何种格式,何种方式在 MMC/SD主机控制器与MMC/SD卡的记 忆体(即块设备)之间进行传递,这种格式、方式被称之为规范或协议,

host层   下的代码就是你要动手实现的具体MMC/SD设备驱动了,包括RAM芯片中的 SDI控制器(支持对MMC/SD卡的控制,俗称MMC/SD主机控制器)和SDI控制器与MMC/SD卡的硬件接口电路。

那么,card、core和host这三层的关系,我们用一幅图来进行描述,图如下:

从这幅图中的关系可以看出,整个MMC/SD模块中最重要的部分是Core核心层,他提供了一系列的接口函数,对上提供了将主机驱动注册到系统,给应用程序提供设备访问接口,对下提供了对主机控制器控制的方法及块设备请求的支持。对于主机控制器的操作就是对相关寄存器进行读写,而对于MMC/SD设备的请求处理则比较复杂。

Linux SD卡驱动开发相关推荐

  1. Linux SD卡驱动开发(五) —— SD 卡驱动分析Core补充篇

    Core层中有两个重要函数 mmc_alloc_host 用于构造host,前面已经学习过,这里不再阐述:另一个就是 mmc_add_host,用于注册host 前面探测函数s3cmci_probe, ...

  2. Linux SD卡驱动开发(二) —— SD 卡驱动分析HOST篇

    回顾一下前面的知识,MMC 子系统范围三个部分: HOST 部分是针对不同主机的驱动程序,这一部是驱动程序工程师需要根据自己的特点平台来完成的. CORE 部分: 这是整个MMC 的核心存,这部分完成 ...

  3. Linux SD卡驱动开发(六) —— SD卡启动过程总体分析

    一.工作流程 mmc驱动主要文件包括 drivers/mmc/card/block.c drivers/mmc/card/queue.c drivers/mmc/core/core.c drivers ...

  4. Linux SD卡驱动开发(四) —— SD 控制器之真正的硬件操作

    前面对SD卡控制器有了一个基本的介绍.其实SD控制器层更过的意义是为core层提供一种操作SD卡硬件的一种方法,当然不同的控制器对硬件控制的方法不尽相同,但是他们最终都能像core层提交一个统一的封装 ...

  5. linux sd卡驱动教程,Linux SD卡驱动开发(四) —— SD 控制器之真正的硬件操作

    前面对SD卡控制器有了一个基本的介绍.其实SD控制器层更过的意义是为core层提供一种操作SD卡硬件的一种方法,当然不同的控制器对硬件控制的方法不尽相同,但是他们最终都能像core层提交一个统一的封装 ...

  6. 【SD卡】关于DJYOS下SD卡驱动开发详解

    关于DJYOS下SD卡驱动开发详解 王建忠 2011/6/21 1      开发环境及说明 硬件平台:tq2440(CPU: s3c2440) 操作系统:DJYOS1.0.0 1.1    说明 T ...

  7. Linux SD卡驱动

    二.MMC/SD介绍及SDI主机控制器 首先我们来理清几个概念: MMC:(Multi Media Card)由西门子公司和首推CF的SanDisk于1997年推出的多媒体记忆卡标准. SD:(Sec ...

  8. CE下基于Zylonite硬件平台的SD卡驱动开发

    摘要:本文结合实际项目(一款以WINCE为操作系统内核的GSM/PHS双模智能手机)对嵌入式系统Windows CE5.0的底层驱动(SD卡)的架构进行了分析和研究,以MARVELL公司提供的基于IN ...

  9. wince下SD卡驱动开发

    WinCE 5.0下面SD卡驱动的开发.这是我做的第一个项目,当时做这个项目花费了相当的时间和精力,搞的我精疲力尽.几乎可以说当时对WinCE一点都不懂.也不知道从何处下手,就东看西看.东改西改,改的 ...

  10. linux sd卡驱动视频,详解linux 驱动编写(sd卡驱动)

    随着sd卡的流行,sd卡在嵌入式设备上使用的场景也越来越多.那下面我们可以看一下,linux驱动框架上是怎么处理sd卡驱动的? 1.代码目录地址 drivers/mmc 2.基本结构 从mmc的代码结 ...

最新文章

  1. Python类与对象
  2. 美国俄克拉荷马大学秦玮课题组招聘启事
  3. exit语句php,php or die() 语句,exit()
  4. python如何次传参给线程_python如何给线程中的函数传参?
  5. rust大油井频率怎么用_数据量大怎么搞?当然是用这个了!
  6. python--12、索引知识
  7. DL之R-CNN:R-CNN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  8. 工具类的方法怎么引用_Java实用工具类:File工具类方法学习,可创建目录及文件...
  9. 让计算机启动更快的十五招
  10. Centos7开放及查看端口
  11. piv图像处理文献综述_图像处理文献综述
  12. AT指令:AT+CPMS
  13. 计算机与电视如何通过网络连接,怎么设置电脑和电视共用一根网线上网
  14. 这个行业一半人月薪超过8千!
  15. 宝宝树全自动引流脚本软件高质量活跃粉丝
  16. 一个pdf怎么分成两个文件?怎样将一个pdf文件分成几个pdf文件或若干个?
  17. 一个大数据工程师的日常工作内容都是什么?
  18. 成功解决 word2019设置背景色为护眼的绿色
  19. 写给程序员的管理入门课程 -《格鲁夫给经理人的第一课》
  20. wordpress文章页面添加版权信息的四种方法

热门文章

  1. C语言运算符优先级列表(超全)
  2. 马尔可夫链预测模型的应用——以预测降雨量为例
  3. 学plc还是学java_要学PLC想走PLC工程师之路的看看
  4. Python网络爬虫数据采集实战:基础知识
  5. Matlab对圆环进行N等分
  6. CATIA软件基础操作及知识工程
  7. Arduino: AD模数转换详解和电路搭建以及示例代码
  8. 傅里叶变换的矩阵分析
  9. 如何将Flask项目部署在Ubuntu系统的阿里云主机中(详细完整版:下)
  10. 别人的底鼓/808为什么比你有力?你可能忘了用这个插件