涉及到的文件有:Sd.c (mediatek\platform\mt6577\kernel\drivers\mmc-host)
Mt6577_devs.c (mediatek\platform\mt6577\kernel\core)
下面就整个驱动的流程过一下:
系统起来的时候执行static int __init mt_msdc_init(void)在这个函数里最重要的是执行platform_driver_register(&mt_msdc_driver),即注册到内核的虚拟总线上,注册的原则是把驱动mt_msdc_driver各参数进行初始化。
下面进入变量mt_msdc_driver各成员的初始化。其中最重要的成员是msdc_drv_probe的执行。当在虚拟platform总线上driver和device的名字DRV_NAME(#define DRV_NAME "mtk-sd")相匹配时即执行probe函数。
下面先看看文件Mt6577_devs.c 中的static struct platform_device mt6577_device_sd[] =
#if defined(CFG_DEV_MSDC0)
{
.name = "mtk-sd",
.id = 0,
.num_resources = ARRAY_SIZE(mt6577_resource_sd0),
.resource = mt6577_resource_sd0,
.dev = {
.platform_data = &msdc0_hw,
},
},
#endif
从这个结构体可以得出platform_device和platform_driver的name是相同的,所以会遍历到执行probe函数,这个结构体中有个重要的参数mt6577_resource_sd0,这个成员即是SD卡的初始状态值:
#if defined(CFG_DEV_MSDC0)
static struct resource mt6577_resource_sd0[] = {
{
.start = MSDC_0_BASE,
.end = MSDC_0_BASE + 0x108,
.flags = IORESOURCE_MEM,
},
{
.start = MT6577_MSDC0_IRQ_ID,
.flags = IORESOURCE_IRQ,
},
};
#endif
这个相当于SD卡的私有数据。
来分析下static int msdc_drv_probe(struct platform_device *pdev)
mmc = mmc_alloc_host(sizeof(struct msdc_host), &pdev->dev); mmc->ops = &mt_msdc_ops;//SD卡的处理函数