1. 程式人生 > >USB-HID裝置協議解讀

USB-HID裝置協議解讀

   參考文獻:Device Class Definition for Human Interface Devices(HID)

用於描述HID功能特徵的有三個值:Class   SubClass   Interfaces

Subclass Code Description
   0    No Subclass
   1    Boot Interface Subclass
   2 - 255    Reserved


Protocol Code Description
  0    None
  1    Keyboard
  2    Mouse
  3 - 255   Reserved

  • The bInterfaceProtocol member of an Interface descriptor only has meaning if the bInterfaceSubClass

member declares that the device supports a boot interface, otherwise it is 0.

HID裝置的特性

HID裝置與HID驅動只能通過控制傳輸或者中斷傳輸來連線,且端點0在USB裝置中通常是作為控制管道。

在HID中,一次傳輸就是一個報告。

HID 支援在執行時忽略報表中某些欄位的功能,這通過定義報告符長度大於實際生成的報告符長度來實現

HID裝置通過HID描述符、報告描述符和物理描述符進行描述,其中物理描述符是可選的

HID裝置的描述符分層圖:

由圖可看出,HID Descriptor是與Interface Descriptor並行的描述符,其Class、SubClass和Protocol屬性都是在介面描述符中配置,如下:

  •  bInterfaceClass ——  3(HID Class)
  •  bInterfaceSubclass  ——   0(Have no subclass) / 1(Boot Device)
  •  bInterfaceProtocol  ——   0(Have no Protocol, only valid when Subclass is Boot Device)

   同時,Device Descriptor 中的bDeviceClass需配置成0x00

HID Descriptor的組成:

bLength     bDescriptorType   bcdHID   bCountryCode   bNumDescriptors  bDescriptorType   bDescriptorLength...

HID Report Descriptor

    如果報告描述符中有出現Report ID,則表示有多個Report,否則就只有一個Input、Output和Feature結構體存在,她們即代表所有的裝置資料。

     報告描述符中由不同的item組成,一個Item是關於裝置的一塊資訊,所有Item都有1位元組的卷標,卷標裡包含Tag,type,size

    相應的HID Driver裡面有一個Item 解析器,對報告符中的Item進行解析,Item解析器一般會解析到Main Item、Pop Item和Push Item並進行相應的操作。

Report Descriptor中的Item解讀

     Item由三種類型:Main(主專案)、Global(全域性專案)、Local(區域專案),後兩者主要用於修飾Main Item

     Local Item只適用於列下的第一個主專案,而Global Item則適用於其下方的所有主專案

    1 Main Item的主要資料格式

  • input:裝置操作輸入到主機的資料格式,該資料格式會形成一個輸入報告。獲取輸入報告的方式有兩種:1、用Control pipe以get report(input)來傳輸;2、用Interrupt pipe在每一週期固定更新輸入報告給主機
  • Output:主機輸出到裝置的資料格式,形成一個輸出報告,以Control pipe用set report(output)將報告送到裝置,通常不建議用Interrupt pipe.
  • Feature:主機送到裝置的組態所需資料的資料格式,特徵報告只能用Control pipe以get report(feature)和set report(feature)來取得和送出。
  • Collection:Input、Output和Feature的集合,如Mouse、Keyboard等(程式碼型別有:Physical、Application、Logical、Report、Named Array、Usage Switch、Usage Modify、Reserved)
  • End Collection:Collection集合結束

    2、Global Item的主要資料格式(不完全)

  • Usage Page
  • Report Count
  • Report Size

    3、Local Item的主要資料格式(不完全)

  • Usage

        Usages(用途)是報告符中的一部分,主要用於確認裝置的具體操作資訊,一個報告符中可以含有多個Usage tags。

         Usage和Control的關係是一一對應的   

         Usage是一個32位的無符號整型,高16位定義用途頁(Usage Page),低16位定義用途ID(Usage ID)

  • Usage Mininum

  • Usage Maximum

一般的Items 資料格式分兩個部分:字首和資料

例如:USAGE_PAGE(0x05,0x01)  前者表示字首,後者表示資料

           0x01表示用途頁為通用桌面裝置

            0x05——00000101 

                   D0~D1表示這個字首後面跟的資料長度

                   D2~D3表示字首的型別,0-main  1-global  2-local   3-reserved

                   D4~D7表示字首的tag,一般有input、output、feature、collection、end collection

   HID規範中指出:HID為傳送輸入報告必須擁有一箇中斷輸入端點。中斷IN端點使HID能夠在非可預期的時間內向主機發送資訊,主機驅動程式將使用中斷事務來週期性的輪詢裝置以獲得資料。

   因此,對於裝置來說,其傳送端點(對於主機來說是輸入端點)必須為中斷端點,這是由HID的類驅動程式所決定的,主機的類驅動程式不會讀取HID介面的其它型別的端點的資料。這樣設計也是為了保證資料傳輸的頻寬。
    而對於HID介面的輸出端點(對於裝置來說是接收端點),可以使用其它的型別,比如批量端點。