記錄一下今天上午看的mmc代碼(2.6.27)

S3C2440板子。先統計一下編譯了哪些文件,分別是

card/
    block.o   queue.o
host/
    s3cmci.o
core/
    bus.o     core.o     host.o
及sd,mmc,sdio 3種規範的相關文件:
    sd:   sd.o     sd_ops.o
    mmc:  mmc.o    mmc_ops.o
    sdio: sdio.o   sdio_ops.o     sdio_bus.o   sdio_cis.o    sdio_io.o     sdio_irq.o

看別人寫的抄下來的流程:
1. 內核啓動initcall  ==>>  mmc_init() ==>>  mmc_blk_init()
2. xx_mmc_probe 檢測掛在的設備
3. 起延時任務mmc_rescan()對卡初始化
4. mmc_attach_sd(),mmc_attach_mmc(),mmc_attach_sdio()加載設備
5. mmc_add_card()

6.卡加入系統後,mmc_blk_probe()分配mmc_blk_data結構變量
7.mmc_init_queue()初始化
8.建立線程mmc_queue_thread(),接受塊設備讀寫請求並處理

然後看代碼把每個文件做的事寫一下,有點亂
s3cmci.c
註冊s3c2410,2412,2440平臺驅動
mmc_alloc_host
硬件初始化,註冊中斷
mmc->ops = &s3cmci_ops 結構成員函數有request,set_ios,get_ro,get_cd
中斷函數s3cmci_irq()完成讀寫,中斷中起tasklet即pio_tasklet(),再區分爲do_pio_read(),do_pio_write()

block.c
註冊塊設備,主設備號179,向mmc_driver註冊驅動
mmc_blk_probe()==>>mmc_blk_alloc()==>>mmc_init_queue()在此函數中起線程.線程函數是queue.c中的mmc_queue_thread()
在線程中根據blk_queue_plugged()判斷隊列是否有插入,取得elv_next_request()的返回值struct request*,調用mq->issue_fn函數即block.c的mmc_blk_issue_irq()處理,在mmc_wait_for_req()函數種把請求傳給host->ops->request,即s3cmci_ops中的request結構成員函數

bus.c
struct mmc_card結構相關
提供函數alloc card(),add_card(), 在add_card()中調用device_add()添加設備
向系統註冊總線mmc_bus_type
把block.c註冊過來的mmc_driver註冊爲系統的驅動

core.c
mmc_rescan()分辨檢測卡
mmc_init()起工作隊列,初始檢測及熱插拔時detect用
調用註冊總線,註冊class

host.c
與s3cmci.c相關聯的文件,找到設備前先假設有設備,mmc_alloc_host()起工作隊列mmc_rescan()檢測設備,未檢測到釋放host,檢測到了調用device_add添加設備

只看mmc規範
mmc.c
mmc_rescan中找到卡後調用mmc_attach_mmc初始化卡,提供detect函數每次檢測卡是否拔出

mmc_ops.c
mmc的具體命令,比如go_idle(),send_cid()等

分辨sdio,mmc,sd卡,通過發命令,具體命令我不確定
發送cmd5,如果有響應就是sdio,沒響應就往下走
發送cmd1,如果有響應就是mmc,如果沒響應就是sd

卡插入中斷後的處理:
s3cmci,c中的s3cmci_irq_cd()==>>mmc_detect_change()==>>host->detect()==>>mmc_detect()
這裏的s3cmci_irq_cd()是sd卡插入檢測腳cd的中斷處理函數

發佈了45 篇原創文章 · 獲贊 1 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章