最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

[ZT][筆記] Linux 2.6 的 MMC Core

SD/MMC crifan 1928浏览 0评论

[ZT][筆記] 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 來找到實作檔案:

#                                                       <br /># Core                                                  <br />#                                                       <br /><font color="#ff0000">obj-$(CONFIG_MMC)               += mmc_core.o   </font> <br /> <br />#                                                       <br /># Media drivers                                         <br />#                                                       <br /><font color="#ff0000">obj-$(CONFIG_MMC_BLOCK)         += mmc_block.o   </font> <br /> <br />#                                                       <br /># Host drivers                                          <br />#                                                       <br />obj-$(CONFIG_MMC_ARMMMCI)       += mmci.o               <br />obj-$(CONFIG_MMC_PXA)           += pxamci.o             <br />obj-$(CONFIG_MMC_IMX)           += imxmmc.o             <br />obj-$(CONFIG_MMC_SDHCI)         += sdhci.o              <br />obj-$(CONFIG_MMC_WBSD)          += wbsd.o               <br />obj-$(CONFIG_MMC_AU1X)          += au1xmmc.o            <br />obj-$(CONFIG_MMC_OMAP)          += omap.o               <br />obj-$(CONFIG_MMC_AT91RM9200)    += at91_mci.o           <br /> <br />mmc_core-y := <font color="#ff0000">mmc.o mmc_queue.o mmc_sysfs.o  </font>

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 <strong><font color="#ff0000">mmc_driver</font></strong> = {<br /> .drv  = {<br />  .name = &quot;mmcblk&quot;,<br /> },<br /> .probe  = mmc_blk_probe,<br /> .remove  = mmc_blk_remove,<br /> .suspend  = mmc_blk_suspend,<br /> .resume  = mmc_blk_resume,<br />};<br /><br />static int __init mmc_blk_init(void)<br />{<br /> int res = -ENOMEM;<br /><br /> res = <strong><font color="#ff0000">register_blkdev(major, &quot;mmc&quot;);</font></strong><br /> if (res &lt; 0) {<br />  printk(KERN_WARNING &quot;Unable to get major %d for MMC media: %dn&quot;,<br />         major, res);<br />  goto out;<br /> }<br /> if (major == 0)<br />  major = res;<br /><br /> <strong><font color="#ff0000">devfs_mk_dir(&quot;mmc&quot;);</font></strong><br /> return <strong><font color="#ff0000">mmc_register_driver(&amp;mmc_driver);</font></strong><br /><br /> out:<br /> return res;<br />}<br />...<br />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 整體架構後,便能開始深入研究「規格的實作」部份。

–jollen

转载请注明:在路上 » [ZT][筆記] Linux 2.6 的 MMC Core

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
83 queries in 0.162 seconds, using 22.07MB memory