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