本帖最后由 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字节 |