2017-02-21 44 views
0

Привет, Я разрабатываю встроенное HID-устройство, которое дает мне ошибку при подключении:Ошибка дескриптора Windows 10

Это устройство не может быть запущено. (Код 10)

Дополнительная коллекция концов или коллекция концов не найдены.

Это, как представляется, проблема с моей картой отчетов, но в соответствии с HID инструментом это нормально:

char ReportDescriptor[52] = { 
    0x05, 0x01,     // USAGE_PAGE (Generic Desktop) 
    0x09, 0x02,     // USAGE (Mouse) 
    0xa1, 0x01,     // COLLECTION (Application) 
    0x09, 0x01,     // USAGE (Pointer) 
    0x85, 0x01,     //  REPORT_ID (1) 
    0x05, 0x09,     //  USAGE_PAGE (Button) 
    0x19, 0x01,     //  USAGE_MINIMUM (Button 1) 
    0x29, 0x03,     //  USAGE_MAXIMUM (Button 3) 
    0x15, 0x00,     //  LOGICAL_MINIMUM (0) 
    0x25, 0x01,     //  LOGICAL_MAXIMUM (1) 
    0x95, 0x03,     //  REPORT_COUNT (3) 
    0x75, 0x01,     //  REPORT_SIZE (1) 
    0x81, 0x02,     //  INPUT (Data,Var,Abs) 
    0x95, 0x01,     //  REPORT_COUNT (1) 
    0x75, 0x05,     //  REPORT_SIZE (5) 
    0x81, 0x03,     //  INPUT (Cnst,Var,Abs) 
    0x05, 0x01,     //  USAGE_PAGE (Generic Desktop) 
    0x09, 0x30,     //  USAGE (X) 
    0x09, 0x31,     //  USAGE (Y) 
    0x15, 0x81,     //  LOGICAL_MINIMUM (-127) 
    0x25, 0x7f,     //  LOGICAL_MAXIMUM (127) 
    0x75, 0x08,     //  REPORT_SIZE (8) 
    0x95, 0x02,     //  REPORT_COUNT (2) 
    0x81, 0x06,     //  INPUT (Data,Var,Rel) 
    0xc0,       // END_COLLECTION 
    0xc0       // END_COLLECTION 

};

Любые идеи?

+0

Возможно ли, что вы используете sizeof ReportDescriptor, который равен 52, но имеет инициализацию 50 байтов? – Preeti

ответ

0

Вы, кажется, опустили пункт «ФИЗИЧЕСКАЯ КОЛЛЕКЦИЯ» (на который, как я думаю, входит дополнительный элемент КОНЕЧНОЙ КОЛЛЕКЦИИ). Возможно, вы имели в виду:

char ReportDescriptor[52] = { 
    0x05, 0x01,     // USAGE_PAGE (Generic Desktop) 
    0x09, 0x02,     // USAGE (Mouse) 
    0xa1, 0x01,     // COLLECTION (Application) 
    0x09, 0x01,     // USAGE (Pointer) 
    0xA1, 0x00,     // COLLECTION (Physical) <-- inserted 
    0x85, 0x01,     //  REPORT_ID (1) 
    0x05, 0x09,     //  USAGE_PAGE (Button) 
    0x19, 0x01,     //  USAGE_MINIMUM (Button 1) 
    0x29, 0x03,     //  USAGE_MAXIMUM (Button 3) 
    0x15, 0x00,     //  LOGICAL_MINIMUM (0) 
    0x25, 0x01,     //  LOGICAL_MAXIMUM (1) 
    0x95, 0x03,     //  REPORT_COUNT (3) 
    0x75, 0x01,     //  REPORT_SIZE (1) 
    0x81, 0x02,     //  INPUT (Data,Var,Abs) 
    0x95, 0x01,     //  REPORT_COUNT (1) 
    0x75, 0x05,     //  REPORT_SIZE (5) 
    0x81, 0x03,     //  INPUT (Cnst,Var,Abs) 
    0x05, 0x01,     //  USAGE_PAGE (Generic Desktop) 
    0x09, 0x30,     //  USAGE (X) 
    0x09, 0x31,     //  USAGE (Y) 
    0x15, 0x81,     //  LOGICAL_MINIMUM (-127) 
    0x25, 0x7f,     //  LOGICAL_MAXIMUM (127) 
    0x75, 0x08,     //  REPORT_SIZE (8) 
    0x95, 0x02,     //  REPORT_COUNT (2) 
    0x81, 0x06,     //  INPUT (Data,Var,Rel) 
    0xc0,       // END_COLLECTION 
    0xc0       // END_COLLECTION 
}; 

