USB HID的初始化关键在于各种描述符的初始化
每个USB设备只有一个设备描述符,而一个设备中可包一个或多个配置描述符,即USB设备可以有多种配置。设备的每个个配置中又可以包含一个或多个接口描述符,即USB设备可以支持多种功能(接口),接口的特性通过描述符提供。USB设备的端点描述符总是紧跟着相关的接口描述符后面,可以有一个或多个端点描述符。 接着就是Class descriptor 类描述符,如果是HID 就是HID描述符 HID描述符关联于接口描述符,在接口描述符之后,因而如果一个设备只有一个接口描述符,则无论它有几个端点描述符,HID设备只有一个HID描述符。HID设备描述符主要描述HID规范的版本号、HID通信所使用的额外描述符、报表描述符的长度等。 报告描述符(Report Descrptor)一个HID描述符,对应一个报告描述符,但可以包含多个报告 实体描述符(Physical Descrptor) 这是可选。 而USB报告描述符(Report Descriptor)是HID设备中的一个描述符,它是比较复杂的一个描述符。 USB HID设备是通过报告来给传送数据的,报告有输入报告和输出报告。输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。报告是一个数据包,里面包含的是所要传送的数据。输入报告是通过中断输入端点输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出。 而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。通过它,USB HOST可以分析出报告里面的数据所表示的意思。它通过控制输入端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求
发送到接口的,而不是到设备。一个报告描述符可以描述多个报告,不同的报告通过报告ID来识别,报告ID在报告最前面,即第一个字节。当报告描述符中没有规定报告ID时,报告中就没有ID字段,开始就是数据。更详细的说明请参看USB HID协议,该协议 以鼠标报告描述符为学习对象
插入USB接口 电脑会监测到鼠标
模拟一个鼠标的移动的函数 1: void GetPointerData(uint8_t *pbuf)2: {3: 4:5: int8_t x = 1, y = 1;6: pbuf[0] = 0;7: pbuf[1] = x;8: pbuf[2] = y;9: pbuf[3] = 0;10: 11: }12: 13: void Mouse_Report(void)14: {15: static __IO uint32_t counter=0;16: static uint8_t HID_Buffer[4];17:18: if (counter++ == (USBD_HID_GetPollingInterval(&hUsbDeviceFS)*10))19: {20: GetPointerData(HID_Buffer);21:22:23: if((HID_Buffer[1] != 0) || (HID_Buffer[2] != 0))24: {25: USBD_HID_SendReport(&hUsbDeviceFS, HID_Buffer, 4);26: }27: counter =0;28: }29: }
鼠标会不停的移动
|