• 了解 linux mmc framework.

1.概述

  • MMC:(Multi Media Card)由西门子公司和首推CF的SanDisk于1997年推出的多媒体记忆卡标准。
  • SD:(Secure Digital Memory Card)由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制的新一代记忆卡标准,已完全兼容MMC标准。
  • SDIO:(Secure Digital Input and Output Card)安全数字输入输出卡。SDIO是在SD标准上定义了一种外设接口,通过SD的I/O接脚来连接外围设备,并且通过SD上的 I/O数据接位与这些外围设备进行数据传输。是目前较热门的技术,如下图中的一些设备:GPS、相机、Wi-Fi、调频广播、条形码读卡器、蓝牙等。
  • MCI:MCI是Multimedia Card Interface的简称,即多媒体卡接口。上述的MMC,SD,SDI卡定义的接口都属于MCI接口。MCI这个术语在驱动程序中经常使用,很多文件,函数名字都包括”mci”。

1.1.MMC/SD/SDIO卡的区别:

1.2.MMC 子系统

  Linux中,将包括MMC、SD、SDIO统称为MMC子系统。MMC子系统从功能上可分为三个层次:

  • HOST:针对不同主机的驱动程序,这一部分需要根据自己的特定平台来完成。
  • CORE:这是整个MMC的核心层,这部分完成了不同协议和规范的实现,并且为HOST层的驱动提供接口函数。
  • CARD:因为这些记忆卡都是块设备,当然需要提供块设备的驱动程序,这部分就是实现了将SD卡如何实现为块设备的。(这部分代码合到core目录下);

2.软件架构

MMC framework软件架构如下面所示:

  MMC framework分别有“从左到右”和“从下到上”两种层次结构:

1>.从左到右

  MMC协议是一个总线协议,因此包括Host controller、Bus、Card三类实体(从左到右)。相应的,MMC framework抽象出了host、bus、card三个软件实体,以便和硬件一一对应:

  • host,负责驱动Host controller,提供诸如访问card的寄存器、检测card的插拔、读写card等操作方法。从设备模型的角度看,host会检测卡的插入,并向bus注册MMC card设备;

  • bus,是MMC bus的虚拟抽象,以标准设备模型的方式,收纳MMC card(device)以及对应的MMC driver(driver);

  • card,抽象具体的MMC卡,由对应的MMC driver驱动(从这个角度看,可以忽略MMC的技术细节,只需关心一个个具有特定功能的卡设备,如存储卡、WIFI卡、GPS卡等等)。

2>.从下到上

  MMC framework从下到上有3个层次:

  • MMC core位于中间,是MMC framework的核心实现,负责抽象host、bus、card等软件实体,负责向底层提供统一、便利的编写Host controller driver的API;

  • MMC host controller driver位于底层,基于MMC core提供的框架,驱动具体的硬件(MMC controller);

  • MMC card driver位于最上面,负责驱动MMC core抽象出来的虚拟的card设备,并对接内核其它的framework(例如块设备、TTY、wireless等),实现具体的功能。

3.工作流程

标注:card driver驱动移到drivers/mmc/core/block.c

4.mmc framework代码模块

  • card:

    • block.c:为每个mmc设备向block子系统注册为一个块设备,并实现块设备的ops。为每个块设备创建一个request queue, 通过add_disk将磁盘添加到系统中,block子系统就可以对mmc设备进行操作。实现了请求处理函数,同时启动线程来处理block层发下来的request请求

    • queue.c:实现request queue的创建、销毁,创建request queue的处理线程

  • core

    • core.c:是整个mmc子系统的核心,对上承接mmc子系统的block层,主要提取实现了requset相关的公有操作接口;对下承接具体的控制器,主要提取host ios相关的初始化配置接口,以及bus_type相关的操作, 同时为host提供了相关的接口。

    • bus.c:定义mmc_bus_type 总线;

    • sdio_bus.c:定义sdio_bus_type总线;

    • mmc.c: 实现了mmc_bus_type的mmc_ops,规约了eMMC卡的初始化流程;

    • sd.c: 实现了mmc_bus_type的mmc_sd_ops,规约了SD卡的初始化流程;

    • sdio.c: 实现了mmc_bus_type的mmc_sdio_ops,规约了SDIO卡的初始化流程;

    • mmc_ops.c:定义了eMMC卡相关的一系列操作接口,如go idle,设置电压,设置速率模式

    • sd_ops.c: 定义了SD卡相关的一系列操作接口

    • sdio_ops.c: 定义了SDIO卡相关的一系列操作接口

    • host.c:是对控制器的共有操作进行抽象

  • host

    • xxx-mmc_c:host controller驱动

5.内核关键代码流程图

如上所示:

1).start_kernel是kernel的入口函数,调用流程:

start_kernel
->setup_arch->unflatten_device_tree//将dts文件解析成设备树->rest_init->do_initcalls->arch_initcall_sync(of_platform_default_populate_init); ->of_platform_populate->of_platform_bus_create->->of_platform_device_create_pdata->->device_add //此处会创建并注册xxx_mmc platform_device

2).subsys_initcall(mmc_init)注册总线

  • mmc_init主要完成mmc bus, mmc host class以及sdio bus的创建