Свободное HID Report Descriptor Decoder tool при вызове с:

rexx rd.rex -d samples/win10.rd 

декодирует это как:

//-------------------------------------------------------------------------------- 
// Decoded Application Collection 
//-------------------------------------------------------------------------------- 

/* 
05 01  (GLOBAL) USAGE_PAGE   0x0001 Generic Desktop Page 
09 02  (LOCAL) USAGE    0x00010002 Mouse (CA=Application Collection) 
A1 01  (MAIN) COLLECTION   0x01 Application (Usage=0x00010002: Page=Generic Desktop Page, Usage=Mouse, Type=CA) 
09 01   (LOCAL) USAGE    0x00010001 Pointer (CP=Physical Collection) 
A1 00   (MAIN) COLLECTION   0x00 Physical (Usage=0x00010001: Page=Generic Desktop Page, Usage=Pointer, Type=CP) 
85 01   (GLOBAL) REPORT_ID   0x01 (1) 
05 09   (GLOBAL) USAGE_PAGE   0x0009 Button Page 
19 01   (LOCAL) USAGE_MINIMUM  0x00090001 Button 1 Primary/trigger (MULTI=Selector, On/Off, Momentary, or One Shot) 
29 03   (LOCAL) USAGE_MAXIMUM  0x00090003 Button 3 Tertiary (MULTI=Selector, On/Off, Momentary, or One Shot) 
15 00   (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14 
25 01   (GLOBAL) LOGICAL_MAXIMUM 0x01 (1) 
95 03   (GLOBAL) REPORT_COUNT  0x03 (3) Number of fields 
75 01   (GLOBAL) REPORT_SIZE  0x01 (1) Number of bits per field 
81 02   (MAIN) INPUT    0x00000002 (3 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
95 01   (GLOBAL) REPORT_COUNT  0x01 (1) Number of fields 
75 05   (GLOBAL) REPORT_SIZE  0x05 (5) Number of bits per field 
81 03   (MAIN) INPUT    0x00000003 (1 field x 5 bits) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
05 01   (GLOBAL) USAGE_PAGE   0x0001 Generic Desktop Page 
09 30   (LOCAL) USAGE    0x00010030 X (DV=Dynamic Value) 
09 31   (LOCAL) USAGE    0x00010031 Y (DV=Dynamic Value) 
15 81   (GLOBAL) LOGICAL_MINIMUM 0x81 (-127) 
25 7F   (GLOBAL) LOGICAL_MAXIMUM 0x7F (127) 
75 08   (GLOBAL) REPORT_SIZE  0x08 (8) Number of bits per field 
95 02   (GLOBAL) REPORT_COUNT  0x02 (2) Number of fields 
81 06   (MAIN) INPUT    0x00000006 (2 fields x 8 bits) 0=Data 1=Variable 1=Relative 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
C0    (MAIN) END_COLLECTION  Physical 
C0   (MAIN) END_COLLECTION  Application 
*/ 

И:

rexx rd.rex -s samples/win10.rd 

... генерирует C typedef для него следующим образом:

//-------------------------------------------------------------------------------- 
// Button Page inputReport 01 (Device --> Host) 
//-------------------------------------------------------------------------------- 

typedef struct 
{ 
    uint8_t reportId;         // Report ID = 0x01 (1) 
                // Collection: Mouse Pointer 
    uint8_t BTN_MousePointerButton1 : 1;    // Usage 0x00090001: Button 1 Primary/trigger, Value = 0 to 1 
    uint8_t BTN_MousePointerButton2 : 1;    // Usage 0x00090002: Button 2 Secondary, Value = 0 to 1 
    uint8_t BTN_MousePointerButton3 : 1;    // Usage 0x00090003: Button 3 Tertiary, Value = 0 to 1 
    uint8_t : 5;          // Pad 
    int8_t GD_MousePointerX;       // Usage 0x00010030: X, Value = -127 to 127 
    int8_t GD_MousePointerY;       // Usage 0x00010031: Y, Value = -127 to 127 
} inputReport01_t;