(八)4 匯流排熱插拔

2021-07-22 22:44:07 字數 1736 閱讀 4308

一、熱插拔的實現

我不知道在這裡用熱插拔這樣的名字是否合適,在之前的**,需要我自己手動去載入驅動和裝置的模組,但在現實的情況下,一般是當裝置一被插入,系統自己會註冊裝置,並呼叫合適的驅動。

所以,接下來我要實現的是,在載入了usb匯流排和usb滑鼠驅動的前提下,當有usb滑鼠插入,系統自己進行裝置的操作。當然,上面的usb滑鼠是我自己想象出來的,當我一按下按鍵(對應中斷e_int1),就代表有usb滑鼠插入。

這樣看來,要實現的**就簡單,稍稍修改一下程式就可以了,將之前由devie.ko

實現的操作交由中斷處理函式來執行,當我按下按鍵,觸發中斷自動執行。

driver.c不用修改,並且把device.c刪掉,將**移到bus.c中:

/*8th_devmodule_4/1st/bus.c*/

9 struct work_struct my_work;

。。。。。

56 /**************

57 * 裝置註冊

58 *************/

59 void usb_dev_release(struct device *dev) //解除安裝函式沒有幹具體的事情

60 63 /*結構體中不需要指定匯流排的成員,交由usb_device_register來完成*/

64 struct usb_device mouse_dev = ,

69 };70

71 irqreturn_t hotplug_handler(int irqno, void *dev_id)

72 77 void work_func(struct work_struct *work)//中斷下半部處理函式

78 85

86 static int __init usb_bus_init(void)

87 97

98       /*匯流排註冊,必須檢測返回值*/

99       ret = bus_register(&usb_bus);

100     if(ret)

104105     printk("usb bus init\n");

106     return 0;

107 }

108109 static void __exit usb_bus_exit(void)

110

上面的**可以看到,函式將原來在device.c中實現的操作放在了中斷函式來執行,一旦usb滑鼠被插入(這裡是我假設的,其實就是按下按鍵,觸發e_int1中斷),就會執行註冊裝置的操作。

看效果:

[root: 1st]# insmod bus.ko //先載入匯流排

usb bus init

[root: 1st]# insmod driver.ko //再載入驅動

usb driver init

[root: 1st]# usb mouse device insert //當我按下按鍵,觸發中斷,假設滑鼠被插入

match success //配對成功

init usb mouse //初始化裝置

當然,我的函式很多的

bug,譬如你再次按下按鍵,那就會出現錯誤。但撇來這些不考慮,基本效果就出來了,當裝置一插入,核心自動註冊裝置。

二、總結

第八章的裝置模型基本上就介紹完了,我在這裡沒有介紹kobject、kset等這一類核心中用於管理裝置模型的結構體,有興趣可以自己去看看。

接著就會介紹平台類匯流排裝置,到時候你會發現,平台類匯流排裝置其實就是匯流排的乙個封裝。

linux裝置驅動歸納總結(八) 4 匯流排熱插拔

上一節介紹裝置管理中的分層思想和物件導向思想 名字是我自己瞎編的 接下來說一下熱插拔的操作。一 熱插拔的實現 我不知道在這裡用熱插拔這樣的名字是否合適,在之前的 需要我自己手動去載入驅動和裝置的模組,但在現實的情況下,一般是當裝置一被插入,系統自己會註冊裝置,並呼叫合適的驅動。所以,接下來我要實現的...

熱插拔操作

熱插拔事件的實際控制是通過一套儲存於 kset hotplug ops 結構的方法完成.struct kset hotplug ops 乙個指向這個結構的指標在 kset 結構的 hotplug ops 成員中.如果乙個給定的kobject 不包含在乙個 kset 中,核心搜尋整個層次 通過 par...

監視熱插拔事件

include include include include include include include include include include static int init hotplug sock void set receive buffersize setsockopt ho...