2013-02-15 4 views
3

Использование чипа atmega8 и библиотеки V-USB Я сделал небольшой мост для подключения геймпада NES к USB. Сначала я использовал один из примеров, как мой спрятали дескриптор и так ... я мое устройство правильно распознан в Windows, когда я установил его рукопожатие с этим HID отчета дескриптореПростой джойстик скрывает дескриптор отчета не работает

PROGMEM const char usbHidReportDescriptor[100] = { 
    0x05, 0x01,     // USAGE_PAGE (Generic Desktop) 
    0x15, 0x00,     // LOGICAL_MINIMUM (0) 
    0x09, 0x04,     // USAGE (Joystick) 
    0xa1, 0x01,     // COLLECTION (Application) 
    0x05, 0x02,     // USAGE_PAGE (Simulation Controls) 
    0x09, 0xbb,     // USAGE (Throttle) 
    0x15, 0x81,     // LOGICAL_MINIMUM (-127) 
    0x25, 0x7f,     // LOGICAL_MAXIMUM (127) 
    0x75, 0x08,     // REPORT_SIZE (8) 
    0x95, 0x01,     // REPORT_COUNT (1) 
    0x81, 0x02,     // INPUT (Data,Var,Abs) 
    0x05, 0x01,     // USAGE_PAGE (Generic Desktop) 
    0x09, 0x01,     // USAGE (Pointer) 
    0xa1, 0x00,     // COLLECTION (Physical) 
    0x09, 0x30,     //  USAGE (X) 
    0x09, 0x31,     //  USAGE (Y) 
    0x95, 0x02,     //  REPORT_COUNT (2) 
    0x81, 0x02,     //  INPUT (Data,Var,Abs) 
    0xc0,       // END_COLLECTION 
    0x09, 0x39,     // USAGE (Hat switch) 
    0x15, 0x00,     // LOGICAL_MINIMUM (0) 
    0x25, 0x03,     // LOGICAL_MAXIMUM (3) 
    0x35, 0x00,     // PHYSICAL_MINIMUM (0) 
    0x46, 0x0e, 0x01,    // PHYSICAL_MAXIMUM (270) 
    0x65, 0x14,     // UNIT (Eng Rot:Angular Pos) 
    0x75, 0x04,     // REPORT_SIZE (4) 
    0x95, 0x01,     // REPORT_COUNT (1) 
    0x81, 0x02,     // INPUT (Data,Var,Abs) 
    0x05, 0x09,     // USAGE_PAGE (Button) 
    0x19, 0x01,     // USAGE_MINIMUM (Button 1) 
    0x29, 0x04,     // USAGE_MAXIMUM (Button 4) 
    0x15, 0x00,     // LOGICAL_MINIMUM (0) 
    0x25, 0x01,     // LOGICAL_MAXIMUM (1) 
    0x75, 0x01,     // REPORT_SIZE (1) 
0x95, 0x04,     // REPORT_COUNT (4) 
0x55, 0x00,     // UNIT_EXPONENT (0) 
0x65, 0x00,     // UNIT (None) 
0x81, 0x02,     // INPUT (Data,Var,Abs) 
0xc0       // END_COLLECTION 
}; 

, и этим типом отчета

typedef struct{ 
    char throttle; 
    char x; 
    char y; 
    uchar hatSwitchAndButtons; 
}report_t; 

Но когда я сделал проще:

PROGMEM const char usbHidReportDescriptor[48] = { 
    0x05, 0x01,     // USAGE_PAGE (Generic Desktop) 
    0x09, 0x04,     // USAGE (Joystick) 
    0xa1, 0x01,     // COLLECTION (Application) 
    0x15, 0x81,     // LOGICAL_MINIMUM (-127) 
    0x25, 0x7f,     // LOGICAL_MAXIMUM (127) 
    0x05, 0x01,     // USAGE_PAGE (Generic Desktop) 
    0x09, 0x01,     // USAGE (Pointer) 
    0xa1, 0x00,     // COLLECTION (Physical) 
    0x09, 0x30,     //  USAGE (X) 
    0x09, 0x31,     //  USAGE (Y) 
    0x75, 0x08,     //  REPORT_SIZE (8) 
    0x95, 0x02,     //  REPORT_COUNT (2) 
    0x81, 0x02,     //  INPUT (Data,Var,Abs) 
    0xc0,       // END_COLLECTION 
    0x05, 0x09,     // USAGE_PAGE (Button) 
    0x19, 0x01,     // USAGE_MINIMUM (Button 1) 
    0x29, 0x04,     // USAGE_MAXIMUM (Button 8) 
    0x15, 0x00,     // LOGICAL_MINIMUM (0) 
    0x25, 0x01,     // LOGICAL_MAXIMUM (1) 
    0x75, 0x01,     // REPORT_SIZE (1) 
    0x95, 0x04,     // REPORT_COUNT (8) 
    0x55, 0x00,     // UNIT_EXPONENT (0) 
    0x65, 0x00,     // UNIT (None) 
    0x81, 0x02,     // INPUT (Data,Var,Abs) 
    0xc0       // END_COLLECTION 
}; 

typedef struct{ 
    char x; 
    char y; 
    uchar buttons; 
}report_t; 

Windows, не удалось установить мой джойстик. Он все равно узнает его имя, но не сможет завершить установку.

Я смущен, потому что USB Hid Tool проверяет этот дескриптор отчета.

Любая идея, пожалуйста?

ответ

4
0x29, 0x04,     // USAGE_MAXIMUM (Button 8) 
0x95, 0x04,     // REPORT_COUNT (8) 

Ooops, похоже, кто-то программирует с комментариями. :) Изменить 0x04 на 0x08. И следите за тем, чтобы каждый размер отчета можно было разделить на 8 (8,16,24,32 и т. Д.)

 Смежные вопросы

  • Нет связанных вопросов^_^