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:

USB HID协议中几个关键概念的理解_第1张图片

Report Descriptor与USB其它的描述符不同,其长度与内容由设备的Report所需的Data段来决定。Report Descriptor由Item构成,Item有自己的数据结构,所有的Item都有一个字节的前缀(下图的Byte 0):

USB HID协议中几个关键概念的理解_第2张图片

前缀中包含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

 

你可能感兴趣的:(USB HID协议中几个关键概念的理解)