From 1eaba3adb50780cbd23d15fb277ff61370409d36 Mon Sep 17 00:00:00 2001 From: whowechina Date: Sat, 9 Dec 2023 20:30:23 +0800 Subject: [PATCH] Button via IO4 Support --- Production/firmware/mai_pico.uf2 | Bin 117248 -> 117248 bytes firmware/src/board_defs.h | 8 +-- firmware/src/commands.c | 3 +- firmware/src/hid.c | 31 +++++++++-- firmware/src/usb_descriptors.c | 41 ++++----------- firmware/src/usb_descriptors.h | 85 ++++++++++++++++++++++++++++--- 6 files changed, 120 insertions(+), 48 deletions(-) diff --git a/Production/firmware/mai_pico.uf2 b/Production/firmware/mai_pico.uf2 index 4cd11626e70331e5bed274d29e8a11d7f38dc42b..16e737a7ce645a72d4d44c0cc4c276dcf6c1a047 100644 GIT binary patch delta 16378 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 D)&CPY delta 16456 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.joy) { - hid_joy.buttons = button_read(); + uint16_t buttons = button_read(); + hid_joy.buttons[0] = native_to_io4(buttons); + hid_joy.buttons[1] = native_to_io4(0); tud_hid_n_report(0, REPORT_ID_JOYSTICK, &hid_joy, sizeof(hid_joy)); } if (mai_cfg->hid.nkro) { @@ -31,8 +54,8 @@ static void report_usb_hid() } } -const char keymap_p1[10] = BUTTON_NKRO_MAP_P1; -const char keymap_p2[10] = BUTTON_NKRO_MAP_P2; +const char keymap_p1[] = BUTTON_NKRO_MAP_P1; +const char keymap_p2[] = BUTTON_NKRO_MAP_P2; static void gen_nkro_report() { diff --git a/firmware/src/usb_descriptors.c b/firmware/src/usb_descriptors.c index 354aea0..dbf82b1 100644 --- a/firmware/src/usb_descriptors.c +++ b/firmware/src/usb_descriptors.c @@ -36,8 +36,8 @@ tusb_desc_device_t desc_device_joy = { .bDeviceProtocol = 0x00, .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, - .idVendor = 0x1f2d, - .idProduct = 0x0123, + .idVendor = 0x0ca3, + .idProduct = 0x0021, .bcdDevice = 0x0100, .iManufacturer = 0x01, @@ -148,10 +148,10 @@ static char serial_number_str[24] = "123456\0"; // array of pointer to string descriptors static const char *string_desc_arr[] = { (const char[]){0x09, 0x04}, // 0: is supported language is English (0x0409) - "WHowe", // 1: Manufacturer - "Mai Pico Controller", // 2: Product - serial_number_str, // 3: Serials, use chip ID - "Mai Pico Joystick", + "SEGA", // 1: Manufacturer + "Mai Pico", // 2: Product + serial_number_str, // 3: Serials, use chip ID + "I/O CONTROL BD;15257;01;90;1831;6679A;00;GOUT=14_ADIN=8,E_ROTIN=4_COININ=2_SWIN=2,E_UQ1=41,6;", "Mai Pico NKRO", "Mai Pico Command Serial Port", "Mai Pico Touch Serial Port", @@ -163,7 +163,7 @@ static const char *string_desc_arr[] = { // enough for transfer to complete uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid) { - static uint16_t _desc_str[64]; + static uint16_t _desc_str[128]; if (index == 0) { memcpy(&_desc_str[1], string_desc_arr[0], 2); @@ -176,32 +176,11 @@ uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid) pico_get_unique_board_id(&board_id); sprintf(serial_number_str, "%016llx", *(uint64_t *)&board_id); } - - const size_t base_num = sizeof(string_desc_arr) / sizeof(string_desc_arr[0]); - const char *colors[] = {"Blue", "Red", "Green"}; - char str[64]; - - if (index < base_num) { - strcpy(str, string_desc_arr[index]); - } else if (index < base_num + 48 + 45) { - const char *names[] = {"Key ", "Splitter "}; - int led = index - base_num; - int id = led / 6 + 1; - int type = led / 3 % 2; - int brg = led % 3; - sprintf(str, "%s%02d %s", names[type], id, colors[brg]); - } else if (index < base_num + 48 + 45 + 18) { - int led = index - base_num - 48 - 45; - int id = led / 3 + 1; - int brg = led % 3; - sprintf(str, "Tower %02d %s", id, colors[brg]); - } else { - sprintf(str, "Unknown %d", index); - } + const char *str = string_desc_arr[index]; uint8_t chr_count = strlen(str); - if (chr_count > 63) { - chr_count = 63; + if (chr_count > 128) { + chr_count = 128; } // Convert ASCII string into UTF-16 diff --git a/firmware/src/usb_descriptors.h b/firmware/src/usb_descriptors.h index 5f7bcbe..c533016 100644 --- a/firmware/src/usb_descriptors.h +++ b/firmware/src/usb_descriptors.h @@ -16,20 +16,89 @@ enum { #define HID_STRING_MAXIMUM(x) HID_REPORT_ITEM(x, 9, RI_TYPE_LOCAL, 1) #define HID_STRING_MAXIMUM_N(x, n) HID_REPORT_ITEM(x, 9, RI_TYPE_LOCAL, n) -// Joystick Report Descriptor Template - Based off Drewol/rp2040-gamecon -// Button Map | X | Y +// Joystick Report Descriptor to Emulate IO4 #define MAIPICO_REPORT_DESC_JOYSTICK \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE(HID_USAGE_DESKTOP_JOYSTICK), \ HID_COLLECTION(HID_COLLECTION_APPLICATION), \ HID_REPORT_ID(REPORT_ID_JOYSTICK) \ - HID_USAGE_PAGE(HID_USAGE_PAGE_BUTTON), \ - HID_USAGE_MIN(1), HID_USAGE_MAX(10), \ - HID_LOGICAL_MIN(0), HID_LOGICAL_MAX(1), \ - HID_REPORT_COUNT(10), HID_REPORT_SIZE(1), \ + \ + HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ + HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ + HID_USAGE(HID_USAGE_DESKTOP_X), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ - HID_REPORT_COUNT(1), HID_REPORT_SIZE(16 - 10), /*Padding*/ \ - HID_INPUT(HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE), \ + \ + HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ + HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ + HID_USAGE(HID_USAGE_DESKTOP_Y), \ + HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ + \ + HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ + HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ + HID_USAGE(HID_USAGE_DESKTOP_X), \ + HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ + \ + HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ + HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ + HID_USAGE(HID_USAGE_DESKTOP_Y), \ + HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ + \ + HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ + HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ + HID_USAGE(HID_USAGE_DESKTOP_X), \ + HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ + \ + HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ + HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ + HID_USAGE(HID_USAGE_DESKTOP_Y), \ + HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ + \ + HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ + HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ + HID_USAGE(HID_USAGE_DESKTOP_X), \ + HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ + \ + HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ + HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ + HID_USAGE(HID_USAGE_DESKTOP_Y), \ + HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ + \ + HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ + HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ + HID_USAGE(HID_USAGE_DESKTOP_RX), \ + HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ + \ + HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ + HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ + HID_USAGE(HID_USAGE_DESKTOP_RY), \ + HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ + \ + HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ + HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ + HID_USAGE(HID_USAGE_DESKTOP_RX), \ + HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ + \ + HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ + HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ + HID_USAGE(HID_USAGE_DESKTOP_RY), \ + HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ + \ + HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ + HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ + HID_USAGE(HID_USAGE_DESKTOP_SLIDER), \ + HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ + \ + HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ + HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ + HID_USAGE(HID_USAGE_DESKTOP_SLIDER), \ + HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ + \ + HID_REPORT_COUNT(48), HID_REPORT_SIZE(1), \ + HID_USAGE_MIN_N(1, 2), HID_USAGE_MAX_N(48, 2), \ + HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ + \ + HID_REPORT_COUNT(1), HID_REPORT_SIZE(232), \ + HID_INPUT(HID_CONSTANT | HID_ABSOLUTE), \ HID_COLLECTION_END #define MAIPICO_REPORT_DESC_NKRO \