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...