STM32 USB中间件:HID输出报告事务错误

时间:2018-09-12 17:49:24

标签: embedded usb stm32

在配置STM32设备以使其能够接收HID中断OUT事务(以PC为主机设备)时,我一直遇到问题。

我使用标准的STM32 CubeMX提供的USB中间件,并进行了编辑,以允许2个端点,1个OUT和1个IN。连同自定义的HID报告描述符:

__ALIGN_BEGIN static uint8_t HID_ReportDesc[HID_REPORT_DESC_SIZE]  __ALIGN_END =
{
        0x06, 0x00, 0xFF,  // Usage Page (Vendor Defined 0xFF00)
        0x09, 0x01,        // Usage (0x01)
        0xA1, 0x01,        // Collection (Application)
        0x15, 0x00,        //   Logical Minimum (0)
        0x26, 0xFF, 0x00,  //   Logical Maximum (255)
        0x75, 0x08,        //   Report Size (8)
        0x95, 0x40,        //   Report Count (64)
        0x09, 0x02,        //   Usage (0x02)
        0x81, 0x00,        //   Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
        0x95, 0x40,        //   Report Count (64)
        0x09, 0x02,        //   Usage (0x02)
        0x91, 0x00,        //   Output (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
        0xC0,              // End Collection
}; 

使用USBD HID提供的输入报告事务处理功能USBD_HID_SendReport,我可以观察设备的行为。

在PC端,使用USBLyzer软件,我可以确认该设备已被Windows识别并进行了相应配置,并报告了描述符,并且没有错误。然后,我使用HIDAPI打开设备,并读取报告的值。该实现按预期方式工作,使我可以将设备中的数据传输到主机。

但是,没有提供的HID输出报告功能,让我自己实现:

uint8_t USBD_HID_ReceiveReport (USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len){
USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef*)pdev->pClassData;

if(pdev->dev_state == USBD_STATE_CONFIGURED){
    if(hhid->state == HID_IDLE){
        hhid->state = HID_BUSY;
        USBD_LL_PrepareReceive(pdev, HID_EPOUT_ADDR, report, len);
    }
}
return USBD_OK;

}

此函数使用与提供的USBD_HID_SendReport函数相同的结构,而不是使用USBD_LL_PrepareReceive函数准备EPOUT地址以接收事务,然后通过PCD处理传输。

设备初始化后,我在无限循环中使用已实现的USBD_HID_ReceiveReport函数,反复调用它。我在HIDAPI中使用hid_write将数据传输到设备一次。在调试时,设备将遍历循环,并在每次调用时进入PCD端点传输。 hid_write似乎并没有导致设备上的缓冲区更新,USBlyzer在OUT报告中报告了“交易错误”。

有人知道我的实现中的错误吗?

0 个答案:

没有答案