SB 總線引出兩個重要的鏈表!
一個 USB 總線引出兩個重要的鏈表,一個為 USB 設備鏈表,一個為 USB 驅(qū)動鏈表。設備鏈表包含各種系統(tǒng)中的 USB 設備以及這些設備的所有接口,驅(qū)動鏈表包含 USB 設備驅(qū)動程序(usb device driver)和 USB 驅(qū)動程序(usb driver)。
USB 設備驅(qū)動程序(usb device driver)和 USB 驅(qū)動程序(usb driver)的區(qū)別是什么?
USB 設備驅(qū)動程序包含 USB 設備的一些通用特性,將與所有 USB 設備相匹配。在 USB core 定義了:struct usb_device_driver usb_generic_driver。usb_generic_driver 是 USB 子系統(tǒng)中唯一的一個設備驅(qū)動程序?qū)ο蟆6?USB 驅(qū)動程序則是與接口相匹配,接口是一個完成特定功能的端點的集合。
設備是如何添加到設備鏈表上去的?
在設備插入 USB 控制器之后,USB core 即會將設備在系統(tǒng)中注冊,添加到 USB 設備鏈表上去。
USB 設備驅(qū)動程序(usb device driver)是如何添加到驅(qū)動鏈表上去的?
在系統(tǒng)啟動注冊 USB core 時,USB 設備驅(qū)動程序即將被注冊,也就添加到驅(qū)動鏈表上去了。
接口是如何添加到設備鏈表上去的?
在 USB 設備驅(qū)動程序和 USB 設備的匹配之后,USB core 會對設備進行配置,分析設備的結(jié)構(gòu)之后會將設備所有接口都添加到設備鏈表上去。比如鼠標設備中有一個接口,USB core 對鼠標設備配置后,會將這個接口添加到設備鏈表上去。
USB 驅(qū)動程序(usb driver)是如何添加到驅(qū)動鏈表上去的?
在每個 USB 驅(qū)動程序的被注冊時,USB 驅(qū)動程序即會添加到驅(qū)動鏈表上去。比如鼠標驅(qū)動程序,usb_mouse_init 函數(shù)將通過 usb_register(&usb_mouse_driver) 將鼠標驅(qū)動程序注冊到 USB core 中,然后就添加到驅(qū)動鏈表中去了。其中 usb_mouse_driver 是描述鼠標驅(qū)動程序的結(jié)構(gòu)體。
已配置狀態(tài)(configured status)之后話
當鼠標的設備、接口都添加到設備鏈表,并且鼠標驅(qū)動程序也添加到驅(qū)動鏈表上去了, 系統(tǒng)就進入一種叫做已配置(configured)的狀態(tài)。要達到已配置狀態(tài),將經(jīng)歷復雜的過程,USB core 為 USB 設備奉獻著無怨無悔。在這個過程中,系統(tǒng)將會建立起該設備的的設備、配置、接口、設置、端點的描述信息,它們分別被 usb_device、usb_configuration、usb_interface、usb_host_interface、 usb_host_endpoint 結(jié)構(gòu)體描述。
設備達到已配置狀態(tài)后,首先當然就要進行 USB 驅(qū)動程序和相應接口的配對,對于鼠標設備來說則是鼠標驅(qū)動程序和鼠標中的接口的配對。USB core 會調(diào)用 usb_device_match 函數(shù),通過比較設備中的接口信息和 USB 驅(qū)動程序中的 id_table,來初步?jīng)Q定該 USB 驅(qū)動程序是不是跟相應接口相匹配。通過這一道關(guān)卡后,USB core 會認為這個設備應該由這個驅(qū)動程序負責。
然而,僅僅這一步是不夠的,接著,將會調(diào)用 USB 驅(qū)動程序中的 probe 函數(shù)對相應接口進行進一步檢查。如果該驅(qū)動程序確實適合設備接口,對設備做一些初始化工作,分配 urb 準備數(shù)據(jù)傳輸。
當 鼠標設備在用戶空間打開時,將提交 probe 函數(shù)構(gòu)建的 urb 請求塊,urb 將開始為傳送數(shù)據(jù)而忙碌了。urb 請求塊就像一個裝東西的“袋子”,USB 驅(qū)動程序把“空袋子”提交給 USB core,然后再交給主控制器,主控制器把數(shù)據(jù)放入這個“袋子”后再將裝滿數(shù)據(jù)的“袋子”通過 USB core 交還給 USB 驅(qū)動程序,這樣一次數(shù)據(jù)傳輸就完成了。
以下是完全注釋后的鼠標驅(qū)動程序代碼 usbmouse.c
/* * $Id: usbmouse.c,v 1.15 2001/12/27 10:37:41 vojtech Exp $ * * ?Copyright (c) 1999-2001 Vojtech Pavlik * * ?USB HIDBP Mouse support */ #include