2013-02-15 57 views
3

使用atmega8芯片和V-USB庫我做了一個小橋樑來將我的NES遊戲手柄連接到USB。起初,我用一個例子作爲我的HID描述符等...... 我有我的設備在正確的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等)