Linux中SD、MMC设备驱动流程4.1.MMC子系统的基本框架4.1.1.MMC子系统的代码在kernel/driver/MMC下面,目前MMC子系统支持一些形式的**卡:SD,SDIO,MMC。4.1.2.HOST:针对不同主机的驱动程序,这一部分需要根据自己的特定平台来完成。4.1.3.CORE:这是整个MMC的核心层,这部分完成了不同协议和规范的实现,并且为HOST层的驱动提供接口函数。4.1.4.CARD:因为这些**卡都是块设备,当然需要提供块设备的驱动程序,这部分就是实现了将SD卡如何实现为块设备的。
4.1.5.各层之间的关系
4.2.重要的结构体4.2.1. struct mmc_host 用来描述卡控制器位kernel/include/linux/mmc/host.h下面。4.2.2.struct mmc_card 用来描述卡位于kernel/include/linux/mmc/card.h下面4.2.3.struct mmc_driver 用来描述mmc卡驱动在kernel/include/linux/mmc/card.h下面。4.2.4.struct mmc_host_ops用来描述卡控制器操作集,用于从主机控制器向core层注册操作函数,从而将core层与具体的主机控制器隔离。也就是说core要操作主机控制器,就是这个ops当中给的函数指针操作,不能直接调用具体主控制器的函数。
位于kernel/include/linux/mmc/host.h下面。2.5.struct mmc_ios用于描述了控制器对卡的I/O状态。位于kernel/include/linux/mmc/host.h下面。4.2.6.struct mmc_request用于描述读写MMC卡的请求,它包括命令,数据以及请求完成后的回调函数。位于kernel/include/linux/mmc/core.h中。4.2.7.struct mmc_queue是MMC的请求队列结构,它封装了通用请求队列结构,加入了MMC卡相关结构。位于kernel/drivers/mmc/card/queue.h中。4.2.8.struct mmc_data描述了MMC卡读写的数据相关信息,如:请求,操作命令,数据以及状态等。位于kernel/include/linux/mmc/core.h中。4.2.9.struct mmc_command描述了MMC卡操作相关命令及数据,状态信息等。位于kernel/include/linux/mmc/core.h中。4.3.host,core以及card之间的关联和处理流程4.3.1总体的流程如下图所示
4.3.2.数据.命令的处理流程在代码分析那里会仔细分析4.4:核心任务
MMC/SD卡的驱动整个构架由三个文件组成,其实一共就做了两件事件:
1).卡的检测。
2).卡数据的读取。4.4.1.卡的检测中涉及到的函数
tcc_mmc_probe(host/tcc_sdhc.c)
mmc_alloc_host(core/core.c)
mmc_rescan(core/core.c)
mmc_attach_mmc(core/mmc.c)
mmc_init_card(core/mmc.c)
mmc_add_card(core/bus.c)
device_add
mmc_bus_match(core/bus.c)
mmc_bus_probe(core/bus.c) mmc_blk_probe(card/block.c)
alloc_disk/add_disk 4.4.2.卡中数据读写涉及到的函数
mmc_blk_issue_rq(card/block.c)
mmc_wait_for_req(core/core.c)
mmc_start_request(core/core.c)
host->ops->requset(host,mrq)
//tcc_sdhc.c中的tcc_mmc_request |