打印
[STM32F4]

STM32F401学习之USB-HID

[复制链接]
1537|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

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: }
鼠标会不停的移动




沙发
mmuuss586| | 2016-9-2 08:54 | 只看该作者
谢谢分享;

使用特权

评论回复
板凳
人丑没人疼|  楼主 | 2016-9-3 23:26 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

97

帖子

0

粉丝