Linux 2.6 的 MMC Core

以下整理自 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.c:I/O Request Queue 的实作。 drivers/mmc/mmc_sysfs.c:Linux 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 整体架构后,便能开始深入研究「规格的实作」部份。

有事者,事竟成;破釜沉舟,百二秦关终归楚;苦心人,

Linux 2.6 的 MMC Core

相关文章:

你感兴趣的文章:

标签云: