Linux驅動開發之BUS匯流排程式設計

2021-10-24 12:06:24 字數 4016 閱讀 8352

二,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結構體,硬...