Промежуточное программное обеспечение USB STM32: ошибка транзакции отчета о выходе HID - PullRequest
0 голосов
/ 12 сентября 2018

У меня возникли проблемы с настройкой устройства STM32 для приема транзакций HID Interrupt OUT, где ПК является хост-устройством.

Я использую стандартное промежуточное ПО USB STM32 CubeMX с правками, позволяющими 2 конечных точки, одну OUT и одну 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
}; 

С помощью функции транзакции входного отчета * 1006, предоставленной USBD HID, я могу наблюдать за поведением моего устройства.

Со стороны ПК, используя программное обеспечение USBLyzer, я могу подтвердить, что устройство распознается Windows и настроено соответствующим образом, сообщая дескрипторы без ошибок. Затем я использую HIDAPI, чтобы открыть устройство и прочитать сообщенные значения. Эта реализация работает, как и ожидалось, предоставляя мне возможность передачи данных с моего устройства на хост.

Однако, нет предоставленной функции HID Output Report, поэтому я сам реализую это:

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 в бесконечном цикле, который вызывается повторно. Я использую hid_write в HIDAPI для передачи данных на устройство один раз. При отладке устройство выполняет итерацию в цикле и вводит передачу конечной точки PCD при каждом вызове. hid_write, по-видимому, не вызывает обновления моего буфера, как ожидалось на устройстве, и USBlyzer сообщает об «ошибке транзакции» в отчете OUT.

Кто-нибудь знает ошибку в моей реализации?

...