Linux MMC子系統分析 一 模型分析

2021-10-13 19:07:30 字數 1652 閱讀 4964

linux mmc子系統分析(一)——模型分析

在linux核心中,大多數驅動都會遵循裝置匯流排驅動這個模型即device-bus-driver。mmc子系統也不例外,mmc子系統在核心中主要有三個目錄,這三個目錄也對應了三條虛擬匯流排。

card:card driver位於最上面的一層,負責驅動mmc core層抽象出來的虛擬card裝置,並將其對接到核心的其它framework例如塊裝置,ttyy以及wireless等,從而實現具體的功能。

core:core層是實現mmc的核心實現,負責抽象host、bus、card等軟體實體,並向host層提供統一的api介面,便於編寫host controller driver。

host:host位於底層,主要是基於core提供的api框架編寫實際操作硬體控制器的驅動**,這部分是驅動開發人員需要去完成的。host控制器驅動是以platform驅動的形式實現的,後續文章將以host/sdhci-s3c.c為例做進一步分析。

mmc子系統完全遵照device-bus-driver這個模型來實現的。當乙個sd卡或者其他型別的裝置接入到控制器時,我們的驅動會進行裝置探測新增的流程(具體流程在後續文章中將詳細講述),其最終會觸發呼叫bus中的match、probe等函式。接下來讓我們看一下這些函式的具體實現:

mmc_bus_type結構體

static

struct bus_type mmc_bus_type =

;

mmc_bus_match函式中定義了card和card driver中的匹配規則。在裝置匯流排驅動模型中,這個裝置和驅動的匹配規則通常是按名字來進行匹配的,如果同名即匹配成功,然後會繼續呼叫probe函式進行後續的工作。但是在mmc子系統中,是乙個無條件匹配的bus中的match函式始終返回1。

static

intmmc_bus_match

(struct device *dev,

struct device_driver *drv)

說明當乙個裝置接入控制器後,會無條件的執行probe函式,那麼來看一下probe函式中具體做了什麼吧。

static

intmmc_bus_probe

(struct device *dev)

從**中可以看見,這裡最後是呼叫了driver中的probe函式,mmc_driver結構體的具體實現在card/block.c中。看一下mmc_driver結構體中具體實現了哪些功能。

static

struct mmc_driver mmc_driver =

,.probe = mmc_blk_probe,

.remove = mmc_blk_remove,

.shutdown = mmc_blk_shutdown,

};

這裡的probe函式對應bus->probe函式中最終呼叫的那個函式,該函式最終將裝置的具體功能,會將sd卡實現為乙個塊裝置。關於快裝置的新增,不做相關介紹。

本文介紹了mmc子系統的最基本模型,以及card、bus、card driver三者之間的如何關聯在一起。後續文章將分別介紹host驅動的實現、mmc子系統中card的檢測方式、card的新增流程等內容。

pinctrl子系統分析(一)

pinctrl子系統分析 一 pinctrl子系統分析 二 pinctrl子系統分析 三 許多soc的內部都包含了pin控制器,通過pin控制器,我們可以匹配引腳的狀態和功能特性。在了解pinctrl子系統之前,我們先來了解一些基本的概念。soc的很多引腳都可以配置成不同的功能,如a1和a2兩個引腳...

framebuffer 子系統分析

fb info screen base dma alloc writecombine fbi dev,map size,map dma,gfp kernel fb info screen base 是framebuffer起始虛擬位址,也就是mmap後程式寫入fb的位址,該位址會直接寫入到fb in...

framebuffer 子系統分析

come from struct fb info ranges 0 apertures struct fb var screeninfo struct fb fix screeninfo 這兩個結構體分別記錄了顯示器可以修改和不可修改的資訊,這些資料成員需要在驅動程式中初始化。其中fix.visua...