SD卡在MTK6577中的架构

来源:互联网 发布:清华软件学院排名 编辑:程序博客网 时间:2024/06/06 00:31

涉及到的文件有: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);
    if (!mmc) return -ENOMEM;
    hw   = (struct msdc_hw*)pdev->dev.platform_data;
    mem  = platform_get_resource(pdev, IORESOURCE_MEM, 0);//申请驱动的内存
    irq  = platform_get_irq(pdev, 0); //中断申请

  mmc->ops        = &mt_msdc_ops;//SD卡的处理函数


原创粉丝点击