Linux平台匯流排驅動裝置模型

2022-09-18 11:12:24 字數 4126 閱讀 7787

platform匯流排是一種虛擬的匯流排,相應的裝置則為platform_device,而驅動則為platform_driver。linux 2.6的裝置驅動模型中,把i2c、rtc、lcd等都歸納為platform_device。

匯流排將裝置和驅動繫結,在系統每註冊乙個裝置的時候,會尋找與之匹配的驅動;相反的,在系統每註冊乙個驅動的時候,會尋找與之匹配的裝置,而匹配由匯流排完成。

linux2.6系統中定義了乙個bus_type的例項platform_bus_type

[cpp]view

plain

?struct

bus_type platform_bus_type = ;  

[cpp]view

plain

?/* platform_match函式用於匹配匯流排中的驅動和裝置 */

static

intplatform_match(

struct

device *dev, 

struct

device_driver *drv)  

platform_match函式首先判斷是否由id_table,如果有則使用id_table來進行匹配,否則,判斷platform_device和platform_driver成員裡的name,如果二者的name欄位相同則匹配,如果匹配則呼叫platform_driver的probe函式。

platform_device結構體的定義

[cpp]view

plain

?struct

platform_device ;  

其中有個重要的成員是resource,是裝置的資源資訊,如io位址,中斷號等。

[cpp]view

plain

?struct

resource ;  

有的裝置可能有多個資源,通常使用platform_get_resource函式來獲取資源

[cpp]view

plain

?/**

* platform_get_resource - get a resource for a device

* @dev: platform device

* @type: resource type

* @num: resource index

*/struct

resource *platform_get_resource(

struct

platform_device *dev,  

unsigned int

type, unsigned 

intnum)  

return

null;  

}  平台裝置的註冊,使用platform_device_register函式

[cpp]view

plain

?int

platform_device_register(

struct

platform_device *pdev)  

platform_device_register函式先通過device_initialize函式初始化platform_device的device成員,然後呼叫platform_device_add向核心新增乙個平台裝置。

[cpp]view

plain

?int

platform_device_add(

struct

platform_device *pdev)  

if(p && insert_resource(p, r))   

}  pr_debug("registering platform device '%s'. parent at %s\n"

,  dev_name(&pdev->dev), dev_name(pdev->dev.parent));  

/* 向核心新增乙個device */

ret = device_add(&pdev->dev);  

if(ret == 0)  

return

ret;  

failed:  

while

(--i >= 0)   

return

ret;  

}  platform_device_add最終呼叫device_add來完成平台裝置的註冊。

相反地,如果要登出平台裝置則使用platform_device_unregister函式

[cpp]view

plain

?void

platform_device_unregister(

struct

platform_device *pdev)  

platform_device_unregister函式呼叫platform_device_del函式來登出平台裝置

[cpp]view

plain

?void

platform_device_del(

struct

platform_device *pdev)  

}  }  platform_device_del函式呼叫device_del函式來刪除平台裝置,相應地,要釋放資源應呼叫release_resource函式,前提是資源的型別必須為ioresource_mem或者ioresource_io

platform_driver的定義:

[cpp]view

plain

?struct

platform_driver ;  

device_driver的定義:

[cpp]view

plain

?struct

device_driver ;  

platform_driver結構體有device_driver成員,該成員的各自欄位如上所示,device_driver也有probe、remove、shutdown等函式,在平台驅動註冊的時候被初始化。

前面說過,當系統中存在有平台裝置和平台驅動通過匯流排的match函式匹配後則會呼叫platform_driver的probe函式,引數為platform_device,有時候也通過id_table來判斷是否匹配。

[cpp]view

plain

?struct

platform_device_id ;  

平台驅動的註冊使用platform_driver_register函式

[cpp]view

plain

?int

platform_driver_register(

struct

platform_driver *drv)  

先初始化platform_driver裡的driver,該driver的型別為device_driver,設定driver的bus為platform_bus_type;設定driver的probe為platform_drv_probe;設定driver的remove為platform_drv_remove;設定driver的shutdown為platform_drv_shutdown;設定driver的suspend為platform_drv_suspend;設定driver的resume為platform_drv_resume,最後呼叫driver_register函式來註冊平台驅動。

相反地,要登出平台驅動的話,使用platform_driver_unregister函式

[cpp]view

plain

?void

platform_driver_unregister(

struct

platform_driver *drv)  

附韋老師總結的bus_drv_dev模型的框架圖

平台匯流排裝置模型

平台匯流排是核心實現的一條虛擬匯流排,linux 裝置模型包含三個重要的元素,匯流排 裝置和驅動,那看看平台匯流排又是怎樣去實現的。首先看平台匯流排的定義 我們知道匯流排匹配裝置和驅動是通過它的 match 函式,那具體看看這個函式是怎樣實現的。我們看,如果平台驅動有乙個 id table 那就通過...

匯流排 裝置 驅動模型

裝置元素 匯流排,驅動,裝置 匯流排 處理器和裝置之間的通道,在裝置模型中,所有的裝置都通過匯流排相連,甚至是內部的虛擬 platform 匯流排 定時器,看門狗並沒有直接相連 在linux裝置模型中,匯流排由bus type結構表示,定義在 匯流排的註冊使用 bus register struct...

匯流排裝置驅動模型

匯流排裝置驅動模型 匯流排是主機和裝置之間的通道,由bus type 結構描述。int bus register struct bus type bus 匯流排的註冊,若成功,新的匯流排將被新增進系統,並可在 sysfs 的 sys bus 下看到。void bus unregister struc...