MMC/SD/SDIO介绍

作者:wowo 发布于:2016-12-25 21:52

分类:基础技术

1. 前言

熟悉Linux kernel的人都知道,kernel使用MMC subsystem统一管理MMC、SD、SDIO等设备,为什么呢?到底什么是MMC?SD和SDIO又是什么?为什么可以用MMC统称呢?

在分析Linux kernel的MMC subsystem之前,有必要先介绍一些概念,以便对MMC/SD/SDIO有一个大致的了解,这就是本文的目的。

2. 基本概念

MMC是MultiMediaCard的简称,从本质上看,它是一种用于固态非易失性存储的内存卡(memory card)规范[1],定义了诸如卡的形态、尺寸、容量、电气信号、和主机之间的通信协议等方方面面的内容。

从1997年MMC规范发布至今,基于不同的考量(物理尺寸、电压范围、管脚数量、最大容量、数据位宽、clock频率、安全特性、是否支持SPI mode、是否支持DDR mode、等等),进化出了MMC、SD、microSD、SDIO、eMMC等不同的规范(如下面图片1所示)。虽然乱花迷人,其本质终究还是一样的,丝毫未变,这就是Linux kernel将它们统称为MMC的原因。

图片1 MMC/SD/SDIO evolution

关于该图片,这里强调几点(其它的,大家可参考[1][2],不再详细介绍):

MMC、SD、SDIO的技术本质是一样的(使用相同的总线规范,等等),都是从MMC规范演化而来;

MMC强调的是多媒体存储(MM,MultiMedia);

SD强调的是安全和数据保护(S,Secure);

SDIO是从SD演化出来的,强调的是接口(IO,Input/Output),不再关注另一端的具体形态(可以是WIFI设备、Bluetooth设备、GPS等等)。

3. 规范简介

MMC分别从卡(Card Concept)、总线(Bus Concept)以及控制器(Host Controller)三个方面,定义MMC system的行为,如下面图片2所示:

图片2 mmc_sd_sdio_hw_block

不同岗位的工程师,可以根据自己的工作性质,重点理解某一部分的规范,下面从嵌入式软件工程师的视角,简单的介绍一下。

3.1 卡的规范

卡的规范主要规定卡的形状、物理尺寸、管脚,内部block组成、寄存器等等,以eMMC为例[3]:

图片3 Card Concept(eMMC)

1)有关形状、尺寸的内容,这里不再介绍,感兴趣的同学可参考[1]。

2)卡的内部由如下几个block组成:

Memory core,存储介质,一般是NAND flash、NOR flash等;

Memory core interface,管理存储介质的接口,用于访问(读、写、擦出等操作)存储介质;

Card interface(CMD、CLK、DATA),总线接口,外界访问卡内部存储介质的接口,和具体的管脚相连;

Card interface controller,将总线接口上的协议转换为Memory core interface的形式,用于访问内部存储介质;

Power模块,提供reset、上电检测等功能;

寄存器(图片1中位于Card interface controller的左侧,那些小矩形),用于提供卡的信息、参数、访问控制等功能。

3)卡的管脚有VDD、GND、RST、CLK、CMD和DATA等,VDD和GND提供power,RST用于复位,CLK、CMD和DATA为MMC总线协议(具体可参考3.2小节)的物理通道:

CLK有一条,提供同步时钟,可以在CLK的上升沿(或者下降沿,或者上升沿和下降沿)采集数据;

CMD有一条,用于传输双向的命令。

DATA用于传说双向的数据,根据MMC的类型,可以有一条(1-bit)、四条(4-bit)或者八条(8-bit)。

4)以eMMC为例,规范定义了OCR, CID, CSD, EXT_CSD, RCA 以及DSR 6组寄存器,具体含义后面再介绍。

3.2 总线规范

前面我们提到过,MMC的本质是提供一套可以访问固态非易失性存储介质的通信协议,从产业化的角度看,这些存储介质一般集成在一个独立的外部模块中(卡、WIFI模组等),通过物理总线和CPU连接。对任何有线的通信协议来说,总线规范都是非常重要的。关于MMC总线规范,简单总结如下:

