我真的无法对Windows API发表评论(我从未使用过),但我
知道如果在HID报告描述符中指定报告id
然后,报告id占用数据包的第一个字节和其余字节
数据包的有效载荷是您的有效载荷,否则您的数据包就是所有有效载荷,并且
未发送REPORT\u ID。在您的情况下,您的RD指定一个REPORT\u ID和
63字节的有效负载,因此我将指定长度为64,并将
第一个字节中的REPORT\u ID。
报告id被传输到端点,以便它知道如何
解释每份报告
我已经检查了你的报告描述,我可以建议一些调整,可能会减少未来悲伤的机会。
-
从输入报告中删除52字节的pad。无论如何,它只会被主机忽略,因此无需从您的设备发送。
-
使用较短的使用代码来减小报表描述符的大小。如果您的设备内存不足,这可能很重要。
-
不需要时重置物理单元。如果不这样做,则物理单位将应用于所有后续项目-这可能不合适(例如,长度以英寸为单位的开/关开关)。我通过使用PUSH来保存全局变量,并在以后方便的时候使用POP来恢复它们,从而完成了这项工作。
-
在输出报告中指定数据(非常量)。我真的不确定这是否有什么区别,但你永远不知道,未来的一些USB驱动程序可能会选择在发送数据包之前将任何常量字段设置为null,这会造成痛苦。
执行上述操作后,报告描述符大小从203字节减少到仅133字节:
//--------------------------------------------------------------------------------
// Report descriptor data in hex (length 133 bytes)
//--------------------------------------------------------------------------------
// 05011409 04A10185 30050925 017501A4 1901290A 950A8102 190B290E 95048102
// 95028103 05010901 A0093009 31093209 3527FFFF 00007510 95048102 C0093925
// 0734463B 01651475 04950181 02B4190F 29129504 810226FF 00750895 3F0600FF
// 85210901 81028581 09028102 85010903 91828510 09049182 85800905 91828582
// 09069182 C0
//--------------------------------------------------------------------------------
// Decoded Application Collection
//--------------------------------------------------------------------------------
/*
05 01 (GLOBAL) USAGE_PAGE 0x0001 Generic Desktop Page
14 (GLOBAL) LOGICAL_MINIMUM (0) <-- Redundant: LOGICAL_MINIMUM is already 0
09 04 (LOCAL) USAGE 0x00010004 Joystick (CA=Application Collection)
A1 01 (MAIN) COLLECTION 0x00000001 Application (Usage=0x00010004: Page=Generic Desktop Page, Usage=Joystick, Type=CA)
85 30 (GLOBAL) REPORT_ID 0x30 (48) '0'
05 09 (GLOBAL) USAGE_PAGE 0x0009 Button Page
25 01 (GLOBAL) LOGICAL_MAXIMUM 0x01 (1)
75 01 (GLOBAL) REPORT_SIZE 0x01 (1) Number of bits per field
A4 (GLOBAL) PUSH USAGE_PAGE=0x0009 LOGICAL(MIN=0,MAX=1) PHYSICAL(MIN=0,MAX=0) UNIT(0x0,EXP=0) REPORT(ID=0x30,SIZE=1,COUNT=0)
19 01 (LOCAL) USAGE_MINIMUM 0x00090001 Button 1 Primary/trigger (MULTI=Selector, On/Off, Momentary, or One Shot)
29 0A (LOCAL) USAGE_MAXIMUM 0x0009000A Button 10 (MULTI=Selector, On/Off, Momentary, or One Shot)
95 0A (GLOBAL) REPORT_COUNT 0x0A (10) Number of fields
81 02 (MAIN) INPUT 0x00000002 (10 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
19 0B (LOCAL) USAGE_MINIMUM 0x0009000B Button 11 (MULTI=Selector, On/Off, Momentary, or One Shot)
29 0E (LOCAL) USAGE_MAXIMUM 0x0009000E Button 14 (MULTI=Selector, On/Off, Momentary, or One Shot)
95 04 (GLOBAL) REPORT_COUNT 0x04 (4) Number of fields
81 02 (MAIN) INPUT 0x00000002 (4 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
95 02 (GLOBAL) REPORT_COUNT 0x02 (2) Number of fields
81 03 (MAIN) INPUT 0x00000003 (2 fields x 1 bit) 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 01 (LOCAL) USAGE 0x00010001 Pointer (CP=Physical Collection)
A0 (MAIN) COLLECTION 0x00000000 Physical (Usage=0x00010001: Page=Generic Desktop Page, Usage=Pointer, Type=CP)
09 30 (LOCAL) USAGE 0x00010030 X (DV=Dynamic Value)
09 31 (LOCAL) USAGE 0x00010031 Y (DV=Dynamic Value)
09 32 (LOCAL) USAGE 0x00010032 Z (DV=Dynamic Value)
09 35 (LOCAL) USAGE 0x00010035 Rz (DV=Dynamic Value)
27 FFFF0000 (GLOBAL) LOGICAL_MAXIMUM 0x0000FFFF (65535)
75 10 (GLOBAL) REPORT_SIZE 0x10 (16) Number of bits per field
95 04 (GLOBAL) REPORT_COUNT 0x04 (4) Number of fields
81 02 (MAIN) INPUT 0x00000002 (4 fields x 16 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
C0 (MAIN) END_COLLECTION Physical
09 39 (LOCAL) USAGE 0x00010039 Hat switch (DV=Dynamic Value)
25 07 (GLOBAL) LOGICAL_MAXIMUM 0x07 (7)
34 (GLOBAL) PHYSICAL_MINIMUM (0) <-- Redundant: PHYSICAL_MINIMUM is already 0
46 3B01 (GLOBAL) PHYSICAL_MAXIMUM 0x013B (315)
65 14 (GLOBAL) UNIT 0x00000014 Rotation in degrees [1° units] (4=System=English Rotation, 1=Rotation=Degrees)
75 04 (GLOBAL) REPORT_SIZE 0x04 (4) Number of bits per field
95 01 (GLOBAL) REPORT_COUNT 0x01 (1) Number of fields
81 02 (MAIN) INPUT 0x00000002 (1 field x 4 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
B4 (GLOBAL) POP USAGE_PAGE=0x0009 LOGICAL(MIN=0,MAX=1) PHYSICAL(MIN=0,MAX=0) UNIT(0x0,EXP=0) REPORT(ID=0x30,SIZE=1,COUNT=0)
19 0F (LOCAL) USAGE_MINIMUM 0x0009000F Button 15 (MULTI=Selector, On/Off, Momentary, or One Shot)
29 12 (LOCAL) USAGE_MAXIMUM 0x00090012 Button 18 (MULTI=Selector, On/Off, Momentary, or One Shot)
95 04 (GLOBAL) REPORT_COUNT 0x04 (4) Number of fields
81 02 (MAIN) INPUT 0x00000002 (4 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
26 FF00 (GLOBAL) LOGICAL_MAXIMUM 0x00FF (255)
75 08 (GLOBAL) REPORT_SIZE 0x08 (8) Number of bits per field
95 3F (GLOBAL) REPORT_COUNT 0x3F (63) Number of fields
06 00FF (GLOBAL) USAGE_PAGE 0xFF00 Vendor-defined
85 21 (GLOBAL) REPORT_ID 0x21 (33)
09 01 (LOCAL) USAGE 0xFF000001 <-- Warning: Undocumented usage
81 02 (MAIN) INPUT 0x00000002 (63 fields x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
85 81 (GLOBAL) REPORT_ID 0x81 (129)
09 02 (LOCAL) USAGE 0xFF000002 <-- Warning: Undocumented usage
81 02 (MAIN) INPUT 0x00000002 (63 fields x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
85 01 (GLOBAL) REPORT_ID 0x01 (1)
09 03 (LOCAL) USAGE 0xFF000003 <-- Warning: Undocumented usage
91 82 (MAIN) OUTPUT 0x00000082 (63 fields x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 1=Volatile 0=Bitmap
85 10 (GLOBAL) REPORT_ID 0x10 (16)
09 04 (LOCAL) USAGE 0xFF000004 <-- Warning: Undocumented usage
91 82 (MAIN) OUTPUT 0x00000082 (63 fields x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 1=Volatile 0=Bitmap
85 80 (GLOBAL) REPORT_ID 0x80 (128)
09 05 (LOCAL) USAGE 0xFF000005 <-- Warning: Undocumented usage
91 82 (MAIN) OUTPUT 0x00000082 (63 fields x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 1=Volatile 0=Bitmap
85 82 (GLOBAL) REPORT_ID 0x82 (130)
09 06 (LOCAL) USAGE 0xFF000006 <-- Warning: Undocumented usage
91 82 (MAIN) OUTPUT 0x00000082 (63 fields x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 1=Volatile 0=Bitmap
C0 (MAIN) END_COLLECTION Application
*/
//--------------------------------------------------------------------------------
// Button Page inputReport 30 (Device --> Host)
//--------------------------------------------------------------------------------
typedef struct
{
uint8_t reportId; // Report ID = 0x30 (48) '0'
// Collection: Joystick
uint8_t BTN_JoystickButton1 : 1; // Usage 0x00090001: Button 1 Primary/trigger, Value = 0 to 1
uint8_t BTN_JoystickButton2 : 1; // Usage 0x00090002: Button 2 Secondary, Value = 0 to 1
uint8_t BTN_JoystickButton3 : 1; // Usage 0x00090003: Button 3 Tertiary, Value = 0 to 1
uint8_t BTN_JoystickButton4 : 1; // Usage 0x00090004: Button 4, Value = 0 to 1
uint8_t BTN_JoystickButton5 : 1; // Usage 0x00090005: Button 5, Value = 0 to 1
uint8_t BTN_JoystickButton6 : 1; // Usage 0x00090006: Button 6, Value = 0 to 1
uint8_t BTN_JoystickButton7 : 1; // Usage 0x00090007: Button 7, Value = 0 to 1
uint8_t BTN_JoystickButton8 : 1; // Usage 0x00090008: Button 8, Value = 0 to 1
uint8_t BTN_JoystickButton9 : 1; // Usage 0x00090009: Button 9, Value = 0 to 1
uint8_t BTN_JoystickButton10 : 1; // Usage 0x0009000A: Button 10, Value = 0 to 1
uint8_t BTN_JoystickButton11 : 1; // Usage 0x0009000B: Button 11, Value = 0 to 1
uint8_t BTN_JoystickButton12 : 1; // Usage 0x0009000C: Button 12, Value = 0 to 1
uint8_t BTN_JoystickButton13 : 1; // Usage 0x0009000D: Button 13, Value = 0 to 1
uint8_t BTN_JoystickButton14 : 1; // Usage 0x0009000E: Button 14, Value = 0 to 1
uint8_t : 1; // Pad
uint8_t : 1; // Pad
// Collection: Joystick Pointer
uint16_t GD_JoystickPointerX; // Usage 0x00010030: X, Value = 0 to 65535
uint16_t GD_JoystickPointerY; // Usage 0x00010031: Y, Value = 0 to 65535
uint16_t GD_JoystickPointerZ; // Usage 0x00010032: Z, Value = 0 to 65535
uint16_t GD_JoystickPointerRz; // Usage 0x00010035: Rz, Value = 0 to 65535
// Collection: Joystick
uint8_t GD_JoystickHatSwitch : 4; // Usage 0x00010039: Hat switch, Value = 0 to 7, Physical = Value x 45 in degrees
uint8_t BTN_JoystickButton15 : 1; // Usage 0x0009000F: Button 15, Value = 0 to 1
uint8_t BTN_JoystickButton16 : 1; // Usage 0x00090010: Button 16, Value = 0 to 1
uint8_t BTN_JoystickButton17 : 1; // Usage 0x00090011: Button 17, Value = 0 to 1
uint8_t BTN_JoystickButton18 : 1; // Usage 0x00090012: Button 18, Value = 0 to 1
} inputReport30_t;
//--------------------------------------------------------------------------------
// Vendor-defined inputReport 21 (Device --> Host)
//--------------------------------------------------------------------------------
typedef struct
{
uint8_t reportId; // Report ID = 0x21 (33)
uint8_t VEN_Joystick0001[63]; // Usage 0xFF000001: , Value = 0 to 255
} inputReport21_t;
//--------------------------------------------------------------------------------
// Vendor-defined inputReport 81 (Device --> Host)
//--------------------------------------------------------------------------------
typedef struct
{
uint8_t reportId; // Report ID = 0x81 (129)
uint8_t VEN_Joystick0002[63]; // Usage 0xFF000002: , Value = 0 to 255
} inputReport81_t;
//--------------------------------------------------------------------------------
// Vendor-defined outputReport 01 (Device <-- Host)
//--------------------------------------------------------------------------------
typedef struct
{
uint8_t reportId; // Report ID = 0x01 (1)
// Collection: Joystick
uint8_t VEN_Joystick0003[63]; // Usage 0xFF000003: , Value = 0 to 255
} outputReport01_t;
//--------------------------------------------------------------------------------
// Vendor-defined outputReport 10 (Device <-- Host)
//--------------------------------------------------------------------------------
typedef struct
{
uint8_t reportId; // Report ID = 0x10 (16)
uint8_t VEN_Joystick0004[63]; // Usage 0xFF000004: , Value = 0 to 255
} outputReport10_t;
//--------------------------------------------------------------------------------
// Vendor-defined outputReport 80 (Device <-- Host)
//--------------------------------------------------------------------------------
typedef struct
{
uint8_t reportId; // Report ID = 0x80 (128)
uint8_t VEN_Joystick0005[63]; // Usage 0xFF000005: , Value = 0 to 255
} outputReport80_t;
//--------------------------------------------------------------------------------
// Vendor-defined outputReport 82 (Device <-- Host)
//--------------------------------------------------------------------------------
typedef struct
{
uint8_t reportId; // Report ID = 0x82 (130)
uint8_t VEN_Joystick0006[63]; // Usage 0xFF000006: , Value = 0 to 255
} outputReport82_t;