每个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协议,该协议可从Http://www.u***.org下载
以鼠标报告描述符为学习对象
插入USB接口 电脑会监测到鼠标
模拟一个鼠标的移动的函数
- void GetPointerData(uint8_t *pbuf)
- {
- /*模拟的鼠标的数据*/
- int8_t x = 1, y = 1;
- pbuf[0] = 0;
- pbuf[1] = x;
- pbuf[2] = y;
- pbuf[3] = 0;
- }
- void Mouse_Report(void)
- {
- static __IO uint32_t counter=0;
- static uint8_t HID_Buffer[4];
- /* check Mouser state every polling interval (10ms) */
- if (counter++ == (USBD_HID_GetPollingInterval(&hU***DeviceFS)))
- {
- GetPointerData(HID_Buffer);
-
- /* send data though IN endpoint*/
- if((HID_Buffer[1] != 0) || (HID_Buffer[2] != 0))
- {
- USBD_HID_SendReport(&hU***DeviceFS, HID_Buffer, 4);/*DMA发送模式*/
- }
- counter =0;
- }
- }
复制代码
鼠标会不停的移动