欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

从零开始学USB(二十二、USB接口HID类设备(四)_报表描述符Local类)

程序员文章站 2022-05-21 17:51:05
...

本地项目标签定义控件的特征。 这些项目不会转移到下一个主要项目。 如果Main项定义了多个控件,则可能会有几个类似的Local项标签。 例如,一个Input项可能有几个与之关联的Usage标签,每个控件都有一个。

 

Tag One-Byte Prefix (nn represents size value) Description
Usage 0000 10 nn 项目使用的使用指数; 表示项目或集合的建议用法。 在项表示多个控件的情况下,Usage标签可以建议对数组中的每个变量或元素使用。
Usage Minimum 0001 10 nn 定义与数组或位图关联的起始用法。
Usage Maximum 0010 10 nn 定义与数组或位图关联的结束用法。
Designator Index 0011 10 nn 确定用于控件的正文部分。 索引指向物理描述符中的指示符。
Designator Minimum 0100 10 nn 定义与数组或位图关联的起始指示符的索引。
Designator Maximum 0101 10 nn 定义与数组或位图关联的结束指示符的索引。
String Index 0111 10 nn String描述符的字符串索引; 允许字符串与特定项或控件相关联。
String Minimum 1000 10 nn 指定将一组顺序字符串分配给数组或位图中的控件时的第一个字符串索引。
String Maximum 1001 10 nn 指定将一组顺序字符串分配给数组或位图中的控件时的最后一个字符串索引。
Delimiter 1010 10 nn 定义一组 Local 项目的开始和结束, 1=开始, 0= 结束
  1010 10 nn –
1111 10 nn
保留
  • 虽然Locaal项目不会转移到下一个Main项目,但它们可能适用于单个项目中的多个控件。 例如,如果定义五个控件的Input项前面有三个Usage标记,则三个用法将按顺序分配给前三个控件,第三个用法也将分配给第四个和第五个控件。 如果项目没有控件(报表计数= 0),则Local项目标签将应用于Main项目(通常是集合项目)。
  • 要为单个Main项目中的每个控件分配唯一用法,只需按顺序指定每个Usage标记(或使用Usage Minimum或Usage Maximum)。
  • 所有本地项目都是无符号整数。
  • 同样重要的是要记住,Usage项目传达有关数据的预期用途的信息,并且可能与实际测量的内容不对应。 例如,操纵杆将具有与其轴数据相关联的X和Y用法(而不是Usages Rx和Ry)。
  • 由于按钮位图和数组可以表示具有单个项目的多个按钮或开关,因此将多个用法分配给主项目可能很有用。 Usage Minimum指定与数组或位图中第一个未关联控件关联的用法。 Usage Maximum指定与项元素关联的使用值范围的结尾。 以下示例说明了如何将其用于105键键盘。

从零开始学USB(二十二、USB接口HID类设备(四)_报表描述符Local类)

  • 如果将Usage Minimum声明为扩展使用,则还必须将关联的Usage Maximum声明为扩展使用。
  • 使用解释,Usage Minimum或Usage Maximum项目根据项目的bSize字段而变化。 如果bSize字段= 3,则该项被解释为32位无符号值,其中高16位定义Usage Page,低16位定义Usage ID。定义使用情况页面和使用情况ID的32位用法项通常称为“扩展”用法。        如果bSize字段= 1或2,则Usage被解释为无符号值,用于在当前定义的Usage页面上选择Usage ID。 当解析器遇到主项时,它将最后声明的Usage页面与Usage连接在一起以形成完整的使用值。 扩展的用法可用于覆盖当前为各个用法定义的使用页面。
  • 通过简单地用Delimiter项目包围它们,可以将两个或更多个替代用法与控件相关联。 分隔符允许为控件定义别名,以便应用程序可以以多种方式访问它。 形成分隔集的用法按优先顺序组织,其中声明的第一个用法是控件的最优选用法。 HID解析器必须处理Delimiters,但是他们定义的替代用法的支持是可选的。 系统软件可能无法访问定义的第一个(最优选)用法以外的用法。
  • 在定义适用于应用程序集合或数组项目的用法时,不能使用Delimiters。

注:正确使用Usage非常重要。 虽然存在非常具体的用途(起落架,自行车车轮等),但这些用途旨在识别具有非常特定应用的设备。 带有通用按钮的操纵杆不应该为任何按钮分配特定于应用程序的用法。 相反,它应该分配一般用法,例如“按钮”。然而,运动自行车或飞行模拟器的驾驶舱可能想要狭义地定义其每个数据源的功能。

 

 

Usage、 Usage Minimum 和 Usage Maximum 项目
 

这 3 个项目输入 Local 类型项目。
Usage 项目和 Global 类型的 Usage Page 项目协同描述项目或集合的功能。
一个报表可以指定一个 Usage 给许多个控制, 或是指定不同的 Usage 给每一个控制。如果一个报表项目之前有一个 Usage ,此 Usage 应用到该项目的所有控制。如果一个报表项目之前有一个以上的 Usage ,每一个 Usage 应用到一个控制, Usage 与控制是按顺序结合的
例如下面报表描述符的一个局部,报表含有 2 个输入字节,第一个字节的用法是 x,第 2 个字节是 y。

  1. Report Size (8)
  2. Report Count (2)
  3. Usage (x)
  4. Usage (y)
  5. Input (Data, Variable, Absolute)

