驅動繫結¶
驅動繫結是將裝置與可以控制它的裝置驅動程式相關聯的過程。 匯流排驅動程式通常會處理這個問題,因為有特定於匯流排的結構來表示裝置和驅動程式。 藉助通用的裝置和裝置驅動程式結構,大多數繫結可以使用通用程式碼進行。
匯流排¶
匯流排型別結構包含系統中該匯流排型別上的所有裝置的列表。 當為裝置呼叫 device_register 時,它會插入到此列表的末尾。 匯流排物件還包含該匯流排型別的所有驅動程式的列表。 當為驅動程式呼叫 driver_register 時,它會插入到此列表的末尾。 這是觸發驅動程式繫結的兩個事件。
device_register¶
新增新裝置時,會迭代匯流排的驅動程式列表以找到支援該裝置的驅動程式。 為了確定這一點,裝置的裝置 ID 必須與驅動程式支援的裝置 ID 之一匹配。 用於比較 ID 的格式和語義是匯流排特定的。 不是嘗試推導複雜的狀態機和匹配演算法,而是由匯流排驅動程式提供回撥來將裝置與驅動程式的 ID 進行比較。 如果找到匹配項,則匯流排返回 1; 否則返回 0。
int match(struct device * dev, struct device_driver * drv);
如果找到匹配項,則裝置的驅動程式欄位設定為驅動程式,並呼叫驅動程式的 probe 回撥。 這使驅動程式有機會驗證它是否真的支援該硬體,以及它是否處於工作狀態。
裝置類¶
成功完成 probe 後,裝置將在其所屬的類中註冊。 裝置驅動程式屬於一個且僅屬於一個類,該類在驅動程式的 devclass 欄位中設定。 呼叫 devclass_add_device 以列舉類中的裝置,並實際向該類註冊它,這透過類的 register_dev 回調發生。
驅動程式¶
當驅動程式附加到裝置時,該裝置會插入到驅動程式的裝置列表中。
sysfs¶
在匯流排的“devices”目錄中建立一個符號連結,該連結指向物理層次結構中的裝置目錄。
在驅動程式的“devices”目錄中建立一個符號連結,該連結指向物理層次結構中的裝置目錄。
在類的目錄中為裝置建立一個目錄。 在該目錄中建立一個符號連結,該連結指向 sysfs 樹中裝置的物理位置。
可以在裝置的物理目錄中建立一個符號連結(雖然尚未完成),以指向其類目錄或類的頂級目錄。 也可以建立一個指向其驅動程式的目錄。
driver_register¶
新增新驅動程式時,該過程幾乎相同。 迭代匯流排的裝置列表以找到匹配項。 跳過已經有驅動程式的裝置。 迭代所有裝置,以將盡可能多的裝置繫結到驅動程式。
移除¶
當移除裝置時,它的引用計數最終會變為 0。 當它變為 0 時,將呼叫驅動程式的 remove 回撥。 它將從驅動程式的裝置列表中刪除,並且驅動程式的引用計數會遞減。 兩個之間的所有符號連結都將被刪除。
當移除驅動程式時,會迭代其支援的裝置列表,併為每個裝置呼叫驅動程式的 remove 回撥。 該裝置將從該列表中刪除,並且符號連結將被刪除。