LINUX MMC子系统分析之一 概述

时间秒杀一切 提交于 2020-03-07 19:51:39

 从本章开始,我们分析mmc子系统,其也遵循LINUX设备-总线-驱动模型,并基于自身的特点进行了相应的抽象。针对本专题,我们主要涉及如下几个章节:

一、MMC子系统概述;

二、MMC子系统驱动模型分析(包括总线、设备、驱动);

三、MMC总线分析

四、MMC host分析

五、MMC driver分析

六、MMC card添加流程分析

七、MMC block分析

 

     本篇为此系列的起始,主要对MMC子系统进行一个简要的概述说明。针对MMC来说,主要包括几个部分:MMC控制器、MMC总线、card。针对卡而言,包括MMC卡(7pin,支持MMC和spi两种通信模式)、SD卡(9pin,支持sd和spi两种通信模式)、TF卡(8pin,支持sd和spi两种通信模式),针对MMC、SD而言,其总线规范类似,都是从MMC总线规范演化过来的。

   另外上面所说的均是针对存储卡而言,而基于MMC这种通信方式,又演化了SDIO,SDIO强调的是IO,与MMC/SD的区别主要是连接的设备,其不再仅仅是存储卡,可以链接任何支持SDIO的外设(包括蓝牙设备、wifi设备等)。其实SDIO的实现则和我们之前分析的IIC、SPI总线类型,通过SDIO可以连接各种类型的设备(wifi、bluetooth、uart、gps、esata等)

CPU、MMC之间的硬件关联图

 

   CPU、MMC controller、存储设备之间的关联如下图所示,主要包括了MMC controller、总线、存储卡等内容的连接,针对控制器与设备的总线连接,主要包括时钟、数据、命令三种类型的引脚,而这些引脚中的cd引脚主要用于卡的在位检测,当mmc controller检测到该位的变化后,则会进行mmc card的注册或注销操作。

 

在MMC子系统中,主要包含MMC总线、SDIO总线两个部分,其中MMC部分则主要用于适配MMC卡、SD卡、TF卡等存储设备,而SDIO部分则主要用于实现针对SDIO接口连接的设备(wifi、bluetooth、uart、gps、esata等)

 

MMC驱动模型概述

 

    MMC驱动模型也是基于实际的硬件连接进行抽象的,其实该mmc驱动模型的抽象和iic、spi模型类似,下面我们来看下具体的抽象说明。

  1. 针对mmc controller,该子系统抽象为mmc_host,用于描述一个mmc controller;
  2. 针对mmc、sd、tf卡,该子系统抽象为mmc_card,用于描述卡信息;
  3. 针对通信总线,抽象出mmc_bus;
  4. 针对mmc、sd、tf,mmc子系统完成了统一的mmc driver,针对mmc总线规范以及SD规范,其已经详细的定义了一个存储卡的通信方式、通信命令,因此LINUXmmc子系统定义了mmc driver,用于和mmc、sd、tf等卡的通信,而不需要驱动开发人员来开发卡驱动。

 

而针对这四者之间的关系,以及这四者是如何借助LINUX设备-总线-驱动模型实现关联的,可从如下图中找到对应的关联。

 

 

该模型的实现和spi模型是类似的,其中mmc host不添加至mmc bus中,另外和iic、spi不同的是:

  1. mmc总线模型中只注册一个驱动类型,即mmc driver(该驱动适配所有的mmc card);
  2. 一个mmc host与一个mmc card绑定;
  3. Mmc card属于热插拔的设备,而mmc card的创建主要由mmc host负责探测与创建,mmc host根据卡在位检测引脚,当检测到mmc card的存在后,即创建mmc card,同时注册至mmc bus上,并完成与mmc driver的绑定操作。

 

 

SDIO驱动模型概述

sdio总线驱动模型和mmc类型,结构体上的区别为其driver类型为sdio_driver,并增加了sdio_func结构体变量(该结构体包含了该sdio设备相关的厂商id、设备id,同时包含了mmc_card),与mmc总线驱动模型的区别为:

  1. 因sdio主要突出接口概念,其设备端可以连接wifi、gps等设备,因此其外设备驱动需要由驱动工程师自己实现,sdio驱动模块不提供对应的驱动。

 

MMC块设备

       因mmc_card一般均是存储设备,因此针对该设备的访问即需要借助LINUX内核的块设备模型,因此mmc子系统也必须要实现块设备驱动,借助该块设备驱动模型,将mmc card与vfs完成了关联,即可通过系统调用借助VFS模型实现对块设备的读写访问操作。

 

MMC子系统的目录说明

针对mmc子系统,在代码实现上主要包括mmc core、mmc block、 mmc host这三个模块,其中mmc host主要是针对mmc controller的驱动;mmc block主要用于实现mmc block驱动以及mmc driver;而mmc core主要包括mmc 总线、sdio总线的实现、mmc device、mmc driver的注册接口、mmc host与mmc card的注册与注销接口等内容。

 

本章主要对mmc子系统进行概述,所涉及的内容也是浅尝辄止,主要是对mmc子系统有一个感性的概念。从下章开始进行具体实现的分析工作。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!