У меня возникли проблемы с настройкой устройства 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.
Кто-нибудь знает ошибку в моей реализации?