Linux MMC/SD/SDIO体系结构
有关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);
};
博客http://blog.chinaunix.net/u3/101649/showart.php?id=2232724对S3C2440的HOST驱动进行了详细的分析。
接下来说说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 card->sdio_func[i]);
if (err)
goto remove_added;
}
....
}
所以它除了调用mmc_bus_type结构体的match和probe函数来查找到适合该设备的驱动外,也调用sdio_bus_type结构体的match和probe函数来查找到适合该设备的驱动。
分享到:
相关推荐
我们进行嵌入式开发时,常会遇到SD卡驱动或者扩展SDIO模块,ST提供的SD卡HAL标准库中常出现SDMMC,为什么SD经常与MMC一块出现,SD与SDIO又有什么关系呢? 一、SD/MMC/SDIO概念区分 MMC(MultiMediaCard)从本质上看,...
SD\MMC\SDIO\TF卡的读写协议资料,SD 卡系统是一个新的大容量存储系统,基于半导体技术的变革。 它的出现,提供了一个便宜的、结实的卡片式的存储媒介,为了消费多媒体应用。 SD 卡可以设计出便宜的播放器和驱动器而...
SD SDIO MMC 初始化经典解析
SDIO 接口,实现SD卡的控制器功能,带有详细的注释
应用程序需要用MMC/SD卡来提供可移动数据的存储。 该外设提供一个接口 用来控制MMC卡和SD卡,他们之间的通信协议是基于MMC/SD协议。 支持MMC和SD接口以及SDIO协 议。
SD/SDIO 全部文档 SD specV6.0 SDIO V4.0 part part1 part2 partA5 partE7
树莓派4B无线网卡wifi不识别(Centos8)驱动 文件复制到目录/usr/lib/firmwear/brcm重启即可
摘要视图2016年10月23日 01:43:21分类:8115人阅读评论(0)收藏版权声明:本文为博主原创文章,未经博主允许不得转载。* * SD卡的操作模式:
SD3.0文档+SPI+SDIO模式___MMC卡时序
SD协议,包括SD卡、SD host、SDIO等,详细如下: Part1_NFC_Interface_Simplified_Addendum_Ver1.00.pdf Part1_Physical_Layer_Simplified_Specification_Ver1.01.pdf Part1_Physical_Layer_Simplified_...
由于bank电平原因emmc必须接到emio上,此时就需要注意比直接从ps端出来的考虑问题要多一些。该文章经过实际操作总结得出,具有参考价值。
MMC SD SDIO主控制器.doc
SDIO 规范定义了一个 SD 卡可能包含不同的 IO 单元同 SD host 之间的接口。SDIO 卡可以包含存储功能,以及 IO 功能。SDIO 卡的存储部分应该完全兼容 SD 卡规范。SDIO 卡基于并兼容 SD 卡。这种兼容包括机械、电气、...
第73讲 SD卡实验(SDIO方式)第73讲 SD卡实验(SDIO方式
STM32 使用SDIO配置SD卡,读取SD卡大小
SDIO 接口的外设,SDIO 接口官方协议。
sdio 海思平台上3511-3520sd,sdio,mmc卡的linux驱动,解释很详细-sdio Hisilicon platform 3511-3520sd, sdio, mmc card linux driver, explained in great detail
SD卡 MMC卡 SDIO卡 TF卡资料SD卡V1.0 2.0协议 SD卡读写规范SD卡中文数据手册合集共计26个文档资料包括SD卡-中文学习笔记,SD卡要点说明,接口规范,SD卡2.0协议等。
MMC_SD_SendCommand(uint8 cmd, uint32 arg)
主控手册,使用文档开发文件 SoC Broadcom BCM2835 (CPU, GPU, DSP, and SDRAM) CPU: 700 MHz ARM1176JZF-S core (ARM11 family) GPU: Broadcom VideoCore IV, OpenGL ES ... Storage via SD/ MMC/ SDIO card slot