百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

LINUX MMC子系统分析(二) MMC驱动模型分析

gudong366 2025-05-16 16:15 7 浏览

本模块主要介绍MMC子系统与设备-总线-驱动模型的关联,并介绍该MMC子系统是如何借助LINUX内核的设备-总线-驱动模型实现自己的驱动模型的。针对MMC子系统而言,主要使用了系统中的两个模型:设备-总线-驱动模型、块设备驱动模型。

设备-总线-驱动模型

在分析MMC子系统的设备-总线-驱动模型时,我们可以借助之前已经分析的i2c驱动模型、spi驱动模型的实现,来学习mmc子系统的驱动模型,通过与i2c驱动模型、spi驱动模型的对比,也可以加深我们对mmc子系统驱动模型的理解(从已知去学习未知,可提供我们的学习效率)。

我们知道针对复杂的设备,则需要借助控制器进行通信,而针对i2c、spi、mmc而言,均需要

对应的控制器实现与该类设备的通信。而针对这三类控制器,其模块都进行了抽象,其中i2c控制器抽象为i2c adapter、spi控制器抽象为spi master,而针对mmc控制器,则抽象为mmc host;而针对这三种类型设备的抽象,i2c设备抽象为i2c client、spi设备抽象为spi device、mmc device抽象为mmc card。

下面分析下这三类驱动模型的异同:

  1. 均为控制器创建了对应的class,用于将对应的控制器设备链接至对应的class上;
  2. 针对i2c adapter、spi master这两类而言,其驱动模型中均创建了对应的链表,将所有注册的控制器设备链接在一起,而mmc子系统并没有为mmc host创建类似的链表;
  3. I2c/spi设备不属于热插拔设备,因此在具体系统的板级文件或者设备树中,需要针对系统中存在的i2c/spi设备定义注册信息,从而在LINUX系统初始化时完成i2c/spi设备的注册;而针对mmc子系统其属于热插拔的,因此在系统初始化时不需要单独进行设备的注册;
  4. 针对mmc子系统而言,针对mmc card的注册,mmc子系统提供了rescan接口,而该接口作为延迟工作队列的回调函数。针对mmc card而发起扫描的时机如下:
  5. 在mmc host添加的时候,执行一次mmc card的扫描操作;
  6. 若mmc host支持卡在位检测引脚(即cd引脚),在cd引脚对应的中断发生后,在该中断的处理函数中,会进行延迟队列的调度,从而完成一次mmc card的扫描操作;
  7. 若mmc host不支持卡在位检测,则可以将卡在位检测设置为轮询机制,则针对该mmc host,以1s为周期进行mmc card的扫描;
  8. 针对i2c/spi驱动模型而言,针对不同类型的外设,需要对应类型的设备驱动程序,而针对mmc子系统而言,因mmc、emmc等协议规范中已经规定了所有mmc/sd/tf/emmc设备的操作方法、寄存器定义等,因此针对mmc总线而言,mmc子系统提供了一个统一的mmc driver,所有的mmc/sd/tf/emmc设备均与该驱动绑定(当然了,针对sdio总线而言,因其外设的功能不一,因此针对具体的设备也需要对应的设备驱动)。针对mmc子系统的mmc设备而言,不需要驱动开发者实行mmc 设备驱动,仅对sdio外设需要实现对应的mmc设备驱动;
  9. 因mmc driver仅有一个,因此针对mmc bus而言其match函数直接返回1,而不需要像spi/i2c总线的match接口那样对设备和驱动进行匹配检测;
  10. 因一个mmc控制器仅与一个mmc card关联,且mmc子系统提供了mmc rescan接口,可以实现对mmc host下的mmc card进行扫描并进行mmc card的创建、与mmc host的绑定以及注册至mmc总线上;因此不需要像上述2中所述的i2c/spi那样,将所有已注册的控制器设备链接在一起方便查找从而实现i2c/spi设备的注册与绑定;
  11. 针对spi master、i2c adapter,均提供与外设通信的方法(spi_master->transfer、i2c_adapter->master_xfer/smbus_xfer),而针对mmc host而言,也需要提供相应的访问接口(记为mmc_host->request);
  12. 因mmc/emmc协议规范已经规定了访问mmc card的命令格式以及相应的寄存器定义,所有mmc/sd/tf/emmc设备均需要遵守,因此mmc子系统针对访问mmc card的命令抽象出统一的接口,包括设备状态设置、卡使能去使能、sleep/awake、poweroff notify、cid/rca/dsr/csd寄存器读写、通过mmc switch命令实现与extend csd寄存器的读写等接口


