1. 程式人生 > 其它 >linux驅動移植-platform匯流排分析 14.linux-platform機制實現驅動層分離(詳解)

linux驅動移植-platform匯流排分析 14.linux-platform機制實現驅動層分離(詳解)

一、platform匯流排介紹

在看到platform匯流排時,不知道你心裡有沒有疑問?platform匯流排是什麼,有什麼用?在解答這個問題之前,我們先聊點linux驅動的分離。

1.1 linux驅動的分離

我們知道linux作業系統可以執行在各種SOC上,比如我們熟知的SOC晶片S3C2440 S3C6410和S5PV210等,由於處理器晶片的不同,那麼就會導致即使對於同一硬體裝置,其驅動程式也會略有不同,這就造成核心程式碼很冗餘。

以SOC通過I2C控制三軸加速度陀螺儀MPU6550為例:

從圖中可以看到不同的SOC都有一自己的I2C控制器驅動和裝置驅動,因為每個SOC的I2C控制器不同,所以每個SOC必須有自己的I2C控制器驅動,但是MPU6050是一樣的,所以完全可以共用一套裝置驅動程式碼。

完善後的框架如下:

當然,這只是對於 I2C 下的 MPU6050 這個裝置,實際情況下,I2C 下肯定會掛載很多裝置,根據這個思路,我們可以得到框架為:

然而在實際開發中,I2C控制器驅動半導體廠家會編好,裝置驅動也會由裝置廠家編好,我們只需要提供裝置資訊即可,如裝置接到哪個I2C介面上,I2C速度為多少。

這樣就相當於把裝置資訊從裝置驅動中剝離出來,而裝置驅動也會用標準方法去獲取裝置資訊(如從裝置樹中獲取裝置資訊),這樣就相當於驅動只負責驅動,裝置(資訊)只負責裝置,想辦法將兩者進行匹配即可,來做這個匹配工作的就是匯流排,這就構成了linux中的匯流排-驅動-裝置模型。結構圖如下:

 

1.2 platform驅動模型

上面我們介紹了裝置驅動的分離,得到匯流排-驅動-裝置模型,這個匯流排就是我們平常所說的I2C、SPI、USB、UART等匯流排,這些也都是物理匯流排。然而並不是所有裝置都是通過匯流排和SOC連線的,為此linux從2.6就加入了platform裝置驅動,也就做平臺裝置驅動,它是一條虛擬的匯流排,並不是一個物理的匯流排。如下圖所示:

這裡需要注意的是,platform 匯流排是區別於 USB、SPI、I2C 這些匯流排的虛擬匯流排。說它虛擬是因為 SOC 與一些外設如 LED、定時器、蜂鳴器是通過記憶體的定址空間來進行定址的,所以 CPU 與這些裝置通訊壓根就不需要匯流排,那麼硬體上也就沒有這樣一個匯流排。但核心有對這些裝置做統一管理的需求,所以就對這些直接通過記憶體定址的裝置虛擬了一條 platform 匯流排,所有直接通過記憶體定址的裝置都對映到這條虛擬總線上。

platform 匯流排的優點:

  • 通過 platform 匯流排,可以遍歷所有掛載在 platform 總線上的裝置;
  • 裝置和驅動的分離,通過 platform 匯流排,裝置和驅動是分開註冊的,因為有 probe 函式,可以隨時檢測與裝置匹配的驅動,匹配成功就會把這個驅動向核心註冊;
  • 一個驅動可供同類的幾個裝置使用,這個功能的實現是因為驅動註冊過程中有一個遍歷裝置的操作。 

參考文章

[1]Linux驅動之platform匯流排詳解

[2]一張圖掌握 Linux platform 平臺裝置驅動框架

[3]十一、Linux驅動之platform匯流排裝置驅動

[4]14.linux-platform機制實現驅動層分離(詳解)