linux裝置驅動模型
我們在寫最簡單的裝置驅動程式的時候,我們將所有的硬體資訊都儲存在了驅動**中,這樣有乙個非常明顯的不足:會導致驅動程式的通用性極差,一旦硬體平台或硬體連線有鎖改變,就一定要修改驅動**。為了解決這個問題,linux在2.6版本之後,新增了「匯流排—裝置—驅動」的linux裝置模型,有效地實現了裝置和驅動的分離。
該裝置模型通過幾個資料結構來反映當前系統中匯流排、裝置以及驅動的工作狀況,提出了以下幾個重要概念:
1、匯流排
在實際的應用中,大部分的外設都是連線在匯流排上,它們之間的物理連線,如下圖所示:
在驅動設計中,匯流排驅動的主要工作是負責管理兩個鍊錶。分別是新增到該匯流排的裝置鍊錶以及註冊到該匯流排的驅動鏈表。當你向匯流排新增(移除)乙個裝置(驅動)時,便會在對應的列表上新增新的節點,同時對掛載在該匯流排的驅動以及裝置進行匹配,在匹配過程中會忽略掉那些已經有驅動匹配的裝置。
前面我們說過,核心是以資料結構的方式來管理匯流排、裝置和驅動的,那麼在核心中匯流排的資料結構是怎樣的呢?核心中使用結構體bus_type來表示匯流排,具體內容如下:
struct bus_type
;
我們可以通過下面兩個函式向核心註冊或登出乙個匯流排。
//註冊匯流排
intbus_register
(struct bus_type *bus)
;//登出匯流排
void
bus_unregister
(struct bus_type *bus)
;
但是,linux核心已經為我們寫好了大部分匯流排驅動,我們一般不用自行去註冊乙個新的匯流排。
/sys/bus/目錄中包含了當前系統中已經註冊了的所有匯流排,例如i2c,spi,platform等。每個匯流排目錄都擁有兩個子目錄devices和drivers,分別記錄著掛載在該匯流排的所有裝置以及驅動。
2、裝置
在核心使用device結構體來描述我們的物理裝置,如下所示:
struct device
;
我們可以通過下面兩個核心api函式向核心註冊或登出乙個裝置:
//註冊裝置
intdevice_register
(struct device *dev)
;//登出裝置
void
device_unregister
(struct device *dev)
;
當成功註冊匯流排時,會在/sys/bus目錄下建立對應匯流排的目錄,該目錄下有兩個子目錄,分別是drivers和devices,我們使用device_register註冊的裝置從屬於某個匯流排時,該匯流排的devices目錄下便會存在該裝置檔案。
3、驅動
裝置能否正常工作,取決於驅動。驅動需要告訴核心,自己可以驅動哪些裝置,如何初始化裝置。在核心中,使用device_driver結構體來描述我們的驅動。
struct device_driver
;
核心提供了driver_register函式以及driver_unregister函式來註冊/登出驅動,成功註冊的驅動會記錄在/sys/bus/< bus >/drivers目錄,函式原型如下所示:
int
driver_register
(struct device_driver *drv)
;void
driver_unregister
(struct device_driver *drv)
;
linux裝置模型
linux核心的整體架構 linux裝置模型 linux裝置模型 1 基本概念 linux裝置模型 2 kobject linux裝置模型 3 uevent linux裝置模型 4 sysfs linux裝置模型 5 device和device driver linux裝置模型 6 bus linu...
Linux裝置驅動模型
核心版本 2.6.29 裝置驅動模型框架是linux驅動程式設計的基礎。它通過kobject,kset,ktype等底層資料結構將bus type,device,device driver 等高層資料結構組織起來,形成乙個層次 分類清晰的驅動模型。優點如下 1.重用。將物件抽象為匯流排 驅動 裝置三...
linux字元裝置模型
字元裝置的結構體 struct dev t dev 字元裝置模組的載入和解除安裝函式 static int init init void else ret cdev add dev.cdev,dev no,1 裝置驅動模組的解除安裝函式 static void exit exit void 字元裝置...