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

 

 

 

=================================================================================================

=================================================================================================

关于linux 2.6 mmc/sd驱动

linux 2.6 中的mmc/sd驱动分为以下几方面的内容
1. sysfs 层的总线类型处理: 注册一组 mmc 类型处理函数, 标志为 "mmc"
2. mmc/sd 快设备管理:注册一个块设备和一组 mmc 总线类型的 driver 子函数, 实现块设备的队列管理等
3. mmc/sd host管理: 实现 host 的管理
4. 针对特定的mcu实现一个host驱动实例:主要是注册一个 host实体,中断处理函数,io设置函数,请求处理函数等


以上1.2.3基本是不需要修改的,需要处理的就是 4.要做的工作. 当有卡插入时,由4中实现的插卡中断激活卡初始化程序和总线探测函数. 由mmc总线探测函数会调用块设备的探测函数,在卡设备探测函数中会初始化块设备的请求队列和注册一个gendisk实体(以后文件系统会通过gendisk实体访问 mmc 块设备),同时在sysfs中建立真正的 mmc/sd 设备.块设备通过具体的 host 注册的io设置函数和请求函数与具体的host通讯.


 

 原文地址 http://www.ednchina.com/blog/mcu_study/19902/message.aspx

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