1)物理信号有CLK、CMD和DATA三类。

2)电压范围为1.65V和3.6V(参考上面图片2),根据工作电压的不同,MMC卡可以分为两类:

High Voltage MultiMediaCard,工作电压为2.7V~3.6V。

Dual Voltage MultiMediaCard,工作电压有两种,1.70V~1.95V和2.7V~3.6V,CPU可以根据需要切换。

3)数据传输的位宽(称作data bus width mode)是允许动态配置的,包括1-bit (默认)模式、4-bit模式和8-bit模式。

注1:不使用的数据线,需要保持上拉状态,这就是图片2中的DATA中标出上拉的原因。另外,由于数据线宽度是动态可配的,这要求CPU可以动态的enable/disable数据线的那些上拉电阻。

4)MMC规范定义了CLK的频率范围,包括0-20MHz、0-26MHz、0-52MHz等几种,结合数据线宽度,基本决定了MMC的访问速度。

5)总线规范定义了一种简单的、主从式的总线协议,MMC卡位从机(slave),CPU为主机(Host)。

6)协议规定了三种可以在总线上传输的信标(token):

Command,Host通过CMD线发送给Slave的,用于启动(或结束)一个操作(后面介绍);

Response,Slave通过CMD线发送给Host,用于回应Host发送的Command;

Data,Host和Slave之间通过数据线传说的数据。方向可以是Host到Slave,也可以是Slave到Host。数据线的个数可以是1、4或者8。在每一个时钟周期,每根数据线上可以传输1bit或者2bits的数据。

7)一次数据传输过程,需要涉及所有的3个信标。一次数据传输的过程也称作Bus Operation,根据场景的不同,MMC协议规定了很多类型的Bus Operation(具体可参考相应的规范)。

3.3 控制器规范

Host控制器是MMC总线规范在Host端的实现,也是Linux驱动工程师比较关注的地方,后面将会结合Linux MMC framework的有关内容,再详细介绍。

4. 总结

本文对MMC/SD/SDIO等做了一个简单的介绍,有了这些基本概念之后,在Linux kernel中编写MMC驱动将不再是一个困难的事情(因为MMC是一个协议,所有有关协议的事情,都很简单,因为协议是固定的),我们只需要如下步骤即可完成:

1)结合MMC的规范,阅读Host MMC controller的spec,理解有关的功能和操作方法。

2)根据Linux MMC framework的框架,将MMC bus有关的操作方法通过MMC controller实现。

具体可参考后续MMC framework的分析文档。

5. 参考文档

原创文章,转发请注明出处。蜗窝科技,www.wowotech.net。

评论:

111

2020-08-18 21:41

https://linux.codingbelief.com/zh/

里面有flash和内存的帖子(和这个网站上的帖子一样)

eric

2020-04-26 15:52

MMC卡位从机,MMC卡为从机

2017-01-19 08:52

请教:

https://en.wikipedia.org/wiki/MultiMediaCard

里的Comparison of technical features of MMC and SD card variants

为什么没有emmc?

2017-01-20 08:35

@jinxinxin163:emmc和mmc的本质区别,就是封装的不同(以IP的形式嵌入到CPU中),其它的都差不多,所以wikipedia没有去更新吧(我猜测的)。

maze

2018-01-16 13:59

@jinxinxin163:已经有了哦.现在

King Jin

2016-12-28 16:09

大神写的真好。

发表评论:

昵称

邮件地址 (选填)

个人主页 (选填)

传统emmc所用的sdio接口_MMC/SD/SDIO介绍相关推荐

  1. 传统emmc所用的sdio接口_SolidGear SD/SDIO/eMMC协议分析仪

    SolidGear是全球排名第一的SD/SDIO/eMMC协议分析仪测试解决方案的厂商,目前业界主流的从事SD/SDIO/eMMC接口界面开发及测试验证的厂商均有在广泛的使用SolidGear的产品, ...

  2. 关于SDIO接口的wifi和通用SD卡的一些记录

    在使用SDIO接口操作SD卡时,需要CONFIG_MMC_DW该宏,来开启dw_mmc的支持. 在注册platform_device时,指定名字为dw_mmc即可自动执行SD卡相关的初始化进程. 但是 ...

  3. SD卡及STM32的SDIO接口相关原理

    SD卡      SD卡(Secure Digital Memory Card)即:安全数码卡,它是在MMC的基础上发展而来,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用, ...

  4. STM32个人笔记-SDIO接口

    目录 SDIO接口常用设备 SD卡的总线拓扑 总线协议 SD卡数据包格式 SD命令 SD命令类型 响应 SD卡操作模式 SD卡系统(包括主机和CD卡)定义了两种操作模式:卡识别模式和数据传输模式. 卡 ...

  5. 嵌入式知识框架之六-接口与总线(SPI\I2C\ USB\PCI\PCI-E\SD\SDIO\以太网接口)

    接口是外设和主设备连接的方式/规则/协议的名称:XX总线是主设备连接某一类接口的名称 1.串口 串行数据接口标准(根据时间发展顺序介绍): RS-232:命名为EIA-232-E标准:通信距离短.速率 ...

  6. SD/SDIO/EMMC

    前言 本文对SD/SDIO/EMMC做简单介绍,目标是对其有初步的了解和认识. SD/SDIO传输模式 SD传输模式有以下3种: SPI mode(required) 1-bit mode 4-bit ...

  7. 【STM32H7】第3章 ThreadX FileX移植SDIO接口SD的基础知识

    论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=100749 第3章   ThreadX FileX移植SDIO接 ...

  8. SDIO接口(2)——SD卡寄存器

    1.SD卡寄存器 SDIO接口中定义了8个寄存器:OCR,CID,CSD,RCA,DSR,SCR,SSR(仅sdio卡支持),CSR(仅sdio卡支持). 这些寄存器只能通过对应的命令访问. 其中OC ...

  9. sdio接口_单片机基础 —— 使用SDMMC接口读写SD卡数据

    本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件SDMMC外设读取SD卡数据. 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM32L4 ...

  10. STM32的SD卡与SDIO接口

    STM32的SD卡与SDIO接口 一.SD卡的简介 1.SD卡的主要参数 2.SD卡的SDIO 模式和SPI 模式 3.SD卡寄存器 二.命令和响应 1.SD卡的操作过程   主机(单片机等)发起&q ...

最新文章

  1. python argparse库_python标准库之argparse
  2. SAP导出Excel错点拒绝处理
  3. centos7 yum下载路径
  4. 8_18 比赛总结 [暑假集训]
  5. 15拆分成3个不同的自然数_15个小时搜救破拆,他磨破3双手套营救出4个生还者...
  6. css获取到指定元素的宽度,在回调返回宽度值
  7. c# 数据结构 ---双链表
  8. 今天的练习是敏捷结果30天的最后一天
  9. python 路径规划最短距离_路径规划(最短路径)算法C#实现
  10. 解决CentOS内网机通过Windows下架设代理来访问网络
  11. Android.DebugTools.Traceview dmtracedump
  12. 三路划分快速排序 java_程序员面试—快速排序的三路划分
  13. chrome谷歌浏览器历史版本
  14. 环形电流计算公式_环形电感的计算公式
  15. 2020 CCF BDCI小学数学应用题自动解题解题思路
  16. 把华为交换机设置成(NTP)时钟源服务器
  17. 图片合成器,一键将目录中多个文件夹的图片转换为PDF
  18. 开源地图平台 Mapbender
  19. 睡眠手环APP开发上线
  20. mac pe 制作教程

热门文章

  1. 完全二叉树/ 满二叉树/二叉树遍历(前序、中序、后序、层序遍历)
  2. java resultSet获取总行数
  3. DB2 常用SQL语法
  4. Unity学习笔记(二)——Unity ML-agents安装与配置(1.9.1)
  5. 单目深度估计方法:算法梳理与代码实现
  6. 如何在 GitHub 上面精准搜索开源项目?
  7. leetcode之移除链表的元素
  8. linux上apache的安装
  9. iTOP-4418/6818开发板-QtE4.7WIFI_MT6620热点
  10. Py西游攻关之面向对象(二)