diff --git a/CMakeLists.txt b/CMakeLists.txt index 94b9d22..74637d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,8 +68,13 @@ target_compile_definitions(ds5-bridge PRIVATE PICO_FLASH_ASSUME_CORE1_SAFE=1 WDL_RESAMPLE_TYPE=float CYW43_PIO_CLOCK_DIV_INT=4 -# ENABLE_DSE # 将PID和产品名称设置为DSE ) +option(ENABLE_DSE "Enable DSE" OFF) +if(ENABLE_DSE) + target_compile_definitions(ds5-bridge PRIVATE + ENABLE_DSE # 将PID和产品名称设置为DSE + ) +endif() pico_set_program_name(ds5-bridge "ds5-bridge") pico_set_program_version(ds5-bridge "0.5.2") diff --git a/src/usb_descriptors.c b/src/usb_descriptors.c index 1c4fe37..ab4380e 100644 --- a/src/usb_descriptors.c +++ b/src/usb_descriptors.c @@ -302,7 +302,11 @@ uint8_t const descriptor_configuration[] = { 0x00, // bCountryCode: Not localized 0x01, // bNumDescriptors: 1 report descriptor 0x22, // bDescriptorType: Report +#ifdef ENABLE_DSE + 0x95, 0x01, // wDescriptorLength: 405 (0x0121) +#else 0x21, 0x01, // wDescriptorLength: 289 (0x0121) +#endif // Endpoint Descriptor (HID IN: EP4) 0x07, // bLength @@ -310,7 +314,7 @@ uint8_t const descriptor_configuration[] = { 0x84, // bEndpointAddress: IN EP4 0x03, // bmAttributes: Interrupt 0x40, 0x00, // wMaxPacketSize: 64 - 0x06, // bInterval: 6 (polling every 4ms) + 0x04, // bInterval: 4 (polling every 4ms) // Endpoint Descriptor (HID OUT: EP3) 0x07, // bLength @@ -318,7 +322,7 @@ uint8_t const descriptor_configuration[] = { 0x03, // bEndpointAddress: OUT EP3 0x03, // bmAttributes: Interrupt 0x40, 0x00, // wMaxPacketSize: 64 - 0x06, // bInterval: 6 + 0x04, // bInterval: 4 }; // Invoked when received GET CONFIGURATION DESCRIPTOR @@ -333,7 +337,8 @@ uint8_t const *tud_descriptor_configuration_cb(uint8_t index) { // HID Report Descriptor //--------------------------------------------------------------------+ -uint8_t const desc_hid_report[] = { +#ifndef ENABLE_DSE +uint8_t const desc_hid_report_ds[] = { 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 0x09, 0x05, // Usage (Game Pad) 0xA1, 0x01, // Collection (Application) @@ -403,8 +408,14 @@ uint8_t const desc_hid_report[] = { 0x09, 0x25, // Usage (0x25) 0x95, 0x1A, // Report Count (26) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) - 0x85, 0x0B, 0x09, 0x41, 0x95, 0x29, 0xB1, 0x02, // ID 0B (新增项) - 0x85, 0x0C, 0x09, 0x42, 0x95, 0x29, 0xB1, 0x02, // ID 0C (新增项) + 0x85, 0x0B, // Report ID (11) + 0x09, 0x41, // Usage (0x41) + 0x95, 0x29, // Report Count (41) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x0C, // Report ID (12) + 0x09, 0x42, // Usage (0x42) + 0x95, 0x29, // Report Count (41) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 0x85, 0x20, // Report ID (32) 0x09, 0x26, // Usage (0x26) 0x95, 0x3F, // Report Count (63) @@ -417,67 +428,279 @@ uint8_t const desc_hid_report[] = { 0x09, 0x40, // Usage (0x40) 0x95, 0x3F, // Report Count (63) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) - 0x85, 0x80, // Report ID (128) + 0x85, 0x80, // Report ID (-128) 0x09, 0x28, // Usage (0x28) 0x95, 0x3F, // Report Count (63) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) - 0x85, 0x81, // Report ID (129) + 0x85, 0x81, // Report ID (-127) 0x09, 0x29, // Usage (0x29) 0x95, 0x3F, // Report Count (63) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) - 0x85, 0x82, // Report ID (130) + 0x85, 0x82, // Report ID (-126) 0x09, 0x2A, // Usage (0x2A) 0x95, 0x09, // Report Count (9) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) - 0x85, 0x83, // Report ID (131) + 0x85, 0x83, // Report ID (-125) 0x09, 0x2B, // Usage (0x2B) 0x95, 0x3F, // Report Count (63) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) - 0x85, 0x84, // Report ID (132) + 0x85, 0x84, // Report ID (-124) 0x09, 0x2C, // Usage (0x2C) 0x95, 0x3F, // Report Count (63) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) - 0x85, 0x85, // Report ID (133) + 0x85, 0x85, // Report ID (-123) 0x09, 0x2D, // Usage (0x2D) 0x95, 0x02, // Report Count (2) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) - 0x85, 0xA0, // Report ID (160) + 0x85, 0xA0, // Report ID (-96) 0x09, 0x2E, // Usage (0x2E) 0x95, 0x01, // Report Count (1) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) - 0x85, 0xE0, // Report ID (224) + 0x85, 0xE0, // Report ID (-32) 0x09, 0x2F, // Usage (0x2F) 0x95, 0x3F, // Report Count (63) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) - 0x85, 0xF0, // Report ID (240) + 0x85, 0xF0, // Report ID (-16) 0x09, 0x30, // Usage (0x30) 0x95, 0x3F, // Report Count (63) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) - 0x85, 0xF1, // Report ID (241) + 0x85, 0xF1, // Report ID (-15) 0x09, 0x31, // Usage (0x31) 0x95, 0x3F, // Report Count (63) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) - 0x85, 0xF2, // Report ID (242) + 0x85, 0xF2, // Report ID (-14) 0x09, 0x32, // Usage (0x32) 0x95, 0x0F, // Report Count (15) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) - 0x85, 0xF4, // Report ID (244) + 0x85, 0xF4, // Report ID (-12) 0x09, 0x35, // Usage (0x35) 0x95, 0x3F, // Report Count (63) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) - 0x85, 0xF5, // Report ID (245) + 0x85, 0xF5, // Report ID (-11) 0x09, 0x36, // Usage (0x36) 0x95, 0x03, // Report Count (3) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 0xC0, // End Collection + // 289 bytes }; +#endif + +#ifdef ENABLE_DSE +uint8_t const desc_hid_report_dse[] = { + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x05, // Usage (Game Pad) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x01, // Report ID (1) + 0x09, 0x30, // Usage (X) + 0x09, 0x31, // Usage (Y) + 0x09, 0x32, // Usage (Z) + 0x09, 0x35, // Usage (Rz) + 0x09, 0x33, // Usage (Rx) + 0x09, 0x34, // Usage (Ry) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x06, // Report Count (6) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) + 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) + 0x09, 0x20, // Usage (0x20) + 0x95, 0x01, // Report Count (1) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 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 (System: English Rotation, Length: Centimeter) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x81, 0x42, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,Null State) + 0x65, 0x00, // Unit (None) + 0x05, 0x09, // Usage Page (Button) + 0x19, 0x01, // Usage Minimum (0x01) + 0x29, 0x0F, // Usage Maximum (0x0F) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x0F, // Report Count (15) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) + 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) + 0x09, 0x21, // Usage (0x21) + 0x95, 0x0D, // Report Count (13) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) + 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) + 0x09, 0x22, // Usage (0x22) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x34, // Report Count (52) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) + 0x85, 0x02, // Report ID (2) + 0x09, 0x23, // Usage (0x23) + 0x95, 0x3F, // Report Count (63) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x05, // Report ID (5) + 0x09, 0x33, // Usage (0x33) + 0x95, 0x28, // Report Count (40) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x08, // Report ID (8) + 0x09, 0x34, // Usage (0x34) + 0x95, 0x2F, // Report Count (47) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x09, // Report ID (9) + 0x09, 0x24, // Usage (0x24) + 0x95, 0x13, // Report Count (19) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x0A, // Report ID (10) + 0x09, 0x25, // Usage (0x25) + 0x95, 0x1A, // Report Count (26) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x0B, // Report ID (11) + 0x09, 0x41, // Usage (0x41) + 0x95, 0x29, // Report Count (41) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x0C, // Report ID (12) + 0x09, 0x42, // Usage (0x42) + 0x95, 0x29, // Report Count (41) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x20, // Report ID (32) + 0x09, 0x26, // Usage (0x26) + 0x95, 0x3F, // Report Count (63) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x21, // Report ID (33) + 0x09, 0x27, // Usage (0x27) + 0x95, 0x04, // Report Count (4) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x22, // Report ID (34) + 0x09, 0x40, // Usage (0x40) + 0x95, 0x3F, // Report Count (63) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x80, // Report ID (-128) + 0x09, 0x28, // Usage (0x28) + 0x95, 0x3F, // Report Count (63) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x81, // Report ID (-127) + 0x09, 0x29, // Usage (0x29) + 0x95, 0x3F, // Report Count (63) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x82, // Report ID (-126) + 0x09, 0x2A, // Usage (0x2A) + 0x95, 0x09, // Report Count (9) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x83, // Report ID (-125) + 0x09, 0x2B, // Usage (0x2B) + 0x95, 0x3F, // Report Count (63) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x84, // Report ID (-124) + 0x09, 0x2C, // Usage (0x2C) + 0x95, 0x3F, // Report Count (63) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x85, // Report ID (-123) + 0x09, 0x2D, // Usage (0x2D) + 0x95, 0x02, // Report Count (2) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0xA0, // Report ID (-96) + 0x09, 0x2E, // Usage (0x2E) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0xE0, // Report ID (-32) + 0x09, 0x2F, // Usage (0x2F) + 0x95, 0x3F, // Report Count (63) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0xF0, // Report ID (-16) + 0x09, 0x30, // Usage (0x30) + 0x95, 0x3F, // Report Count (63) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0xF1, // Report ID (-15) + 0x09, 0x31, // Usage (0x31) + 0x95, 0x3F, // Report Count (63) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0xF2, // Report ID (-14) + 0x09, 0x32, // Usage (0x32) + 0x95, 0x34, // Report Count (52) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0xF4, // Report ID (-12) + 0x09, 0x35, // Usage (0x35) + 0x95, 0x3F, // Report Count (63) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0xF5, // Report ID (-11) + 0x09, 0x36, // Usage (0x36) + 0x95, 0x03, // Report Count (3) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x60, // Report ID (96) + 0x09, 0x41, // Usage (0x41) + 0x95, 0x3F, // Report Count (63) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x61, // Report ID (97) + 0x09, 0x42, // Usage (0x42) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x62, // Report ID (98) + 0x09, 0x43, // Usage (0x43) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x63, // Report ID (99) + 0x09, 0x44, // Usage (0x44) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x64, // Report ID (100) + 0x09, 0x45, // Usage (0x45) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x65, // Report ID (101) + 0x09, 0x46, // Usage (0x46) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x68, // Report ID (104) + 0x09, 0x47, // Usage (0x47) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x70, // Report ID (112) + 0x09, 0x48, // Usage (0x48) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x71, // Report ID (113) + 0x09, 0x49, // Usage (0x49) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x72, // Report ID (114) + 0x09, 0x4A, // Usage (0x4A) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x73, // Report ID (115) + 0x09, 0x4B, // Usage (0x4B) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x74, // Report ID (116) + 0x09, 0x4C, // Usage (0x4C) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x75, // Report ID (117) + 0x09, 0x4D, // Usage (0x4D) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x76, // Report ID (118) + 0x09, 0x4E, // Usage (0x4E) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x77, // Report ID (119) + 0x09, 0x4F, // Usage (0x4F) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x78, // Report ID (120) + 0x09, 0x50, // Usage (0x50) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x79, // Report ID (121) + 0x09, 0x51, // Usage (0x51) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x7A, // Report ID (122) + 0x09, 0x52, // Usage (0x52) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0x85, 0x7B, // Report ID (123) + 0x09, 0x53, // Usage (0x53) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) + 0xC0, // End Collection + // 405 bytes +}; +#endif // Invoked when received GET HID REPORT DESCRIPTOR // Application return pointer to descriptor // Descriptor contents must exist long enough for transfer to complete uint8_t const *tud_hid_descriptor_report_cb(uint8_t itf) { (void) itf; - return desc_hid_report; +#ifdef ENABLE_DSE + return desc_hid_report_dse; +#else + return desc_hid_report_ds; +#endif } //--------------------------------------------------------------------+