Xbox One手柄的HID描述符是一个标准的USB HID设备描述符,用于描述设备的功能和属性。该描述符包含多个子描述符,其中最重要的是输入报告描述符,它定义了手柄发送给主机的数据格式。
输入报告描述符的格式如下:
```
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x09, 0x05, // Usage (Game Pad)
0xA1, 0x01, // Collection (Application)
0x85, 0x20, // Report ID (32)
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x09, 0x30, // Usage (X)
0x09, 0x31, // Usage (Y)
0x09, 0x32, // Usage (Z)
0x09, 0x35, // Usage (Rz)
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,No Wrap,Linear,Preferred State,No Null Position)
0x09, 0x39, // Usage (Hat switch)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x07, // Logical Maximum (7)
0x35, 0x00, // Physical Minimum (0)
0x46, 0x3B, 0x01, // Physical Maximum (315)
0x65, 0x14, // Unit (Eng Rot:Angular Pos)
0x75, 0x04, // Report Size (4)
0x95, 0x01, // Report Count (1)
0x81, 0x42, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,Null State)
0x75, 0x01, // Report Size (1)
0x95, 0x01, // Report Count (1)
0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x09, // Usage Page (Button)
0x19, 0x01, // Usage Minimum (Button 1)
0x29, 0x0A, // Usage Maximum (Button 10)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x0A, // Report Count (10)
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0 // End Collection
```
该描述符定义了一个32字节的输入报告格式,包含了手柄的所有输入数据,包括四个轴(X、Y、Z、Rz)、一个八方向摇杆(Hat switch)和十个按钮。每个轴和摇杆的数据用8位字节表示,取值范围为0-255,每个按钮用1位表示,取值为0或1。
数据包格式为:
```
Byte 0: Report ID (0x20)
Byte 1: Buttons (bits 0-7)
Byte 2: Buttons (bits 8-15)
Byte 3: Left Trigger
Byte 4: Right Trigger
Byte 5: X-axis (LSB)
Byte 6: X-axis (MSB)
Byte 7: Y-axis (LSB)
Byte 8: Y-axis (MSB)
Byte 9: Z-axis (LSB)
Byte 10: Z-axis (MSB)
Byte 11: Rz-axis (LSB)
Byte 12: Rz-axis (MSB)
Byte 13: Hat Switch (0-7)
```
其中,Report ID为0x20,表示这是一个输入报告;Buttons的位表示对应的按钮是否按下;Left Trigger和Right Trigger的值为0-255,表示扳机的压力程度;轴的值按照Little Endian格式存储。