USB驅動程序設計(2)—USB協議分析

1.USB設備邏輯結構

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

  • 每個USB設備都可以包含一個或多個配置,不同的配置使設備表現出不同的功能組合,配置由多個接口組成。在USB協議中,接口代表一個基本的功能,一個功能複雜的USB設備可以具有多個接口,而接口是端點的彙集。
  • 一個USB播放器帶有音頻,視頻功能,還有旋鈕和按鈕。
    • 配置1:音頻(接口)+旋鈕(接口)
    • 配置2:視頻(接口)+旋鈕(接口)
    • 配置3:音頻(接口)+視頻(接口)+按鈕(接口)
  • 音頻接口、視頻接口、按鈕接口、旋鈕接口均需要一個驅動程序。
  • USB設備中的唯一可尋址的部分是設備端點,端點的作用類似於寄存器。每個端點在設備內部有唯一的端點號,這個端點號是在設備設計時給定的。主機和設備的通信最終都作用於設備上的各個端點。每個端點所支持的操作都是單向的,要麼只讀,要麼只寫。

2.USB描述符

  • 當我們把USB備(如:USB標)插到我們的PC時,主機能夠自動識別出我們USB設備類型?why?
  • 在每一個USB設備內部,包含了固定格式的數據,通過這些數據,USB主機就可以獲取USB設備的類型、生產廠商等信息。這些固定格式的數據,我們就稱之爲USB描述符。標準的USB設備有5USB描述符:設備描述符,配置描述符,接口描述符,端點描述符,字符串描述符。

2.1 設備描述符(18字節)

  • bLength:描述符長度,固定爲0x12。
  • bDescriptorType:設備描述符類型,固定爲0x01。
  • bcdUSB : USB 規範發佈號。表示了本設備能適用於那種協議,如2.0=0200
  • bDeviceClass:類型代碼。
  • bDeviceSubClass:子類型代碼。
  • bDeviceProtocol:協議代碼。
  • bMaxPacketSize0:端點0最大分組大小。
  • bMaxPacketSize0:端點0最大分組大小。
  • idVendor:供應商ID。
  • idProduct:產品ID(由廠商分配)。
  • bcdDevice:設備出產編碼,由廠家自行設置。
  • iManufacturer:廠商描述符字符串索引.索引到對應的字符串描述符。
  • iProduct:產品描述符字符串索引。
  • iSerialNumber:設備序列號字符串索引。
  • bNumConfigurations:可能的配置數。

2.2 配置描述符(8字節)

  • bLength : 描述符長度,固定爲0x09
  • bDescriptorType : 配置描述符類型,固定爲0x02
  • wTotalLength : 返回整個數據的長度,指此配置返回的配置描述符,接口描述符以及端點描述符的全部大小。
  • bNumInterfaces : 配置所支持的接口數,指該配置配備的接口數量,也表 示該配置下接口描述符數量。
  • bConfigurationValue : 作爲Set Configuration的一個參數選擇配置值。
  • iConfiguration : 用於描述該配置字符串描述符的索引。
  • bmAttributes : 供電模式選擇。Bit4-0保留,D7:總線供電,D6:自供電, D5:遠程喚醒.
  • MaxPower : 總線供電的USB設備的最大消耗電流,以2mA爲單位。

2.3 接口描述符(8字節)

  • bLength : 描述符長度,固定爲0x09
  • bDescriptorType : 接口描述符類型,固定爲0x04
  • bInterfaceNumber: 該接口的編號。
  • bAlternateSetting : 用於爲上一個字段選擇可供替換的設置。
  • bNumEndpoint : 使用的端點數目,端點0除外。
  • bNumEndpoint : 使用的端點數目,端點0除外。
  • bInterfaceClass : 類型代碼(由USB組織分配)。
  • bInterfaceSunClass : 子類型代碼(由USB組織分配)。
  • bInterfaceProtocol : 協議代碼(由USB組織分配)。
  • iInterface : 字符串描述符的索引。

