diff --git a/main.c b/main.c index ddf8d4a..07c4992 100644 --- a/main.c +++ b/main.c @@ -297,18 +297,21 @@ static struct usb_parameters usb_params = { .reportdesc_len = sizeof(gcn64_usbHidReportDescriptor), .getReport = _usbpad_hid_get_report, .setReport = _usbpad_hid_set_report, + .endpoint_size = 16, }, [1] = { .reportdesc = dataHidReport, .reportdesc_len = sizeof(dataHidReport), .getReport = hiddata_get_report, .setReport = hiddata_set_report, + .endpoint_size = 64, }, [2] = { .reportdesc = gcn64_usbHidReportDescriptor, .reportdesc_len = sizeof(gcn64_usbHidReportDescriptor), .getReport = _usbpad_hid_get_report, .setReport = _usbpad_hid_set_report, + .endpoint_size = 16, }, }, }; diff --git a/usb.c b/usb.c index 3319671..7307730 100644 --- a/usb.c +++ b/usb.c @@ -37,6 +37,8 @@ static uint8_t g_device_state = STATE_DEFAULT; static uint8_t g_current_config; static void *interrupt_data; static volatile int interrupt_data_len = -1; +static void *interrupt_data2; +static volatile int interrupt_data_len2 = -1; static void *interrupt_data3; static volatile int interrupt_data_len3 = -1; @@ -66,8 +68,28 @@ static int wcslen(const wchar_t *str) return i; } +/** Return the values for the UECFG1X register + * + * \return The EPSIZE bits if supported, 0xFF if invalid. + **/ +static uint8_t getEPsizebits(int epsize) +{ + switch(epsize) + { + case 64: return (1<n_hid_interfaces > 2) { - /*** EP3 ***/ - UENUM = 0x03; // select endpoint + for (i=0; in_hid_interfaces; i++) { + UENUM = 0x01 + i; // select endpoint UECONX = 1<hid_params[i].endpoint_size); + if (epsize == 0xff) { + printf_P(PSTR("Invalid ep size\r\n")); + return; + } + UECFG1X = epsize|(1<bmRequestType, rq->bRequest, rq->wValue, rq->wIndex, rq->wLength); + printf_P(PSTR("t: %02x, rq: 0x%02x, val: %04x, l: %d\r\n"), rq->bmRequestType, rq->bRequest, rq->wValue, rq->wLength); #endif if (USB_RQT_IS_HOST_TO_DEVICE(rq->bmRequestType)) @@ -259,10 +257,10 @@ static void handleSetupPacket(struct usb_request *rq) case USB_RQT_CLASS: switch(rq->bRequest) { - case HID_CLSRQ_SET_IDLE: - while (!(UEINTX & (1<