[USB驱动] stm32 usb host hid-class请求返回的数据是上次的字符串数据

[复制链接]
2718|6
 楼主| yutianxiang618 发表于 2017-4-1 17:20 | 显示全部楼层 |阅读模式
本帖最后由 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按键之后的打印如下:

  1. Button_KEY press
  2. bInterfaceClass:8                                                     //这个是接口0,id=0的mass协议,我不与它通信
  3. bInterfaceSubClass:5
  4. bInterfaceProtocol:50                                       
  5. bInterfaceClass:3                                                      //这个是接口1,id=4 hid协议,双向通信
  6. bInterfaceSubClass:0
  7. bInterfaceProtocol:0 //这个是hid协议
  8. 这个是用户自定义HID设备
  9. 协议验证通过
  10. 接口4端点0地址:0x82
  11. 接口4端点1地址:0x2
  12. 接口4端点0最大包:0x40
  13. 接口4端点1最大包:0x40
  14. 接口4端点0间隔时间:0xa
  15. 接口4端点1间隔时间:0xa
  16. maxEP:2
  17. 接口4-端点地址 = 0x82,分配的通道 = 2
  18. hc_num_in = 2,设备address = 1 speed = 1, EP_TYPE = 3 , length = 64             //分配了2个通道,与hid的2个端点通信,现在还没有使用到
  19. 接口4-端点地址 = 0x2,分配的通道 = 3
  20. hc_num_out = 3,设备address = 1 speed = 1, EP_TYPE = 3 , length = 64
  21. phost->gState --- HOST_CLASS_REQUEST
  22. HID_IDLE 或者 HID_REQ_GET_HID_DESC  
  23. phost->Control.length = 9
  24. phost->gState --- HOST_CTRL_XFER
  25. hc_num_out = 0
  26. CTRL_SETUP 81  6  0  21  0  0  9  0                                            //请求HID描述符
  27. phost->gState --- HOST_CTRL_XFER
  28. CTRL_SETUP_WAIT
  29. phost->gState --- HOST_CTRL_XFER
  30. CTRL_DATA_IN  
  31. phost->gState --- HOST_CTRL_XFER
  32. CTRL_DATA_IN_WAIT
  33. hc_num_in = 1
  34. CTRL_DATA_IN e  3  41  0  43  0  33  0  30                                //打印输出的是上次标准请求的字符串数据前9字节
  35. phost->gState --- HOST_CTRL_XFER
  36. CTRL_STATUS_OUT
  37. phost->gState --- HOST_CTRL_XFER
  38. CTRL_STATUS_OUT_WAIT
  39. phost->gState --- HOST_CLASS_REQUEST
  40. HID_IDLE 或者 HID_REQ_GET_HID_DESC  
  41. HID_Desc.bLength : 0xe                                                            //上面的hid描述符输入error,导致这里解析错误,程序出错
  42. HID_Desc.bDescriptorType : 0x3  
  43. HID_Desc.bcdHID : 0x41
  44. HID_Desc.bCountryCode : 0x43
  45. HID_Desc.bNumDescriptors : 0x0
  46. HID_Desc.bReportDescriptorType : 0x33
  47. HID_Desc.wItemLength : 0x3000
  48. phost->gState --- HOST_CLASS_REQUEST
  49. HID_REQ_GET_REPORT_DESC  
  50. phost->Control.length = 12288
  51. phost->gState --- HOST_CTRL_XFER
  52. hc_num_out = 0
  53. CTRL_SETUP 81  6  0  22  0  0  0  30   
  54. phost->gState --- HOST_CTRL_XFER
  55. CTRL_SETUP_WAIT
  56. phost->gState --- HOST_CTRL_XFER
  57. 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字节
 楼主| yutianxiang618 发表于 2017-4-1 17:23 | 显示全部楼层
本帖最后由 yutianxiang618 于 2017-4-1 17:36 编辑

产品的配置描述符集合://配置描述符
9-length  2-配置描述符  40-总配置集合长度  0-总配置集合长度  2-接口数  1-配置值  0-字符串索引  80-属性  fa=500mA
//接口0描述符
9-length  4-接口描述符  0-接口编号  0-备用编号  2-端点数  8-MASS  5-子类  50-仅批量  0-索引  
7-length  5-端点描述符  81-地址-端点1 输入  2-批量  40-包长  0-包长  1  
7-length  5-端点描述符  1-地址-端点1 out  2-批量  40-包长  0-包长  1  
//接口4描述符
9-length  4-接口描述符  4-接口编号  0-备用编号  2端点数  3-HID  0-子类  0-协议  0-索引  
9-length  21-HID描述符  10-hid协议  1-hid协议  21-国家代码  1-下级描述符数目  22-下级是报告描述符  1b-下级报告描述符长度  0-长度  
7-length  5-端点描述符  82-地址-端点2 输入  3中断端点  40-包长  0-包长  a-查询时间   
7-length  5-端点描述符  2-地址-端点2 out  3中断端点  40-包长  0-包长  a-查询时间  
icecut 发表于 2017-4-2 16:25 | 显示全部楼层
41行时候再打印
 楼主| yutianxiang618 发表于 2017-4-5 10:09 | 显示全部楼层
icecut 发表于 2017-4-2 16:25
41行时候再打印

前面的打印我基本都关闭了,只留了一点lcd打印的,结果还是一样,得到的是字符串"AC309N"的前9个字节,全部打印如下:
  1. USB OTG FS HID Host
  2. > USB Host library started.
  3.      USB Host Library v2.1.0

  4. > Device Attached
  5. > Full speed device detected
  6. VID : E0B6h
  7. PID : 0D11h
  8. > Mass storage device connected
  9. Manufacturer : AC309N
  10. Product : AC309N
  11. Serial Number : AC309N
  12.                       > Enumeration completed
  13. To start the HID class operations:  
  14. Press Key...                        
  15. HID_IDLE 或者 HID_REQ_GET_HID_DESC  
  16. HID_IDLE 或者 HID_REQ_GET_HID_DESC  
  17. HID_Desc.bLength : 0xe
  18. HID_Desc.bDescriptorType : 0x3
  19. HID_Desc.bcdHID : 0x41
  20. HID_Desc.bCountryCode : 0x43
  21. HID_Desc.bNumDescriptors : 0x0
  22. HID_Desc.bReportDescriptorType : 0x33
  23. HID_Desc.wItemLength : 0x3000
小凤凤 发表于 2017-4-15 09:51 | 显示全部楼层
楼主有没有这个USB Hub相关资料发到我邮箱互相学习可好?我最近也是做USB Hub HID设备,但是在实际接来测试时,电脑突然蓝屏了,不知道为何。
 楼主| yutianxiang618 发表于 2017-5-2 15:28 | 显示全部楼层
小凤凤 发表于 2017-4-15 09:51
楼主有没有这个USB Hub相关资料发到我邮箱互相学习可好?我最近也是做USB Hub HID设备,但是在实际接来测试 ...

Hub没有弄过,蓝屏应该是PC usb接口电流过大导致的吧,我弄usb转串口时经常出现蓝屏
小凤凤 发表于 2017-5-3 13:52 | 显示全部楼层
yutianxiang618 发表于 2017-5-2 15:28
Hub没有弄过,蓝屏应该是PC usb接口电流过大导致的吧,我弄usb转串口时经常出现蓝屏 ...

好吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

103

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部