X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;ds=sidebyside;f=protocol%2Flufa%2Flufa.c;h=bff1f5e8b28bf5caa0286a80fb05608d1cd48662;hb=4ae979f6ef8dbf9e1d1f35be15322ad6d02e2958;hp=99d241ded04b408df7c705e33bd121fe5804adba;hpb=e075361b6f6bfe24e8d12d125bdab46345087432;p=max%2Ftmk_keyboard.git diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c index 99d241de..bff1f5e8 100644 --- a/protocol/lufa/lufa.c +++ b/protocol/lufa/lufa.c @@ -59,7 +59,7 @@ static void send_keyboard(report_keyboard_t *report); static void send_mouse(report_mouse_t *report); static void send_system(uint16_t data); static void send_consumer(uint16_t data); -static host_driver_t lufa_driver = { +host_driver_t lufa_driver = { keyboard_leds, send_keyboard, send_mouse, @@ -68,55 +68,15 @@ static host_driver_t lufa_driver = { }; -static void SetupHardware(void); -static void Console_Task(void); - -int main(void) -{ - SetupHardware(); - 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(); - -#if !defined(INTERRUPT_CONTROL_ENDPOINT) - USB_USBTask(); -#endif - } -} - -void SetupHardware(void) -{ - /* Disable watchdog if enabled by bootloader/fuses */ - MCUSR &= ~(1 << WDRF); - wdt_disable(); - - /* Disable clock division */ - clock_prescale_set(clock_div_1); - - USB_Init(); - - // for Console_Task - USB_Device_EnableSOFEvents(); -} - +/******************************************************************************* + * Console + ******************************************************************************/ #ifdef CONSOLE_ENABLE 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(); @@ -147,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()) @@ -339,64 +303,69 @@ 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 */ - if (Endpoint_IsReadWriteAllowed()) - { - /* Write Keyboard Report Data */ - Endpoint_Write_Stream_LE(report, sizeof(report_keyboard_t), NULL); + while (--timeout && !Endpoint_IsReadWriteAllowed()) ; + + /* Write Keyboard Report Data */ + Endpoint_Write_Stream_LE(report, sizeof(report_keyboard_t), NULL); + + /* Finalize the stream transfer to send the last packet */ + Endpoint_ClearIN(); - /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearIN(); - } keyboard_report_sent = *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 */ - if (Endpoint_IsReadWriteAllowed()) - { - /* Write Mouse Report Data */ - Endpoint_Write_Stream_LE(report, sizeof(report_mouse_t), NULL); + while (--timeout && !Endpoint_IsReadWriteAllowed()) ; - /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearIN(); - } + /* Write Mouse Report Data */ + Endpoint_Write_Stream_LE(report, sizeof(report_mouse_t), NULL); + + /* Finalize the stream transfer to send the last packet */ + Endpoint_ClearIN(); #endif } 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); - if (Endpoint_IsReadWriteAllowed()) { - Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); - Endpoint_ClearIN(); - } + 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); - if (Endpoint_IsReadWriteAllowed()) { - Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); - Endpoint_ClearIN(); - } + while (--timeout && !Endpoint_IsReadWriteAllowed()) ; + Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); + Endpoint_ClearIN(); } @@ -407,11 +376,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(); @@ -427,6 +411,7 @@ int8_t sendchar(uint8_t c) } if (prevFN != USB_Device_GetFrameNumber()) { if (!(timeout--)) { + timeouted = true; Endpoint_SelectEndpoint(ep); return -1; } @@ -449,3 +434,51 @@ int8_t sendchar(uint8_t c) return 0; } #endif + + +/******************************************************************************* + * main + ******************************************************************************/ +static void SetupHardware(void) +{ + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + /* Disable clock division */ + clock_prescale_set(clock_div_1); + + // Leonardo needs. Without this USB device is not recognized. + USB_Disable(); + + USB_Init(); + + // for Console_Task + USB_Device_EnableSOFEvents(); +} + +int main(void) __attribute__ ((weak)); +int main(void) +{ + SetupHardware(); + 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_task(); + +#if !defined(INTERRUPT_CONTROL_ENDPOINT) + USB_USBTask(); +#endif + } +}