在該核心的裝置驅動模型中,關心匯流排、裝置和驅動這三個實體。
在系統每註冊乙個裝置的時候,由匯流排尋找與之匹配的驅動;在系統每註冊乙個驅動的時候,會由匯流排尋找與之匹配的裝置。
乙個現實的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),如下示:
structplatform_device ;
platform_driver 結構體的定義(include/linux/platform_device.h),如下示:
structplatform_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...