linux4 3 2 塊裝置驅動簡析 2

2021-07-09 21:15:22 字數 1643 閱讀 9401

上次我們了解到,mmc card裝置驅動通過mmc_bus_type這條匯流排找到了block驅動,由block驅動去載入該裝置。今天我們再進一步去了解這整個過程。

我們都知道,mmc card的驅動需要啟動中斷並配合定時器去檢測是否有卡插入,那這個功能是在**實現的呢?

在函式 mmc_alloc_host中有這乙個呼叫

init_delayed_work(&host->detect, mmc_rescan),它將函式工作佇列執行函式mmc_rescan放置到乙個延時工作佇列中,等待啟動。

在平台裝置驅動

sdhci_arasan_probe中:

sdhci_add_host(host)->

sdhci_enable_card_detection(host)->

sdhci_unmask_irqs(host, irqs)去啟動中斷檢測功能,接著我們看看中斷檢測功能裡面有些什麼。在中斷函式

sdhci_irq裡面如果發現有card插入就會呼叫

tasklet_schedule(&host->card_tasklet),執行註冊在該card_tasklet上的函式實體——

sdhci_tasklet_card,該函式裡面呼叫了2個函式,從命名上看,我們應該更加關心後面乙個函式

mmc_detect_change,傳入的引數是將200ms轉化為系統能夠是別的

jiffies,一層一層最後呼叫函式

mmc_schedule_delayed_work(&host->detect, delay),延時200ms啟動mmc_rescan函式。

我們回到函式mmc_rescan,該函式裡面呼叫了

mmc_rescan_try_freq(host, max(freqs[i], host->f_min))去進一步掃瞄card,呼叫

mmc_attach_sdio(host)去掃瞄是否是sdio介面的卡,如果是則主要呼叫函式

mmc_sdio_init_card(host, rocr, null, 0)去初始化該卡,裡面最為重要的函式呼叫時

mmc_alloc_card(host, null),因為在該函式中,對card device進行初始化和引數配置的,可以看到最重要一句——

card->dev.bus = &mmc_bus_type,此處就真正的將device和driver通過匯流排關聯起來了。

我們把整個流程串起來看,簡單來說就是:

載入platform裝置 -> 啟動平台驅動 -> 生成 host驅動,包含乙個中斷檢測功能 ----> 在/dev目錄下生成mmc0、mmc1等裝置檔案

此時中斷觸發->構造乙個card裝置驅動,並註冊到mmc匯流排上線->->關聯到匯流排上的block驅動->在/dev目錄下生成mmcblk0、mmcblk1等檔案---->

至此生成了塊裝置檔案。

接下來看看如何才和mmc匯流排上的block驅動關聯起來,主要流程如下:

1. 通過匯流排函式bus_mach對device和driver做匹配,返回非0表示匹配成功,好像mmc的mach函式直接返回1

2. 把該drv賦值給dev,通過呼叫bus的probe函式對該dev進行探測

3. 通過drv的probe函式對該dev進行探測

Linux塊裝置驅動

塊裝置提供塊裝置提供裝置的訪問,裝置的訪問,可以隨機的以固定大小的塊傳輸資料,例如我們最為常見的磁碟裝置,當然塊裝置和字元裝置有較大差別,塊裝置有自己的驅動介面。簡單來說,核心決定乙個塊是固定的4096 位元組,當然該值可以隨著依賴檔案系統的變化而改變。塊裝置驅動採用register blkdev向...

linux 裝置模型簡析

file operations 不可能被拋棄。它是字元裝置的基礎結構,各種裝置模型或者說匯流排,只是對字元裝置進行了包裝。驅動一定是核心模組 核心模組不一定是驅動 裝置模型的初衷 是省電 建立一條 掛有 所有裝置的樹 全域性裝置樹 與使用者空間的通訊 裝置間的通訊 都是通過 sysfs檔案系統實現的...

linux驅動之塊裝置驅動

塊裝置驅動的系統架構 塊裝置註冊過程 1,註冊裝置塊驅動程式 register blkdev 2,初始化請求佇列 blk init queue 3,指明扇區的大小 blk queue logical block size dev queue,sect size 4,申請乙個gendisk結構,初始化...