Linux设备驱动程序架构分析之MMC/SD(六)
2015-04-29
一、s3cmci_ops分析
在上一篇文章中我们分析了Mini2440 MMC/SD驱动的probe函数s3cmci_probe。在该函数中初始化了struct mmc_host指针变量mmc,其中,设置mmc->ops为s3cmci_ops,s3cmci_ops定义在drivers/mmc /host/s3cmci.c文件中:
struct mmc_host是mmc core层与host层的接口,mmc_host.ops是控制host完成用户请求的接口函数集,其类型是struct mmc_host_ops,该结构体定义在include/linux/mmc/host.h文件中:
request函数用于处理用户的请求。
set_ios函数用于设置SDI的控制参数,如时钟、总线宽度等等。
get_ro函数用于探测SD卡是否有写保护。
get_cd函数用于探测卡是否已插入插槽。
enable_sdio_irq函数用于启动或禁用SDI中断。
需要注意的是,为什么没有对MMC/SD进行读写的read和write函数呢?这是因为Linux块设备的读写操作是通过request函数完成的。
那么对于Mini2440,它的s3cmci_ops中的成员函数在什么时候会被调用呢?举例如下:
在drivers/mmc/core/core.c文件中:
可以看到255行,调用了host->ops->request函数,即s3cmci_request函数。
再比如,在drivers/mmc/core/core.c文件中:
可以看到,970行,调用了host->ops->set_ios函数,即s3cmci_set_ios函数。
下面我们就来看一下s3cmci_ops的各个成员函数的实现。
s3cmci_get_ro函数定义在drivers/mmc/host/s3cmci.c文件中:
