關於linux 2.6 mmc/sd驅動

來源:互聯網
上載者:User

以下整理自 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.