linux设备模型之mmc子系统

时间:2024-03-15 15:52:34
翻开mmc子系统驱动代码在Linux源码中的位置linux-3.4.y/drivers/mmc,分别有cardcorehost三个文件夹, cardcorehost这三层的关系,如下图:
linux设备模型之mmc子系统
从这幅图中的关系:
1、 card层针对不同客户端的设备驱动程序,如SD卡、SDIO接口的串口设备驱动,card目录下的block.c、queue.c向它提供几个函数操作队列,调用core目录下的core.c、 sdio_io.c、sdio_ops.c提供的接口来初始化SDIO卡、读写SDIO卡等功能。
(1)block.c:为每个mmc设备向block子系统注册为一个块设备,并实现块设备的ops。为每个块设备创建一个request queue, 通过add_disk将磁盘添加到系统中,block子系统就可以对mmc设备进行操作。实现了请求处理函数,同时启动线程来处理block层发下来的request请求
(2)queue.c:实现request queue的创建、销毁,创建request queue的处理线程

2、 整个MMC子系统最重要的部分是Core核心层,实现不同的协议和规范,为host层和设备驱动层提供接口函数。MMC核心层由三个部分组成:MMC,SD和SDIO,分别为三类设备驱动提供SDIO卡识别、设置、读写接口函数。对上提供了将主机驱动注册到系统,给应用程序提供设备访问接口,对下提供了对主机控制器控制的方法及块设备请求的支持。
(1)core.c:是整个mmc子系统的核心,对上承接mmc子系统的block层,主要提取实现了requset相关的公有操作接口;对下承接具体的控制器,主 要提取host ios相关的初始化配置接口,以及bus_type相关的操作, 同时为host提供了相关的接口。
(2)Bus.c:定义mmc_bus_type 总线;
(3)sdio_bus.c:定义sdio_bus_type总线;
(4)mmc.c: 实现了mmc_bus_type的mmc_ops,规约了eMMC卡的初始化流程;
(5)sd.c: 实现了mmc_bus_type的mmc_sd_ops,规约了SD卡的初始化流程;
(6)sdio.c: 实现了mmc_bus_type的mmc_sdio_ops,规约了SDIO卡的初始化流程;
(7)mmc_ops.c:定义了eMMC卡相关的一系列操作接口,如go idle,设置电压,设置速率模式
(8)sd_ops.c: 定义了SD卡相关的一系列操作接口
(9)sdio_ops.c: 定义了SDIO卡相关的一系列操作接口

3、 Host 驱动层针对不同主机端的SDHC、MMC控制器的驱动,就是对相关寄存器进行读写,而对于MMC/SD设备的请求处理则比较复杂。
那么在主机驱动层中的一个请求处理是怎么通过核心层提交到块设备请求层的呢?在网上找到一副图来说明他们之间的关联和处理流程,如下图:
(1)himci.c:host controller驱动
(2)host.c:是对控制器的共有操作进行抽象

linux设备模型之mmc子系统

命令、数据发送流程如下图:

linux设备模型之mmc子系统