diff --git a/firmware/src/button.c b/firmware/src/button.c index d8c80dc..3c3dd56 100644 --- a/firmware/src/button.c +++ b/firmware/src/button.c @@ -45,7 +45,7 @@ uint8_t button_num() static uint16_t button_reading; /* If a switch flips, it freezes for a while */ -#define DEBOUNCE_FREEZE_TIME_US 1000 +#define DEBOUNCE_FREEZE_TIME_US 5000 void button_update() { uint64_t now = time_us_64(); diff --git a/firmware/src/commands.c b/firmware/src/commands.c index 5ae436e..f03b199 100644 --- a/firmware/src/commands.c +++ b/firmware/src/commands.c @@ -7,6 +7,8 @@ #include "pico/stdio.h" #include "pico/stdlib.h" +#include "tusb.h" + #include "touch.h" #include "config.h" #include "save.h" @@ -316,6 +318,15 @@ static void handle_raw() printf("\n"); } +static void handle_whoami() +{ + const char *msg[] = {"\nThis is Command Line port.\n", "\nThis is Touch port.\n", "\nThis is LED port.\n"}; + for (int i = 0; i < 3; i++) { + tud_cdc_n_write(i, msg[i], strlen(msg[i])); + tud_cdc_n_write_flush(i); + } +} + static void handle_save() { save_request(true); @@ -337,6 +348,7 @@ void commands_init() cli_register("sense", handle_sense, "Set sensitivity config."); cli_register("debounce", handle_debounce, "Set debounce config."); cli_register("raw", handle_raw, "Show key raw readings."); + cli_register("whoami", handle_whoami, "Identify each com port."); cli_register("save", handle_save, "Save config to flash."); cli_register("factory", config_factory_reset, "Reset everything to default."); } diff --git a/firmware/src/main.c b/firmware/src/main.c index 0f36597..361c30c 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -34,10 +34,7 @@ #include "io.h" struct __attribute__((packed)) { - uint16_t buttons; // 16 buttons; see JoystickButtons_t for bit mapping - uint8_t HAT; // HAT switch; one nibble w/ unused nibble - uint32_t axis; // slider touch data - uint8_t VendorSpec; + uint16_t buttons; } hid_joy; struct __attribute__((packed)) { @@ -48,16 +45,13 @@ struct __attribute__((packed)) { void report_usb_hid() { if (tud_hid_ready()) { - hid_joy.HAT = 0; - hid_joy.VendorSpec = 0; if (mai_cfg->hid.joy) { hid_joy.buttons = button_read(); - tud_hid_n_report(0x00, REPORT_ID_JOYSTICK, &hid_joy, sizeof(hid_joy)); + tud_hid_n_report(0, REPORT_ID_JOYSTICK, &hid_joy, sizeof(hid_joy)); } - if (mai_cfg->hid.nkro && - (memcmp(&hid_nkro, &sent_hid_nkro, sizeof(hid_nkro)) != 0)) { + if (mai_cfg->hid.nkro) { sent_hid_nkro = hid_nkro; - tud_hid_n_report(0x02, 0, &sent_hid_nkro, sizeof(sent_hid_nkro)); + tud_hid_n_report(1, 0, &sent_hid_nkro, sizeof(sent_hid_nkro)); } } } @@ -189,15 +183,4 @@ void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t const *buffer, uint16_t bufsize) { - if (report_type == HID_REPORT_TYPE_OUTPUT) { - last_hid_time = time_us_64(); - return; - } - - if (report_type == HID_REPORT_TYPE_FEATURE) { - if (report_id == REPORT_ID_LED_COMPRESSED) { - } - last_hid_time = time_us_64(); - return; - } } diff --git a/firmware/src/tusb_config.h b/firmware/src/tusb_config.h index 78bcdd7..d404cfc 100644 --- a/firmware/src/tusb_config.h +++ b/firmware/src/tusb_config.h @@ -96,7 +96,7 @@ extern "C" { #endif //------------- CLASS -------------// -#define CFG_TUD_HID 3 +#define CFG_TUD_HID 2 #define CFG_TUD_CDC 3 #define CFG_TUD_MSC 0 #define CFG_TUD_MIDI 0 diff --git a/firmware/src/usb_descriptors.c b/firmware/src/usb_descriptors.c index eb601d1..90b94f7 100644 --- a/firmware/src/usb_descriptors.c +++ b/firmware/src/usb_descriptors.c @@ -27,21 +27,6 @@ #include "pico/unique_id.h" #include "tusb.h" -/* A combination of interfaces must have a unique product id, since PC will save - * device driver after the first plug. Same VID/PID with different interface e.g - * MSC (first), then CDC (later) will possibly cause system error on PC. - * - * Auto ProductID layout's Bitmap: - * [MSB] HID | MSC | CDC [LSB] - */ -#define _PID_MAP(itf, n) ((CFG_TUD_##itf) << (n)) -#define USB_PID \ - (0x4000 | _PID_MAP(CDC, 0) | _PID_MAP(MSC, 1) | _PID_MAP(HID, 2) | \ - _PID_MAP(MIDI, 3) | _PID_MAP(VENDOR, 4)) - -//--------------------------------------------------------------------+ -// Device Descriptors -//--------------------------------------------------------------------+ tusb_desc_device_t desc_device_joy = { .bLength = sizeof(tusb_desc_device_t), .bDescriptorType = TUSB_DESC_DEVICE, @@ -51,18 +36,16 @@ tusb_desc_device_t desc_device_joy = { .bDeviceProtocol = 0x00, .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, -// To match CrazyRedMachine dll -// vid 0x0f0d, pid 0x0092, interface 1 - - .idVendor = 0x0f0d, - .idProduct = 0x0092, + .idVendor = 0x1f2d, + .idProduct = 0x0123, .bcdDevice = 0x0100, .iManufacturer = 0x01, .iProduct = 0x02, .iSerialNumber = 0x03, - .bNumConfigurations = 0x01}; + .bNumConfigurations = 0x01 +}; // Invoked when received GET DEVICE DESCRIPTOR // Application return pointer to descriptor @@ -75,20 +58,11 @@ uint8_t const* tud_descriptor_device_cb(void) { //--------------------------------------------------------------------+ uint8_t const desc_hid_report_joy[] = { - CHUPICO_REPORT_DESC_JOYSTICK, -}; - -uint8_t const desc_hid_report_led[] = { - CHUPICO_LED_HEADER, - CHUPICO_REPORT_DESC_LED_TOUCH_16, - CHUPICO_REPORT_DESC_LED_TOUCH_15, - CHUPICO_REPORT_DESC_LED_TOWER_6, - CHUPICO_REPORT_DESC_LED_COMPRESSED, - CHUPICO_LED_FOOTER + MAIPICO_REPORT_DESC_JOYSTICK, }; uint8_t const desc_hid_report_nkro[] = { - CHUPICO_REPORT_DESC_NKRO, + MAIPICO_REPORT_DESC_NKRO, }; // Invoked when received GET HID REPORT DESCRIPTOR @@ -100,8 +74,6 @@ uint8_t const* tud_hid_descriptor_report_cb(uint8_t itf) case 0: return desc_hid_report_joy; case 1: - return desc_hid_report_led; - case 2: return desc_hid_report_nkro; default: return NULL; @@ -111,26 +83,28 @@ uint8_t const* tud_hid_descriptor_report_cb(uint8_t itf) // Configuration Descriptor //--------------------------------------------------------------------+ -enum { ITF_NUM_JOY, ITF_NUM_LED, ITF_NUM_NKRO, - ITF_NUM_CDC, ITF_NUM_CDC_DATA, - ITF_NUM_CDC_TOUCH, ITF_NUM_CDC_DATA_TOUCH, - ITF_NUM_CDC_LED, ITF_NUM_CDC_DATA_LED, +enum { ITF_NUM_JOY, ITF_NUM_NKRO, + ITF_NUM_CDC_CLI, ITF_NUM_CDC_CLI_DATA, + ITF_NUM_CDC_TOUCH, ITF_NUM_CDC_TOUCH_DATA, + ITF_NUM_CDC_LED, ITF_NUM_CDC_LED_DATA, ITF_NUM_TOTAL }; -#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN * 3 + TUD_CDC_DESC_LEN * 3) +#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN * 2 + TUD_CDC_DESC_LEN * 3) + +#define EPNUM_JOY 0x81 +#define EPNUM_KEY 0x82 + +#define EPNUM_CDC_CLI_NOTIF 0x83 +#define EPNUM_CDC_CLI_OUT 0x04 +#define EPNUM_CDC_CLI_IN 0x84 + +#define EPNUM_CDC_TOUCH_NOTIF 0x85 +#define EPNUM_CDC_TOUCH_OUT 0x06 +#define EPNUM_CDC_TOUCH_IN 0x86 +#define EPNUM_CDC_LED_NOTIF 0x87 +#define EPNUM_CDC_LED_OUT 0x08 +#define EPNUM_CDC_LED_IN 0x88 -#define EPNUM_JOY 0x84 -#define EPNUM_LED 0x85 -#define EPNUM_KEY 0x86 -#define EPNUM_CDC_NOTIF 0x81 -#define EPNUM_CDC_OUT 0x02 -#define EPNUM_CDC_IN 0x82 -#define EPNUM_CDC_TOUCH_NOTIF 0x87 -#define EPNUM_CDC_TOUCH_OUT 0x03 -#define EPNUM_CDC_TOUCH_IN 0x88 -#define EPNUM_CDC_LED_NOTIF 0x89 -#define EPNUM_CDC_LED_OUT 0x04 -#define EPNUM_CDC_LED_IN 0x8a uint8_t const desc_configuration_joy[] = { // Config number, interface count, string index, total length, attribute, @@ -144,22 +118,18 @@ uint8_t const desc_configuration_joy[] = { sizeof(desc_hid_report_joy), EPNUM_JOY, CFG_TUD_HID_EP_BUFSIZE, 1), - TUD_HID_DESCRIPTOR(ITF_NUM_LED, 5, HID_ITF_PROTOCOL_NONE, - sizeof(desc_hid_report_led), EPNUM_LED, - CFG_TUD_HID_EP_BUFSIZE, 4), - - TUD_HID_DESCRIPTOR(ITF_NUM_NKRO, 6, HID_ITF_PROTOCOL_NONE, + TUD_HID_DESCRIPTOR(ITF_NUM_NKRO, 5, HID_ITF_PROTOCOL_NONE, sizeof(desc_hid_report_nkro), EPNUM_KEY, CFG_TUD_HID_EP_BUFSIZE, 1), - TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 7, EPNUM_CDC_NOTIF, - 8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 64), + TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_CLI, 6, EPNUM_CDC_CLI_NOTIF, + 8, EPNUM_CDC_CLI_OUT, EPNUM_CDC_CLI_IN, 64), - TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_TOUCH, 8, EPNUM_CDC_TOUCH_NOTIF, + TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_TOUCH, 7, EPNUM_CDC_TOUCH_NOTIF, 8, EPNUM_CDC_TOUCH_OUT, EPNUM_CDC_TOUCH_IN, 64), - TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_LED, 9, EPNUM_CDC_LED_NOTIF, - 8, EPNUM_CDC_LED_OUT, EPNUM_CDC_LED_IN, 64) + TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_LED, 8, EPNUM_CDC_LED_NOTIF, + 8, EPNUM_CDC_LED_OUT, EPNUM_CDC_LED_IN, 64), }; // Invoked when received GET CONFIGURATION DESCRIPTOR @@ -184,7 +154,7 @@ static const char *string_desc_arr[] = { "Mai Pico Joystick", "Mai Pico LED", "Mai Pico NKRO", - "Mai Pico Serial Port", + "Mai Pico Command Serial Port", "Mai Pico Touch Serial Port", "Mai Pico LED Serial Port", }; diff --git a/firmware/src/usb_descriptors.h b/firmware/src/usb_descriptors.h index 3f93420..5f7bcbe 100644 --- a/firmware/src/usb_descriptors.h +++ b/firmware/src/usb_descriptors.h @@ -6,10 +6,6 @@ enum { REPORT_ID_JOYSTICK = 1, - REPORT_ID_LED_TOUCH_16 = 4, - REPORT_ID_LED_TOUCH_15 = 5, - REPORT_ID_LED_TOWER_6 = 6, - REPORT_ID_LED_COMPRESSED = 11, }; // because they are missing from tusb_hid.h @@ -22,87 +18,21 @@ enum { // Joystick Report Descriptor Template - Based off Drewol/rp2040-gamecon // Button Map | X | Y -#define CHUPICO_REPORT_DESC_JOYSTICK \ +#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(16), \ + HID_USAGE_MIN(1), HID_USAGE_MAX(10), \ HID_LOGICAL_MIN(0), HID_LOGICAL_MAX(1), \ - HID_REPORT_COUNT(16), HID_REPORT_SIZE(1), \ - HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ - \ - HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ - HID_USAGE(HID_USAGE_DESKTOP_HAT_SWITCH), \ - HID_LOGICAL_MIN(1), HID_LOGICAL_MAX(8), \ - HID_PHYSICAL_MIN(0), HID_PHYSICAL_MAX_N(315, 2), \ - HID_REPORT_SIZE(8), HID_REPORT_COUNT(1), \ - HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ - \ - HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ - HID_USAGE(HID_USAGE_DESKTOP_X), HID_USAGE(HID_USAGE_DESKTOP_Y), \ - HID_USAGE(HID_USAGE_DESKTOP_Z), HID_USAGE(HID_USAGE_DESKTOP_RX), \ - HID_LOGICAL_MIN(0x00), HID_LOGICAL_MAX(0xff), /* Analog */ \ - HID_REPORT_SIZE(8), HID_REPORT_COUNT(4), \ - HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ - \ - HID_USAGE_PAGE_N(HID_USAGE_PAGE_VENDOR, 2), \ - HID_USAGE(0), \ - HID_LOGICAL_MIN(0x00), HID_LOGICAL_MAX(0xff), \ - HID_REPORT_SIZE(8), HID_REPORT_COUNT(1), \ + HID_REPORT_COUNT(10), HID_REPORT_SIZE(1), \ 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_COLLECTION_END -#define CHUPICO_LED_HEADER \ - HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), HID_USAGE(0x00), \ - HID_COLLECTION(HID_COLLECTION_APPLICATION), \ - HID_REPORT_COUNT(1), HID_REPORT_SIZE(8), \ - HID_INPUT(HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE) - -#define CHUPICO_LED_FOOTER \ - HID_COLLECTION_END - -// Slider First 16 LEDs (48 rgb zones, BRG order) -#define CHUPICO_REPORT_DESC_LED_TOUCH_16 \ - HID_REPORT_ID(REPORT_ID_LED_TOUCH_16) \ - HID_REPORT_COUNT(48), HID_REPORT_SIZE(8), \ - HID_LOGICAL_MIN(0x00), HID_LOGICAL_MAX_N(0x00ff, 2), \ - HID_USAGE_PAGE(HID_USAGE_PAGE_ORDINAL), \ - HID_USAGE_MIN(1), HID_USAGE_MAX(48), \ - HID_STRING_MINIMUM(8), HID_STRING_MAXIMUM(55), \ - HID_OUTPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE) - -// Slider Remaining 15 LEDs (45 rgb zones, BRG order) -#define CHUPICO_REPORT_DESC_LED_TOUCH_15 \ - HID_REPORT_ID(REPORT_ID_LED_TOUCH_15) \ - HID_REPORT_COUNT(45), HID_REPORT_SIZE(8), \ - HID_LOGICAL_MIN(0x00), HID_LOGICAL_MAX_N(0x00ff, 2), \ - HID_USAGE_PAGE(HID_USAGE_PAGE_ORDINAL), \ - HID_USAGE_MIN(49), HID_USAGE_MAX(93), \ - HID_STRING_MINIMUM(8), HID_STRING_MAXIMUM(52), /* Delta to previous */ \ - HID_OUTPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE) - -// Tower LEDs (18 rgb zones, BRG order) -#define CHUPICO_REPORT_DESC_LED_TOWER_6 \ - HID_REPORT_ID(REPORT_ID_LED_TOWER_6) \ - HID_REPORT_COUNT(18), HID_REPORT_SIZE(8), \ - HID_LOGICAL_MIN(0x00), HID_LOGICAL_MAX_N(0x00ff, 2), \ - HID_USAGE_PAGE(HID_USAGE_PAGE_ORDINAL), \ - HID_USAGE_MIN(94), HID_USAGE_MAX(111), \ - HID_STRING_MINIMUM(8), HID_STRING_MAXIMUM(25), /* Delta to previous */ \ - HID_OUTPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE) - -// LEDs Compressed -#define CHUPICO_REPORT_DESC_LED_COMPRESSED \ - HID_REPORT_ID(REPORT_ID_LED_COMPRESSED) \ - HID_USAGE_PAGE(HID_USAGE_PAGE_ORDINAL), \ - HID_USAGE(0x00), \ - HID_LOGICAL_MIN(0x00), HID_LOGICAL_MAX_N(0x00ff, 2), \ - HID_REPORT_SIZE(8), HID_REPORT_COUNT(63), \ - HID_FEATURE(HID_DATA | HID_VARIABLE | HID_ABSOLUTE) - -#define CHUPICO_REPORT_DESC_NKRO \ +#define MAIPICO_REPORT_DESC_NKRO \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE(HID_USAGE_DESKTOP_KEYBOARD), \ HID_COLLECTION(HID_COLLECTION_APPLICATION), \