1、USB属于半双工传输,
2、传输事务:所以必须使用一种机制协调主机和设备的通信,这个机制在USB中称之为传输事务
3、HID设备没有保证的传输速率,如果设备是设置在10ms的时距,事务之间的时间可能等于或小于10ms。除非设备是设置在全速时在每个帧传输数据,或是在高速时在每个微帧传输数据。这是最快的轮询速率,所有端点可以保证有正确的带宽可供使用
4、Device Class Definition for HID 是HID的基本规范文件,HID Usage Tables 是基本规范文件的附件,为开发人员提供实际的控制类型的描述,文件是用来定义让主机了解以及使用 HID 数据的数值。
5、HID设备的硬件要求:Device Class Definition for HID 内描述了所需的描述符、传输的频率以及传输的类型等。
所有的HID传输都是使用默认控制管道或是一个中断管道,HID设备必须有一个中断输入端点来传送数据到主机
6、HID的固件要求:如果要传送数据,固件必须支持 Get_Report控制传输与中断输入传输。如果要接收数据,固件必须支持 Set_Report 控制传输与选择性的中断输出传输
所有的HID数据都必须使用定义过的报表格式来定义报表中数据的大小与内容。设备可以支持一个或多个报表。在固件中的一个报表描述符用来描述此报表,以及如何使用报表数据的信息。
在每一个报表中的一个数值,定义此报表是一个输入(Input )、输出(Output )或是特征(Feature )报表。主机在输入报表中接收数据,在输出报表中传送数据,特征报表可以在任何方向传递。
7、HID设备描述符:
1)HID设备的描述符
HID 设备除了支持 USB 设备的 5 种标准描述符之外,还支持 HID 设备特有的 3 种描述符。
这些描述符是:USB 标准描述符:设备、配置、接口、端点和字符串描述符。
HID 特有的描述符: HID 、报表(Report )和实体(Physical )描述符。
从描述符的关联关系看, HID 描述符是关联于接口 。 所以如果一个 HID 设备有 2 个端点,设备不需要每个端点有一个 HID 描述符。
报表描述符描述设备生成的每条数据以及数据实际测量的数据。通过检查项目(统称为报告描述符),HID类驱动程序能够确定来自HID类设备的数据报告的大小和组成。
物理描述符(Physical descriptor)是可选描述符,其提供关于用于激活设备上的控件的人体的一部分或多个部分的信息
不同描述符的类型字段数值:
对于HID设备,其设备描述符的bDeviceClass 和 bDeviceSubClass 字段的值为 0,接口描述符的 bInterfaceClass 字段值为 03,表示设备的该接口是 HID 类别。在接口描述符中其他包含 HID 特定信息的字段还有子类别码( blnterfaceSubClass )与协议码( blnterfaceProtocol 字段)
在接口描述符中子类别码字段等于 1 表示此设备支持启动接口( Boot Interface ),含有启动接口的键盘或鼠标可以使用 BIOS 或许多主机支持的默认简单协议。 HID 规范定义了键盘与鼠标的启动接口协议。
如果设备没有启动接口, 并且接口描述符中协议码字段是 1, 表示设备支持键盘接口,协议码字段是 2,表示支持鼠标接口。接口描述符中协议码字段是 0,表示设备不支持启动协议。
偏移量 | 字段 | 字节数 | 数值类型 | 说明 |
0 | bLength | 1 | Numeric | 描述符字节数 |
1 | bDescriptorType | 1 | Constant | 0x21 = HID 描述符 |
2 | bcdHID | 2 | Numeric | HID 规范版本号( BCD ) |
4 | bCountryCode | 1 | Numeric | 硬件设备所在国家的国家代码 |
5 | bNumDescriptors | 1 | Numeric | 类别描述符数目(至少有一个报表描述符) |
6 | bDescriptorType | 1 | Constant | 类别描述符的类型 |
7 | wDescriptorLength | 2 | Numeric | 报表描述符的总长度 |
9 | [bDescriptorType]... | 1 | Constant | 附加的描述符的类型,可选的 |
10 | [wDescriptorLength]... | 2 | Numeric | 附加的描述符的总长度,可选的 |
2)HID描述符
- bcdHID :设备与其描述符所遵循的 HID 规范的版本号码,此数值是 4 个 16 进制的BCD 格式字符。例如 版本 1.1 的 bcdHID 是 0110h 。
- bCountryCode: 硬件目的国家的识别码(见下图)。如果不说明,该字段为 0。
- bDescriptorType : HID 描述符附属的描述符的类型(报表或实体) 。每一个 HID 都必须至少支持一个报表描述符。一个接口可以支持多个报表描述符,以及一个或多个实体描述符。
- HID 描述符的偏移量为 9 和 10 的 bDescriptorType 和 wDescriptorLength 可以重复存在多个。
HID支持3中描述符:HID描述符,Report描述符和Physical描述符
HID设备的这三种描述符时基于类的描述符,他们的值分别如下:
8、报表描述符
报表描述符定义了执行设备功能的数据格式和使用方法。
报表描述符和 USB 的其他描述符是不一样的,它不是一个简单的表格, 报表描述符是 USB 所有描述符中最复杂的。报表内容的简洁,是通过报表描述符全面的、复杂的数据描述实现的 。
报表描述符必须先描述数据的大小与内容。报表描述符的内容与大小因设备的不同而不同,在进行报表传输之前,主机必须先请求设备的报表描述符,只有得到了报表描述符才可正确解析报表的数据。报表描述符是报表描述项目( Item )的集合,每一个描述项目都有相对统一的数据结构,项目很多,通过编码实现。
8.1)项目
报表描述符的第一部分由item type(项目类型)、item tag(项目标志) 和item size(项目长度)组成:
项目标志(item Tag): 说明项目的功能
项目类型(item Type): 说明项目的数据类型
项目长度(item Size): 说明项目的数据部分的长度
HID的项目可以分为短项目和长项目两种:
8.1.1)短项目
短项目的数据字节数由bSize的值定义,bSize为0、1、2、3时,Data部分分别为0、1、2、4个字节,短项目的项目类型有bType定义
8.1.2)长项目
项目中第一个字节为上图中的特定值表明该项目是一个长项目,
Main item tag | One-Byte Prefix (nn represents | Valid Data |
|
Input | 1000 00 nn | Bit 0 Bit 5 | {Data (0) | Constant (1)} {No Null position (0) | Null state(1)} |
Output | 1001 00 nn | Bit 0 Bit 5 | {Data (0) | Constant (1)} {No Null position (0) | Null state(1)} |
Feature | 1011 00 nn | Bit 0 Bit 5 | {Data (0) | Constant (1)} {No Null position (0) | Null state(1)} |
Collection | 1010 00 nn | 0x00 | Physical (group of axes) |
End Collection | 1100 00 nn | Not applicable. | Closes an item collection. |
Reserved | 1101 00 nn to 1111 00 nn | Not applicable. | Reserved for future items. |
长项目中的bDataSize说明data部分的字节数,bLongItemTag在HID规范中没有定义
8.2)项目分类
报表的项目有Main、Global和Local三大类,每一类都有多种不同的项目,实现不同的描述。
8.2.1)Main类
Main类项目用于定义报表描述符中的数据项,也可以组合其中的若干数据项成为一个集合。 Main 项目可以分为带数据的Main 项目和不带数据的Main 项目。带数据项的Main用于生成报表中的数据项,包括Input 、 Output 和 Feature 项目。不带数据的Main 项目不生成报表中的数据项,包括Collection和 End Collection项目。
所有的Main项的默认数据值为零(0)
输入项的数据大小可以为0字节。在这种情况下,可以假定项目的每个数据位的值为零。这在功能上与使用item标记完全相同,该标记指定4字节数据项,后跟4个零字节。
位 | 参数 | 值 | 功能描述 |
0 | Data | Constant | 0 | 1 | 数据表明该项目正在定义包含可修改设备数据的报告字段。 常量表示该项是报表中的静态只读字段,不能由主机修改(写入)。 |
1 | Array |Variable | 0 | 1 | 数组: 报告全部控制的状态。 如在键盘报表中每一个键在报表中占一位,报表传输全部键的状态,可以同时按下任意多个键。 |
2 | Absolute | Relative | 0 | 1 | 绝对: 表示数值以一个固定值为基准。平板电脑通常提供绝对数据。 |
3 | No Wrap | Wrap | 0 | 1 | 指示数据在达到极高值或低值时是否“翻转”。 例如,可以360度自由旋转的刻度盘可能会输出0到10之间的值。如果是Wrap,在增加方向上通过10位置之后报告的下一个值将为0。 |
4 | Linear | Nonlinear | 0 | 1 | 指示是否已以某种方式处理来自设备的原始数据,并且不再表示测量内容与报告的数据之间的线性关系。 线形:表示测量的数据与报表的数据有线性的关系。 非线性:表示测量的数据与报表的数据没有线性的关系。 |
5 | PreferredState | No Preferred | 0 | 1 | 优选状态:表示控制在没有用户交互时会回到一个特定的状态。如按钮就有优选状态,在无操作时保持未按下的状态。(自动中心操纵杆) |
6 | No Null Position | | 0 | 1 | 无空状态位置:表示控制永远在传送有效的数据。 |
7 | Non volatile | | 0 | 1 | 不可变的: 表示设备只有在主机请求时才改变数值。 当主机传送一个报表并且不要改变不可变项目时, 如果该项目是定义成相对(Relative )的,数值 0 表示不改变数据,如果不可变项目是定义成绝对(Absolute ) 的, 超出范围外的数值则表示不改变数据。 |
Reserved | 0 | 数据位7未定义输入项,并保留供将来使用。 | |
8 | Bit Field | | 0 | 1 | 表示控件发出固定大小的字节流。 数据字段的内容由应用程序确定。 缓冲区的内容不会被解释为单个数字量。 由缓冲字节项定义的报告数据必须在8位边界上对齐。 条形码阅读器的数据就是一个例子。 位字段: 表示每一个位或是一个字节内的一组位可以代表一份数据。
|
9~31 位 | 保留 |
8.2.2)Input、Output和Feature项目
输入、输出和功能项用于在报表中创建数据字段:
- 输入项描述有关由一个或多个物理控件提供的数据的信息。 应用程序可以使用此信息来解释设备提供的数据。 在单个项目中定义的所有数据字段共享相同的数据格式。一个输入报表包含一个或多个 Input 项目,主机使用中断输入传输来请求输入报表。
- 输出项用于在报告中定义输出数据字段。 一个输出报表包含一个或多个 Output项目。 输出报表包含控制状态的数据。此项类似于输入项,除了它描述发送到设备的数据 - 例如,LED状态。
- 功能项描述可以发送到设备的设备配置信息。主机使用 Set_Report 与 Get_Report 请求来传送与接收特征报表
在每一个Input、Output和Feature项目的前缀字之后是32位描述数据,目前最多定义了9个位,,其余的位则是保留。位 0~8 的定义中只有位 7 不能应用于 Input 项目,除此之外其他的位定义都适应于 Input 、 Output 和 Feature 项目。
如果Input项是数组,
8.2.2)Global类
Global类项目实现对数据的描述,用来识别报表并且描述报表内的数据,包括数据的功能、最大与最小允许值以及数据项的大小与数目等。改变由 Main 类项目生成的项目状态表。 Global 类项目描述对后续的所有项目有效,除非遇到有新的 Global 类项目。
8.2.3)Local类
Local类项目定义控制的特征,这一类项目的作用域不超过下一个Main项目,所以在每一 Main 项目之前可能有多个 Local 项目。 Local 项目用于描述后面的 Input 、 Output 和Feature 项目。