以上即是i2c/spi/mmc各模块的异同点,针对上面的几点分析,也大大加深了我们的印象,也基本上了解了mmc子系统的设备-总线-驱动、设备-类模型。下面我们从mmc子系统设备-驱动-总线模型间数据结构体之间的关联,来进一步分析mmc子体系的驱动模型。

mmc子系统设备-总线-驱动模型

如下即为mmc_bus_type、mmc_card、mmc_host、mmc_driver、kset、kobject的关联如下图(针对设备驱动模型、sysfs文件系统这两个部分,之前已经分析过,个人认为把这两部分内容熟悉了之后,针对大多数的设备驱动模型理解,均会比较轻松,因此强烈建议大家先熟悉这两个模块)。其中i2cbus、mmc bus、spi总线均通过其对应的kobject完成关联。而mmc host与mmc card通过其指针成员完成了绑定,而mmc card、mmc driver、mmc bus则借助设备-总线-驱动模型的数据结构完成了关联操作。

mmc子系统mmc host与mmc class的关联

mmc子系统的mmc host借助其device类型的程序class_dev以及device-class模型的数据结构完成了绑定操作,如下为mmc host与mmc class的关联,同时mmc host借助kref、mmc_class->dev_release接口,可完成mmc host变量的动态释放(当mmc_host的引用计数为0后,则会调用device_release接口进行释放操作,最终调用mmc_host_classdev_release接口,完成mmc_host的内存释放)。

mmc子系统的逻辑架构

针对mmc子系统内部,其与上层应用以及底层设备的关联如下图所示(该逻辑图并不是很准确,但大体正确):

Mmc block部分:

  1. MMC子系统的block部分负责与上层VFS之间的关联,用于与VFS的sys_open等接口关联;
  2. Mmc block层通过调用core层接口函数,通过调用具体host->ops->request接口,实现向mmc/sd card读写数据;


host相关接口:

  1. 提供mmc host注册、注销的接口;
  2. 提供mmc host class的创建,并使用device-class模型,实现mmc_host与mmc_host_class的关联;

Mmc/sd ops接口:

针对mmc/sd,mmc/emmc spec协议中规定了所有寄存器定义、命令,针对所有的mmc/sd/sdio设备均需要遵守,因此mmc子系统针对mmc/sd/sdio设备的命令访问操作进行实现,提供统一的接口,供mmc子系统各部分调用,提供的接口包括设备状态设置、卡使能去使能、sleep/awake、poweroff notify、cid/rca/dsr/csd寄存器读写、通过mmc switch命令实现与extend csd寄存器的读写等接口。而这些接口最终会调用mmccore提供的封装接口(间接调用mmc_host->ops->request接口),借助mmc controller实现与mmc/sd/sdio设备的通信

Mmc bus ops接口(mmc.c):

主要是提供了mmc card初始化及注册至mmc总线(即与)、csd、cid、extent csd寄存器各值的设置、mmc host与mmc card的绑定、mmc card的sleep/awake/suspend/alive等接口。这些接口主要供mmc core相关的接口调用,实现mmc card的创建及与设备-驱动-总线模型以及mmc host的绑定等内容。该部分也会调用mmc core提供的接口,主要用于设置mmc总线的电压、总线宽度、总线模式、块长度、块计数、mmc data timeout参数等。

Mmc/sdio bus接口:

mmc子系统提供了mmc/sdio bus的定义,通过使用设备-总线-驱动模型提供的接口,实现mmc子系统的总线-设备-驱动模型

Mmc core接口:

该部分的提供的接口包括mmc bus的注册与注销、mmc 通信接口(提供同步的与mmc 设备通信的接口)、mmc host与mmc_bus ops接口的绑定及解绑接口、mmc device的rescan接口(并提供poll机制的rescan功能,若在硬件设计时,未提供卡检测相关的cd引脚,则可以借助mmc 子系统提供的poll机制,实现对mmc device的rescan)、提供设置mmc总线的电压、总线宽度、总线模式、块长度、块计数、mmc data timeout参数等、powerup、poweroff notify、reset、mmc 总线io相关的配置等等。

该逻辑图可能不严谨,但大致脉络清晰,也有助于我们理解mmc子系统的实现。