3).mmc_blk_init向mmc bus注册mmc_driver

  • 通过drivers/mmc/core/block.c中的module_init(mmc_blk_init),完成了mmc_driver向mmc bus的注册

4).向platform bus注册xxx_mmc platform_driver

  • 通过drivers/mmc/host/xxx_mmc.c中module_init(owl_mmc_init)完成xxx_mmc platfrom driver向platform bus的注册;

5).执行mmc_blk_probe

  • xxx_mmc_probe的执行最终会触发mmc card的创建和注册,触发mmc_blk_probe的执行;
    xxx_mmc_probe会通过mmc_alloc_host并通过mmc_add_host初始化,最终通过mmc_detect_change完成mmc card的创建和注册,这样就会触发mmc_blk_probe的执行.
xxx_mmc_probe->
->mmc_alloc_host->mmc_add_host->->mmc_start_host->

linux MMC framework(1) - 基本框架相关推荐

  1. linux MMC framework(5) - mmc card driver

    了解linux mmc card driver. 1.概述   mmc core/block.c中module_init(mmc_blk_init)调用mmc_register_driver函数创建m ...

  2. linux MMC framework(4) - mmc host driver

    了解mmc host driver. 1.host相关数据结构 1.1.struct mmc_host   struct mmc_host是mmc core由host controller抽象出来的结 ...

  3. linux MMC framework(3) - sdhci-pltfm

    了解sdhci-pltfm 1.sdhci-pltfm 介绍   sdhci-pltfm并不是实际某个host的driver.sdhci-pltfm是指在sdhci core的基础上,提供了统一对sd ...

  4. Linux MMC原理及框架详解

    目录 1. 背景 1.1基本概念 1.2 规范简介 1.2.1 卡的规范 1.2.2 总线规范 2. eMMC原理介绍 2.1 eMMC内部结构简介 2.1.2 Flash Controller 2. ...

  5. cmd52命令发送 mmc_Linux MMC framework(2)_host controller driver

    Linux MMC framework(2)_host controller driver 作者:wowo 发布于:2017-3-8 21:33 分类:通信类协议 1. 前言 本文是Linux MMC ...

  6. linux mmc驱动

    插曲: 因为使用的平台是telechips的tcc803x,其芯片用户手册描述寄存器都是四字节寻址的,但是在代码驱动中用的很可能是单字节寻址,咋一看,有可能有的地址在芯片手册上没有或者感觉写错了,其实 ...

  7. Linux MMC驱动架构浅析

    Linux MMC驱动架构浅析 MMC驱动模型 Linux内核设计了MMC子系统,用于管理MMC/SD等设备,MMC/SD存储设备是一种典型的块设备.MMC子系统的框架结构如下图所示. 块设备(MMC ...

  8. (linux)MMC 卡驱动分析

    最近花时间研究了一下 MMC 卡驱动程序,开始在网上找了很多关于 MMC 卡驱动的分析文章,但大都是在描述各个层,这对于初学者来讲帮助并不大,所以我就打算把自己的理解写下来,希望对大家有用.个人觉得理 ...

  9. Linux MMC 驱动子系统详解

    Linxu MMC 驱动子系统 文章目录 Linxu MMC 驱动子系统 硬件关联 目录说明 mmc子系统的逻辑架构 设备-总线-驱动模型 一.MMC驱动抽象模型 二.SDIO驱动抽象模型 三.MMC ...

最新文章

  1. latex使用subequations后,段后首行文字不对齐
  2. 全国大学生数学建模2019年C题机场的出租车问题论文与代码
  3. Java实践(五)——类的声明与引用
  4. openCV播放视频的程序
  5. 我的小米云端账号服务器,#小米开放云#免费云服务器安装Windows系统
  6. 机器学习UCI数据库
  7. 2020年高中计算机考试时间,2020年普通高中信息技术考试今日开考
  8. 3D结构光摄像头深度算法介绍
  9. Android 带裁剪功能的照片处理方法
  10. 清理XCode缓存文件
  11. Flex读取Excel
  12. 假设检验,p-value,glm
  13. python求15的因数_十五道Python小案例,学会这些,Python基础已过关!
  14. 如何使用最简单的方式进行企业内部知识共享
  15. 道不投不足与谋:(,决定放弃原来的博客空间,不再更新
  16. Error: spawn cmd ENOENT at Process.ChildProcess._handle.onexit
  17. Linux,ubuntu 格式化移动硬盘
  18. 求f(x)=1-x的2次方的定积分
  19. 原来谷歌是这样构建 Docker 镜像的!
  20. 小程序投标书_快来学习招投标小技巧!中标率提高50%(建议收藏)

热门文章

  1. 历史回顾:全球股灾大放送
  2. python2 requests模块_python requests模块详解
  3. 【Educational Cf Round 125 】A—D
  4. 《失业的程序员》(十三):平衡
  5. cccccc讽德诵功
  6. java double类型保留小数和四舍五入
  7. 使用plupload实现无刷新上传图片
  8. Exchange 服务器 跨森林 邮件迁移案例分享 (三)
  9. 【C++编程题】疫情期间(动态规划,递归)
  10. [数据结构](线性表之单链表)