本帖最后由 yutianxiang618 于 2017-4-1 17:34 编辑
手上有一个别人的usb device产品,一共2个接口,接口0:id=0,接口1:id=4。接口0是一个mass协议的,我这边不使用;接口2是hid协议,包含2个端点,地址为0X82,0X02.我主要做一个host设备和这个产品的hid双向通信。
在STM32提供的HOST USB HID基础上修改,目前主要是加了一些打印,修改很少,标准请求没有问题,USBH_HID_InterfaceInit 函数我修改了(目前的流程也没有使用到啊),open了2个通道-通道3和通道4,中断类型。现在是host这边发送class请求HID描述符时,host读取到的是上次请求的字符串数据的前9字节,想请问一下可能是哪里的问题,我插入键盘到host设备是可以正常标准请求和class请求,然后正常工作的,谢谢啦。
stm32按键之后的打印如下:
- Button_KEY press
- bInterfaceClass:8 //这个是接口0,id=0的mass协议,我不与它通信
- bInterfaceSubClass:5
- bInterfaceProtocol:50
- bInterfaceClass:3 //这个是接口1,id=4 hid协议,双向通信
- bInterfaceSubClass:0
- bInterfaceProtocol:0 //这个是hid协议
- 这个是用户自定义HID设备
- 协议验证通过
- 接口4端点0地址:0x82
- 接口4端点1地址:0x2
- 接口4端点0最大包:0x40
- 接口4端点1最大包:0x40
- 接口4端点0间隔时间:0xa
- 接口4端点1间隔时间:0xa
- maxEP:2
- 接口4-端点地址 = 0x82,分配的通道 = 2
- hc_num_in = 2,设备address = 1 speed = 1, EP_TYPE = 3 , length = 64 //分配了2个通道,与hid的2个端点通信,现在还没有使用到
- 接口4-端点地址 = 0x2,分配的通道 = 3
- hc_num_out = 3,设备address = 1 speed = 1, EP_TYPE = 3 , length = 64
- phost->gState --- HOST_CLASS_REQUEST
- HID_IDLE 或者 HID_REQ_GET_HID_DESC
- phost->Control.length = 9
- phost->gState --- HOST_CTRL_XFER
- hc_num_out = 0
- CTRL_SETUP 81 6 0 21 0 0 9 0 //请求HID描述符
- phost->gState --- HOST_CTRL_XFER
- CTRL_SETUP_WAIT
- phost->gState --- HOST_CTRL_XFER
- CTRL_DATA_IN
- phost->gState --- HOST_CTRL_XFER
- CTRL_DATA_IN_WAIT
- hc_num_in = 1
- CTRL_DATA_IN e 3 41 0 43 0 33 0 30 //打印输出的是上次标准请求的字符串数据前9字节
- phost->gState --- HOST_CTRL_XFER
- CTRL_STATUS_OUT
- phost->gState --- HOST_CTRL_XFER
- CTRL_STATUS_OUT_WAIT
- phost->gState --- HOST_CLASS_REQUEST
- HID_IDLE 或者 HID_REQ_GET_HID_DESC
- HID_Desc.bLength : 0xe //上面的hid描述符输入error,导致这里解析错误,程序出错
- HID_Desc.bDescriptorType : 0x3
- HID_Desc.bcdHID : 0x41
- HID_Desc.bCountryCode : 0x43
- HID_Desc.bNumDescriptors : 0x0
- HID_Desc.bReportDescriptorType : 0x33
- HID_Desc.wItemLength : 0x3000
- phost->gState --- HOST_CLASS_REQUEST
- HID_REQ_GET_REPORT_DESC
- phost->Control.length = 12288
- phost->gState --- HOST_CTRL_XFER
- hc_num_out = 0
- CTRL_SETUP 81 6 0 22 0 0 0 30
- phost->gState --- HOST_CTRL_XFER
- CTRL_SETUP_WAIT
- phost->gState --- HOST_CTRL_XFER
- CTRL_DATA_IN
出错部分:
CTRL_SETUP 81 6 0 21 0 0 9 0 //请求HID描述符
CTRL_DATA_IN e 3 41 0 43 0 33 0 30 //打印输出的是上次标准请求的字符串数据前9字节
|