如果一个报表项目之前有一个以上的 Usage ,而且控制的数目多于 Usage 的数目,每一个 Usage 与一个控制对应,最后一个 Usage 则应用到所有剩余的控制。
例如在下面报表包含 16 个字节输入数据, 第一个字节对应用法 x, 第 2 个字节对应用法 y,剩余的 14 个字节对应厂商定义的用法。

  1. Usage (x)
  2. Usage (y)
  3. Usage (Vendor defined)
  4. Report Size (8)
  5. Report Count (16)
  6. Input (Data, Variable, Absolute)

Usage Minimum 和 Usage Maximum 可以指定一个 Usage 给多个控制或是数组项目。将从 Usage Minimum 到 Usgae Maximun 定义的用法顺序对应到多个控制中。
例如在一个键盘描述符中定义的标准键盘的左、右修饰键的输入项目中,使用一个字节的 8 位分别输入键盘的左、右、 Ctrl 键、 Shift 键、 Alt 键和 GUI 键,从 HID Usage tables文档中的第 10 节可以查到关于键盘用法的定义, 其中上述 8 个修饰键的用法定义值为 224到 231

从零开始学USB(二十二、USB接口HID类设备(四)_报表描述符Local类)

以下是报表描述符的修饰键部分描述。

  1. Usage Page (1) ; 1 = Generic Desktop Controls
  2. Usage (6) ; 6 = Keyboard
  3. Collection (1) ; 1 = Application
  4. Usage Page (7) ; 7 = Keyboard/Keypad
  5. Usage Minimum (224)
  6. Usage Maximum (231)
  7. Logical Minimum (0)
  8. Logical Maximum (1)
  9. Report Size (1)
  10. Report Count (8)
  11. Input (Data, Variable, Absolute)
  12. ……

 

举例:

  1. HID_Report_desc_table:
  2. db 06h, A0h, FFh ; Usage Page(Vendor defined) 定义设备功能
  3. db 09h, A5h ; Usage(Vendor Defined) 定义用法
  4. db A1h, 01h ; Collection(Application) 开一个集合
  5. db 09H, A6h ; Usage(Vendor defined) 定义用法
  6. ; 输入报表
  7. db 09h, A7h ; Usgae(Vendor defined) 定义用法
  8. db 15h, 80h ; Logical Minimum 定义输入最小值 =-128
  9. db 25h, 7Fh ; Logical Maximum 定义输入最大值 =+127
  10. db 75h, 08h ; Report Size 定义报表数据项大小 =8
  11. db 95h, 02h ; Report Count 定义报表数据项个数 =2
  12. db 81h, 02h ; Input(Data,Variable,Absolute) 输入项目
  13. ; 输出报表
  14. db 09h, A9h ; Usgae(Vendor defined) 定义用法
  15. db 15h, 80h ; Logical Minimum 定义输入最小值 =-128
  16. db 25h, 7Fh ; Logical Maximum 定义输入最大值 =+27
  17. db 75h, 08h ; Report Size 定义报表数据项大小 =8
  18. db 95h, 02h ; Report Count 定义报表数据向个数 =2
  19. db 91h, 02h ; Output(Data,Variable,Absolute) 输出项目
  20. db C0h ; End Collection 关闭集合

从零开始学USB(二十二、USB接口HID类设备(四)_报表描述符Local类)

第二行,06 A0 FF 其中0x06对应着Global类项目中的Usage Page项,数据共2字节。数据0xFFA0表明由厂商定义。

第三行,09 A5  其中0x09对应着Local类项的Usage项,数据共一个字节。数据0xA5表明由厂商定义。

第四行,A1 01 其中0xA1对应着Main类项的Collection项,数据共一个字节。数据0x01表示(Application)。

第五行,09 A6 其中0x09对应着Local类项的Usage项,数据共一个字节。数据0xA6表明由厂商定义。

 

第七行,09 A7 其中0x09对应着Local类项的Usage项,数据共一个字节。数据A7表明由厂商定义。

第八行,15 80 其中0x15对应着Global类项的Logical Minimum项,数据共一个字节。数据80表示逻辑上最小为-128。

第九行,25 7F 其中0x15对应着Global类项的Logical  Maximum项,数据共一个字节。数据7F表示逻辑上最大为+127。

第十行,75 08 其中0x75对应着Global类项的Report Size项,数据共一个字节。指的是报表数据大小5个字节。

第十一行,95 02 其中0x95对应着Global类项的Report Count项,数据共一个字节。指的是是报表个数为2。

第十二行,81 02其中81对对应着Main类项的Input项,数据共一个字节。指的输入数据是变量。

 

第十四行,09 A9 其中0x09对应着Local类项的Usage项,数据共一个字节。数据A9表明由厂商定义。

第十五行,15 80 其中0x15对应着Global类项的Logical Minimum项,数据共一个字节。数据80表示逻辑上最小为-128。

第十六行,25 7F 其中0x15对应着Global类项的Logical  Maximum项,数据共一个字节。数据7F表示逻辑上最大为+127。

第十七行,75 08 其中0x75对应着Global类项的Report Size项,数据共一个字节。指的是报表数据大小5个字节。

第十八行,95 02 其中0x95对应着Global类项的Report Count项,数据共一个字节。指的是是报表个数为2。

第十九行,91 02其中81对对应着Main类项的Output项,数据共一个字节。指的输出数据是变量。

 

第二十行,C0 表示结束集合。
 

 

注:Usage Page已经表明由厂商定义了,所以Usage所代表的肯定也是厂商自己定义了。

 

后面章节我们以一个标准设备,鼠标的Report Descriptor来分析一下。

 

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/qq_16777851/article/details/86441454