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