USB(Universal Serial Bus ),通用串行總線,是一種外部總線標準,用於規範電腦與外部設備的鏈接和通信。是在1994年末由英特爾、康柏、IBM、Microsoft等多家公司聯合提出的,自1996年推出後,已成功替代串口和並口,成爲當今我的電腦和大量智能設備的必配接口之一。linux
linux內核支持兩種類型的USB驅動程序,一種是PC機的USB驅動程序控制插入其中的USB設備,另外一種是USB設備和主機通訊。安全
第一種軟件架構 第二種軟件架構 架構
這裏我學習的是第一種app
對於每一個USB系統來講,都有主機控制器的設備,該控制器和一個根Hub做爲一個總體。這個根Hub下能夠接多級的Hub,每一個子Hub又能夠接子Hub。每一個USB設備做爲一個節點接在不一樣級別的Hub上。每條USB總線上最多能夠接127個設備。異步
常見的USB主控制器規格有:ide
OHCI:主要是非PC系統上的USB芯片,應用於嵌入式系統,遵循USB1.1規範函數
UHCI:大可能是Intel和Via主板上的USB控制器芯片。他們都是由USB1.1規格的。學習
EHCI是由Intel等幾個廠商研發,兼容OHCI UHCI ,遵循USB2.0規範。spa
設備基礎設計
描述符,接口描述符,端點描述符,字符串描述符。一個USB設備只有一個設備描述符。 ,USB設備有5中描述符:設備描述符,配置
在USB設備的邏輯組織中,包含設備、配置、接口和端點4個層次。設備一般有一個或多個配置,配置一般有一個或多個接口,接口有零或多個端點。
每一個USB設備均可以包含一個或多個配置,不一樣的配置使設備表現不一樣的功能組合,配置由多個接口組成。一個USB設備驅動程序對應一個USB接口,一個功能複雜的USB設備能夠具備多個接口,USB設備中的惟一可尋址的部分是設備端點,端點的做用相似於寄存器.
urb
Linux內核中USB代碼經過urb(USB請求塊)和USB設備通訊,以異步方式往USB設備的 特定USB端點發送/接收數據,每一個端點均可以處理一個urb。
urb生命週期
1. USB 設備驅動程序建立並初始化一個訪問特定端點的urb,並提交給USB 核心;
2. USB 核心提交該urb到USB主控制器驅動程序;
3. USB 主控制器驅動程序根據該urb描述的信息,來訪問USB設備;
4. 當設備訪問結束後,USB 主控制器驅動程序通知USB 設備驅動程序。
HID協議
HID(Human Interface Device),屬於人機交互類的設備,如USB鼠標,USB鍵盤,USB遊戲操縱桿等。該類設備必須遵循HID設計規範
USB驅動程序步驟
1 usb驅動使用的是USB總線模式,全部usb驅動都必須建立主要結構體struct usb_driver結構體
2 把struct usb_driver 註冊到usb核心
4 分配一塊緩衝池存放數據
5分配、設置、初始化、提交一個urb,urb是用來傳遞USB主機控制器驅動的數據。當插入的設備和這個usb_driver匹配時,它的probe函數將會調用,咱們在probe函數當中實現對urb的一些列操做.
USB端點有4中類型:控制端點,中斷端點,批量端點,等時端點,對應相應urb。其中等時urb沒有初始化函數
6 usb鼠標獲取數據的中斷處理函數,這個函數是在urb初始化的時候傳遞進來的回調函數,鼠標發生動做時便會觸及這個函數的調用,把鼠標的數據傳遞進來。
由於上傳提示有不安全的代碼(估計誤報),不得已代碼採用截圖模式,請各位大大諒解
總代碼附錄