1. 程式人生 > >USB HID協議中幾個關鍵概念的理解

USB HID協議中幾個關鍵概念的理解

USB HID描述符的體系結構如下:

在Interface描述符中,HID裝置的:

    1. bInterfaceClass值一定是3(HID Class);
    2. bInterfaceSubClass的值可能為:0 (No Subclass), 1(Boot Interface Class)或者2-255(Reserved);
    3. bInterfaceProtocol的值可能為:0(None), 1(Keyboard), 2(Mouse)或者3-255(Reserved);
    4. Interface通訊endpoint一定是Control或Interrupt型別的。

Reports:USB協議中,每USB Frame傳輸(Interrupt)一個事務(Transaction),一個Transaction由一個或多個Packet構成,但對於高速裝置來說,上限是64bit。一次傳輸(Transfer)是指一個或多個Transaction構成的有意義的(或完整的?)資料集。在HID協議裡,Transfer等同於Report。

某些裝置在一個Endpoint上,可能支援多個Report結構(有的僅是長度不一樣),因此要用Report ID來標明此Report的資料結構。Report ID是一個單位元組的字首,如果Report Descriptor沒有Report ID,可以認為僅有一種Input, Output and Feature型別Report存在。

Report Descriptor描述了一組資料,每一條資料在HID協議中稱為Item:

Report Descriptor與USB其它的描述符不同,其長度與內容由裝置的Report所需的Data段來決定。Report Descriptor由Item構成,Item有自己的資料結構,所有的Item都有一個位元組的字首(下圖的Byte 0):

字首中包含Item Tag, Item Type&Item Size。Item包含可選的Data段,Data段的長度由Item的基本功能決定。協議規定了倆種類型的Item:Short Item&Long Item:Short Item可選Data段長度為0,1,2 or 4;對於Long Item,bSize段為2,下圖給出了一個Long Item的例子:

對於Short Item:bSize欄位,取值與Data段長度的對應關係為:0-0byte, 1-1byte, 2-2byte, 3-4byte;bType取值:0-Main, 1-Global, 2-Local, 3-Reserved;bTag表示此Item的功能。

Item的型別有3種:Main, Global & Local。Main型別的Item有5種Tag:

    Input:從裝置來的資料;
    Output:發給裝置的資料;
    Feature:描述裝置的輸入、輸出;
    Collection:Input、Output&Feature的集合,如mouse、Keyboard等等;
    End Collection:Collection集合結束。

Report Descriptor提供裝置每個資料的描述:Main Item的tag資訊給出了資料的大小,絕對(Absolute)還是相對(Relative)型別,以及其它的一些資訊;後續的Local與Global Item定義的資料的範圍(Minimum&Maximum)。通過Report Descriptor,Application可以瞭解如何處理裝置輸入的資料。

HID裝置驅動需要包含一個Item Parser,用於分析Report Descriptor。Item Parser逐步解析Report Descriptor,並將解析出的Item儲存到內部狀態表(State Table)。

從Item Parser的角度來看,HID Class裝置看起來是這樣:

Usages屬於Report Descriptor的一部分,Report Descriptor描述了Data段的格式-如,3個8 bit的欄位,Usage描述瞭如何使用這個欄位-如x, y&z座標。一個Usage使用32bit表示,高16bit表示Usage Page,低16bit表示Usage ID, 用於從Usage Page中選擇一個特定的Usage。

下面是一個3鍵滑鼠的Report Descriptor:

Usage Page (Generic Desktop), ;Use the Generic Desktop Usage Page

Usage (Mouse),

Collection (Application), ;Start Mouse collection

Usage (Pointer),

Collection (Physical), ;Start Pointer collection

Usage Page (Buttons)

Usage Minimum (1),

Usage Maximum (3),

Logical Minimum (0),

Logical Maximum (1), ;Fields return values from 0 to 1

Report Count (3),

Report Size (1), ;Create three 1 bit fields (button 1, 2, & 3)

Input (Data, Variable, Absolute), ;Add fields to the input report.

Report Count (1),

Report Size (5), ;Create 5 bit constant field

Input (Constant), ;Add field to the input report

Usage Page (Generic Desktop),

Usage (X),

Usage (Y),

Logical Minimum (-127),

Logical Maximum (127), ;Fields return values from -127 to 127

Report Size (8),

Report Count (2), ;Create two 8 bit fields (X & Y position)

Input (Data, Variable, Relative), ;Add fields to the input report

End Collection, ;Close Pointer collection

End Collection ;Close Mouse collection