2.4 端點描述符(7字節)

  • bLength : 描述符大小,固定爲0x07
  • bDescriptorType : 接口描述符類型,固定爲0x05
  • bEndpointType : USB設備的端點地址。Bit7,方向,對於控制端點可以忽略,1/0:IN/OUTBit6-4,保留。BIt3-0:端點號.
  • bmAttributes : 端點屬性,Bit7-2,保留。BIt1-000控制,01 同步,02批量,03中斷。
  • wMaxPacketSize : 本端點接收或發送的最大信息包大小。
  • bInterval : 輪訓數據傳送端點的時間間隔.對於批量傳送和控制傳 送的端點忽略.對於同步傳送的端點,必須爲1,對於中斷傳送的端 點,範圍爲1-255

3.USB數據通訊

  • 對於USB協議的分析最好能從現有的一個“包”入手,比如說下面這一副圖:

  • 根據這幅圖我們也可以已大概看出這個“包”的層次關係。
    • 一個USB的包稱爲一個傳輸
    • 一個傳輸下分爲好幾個事務,比如說圖中的事務0,1,2,3,4
    • 一個事務又分爲好幾個,比如說Packet136、137、138等等
    • 一個包又分爲好幾個或者說字段

3.1 傳輸

  • USB的數據通訊首先是基於傳輸(Transfer)的,傳輸的類型有:中斷傳輸、批量傳輸、同步傳輸、控制傳輸
    • 中斷傳輸用於一些小數據量的、實時的傳輸,比如說鼠標、鍵盤。
    • 批量傳輸用於大數據量的傳輸,比如說U盤,硬盤等等。
    • 同步傳輸是不可靠傳輸,它容忍一定的錯誤,比如所麥克風,喇叭等。
    • 控制傳輸用於對設備的控制。
  • 根據傳輸的第一個字節就可以判斷出這個傳輸是屬於哪個傳輸。比如上面這幅圖是控制傳輸

3.2 事務

  • 一次傳輸由一個或多個事務(transaction)構成,事務可分爲:In(輸入)事務,Out(輸出)事務,Setup(設置)事務。同樣由第一個字節來區分出是屬於哪個事務。上面的包依次是:Setup、IN、IN、IN、OUT

3.3 包

  • 一個事務由一個或多個包(packet)構成,包可分爲:令牌包(setup)、數據包(data)、握手包(ACK)和特殊包。由包的第二個字節來區分是屬於哪種包。比如說事務0由3個包構成:Setup、DATA、ACK。

3.4 域

  • 一個包由多個域構成,域可分爲:同步域(SYNC),標識域(PID),地址域(ADDR),端點域(ENDP),幀號域(FRAM),數據域(DATA),校驗域(CRC)

4.USB設備枚舉

  • USB設備在正常工作以前, 第一件要做的事就是枚舉。枚舉是讓主機認得這個USB設備, 並且爲該設備準備資源,建立好主機和設備之間的數據傳遞通道。
  • 設備枚舉包括以下幾個過程:
    • 1. 獲取設備描述符
    • 2. 復位
    • 3. 設置地址
    • 4. 再次獲取設備描述符(需要查看地址有沒有設置成功)
    • 5. 獲取配置描述符
    • 6. 獲取接口、端點描述符
    • 7. 獲取字符串描述符
    • 8. 選擇設備配置
  • USB鼠標枚舉

  • 傳輸0:獲取鼠標設備描述符(控制傳輸
    • 首先這是pc機發起一個控制傳輸,它需要獲取一個描述符,具體到設備描述符。
    • 它(傳輸0)的事務0的功能就是請求設備描述符。它由3個包構成,包後面的箭頭代表數據的流向,分別是流向設備、流向設備、流向主機。
    • 接下來的3個事務都是IN事務,他們就是負責接收設備描述符的,可以發現,3個事務的Data傳輸量就是18(8+8+2)個字節。
    • pc機獲取鼠標的設備描述符之後,會後鼠標發送一個reset包重置。
  • 傳輸1:設置鼠標地址(控制傳輸
    • 每一個設備在usb系統中都有一個獨立的地址,這個地址是主機分配給usb設備的。
  • 傳輸2:再次獲取鼠標設備描述符(控制傳輸
  • 傳輸3:獲取鼠標配置描述符(控制傳輸)...​​​​​​​
發佈了222 篇原創文章 · 獲贊 226 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章