3 0 35 platform 匯流排 裝置與驅動

2022-08-17 20:45:10 字數 2439 閱讀 9471

在該核心的裝置驅動模型中,關心匯流排、裝置和驅動這三個實體。

在系統每註冊乙個裝置的時候,由匯流排尋找與之匹配的驅動;在系統每註冊乙個驅動的時候,會由匯流排尋找與之匹配的裝置。

乙個現實的linux裝置和驅動通常都需要掛載在一種匯流排上,對於本身依附於pci,usb,i2c,spi等的裝置而言,這不是問題

但在嵌入式系統中,soc系統中整合了獨立的外設控制器,整合於soc中的外設卻不依賴於這類匯流排。基於這一背景,linux

發明了一種虛擬匯流排,稱為platform匯流排,platform 所描述的資源有乙個共同點:在 cpu 的匯流排上直接取址。相應的,

裝置稱為platform_device,驅動稱為platform_driver。

兩者的工作順序是

注意:所謂的platform_device並不是與字元裝置、塊裝置、網路裝置並列的概念,而是linux系統提供的一種附加手段。

platform_device 結構體的定義(include/linux/platform_device.h),如下示:

struct

platform_device ;

platform_driver 結構體的定義(include/linux/platform_device.h),如下示:

struct

platform_driver ;

該結構體中包含 probe(), remove(), shutdown, suspend(), resume函式,通常也需要由驅動實現。

系統中為platform 匯流排定義了乙個bus_type 的例項 platform_bus_type(drivers/base/platform.c),其定義如下:

struct bus_type platform_bus_type =;

export_symbol_gpl(platform_bus_type);

這裡要重點關注 match() 成員函式,正是此函式確定了 platform_device 和 platform_driver 之間是如何配置的。

platform_match 定義(drivers/base/platform.c)如下:

/*

* * platform_match - bind platform device to platform driver.

* @dev: device.

* @drv: driver.

* * platform device ids are assumed to be encoded like this:

* "", where is a short description of the type of

* device, like "pci" or "floppy", and is the enumerated

* instance of the device, like '0' or '42'. driver ids are simply

* "". so, extract the from the platform_device structure,

* and compare it against the name of the driver. return whether they match

* or not. */

static

int platform_match(struct device *dev, struct device_driver *drv)

由上可知, 匹配platform_device 和 platform_driver 主要看兩者的 name欄位是否相同。

對platform_device 的定義通常在bsp的板檔案中實現,在板檔案中,將platform_device 歸納為乙個陣列,最終通過

platform_add_devices() 函式統一註冊。其定義(drivers/base/platform.c)如下:

/*

* * platform_add_devices - add a numbers of platform devices

* @devs: array of platform devices to add

* @num: number of platform devices in array */

int platform_add_devices(struct platform_device **devs, int

num)

}return

ret;

}export_symbol_gpl(platform_add_devices);

platform_add_devices() 函式可以將平台裝置新增到系統中,該函式的第乙個引數為平台裝置陣列的指標,第二個引數為平台裝置

的數量,它內部呼叫了platform_device_register() 函式,用於註冊單個的平台裝置。

platform匯流排分析

推薦閱讀 講的很好 platform匯流排簡介 匯流排的產生的意義是讓裝置 硬體被抽象成乙個結構體來代表乙個裝置 和驅動分離 linux核心中常見的的匯流排有i2c匯流排,pci匯流排,串列埠匯流排,spi匯流排,pci匯流排,can匯流排,單匯流排等,所以有些裝置和驅動就可以掛在這些匯流排上,然後...

platform匯流排 學習

一直想要寫些部落格,記錄學習的過程,算是自己的乙個複習,也是鍛鍊一下自己的總結能力,但是一直到今天才開始。今天,學習的 platform匯流排。總的來說,platform匯流排是基於linux2.6核心的匯流排裝置驅動模型所自己定義出來的一條匯流排,具體為什麼要有這麼一條匯流排還沒有深入研究,目前覺...

Platform匯流排註冊驅動

linux核心中常見的的匯流排有i2c匯流排,pci匯流排,串列埠匯流排,spi匯流排,pci匯流排,can匯流排,單匯流排等,所以有些裝置和驅動就可以掛在這些匯流排上,然後通過匯流排上的match進行裝置和驅動的匹配。但是有的裝置並不屬於這些常見匯流排,所以我們引入了一種虛擬匯流排,也就是plat...