platform基础介绍
(1)什么是platform
paltform是一種虛擬的總線,用于管理外設資源內存資源中斷資源。
在硬件上有USB-BUS總線,PCI-BUS總線,這是在物理設備上實際存在的總線。
USB-BUS管理USB設備,PCI總線管理PCI設備。
但是在實際中,一些設備不屬于這些總線,一些SOC上面的控制器或者設備。
使用platform統(tǒng)一管理這些設備。
platform的一個優(yōu)點就是將驅動和設備分開,提高驅動的移植性。
platform將驅動和設備分開為三部分,就提高了設備和驅動的可移植性。
platform_device platform_driver platform_bus
platform_device是基于底層的模塊抽象出的,用于表示設備,就是我們的外設,描述外設的資源,占用的io資源,irq資源
驅動用來實現驅動設備的代碼
總線可以看做是一個管理單元,用于管理設備和驅動的匹配,提供設備和驅動的匹配函數。
如何進行匹配的,哪一個platform_device和platform_driver進行匹配呢,是按照上面方式匹配的。也是platform_bus完成的工作。這個總線在系統(tǒng)啟動的時候就會進行初始化,這樣才能完成設備和驅動的匹配。
系統(tǒng)啟動的時候會啟動一個start_kernel()函數,
start_kernel執(zhí)行一系列的初始化函數,然后調用rest_init(void)
rest_init會啟動一個內核線程執(zhí)行kernel_init函數繼續(xù)初始化
最后會調用到do_basic_setup函數,也是一些的初始化
調用driver_init函數
在driver_init函數中調用paltform_bus_init函數
在platform_bus_init函數里面完成了platform虛擬設備的初始化。
主要的代碼是上面的兩句
1.device_register是注冊一個設備,參數是一個結構體指針,定義如下
是一個device結構體,是設備的最基本的單元。是所有設備的基類。
device是一個面向對象的思想,當然還有不同的設備,當想定義不同的設備的時候,就繼承這個結構體,然后添加一些不同的成員。
device_register是注冊一個設備,注冊到內核里面。
?
這個結構體就是描述一個虛擬總線,所以,這個結構體就是對里面platform總線的描述
其它的不管,但是match這個函數需要先提一下。platform_bus有兩個功能,一個是管理設備和驅動,一個是實現設備和驅動的匹配。
platform_match函數就是完成設備和驅動匹配的函數。
上面就是總線的一個注冊。
注冊完設備和總線以后,platform總線就注冊到內核里面了。接下來就可以使用platform總線架構管理設備和驅動了。
platform_device中有一個platform_device結構體,是用來描述設備的結構體
platform_driver中有一個platform_driver結構體,是用來描述設備的驅動的
先看一下platform_device結構體
名字
id是第幾個設備
device是描述設備的一個基類,是最核心的類
num_resourcez資源的數量
*resource就是來描述設備的資源
要描述一個設備,都需要哪些呢
start 資源的起始地址end資源的結束地址
名字,設備的名字
資源,io資源,中斷資源,內存資源
flag表示的是什么樣子的資源
下面又是一個resource結構體,分被指向父節(jié)點,兄弟節(jié)點和子節(jié)點
這個結構體就是系統(tǒng)里面管理resource的一種方式
(4)繼續(xù)回到platform_device這個結構體
下面就是id_entry,匹配的時候會用到。
mfd_cell是用戶多功能卡,多功能設備的實現
(6)接下來看一下platform_driver這個結構體
?
里面主要的就是probe函數和remove函數
原來驅動中的init函數放到probe函數里面執(zhí)行
原來驅動中的exit函數放到remove函數里面執(zhí)行
下面的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_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相比于傳統(tǒng)設備驅動的優(yōu)點,platform框架中使用的一些基本的結構體,內核啟動的時候對platfrom的初始化。以及注冊platfrom設備和platfrom驅動的函數。這些是一些基礎的概念,
下面詳細分析平臺驅動的初始化函數,平臺驅動的初始化函數是如何調用到的。以及平臺驅動如何匹配的,平臺驅動的初始化代碼在哪里。
?
?
?
?
?
總結
以上是生活随笔為你收集整理的platform基础介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常见SQL面试题知识点+使用技巧
- 下一篇: windows服务器迁到_windows