今天花了时间简单看了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驱动程序架构,你了解多少?
- 驱动(84267)
- Linux(206513)
- MMC(30332)
- 架构(25184)
相关推荐
了解和使用no-OS及平台驱动程序
快速发展的技术需要软件支持(固件驱动程序和代码示例)来简化设计导入过程。本文介绍如何利用no-OS(无操作系统)驱动程序和平台驱动程序来构建ADI公司精密模数转换器和数模转换器的应用固件,这些器件
2022-04-11 15:55:484097
基于eCos系统的SPCE3200中SD卡驱动程序的开发
基于eCos系统的SPCE3200中SD卡驱动程序的开发
设备驱动程序是介于硬件和嵌入式系统eCos内核之间的软件接口,是一种底层的、专用于某一硬件的软件组件。在eCos系统[1]中,设
2009-11-05 16:03:261157
linux驱动程序的主要流程和功能
驱动程序是用于控制和管理硬件设备的软件模块,它主要负责与设备进行交互,通过操作设备的寄存器和接口,实现对硬件的控制和访问。在Linux系统中,驱动程序是实现与硬件设备交互的一个关键部分。本文将详细
2023-12-08 14:56:02668
LINUX音频驱动架构相关资料分享
1、LINUX音频驱动架构 LINUX下音频驱动开发,要遵循标准的ALSA架构, 下面分别从硬件架构、软件架构、驱动程序,3个方面分析。 硬件架构 硬件上音频总线接口有很多,如I2S、PCM、TDM、SLIMBUS等,以I2S为例分析:原作者:DMCF
2022-11-04 15:57:35
Linux的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
嵌入式系统驱动程序的开发
嵌入式系统驱动程序的开发有别于WIndows或Linux。后者除了必须了解新设备的硬件特性,把控制硬件的程序尽快完成之外,还需要设法让驱动程序符合Windows或Linux的规定(大且复杂的架构
2021-11-08 06:21:19
请问VC707板上有设备驱动程序吗?
驱动程序使用监视器或其他I / O驱动程序。现在,我有一些问题。在VC707板上,有hdmi端口。我是否必须为显示器制作设备驱动程序?如果没有,我认为VC707板上有很多设备驱动程序。我在哪里可以查看所有这些?另外,如果您有关于板载Linux移植的任何信息,请与我分享。永远谢谢YoungWook
2019-09-30 06:56:37
Linux中基于EP7312的LCD驱动程序设计
介绍在Linux操作系统中基于EP7312的LCD设备驱动程序设计。其中包括LCD设备显示原理,EP7312上与LCD 相关的寄存器, Linux 操作系统中编写设备驱动程序的方法以及驱动程序如何添加到Linu
2009-04-15 11:46:1425
基于内核态JVM的Linux设备驱动程序
驱动程序的不稳定是造成操作系统内核崩溃的主要原因,该文采用类型安全的Java语言开发Linux设备驱动程序以提高系统的稳定性,并分析驱动模型的结构、内核态Java虚拟机(JVM)的设
2009-04-16 08:40:5524
可重用Linux设备驱动程序框架
Linux设备驱动程序的开发工作涉及到相当多的系统内核细节,对开发人员的要求很高。由于缺乏必要的可重用性,一个新设备的驱动程序的开发速度也很缓慢。为了简化其开发流程和
2009-04-22 09:59:0118
CAN总线在嵌入式Linux下驱动程序的实现
本文以S3C44B0X 为微处理器,通过其SPI 接口,采用MCP2510 CAN 控制器扩展CAN 总线,文章在分析Linux 设备驱动程序工作原理和结构的基础上,重点论述CAN 设备在uClinux 下驱动程序的设计方
2009-08-25 09:09:3722
基于Linux操作系统的设备驱动程序开发
本文介绍了Linux 系统的特点,阐述了在Linux 操作系统下,对系统硬件的访问和开发驱动程序的方法,说明了设备驱动程序的结构和编写过程。
2009-09-02 17:11:5120
嵌入式Linux网络驱动程序的开发及实现原理
分析Linux 网络驱动程序体系结构的基础上,结合利用Linux2.6.18 内核在FS2410 开发板上移植编写CS8900A 网卡驱动程序的实例,重点讨论了嵌入式Linux 网络驱动程序的实现原理,并详细分
2009-09-03 11:46:3224
基于S3C2410的SD MMC卡驱动的实现
设计了一个基于S3C2410 片内SDI 的SD/MMC 卡驱动,该驱动支持MMC 卡、SD卡、SDHC 卡。在分析SDI 特点和有关寄存器功能的基础上,完成了SD 模式下的硬件接口设计。介绍了该驱动的软件
2010-01-06 15:41:2453
基于嵌入式Linux的步进电机驱动程序设计
介绍了Linux驱动程序的实现机制,在分析步进电机和驱动程序接口的基础上,给出了一个在嵌入式Linux平台上编写步进电机驱动的实例。本平台基于Samsung公司的S3C2410X CPU,采用Linux
2010-02-21 14:20:1638
基于SEP4020的嵌入式Linux音频驱动程序设计
论述了Linux操作系统中声卡驱动程序的设计方法,主要介绍了基于OSS的声卡驱动设计原理以及Linux操作系统中声卡驱动程序的接口函数。针对具体硬件平台编写了相应的驱动程序,并介
2010-07-06 15:30:1637
基于BF533的Linux网络驱动程序
在分析Linux网络驱动程序体系结构的基础上,结合Linux2.6.18内核在ADSP鄄BF533开发板上移植编写CS8900A网卡驱动程序的实例,重点讨论了嵌入式Linux网络驱动程序的实现原理,并详细分析
2010-12-25 16:22:4620
Linux字符设备驱动程序的编写框架
一、Linux device driver 的概念
系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应
2010-12-25 10:54:29743
嵌入式Linux系统中MMC卡驱动管理技术研究
摘 要:简明介绍MMC卡驱动程序的体系结构,设计并实现MMC卡的底层驱动;对传统的块设备驱动程序中的单块读写进行改进,实现MMC卡的集群读写,同时实现了卡的电源管理和即插即用功能。
2011-03-18 10:22:3480
AFDX端系统的Linux驱动程序设计
为了满足航空电子系统对确定性和实时性的要求,针对AFDX端系统硬件结构,功能需求和Linux驱动程序的特点,提出了一种满足AFDX协议的Linux内核态驱动程序的实现方法。在Linux内核态驱
2011-04-12 16:11:5540
s3c2440 mmc和camera的linux驱动
本站提供的s3c2440 mmc和camera的linux驱动资料,详细讲诉了s3c2440 mmc和camera的linux驱动的步骤,希望对你的学习有所帮助。
2011-05-25 15:53:0654
Linux设备驱动程序的编写
本站提供的Linux设备驱动程序的编写资料,希望对你的学习有帮助。 世界各地都有人在钻研Linux内核,大多是在写设备驱动程序。尽管每个驱动程序都不一样,而且你还要知道自己设备
2011-05-25 16:24:39108
基于Linux的步进电机驱动程序设计
介绍了Linux驱动程序的实现机制,在分析步进电机和驱动程序接口的基础上,给出了一个在嵌入式Linux平台上编写步进电机驱动的实例。本平台基于SAMSUNG公司的S3C2410X CPU,采用Linux2.4内核作
2011-06-15 14:22:585476
基于S3C2440嵌入式Linux的步进电机驱动程序
在嵌入式Linux开发过程中需要为指定设备编写和编译驱动程序,这与以往在PC机上的Linux驱动开发明显不同,本文设计了基于S3C2440嵌入式Linux下激光雕刻系统的 步进电机 驱动程序。 1 硬
2011-09-27 11:56:532215
Linux下CPLD驱动程序
Linux下CPLD驱动程序:
static struct class *cpld_class; //自动创建设备文件时需要先创建类
static struct
2012-05-10 13:57:575440
Windows CENET中断架构分析和高速AD驱动程序的开发
本文分析了Windows CE.NET嵌入式实时系统的中断架构和流式驱动架构 及其设备驱动程序的开发方法。实现了该系统下的高速AD驱动程序的开发并进行了实际测试 。
2016-04-18 10:02:170
以ARM9为平台基于Linux2.6.30开发DS18B20的驱动程序
本文介绍了Linux设备驱动程序的类型和文件操作接口函数,以及驱动程序的基本开发过程。以ARM9为平台,基于Linux2.6.30开发DS18B20的驱动程序,以模块的形式加载到内核,最后通过应用层
2017-10-17 10:14:301
Linux字符设备驱动程序的实现
一、Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序
2017-10-21 09:54:310
嵌入式Linux下的LCD驱动程序设计方案解析
随着嵌入式Linux的迅速发展,由于其没有昂贵的版权费,完全开放源代码,可裁减性与可移植性,因此是开发嵌入式产品的优秀操作系统平台。设备驱动程序是Linux内核的重要组成部分,运行在Linux内核
2017-10-30 10:24:300
嵌入式Linux系统中MMC卡驱动程序研究
正确地驱动MMC卡后,就可以像磁盘一样方便地存取数据。本文所研究与实现的Linux驱动程序,以Intel XScale的PXA250为硬件平台,在遵循MMC卡通信协议规范的基础上,实现了卡的底层读写。然后对传统的块设备驱动程序中的单块读写进行了改进,实现了集群读写技术,提高了卡的
2017-11-06 10:39:210
Linux系统网络驱动程序的编写
驱动程序编写 一.Linux系统设备驱动程序概述 1.1 Linux设备驱动程序分类 1.2 编写驱动程序的一些基本概念 二.Linux系统网络设备驱动程序 2.1 网络驱动程序的结构 2.2 网络驱动程序的基本方法 2.3 网络驱动程序中用到的数据结构 2.4 常用的系统支持 三。编写Linux网络驱动程序中
2017-11-07 10:40:300
Linux驱动程序缺陷检测研究
驱动程序是操作系统的重要组成部分。驱动程序运行于内核态,其可靠性对于操作系统的安全可靠非常关键。针对Linux驱动程序,研究基于符号执行的驱动程序缺陷自动检测方法。提出了基于性质制导符号执行
2017-11-21 15:26:219
mmc卡和sd卡的区别是什么
mmc卡和sd卡已经是目前运用广泛的两种的内存卡。本文以mmc卡和sd卡为中心,主要介绍了它门两者的结构应用,mmc卡和sd卡之间的区别来进行话题的展开。
2017-12-16 09:06:5845788
可动态安装的Linux设备驱动程序
为了增跟内核的灵活性和为了方便,设各驱动程序应被设计为一个可动态安装的内核模块。于是,一个典型的Linux设备驱动程序应包含如下几部分代码:
2018-04-04 10:56:00882
嵌入式Linux设备驱动程序开发基础知识总结免费下载
本文档的主要内容详细介绍的是嵌入式Linux设备驱动程序开发基础知识总结免费下载
嵌入式Linux设备驱动程序分类静态加载的驱动程序动态加载的驱动程序
Linux将设备按照功能特性划分为三种类型:字符设备,块设备和网络设备。
2018-10-23 16:10:5613
Linux设备驱动程序的平台驱动程序和字符驱动程序介绍
了解Linux设备驱动程序的基础知识,重点介绍平台驱动程序和字符驱动程序。
提出了简单的平台驱动程序实现和简单的字符驱动程序实现。
2018-11-27 06:32:003949
Linux设备驱动程序基础知识的了解
了解Linux设备驱动程序的基础知识,重点关注设备节点,内核框架,虚拟文件系统和内核模块。
提出了一个简单的内核模块实现。
2018-11-26 06:51:002886
需要了解Linux V4L2的驱动架构
video4linux2(V4L2)是Linux内核中关于视频设备的中间驱动层,向上为Linux应用程序访问视频设备提供了通用接口,向下为linux中设备驱动程序开发提供了统一的V4L2框架。
2019-04-28 17:29:13890
如何写一个Linux设备驱动程序
首先说明:写这个第一个Linux设备驱动程序的目的是熟悉Linux驱动的框架以及编程流程,所以是通过打印的信息来观察程序运行的情况,并不是真正的实现了某一个具体设备的驱动,可以类比于C语言编程中的“Hello World”。
2020-04-12 10:13:444016
如何编写基于ARM的裸机程序和基于Linux的驱动程序
在嵌入式开发中,ADC应用比较频繁,本文主要讲解ADC的基本原理以及如何编写基于ARM的裸机程序和基于Linux的驱动程序。
2020-09-13 09:25:502976
如何使用Linux内核实现USB驱动程序框架
Linux内核提供了完整的USB驱动程序框架。USB总线采用树形结构,在一条总线上只能有唯一的主机设备。 Linux内核从主机和设备两个角度观察USB总线结构。本节介绍 Linux内核USB驱动程序
2020-11-06 17:59:1719
嵌入式Linux平台下SD卡使用
说明在嵌入式开发中,SD卡是比较常用的器件,记录下其使用方法。底层配置驱动调试。内核配置。Linux内核选项device deivers -> mmc/sd card support
2021-11-01 17:21:264
嵌入式Linux驱动程序和应用程序开发大全
1.嵌入式Linux驱动程序开发嵌入式Linux驱动程序开发包罗万象,基本上每个点都要大概了解一下。1.1软件工具Makefile必须要掌握一些,至于Kconfig太简单了只是个配置文件算不上程序
2021-11-01 18:00:131
细说嵌入式驱动程序设计
嵌入式系统驱动程序的开发有别于WIndows或Linux。后者除了必须了解新设备的硬件特性,把控制硬件的程序尽快完成之外,还需要设法让驱动程序符合Windows或Linux的规定(大且复杂的架构
2021-11-03 13:21:0111
如何配置和操作Linux驱动程序开发板
本文档概述了利用Linux开发板为 Linux 内核开发驱动程序的基础知识,并简单介绍了如何配置和操作 Linux 驱动程序开发板。
2022-02-15 13:36:342499
基于S3C2440嵌入式Linux步进电机驱动程序
在嵌入式Linux开发过程中需要为指定设备编写和编译驱动程序,这与以往在PC机上的Linux驱动开发明显不同,本文设计了基
于S3C2440嵌入式Linux下激光雕刻系统的步进电机驱动程序。
2023-03-21 11:42:010
评论
查看更多