Linux下的USB匯流排驅動 01 USB理論

2021-06-12 05:55:19 字數 2606 閱讀 3372

1.      usb概念概述

usb1.0版本速度1.5mbps(低速usb) usb1.1版本速度12mbps(全速usb) usb2.0版本速度480mbps(高速usb)

usb驅動由usb主機控制器驅動和usb裝置驅動組成。usb主機控制器是用來控制usb裝置和cpu之間通訊的,usb主機控制器驅動主要用來驅動晶元上的主機控制器硬體。usb裝置驅動主要是指具體的例如usb滑鼠,usb鍵盤燈裝置的驅動。

一般的通用的linux裝置,如u盤、usb滑鼠、usb鍵盤,都不需要工程師再編寫驅動,需要編寫的是特定廠商、特定晶元的驅動,而且往往也可以參考核心中已經提供的驅動模板。usb只是乙個匯流排,真正的usb裝置驅動的主體工作仍然是usb裝置本身所屬型別的驅動,如字元裝置、tty裝置、塊裝置、輸入裝置等。

2.      usb主機控制器

usb主機控制器屬於南橋晶元的一部分,通過pci匯流排和處理器通訊。usb主機控制器分為uhci(英特爾提出)、ohci(康柏和微軟提出)、 ehci。其中ohci驅動程式用來為非pc系統上以及帶有sis和ali晶元組的pc主辦上的usb晶元提供支援。uhci驅動程式多用來為大多數其他 pc主機板(包括intel和via)上的usb晶元提供支援。enci相容ohci和uhci。uhci的硬體線路比ohci簡單,所以成本較低,但需要較複雜的驅動程式,cpu負荷稍重。主機控制器驅動程式完成的功能主要包括:解析和維護urb,根據不同的端點進行分類快取urb;負責不同usb傳輸型別的排程工作;負責usb資料的實際傳輸工作;實現虛擬跟hub的功能。

3.      usb裝置與usb驅動的匹配

usb裝置與usb驅動怎麼匹配的呢?實際上usb裝置中有乙個模組叫韌體,是韌體資訊和usb驅動進行的匹配。韌體是固化在積體電路內部的程式**,usb韌體中包含了usb裝置的出廠資訊,標識該裝置的廠商id、產品id、主版本號和次版本號等。另外韌體中還包含一組程式,這組程式主要完成 usb協議的處理和裝置的讀寫操作。usb裝置韌體和usb驅動之間通訊的規範是通過usb協議來完成的。

4.      usb裝置的邏輯結構和端點的傳輸方式

usb裝置的邏輯結構包括裝置、配置、介面和端點,分別用usb_device、usb_host_config、 usb_inte***ce、usb_host_endpoint表示。

端點的傳輸方式包括控制傳輸、中斷傳輸、批量傳輸、等時傳輸。

控制傳輸主要用於向裝置傳送配置資訊、獲取裝置資訊、傳送命令到裝置,或者獲取裝置的狀態報告。控制傳輸一般傳送的資料量較小,當usb裝置插入時,usb核心使用端點0對裝置進行配置,另外,埠0與其他端點不一樣,端點0可以雙向傳輸。

中斷傳輸就是中斷端點以乙個固定的速度來傳輸較少的資料,usb鍵盤和滑鼠就是使用這個傳輸方式。這裡說的中斷和硬體上下文中的中斷不一樣,它不是裝置主動傳送乙個中斷請求,而是主機控制器在保證不大於某個時間間隔內安排一次傳輸。中斷傳輸對時間要求比較嚴格,所以可以用中斷傳輸來不斷地檢測某個裝置,當條件滿足後再使用批量傳輸傳輸大量的資料。

批量傳輸通常用在資料量大、對資料實時性要求不高的場合,例如usb印表機、掃瞄器、大容量儲存裝置、u盤等。

5.      usb的urb請求塊

usb請求塊(usbrequest block,urb)是usb主機控制器和裝置通訊的主要資料結構,主機和裝置之間通過urb進行資料傳輸。當主機控制器需要與裝置互動時,只需要填充乙個urb結構,然後將其提交給usb核心,由usb核心負責對其進行處理。

urb處理流程:

step1:建立乙個urb結構體usb_alloc_urb()

step2:初始化,被安排乙個特定的usb裝置的特定端點。fill_int/bulk/control_urb()

step3:被usb裝置驅動提交給usb核心usb_submit_urb(),注意gpf_atomic,gpf_noio,gpf_kernel的使用區別。

step4:提交由usb核心指定的usb主機控制器驅動,被主機控制器驅動處理,進行一次到usb裝置的傳輸,該過程由usb核心和主機控制器完成,不受usb裝置驅動控制

step5:當urb完成,usb主機控制器驅動通知usb裝置驅動。

簡單的批量與控制urb

有時候usb驅動程式只是從usb裝置上接收或傳送一些簡單的資料,這時候可以使用usb_bulk/control_msg()完成,這兩個函式是同步的,因此不能在中斷上下文和持有自旋鎖的情況下使用。

6.      usb的列舉過程

核心輔助線程khubd用來監視與該集線器連線的所有埠,通常情況下,該執行緒處於休眠狀態,當集線器驅動程式檢測到usb埠狀態變化後,該核心執行緒立馬喚醒。

usb的列舉過程:usb的列舉過程是熱插拔usb裝置的起始步驟,該過程中,主機控制器獲取裝置的相關資訊並配置好裝置,集線器驅動程式負責該列舉過程。列舉過程主要分如下幾步:

step1:根集線器報告插入裝置導致的埠電流變化,集線器驅動程式檢測到這一狀態變化後,喚醒khubd執行緒。

step2:khubd識別出電流變化的那個埠

step3:khubd通過給控制端點0傳送控制urb來實現從1-127中選出乙個數作為插入裝置的批量端點

step4:khubd利用埠0使用的控制urb從插入的裝置那裡獲得裝置描述符,然後獲得配置描述符,並選擇乙個合適的。

step5:khubd請求usb核心把對應的客戶驅動程式和該usb裝置掛鉤。

Linux下的USB裝置驅動

usb是我們常用的介面,它有四條引腳線 5v d d gnd。pc的usb口的d d 接有下拉電阻,平時處於低電平狀態。usb裝置的usb口內部,d 或d 接有1.5k的上拉電阻 它一接入pc,就會把pc的usb口的d 或d 拉高,從硬體的角度通知pc有新裝置接入。所以usb能夠自動監測裝置。簡單來...

大話USB驅動之匯流排驅動程式

匯流排驅動是不用改的。核心都幫我們做好了。為了了解整個usb驅動的體系,我們來分析一下匯流排驅動程式。一.匯流排框圖 匯流排的圖畫的已經很清楚了,這篇部落格我們分析的是左邊的程式,在下篇我們想通過usb鍵盤這一實際樣例來解說。二.程式實現 1.因為 太多且關係複雜這裡僅僅列出呼叫的函式 沒有寫引數 ...

USB學習之二 USB匯流排驅動程式

usb匯流排驅動程式的作用 1.識別usb裝置 1.1 分配位址 1.2 並告訴usb裝置 set address 1.3 發出命令獲取描述符 描述符的資訊可以在include linux usb ch9.h看到 2.查詢並安裝對應的裝置驅動程式 3.提供usb讀寫函式 將乙個usb裝置接到開發板上...