这段时间学习LPC11Uxx系列的USB-HID,研究官方的USB库文件和HID文件发现对于hiduser里面的GetReport和SetReport只在端点0的响应函数中有调用,采用USB抓包工具 Bus Hound发送指令时也可发现,如果选择HID-Compliant Device,只能发送控制类的指令,而对于实际的数据传输需要另外配置端点进行传输。
USB 的传输事务类型可在端点描述符中配置,不同的端点可以配置成不同类型的传输事务,但端点0默认是控制传输,上电连接USB即可启用,不需要配置。
HID设备类一般配置数据传输端点为中断传输,由于USB不支持硬件中断,所以USB的中断传输实际上是主机在一定的时间不断地主动轮询设备检查其是否有数据需要传输,对此有3个重要参数需要在端点描述符中进行配置:
- 传输类型
- 轮询时间间隔
- 每次传输的最大数据包大小
/* Endpoint, HID Interrupt In */
USB_ENDPOINT_DESC_SIZE, /* bLength */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
HID_EP_IN, /* bEndpointAddress */
USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */
WBVAL(0x0040), /* wMaxPacketSize */
0x20, /* 16ms */ /* bInterval (轮询时间间隔)*/
/* Endpoint, HID Interrupt Out */
USB_ENDPOINT_DESC_SIZE, /* bLength */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
HID_EP_OUT, /* bEndpointAddress */
USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes(传输类型) */
WBVAL(0x0040), /* wMaxPacketSize(传输数据包的最大大小) */
0x20, /* 16ms */ /* bInterval */
0 /* bLength */
USB中断传输事务流程图
对于IN事务,每次轮询时间间隔内,主机主动发送IN令牌(包括设备地址和端点号),然后切换到接收数据状态,等待设备发送数据,如果设备有数据要返回,则把一个数据包放到总线上。
对于OUT事务,当主机发送数据时,USB设备会进入中断函数,根据地址和端点号信息调用相应的端点响应事件函数,从而进行相关的处理。