Linux裝置驅動程式學習(13)
匯流排
匯流排是處理器和一個或多個裝置之間的通道,在裝置模型中, 所有的裝置都通過匯流排相連, 甚至是內部的虛擬"platform"匯流排。匯流排可以相互插入。裝置模型展示了匯流排和它們所控制的裝置之間的實際連線。
在 Linux 裝置模型中, 匯流排由 bus_type 結構表示, 定義在 <linux/device.h> :
|
匯流排的註冊和刪除
匯流排的主要註冊步驟:
(1)申明和初始化 bus_type 結構體。只有很少的 bus_type 成員需要初始化,大部分都由裝置模型核心控制。但必須為匯流排指定名字及一些必要的方法。例如:
|
(2)呼叫bus_register函式註冊匯流排。
|
|
|
匯流排方法
在 bus_type 結構中定義了許多方法,它們允許匯流排核心作為裝置核心和單獨的驅動程式之間提供服務的中介,主要介紹以下兩個方法:
|
lddbus的match和uevent方法:
|
對裝置和驅動的迭代
若要編寫匯流排層程式碼, 可能不得不對所有已經註冊到匯流排的裝置或驅動進行一些操作,這可能需要仔細研究嵌入到 bus_type 結構中的其他資料結構, 但最好使用核心提供的輔助函式:
|
匯流排屬性
幾乎 Linux 裝置模型中的每一層都提供新增屬性的函式, 匯流排層也不例外。bus_attribute 型別定義在 <linux/device.h> 如下:
|
可以看出struct bus_attribute 和struct attribute 很相似,其實大部分在 kobject 級上的裝置模型層都是以這種方式工作。
核心提供了一個巨集在編譯時建立和初始化 bus_attribute 結構:
|
例如建立一個包含原始碼版本號簡單屬性檔案方法如下:
|
在最底層, Linux 系統中的每個裝置由一個 struct device 代表:
|
設備註冊
裝置的註冊和登出函式為:
|
一個實際的匯流排也是一個裝置,所以必須單獨註冊,以下為 lddbus 在編譯時註冊它的虛擬匯流排裝置原始碼:
|
裝置屬性
sysfs 中的裝置入口可有屬性,相關的結構是:
|
裝置結構的嵌入
device 結構包含裝置模型核心用來模擬系統的資訊。但大部分子系統記錄了關於它們又擁有的裝置的額外資訊,所以很少單純用 device 結構代表裝置,而是,通常將其嵌入一個裝置的高層表示中。底層驅動幾乎不知道 struct device。
lddbus 驅動建立了它自己的 device 型別,並期望每個裝置驅動使用這個型別來註冊它們的裝置:
|
lddbus 匯出的註冊和登出介面如下:
|
sculld 驅動新增一個自己的屬性到它的裝置入口,稱為 dev, 僅包含關聯的裝置號,原始碼如下:
|
裝置模型跟蹤所有系統已知的驅動,主要目的是使驅動程式核心能協調驅動和新裝置之間的關係。一旦驅動在系統中是已知的物件就可能完成大量的工作。驅動程式的結構體 device_driver 定義如下:
|