USB鼠標設備簡單驅動設計

       USB(Universal Serial Bus ),通用串行總線,是一種外部總線標準,用於規範電腦與外部設備的鏈接和通信。是在1994年末由英特爾、康柏、IBM、Microsoft等多家公司聯合提出的,自1996年推出後,已成功替代串口和並口,成爲當今我的電腦和大量智能設備的必配接口之一。linux

linux內核支持兩種類型的USB驅動程序,一種是PC機的USB驅動程序控制插入其中的USB設備,另外一種是USB設備和主機通訊。安全

            第一種軟件架構                                                          第二種軟件架構  架構

wKioL1lgg7SB_UVIAABL3XhuOJI947.png                    wKiom1lgg_Kil9BLAABNC-k-e0E455.png

這裏我學習的是第一種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總線驅動程序會發出命令獲取設備信息(描述符),USB設備會返回描述符給PC,USB設備有5中描述符:設備描述符,配置描述符,接口描述符,端點描述符,字符串描述符。一個USB設備只有一個設備描述符。

       在USB設備的邏輯組織中,包含設備、配置、接口和端點4個層次。設備一般有一個或多個配置,配置一般有一個或多個接口,接口有零或多個端點。

wKioL1lgiEHQUgH5AADFayMTdXI891.png

       每一個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結構體

wKioL1lhg8nCpVByAAAnZuQBteE464.png


2 把struct usb_driver 註冊到usb核心

wKiom1lhhADwfGTsAAAWaGKPeEs532.png

4 分配一塊緩衝池存放數據

wKiom1lhhEvSb80bAAA0ooUZTu8881.png


5分配、設置、初始化、提交一個urb,urb是用來傳遞USB主機控制器驅動的數據。當插入的設備和這個usb_driver匹配時,它的probe函數將會調用,咱們在probe函數當中實現對urb的一些列操做.

wKioL1lhhHfReIx6AABIrpvWN8c645.png

USB端點有4中類型:控制端點,中斷端點,批量端點,等時端點,對應相應urb。其中等時urb沒有初始化函數


6 usb鼠標獲取數據的中斷處理函數,這個函數是在urb初始化的時候傳遞進來的回調函數,鼠標發生動做時便會觸及這個函數的調用,把鼠標的數據傳遞進來。

wKiom1lhhLTiQ_DeAABPdldvdVE587.png

由於上傳提示有不安全的代碼(估計誤報j_0064.gif),不得已代碼採用截圖模式,請各位大大諒解j_0059.gif

總代碼附錄 

wKioL1lhhYzRgSijAACNG28_Sbs149.png

wKiom1lhhfzzUNmrAAB-IU5v5gs949.pngwKioL1lhhibDiQQeAACOsz3r_ig666.pngwKioL1lhhlST9ZbYAACdobk4UcU719.png

wKiom1lhhqWx_RdNAAB4FObdzcY386.png

wKiom1lhhuWB7ZYYAAAw2EtayQg599.png

相關文章
相關標籤/搜索