PC模式下的HID Report修改说明及解析
📎 原始文档:https://www.kdocs.cn/l/cmWyahJ0t7em PC模式下的HID Report修改说明及解析
HID数组内容

内容解析
以该HID数组内容为例
HID 短条目说明
条目前缀结构如下
BIT0和BIT1表示后面所跟字节数,0-0字节,1-1字节,2-2字节,3-4字节
BIT3和BIT2表示条目类型,0-主条目,1-全局条目,2-局部条目
BIT4~BIT7为bTag,表示功能,具体内容如下:
Usage Page
Usage Page和Usage具体内容参考官方文档,不同内容所指定的功能和含义不同
HID Usage Tables 1.4 | USB-IF
用于指定设备功能,不同的内容下包含不同内容的Usage,此处为Consumer
Usage
用于指定个别报表功能,不同内容下的不同BIT对应的具体功能也不同,此处为Consumer Control
Report ID
表示目前Report报ID,非强制要求指定,但是要注意不能为0。
若HID Report中无指定Report ID,则发送对应的HID命令执行动作时,只需要发送内容,而不需要带上Report ID,若指定了Report ID,则发送对应的HID命令需要附带对应的Report ID。
此处建议结合Report Count及键值Usage理解
以该处举例:
若无Report ID,则要发送PP命令,只需发送如下内容:0x04
但该处的HID Report中存在相应的Report ID,为0x02,则理应要发送0x02,0x04的2bytes Buffer。
代码实现可参考如下:
- USB原本的发送命令接口所存在函数进行如下函数的声明
void adapter_avctp_key_single_packer_buf_handler(u8 *hid_key, u8 len)
{
y_printf("%s\n",__func__);
u8 *key_buf = hid_key;
put_buf(key_buf, len);
usb_g_intr_write(0, KEYBOARD_HID_EP_IN, ((const u8 *)key_buf), len);
}
- 声明一个Buffer,填入以下内容并发送,具体发送命令原理下文的实际操作的Usage说明会解释
#define HID_LEN 2
static u8 data[] = {0x02, 0x00, 0x00};
//此 data[1] 处表明为一个按下的PP按键起始命令, data[0] 为 report id
data[1] = 0x04;
adapter_avctp_key_single_packer_buf_handler(data, HID_LEN);
//模拟正常的实体按键操作延时
os_time_dly(2);
//表面为抬起的操作结束命令
data[1] = 0x00;
adapter_avctp_key_single_packer_buf_handler(data, HID_LEN);
- 在该举例的HID Report中,若要发送 下一曲,则理应发送的内容为 0x03(Report ID),0x01(键值)
Logical Minimum\Logical Maximum
决定键值范围,此处的控制键值只有0和1,即按下和抬起,不同的HID设备范围不同,例如鼠标为0-127
Report Size
键值占用大小,此处表示每个键值1个BIT,即PP按键、音量+、音量-每次操作发送的键值对应一个BIT
Report Count及键值Usage
此处Report Count为4表示当前支持4个实体按键、分别为音量+ (Volume Increment)、音量-(Volume Decrement)、播放暂停 (Play/Pause)、一个预留按键
由于Report Size为1,即一个按键占用一个BIT,因此举例来说:
若要发送播放暂停的HID命令,即为0b0100,0x04
音量-则对应0x0001,0x01。音量+对应0b0010,0x20
HID Report生成工具
官方提供了工具可生成一个HID Report HID Descriptor Tool | USB-IF