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的中斷處理函數