Linux 2.6 的 MMC Core

    技术2022-05-11  84

    以下整理自 Jollen 笔记(非教学文件),许多地方未能清楚交待,这部份有请大家自行补齐了。本文分享给有志研究 Linux MMC 驱动程序实作(MMC Core)的朋友参考。以下分析基于 Linux 2.6.17 .7,更新版本的 kernel 加入了许多 patch(例如 Linux 2.6.19 SDHC patch),这些更新内容不在讨论之列。

        续前一篇日记「Linux(open source)的 SD/MMC/SDIO 支援现况概要」所提到的,目前的 Linux SD/MMC/SDIO 「严格来说」,只支持 MMC 记忆卡,如果是要插上 SD 记忆卡,使用上则会有诸多限制。

    Linux 驱动程序的角度来看,单就 MMC 的部份来分析的话,Linux SD/MMC 驱动程序层包含以下实作(Kconfig):

    CONFIG_MMC CONFIG_MMC_BLOCK

    相关档案位于 drivers/mmc/ 目录,我们由 Makefile 来找到实作档案:

    # 

    # Core                                                 

    #                                                      

    obj-$(CONFIG_MMC)               += mmc_core.o           

                                                           

    #                                                       

    # Media drivers                                        

    #                                                      

    obj-$(CONFIG_MMC_BLOCK)         += mmc_block.o          

                                                           

    #                                                       

    # Host drivers                                         

    #                                                      

    obj-$(CONFIG_MMC_ARMMMCI)       += mmci.o              

    obj-$(CONFIG_MMC_PXA)           += pxamci.o            

    obj-$(CONFIG_MMC_IMX)           += imxmmc.o            

    obj-$(CONFIG_MMC_SDHCI)         += sdhci.o             

    obj-$(CONFIG_MMC_WBSD)          += wbsd.o              

    obj-$(CONFIG_MMC_AU1X)          += au1xmmc.o           

    obj-$(CONFIG_MMC_OMAP)          += omap.o              

    obj-$(CONFIG_MMC_AT91RM9200)    += at91_mci.o          

                                                           

    mmc_core-y := mmc.o mmc_queue.o mmc_sysfs.o             

    Host controller 驱动程序的部份先不讨论,MMC Core API 层的实作档案整理如下:

    drivers/mmc/mmc.c:主要的 MMC command protocol 实作。 drivers/mmc/mmc_queue.cI/O Request Queue 的实作。 drivers/mmc/mmc_sysfs.cLinux 2.6 kobject sysfs 实作。 drivers/mmc/mmc_block.c:区块层架构实作,即 interface to user-space file operation 部份。

    由此可知,MMC Core 层包含以下原始程序代码:

    drivers/mmc/mmc.c drivers/mmc/mmc_queue.c drivers/mmc/mmc_sysfs.c

    区块层部份,mmc_block.c devfs 的方式向 kernel 注册:

    static struct mmc_driver mmc_driver = {

             .drv             = {

                     .name    = "mmcblk",

             },

             .probe           = mmc_blk_probe,

             .remove          = mmc_blk_remove,

             .suspend         = mmc_blk_suspend,

             .resume          = mmc_blk_resume,

    };

     

    static int __init mmc_blk_init(void)

    {

             int res = -ENOMEM;

     

             res = register_blkdev(major, "mmc");

             if (res < 0) {

                     printk(KERN_WARNING "Unable to get major %d for MMC media: %d/n",

                            major, res);

                     goto out;

             }

             if (major == 0)

                     major = res;

     

             devfs_mk_dir("mmc");

             return mmc_register_driver(&mmc_driver);

     

     out:

             return res;

    }

    ...

    module_init(mmc_blk_init);

    mmc_register_driver() MMC Core 层注册,接着 MMC Core 再对 kobject 做注册。学过 Linux 2.6 驱动程序的朋友都晓得,Core API 层必须呼叫 driver_register() kobject 注册为 Driver;对于底层(machine-dependent)的 host controller 驱动程序而言,则必须向 kobject 注册为 Platform Driver

    由于 kobject callback fops probe method,所以 mmc_blk_probe() 函数就是 MMC 区块层的进入点(entry point)。所以,MMC 区块层的一切动作就要由 mmc_blk_probe() 函数看起。Linux 2.6.17 .7 MMC 区块层使用到大家所熟悉的 genhd.c 层。

    至于 Linux 区块层驱动程序最重要的「初始化 I/O request queue」动作,则是同样在 mmc_blk_probe() 阶段呼叫到 MMC Core 层的 mmc_init_queue() 来完成。

    了解 Linux MMC 整体架构后,便能开始深入研究「规格的实作」部份。

     


    最新回复(0)