今天花了时间简单看了mmc/sd部门内容和代码,我觉得形式上,这个部分和i2c非常相似系统也是分成core层,host层(对应i2c的adapter),设备层如果这样讲,那么core层主要功能应该是提供host注册,总线注册,设备注册的几个方法以及所谓sdio总线接口的算法了。host层已经是注册一个platform设备,其中应该提供主要sdio接口算法的实现。设备层,应该是提供几个公司1)注册块设备,映射到/dev下面的设备节点 2)应该还有设备其他信息。当然,也有很多和i2c不一样的地方,就是必须支持动态扫描卡设备的方法,而i2c是靠i2c地址制定的。
有关MMC/SD/SDIO相关的知识这里就不多讲了,请参考相关资料。这里主要涉及Linux下MMC相关内容。
内核版本(2.6.36)
首先说一下Linux相关MMC的代码分布,主要有两个目录,一个头文件目录和一个源代码目录。
分别位置如下:
include/linux/mmc
drivers/mmc
要阅读MMC相关代码就必须要看这两个目录。在drivers/mmc目录下分别有三个子目录,其将对应接下来要讲的MMC的体系结构。这三个子目录分别为:
card
core
host
它们的内容后面讲到体系结构时自然就明了了。
现在来说说MMC的体系结构,其分为三层
/dev下设备文件访问MMC/SD/SDIO
用户空间 |
---------------------|-----------------------------------------------------
内核空间 \ /
MMC Card层(对应具体的设备驱动,如MMC/SD卡块设备驱动,SDIO UART)
|
\ /
MMC core层(为上次设备驱动实现提供操作接口,和下层host注册提供机制)
|
\ /
Host层(具体MMC/SD/SDIO控制器驱动层。如S3C2440 MMC/SD控制器驱动)
|
\ /
-----------------------------------------------------------------------------
硬件层
对于我们来说,编写MMC/SD卡相关驱动主要涉及的就是Host层,其余层不用考虑。对于SDIO设备除了Host层以外,还有可能要编写MMC Card层的设备驱动。
编写Host层驱动,主要是填充mmc_host结构体相关内容和实现mmc_host_ops结构体中的函数。最后调用mmc_add_host向MMC core注册host驱动。可以参考S3C24XX的HOST驱动程序(drivers/mmc/host/s3cmci.c,s3cmci.h),上层MMC Core主要调用mmc_host_ops中的函数来实现与硬件交互。如下是mmc_host_ops结构体里面的函数:
struct mmc_host_ops {
/*使能和禁止HOST控制器*/
int (*enable)(struct mmc_host *host);
int (*disable)(struct mmc_host *host, int lazy);
/*这个是关键的函数,所有对MMC/SD的操作,包括发命令和读数据,都通过该接口来实现,所以实现该接口时要处理是命令还是数据操作,另外要考虑是否使用DMA来进行数据传输。*/
void (*request)(struct mmc_host *host, struct mmc_request *req);
/*用来设置MMC/SD的时钟,电压等操作*/
void (*set_ios)(struct mmc_host *host, struct mmc_ios *ios);
/*检查MMC/SD是否写保护了*/
int (*get_ro)(struct mmc_host *host);
/*检查mmc/sd的插入和拔出*/
int (*get_cd)(struct mmc_host *host);
void (*enable_sdio_irq)(struct mmc_host *host, int enable);
/* optional callback for HC quirks */
void (*init_card)(struct mmc_host *host, struct mmc_card *card);
};
接下来说说MMC Core层。
该层主要实现了几个结构体函数指针,用来构建整个MMC设备驱动模型。它们是:
struct bus_type mmc_bus_type /*mmc总线,用来管理sd/mmc卡设备和驱动*/
struct mmc_bus_ops mmc_ops /*MMC卡总线操作函数,主要是在电源管理方面*/
struct mmc_bus_ops mmc_sd_op /*SD卡总线操作函数,主要是在电源管理方面*/
struct mmc_bus_ops mmc_sdio_ops /*SDIO总线操作函数,主要是在电源管理方面*/
struct bus_type sdio_bus_type /*SDIO另外定义了一条总线*/
core.c文件中实现了几个关键的函数,用来提供给上层MMC Card调用和对SD/MMC卡的侦测函数以及初始化。
供给上层MMC Card调用主要有:
void mmc_wait_for_req(struct mmc_host *host, struct mmc_request *mrq);
int mmc_wait_for_cmd(struct mmc_host *host, struct mmc_command *cmd, int retries);
mmc card层就是通过这些函数来操作mmc/sd卡。而这些函数最终调用的是mmc_host_ops 结构体中的request函数来进行具体的操作。
对SD/MMC卡的侦测函数以及初始化,主要实现在
void mmc_rescan(struct work_struct *work);
函数中。
host层在调用mmc_add_host时会引发该函数的调用,侦测/初始化顺序为:
先SDIO接口
/*
* First we search for SDIO...
*/
err = mmc_send_io_op_cond(host, 0, &ocr);
if (!err) {
if (mmc_attach_sdio(host, ocr)) {
...
在SD:
/*
* ...then normal SD...
*/
err = mmc_send_app_op_cond(host, 0, &ocr);
if (!err) {
if (mmc_attach_sd(host, ocr))
最后是MMC:
/*
* ...and finally MMC.
*/
err = mmc_send_op_cond(host, 0, &ocr);
if (!err) {
if (mmc_attach_mmc(host, ocr))
其中mmc_attach_xxx函数就是用来完成侦测和初始化的,选择相应的总线操作函数,并产生struct mmc_card结构体,并填充其内容,最后注册一个mmc_card(代表着一个设备),并在注册中由mmc_bus_type结构体的match和probe函数来查找到适合该设备的驱动(这个又牵涉到设备驱动模型,可以查看设备驱动模型相关内容,了解设备和驱动匹配的过程),这里将匹配到mmc card层的MMC_Block(MMC块设备驱动程序,由 struct mmc_driver代表)。在完成设备侦测和初始化以后,以后的操作就是mmc card层中相关的设备驱动程序发出的了。
再说说MMC card层,该层主要实现具体的设备驱动程序,如MMC块设备驱动程序,通过mmc_register_driver注册。如果是SDIO就有可能是其它字符设备驱动程序了,其通过调用sdio_register_driver来注册设备驱动。
总体概括来说:
host层提供驱动相关MMC/SD/SDIO控制器的功能。
Core层提供了具体MMC/SD/SDIO设备侦测和初始化功能,以及电源管理方面的内容和通用的操作功能。
Card为实现具体的设备驱动层。
这样的分层结构在Linux设备驱动中非常常见,如I2C,SPI等都提供了这样的驱动模型。
最后简单说说SDIO相关部分。在core层注册了新的sdio_bus_type总线,并且定义了新的sdio_driver来代表sdio设备驱动,并定义了struct sdio_func来代表设备。所以在SDIO设备除了struct mmc_card来代表设备以外,还有struct sdio_func来代表具体功能设备。所以在mmc_attach_sdio函数中除了注册mmc_card以外,还注册了sdio_func。具体代码如下:
int mmc_attach_sdio(struct mmc_host *host, u32 ocr)
{
....
/*
* First add the card to the driver model...
*/
err = mmc_add_card(host->card);
if (err)
goto remove_added;
/*
* ...then the SDIO functions.
*/
for (i = 0;i < funcs;i++) {
err = sdio_add_func(host->card->sdio_func[i]);
if (err)
goto remove_added;
}
....
}
所以它除了调用mmc_bus_type结构体的match和probe函数来查找到适合该设备的驱动外,也调用sdio_bus_type结构体的match和probe函数来查找到适合该设备的驱动。
关于linux mmc/sd驱动程序架构,你了解多少?
- 驱动(88353)
- Linux(218417)
- MMC(31401)
- 架构(26538)
相关推荐
热点推荐
linux驱动程序的主要流程和功能
驱动程序是用于控制和管理硬件设备的软件模块,它主要负责与设备进行交互,通过操作设备的寄存器和接口,实现对硬件的控制和访问。在Linux系统中,驱动程序是实现与硬件设备交互的一个关键部分。本文将详细
2023-12-08 14:56:02
3814
3814Linux的32位驱动程序
你好,我已经下载了网格驱动程序2.1但它只带有64位驱动程序的Linux。我如何获得Linux的32位驱动程序。谢谢,赛义德以上来自于谷歌翻译以下为原文Hello there,I've
2018-09-07 16:42:51
Linux设备驱动程序开发 - Linux设备驱动类型
驱动程序在Linux的内核源代码中占有很大的比例,源代码的长度日益增加,主要是驱动程序的增加。在Linux内核的不断升级过程中,驱动程序的结构还是相对稳定。Linux设备驱动架构的不断发展中始终坚持
2016-04-16 14:31:57
stm32 sd卡驱动程序。
程序是基于keil4开发的,是关于的SD卡的驱动程序。本人写了部分其他处理器的sd卡的驱动程序。codefire, k10,xs128等。有需要的可以跟我联系哈。qq:490690385.
2013-06-24 15:22:06
嵌入式Linux驱动程序开发大概了解
1.嵌入式Linux驱动程序开发嵌入式Linux驱动程序开发包罗万象,基本上每个点都要大概了解一下。1.1软件工具Makefile必须要掌握一些,至于Kconfig太简单了只是个配置文件算不上程序
2021-11-02 10:17:37
求助,关于55513 Linux驱动程序问题求解
;
我们使用 linux 内核 5.4 来构建 fmac 驱动程序,但是当 insmod ko 文件时
brcmfmac 将失败:brcmfmac:brcmf_sdio_htclk:访问关闭时钟失败
2025-07-09 08:02:04
Linux中基于EP7312的LCD驱动程序设计
介绍在Linux操作系统中基于EP7312的LCD设备驱动程序设计。其中包括LCD设备显示原理,EP7312上与LCD 相关的寄存器, Linux 操作系统中编写设备驱动程序的方法以及驱动程序如何添加到Linu
2009-04-15 11:46:14
28
28基于内核态JVM的Linux设备驱动程序
驱动程序的不稳定是造成操作系统内核崩溃的主要原因,该文采用类型安全的Java语言开发Linux设备驱动程序以提高系统的稳定性,并分析驱动模型的结构、内核态Java虚拟机(JVM)的设
2009-04-16 08:40:55
24
24Linux系统PCI设备驱动程序开发
为了促进“Linux+PCI”技术在工控领域中的应用,通过对Linux系统中PCI局部总线规范实现机制和Linux设备驱动模块的分析,给出了PCI设备驱动程序的基本结构、内容及开发方法;最后用
2009-07-16 09:55:22
17
17基于Linux操作系统的设备驱动程序开发
本文介绍了Linux 系统的特点,阐述了在Linux 操作系统下,对系统硬件的访问和开发驱动程序的方法,说明了设备驱动程序的结构和编写过程。
2009-09-02 17:11:51
20
20嵌入式Linux网络驱动程序的开发及实现原理
分析Linux 网络驱动程序体系结构的基础上,结合利用Linux2.6.18 内核在FS2410 开发板上移植编写CS8900A 网卡驱动程序的实例,重点讨论了嵌入式Linux 网络驱动程序的实现原理,并详细分
2009-09-03 11:46:32
24
24基于S3C2410的SD MMC卡驱动的实现
设计了一个基于S3C2410 片内SDI 的SD/MMC 卡驱动,该驱动支持MMC 卡、SD卡、SDHC 卡。在分析SDI 特点和有关寄存器功能的基础上,完成了SD 模式下的硬件接口设计。介绍了该驱动的软件
2010-01-06 15:41:24
53
53基于嵌入式Linux的步进电机驱动程序设计
介绍了Linux驱动程序的实现机制,在分析步进电机和驱动程序接口的基础上,给出了一个在嵌入式Linux平台上编写步进电机驱动的实例。本平台基于Samsung公司的S3C2410X CPU,采用Linux
2010-02-21 14:20:16
38
38基于SEP4020的嵌入式Linux音频驱动程序设计
论述了Linux操作系统中声卡驱动程序的设计方法,主要介绍了基于OSS的声卡驱动设计原理以及Linux操作系统中声卡驱动程序的接口函数。针对具体硬件平台编写了相应的驱动程序,并介
2010-07-06 15:30:16
37
37基于BF533的Linux网络驱动程序
在分析Linux网络驱动程序体系结构的基础上,结合Linux2.6.18内核在ADSP鄄BF533开发板上移植编写CS8900A网卡驱动程序的实例,重点讨论了嵌入式Linux网络驱动程序的实现原理,并详细分析
2010-12-25 16:22:46
20
20Linux字符设备驱动程序的编写框架
一、Linux device driver 的概念
系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应
2010-12-25 10:54:29
970
970嵌入式Linux系统中MMC卡驱动管理技术研究
摘 要:简明介绍MMC卡驱动程序的体系结构,设计并实现MMC卡的底层驱动;对传统的块设备驱动程序中的单块读写进行改进,实现MMC卡的集群读写,同时实现了卡的电源管理和即插即用功能。
2011-03-18 10:22:34
80
80AFDX端系统的Linux驱动程序设计
为了满足航空电子系统对确定性和实时性的要求,针对AFDX端系统硬件结构,功能需求和Linux驱动程序的特点,提出了一种满足AFDX协议的Linux内核态驱动程序的实现方法。在Linux内核态驱
2011-04-12 16:11:55
41
41s3c2440 mmc和camera的linux驱动
本站提供的s3c2440 mmc和camera的linux驱动资料,详细讲诉了s3c2440 mmc和camera的linux驱动的步骤,希望对你的学习有所帮助。
2011-05-25 15:53:06
54
54Linux设备驱动程序的编写
本站提供的Linux设备驱动程序的编写资料,希望对你的学习有帮助。 世界各地都有人在钻研Linux内核,大多是在写设备驱动程序。尽管每个驱动程序都不一样,而且你还要知道自己设备
2011-05-25 16:24:39
108
108基于Linux的步进电机驱动程序设计
介绍了Linux驱动程序的实现机制,在分析步进电机和驱动程序接口的基础上,给出了一个在嵌入式Linux平台上编写步进电机驱动的实例。本平台基于SAMSUNG公司的S3C2410X CPU,采用Linux2.4内核作
2011-06-15 14:22:58
6596
6596
Windows CENET中断架构分析和高速AD驱动程序的开发
本文分析了Windows CE.NET嵌入式实时系统的中断架构和流式驱动架构 及其设备驱动程序的开发方法。实现了该系统下的高速AD驱动程序的开发并进行了实际测试 。
2016-04-18 10:02:17
0
0Linux字符设备驱动程序的实现
一、Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序
2017-10-21 09:54:31
0
0嵌入式Linux系统中MMC卡驱动程序研究
正确地驱动MMC卡后,就可以像磁盘一样方便地存取数据。本文所研究与实现的Linux驱动程序,以Intel XScale的PXA250为硬件平台,在遵循MMC卡通信协议规范的基础上,实现了卡的底层读写。然后对传统的块设备驱动程序中的单块读写进行了改进,实现了集群读写技术,提高了卡的
2017-11-06 10:39:21
0
0Linux系统网络驱动程序的编写
驱动程序编写 一.Linux系统设备驱动程序概述 1.1 Linux设备驱动程序分类 1.2 编写驱动程序的一些基本概念 二.Linux系统网络设备驱动程序 2.1 网络驱动程序的结构 2.2 网络驱动程序的基本方法 2.3 网络驱动程序中用到的数据结构 2.4 常用的系统支持 三。编写Linux网络驱动程序中
2017-11-07 10:40:30
0
0Linux驱动程序缺陷检测研究
驱动程序是操作系统的重要组成部分。驱动程序运行于内核态,其可靠性对于操作系统的安全可靠非常关键。针对Linux驱动程序,研究基于符号执行的驱动程序缺陷自动检测方法。提出了基于性质制导符号执行
2017-11-21 15:26:21
9
9可动态安装的Linux设备驱动程序
为了增跟内核的灵活性和为了方便,设各驱动程序应被设计为一个可动态安装的内核模块。于是,一个典型的Linux设备驱动程序应包含如下几部分代码:
2018-04-04 10:56:00
1190
1190嵌入式Linux设备驱动程序开发基础知识总结免费下载
本文档的主要内容详细介绍的是嵌入式Linux设备驱动程序开发基础知识总结免费下载
嵌入式Linux设备驱动程序分类静态加载的驱动程序动态加载的驱动程序
Linux将设备按照功能特性划分为三种类型:字符设备,块设备和网络设备。
2018-10-23 16:10:56
13
13Linux设备驱动程序的平台驱动程序和字符驱动程序介绍
了解Linux设备驱动程序的基础知识,重点介绍平台驱动程序和字符驱动程序。
提出了简单的平台驱动程序实现和简单的字符驱动程序实现。
2018-11-27 06:32:00
4927
4927Linux设备驱动程序基础知识的了解
了解Linux设备驱动程序的基础知识,重点关注设备节点,内核框架,虚拟文件系统和内核模块。
提出了一个简单的内核模块实现。
2018-11-26 06:51:00
3549
3549需要了解Linux V4L2的驱动架构
video4linux2(V4L2)是Linux内核中关于视频设备的中间驱动层,向上为Linux应用程序访问视频设备提供了通用接口,向下为linux中设备驱动程序开发提供了统一的V4L2框架。
2019-04-28 17:29:13
1585
1585
如何编写基于ARM的裸机程序和基于Linux的驱动程序
在嵌入式开发中,ADC应用比较频繁,本文主要讲解ADC的基本原理以及如何编写基于ARM的裸机程序和基于Linux的驱动程序。
2020-09-13 09:25:50
3954
3954
如何使用Linux内核实现USB驱动程序框架
Linux内核提供了完整的USB驱动程序框架。USB总线采用树形结构,在一条总线上只能有唯一的主机设备。 Linux内核从主机和设备两个角度观察USB总线结构。本节介绍 Linux内核USB驱动程序
2020-11-06 17:59:17
20
20如何编写基于ARM的裸机程序和基于Linux的驱动程序?
在嵌入式开发中,ADC应用比较频繁,本文主要讲解ADC的基本原理以及如何编写基于ARM的裸机程序和基于Linux的驱动程序。 ARM架构:Cortex-A9Linux内核:3.14 在讲述ADC之前
2021-03-12 15:26:55
2300
2300
细说嵌入式驱动程序设计
嵌入式系统驱动程序的开发有别于WIndows或Linux。后者除了必须了解新设备的硬件特性,把控制硬件的程序尽快完成之外,还需要设法让驱动程序符合Windows或Linux的规定(大且复杂的架构
2021-11-03 13:21:01
11
11如何配置和操作Linux驱动程序开发板
本文档概述了利用Linux开发板为 Linux 内核开发驱动程序的基础知识,并简单介绍了如何配置和操作 Linux 驱动程序开发板。
2022-02-15 13:36:34
3929
3929
适用于Linux的Emulex驱动程序 版本12.8.351.29
电子发烧友网站提供《适用于Linux的Emulex驱动程序 版本12.8.351.29.pdf》资料免费下载
2023-07-27 10:02:28
0
0适用于Linux的Emulex驱动程序 版本12.6.240.31
电子发烧友网站提供《适用于Linux的Emulex驱动程序 版本12.6.240.31.pdf》资料免费下载
2023-08-04 10:52:49
0
0SI Logic Scientific-Linux 5.5驱动程序
电子发烧友网站提供《SI Logic Scientific-Linux 5.5驱动程序.zip》资料免费下载
2023-08-11 09:52:53
0
0linux驱动程序运行在什么空间
Linux 驱动程序是操作系统的一部分,负责管理硬件设备与操作系统之间的交互。驱动程序运行在内核空间(Kernel Space),这是操作系统的核心部分,与用户空间(User Space)相对。内核
2024-08-30 14:37:13
1325
1325linux驱动程序的编译方法是什么
Linux驱动程序的编译方法主要包括两种: 与内核一起编译 和 编译成独立的内核模块 。以下是对这两种方法的介绍: 一、与内核一起编译 与内核一起编译意味着将驱动程序的源代码直接集成到Linux内核
2024-08-30 14:46:12
1885
1885linux驱动程序主要有哪些功能
Linux驱动程序是操作系统与硬件设备之间进行通信的桥梁,负责实现硬件设备与操作系统之间的数据交换和控制。Linux驱动程序的主要功能包括以下几个方面: 设备识别与初始化 Linux驱动程序需要
2024-08-30 14:47:32
1265
1265linux驱动程序如何加载进内核
,需要了解Linux内核的基本概念和API。以下是一些关键概念: 1.1 内核模块:Linux内核模块是一种动态加载和卸载的代码,可以在不重新启动系统的情况下加载和卸载。驱动程序通常以内核模块的形式实现。 1.2 设备模型:Linux内核使用设备模型来管理设
2024-08-30 15:02:19
1661
1661Linux设备驱动程序分类有哪些
Linux设备驱动程序是操作系统与硬件设备之间的桥梁,负责实现硬件设备与操作系统之间的通信和控制。Linux设备驱动程序的分类繁多,可以根据不同的标准进行分类。 按硬件类型分类 Linux设备
2024-08-30 15:11:56
1865
1865Linux环境再升级:PLIN驱动程序正式发布
PLIN驱动程序现已正式发布,本文将展示如何安装PLIN驱动程序,以及如何在Linux环境下进行基本的PLIN通信操作,确保您能够快速掌握并应用这一新工具。
2025-04-21 15:29:26
872
872
电子发烧友App








评论