小结

本文从两个部分说明了mmc字体的驱动模型,首先通过设备-总线-驱动模型入手,讲述数据结构间的关联(其实linux内核的各模块,通过其数据结构间的关联,即可大致理解其模块代码的实现,因此在我们进行应用程序的开发时,可以借助linux内核的这种思想,注重数据结构体的构建);然后从mmc子系统的逻辑架构进行入手,理清mmc子系统大致的逻辑架构。以上内容希望能对大家有所帮助。

相关推荐

梦幻诛仙12职业1亿元宝版本架设教程(包含资源下载)

架设教程:1;上传脚本zx到bin文件夹,给权限chmod-R777/bin2;输入zx安装宝塔面板输入对应序号,中途输入Y继续3;安装好之后,会给个宝塔地址及账号密码,复制地址...

Java零基础入门,科普Java你应该了解什么

最近很多人问我想学Java但是一点基础没有,网上看了一堆学习线路图还是无从下手。今天耗时3小时整理了一套保姆级的Java入门教程,建议收藏按照线路图一点点学习。一、Java的概况Java是1995年6...

01.Java发展历史(java发展历史简要)

1.Java发展历史Java由SunMicrosystems公司(现为Oracle公司)的JamesGosling及其团队在1991年开发,最初命名为"Oak",后改名为"...

Ubuntu16.04.1安装Java8(ubuntu终端安装java)

上篇文章讲解了怎么在Windows下安装Java8《Windows10安装Java8》,这里讲解下怎么在Linux下安装Java。由于之前已经安装了Ubuntu16.04.1《VmwareWorkst...

性能测试能力提升-JVM GC监控和优化

一、背景接着上一篇的知识:性能测试能力提升-JVMGC原理,本篇文章,我们将主要介绍JVMGC监控和优化相关的知识:命令行方式监控GC图形化方式监控GC什么时候需要开始GC优化?GC优化的目的GC...

Spring Boot Jar 包秒变 Docker 镜像实现多环境部署

你是否在互联网大厂后端开发工作中,遇到过这样的困扰?当完成一个SpringBoot项目开发,准备将Jar包部署到不同环境时,却发现各个环境依赖不同、配置复杂,部署过程繁琐又容易出错,不仅耗费...

「JDK 11」关于 Java 模块系统,看这一篇就够了

继2014年3月Java8发布之后,时隔4年,2018年9月,Java11如期发布,其间间隔了Java9和Java10两个非LTS(LongTermSupp...

对Java学习的10条建议(对java的认识和理解)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

JAVA入门教程-第1章 概述(java入门指南)

大道至简-JAVA入门教程在本教程中,你将学习Java语言的基础知识。Java基础内容涵盖:Java基础概念、Java词法结构、Java数组、Java流程控制、Java字符串、Java...

推荐一款Java音频视频编码器,很赞

Jave2是什么JAVE2(Java音频视频编码器)库是ffmpeg项目上的Java包装器。开发人员可以利用JAVE2将音频和视频文件从一种格式转码为另一种格式。在示例中,您可以将AVI文件转换为MP...

【JAVA教程】JAVA入门及开发环境安装

一、Java开发环境概述Java开发需要三个核心组件:JDK(JavaDevelopmentKit)-Java开发工具包,开发、编译、调试Java程序JRE(JavaRuntimeE...

Windows和Linux环境下的JDK安装教程

JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...

记Tomcat优化方案(tomcat优化的几种方法)

Tomcat服务吞吐量评估方案问题:评估方案在一台8核16G的linux服务器上,使用tomcat容器部署服务。在正常情况下如何评估这个tomcat服务可处理的连接数,即服务的吞吐量,请在正常情况下考...

JVM GC诡异问题排查,k8s差点害死我……

前言本文将通过一个真实的生产环境案例,详细展示如何系统性地排查和解决JVM垃圾收集问题。这个案例涵盖了从问题发现、分析诊断到最终解决的完整过程,对于理解JVM调优实战具有重要的参考价值。系统背景我们的...

Thorium Reader - 功能强大的跨平台免费电子书阅读器

在日常阅读日益普及的今天,选择一款合适的电子书阅读器至关重要。ThoriumReader作为一款独具特色的阅读应用,正逐渐在众多同类产品中崭露头角,为用户带来了卓越的阅读体验。  跨平台的便捷性...