二,bus匯流排模型程式設計
首先回顧裝置驅動編寫的一般流程
實現入口函式module_init()和模組解除安裝函式module_exit();
申請裝置號,register_chrdev(); -----> (與核心相關)
利用udev/mdev機制建立裝置檔案結點class_create(),device_create(); ------>(與核心相關)
硬體初始化:1.io資源對映ioremap(),核心提供gpio庫函式 ; 2.註冊中斷。------->(與硬體相關)
構建file_operation結構體-------->(與核心相關)
實現操作硬體的方法***_open(),***_write()…
結論:整個流程除了第四部分與硬體有關,其他都是相似的操作方法,為了方便的(不重複造輪子)編寫裝置驅動,節省人力,所以提出了裝置驅動模型,簡化了裝置驅動編寫的流程。
可以通過sysfs虛擬檔案系統檢視匯流排物件(以usb為例)
概念圖
struct bus_type:匯流排物件,描述乙個匯流排,管理device和driver,完匹配。
struct bus_type
;
註冊和登出匯流排
int
bus_register
(struct bus_type *bus)
;void
bus_unregister
(struct bus_type *bus)
;
構建乙個匯流排
#include
#include
#include
//例項化乙個bus物件
struct bus_type mybus =
;export_symbol
(mybus)
;//匯出匯流排物件,讓device物件和driver物件使用
static
int __init mybus_init
(void
)return0;
}static
void __exit mybus_exit
(void
)module_init
(mybus_init)
;module_exit
(mybus_exit)
;module_license
("gpl"
);
struct device
;
註冊和登出匯流排
int
device_register
(struct device *dev)
;void
device_unregister
(struct device *dev)
;
編寫裝置物件定義乙個描述裝置的資訊的結構體,匹配成功之後讓driver物件在匯流排中拿到device物件的資訊,實現分離。
#include
#include
#include
extern
struct bus_type mybus;
struct mydev_desc
;struct mydev_desc deviofo =
;void
mydev_release
(struct device* dev)
//構建乙個device物件
struct device mydev =
;static
int __init mydev_init
(void
)return0;
}static
void __exit mydev_exit
(void
)module_init
(mydev_init)
;module_exit
(mydev_exit)
;module_license
("gpl"
);
driver物件:描述裝置驅動發的方法
struct device_driver
;
註冊和登出匯流排
int
driver_register
(struct device_driver *drv)
;void
driver_unregister
(struct device_driver *drv)
;
編寫driver物件匹配成功之後可以在匯流排中拿到device物件的資料,具體實現在probe函式裡。
#include
#include
#include
#include
extern
struct bus_type mybus;
struct mydev_desc
;struct mydev_desc* pdesc;
intmydrv_probe
(struct device *dev)
int mydrv_remove (
struct device *dev)
//構建乙個driver物件
struct device_driver mydrv =
;static
int __init mydrv_init
(void
)return0;
}static
void __exit mydrv_exit
(void
)module_init
(mydrv_init)
;module_exit
(mydrv_exit)
;module_license
("gpl"
);
實現bus物件中的match方法(按device物件的名字和driver物件中的名字相匹配)
要注意的是不能直接用device物件中的init_name,而要用device物件中繼承的struct kobject kobj;裡面的成員name不然會報錯
int
mybus_match
(struct device *dev,
struct device_driver *drv)
else
return0;
}//例項化乙個bus物件
struct bus_type mybus =
;
保證device物件和driver物件的名字一樣:比如這裡都使用"fsdev_drv"就能保證能匹配成功
//構建乙個device物件
struct device mydev =
;
//構建乙個driver物件
struct device_driver mydrv =
;
SpringCloud 之Bus訊息匯流排
流程總結 架構優化 之前使用actuator監控中心完成重新整理功能,但是在config client服務端需要傳送post請求來手動重新整理,如果config client有很多的話,那麼需要乙個乙個地傳送post請求,這顯然是不現實的做法。使用訊息佇列中的topic,通過訊息實現通知。目前spr...
linux裝置模型bus匯流排
bus driver device結構 1 裝置是連線到匯流排上 2 驅動也是連線到匯流排上 3 裝置總是通過匯流排跟驅動對應起來 核心2.4與2.6區別?引入裝置模型,主要體現在以下幾個方面 1 電源管理 2 跟使用者的互動介面 sys proc 3 熱插撥 4 分類處理 參考 例項 bus.c ...
linux驅動之platform匯流排
第一部分 裝置驅動模型 1 匯流排 bus type結構體,關鍵函式是match函式和uevent函式 匯流排將裝置和驅動繫結,在系統每註冊乙個裝置的時候,會尋找與之匹配的驅動,相反,在系統每註冊乙個驅動的時候,會尋找與之匹配的裝置,而匹配由匯流排完成。2 裝置 struct device結構體,硬...