我正在尝试为 USB 3.0 创建一个报告计数为 1024 字节的 HID 报告描述符。
usb.org HID 的文档似乎没有提到两个字节的报告计数。尽管如此,我还是看到有些人使用 0x96(而不是 0x95)来输入两个字节计数,例如:
0x96, 0x00, 0x02,//REPORT_COUNT (512)
这是从这里取的:自定义 HID 设备 HID 报告描述符
同样,在同一示例中,0x26用于两个字节的逻辑最大值。
这个0x96和0x26领域从何而来?我没有看到任何文档。
HID 1.11 的设备类定义文档中的第 6.2.2.7 节全局项中定义为:
Report Count 1001 01 nn Unsigned integer specifying the number of data
fields for the item; determines how many fields are included in the
report for this particular item (and consequently how many bits are
added to the report).
上述代码中的 nn 是项目长度指示符 (bSize),在前面的 6.2.2.2 节短项目中定义为:
bSize Numeric expression specifying size of data:
0 = 0 bytes
1 = 1 byte
2 = 2 bytes
3 = 4 bytes
相当令人困惑的是,bSize 的有效值以十进制列出。因此,在二进制中,nn 的位将是:
00 = 0 bytes (i.e. there is no data associated with this item)
01 = 1 byte
10 = 2 bytes
11 = 4 bytes
将它们全部放在一起,用于REPORT_COUNT(无符号整数),可以指定以下替代方法:
1001 01 00 = 0x94 = REPORT_COUNT with no length (can only have value 0?)
1001 01 01 = 0x95 = 1-byte REPORT_COUNT (can have a value from 0 to 255)
1001 01 10 = 0x96 = 2-byte REPORT_COUNT (can have a value from 0 to 65535)
1001 01 11 = 0x97 = 4-byte REPORT_COUNT (can have a value from 0 to 4294967295)
同样,对于 LOGICAL_MAXIMUM,它是一个有符号整数(通常有一个例外):
0010 01 00 = 0x24 = LOGICAL_MAXIMUM with no length (can only have value 0?)
0010 01 01 = 0x25 = 1-byte LOGICAL_MAXIMUM (can have a values from -128 to 127)
0010 01 10 = 0x26 = 2-byte LOGICAL_MAXIMUM (can have a value from -32768 to 32767)
0010 01 11 = 0x27 = 4-byte LOGICAL_MAXIMUM (can have a value from -2147483648 to 2147483647)
该规范不清楚零长度项通常默认为什么值。它仅在第 6.2.2.4 节"主要项目"的末尾提到主要项目类型以及该类型中的 INPUT 项目标签的默认值为 0:
Remarks - The default data value for all Main items is zero (0).
- An Input item could have a data size of zero (0) bytes. In this case the value of
each data bit for the item can be assumed to be zero. This is functionally
identical to using a item tag that specifies a 4-byte data item followed by four
zero bytes.
假设 0 作为其他项目类型的默认值也是合理的,但对于REPORT_COUNT(全局项目),值 0 并不是一个明智的默认值(恕我直言)。规范并没有真正说。