X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=protocol%2Flufa%2Flufa.c;h=98c3a68ffbdc30fa1c0128072070e5f4a5c15abc;hb=821563417565776d2dc3a02b0265e6fcd5218739;hp=81409ce9ed3873ea89aa717ca4f8dcdce89be003;hpb=c5060ea81942b0e3f8577536ff78402a19abe3d3;p=max%2Ftmk_keyboard.git diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c index 81409ce9..98c3a68f 100644 --- a/protocol/lufa/lufa.c +++ b/protocol/lufa/lufa.c @@ -76,7 +76,7 @@ static void Console_Task(void) { /* Device must be connected and configured for the task to run */ if (USB_DeviceState != DEVICE_STATE_Configured) - return; + return; uint8_t ep = Endpoint_GetCurrentEndpoint(); @@ -107,6 +107,10 @@ static void Console_Task(void) /* IN packet */ Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM); + if (!Endpoint_IsEnabled() || !Endpoint_IsConfigured()) { + Endpoint_SelectEndpoint(ep); + return; + } // fill empty bank while (Endpoint_IsReadWriteAllowed()) @@ -147,32 +151,41 @@ void EVENT_USB_Device_StartOfFrame(void) /** Event handler for the USB_ConfigurationChanged event. * This is fired when the host sets the current configuration of the USB device after enumeration. */ +#if LUFA_VERSION_INTEGER < 0x120730 + /* old API 120219 */ + #define ENDPOINT_CONFIG(epnum, eptype, epdir, epsize, epbank) Endpoint_ConfigureEndpoint(epnum, eptype, epdir, epsize, epbank) +#else + /* new API >= 120730 */ + #define ENDPOINT_BANK_SINGLE 1 + #define ENDPOINT_BANK_DOUBLE 2 + #define ENDPOINT_CONFIG(epnum, eptype, epdir, epsize, epbank) Endpoint_ConfigureEndpoint((epdir) | (epnum) , eptype, epsize, epbank) +#endif void EVENT_USB_Device_ConfigurationChanged(void) { bool ConfigSuccess = true; /* Setup Keyboard HID Report Endpoints */ - ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, - KEYBOARD_EPSIZE, ENDPOINT_BANK_SINGLE); + ConfigSuccess &= ENDPOINT_CONFIG(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, + KEYBOARD_EPSIZE, ENDPOINT_BANK_SINGLE); #ifdef MOUSE_ENABLE /* Setup Mouse HID Report Endpoint */ - ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, - MOUSE_EPSIZE, ENDPOINT_BANK_SINGLE); + ConfigSuccess &= ENDPOINT_CONFIG(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, + MOUSE_EPSIZE, ENDPOINT_BANK_SINGLE); #endif #ifdef EXTRAKEY_ENABLE /* Setup Extra HID Report Endpoint */ - ConfigSuccess &= Endpoint_ConfigureEndpoint(EXTRAKEY_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, - EXTRAKEY_EPSIZE, ENDPOINT_BANK_SINGLE); + ConfigSuccess &= ENDPOINT_CONFIG(EXTRAKEY_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, + EXTRAKEY_EPSIZE, ENDPOINT_BANK_SINGLE); #endif #ifdef CONSOLE_ENABLE /* Setup Console HID Report Endpoints */ - ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, - CONSOLE_EPSIZE, ENDPOINT_BANK_DOUBLE); - ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT, - CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE); + ConfigSuccess &= ENDPOINT_CONFIG(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, + CONSOLE_EPSIZE, ENDPOINT_BANK_DOUBLE); + ConfigSuccess &= ENDPOINT_CONFIG(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT, + CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE); #endif } @@ -299,12 +312,14 @@ static uint8_t keyboard_leds(void) static void send_keyboard(report_keyboard_t *report) { + uint8_t timeout = 0; + // TODO: handle NKRO report /* Select the Keyboard Report Endpoint */ Endpoint_SelectEndpoint(KEYBOARD_IN_EPNUM); /* Check if Keyboard Endpoint Ready for Read/Write */ - while (!Endpoint_IsReadWriteAllowed()) ; + while (--timeout && !Endpoint_IsReadWriteAllowed()) ; /* Write Keyboard Report Data */ Endpoint_Write_Stream_LE(report, sizeof(report_keyboard_t), NULL); @@ -318,11 +333,13 @@ static void send_keyboard(report_keyboard_t *report) static void send_mouse(report_mouse_t *report) { #ifdef MOUSE_ENABLE + uint8_t timeout = 0; + /* Select the Mouse Report Endpoint */ Endpoint_SelectEndpoint(MOUSE_IN_EPNUM); /* Check if Mouse Endpoint Ready for Read/Write */ - while (!Endpoint_IsReadWriteAllowed()) ; + while (--timeout && !Endpoint_IsReadWriteAllowed()) ; /* Write Mouse Report Data */ Endpoint_Write_Stream_LE(report, sizeof(report_mouse_t), NULL); @@ -334,24 +351,28 @@ static void send_mouse(report_mouse_t *report) static void send_system(uint16_t data) { + uint8_t timeout = 0; + report_extra_t r = { .report_id = REPORT_ID_SYSTEM, .usage = data }; Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM); - while (!Endpoint_IsReadWriteAllowed()) ; + while (--timeout && !Endpoint_IsReadWriteAllowed()) ; Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); Endpoint_ClearIN(); } static void send_consumer(uint16_t data) { + uint8_t timeout = 0; + report_extra_t r = { .report_id = REPORT_ID_CONSUMER, .usage = data }; Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM); - while (!Endpoint_IsReadWriteAllowed()) ; + while (--timeout && !Endpoint_IsReadWriteAllowed()) ; Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); Endpoint_ClearIN(); } @@ -364,11 +385,26 @@ static void send_consumer(uint16_t data) #define SEND_TIMEOUT 5 int8_t sendchar(uint8_t c) { + // Not wait once timeouted. + // Because sendchar() is called so many times, waiting each call causes big lag. + static bool timeouted = false; + if (USB_DeviceState != DEVICE_STATE_Configured) - return -1; + return -1; uint8_t ep = Endpoint_GetCurrentEndpoint(); Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM); + if (!Endpoint_IsEnabled() || !Endpoint_IsConfigured()) { + Endpoint_SelectEndpoint(ep); + return -1; + } + + if (timeouted && !Endpoint_IsReadWriteAllowed()) { + Endpoint_SelectEndpoint(ep); + return - 1; + } + + timeouted = false; uint8_t timeout = SEND_TIMEOUT; uint16_t prevFN = USB_Device_GetFrameNumber(); @@ -384,6 +420,7 @@ int8_t sendchar(uint8_t c) } if (prevFN != USB_Device_GetFrameNumber()) { if (!(timeout--)) { + timeouted = true; Endpoint_SelectEndpoint(ep); return -1; } @@ -433,21 +470,14 @@ int main(void) __attribute__ ((weak)); int main(void) { SetupHardware(); + keyboard_init(); + host_set_driver(&lufa_driver); sei(); - print_enable = true; - debug_enable = true; - debug_matrix = true; - debug_keyboard = true; - debug_mouse = true; - // TODO: can't print here debug("LUFA init\n"); - - keyboard_init(); - host_set_driver(&lufa_driver); while (1) { - keyboard_proc(); + keyboard_task(); #if !defined(INTERRUPT_CONTROL_ENDPOINT) USB_USBTask();