参考链接:
HID 简介 - USB中文网
HID报表描述符(目前最全的解析,也是USB最复杂的描述符)_hid描述符-CSDN博客
一、HID设备简介
HID(Human Interface Device,人机接口设备)是USB设备中常用的设备类型,是直接与人交互的USB设备,例如键盘、鼠标与游戏杆等。在USB设备中,HID设备的成本较低。另外,HID设备并不一定要有人机交互功能,只要符合HID类别规范的设备都是HID设备。
二、独有特性
1.HID描述符
2.HID报表描述符
3.通过HID报表描述符实现复合设备
三、HID鼠标例程(以F4为例)
我们以STM32中的USB设备库的HID例程为例,生成一个有鼠标功能的工程
1.开启USB OTG FS外设
2.将USB的设备库中间件设置为HID设备
3.处理时钟问题
4.查看现象
编译下载后将STM32的USB连接到电脑上之后,正常情况下就可以通过UsbTreeView看到对应端口上挂载了相应的设备,如下图所示,也能够看到设备的描述符。
通过使用Bus Hound也可以看到USB设备加载的过程
5.使用工程
编译下载后将STM32的USB连接到电脑上就可以发现鼠标一直在持续向右移动
通过使用Bus Hound也可以看到USB设备确实将数组内的数据上传到电脑上了
那么为什么这样发送就是鼠标右移呢?
6.报表描述符解析
我们都知道通信协议的目的就是希望通信的双方通过共有的“密码本”来对数据进行编码发送和接收解码。从而让数据有了实际的意义,而报告描述符在HID设备中就扮演着这种角色。
在usbd_hid.c文件中的HID_MOUSE_ReportDesc数组中我们可以看到当前STM32的HID报表描述符
6.1例程中的报表描述符
0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) 通用桌面设备 */
0x09, 0x02, /* Usage (Mouse) 设备类型鼠标 */
0xA1, 0x01, /* Collection (Application) 集合开始 */
0x09, 0x01, /* Usage (Pointer) */
0xA1, 0x00, /* Collection (Physical) */
0x05, 0x09, /* Usage Page (Button) 设置鼠标的按键 */
0x19, 0x01, /* Usage Minimum (0x01) 键值范围设置 */
0x29, 0x03, /* Usage Maximum (0x03) 分别对应鼠标的左右中键 */
0x15, 0x00, /* Logical Minimum (0) 按键逻辑值设置 */
0x25, 0x01, /* Logical Maximum (1) */
0x95, 0x03, /* Report Count (3) 占用三个位置 */
0x75, 0x01, /* Report Size (1) 每个位置长度为1位 */
0x81, 0x02, /* Input (Data,Var,Abs) 以上数据是输入的变量 绝对数据*/
0x95, 0x01, /* Report Count (1) 占用一个位置 */
0x75, 0x05, /* Report Size (5) 每个位置长度为5位 */
0x81, 0x01, /* Input (Const,Array,Abs) 以上数据是不变的常量,用于填充当前字节 */
0x05, 0x01, /*