USB_21、USB接口HID类设备:物理描述符
物理描述符也称作实体描述符。被用来描述设备的行为特性。
物理描述符是一种数据结构,它提供有关**控件或控件的人体特定部分的信息。
例如,物理描述符可能指示右手拇指用于**按钮5.应用程序可以使用此信息将功能分配给设备的控件。
物理描述符完全是可选的。 它们增加了复杂性,并且对大多数设备提供的回报很少。 但是,某些设备,特别是那些具有大量相同控件的设备(例如按钮)会发现物理描述符可以帮助不同的应用程序以更一致的方式为这些控件分配功能。
类似的物理描述符被分组。 报表描述符中包含的指示符索引项目将项目(或控件)映射到物理描述符集合中包含的特定物理描述符(以下统称为描述符集合)。
每个描述符集由一个短标题和一个或多个物理描述符组成。 标题定义了偏移(描述符集是针对右手还是左手用户)和集合的首选项。 对于特定偏置,供应商可以定义备用物理描述符(例如,惯用右手的用户可能能够以多种方式保持设备,因此重新映射触摸各个项目的手指)。
每个物理描述符包含以下三个字段:
- Designator(指示符):识别影响项目的实际身体部位 - 例如手。
- Qualifier(限定符):进一步定义指示符 - 例如,右手或左手。
- Effort(努力值):量化用户必须用于实现项目的努力的价值。
如果多个项目标识相同的指定符/限定符组合,则可以使用“Effort”值来解析函数的分配。 当手处于“静止”位置时,努力值0将用于定义手指所在的按钮,即,用户实际上不需要**按钮。 当手指必须伸展以达到控制时,努力值会增加。
两个或更多控件只有相同的时间指示符/限定符/努力组合是因为它们物理连接在一起。 一个长的瘦键帽,一端是'+',另一端是' - '就是一个很好的例子。 如果它是作为两个分立的按钮电气地实现的,即使它们都在同一个键帽下,也可以同时按下两个按钮。 如果供应商决定对于该产品,同时按下“+”和“ - ”按钮是有效的,那么它们将被描述为具有相同物理描述符的两个离散按钮。 但是,如果键帽标记为“音量”并且同时按下两个按钮没有任何意义,那么供应商可能会选择将按钮描述为具有三种有效状态的单个项目:关闭,更多音量(+), 并减少音量( - )。 在这种情况下,只需要一个物理描述符。
考虑一个操纵杆,它在底座的左侧有两个按钮(A和B),在杆的前面有一个触发按钮,与按钮A进行逻辑或操作。操纵杆底座通常用左手握住,而 用右手操纵棍子。 因此,第一个描述符集将指定按钮A为:
- 食指,右,努力0
同样,按钮B将被指定为:
- 拇指,左,努力0
如果将操纵杆放在桌面上并且左手用于控制基座上的两个按钮,则另一个描述符集可以识别按钮A的替代映射:
- 中指,左,努力0
按钮B将被指定为:
- 食指,左,努力0
注:指示符标签是可选的,可以为设备的所有,部分或其中一个项目或元素提供。
描述符集0是一个特殊的描述符集,它指定了附加描述符集的数量,以及每个集合中物理描述符的数量。
Part | Offset/Size (Bytes) | Description |
bNumber | 0/1 | 指定物理描述符集数量的数字表达式。 不要在此编号中包含物理描述符0本身。 |
bLength | 1/2 | 标识每个物理描述符长度的数字表达式。 |
在从主机接收到Get_Descriptor请求时,HID类设备将返回在请求wValue低字节中指定的描述符集。 描述符集由标题后跟一个或多个物理描述符组成。
HID类设备对其物理描述符使用以下格式。
- 偏差字段指示描述符集正在表征哪一只手。 这可能不适用于某些设备。
注:仅适合右手的设备不会返回具有左手偏置的描述符集。
- 首选项字段指示描述符集是否包含首选或替代指示符信息。 供应商将为最优选或最典型的物理信息集定义偏好值0。 较高的偏好值表示较不优选的描述符集。
- 描述符集中的物理描述符由报表描述符中的指示符索引项引用。
- 物理描述符包含以下部分:
Part | Offset/Size (Bytes) | Description |
Designator |
0/1 | 指定值; 指示身体的哪个部分影响该项目 |
bFlags | 1/1 | 指定标志的位: 7..5 限定符 4..0 努力值 |
指定值可选如下:
bDesignator取值含义表 | |||
bDesignator取值 | 含义 | bDesignator取值 | 含义 |
0x00 | 无 | 0x15 | 小指 |
0x01 | 手 | 0x16 | 头 |
0x02 | 眼球 | 0x17 | 肩 |
0x03 | 眉 | 0x18 | 腰骨 |
0x04 | 眼皮 | 0x19 | 腰 |
0x05 | 耳 | 0x1A | 大腿 |
0x06 | 鼻 | 0x1B | 膝盖 |
0x07 | 嘴 | 0x1C | 小腿 |
0x08 | 上唇 | 0x1D | 足 |
0x09 | 下唇 | 0x1E | 脚 |
0x0A | 颚 | 0x1F | 脚跟 |
0x0B | 颈 | 0x20 | 拇指 |
0x0C | 上臂 | 0x21 | 大拇指 |
0x0D | 手肘 | 0x22 | 第二指 |
0x0E | 前臂 | 0x23 | 第三指 |
0x0F | 手腕 | 0x24 | 第四指 |
0x10 | 手掌 | 0x25 | 小拇指 |
0x11 | 拇指 | 0x26 | 眉 |
0x12 | 食指 | 0x27 | 脸 |
0x13 | 中指 | 0x28~0xFF | 保留 |
0x14 | 无名指 |
- 限定符字段指示指定者定义的手(或身体的一半)。 这可能不适用于某些设备。
Qualifier取值含义 | |||
Qualifier取值 | 含义 | Qualifier取值 | 含义 |
0x00 | 无 | 0x04 | 其中之一 |
0x01 | 右 | 0x05 | 中间 |
0x02 | 左 | 0x06 | 保留 |
0x03 | 两者同时 | 0x07 | 保留 |
- “努力”字段表示用户访问控件的容易程度。 值0表示用户可以快速轻松地影响控件。 随着值的增加,用户变得更难或需要更长时间来影响控制。
想要详细的学习物理描述符,可以看 HID Usage Tables 1.12的附录章节。
其中以一个游戏手柄的例子讲述了一个物理描述符的使用。