1、分層分離的概念。
這種思想的優點就是能把很多檔案共用的**抽離集中起來成為乙個或者多個核心檔案供裝置相關層呼叫,每一層專注於自己的功能。
分離: 把硬體相關的**和驅動(穩定的**)分離開來,即要編寫兩個檔案:dev.c和drv.c
2、bus-dev-drv模型的匹配規則
核心發現乙個裝置時,呼叫device_add:a.會將device結構體加入到bus的device鍊錶 b.從匯流排的drv鍊錶中取出每乙個drv,呼叫匯流排的match函式判斷是否支援這個裝置 c.若支援,呼叫驅動的probe函式
向核心註冊乙個驅動時,呼叫driver_register:a.會將driver結構體加入到bus的driver鍊錶 b.從匯流排的dev鍊錶取出每乙個dev,呼叫匯流排的match函式判斷是否支援該裝置 c.若支援,呼叫驅動的probe函式
3、衍生出的幾大匯流排
在linux中由bus衍生出很多匯流排如,i2c_bus_type,platform_bus_type等。所謂的衍生就是指它們的裝置和驅動結構都內嵌了device和driver結構體。
4、例子
匯流排:/*當乙個新裝置或者驅動被新增到這個匯流排時,該方法被呼叫。用於判斷指定的驅動程式是否能處理指定的裝置。若可以,則返回非零值。*/
static int my_match(struct device *dev, struct device_driver *driver)
/*宣告匯流排*/
struct bus_type my_bus_type = ;
/*模組載入函式*/
static int __init my_bus_init(void)
/*模組解除安裝函式*/
static void my_bus_exit(void)
裝置:
static void my_dev_release(struct device *dev)
struct device my_dev = ;
static int __init my_device_init(void)
static void my_device_exit(void)
驅動:
/*當驅動找到對應的裝置時會執行該函式*/
static int my_probe(struct device *dev)
static int my_remove(struct device *dev)
struct device_driver my_driver = ;
static int __init my_driver_init(void)
static void my_driver_exit(void)
關於bus-dev-drv模型的鍊錶是如何形成的,如何關聯,並且在sys目錄下是如何變化的可以參考如下兩篇文章:
匯流排 裝置 驅動模型
裝置元素 匯流排,驅動,裝置 匯流排 處理器和裝置之間的通道,在裝置模型中,所有的裝置都通過匯流排相連,甚至是內部的虛擬 platform 匯流排 定時器,看門狗並沒有直接相連 在linux裝置模型中,匯流排由bus type結構表示,定義在 匯流排的註冊使用 bus register struct...
匯流排裝置驅動模型
匯流排裝置驅動模型 匯流排是主機和裝置之間的通道,由bus type 結構描述。int bus register struct bus type bus 匯流排的註冊,若成功,新的匯流排將被新增進系統,並可在 sysfs 的 sys bus 下看到。void bus unregister struc...
匯流排裝置驅動模型
匯流排 乙個匯流排是處理器和乙個或多個裝置之間的通道。為裝置模型的目的,所有的裝置都通過乙個匯流排連線,甚至當它是乙個內部的虛擬的 平台 匯流排。裝置 裝置就是連線在匯流排上的物理實體。裝置是有功能之分的。具有相同功能的裝置被歸到乙個類 class 中。在linux 系統中,每個裝置由乙個 stru...