在生活、工作中經常會接觸到USB設備,如鼠標、鍵盤、攝像頭、可移動硬盤、掃碼槍等。這些設備通過USB接口連接到電腦上後,電腦會立刻提示「檢測到新硬件...」、安裝驅動等。這裡需要強調下USB設備使用的是USB總線,window或Linux內核中都會自帶usb總線驅動,所以接上USB設備後,主機能夠立刻檢測到,提醒需要安裝設備驅動是指安裝USB設備驅動。
USB設備驅動使用USB總線,所以很多操作由USB總線驅動幫我們完成了,我們只需要的按照總線、設備、驅動框架來實現USB設備的驅動既可。USB設備數據的讀寫操作由總線驅動現在,我們可以直接使用總線讀取到的數據,然後解析這些數據的含義、再進行相關的操作就可以了(這裡需要注意的一點是USB總線驅動只提供USB設備的讀寫操作函數,這函數是通用的,即裏面的數據的含義總線驅動並不知道)。
USB設備驅動的框架圖下,具體的代碼可以參考內核中的/drivers/hid/usbhid/usbmouse.c
分配/設置usb_driver結構體,填充裏面的.id_table、.probe、.disconnect成員。
調用usb_register把usb_driver結構體註冊到內核中。
static struct usb_driver usbtouch_driver = {
.name = "myusb",
.probe = usbtouch_probe,
.disconnect = usbtouch_disconnect,
.id_table = usbtouch_devices,
};
static int __init usbtouch_init(void)
{
return usb_register(&usbtouch_driver);
}
static void __exit usbtouch_cleanup(void)
{
usb_deregister(&usbtouch_driver);
}
struct usb_driver中的id_table成員是用與和usb設備進行匹配的選項,表示這個驅動支持的設備。
.probe成員為函數指針,就是在設備和驅動匹配成功的時候執行。
.disconnect成員也為函數指針,在設備和驅動關聯成功後再斷開執行,如拔了USB設備或卸載USB設備驅動。
更多linux內核視頻教程文檔資料免費領取後台私信【內核】自行獲取.