现在的位置: 首页 > 综合 > 正文

Linux 2.6 的 MMC Core

2013年10月14日 ⁄ 综合 ⁄ 共 3147字 ⁄ 字号 评论关闭
        以下整理自 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 层的实作档案整理如下:

  1. drivers/mmc/mmc.c:主要的 MMC command protocol 实作。

  2. drivers/mmc/mmc_queue.cI/O Request Queue 的实作。

  3. drivers/mmc/mmc_sysfs.cLinux 2.6 kobject sysfs 实作。

  4. 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 整体架构后,便能开始深入研究「规格的实作」部份。

 

抱歉!评论已关闭.