匯流排裝置驅動模型

2021-07-23 08:23:50 字數 3283 閱讀 6340

1.匯流排裝置模型概述

2.匯流排

3.驅動

4.裝置

1.匯流排裝置模型概述

隨著技術的不斷進步,系統的拓撲結構也越來越複雜,對熱插拔,跨平台移植性的要求也越來越高,2.4核心已經難以滿足這些需求。為適應這種形勢的需要,從linux2.6核心開始提供了全新的裝置模型。匯流排裝置驅動對熱插拔要求越來越高。

在linux系統中,有很多匯流排,例如usb匯流排掛載很多usb裝置驅動程式(滑鼠,usb網絡卡),往usb匯流排上插入乙個usb網絡卡裝置,usb匯流排感知到乙個新的裝置上到匯流排上並且是usb的,匯流排會把匯流排上的每乙個驅動與usb網絡卡裝置匹配,匹配成功後usb匯流排將控制權交給usb網絡卡驅動程式,usb驅動程式開始處理usb網絡卡裝置。裝置從匯流排拔掉,usb匯流排感知usb網絡卡裝置拔掉,usb匯流排將找到相應的usb網絡卡驅動程式將處理裝置拔掉這個事件。

網絡卡從usb換成minipci,需要修改的特別少,增強了驅動程式的可移植性。

當往匯流排上插入乙個裝置,匯流排有義務將裝置與驅動進行匹配,有match函式完成是否可以匹配。匹配成功呼叫probe函式

以下將從建立匯流排、建立驅動,建立裝置3個方面進行匯流排裝置掛載到匯流排上的流程進行介紹。

2.匯流排

2.1描述結構

在linux 核心中, 匯流排由bus_type 結構表示,定義在

#include

struct bus_type

int (*match)(struct device * dev, struct device_driver * drv)

當乙個新裝置或者新驅動被新增到這個匯流排時,該函式被呼叫。用於判斷指定的驅動程式是否能處理指定的裝置。若可以,則返回非零。

2.2匯流排註冊

匯流排的註冊使用如下函式

bus_register(struct bus_type *bus)

若成功,新的匯流排將被新增進系統,並可在

/sys/bus 下看到相應的目錄。

2.3匯流排登出

匯流排的登出使用:

void bus_unregister(struct bus_type *bus)

bus.c

#include

#include

#include

#include

module_license("gpl");

int my_match(struct device *dev, struct device_driver *drv)

struct bus_type my_bus_type = ;

export_symbol(my_bus_type);//將變數輸出,供外部使用

int my_bus_init()

void my_bus_exit()

module_init(my_bus_init);

module_exit(my_bus_exit);

insmod bus.ko載入驅動、向系統註冊匯流排

lsmod

檢視匯流排課通過cd /sys/bus,ls即可檢視linux支援的匯流排

3.驅動

3.1描述結構

在linux核心中, 驅動由device_driver結構表示。

struct device_driver

3.2驅動註冊

驅動的註冊使用如下函式

int driver_register(struct device_driver *drv)

3.3驅動登出

驅動的登出使用:

void driver_unregister(struct device_driver *drv)

driver.c

#include

#include

#include

#include

extern

struct bus_type my_bus_type;//變數來自於外部

module_license("gpl");

int my_probe(struct device *dev)

struct device_driver my_driver = ;

int my_driver_init()

void my_driver_exit()

module_init(my_driver_init);

module_exit(my_driver_exit);

insmod driver.ko

cd /sys/bus/

ls即可看到my-bus匯流排

cd drivers/

ls 即可檢視重新註冊的驅動my_dev

4.裝置

4.1裝置描述結構

在linux核心中, 裝置由struct device結構表示。

struct device

4.2裝置註冊

裝置的註冊使用如下函式

int device_register(struct device *dev)

4.3裝置登出

裝置的登出使用:

void device_unregister(struct device *dev)

device.v

#include

#include

#include

#include

module_license("gpl");

extern

struct bus_type my_bus_type;

struct device my_device = ;

int my_device_init()

void my_device_exit()

module_init(my_device_init);

module_exit(my_device_exit);

insmod bus.ko

insmod driver.c

insmod device.c

# the bus』s driver find the device it can handle

總結:

1.匯流排上已經掛載裝置驅動程式,當向匯流排新增裝置,匯流排匹配成功,呼叫驅動1的probe函式

2.匯流排上已經掛載多個裝置,後載入乙個驅動程式,將驅動與每個裝置匹配,匹配成功,呼叫驅動probe函式

匯流排 裝置 驅動模型

裝置元素 匯流排,驅動,裝置 匯流排 處理器和裝置之間的通道,在裝置模型中,所有的裝置都通過匯流排相連,甚至是內部的虛擬 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...