(1)什麼是platform
paltform是一種虛擬的匯流排,用於管理外設資源記憶體資源中斷資源。
在硬體上有usb-bus匯流排,pci-bus匯流排,這是在物理裝置上實際存在的匯流排。
usb-bus管理usb裝置,pci匯流排管理pci裝置。
但是在實際中,一些裝置不屬於這些匯流排,一些soc上面的控制器或者裝置。
使用platform統一管理這些裝置。
platform的乙個優點就是將驅動和裝置分開,提高驅動的移植性。
回顧傳統的字元裝置,是沒有將驅動和裝置分開的概念。
platform將驅動和裝置分開為三部分,就提高了裝置和驅動的可移植性。
platform_device platform_driver platform_bus
platform_device是基於底層的模組抽象出的,用於表示裝置,就是我們的外設,描述外設的資源,占用的io資源,irq資源
驅動用來實現驅動裝置的**
匯流排可以看做是乙個管理單元,用於管理裝置和驅動的匹配,提供裝置和驅動的匹配函式。
如何進行匹配的,哪乙個platform_device和platform_driver進行匹配呢,是按照上面方式匹配的。也是platform_bus完成的工作。這個匯流排在系統啟動的時候就會進行初始化,這樣才能完成裝置和驅動的匹配。
先分析platform啟動的過程。
系統啟動的時候會啟動乙個start_kernel()函式,
start_kernel執行一系列的初始化函式,然後呼叫rest_init(void)
rest_init會啟動乙個核心執行緒執行kernel_init函式繼續初始化
最後會呼叫到do_basic_setup函式,也是一些的初始化
呼叫driver_init函式
在driver_init函式中呼叫paltform_bus_init函式
在platform_bus_init函式裡面完成了platform虛擬裝置的初始化。
主要的**是上面的兩句
1.device_register是註冊乙個裝置,引數是乙個結構體指標,定義如下
是乙個device結構體,是裝置的最基本的單元。是所有裝置的基類。
device是乙個物件導向的思想,當然還有不同的裝置,當想定義不同的裝置的時候,就繼承這個結構體,然後新增一些不同的成員。
device_register是註冊乙個裝置,註冊到核心裡面。
接下來bus_register是註冊乙個匯流排,引數是乙個不是bustype是乙個結構體指標,定義如下名字,屬性,熱插拔,電源管理
這個結構體就是描述乙個虛擬匯流排,所以,這個結構體就是對裡面platform匯流排的描述
其它的不管,但是match這個函式需要先提一下。platform_bus有兩個功能,乙個是管理裝置和驅動,乙個是實現裝置和驅動的匹配。
platform_match函式就是完成裝置和驅動匹配的函式。
上面就是匯流排的乙個註冊。
註冊完裝置和匯流排以後,platform匯流排就註冊到核心裡面了。接下來就可以使用platform匯流排架構管理裝置和驅動了。
接下來講解一些platform_device和platform_driver
platform_device中有乙個platform_device結構體,是用來描述裝置的結構體
platform_driver中有乙個platform_driver結構體,是用來描述裝置的驅動的
先看一下platform_device結構體
名字id是第幾個裝置
device是描述裝置的乙個基類,是最核心的類
num_resourcez資源的數量
*resource就是來描述裝置的資源
先介紹一些resource結構體
要描述乙個裝置,都需要哪些呢
start 資源的起始位址end資源的結束位址
名字,裝置的名字
資源,io資源,中斷資源,記憶體資源
flag表示的是什麼樣子的資源
下面又是乙個resource結構體,分被指向父節點,兄弟節點和子節點
這個結構體就是系統裡面管理resource的一種方式
(4)繼續回到platform_device這個結構體
下面就是id_entry,匹配的時候會用到。
mfd_cell是使用者多功能卡,多功能裝置的實現
(6)接下來看一下platform_driver這個結構體
裡面主要的就是probe函式和remove函式
原來驅動中的init函式放到probe函式裡面執行
原來驅動中的exit函式放到remove函式裡面執行
下面的shutdown suspend resume是電源管理相關的函式,裝置的關閉,暫停和和恢復的動作,是可選的。
probe和remove需要自己實現
後面是乙個device_driver表示乙個驅動,是驅動的乙個基類,和device一樣,任何的驅動都繼承這個基類。為什麼要這樣用呢,因為c語言裡面沒有繼承,只能通過結構體來實現繼承的操作
結構體後面乙個id_table,在匹配的時候會用到這個成員。
匹配的操作,之後會講到。
上面就是platform基本的結構體。
了解這些結構體以後。線面看如何把裝置和驅動註冊到系統裡面
就是註冊到platform虛擬匯流排上面。
匯流排管理裝置和驅動。
當我們要寫乙個platform_device的時候,我們需要初始化platform_device裡面的結構體,當初始化完platform_device裡面的結構體的時候,我們向platform匯流排註冊platfrom_device
同樣的,我們編寫乙個platform_driver的時候,需要初始化相關的結構體,實現裡面的函式,然後向platform_bus註冊。
這樣才能完成裝置和驅動的匹配。
那這些註冊函式都是在哪呢?都在platform.c裡面,這個檔案實現了所有的platfrom的操作。
怎麼把乙個platform裝置註冊到platform匯流排上面呢
平台裝置的註冊函式,引數是platform結構體,這個結構習需要在編寫platform_device的時候初始化結構體,為他賦值。然後呼叫這個函式把platform裝置註冊到核心裡面。
可以看到裡面包含兩個函式,乙個是device_initiallize函式,裡面的引數是乙個dev,就是device這個結構體(裝置的基類)。
然後呼叫platform_device_add這個函式
首先初始化的時候會將裝置的父類初始化為platform_bus,
這個就是platform初始化的時候表示虛擬匯流排的裝置,可以說明都是掛載在platform匯流排,所有的父裝置都是platform_bus這個裝置
接下來是設定裝置的匯流排的型別為platform。這兩步指定完了以後,就相當裝置掛接到虛擬匯流排上了。
之後是對資源的初始化,最後呼叫device_add將裝置註冊到核心裡面。
這就是如何註冊乙個平台裝置。
(9)註冊完平台裝置以後就是註冊乙個平台驅動
和註冊平台裝置一樣,首先在platfrom_driver裡面也是需要定義乙個platform_driver結構體來,完成相應的函式,初始化完成以後吧結構體作為引數放到這個函式裡面
首先把驅動的匯流排型別甚至為platfrom,間接的掛載到platform匯流排上面.
然後呼叫driver_register函式將platfrom裝置註冊到核心裡面。
總結:上面主要介紹了platform的概念,platform相比於傳統裝置驅動的優點,platform框架中使用的一些基本的結構體,核心啟動的時候對platfrom的初始化。以及註冊platfrom裝置和platfrom驅動的函式。這些是一些基礎的概念,
下面詳細分析平台驅動的初始化函式,平台驅動的初始化函式是如何呼叫到的。以及平台驅動如何匹配的,平台驅動的初始化**在**。
Linux驅動基礎 platform裝置驅動
以高通平台為例,會在kernel arch arm mach msm下的相應的board c檔案裡邊用 dt machine start 這個巨集定義一系列的晶元。以高通8916為例 在kernel arch arm mach msm board 8916.c檔案裡定義了 當然下面使用哪個要看一下。...
platform驅動分析
platform驅動程式設計路線 註冊裝置 platform device 編寫裝置驅動。註冊裝置 struct platform device 其中比較重要的成員struct resource resource 表徵platform device所戰用的資源,當然對於比較簡單的裝置 普通的i 0 ...
platform匯流排分析
推薦閱讀 講的很好 platform匯流排簡介 匯流排的產生的意義是讓裝置 硬體被抽象成乙個結構體來代表乙個裝置 和驅動分離 linux核心中常見的的匯流排有i2c匯流排,pci匯流排,串列埠匯流排,spi匯流排,pci匯流排,can匯流排,單匯流排等,所以有些裝置和驅動就可以掛在這些匯流排上,然後...