【Linux筆記】總線設備驅動模型

之前的筆記有分享【Linux筆記】程序設計思想:分層、分離、抽象,按照這樣的思想來設計我們的程序可以更容易寫出耦合性低、獨立性強、可重用性強的代碼。

Linux內核中更是存在着更多的分離、分層思想的代碼,platform平臺設備驅動就是用了這樣的思想。本篇筆記我們一起來學習一下platform驅動框架。

Linux引入platform的原因

對於 Linux 這樣一個成熟、龐大、 複雜的操作系統,代碼的重用性非常重要,否則的話就會在 Linux 內核中存在大量無意義的重複代碼。爲了能提高驅動代碼的重用性,因此引入了 platform。下面以一個例子來說明傳統的設動轉變至Linux 總線、驅動和設備模式 (來源:《正點原子Linux驅動開發指南》):

======001

======002

======003

======004

最後一張圖就是Linux下的總線(bus)、驅動(driver)和設備(device)模型。但是在 SOC 中有些外設是沒有總線這個概念的,但是又要使用總線、驅動和設備模型該怎麼辦呢?爲了解決此問題, Linux 提出了 platform_bus 這個虛擬總線,相應的就有 platform_driver 和 platform_device。

======005

總線設備驅動模型

======006

1、platform_bus

platform總線實例(在文件drivers/base/platform.c 中):

======007

這裏我們重點來關注匹配函數platform_match:

======008

我們暫且先知道其有幾種匹配方法。

2、platform_driver

platform驅動結構體(在文件include/linux/platform_device.h 中):

======009

platform_driver 結構體中的driver成員所屬的結構體類型爲(在文件include/linux/device.h 中):

======010

這裏體現出了C語言的面向對象的思想,其中driver相當於基類,platform_driver繼承了這個基類。

struct device_driver 結構體中(在文件include/linux/device.h 中)的name成員在上面提到的匹配函數platform_match裏用到,即:

======011

platform_driver 結構體中的id_table成員所屬的結構體類型爲(在文件include/linux/mod_devicetable.h 中):

======012

常用函數:

platform 驅動註冊函數:

int platform_driver_register(struct platform_driver *driver);

platform 驅動卸載函數:

void platform_driver_unregister(struct platform_driver *drv);

3、platform_device

描述設備有兩種方法:一種是用用設備樹來指定,另一種是直接用platform_device結構體來指定。設備樹的內容不在我們本篇筆記的學習範圍內。下面先來看一下platform設備結構體(在文件include/linux/platform_device.h 中):

======013

platform_device結構體中的resource成員所屬的結構體類型爲(在文件include/linux/ioport.h 中):

======014

常用函數:

platform 驅動註冊函數:

int platform_device_register(struct platform_device *pdev);

platform 驅動卸載函數:

void platform_device_unregister(struct platform_device *pdev);

driver與device如何匹配

platform_driver與platform_device的匹配圍繞着上面說的platform_match函數。上面有說描述設備有兩種方法,這裏暫且只分享直接用platform_device結構體來指定設備時platform_driver與platform_device的匹配過程。(參考來源:百問網)

======015

======016

======017

======018

以上就是本次的分享~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章