diff --git a/firmware/src/main.c b/firmware/src/main.c index 11004fd..90c5983 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -29,19 +29,20 @@ { uint64_t _t = time_us_64(); func; \ printf(#func ":%lld\n", time_us_64() - _t); } -struct { - uint16_t buttons; - uint8_t joy[6]; -} hid_report; +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; +} hid_joy; void report_usb_hid() { if (tud_hid_ready()) { - hid_report.joy[2] = 0; - hid_report.joy[3] = 64; - hid_report.joy[4] = 128; - hid_report.joy[5] = 192; - tud_hid_n_report(0x00, REPORT_ID_JOYSTICK, &hid_report, sizeof(hid_report)); + hid_joy.buttons = 0; + hid_joy.HAT = 0; + hid_joy.VendorSpec = 0; + tud_hid_n_report(0x00, REPORT_ID_JOYSTICK, &hid_joy, sizeof(hid_joy)); } } @@ -91,7 +92,6 @@ static void core0_loop() while(1) { tud_task(); - hid_report.buttons = 0xcccc; report_usb_hid(); slider_update(); air_update(); @@ -102,9 +102,18 @@ static void core0_loop() printf("Touch: %04x\n", touch); old_touch = touch; } + hid_joy.axis = 0; for (int i = 0; i < 16; i++) { bool k1 = slider_touched(i * 2); bool k2 = slider_touched(i * 2 + 1); + + if (k1) { + hid_joy.axis |= 1 << (30 - i * 2); + } + if (k2) { + hid_joy.axis |= 1 << (31 - i * 2); + } + uint8_t r = k1 ? 255 : 0; uint8_t g = k2 ? 255 : 0; if (k1 || k2) { @@ -112,7 +121,7 @@ static void core0_loop() } rgb_key_color(i, rgb32(r, g, g, false)); } - + hid_joy.axis ^= 0x80808080; // some magic number from CrazyRedMachine for (int i = 0; i < air_num(); i++) { uint8_t v = air_value(i) << 2; rgb_set_color(31 + i, rgb32(v, v, v, false)); diff --git a/firmware/src/usb_descriptors.c b/firmware/src/usb_descriptors.c index 203f61e..e1c8d9a 100644 --- a/firmware/src/usb_descriptors.c +++ b/firmware/src/usb_descriptors.c @@ -51,8 +51,8 @@ tusb_desc_device_t desc_device_joy = { .bDeviceProtocol = 0x00, .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, - .idVendor = 0xCaff, - .idProduct = USB_PID, + .idVendor = 0x0f0d, + .idProduct = 0x4092, .bcdDevice = 0x0100, .iManufacturer = 0x01, @@ -130,7 +130,7 @@ uint8_t const* tud_descriptor_configuration_cb(uint8_t index) { const char *string_desc_arr[] = { (const char[]){0x09, 0x04}, // 0: is supported language is English (0x0409) "WHowe" , // 1: Manufacturer - "Pico IIDX Controller", // 2: Product + "Chu Pico Controller", // 2: Product "654321", // 3: Serials, should use chip ID "Button 1", "Button 2", diff --git a/firmware/src/usb_descriptors.h b/firmware/src/usb_descriptors.h index c6021d8..75f4db0 100644 --- a/firmware/src/usb_descriptors.h +++ b/firmware/src/usb_descriptors.h @@ -22,22 +22,37 @@ enum { // Joystick Report Descriptor Template - Based off Drewol/rp2040-gamecon // Button Map | X | Y #define GAMECON_REPORT_DESC_JOYSTICK(...) \ - HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ + HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE(HID_USAGE_DESKTOP_JOYSTICK), \ HID_COLLECTION(HID_COLLECTION_APPLICATION), \ - __VA_ARGS__ HID_USAGE_PAGE(HID_USAGE_PAGE_BUTTON), HID_USAGE_MIN(1), \ - HID_USAGE_MAX(13), \ - HID_LOGICAL_MIN(0), HID_LOGICAL_MAX(1), HID_REPORT_COUNT(13), \ - HID_REPORT_SIZE(1), HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ - HID_REPORT_COUNT(1), HID_REPORT_SIZE(16 - 13), /*Padding*/ \ + __VA_ARGS__ HID_USAGE_PAGE(HID_USAGE_PAGE_BUTTON), \ + HID_USAGE_MIN(1), HID_USAGE_MAX(16), \ + 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_REPORT_COUNT(16 - 16), HID_REPORT_SIZE(1), /*Padding*/ \ HID_INPUT(HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE), \ - HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), HID_LOGICAL_MIN(0x00), \ - HID_LOGICAL_MAX_N(0x00ff, 2), /* Below is Joystick/analog */ \ + \ + HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ + HID_USAGE(HID_USAGE_DESKTOP_HAT_SWITCH), \ + HID_LOGICAL_MIN(0x00), HID_LOGICAL_MAX(0xff), \ + 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_USAGE(HID_USAGE_DESKTOP_RY), HID_USAGE(HID_USAGE_DESKTOP_RZ), \ - HID_REPORT_COUNT(6), HID_REPORT_SIZE(8), \ - HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), HID_COLLECTION_END + 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_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ + \ + HID_COLLECTION_END // Light Map #define GAMECON_REPORT_DESC_LIGHTS(...) \ diff --git a/firmware/test/chuniio.dll b/firmware/test/chuniio.dll new file mode 100644 index 0000000..2b72b9c Binary files /dev/null and b/firmware/test/chuniio.dll differ diff --git a/firmware/test/chunitest.exe b/firmware/test/chunitest.exe new file mode 100644 index 0000000..b1fa188 Binary files /dev/null and b/firmware/test/chunitest.exe differ