一、s3cmci_ops分析
在上一篇文章中我們分析了Mini2440 MMC/SD驅(qū)動(dòng)的probe函數(shù)s3cmci_probe。在該函數(shù)中初始化了struct mmc_host指針變量mmc,其中,設(shè)置mmc->ops為s3cmci_ops,s3cmci_ops定義在drivers/mmc /host/s3cmci.c文件中:
struct mmc_host是mmc core層與host層的接口,mmc_host.ops是控制host完成用戶請求的接口函數(shù)集,其類型是struct mmc_host_ops,該結(jié)構(gòu)體定義在include/linux/mmc/host.h文件中:
request函數(shù)用于處理用戶的請求。
set_ios函數(shù)用于設(shè)置SDI的控制參數(shù),如時(shí)鐘、總線寬度等等。
get_ro函數(shù)用于探測SD卡是否有寫保護(hù)。
get_cd函數(shù)用于探測卡是否已插入插槽。
enable_sdio_irq函數(shù)用于啟動(dòng)或禁用SDI中斷。
需要注意的是,為什么沒有對MMC/SD進(jìn)行讀寫的read和write函數(shù)呢?這是因?yàn)長inux塊設(shè)備的讀寫操作是通過request函數(shù)完成的。
那么對于Mini2440,它的s3cmci_ops中的成員函數(shù)在什么時(shí)候會(huì)被調(diào)用呢?舉例如下:
在drivers/mmc/core/core.c文件中:
可以看到255行,調(diào)用了host->ops->request函數(shù),即s3cmci_request函數(shù)。
再比如,在drivers/mmc/core/core.c文件中:
可以看到,970行,調(diào)用了host->ops->set_ios函數(shù),即s3cmci_set_ios函數(shù)。
下面我們就來看一下s3cmci_ops的各個(gè)成員函數(shù)的實(shí)現(xiàn)。
s3cmci_get_ro函數(shù)定義在drivers/mmc/host/s3cmci.c文件中: