簡單分析USB設備驅動框架(秒懂~)

在生活、工作中經常會接觸到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內核視頻教程文檔資料免費領取後台私信【內核】自行獲取.