Отчеты STM32 USB HID

Последние две недели я пытался настроить свою карту (STM32F4) на диалог с USB HID с ПК под Windows 7. Я добился успеха с этим дескриптором:

__ALIGN_BEGIN static uint8_t HID_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =
{
    0x06, 0xFF, 0x00,  // USAGE_PAGE (Vendor Page: 0xFF00)
    0x09, 0x01,        // USAGE (Demo Kit)
    0xa1, 0x01,        // COLLECTION (Application)
    //0x85, 0x01,      //     REPORT_ID (1)
    0x09, 0x02,        //     USAGE (DATA)
    0x15, 0x00,        //     LOGICAL_MINIMUM (0)
    0x26, 0xff,0x00,   //     LOGICAL_MAXIMUM (255)
    0x75, 0x08,        //     REPORT_SIZE (8)
    0x95, 0x04,        //     REPORT_COUNT (4)
    0x81, 0x02,        //     INPUT (Data,Var,Abs,Vol)
    0xc0               // END_COLLECTION
};

Таким образом, Windows распознает мою карту как совместимый компонент HID.

Теперь, если я хочу отправить 32-битные данные, такие как uint32, Windows распознает карту, но видит ошибку, сообщающую, что не может ее запустить! Мой дескриптор:

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =
{
    0x06, 0xFF, 0x00,           // USAGE_PAGE (Vendor Page: 0xFF00)
    0x09, 0x01,                 // USAGE (Demo Kit)
    0xa1, 0x01,                 // COLLECTION (Application)
    0x09, 0x02,                 //     USAGE (DATA)
    0x15, 0x00,                 //     LOGICAL_MINIMUM (0)
    0x27, 0xff,0xff,0xff,0xff,  //     LOGICAL_MAXIMUM (65535)
    0x75, 0x20,                 //     REPORT_SIZE (32)
    0x95, 0x01,                 //     REPORT_COUNT (1)
    0x81, 0x02,                 //     INPUT (Data,Var,Abs,Vol)
    0xc0                        // END_COLLECTION
};

Я не понимал, почему не работает!

После этого я использую USBlyser для сканирования другого USB-устройства на моем ПК, и я беру этот дескриптор о моем 3D-мышь spacespilot:

Endpoint Descriptor 83 3 In, Interrupt, 16 ms
Offset Field Size Value Description
0 bLength 1 07h
1 bDescriptorType 1 05h Endpoint
2 bEndpointAddress 1 83h 3 In
3 bmAttributes 1 03h Interrupt
 1..0: Transfer Type  ......11  Interrupt
 7..2: Reserved  000000..
4 wMaxPacketSize 2 0007h 7 bytes
6 bInterval 1 08h 16 ms

Interface 1 HID Report Descriptor Multi-Axis Controller
Item Tag (Value) Raw Data
Usage Page (Generic Desktop) 05 01
Usage (Multi-Axis Controller) 09 08
Collection (Application) A1 01
    Collection (Physical) A1 00
        Report ID (1) 85 01
        Logical Minimum (-500) 16 0C FE
        Logical Maximum (500) 26 F4 01
        Physical Minimum (-32768) 36 00 80
        Physical Maximum (32767) 46 FF 7F
        Usage (X) 09 30
        Usage (Y) 09 31
        Usage (Z) 09 32
        Report Size (16) 75 10
        Report Count (3) 95 03
        Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
    End Collection C0

Если я попробую это сделать, все будет нормально:

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =
{
    0x05, 0x01,      // Usage Page (Generic Desktop)
    0x09, 0x08,            //Usage (Multi-Axis Controller)
    0xa1, 0x01,            // COLLECTION (Application)
    0xa1, 0x00,            // Collection (Physical)
    0x85, 0x01,            // Report ID (1)
    0x16,0x0c,0xfe,        // Logical minimum (-500)
    0x26,0xf4,0x01,        // Logical maximum (500)
    0x35,0x00,             // Physical Minimum (0)
    0x46,0xff,0x00,        // Physical Maximum (255)
    0x09,0x30,             // Usage(X)
    0x09,0x31,             // Usage(Y)
    0x09,0x32,             // Usage(Z)
    0x09,0x33,             // Usage(RX)
    0x09,0x34,             // Usage(RY)
    0x09,0x35,             // //Usage(RZ)
    0x75, 0x08,            //     REPORT_SIZE (16)
    0x95, 0x06,            //     REPORT_COUNT (6)
    0x81, 0x02,            //     INPUT (Data,Var,Abs,Vol)
    0xc0,                  // END_COLLECTION
    0xc0                   // END_COLLECTION
};

Но если я попробую тот же дескриптор, что и моя 3D-мышь:

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =
{
    0x05, 0x01,      // Usage Page (Generic Desktop)
    0x09, 0x08,            // Usage (Multi-Axis Controller)
    0xa1, 0x01,            // COLLECTION (Application)
    0xa1, 0x00,            // Collection (Physical)
    0x85, 0x01,            // Report ID (1)
    0x16,0x0c,0xfe,        // Logical minimum (-500)
    0x26,0xf4,0x01,        // Logical maximum (500)
    0x35,0x00,0x80,        // Physical Minimum (-32768)
    0x46,0xff,0x7f,        // Physical Maximum (32767)
    0x09,0x30,             // Usage(X)
    0x09,0x31,             // Usage(Y)
    0x09,0x32,             // Usage(Z)
    0x75, 0x10,            //     REPORT_SIZE (16)
    0x95, 0x03,            //     REPORT_COUNT (3)
    0x81, 0x02,            //     INPUT (Data,Var,Abs,Vol)
    0xc0,                  // END_COLLECTION
    0xc0                   // END_COLLECTION
};

Винда выдает ту же ошибку, и устройство не запускается !!!

Что не так? Нужен ли мне специальный драйвер для Windows для отправки 32-битных данных (int32)? Для информации я использую библиотеку HID для своего ПК с приложением.

Как я могу это решить?


person Modjo756    schedule 12.06.2015    source источник


Ответы (2)


Четырехбайтовый тег дескриптора LOGICAL_MAXIMUM (0x27) действителен только до 0x7FFFFFFF, поскольку он описывает максимум для поля данных со знаком int. Если вы хотите описать беззнаковое поле данных int, вам нужно будет использовать 8-байтовый тег дескриптора LOGICAL_MAXIMUM следующим образом:

0x28, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00

Думаю, ваш второй пример подойдет. За исключением опечатки в теге дескриптора физического максимума. Это должно быть 0x36, а не 0x35.

person Mike    schedule 07.01.2016

Когда я попробовал ваш последний дескриптор (используя мою библиотеку Arduino USBComposite для STM32F1), Windows выдала мне ошибку о том, что дескриптор имеет неизвестный элемент. Но когда я изменил 0x35 в строке Physical Minimum на 0x36, Windows распознала элемент.

person Alexander Pruss    schedule 21.08.2018