From 9be3cf4865554effbe48d4f89ffa7cb66e8b05d3 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Fri, 8 Jun 2018 20:23:58 +0200 Subject: [PATCH 01/46] Invalidate the stored report if the command fails Fixes #122 --- right/src/usb_report_updater.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 979398d..5fd21ff 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -423,7 +423,8 @@ void UpdateUsbReports(void) last_basic_report = *ActiveUsbBasicKeyboardReport; SwitchActiveUsbBasicKeyboardReport(); HasUsbBasicKeyboardReportChanged = true; - UsbBasicKeyboardAction(); + if (UsbBasicKeyboardAction() != kStatus_USB_Success) + last_basic_report.scancodes[0] = 0xFF; // Invalidate the stored report if the command fails } static usb_media_keyboard_report_t last_media_report = { .scancodes[0] = 0xFF }; @@ -432,7 +433,8 @@ void UpdateUsbReports(void) last_media_report = *ActiveUsbMediaKeyboardReport; HasUsbMediaKeyboardReportChanged = true; SwitchActiveUsbMediaKeyboardReport(); - UsbMediaKeyboardAction(); + if (UsbMediaKeyboardAction() != kStatus_USB_Success) + last_media_report.scancodes[0] = 0xFF; // Invalidate the stored report if the command fails } static usb_system_keyboard_report_t last_system_report = { .scancodes[0] = 0xFF }; @@ -441,7 +443,8 @@ void UpdateUsbReports(void) last_system_report = *ActiveUsbSystemKeyboardReport; HasUsbSystemKeyboardReportChanged = true; SwitchActiveUsbSystemKeyboardReport(); - UsbSystemKeyboardAction(); + if (UsbSystemKeyboardAction() != kStatus_USB_Success) + last_system_report.scancodes[0] = 0xFF; // Invalidate the stored report if the command fails } static usb_mouse_report_t last_mouse_report = { .buttons = 0xFF }; @@ -450,7 +453,8 @@ void UpdateUsbReports(void) last_mouse_report = *ActiveUsbMouseReport; HasUsbMouseReportChanged = true; SwitchActiveUsbMouseReport(); - usbMouseAction(); + if (usbMouseAction() != kStatus_USB_Success) + last_mouse_report.buttons = 0xFF; // Invalidate the stored report if the command fails } if ((previousLayer != LayerId_Base || HasUsbBasicKeyboardReportChanged || HasUsbMediaKeyboardReportChanged || HasUsbSystemKeyboardReportChanged || HasUsbMouseReportChanged) && IsHostSleeping) { From 4d483e7896beebb5ad5f533adf9d52f99a61a9d4 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Fri, 15 Jun 2018 14:03:59 +0200 Subject: [PATCH 02/46] Limit the update frequency for reading the keyboard --- right/src/usb_report_updater.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 5fd21ff..36b3ae1 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -396,19 +396,10 @@ void UpdateUsbReports(void) { UsbReportUpdateCounter++; - // Process the key inputs at a constant rate when moving the mouse, so the mouse speed is consistent. - bool hasActiveMouseState = false; - for (uint8_t i=0; i Date: Fri, 22 Jun 2018 17:39:22 +0200 Subject: [PATCH 03/46] Fix PIT timer period and added functions for getting the current time in microseconds --- right/src/timer.c | 45 ++++++++++++++++++++++++++++++++++++++------- right/src/timer.h | 4 ++++ 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/right/src/timer.c b/right/src/timer.c index 4106877..afa0ae0 100644 --- a/right/src/timer.c +++ b/right/src/timer.c @@ -1,12 +1,15 @@ #include "fsl_pit.h" #include "timer.h" +#include "peripherals/test_led.h" static volatile uint32_t CurrentTime; +static uint32_t timerClockFrequency; void PIT_TIMER_HANDLER(void) { CurrentTime++; - PIT_ClearStatusFlags(PIT, PIT_TIMER_CHANNEL, PIT_TFLG_TIF_MASK); + //TEST_LED_TOGGLE(); + PIT_ClearStatusFlags(PIT, PIT_TIMER_CHANNEL, kPIT_TimerFlag); } void Timer_Init(void) @@ -15,9 +18,8 @@ void Timer_Init(void) PIT_GetDefaultConfig(&pitConfig); PIT_Init(PIT, &pitConfig); - // TODO: Why the interval needs to be multiplied by two to arrive to the correct timing? - // Figure it out and clean this up. - PIT_SetTimerPeriod(PIT, PIT_TIMER_CHANNEL, MSEC_TO_COUNT(TIMER_INTERVAL_MSEC*2, PIT_SOURCE_CLOCK)); + timerClockFrequency = PIT_SOURCE_CLOCK; + PIT_SetTimerPeriod(PIT, PIT_TIMER_CHANNEL, MSEC_TO_COUNT(TIMER_INTERVAL_MSEC, timerClockFrequency)); PIT_EnableInterrupts(PIT, PIT_TIMER_CHANNEL, kPIT_TimerInterruptEnable); EnableIRQ(PIT_TIMER_IRQ_ID); @@ -28,20 +30,49 @@ uint32_t Timer_GetCurrentTime() { return CurrentTime; } +uint32_t Timer_GetCurrentTimeMicros() { + uint32_t primask, count, ms; + primask = DisableGlobalIRQ(); // Make sure the read is atomic + count = PIT_GetCurrentTimerCount(PIT, PIT_TIMER_CHANNEL); // Read the current timer count + ms = CurrentTime; // Read the overflow counter + EnableGlobalIRQ(primask); // Enable interrupts again if they where enabled before - this should make it interrupt safe + + uint32_t us = COUNT_TO_USEC(count, timerClockFrequency); + return ms * 1000U * TIMER_INTERVAL_MSEC + us; +} + void Timer_SetCurrentTime(uint32_t *time) { - *time = CurrentTime; + *time = Timer_GetCurrentTime(); +} + +void Timer_SetCurrentTimeMicros(uint32_t *time) +{ + *time = Timer_GetCurrentTimeMicros(); } uint32_t Timer_GetElapsedTime(uint32_t *time) { - uint32_t elapsedTime = CurrentTime - *time; + uint32_t elapsedTime = Timer_GetCurrentTime() - *time; + return elapsedTime; +} + +uint32_t Timer_GetElapsedTimeMicros(uint32_t *time) +{ + uint32_t elapsedTime = Timer_GetCurrentTimeMicros() - *time; return elapsedTime; } uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time) { uint32_t elapsedTime = Timer_GetElapsedTime(time); - *time = CurrentTime; + *time = Timer_GetCurrentTime(); + return elapsedTime; +} + +uint32_t Timer_GetElapsedTimeAndSetCurrentMicros(uint32_t *time) +{ + uint32_t elapsedTime = Timer_GetElapsedTimeMicros(time); + *time = Timer_GetCurrentTimeMicros(); return elapsedTime; } diff --git a/right/src/timer.h b/right/src/timer.h index 1ce3218..5acbcce 100644 --- a/right/src/timer.h +++ b/right/src/timer.h @@ -13,8 +13,12 @@ void Timer_Init(void); uint32_t Timer_GetCurrentTime(); + uint32_t Timer_GetCurrentTimeMicros(); void Timer_SetCurrentTime(uint32_t *time); + void Timer_SetCurrentTimeMicros(uint32_t *time); uint32_t Timer_GetElapsedTime(uint32_t *time); + uint32_t Timer_GetElapsedTimeMicros(uint32_t *time); uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time); + uint32_t Timer_GetElapsedTimeAndSetCurrentMicros(uint32_t *time); #endif From 5e97ad1b3c49b54f243dc8e52ddeb1613aa2a964 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Fri, 22 Jun 2018 17:55:21 +0200 Subject: [PATCH 04/46] Just compare the active report with the inactive report stored in each interface driver --- .../usb_interface_basic_keyboard.c | 13 +++++--- .../usb_interface_basic_keyboard.h | 2 +- .../usb_interface_media_keyboard.c | 13 +++++--- .../usb_interface_media_keyboard.h | 2 +- .../src/usb_interfaces/usb_interface_mouse.c | 17 ++++++---- .../src/usb_interfaces/usb_interface_mouse.h | 2 +- .../usb_interface_system_keyboard.c | 13 +++++--- .../usb_interface_system_keyboard.h | 2 +- right/src/usb_report_updater.c | 32 +++++-------------- 9 files changed, 46 insertions(+), 50 deletions(-) diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.c b/right/src/usb_interfaces/usb_interface_basic_keyboard.c index 65789dd..c09e16a 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.c @@ -6,14 +6,14 @@ uint32_t UsbBasicKeyboardActionCounter; usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports; static uint8_t usbBasicKeyboardInBuffer[USB_BASIC_KEYBOARD_REPORT_LENGTH]; -static usb_basic_keyboard_report_t* getInactiveUsbBasicKeyboardReport(void) +usb_basic_keyboard_report_t* GetInactiveUsbBasicKeyboardReport(void) { return ActiveUsbBasicKeyboardReport == usbBasicKeyboardReports ? usbBasicKeyboardReports+1 : usbBasicKeyboardReports; } -void SwitchActiveUsbBasicKeyboardReport(void) +static void SwitchActiveUsbBasicKeyboardReport(void) { - ActiveUsbBasicKeyboardReport = getInactiveUsbBasicKeyboardReport(); + ActiveUsbBasicKeyboardReport = GetInactiveUsbBasicKeyboardReport(); } void ResetActiveUsbBasicKeyboardReport(void) @@ -24,9 +24,12 @@ void ResetActiveUsbBasicKeyboardReport(void) usb_status_t UsbBasicKeyboardAction(void) { UsbBasicKeyboardActionCounter++; - return USB_DeviceHidSend( + usb_status_t usb_status = USB_DeviceHidSend( UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX, - (uint8_t*)getInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH); + (uint8_t*)ActiveUsbBasicKeyboardReport, USB_BASIC_KEYBOARD_REPORT_LENGTH); + if (usb_status == kStatus_USB_Success) + SwitchActiveUsbBasicKeyboardReport(); // Switch the active report if the data was sent successfully + return usb_status; } usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, void *param) diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.h b/right/src/usb_interfaces/usb_interface_basic_keyboard.h index c72b354..2f41c6a 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.h +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.h @@ -41,7 +41,7 @@ usb_status_t UsbBasicKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting); void ResetActiveUsbBasicKeyboardReport(void); - void SwitchActiveUsbBasicKeyboardReport(void); + usb_basic_keyboard_report_t* GetInactiveUsbBasicKeyboardReport(void); usb_status_t UsbBasicKeyboardAction(void); #endif diff --git a/right/src/usb_interfaces/usb_interface_media_keyboard.c b/right/src/usb_interfaces/usb_interface_media_keyboard.c index f93317b..11f84c6 100644 --- a/right/src/usb_interfaces/usb_interface_media_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_media_keyboard.c @@ -4,14 +4,14 @@ uint32_t UsbMediaKeyboardActionCounter; static usb_media_keyboard_report_t usbMediaKeyboardReports[2]; usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport = usbMediaKeyboardReports; -static usb_media_keyboard_report_t* getInactiveUsbMediaKeyboardReport(void) +usb_media_keyboard_report_t* GetInactiveUsbMediaKeyboardReport(void) { return ActiveUsbMediaKeyboardReport == usbMediaKeyboardReports ? usbMediaKeyboardReports+1 : usbMediaKeyboardReports; } -void SwitchActiveUsbMediaKeyboardReport(void) +static void SwitchActiveUsbMediaKeyboardReport(void) { - ActiveUsbMediaKeyboardReport = getInactiveUsbMediaKeyboardReport(); + ActiveUsbMediaKeyboardReport = GetInactiveUsbMediaKeyboardReport(); } void ResetActiveUsbMediaKeyboardReport(void) @@ -22,9 +22,12 @@ void ResetActiveUsbMediaKeyboardReport(void) usb_status_t UsbMediaKeyboardAction() { UsbMediaKeyboardActionCounter++; - return USB_DeviceHidSend( + usb_status_t usb_status = USB_DeviceHidSend( UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX, - (uint8_t*)getInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH); + (uint8_t*)ActiveUsbMediaKeyboardReport, USB_MEDIA_KEYBOARD_REPORT_LENGTH); + if (usb_status == kStatus_USB_Success) + SwitchActiveUsbMediaKeyboardReport(); // Switch the active report if the data was sent successfully + return usb_status; } usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, void *param) diff --git a/right/src/usb_interfaces/usb_interface_media_keyboard.h b/right/src/usb_interfaces/usb_interface_media_keyboard.h index 2b51bb6..a236e8d 100644 --- a/right/src/usb_interfaces/usb_interface_media_keyboard.h +++ b/right/src/usb_interfaces/usb_interface_media_keyboard.h @@ -38,7 +38,7 @@ usb_status_t UsbMediaKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting); void ResetActiveUsbMediaKeyboardReport(void); - void SwitchActiveUsbMediaKeyboardReport(void); + usb_media_keyboard_report_t* GetInactiveUsbMediaKeyboardReport(void); usb_status_t UsbMediaKeyboardAction(); #endif diff --git a/right/src/usb_interfaces/usb_interface_mouse.c b/right/src/usb_interfaces/usb_interface_mouse.c index cd69d00..6d65a65 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.c +++ b/right/src/usb_interfaces/usb_interface_mouse.c @@ -4,14 +4,14 @@ uint32_t UsbMouseActionCounter; static usb_mouse_report_t usbMouseReports[2]; usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports; -static usb_mouse_report_t* getInactiveUsbMouseReport(void) +usb_mouse_report_t* GetInactiveUsbMouseReport(void) { return ActiveUsbMouseReport == usbMouseReports ? usbMouseReports+1 : usbMouseReports; } -void SwitchActiveUsbMouseReport(void) +static void SwitchActiveUsbMouseReport(void) { - ActiveUsbMouseReport = getInactiveUsbMouseReport(); + ActiveUsbMouseReport = GetInactiveUsbMouseReport(); } void ResetActiveUsbMouseReport(void) @@ -22,9 +22,12 @@ void ResetActiveUsbMouseReport(void) usb_status_t usbMouseAction(void) { UsbMouseActionCounter++; - return USB_DeviceHidSend( + usb_status_t usb_status = USB_DeviceHidSend( UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX, - (uint8_t*)getInactiveUsbMouseReport(), USB_MOUSE_REPORT_LENGTH); + (uint8_t*)ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH); + if (usb_status == kStatus_USB_Success) + SwitchActiveUsbMouseReport(); // Switch the active report if the data was sent successfully + return usb_status; } usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param) @@ -35,8 +38,8 @@ usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param switch (event) { case kUSB_DeviceHidEventSendResponse: if (UsbCompositeDevice.attach) { - // Send out the report continuously if the report is not zeros - usb_mouse_report_t *report = getInactiveUsbMouseReport(); + // Send out the last report continuously if the report was not zeros + usb_mouse_report_t *report = GetInactiveUsbMouseReport(); uint8_t zeroBuf[sizeof(usb_mouse_report_t)] = { 0 }; bool reportChanged = memcmp(report, zeroBuf, sizeof(usb_mouse_report_t)) != 0; if (usbMouseActionActive || reportChanged) { diff --git a/right/src/usb_interfaces/usb_interface_mouse.h b/right/src/usb_interfaces/usb_interface_mouse.h index 86f9eeb..b2258a1 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.h +++ b/right/src/usb_interfaces/usb_interface_mouse.h @@ -41,7 +41,7 @@ usb_status_t UsbMouseSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting); void ResetActiveUsbMouseReport(void); - void SwitchActiveUsbMouseReport(void); + usb_mouse_report_t* GetInactiveUsbMouseReport(void); usb_status_t usbMouseAction(void); #endif diff --git a/right/src/usb_interfaces/usb_interface_system_keyboard.c b/right/src/usb_interfaces/usb_interface_system_keyboard.c index 7eda0e7..ac86a61 100644 --- a/right/src/usb_interfaces/usb_interface_system_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_system_keyboard.c @@ -4,14 +4,14 @@ uint32_t UsbSystemKeyboardActionCounter; static usb_system_keyboard_report_t usbSystemKeyboardReports[2]; usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport = usbSystemKeyboardReports; -static usb_system_keyboard_report_t* getInactiveUsbSystemKeyboardReport() +usb_system_keyboard_report_t* GetInactiveUsbSystemKeyboardReport() { return ActiveUsbSystemKeyboardReport == usbSystemKeyboardReports ? usbSystemKeyboardReports+1 : usbSystemKeyboardReports; } -void SwitchActiveUsbSystemKeyboardReport(void) +static void SwitchActiveUsbSystemKeyboardReport(void) { - ActiveUsbSystemKeyboardReport = getInactiveUsbSystemKeyboardReport(); + ActiveUsbSystemKeyboardReport = GetInactiveUsbSystemKeyboardReport(); } void ResetActiveUsbSystemKeyboardReport(void) @@ -22,9 +22,12 @@ void ResetActiveUsbSystemKeyboardReport(void) usb_status_t UsbSystemKeyboardAction(void) { UsbSystemKeyboardActionCounter++; - return USB_DeviceHidSend( + usb_status_t usb_status = USB_DeviceHidSend( UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX, - (uint8_t*)getInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH); + (uint8_t*)ActiveUsbSystemKeyboardReport, USB_SYSTEM_KEYBOARD_REPORT_LENGTH); + if (usb_status == kStatus_USB_Success) + SwitchActiveUsbSystemKeyboardReport(); // Switch the active report if the data was sent successfully + return usb_status; } usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, void *param) diff --git a/right/src/usb_interfaces/usb_interface_system_keyboard.h b/right/src/usb_interfaces/usb_interface_system_keyboard.h index 1e0ff6b..9c22bda 100644 --- a/right/src/usb_interfaces/usb_interface_system_keyboard.h +++ b/right/src/usb_interfaces/usb_interface_system_keyboard.h @@ -39,7 +39,7 @@ usb_status_t UsbSystemKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting); void ResetActiveUsbSystemKeyboardReport(void); - void SwitchActiveUsbSystemKeyboardReport(void); + usb_system_keyboard_report_t* GetInactiveUsbSystemKeyboardReport(); usb_status_t UsbSystemKeyboardAction(void); #endif diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 36b3ae1..e56d4ba 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -408,44 +408,28 @@ void UpdateUsbReports(void) updateActiveUsbReports(); - static usb_basic_keyboard_report_t last_basic_report = { .scancodes[0] = 0xFF }; bool HasUsbBasicKeyboardReportChanged = false; - if (memcmp(ActiveUsbBasicKeyboardReport, &last_basic_report, sizeof(usb_basic_keyboard_report_t)) != 0) { - last_basic_report = *ActiveUsbBasicKeyboardReport; + if (memcmp(ActiveUsbBasicKeyboardReport, GetInactiveUsbBasicKeyboardReport(), sizeof(usb_basic_keyboard_report_t)) != 0) { HasUsbBasicKeyboardReportChanged = true; - SwitchActiveUsbBasicKeyboardReport(); - if (UsbBasicKeyboardAction() != kStatus_USB_Success) - last_basic_report.scancodes[0] = 0xFF; // Invalidate the stored report if the command fails + UsbBasicKeyboardAction(); } - static usb_media_keyboard_report_t last_media_report = { .scancodes[0] = 0xFF }; bool HasUsbMediaKeyboardReportChanged = false; - if (memcmp(ActiveUsbMediaKeyboardReport, &last_media_report, sizeof(usb_media_keyboard_report_t)) != 0) { - last_media_report = *ActiveUsbMediaKeyboardReport; + if (memcmp(ActiveUsbMediaKeyboardReport, GetInactiveUsbMediaKeyboardReport(), sizeof(usb_media_keyboard_report_t)) != 0) { HasUsbMediaKeyboardReportChanged = true; - SwitchActiveUsbMediaKeyboardReport(); - if (UsbMediaKeyboardAction() != kStatus_USB_Success) - last_media_report.scancodes[0] = 0xFF; // Invalidate the stored report if the command fails + UsbMediaKeyboardAction(); } - static usb_system_keyboard_report_t last_system_report = { .scancodes[0] = 0xFF }; bool HasUsbSystemKeyboardReportChanged = false; - if (memcmp(ActiveUsbSystemKeyboardReport, &last_system_report, sizeof(usb_system_keyboard_report_t)) != 0) { - last_system_report = *ActiveUsbSystemKeyboardReport; + if (memcmp(ActiveUsbSystemKeyboardReport, GetInactiveUsbSystemKeyboardReport(), sizeof(usb_system_keyboard_report_t)) != 0) { HasUsbSystemKeyboardReportChanged = true; - SwitchActiveUsbSystemKeyboardReport(); - if (UsbSystemKeyboardAction() != kStatus_USB_Success) - last_system_report.scancodes[0] = 0xFF; // Invalidate the stored report if the command fails + UsbSystemKeyboardAction(); } - static usb_mouse_report_t last_mouse_report = { .buttons = 0xFF }; bool HasUsbMouseReportChanged = false; - if (memcmp(ActiveUsbMouseReport, &last_mouse_report, sizeof(usb_mouse_report_t)) != 0) { - last_mouse_report = *ActiveUsbMouseReport; + if (memcmp(ActiveUsbMouseReport, GetInactiveUsbMouseReport(), sizeof(usb_mouse_report_t)) != 0) { HasUsbMouseReportChanged = true; - SwitchActiveUsbMouseReport(); - if (usbMouseAction() != kStatus_USB_Success) - last_mouse_report.buttons = 0xFF; // Invalidate the stored report if the command fails + usbMouseAction(); } if ((previousLayer != LayerId_Base || HasUsbBasicKeyboardReportChanged || HasUsbMediaKeyboardReportChanged || HasUsbSystemKeyboardReportChanged || HasUsbMouseReportChanged) && IsHostSleeping) { From ad8de4dd562d442f33ec7a5378a8d81c1c3402f3 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Fri, 22 Jun 2018 18:03:27 +0200 Subject: [PATCH 05/46] Increase the resolution of the elapsed timer when reading the keyboard --- right/src/usb_report_updater.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index e56d4ba..de03dd7 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -390,16 +390,16 @@ static void updateActiveUsbReports(void) } uint32_t UsbReportUpdateCounter; -static uint32_t lastMouseUpdateTime; +static uint32_t lastMouseUpdateTimeMicros; void UpdateUsbReports(void) { UsbReportUpdateCounter++; - if (Timer_GetElapsedTime(&lastMouseUpdateTime) < USB_BASIC_KEYBOARD_INTERRUPT_IN_INTERVAL) { + if (Timer_GetElapsedTimeMicros(&lastMouseUpdateTimeMicros) < 1000U * USB_BASIC_KEYBOARD_INTERRUPT_IN_INTERVAL) { return; } - Timer_SetCurrentTime(&lastMouseUpdateTime); + Timer_SetCurrentTimeMicros(&lastMouseUpdateTimeMicros); ResetActiveUsbBasicKeyboardReport(); ResetActiveUsbMediaKeyboardReport(); From 2cc94bd1fc996dcfc96a76345b17fc4672b988b8 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Fri, 22 Jun 2018 18:26:51 +0200 Subject: [PATCH 06/46] The BL_APP_VECTOR_TABLE_ADDRESS should be overridable --- right/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/right/Makefile b/right/Makefile index ef7bcda..f58d3ed 100644 --- a/right/Makefile +++ b/right/Makefile @@ -38,7 +38,7 @@ JLINK_SCRIPT = ../scripts/flash-right.jlink BUILD_FLAGS = -DCPU_$(PART)_cm4 -DUSB_STACK_BM -DBL_HAS_BOOTLOADER_CONFIG=1 # Address of the app vector table. The bootloader will take up the flash before this address. -BL_APP_VECTOR_TABLE_ADDRESS = 0xc000 +BL_APP_VECTOR_TABLE_ADDRESS ?= 0xc000 # Source files. SOURCE = $(wildcard src/*.c) \ From 9a8b1ef8b983822315544b20835c0956e62481f1 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Fri, 22 Jun 2018 21:50:14 +0200 Subject: [PATCH 07/46] The PIT timer is counting downward, so we need to subtract the count from the period value --- right/src/timer.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/right/src/timer.c b/right/src/timer.c index afa0ae0..2a61051 100644 --- a/right/src/timer.c +++ b/right/src/timer.c @@ -37,7 +37,8 @@ uint32_t Timer_GetCurrentTimeMicros() { ms = CurrentTime; // Read the overflow counter EnableGlobalIRQ(primask); // Enable interrupts again if they where enabled before - this should make it interrupt safe - uint32_t us = COUNT_TO_USEC(count, timerClockFrequency); + // Calculate the counter value in microseconds - note that the PIT timer is counting downward, so we need to subtract the count from the period value + uint32_t us = 1000U * TIMER_INTERVAL_MSEC - COUNT_TO_USEC(count, timerClockFrequency); return ms * 1000U * TIMER_INTERVAL_MSEC + us; } From 724378cf6cf13660956e5d9aebc0570e8d7d5281 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 23 Jun 2018 17:33:20 +0200 Subject: [PATCH 08/46] Make sure we do not try to send another report before the old one has finished sending --- .../usb_interface_basic_keyboard.c | 19 ++++++++++--- .../usb_interface_media_keyboard.c | 17 +++++++++-- .../src/usb_interfaces/usb_interface_mouse.c | 28 +++++++++---------- .../usb_interface_system_keyboard.c | 17 +++++++++-- right/src/usb_report_updater.c | 4 ++- 5 files changed, 60 insertions(+), 25 deletions(-) diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.c b/right/src/usb_interfaces/usb_interface_basic_keyboard.c index c09e16a..9d4a892 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.c @@ -5,6 +5,7 @@ static usb_basic_keyboard_report_t usbBasicKeyboardReports[2]; uint32_t UsbBasicKeyboardActionCounter; usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports; static uint8_t usbBasicKeyboardInBuffer[USB_BASIC_KEYBOARD_REPORT_LENGTH]; +static volatile bool sendUsbBasicKeyboardReportCompleted = true; usb_basic_keyboard_report_t* GetInactiveUsbBasicKeyboardReport(void) { @@ -23,12 +24,17 @@ void ResetActiveUsbBasicKeyboardReport(void) usb_status_t UsbBasicKeyboardAction(void) { + if (!sendUsbBasicKeyboardReportCompleted) + return kStatus_USB_Busy; // The previous report has not been sent yet + UsbBasicKeyboardActionCounter++; + SwitchActiveUsbBasicKeyboardReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX, - (uint8_t*)ActiveUsbBasicKeyboardReport, USB_BASIC_KEYBOARD_REPORT_LENGTH); - if (usb_status == kStatus_USB_Success) - SwitchActiveUsbBasicKeyboardReport(); // Switch the active report if the data was sent successfully + (uint8_t*)GetInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH); + if (usb_status == kStatus_USB_Success) { + sendUsbBasicKeyboardReportCompleted = false; + } return usb_status; } @@ -37,7 +43,12 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi usb_status_t error = kStatus_USB_Error; switch (event) { + // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: + sendUsbBasicKeyboardReportCompleted = true; + error = kStatus_USB_Success; + break; + case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: error = kStatus_USB_InvalidRequest; break; @@ -57,7 +68,7 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi report->reportBuffer = usbBasicKeyboardInBuffer; error = kStatus_USB_Success; } else { - error = kStatus_USB_InvalidRequest; + error = kStatus_USB_AllocFail; } break; } diff --git a/right/src/usb_interfaces/usb_interface_media_keyboard.c b/right/src/usb_interfaces/usb_interface_media_keyboard.c index 11f84c6..c8aae80 100644 --- a/right/src/usb_interfaces/usb_interface_media_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_media_keyboard.c @@ -3,6 +3,7 @@ uint32_t UsbMediaKeyboardActionCounter; static usb_media_keyboard_report_t usbMediaKeyboardReports[2]; usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport = usbMediaKeyboardReports; +static volatile bool sendUsbMediaKeyboardReportCompleted = true; usb_media_keyboard_report_t* GetInactiveUsbMediaKeyboardReport(void) { @@ -21,12 +22,17 @@ void ResetActiveUsbMediaKeyboardReport(void) usb_status_t UsbMediaKeyboardAction() { + if (!sendUsbMediaKeyboardReportCompleted) + return kStatus_USB_Busy; // The previous report has not been sent yet + UsbMediaKeyboardActionCounter++; + SwitchActiveUsbMediaKeyboardReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX, - (uint8_t*)ActiveUsbMediaKeyboardReport, USB_MEDIA_KEYBOARD_REPORT_LENGTH); - if (usb_status == kStatus_USB_Success) - SwitchActiveUsbMediaKeyboardReport(); // Switch the active report if the data was sent successfully + (uint8_t*)GetInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH); + if (usb_status == kStatus_USB_Success) { + sendUsbMediaKeyboardReportCompleted = false; + } return usb_status; } @@ -35,7 +41,12 @@ usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, voi usb_status_t error = kStatus_USB_Error; switch (event) { + // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: + sendUsbMediaKeyboardReportCompleted = true; + error = kStatus_USB_Success; + break; + case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventSetReport: case kUSB_DeviceHidEventRequestReportBuffer: diff --git a/right/src/usb_interfaces/usb_interface_mouse.c b/right/src/usb_interfaces/usb_interface_mouse.c index 6d65a65..f1da8b5 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.c +++ b/right/src/usb_interfaces/usb_interface_mouse.c @@ -3,6 +3,7 @@ uint32_t UsbMouseActionCounter; static usb_mouse_report_t usbMouseReports[2]; usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports; +volatile bool sendUsbMouseReportCompleted = true; usb_mouse_report_t* GetInactiveUsbMouseReport(void) { @@ -21,32 +22,31 @@ void ResetActiveUsbMouseReport(void) usb_status_t usbMouseAction(void) { + if (!sendUsbMouseReportCompleted) + return kStatus_USB_Busy; // The previous report has not been sent yet + UsbMouseActionCounter++; + SwitchActiveUsbMouseReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX, - (uint8_t*)ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH); - if (usb_status == kStatus_USB_Success) - SwitchActiveUsbMouseReport(); // Switch the active report if the data was sent successfully + (uint8_t*)GetInactiveUsbMouseReport(), USB_MOUSE_REPORT_LENGTH); + if (usb_status == kStatus_USB_Success) { + sendUsbMouseReportCompleted = false; + } return usb_status; } usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param) { - static bool usbMouseActionActive = false; usb_status_t error = kStatus_USB_Error; switch (event) { + // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: - if (UsbCompositeDevice.attach) { - // Send out the last report continuously if the report was not zeros - usb_mouse_report_t *report = GetInactiveUsbMouseReport(); - uint8_t zeroBuf[sizeof(usb_mouse_report_t)] = { 0 }; - bool reportChanged = memcmp(report, zeroBuf, sizeof(usb_mouse_report_t)) != 0; - if (usbMouseActionActive || reportChanged) { - usbMouseActionActive = reportChanged; // Used to send out all zeros once after a report has been sent - return usbMouseAction(); - } - } + sendUsbMouseReportCompleted = true; + error = kStatus_USB_Success; + break; + case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventSetReport: case kUSB_DeviceHidEventRequestReportBuffer: diff --git a/right/src/usb_interfaces/usb_interface_system_keyboard.c b/right/src/usb_interfaces/usb_interface_system_keyboard.c index ac86a61..a051843 100644 --- a/right/src/usb_interfaces/usb_interface_system_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_system_keyboard.c @@ -3,6 +3,7 @@ uint32_t UsbSystemKeyboardActionCounter; static usb_system_keyboard_report_t usbSystemKeyboardReports[2]; usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport = usbSystemKeyboardReports; +static volatile bool sendUsbSystemKeyboardReportCompleted = true; usb_system_keyboard_report_t* GetInactiveUsbSystemKeyboardReport() { @@ -21,12 +22,17 @@ void ResetActiveUsbSystemKeyboardReport(void) usb_status_t UsbSystemKeyboardAction(void) { + if (!sendUsbSystemKeyboardReportCompleted) + return kStatus_USB_Busy; // The previous report has not been sent yet + UsbSystemKeyboardActionCounter++; + SwitchActiveUsbSystemKeyboardReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX, - (uint8_t*)ActiveUsbSystemKeyboardReport, USB_SYSTEM_KEYBOARD_REPORT_LENGTH); - if (usb_status == kStatus_USB_Success) - SwitchActiveUsbSystemKeyboardReport(); // Switch the active report if the data was sent successfully + (uint8_t*)GetInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH); + if (usb_status == kStatus_USB_Success) { + sendUsbSystemKeyboardReportCompleted = false; + } return usb_status; } @@ -35,7 +41,12 @@ usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, vo usb_status_t error = kStatus_USB_Error; switch (event) { + // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: + sendUsbSystemKeyboardReportCompleted = true; + error = kStatus_USB_Success; + break; + case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventSetReport: case kUSB_DeviceHidEventRequestReportBuffer: diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index de03dd7..2c6377b 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -426,8 +426,10 @@ void UpdateUsbReports(void) UsbSystemKeyboardAction(); } + // Send out the report continuously if the report was not zeros bool HasUsbMouseReportChanged = false; - if (memcmp(ActiveUsbMouseReport, GetInactiveUsbMouseReport(), sizeof(usb_mouse_report_t)) != 0) { + uint8_t zeroBuf[sizeof(usb_mouse_report_t)] = { 0 }; + if (memcmp(ActiveUsbMouseReport, zeroBuf, sizeof(usb_mouse_report_t)) != 0) { HasUsbMouseReportChanged = true; usbMouseAction(); } From e7b3127af1a1042d40730dbb6ea3deb144e64bb8 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 23 Jun 2018 18:20:09 +0200 Subject: [PATCH 09/46] Send out the mouse position and wheel values continuously if the report is not zeros, but only send the mouse button states when they change --- right/src/usb_report_updater.c | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 2c6377b..45790aa 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -408,33 +408,29 @@ void UpdateUsbReports(void) updateActiveUsbReports(); - bool HasUsbBasicKeyboardReportChanged = false; - if (memcmp(ActiveUsbBasicKeyboardReport, GetInactiveUsbBasicKeyboardReport(), sizeof(usb_basic_keyboard_report_t)) != 0) { - HasUsbBasicKeyboardReportChanged = true; + bool HasUsbBasicKeyboardReportChanged = memcmp(ActiveUsbBasicKeyboardReport, GetInactiveUsbBasicKeyboardReport(), sizeof(usb_basic_keyboard_report_t)) != 0; + if (HasUsbBasicKeyboardReportChanged) { UsbBasicKeyboardAction(); } - bool HasUsbMediaKeyboardReportChanged = false; - if (memcmp(ActiveUsbMediaKeyboardReport, GetInactiveUsbMediaKeyboardReport(), sizeof(usb_media_keyboard_report_t)) != 0) { - HasUsbMediaKeyboardReportChanged = true; + bool HasUsbMediaKeyboardReportChanged = memcmp(ActiveUsbMediaKeyboardReport, GetInactiveUsbMediaKeyboardReport(), sizeof(usb_media_keyboard_report_t)) != 0; + if (HasUsbMediaKeyboardReportChanged) { UsbMediaKeyboardAction(); } - bool HasUsbSystemKeyboardReportChanged = false; - if (memcmp(ActiveUsbSystemKeyboardReport, GetInactiveUsbSystemKeyboardReport(), sizeof(usb_system_keyboard_report_t)) != 0) { - HasUsbSystemKeyboardReportChanged = true; + bool HasUsbSystemKeyboardReportChanged = memcmp(ActiveUsbSystemKeyboardReport, GetInactiveUsbSystemKeyboardReport(), sizeof(usb_system_keyboard_report_t)) != 0; + if (HasUsbSystemKeyboardReportChanged) { UsbSystemKeyboardAction(); } - // Send out the report continuously if the report was not zeros - bool HasUsbMouseReportChanged = false; - uint8_t zeroBuf[sizeof(usb_mouse_report_t)] = { 0 }; - if (memcmp(ActiveUsbMouseReport, zeroBuf, sizeof(usb_mouse_report_t)) != 0) { - HasUsbMouseReportChanged = true; + // Send out the mouse position and wheel values continuously if the report is not zeros, but only send the mouse button states when they change. + bool HasUsbMouseReportChanged = memcmp(ActiveUsbMouseReport, GetInactiveUsbMouseReport(), sizeof(usb_mouse_report_t)) != 0; + if (HasUsbMouseReportChanged || ActiveUsbMouseReport->x || ActiveUsbMouseReport->y || + ActiveUsbMouseReport->wheelX || ActiveUsbMouseReport->wheelY) { usbMouseAction(); } - if ((previousLayer != LayerId_Base || HasUsbBasicKeyboardReportChanged || HasUsbMediaKeyboardReportChanged || HasUsbSystemKeyboardReportChanged || HasUsbMouseReportChanged) && IsHostSleeping) { + if (IsHostSleeping && (previousLayer != LayerId_Base || HasUsbBasicKeyboardReportChanged || HasUsbMediaKeyboardReportChanged || HasUsbSystemKeyboardReportChanged || HasUsbMouseReportChanged)) { WakeUpHost(true); // Wake up the host if any key is pressed and the computer is sleeping. } } From fe7065be4ae85a784b1778848262971692c0c0d6 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 23 Jun 2018 18:47:26 +0200 Subject: [PATCH 10/46] Select the "MK22FN512xxx12" under MCU settings --- right/build/.cproject | 83 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/right/build/.cproject b/right/build/.cproject index 1ac7e8e..1a66322 100644 --- a/right/build/.cproject +++ b/right/build/.cproject @@ -457,4 +457,87 @@ + + <?xml version="1.0" encoding="UTF-8"?> +<TargetConfig> +<Properties property_3="NXP" property_4="MK22FN512xxx12" property_count="5" version="70200"/> +<infoList vendor="NXP"><info chip="MK22FN512xxx12" name="MK22FN512xxx12"><chip><name>MK22FN512xxx12</name> +<family>K2x</family> +<vendor>NXP</vendor> +<memory can_program="true" id="Flash" is_ro="true" size="512" type="Flash"/> +<memory id="RAM" size="128" type="RAM"/> +<memoryInstance derived_from="Flash" driver="FTFA_2K.cfx" id="PROGRAM_FLASH" location="0x0" size="0x80000"/> +<memoryInstance derived_from="RAM" id="SRAM_UPPER" location="0x20000000" size="0x10000"/> +<memoryInstance derived_from="RAM" id="SRAM_LOWER" location="0x1fff0000" size="0x10000"/> +<peripheralInstance derived_from="FTFA_FlashConfig" id="FTFA_FlashConfig" location="0x400"/> +<peripheralInstance derived_from="DMA" id="DMA" location="0x40008000"/> +<peripheralInstance derived_from="FB" id="FB" location="0x4000C000"/> +<peripheralInstance derived_from="FMC" id="FMC" location="0x4001F000"/> +<peripheralInstance derived_from="FTFA" id="FTFA" location="0x40020000"/> +<peripheralInstance derived_from="DMAMUX" id="DMAMUX" location="0x40021000"/> +<peripheralInstance derived_from="FTM0" id="FTM0" location="0x40038000"/> +<peripheralInstance derived_from="FTM1" id="FTM1" location="0x40039000"/> +<peripheralInstance derived_from="FTM2" id="FTM2" location="0x4003A000"/> +<peripheralInstance derived_from="FTM3" id="FTM3" location="0x40026000"/> +<peripheralInstance derived_from="ADC0" id="ADC0" location="0x4003B000"/> +<peripheralInstance derived_from="ADC1" id="ADC1" location="0x40027000"/> +<peripheralInstance derived_from="DAC0" id="DAC0" location="0x4003F000"/> +<peripheralInstance derived_from="DAC1" id="DAC1" location="0x40028000"/> +<peripheralInstance derived_from="RNG" id="RNG" location="0x40029000"/> +<peripheralInstance derived_from="LPUART0" id="LPUART0" location="0x4002A000"/> +<peripheralInstance derived_from="SPI0" id="SPI0" location="0x4002C000"/> +<peripheralInstance derived_from="SPI1" id="SPI1" location="0x4002D000"/> +<peripheralInstance derived_from="I2S0" id="I2S0" location="0x4002F000"/> +<peripheralInstance derived_from="CRC" id="CRC" location="0x40032000"/> +<peripheralInstance derived_from="PDB0" id="PDB0" location="0x40036000"/> +<peripheralInstance derived_from="PIT" id="PIT" location="0x40037000"/> +<peripheralInstance derived_from="RTC" id="RTC" location="0x4003D000"/> +<peripheralInstance derived_from="RFVBAT" id="RFVBAT" location="0x4003E000"/> +<peripheralInstance derived_from="LPTMR0" id="LPTMR0" location="0x40040000"/> +<peripheralInstance derived_from="RFSYS" id="RFSYS" location="0x40041000"/> +<peripheralInstance derived_from="SIM" id="SIM" location="0x40047000"/> +<peripheralInstance derived_from="PORTA" id="PORTA" location="0x40049000"/> +<peripheralInstance derived_from="PORTB" id="PORTB" location="0x4004A000"/> +<peripheralInstance derived_from="PORTC" id="PORTC" location="0x4004B000"/> +<peripheralInstance derived_from="PORTD" id="PORTD" location="0x4004C000"/> +<peripheralInstance derived_from="PORTE" id="PORTE" location="0x4004D000"/> +<peripheralInstance derived_from="WDOG" id="WDOG" location="0x40052000"/> +<peripheralInstance derived_from="EWM" id="EWM" location="0x40061000"/> +<peripheralInstance derived_from="MCG" id="MCG" location="0x40064000"/> +<peripheralInstance derived_from="OSC" id="OSC" location="0x40065000"/> +<peripheralInstance derived_from="I2C0" id="I2C0" location="0x40066000"/> +<peripheralInstance derived_from="I2C1" id="I2C1" location="0x40067000"/> +<peripheralInstance derived_from="UART0" id="UART0" location="0x4006A000"/> +<peripheralInstance derived_from="UART1" id="UART1" location="0x4006B000"/> +<peripheralInstance derived_from="UART2" id="UART2" location="0x4006C000"/> +<peripheralInstance derived_from="USB0" id="USB0" location="0x40072000"/> +<peripheralInstance derived_from="CMP0" id="CMP0" location="0x40073000"/> +<peripheralInstance derived_from="CMP1" id="CMP1" location="0x40073008"/> +<peripheralInstance derived_from="VREF" id="VREF" location="0x40074000"/> +<peripheralInstance derived_from="LLWU" id="LLWU" location="0x4007C000"/> +<peripheralInstance derived_from="PMC" id="PMC" location="0x4007D000"/> +<peripheralInstance derived_from="SMC" id="SMC" location="0x4007E000"/> +<peripheralInstance derived_from="RCM" id="RCM" location="0x4007F000"/> +<peripheralInstance derived_from="GPIOA" id="GPIOA" location="0x400FF000"/> +<peripheralInstance derived_from="GPIOB" id="GPIOB" location="0x400FF040"/> +<peripheralInstance derived_from="GPIOC" id="GPIOC" location="0x400FF080"/> +<peripheralInstance derived_from="GPIOD" id="GPIOD" location="0x400FF0C0"/> +<peripheralInstance derived_from="GPIOE" id="GPIOE" location="0x400FF100"/> +<peripheralInstance derived_from="SystemControl" id="SystemControl" location="0xE000E000"/> +<peripheralInstance derived_from="SysTick" id="SysTick" location="0xE000E010"/> +<peripheralInstance derived_from="NVIC" id="NVIC" location="0xE000E100"/> +<peripheralInstance derived_from="MCM" id="MCM" location="0xE0080000"/> +</chip> +<processor><name gcc_name="cortex-m4">Cortex-M4</name> +<family>Cortex-M</family> +</processor> +<link href="MK22F51212_internal_peripheral.xml" show="embed" type="simple"/> +</info> +</infoList> +</TargetConfig> + + + SDK_2.x_MK22FN512xxx12 + 2.3.1 + From d1894fb62a76bf1b550dd4f5dfc5f5ea33033db0 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sun, 24 Jun 2018 16:34:09 +0200 Subject: [PATCH 11/46] Removed call to UpdateUsbReports() before usb has been initialised --- right/src/main.c | 1 - 1 file changed, 1 deletion(-) diff --git a/right/src/main.c b/right/src/main.c index 104675b..c8918cf 100644 --- a/right/src/main.c +++ b/right/src/main.c @@ -45,7 +45,6 @@ int main(void) InitSlaveScheduler(); KeyMatrix_Init(&RightKeyMatrix); InitKeyScanner(); - UpdateUsbReports(); InitUsb(); while (1) { From 64e5fa7ecb5a31f1bbc245f42e31f30aa0fa5b9d Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sun, 24 Jun 2018 17:13:47 +0200 Subject: [PATCH 12/46] Just read the interruptInPipeBusy flag instead of storing the transfer state in a separate variable and switch the active report back if the HID Send command fails --- right/src/usb_interfaces/usb_interface_basic_keyboard.c | 8 +++----- right/src/usb_interfaces/usb_interface_media_keyboard.c | 8 +++----- right/src/usb_interfaces/usb_interface_mouse.c | 8 +++----- right/src/usb_interfaces/usb_interface_system_keyboard.c | 8 +++----- 4 files changed, 12 insertions(+), 20 deletions(-) diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.c b/right/src/usb_interfaces/usb_interface_basic_keyboard.c index 9d4a892..c3e6fdd 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.c @@ -5,7 +5,6 @@ static usb_basic_keyboard_report_t usbBasicKeyboardReports[2]; uint32_t UsbBasicKeyboardActionCounter; usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports; static uint8_t usbBasicKeyboardInBuffer[USB_BASIC_KEYBOARD_REPORT_LENGTH]; -static volatile bool sendUsbBasicKeyboardReportCompleted = true; usb_basic_keyboard_report_t* GetInactiveUsbBasicKeyboardReport(void) { @@ -24,7 +23,7 @@ void ResetActiveUsbBasicKeyboardReport(void) usb_status_t UsbBasicKeyboardAction(void) { - if (!sendUsbBasicKeyboardReportCompleted) + if (((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->interruptInPipeBusy) return kStatus_USB_Busy; // The previous report has not been sent yet UsbBasicKeyboardActionCounter++; @@ -32,8 +31,8 @@ usb_status_t UsbBasicKeyboardAction(void) usb_status_t usb_status = USB_DeviceHidSend( UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX, (uint8_t*)GetInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH); - if (usb_status == kStatus_USB_Success) { - sendUsbBasicKeyboardReportCompleted = false; + if (usb_status != kStatus_USB_Success) { + SwitchActiveUsbBasicKeyboardReport(); // Switch back, as the command failed } return usb_status; } @@ -45,7 +44,6 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: - sendUsbBasicKeyboardReportCompleted = true; error = kStatus_USB_Success; break; case kUSB_DeviceHidEventRecvResponse: diff --git a/right/src/usb_interfaces/usb_interface_media_keyboard.c b/right/src/usb_interfaces/usb_interface_media_keyboard.c index c8aae80..b5e3cab 100644 --- a/right/src/usb_interfaces/usb_interface_media_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_media_keyboard.c @@ -3,7 +3,6 @@ uint32_t UsbMediaKeyboardActionCounter; static usb_media_keyboard_report_t usbMediaKeyboardReports[2]; usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport = usbMediaKeyboardReports; -static volatile bool sendUsbMediaKeyboardReportCompleted = true; usb_media_keyboard_report_t* GetInactiveUsbMediaKeyboardReport(void) { @@ -22,7 +21,7 @@ void ResetActiveUsbMediaKeyboardReport(void) usb_status_t UsbMediaKeyboardAction() { - if (!sendUsbMediaKeyboardReportCompleted) + if (((usb_device_hid_struct_t *)UsbCompositeDevice.mediaKeyboardHandle)->interruptInPipeBusy) return kStatus_USB_Busy; // The previous report has not been sent yet UsbMediaKeyboardActionCounter++; @@ -30,8 +29,8 @@ usb_status_t UsbMediaKeyboardAction() usb_status_t usb_status = USB_DeviceHidSend( UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX, (uint8_t*)GetInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH); - if (usb_status == kStatus_USB_Success) { - sendUsbMediaKeyboardReportCompleted = false; + if (usb_status != kStatus_USB_Success) { + SwitchActiveUsbMediaKeyboardReport(); // Switch back, as the command failed } return usb_status; } @@ -43,7 +42,6 @@ usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, voi switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: - sendUsbMediaKeyboardReportCompleted = true; error = kStatus_USB_Success; break; case kUSB_DeviceHidEventRecvResponse: diff --git a/right/src/usb_interfaces/usb_interface_mouse.c b/right/src/usb_interfaces/usb_interface_mouse.c index f1da8b5..7b39c4f 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.c +++ b/right/src/usb_interfaces/usb_interface_mouse.c @@ -3,7 +3,6 @@ uint32_t UsbMouseActionCounter; static usb_mouse_report_t usbMouseReports[2]; usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports; -volatile bool sendUsbMouseReportCompleted = true; usb_mouse_report_t* GetInactiveUsbMouseReport(void) { @@ -22,7 +21,7 @@ void ResetActiveUsbMouseReport(void) usb_status_t usbMouseAction(void) { - if (!sendUsbMouseReportCompleted) + if (((usb_device_hid_struct_t *)UsbCompositeDevice.mouseHandle)->interruptInPipeBusy) return kStatus_USB_Busy; // The previous report has not been sent yet UsbMouseActionCounter++; @@ -30,8 +29,8 @@ usb_status_t usbMouseAction(void) usb_status_t usb_status = USB_DeviceHidSend( UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX, (uint8_t*)GetInactiveUsbMouseReport(), USB_MOUSE_REPORT_LENGTH); - if (usb_status == kStatus_USB_Success) { - sendUsbMouseReportCompleted = false; + if (usb_status != kStatus_USB_Success) { + SwitchActiveUsbMouseReport(); // Switch back, as the command failed } return usb_status; } @@ -43,7 +42,6 @@ usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: - sendUsbMouseReportCompleted = true; error = kStatus_USB_Success; break; case kUSB_DeviceHidEventRecvResponse: diff --git a/right/src/usb_interfaces/usb_interface_system_keyboard.c b/right/src/usb_interfaces/usb_interface_system_keyboard.c index a051843..33c19b4 100644 --- a/right/src/usb_interfaces/usb_interface_system_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_system_keyboard.c @@ -3,7 +3,6 @@ uint32_t UsbSystemKeyboardActionCounter; static usb_system_keyboard_report_t usbSystemKeyboardReports[2]; usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport = usbSystemKeyboardReports; -static volatile bool sendUsbSystemKeyboardReportCompleted = true; usb_system_keyboard_report_t* GetInactiveUsbSystemKeyboardReport() { @@ -22,7 +21,7 @@ void ResetActiveUsbSystemKeyboardReport(void) usb_status_t UsbSystemKeyboardAction(void) { - if (!sendUsbSystemKeyboardReportCompleted) + if (((usb_device_hid_struct_t *)UsbCompositeDevice.systemKeyboardHandle)->interruptInPipeBusy) return kStatus_USB_Busy; // The previous report has not been sent yet UsbSystemKeyboardActionCounter++; @@ -30,8 +29,8 @@ usb_status_t UsbSystemKeyboardAction(void) usb_status_t usb_status = USB_DeviceHidSend( UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX, (uint8_t*)GetInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH); - if (usb_status == kStatus_USB_Success) { - sendUsbSystemKeyboardReportCompleted = false; + if (usb_status != kStatus_USB_Success) { + SwitchActiveUsbSystemKeyboardReport(); // Switch back, as the command failed } return usb_status; } @@ -43,7 +42,6 @@ usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, vo switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: - sendUsbSystemKeyboardReportCompleted = true; error = kStatus_USB_Success; break; case kUSB_DeviceHidEventRecvResponse: From a92835454d47eae4b6295f10c917cd309c8d3f29 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sun, 24 Jun 2018 18:42:39 +0200 Subject: [PATCH 13/46] Make sure the keyboard is not read if any of the endpoints are busy sending data --- right/src/usb_report_updater.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 45790aa..a7c826d 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -395,8 +395,12 @@ static uint32_t lastMouseUpdateTimeMicros; void UpdateUsbReports(void) { UsbReportUpdateCounter++; - - if (Timer_GetElapsedTimeMicros(&lastMouseUpdateTimeMicros) < 1000U * USB_BASIC_KEYBOARD_INTERRUPT_IN_INTERVAL) { + if (((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->interruptInPipeBusy || + ((usb_device_hid_struct_t *)UsbCompositeDevice.mediaKeyboardHandle)->interruptInPipeBusy || + ((usb_device_hid_struct_t *)UsbCompositeDevice.systemKeyboardHandle)->interruptInPipeBusy || + ((usb_device_hid_struct_t *)UsbCompositeDevice.mouseHandle)->interruptInPipeBusy) { + return; + } else if (Timer_GetElapsedTimeMicros(&lastMouseUpdateTimeMicros) < 1000U * USB_BASIC_KEYBOARD_INTERRUPT_IN_INTERVAL) { return; } Timer_SetCurrentTimeMicros(&lastMouseUpdateTimeMicros); From e3773fd5c09235dd23571e28214dc4199ec21c2f Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sun, 24 Jun 2018 19:47:28 +0200 Subject: [PATCH 14/46] Removed some unused code --- right/src/usb_interfaces/usb_interface_basic_keyboard.c | 6 ------ right/src/usb_interfaces/usb_interface_media_keyboard.c | 6 ------ right/src/usb_interfaces/usb_interface_mouse.c | 6 ------ right/src/usb_interfaces/usb_interface_system_keyboard.c | 6 ------ 4 files changed, 24 deletions(-) diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.c b/right/src/usb_interfaces/usb_interface_basic_keyboard.c index c3e6fdd..2bf39e8 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.c @@ -84,16 +84,10 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi usb_status_t UsbBasicKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration) { - if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) { - //return UsbBasicKeyboardAction(); - } return kStatus_USB_Error; } usb_status_t UsbBasicKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) { - if (USB_BASIC_KEYBOARD_INTERFACE_INDEX == interface) { - //return UsbBasicKeyboardAction(); - } return kStatus_USB_Error; } diff --git a/right/src/usb_interfaces/usb_interface_media_keyboard.c b/right/src/usb_interfaces/usb_interface_media_keyboard.c index b5e3cab..536c7e7 100644 --- a/right/src/usb_interfaces/usb_interface_media_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_media_keyboard.c @@ -64,16 +64,10 @@ usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, voi usb_status_t UsbMediaKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration) { - if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) { - //return UsbMediaKeyboardAction(); - } return kStatus_USB_Error; } usb_status_t UsbMediaKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) { - if (USB_MEDIA_KEYBOARD_INTERFACE_INDEX == interface) { - //return UsbMediaKeyboardAction(); - } return kStatus_USB_Error; } diff --git a/right/src/usb_interfaces/usb_interface_mouse.c b/right/src/usb_interfaces/usb_interface_mouse.c index 7b39c4f..89e9ddb 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.c +++ b/right/src/usb_interfaces/usb_interface_mouse.c @@ -64,16 +64,10 @@ usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param usb_status_t UsbMouseSetConfiguration(class_handle_t handle, uint8_t configuration) { - if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) { - //return usbMouseAction(); - } return kStatus_USB_Error; } usb_status_t UsbMouseSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) { - if (USB_MOUSE_INTERFACE_INDEX == interface) { - //return usbMouseAction(); - } return kStatus_USB_Error; } diff --git a/right/src/usb_interfaces/usb_interface_system_keyboard.c b/right/src/usb_interfaces/usb_interface_system_keyboard.c index 33c19b4..10ca8d9 100644 --- a/right/src/usb_interfaces/usb_interface_system_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_system_keyboard.c @@ -64,16 +64,10 @@ usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, vo usb_status_t UsbSystemKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration) { - if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) { - //return UsbSystemKeyboardAction(); - } return kStatus_USB_Error; } usb_status_t UsbSystemKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) { - if (USB_SYSTEM_KEYBOARD_INTERFACE_INDEX == interface) { - //return UsbSystemKeyboardAction(); - } return kStatus_USB_Error; } From a061febd0188b4d037cd92d9ff1f1320e8ae19dc Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sun, 24 Jun 2018 23:57:49 +0200 Subject: [PATCH 15/46] Merge test code --- right/src/usb_report_updater.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index a7c826d..7710b85 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -285,6 +285,8 @@ static uint8_t secondaryRoleState = SecondaryRoleState_Released; static uint8_t secondaryRoleSlotId; static uint8_t secondaryRoleKeyId; static secondary_role_t secondaryRole; +static bool simulateKeypresses = false; +static bool sendChar = false; static void updateActiveUsbReports(void) { @@ -319,6 +321,16 @@ static void updateActiveUsbReports(void) return; } + key_state_t *testKeyState = &KeyStates[SlotId_LeftKeyboardHalf][0]; + if (!testKeyState->previous && testKeyState->current && activeLayer == LayerId_Fn) { + simulateKeypresses = !simulateKeypresses; + } + + if (simulateKeypresses) { + sendChar = !sendChar; + ActiveUsbBasicKeyboardReport->scancodes[basicScancodeIndex++] = sendChar ? HID_KEYBOARD_SC_A : HID_KEYBOARD_SC_B; + } + for (uint8_t slotId=0; slotId Date: Thu, 28 Jun 2018 16:10:26 -0700 Subject: [PATCH 16/46] Use a switch statement --- .../src/usb_descriptors/usb_descriptor_hid.c | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/right/src/usb_descriptors/usb_descriptor_hid.c b/right/src/usb_descriptors/usb_descriptor_hid.c index 18c005f..4e3ba9c 100644 --- a/right/src/usb_descriptors/usb_descriptor_hid.c +++ b/right/src/usb_descriptors/usb_descriptor_hid.c @@ -12,23 +12,29 @@ usb_status_t USB_DeviceGetHidDescriptor( usb_status_t USB_DeviceGetHidReportDescriptor( usb_device_handle handle, usb_device_get_hid_report_descriptor_struct_t *hidReportDescriptor) { - if (USB_GENERIC_HID_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) { - hidReportDescriptor->buffer = UsbGenericHidReportDescriptor; - hidReportDescriptor->length = USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH; - } else if (USB_BASIC_KEYBOARD_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) { - hidReportDescriptor->buffer = UsbBasicKeyboardReportDescriptor; - hidReportDescriptor->length = USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LENGTH; - } else if (USB_MEDIA_KEYBOARD_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) { - hidReportDescriptor->buffer = UsbMediaKeyboardReportDescriptor; - hidReportDescriptor->length = USB_MEDIA_KEYBOARD_REPORT_DESCRIPTOR_LENGTH; - } else if (USB_SYSTEM_KEYBOARD_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) { - hidReportDescriptor->buffer = UsbSystemKeyboardReportDescriptor; - hidReportDescriptor->length = USB_MEDIA_KEYBOARD_REPORT_DESCRIPTOR_LENGTH; - } else if (USB_MOUSE_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) { - hidReportDescriptor->buffer = UsbMouseReportDescriptor; - hidReportDescriptor->length = USB_MOUSE_REPORT_DESCRIPTOR_LENGTH; - } else { - return kStatus_USB_InvalidRequest; + switch (hidReportDescriptor->interfaceNumber) { + case USB_GENERIC_HID_INTERFACE_INDEX: + hidReportDescriptor->buffer = UsbGenericHidReportDescriptor; + hidReportDescriptor->length = USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH; + break; + case USB_BASIC_KEYBOARD_INTERFACE_INDEX: + hidReportDescriptor->buffer = UsbBasicKeyboardReportDescriptor; + hidReportDescriptor->length = USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LENGTH; + break; + case USB_MEDIA_KEYBOARD_INTERFACE_INDEX: + hidReportDescriptor->buffer = UsbMediaKeyboardReportDescriptor; + hidReportDescriptor->length = USB_MEDIA_KEYBOARD_REPORT_DESCRIPTOR_LENGTH; + break; + case USB_SYSTEM_KEYBOARD_INTERFACE_INDEX: + hidReportDescriptor->buffer = UsbSystemKeyboardReportDescriptor; + hidReportDescriptor->length = USB_MEDIA_KEYBOARD_REPORT_DESCRIPTOR_LENGTH; + break; + case USB_MOUSE_INTERFACE_INDEX: + hidReportDescriptor->buffer = UsbMouseReportDescriptor; + hidReportDescriptor->length = USB_MOUSE_REPORT_DESCRIPTOR_LENGTH; + break; + default: + return kStatus_USB_InvalidRequest; } return kStatus_USB_Success; } From c1dc4be8c87cfe63dca3050cd9551a14cf062991 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Thu, 28 Jun 2018 16:39:41 -0700 Subject: [PATCH 17/46] Fix USB_DeviceGetHidDescriptor --- .../usb_descriptor_configuration.h | 4 ++ .../src/usb_descriptors/usb_descriptor_hid.c | 43 ++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/right/src/usb_descriptors/usb_descriptor_configuration.h b/right/src/usb_descriptors/usb_descriptor_configuration.h index 57869cd..6595f22 100644 --- a/right/src/usb_descriptors/usb_descriptor_configuration.h +++ b/right/src/usb_descriptors/usb_descriptor_configuration.h @@ -14,6 +14,10 @@ #define USB_COMPOSITE_CONFIGURATION_INDEX 1 #define USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH 141 +// Variables: + + extern uint8_t UsbConfigurationDescriptor[USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH]; + // Functions: usb_status_t USB_DeviceGetConfigurationDescriptor( diff --git a/right/src/usb_descriptors/usb_descriptor_hid.c b/right/src/usb_descriptors/usb_descriptor_hid.c index 4e3ba9c..f70dfa1 100644 --- a/right/src/usb_descriptors/usb_descriptor_hid.c +++ b/right/src/usb_descriptors/usb_descriptor_hid.c @@ -2,11 +2,52 @@ #include "usb_descriptor_hid.h" #include "usb_descriptor_mouse_report.h" #include "usb_descriptor_generic_hid_report.h" +#include "usb_descriptor_configuration.h" + +#define USB_GENERIC_HID_DESCRIPTOR_INDEX \ + (USB_DESCRIPTOR_LENGTH_CONFIGURE + USB_DESCRIPTOR_LENGTH_INTERFACE) + +#define USB_BASIC_KEYBOARD_HID_DESCRIPTOR_INDEX \ + (USB_GENERIC_HID_DESCRIPTOR_INDEX + USB_DESCRIPTOR_LENGTH_HID + \ + 2 * USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE) + +#define USB_MEDIA_KEYBOARD_HID_DESCRIPTOR_INDEX \ + (USB_BASIC_KEYBOARD_HID_DESCRIPTOR_INDEX + USB_DESCRIPTOR_LENGTH_HID + \ + USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE) + +#define USB_SYSTEM_KEYBOARD_HID_DESCRIPTOR_INDEX \ + (USB_MEDIA_KEYBOARD_HID_DESCRIPTOR_INDEX + USB_DESCRIPTOR_LENGTH_HID + \ + USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE) + +#define USB_MOUSE_HID_DESCRIPTOR_INDEX \ + (USB_SYSTEM_KEYBOARD_HID_DESCRIPTOR_INDEX + USB_DESCRIPTOR_LENGTH_HID + \ + USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE) usb_status_t USB_DeviceGetHidDescriptor( usb_device_handle handle, usb_device_get_hid_descriptor_struct_t *hidDescriptor) { - return kStatus_USB_InvalidRequest; + hidDescriptor->length = USB_DESCRIPTOR_LENGTH_HID; + + switch (hidDescriptor->interfaceNumber) { + case USB_GENERIC_HID_INTERFACE_INDEX: + hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_GENERIC_HID_DESCRIPTOR_INDEX]; + break; + case USB_BASIC_KEYBOARD_INTERFACE_INDEX: + hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_BASIC_KEYBOARD_HID_DESCRIPTOR_INDEX]; + break; + case USB_MEDIA_KEYBOARD_INTERFACE_INDEX: + hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_MEDIA_KEYBOARD_HID_DESCRIPTOR_INDEX]; + break; + case USB_SYSTEM_KEYBOARD_INTERFACE_INDEX: + hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_SYSTEM_KEYBOARD_HID_DESCRIPTOR_INDEX]; + break; + case USB_MOUSE_INTERFACE_INDEX: + hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_MOUSE_HID_DESCRIPTOR_INDEX]; + break; + default: + return kStatus_USB_InvalidRequest; + } + return kStatus_USB_Success; } usb_status_t USB_DeviceGetHidReportDescriptor( From cbd5f1b500f1ea5a3d3242abb956405fde06c75c Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Thu, 28 Jun 2018 17:23:21 -0700 Subject: [PATCH 18/46] Redefine USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH --- right/src/usb_descriptors/usb_descriptor_configuration.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/right/src/usb_descriptors/usb_descriptor_configuration.h b/right/src/usb_descriptors/usb_descriptor_configuration.h index 6595f22..d5fa96a 100644 --- a/right/src/usb_descriptors/usb_descriptor_configuration.h +++ b/right/src/usb_descriptors/usb_descriptor_configuration.h @@ -12,7 +12,9 @@ // Macros: #define USB_COMPOSITE_CONFIGURATION_INDEX 1 - #define USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH 141 + #define USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH \ + (5 * USB_DESCRIPTOR_LENGTH_INTERFACE + 5 * USB_DESCRIPTOR_LENGTH_HID + \ + 6 * USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_CONFIGURE) // Variables: From baa5e8f037b6d3710399fd1c526bfd561e36d5f6 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Fri, 29 Jun 2018 12:37:53 -0700 Subject: [PATCH 19/46] Remove redundant guard clauses --- right/src/usb_interfaces/usb_interface_basic_keyboard.c | 8 +++----- right/src/usb_interfaces/usb_interface_media_keyboard.c | 8 +++----- right/src/usb_interfaces/usb_interface_mouse.c | 8 +++----- right/src/usb_interfaces/usb_interface_system_keyboard.c | 8 +++----- 4 files changed, 12 insertions(+), 20 deletions(-) diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.c b/right/src/usb_interfaces/usb_interface_basic_keyboard.c index 2bf39e8..306b364 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.c @@ -23,15 +23,13 @@ void ResetActiveUsbBasicKeyboardReport(void) usb_status_t UsbBasicKeyboardAction(void) { - if (((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->interruptInPipeBusy) - return kStatus_USB_Busy; // The previous report has not been sent yet - - UsbBasicKeyboardActionCounter++; SwitchActiveUsbBasicKeyboardReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX, (uint8_t*)GetInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH); - if (usb_status != kStatus_USB_Success) { + if (usb_status == kStatus_USB_Success) { + UsbBasicKeyboardActionCounter++; + } else { SwitchActiveUsbBasicKeyboardReport(); // Switch back, as the command failed } return usb_status; diff --git a/right/src/usb_interfaces/usb_interface_media_keyboard.c b/right/src/usb_interfaces/usb_interface_media_keyboard.c index aa7e74e..8e32d56 100644 --- a/right/src/usb_interfaces/usb_interface_media_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_media_keyboard.c @@ -21,15 +21,13 @@ void ResetActiveUsbMediaKeyboardReport(void) usb_status_t UsbMediaKeyboardAction(void) { - if (((usb_device_hid_struct_t *)UsbCompositeDevice.mediaKeyboardHandle)->interruptInPipeBusy) - return kStatus_USB_Busy; // The previous report has not been sent yet - - UsbMediaKeyboardActionCounter++; SwitchActiveUsbMediaKeyboardReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX, (uint8_t*)GetInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH); - if (usb_status != kStatus_USB_Success) { + if (usb_status == kStatus_USB_Success) { + UsbMediaKeyboardActionCounter++; + } else { SwitchActiveUsbMediaKeyboardReport(); // Switch back, as the command failed } return usb_status; diff --git a/right/src/usb_interfaces/usb_interface_mouse.c b/right/src/usb_interfaces/usb_interface_mouse.c index 89e9ddb..91fe4d3 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.c +++ b/right/src/usb_interfaces/usb_interface_mouse.c @@ -21,15 +21,13 @@ void ResetActiveUsbMouseReport(void) usb_status_t usbMouseAction(void) { - if (((usb_device_hid_struct_t *)UsbCompositeDevice.mouseHandle)->interruptInPipeBusy) - return kStatus_USB_Busy; // The previous report has not been sent yet - - UsbMouseActionCounter++; SwitchActiveUsbMouseReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX, (uint8_t*)GetInactiveUsbMouseReport(), USB_MOUSE_REPORT_LENGTH); - if (usb_status != kStatus_USB_Success) { + if (usb_status == kStatus_USB_Success) { + UsbMouseActionCounter++; + } else { SwitchActiveUsbMouseReport(); // Switch back, as the command failed } return usb_status; diff --git a/right/src/usb_interfaces/usb_interface_system_keyboard.c b/right/src/usb_interfaces/usb_interface_system_keyboard.c index 10ca8d9..5fb1620 100644 --- a/right/src/usb_interfaces/usb_interface_system_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_system_keyboard.c @@ -21,15 +21,13 @@ void ResetActiveUsbSystemKeyboardReport(void) usb_status_t UsbSystemKeyboardAction(void) { - if (((usb_device_hid_struct_t *)UsbCompositeDevice.systemKeyboardHandle)->interruptInPipeBusy) - return kStatus_USB_Busy; // The previous report has not been sent yet - - UsbSystemKeyboardActionCounter++; SwitchActiveUsbSystemKeyboardReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX, (uint8_t*)GetInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH); - if (usb_status != kStatus_USB_Success) { + if (usb_status == kStatus_USB_Success) { + UsbSystemKeyboardActionCounter++; + } else { SwitchActiveUsbSystemKeyboardReport(); // Switch back, as the command failed } return usb_status; From 994e2f6b79ce76f12e8f17c0c6d691caab7046b5 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Fri, 29 Jun 2018 12:43:59 -0700 Subject: [PATCH 20/46] Simplify logic --- right/src/usb_interfaces/usb_interface_basic_keyboard.c | 8 +++----- right/src/usb_interfaces/usb_interface_media_keyboard.c | 8 +++----- right/src/usb_interfaces/usb_interface_mouse.c | 8 +++----- right/src/usb_interfaces/usb_interface_system_keyboard.c | 8 +++----- 4 files changed, 12 insertions(+), 20 deletions(-) diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.c b/right/src/usb_interfaces/usb_interface_basic_keyboard.c index 306b364..290959d 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.c @@ -23,14 +23,12 @@ void ResetActiveUsbBasicKeyboardReport(void) usb_status_t UsbBasicKeyboardAction(void) { - SwitchActiveUsbBasicKeyboardReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( - UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX, - (uint8_t*)GetInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH); + UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX, + (uint8_t *)ActiveUsbBasicKeyboardReport, USB_BASIC_KEYBOARD_REPORT_LENGTH); if (usb_status == kStatus_USB_Success) { UsbBasicKeyboardActionCounter++; - } else { - SwitchActiveUsbBasicKeyboardReport(); // Switch back, as the command failed + SwitchActiveUsbBasicKeyboardReport(); } return usb_status; } diff --git a/right/src/usb_interfaces/usb_interface_media_keyboard.c b/right/src/usb_interfaces/usb_interface_media_keyboard.c index 8e32d56..2fce4e9 100644 --- a/right/src/usb_interfaces/usb_interface_media_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_media_keyboard.c @@ -21,14 +21,12 @@ void ResetActiveUsbMediaKeyboardReport(void) usb_status_t UsbMediaKeyboardAction(void) { - SwitchActiveUsbMediaKeyboardReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( - UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX, - (uint8_t*)GetInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH); + UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX, + (uint8_t *)ActiveUsbMediaKeyboardReport, USB_MEDIA_KEYBOARD_REPORT_LENGTH); if (usb_status == kStatus_USB_Success) { UsbMediaKeyboardActionCounter++; - } else { - SwitchActiveUsbMediaKeyboardReport(); // Switch back, as the command failed + SwitchActiveUsbMediaKeyboardReport(); } return usb_status; } diff --git a/right/src/usb_interfaces/usb_interface_mouse.c b/right/src/usb_interfaces/usb_interface_mouse.c index 91fe4d3..34a8165 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.c +++ b/right/src/usb_interfaces/usb_interface_mouse.c @@ -21,14 +21,12 @@ void ResetActiveUsbMouseReport(void) usb_status_t usbMouseAction(void) { - SwitchActiveUsbMouseReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( - UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX, - (uint8_t*)GetInactiveUsbMouseReport(), USB_MOUSE_REPORT_LENGTH); + UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX, + (uint8_t *)ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH); if (usb_status == kStatus_USB_Success) { UsbMouseActionCounter++; - } else { - SwitchActiveUsbMouseReport(); // Switch back, as the command failed + SwitchActiveUsbMouseReport(); } return usb_status; } diff --git a/right/src/usb_interfaces/usb_interface_system_keyboard.c b/right/src/usb_interfaces/usb_interface_system_keyboard.c index 5fb1620..7d741bd 100644 --- a/right/src/usb_interfaces/usb_interface_system_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_system_keyboard.c @@ -21,14 +21,12 @@ void ResetActiveUsbSystemKeyboardReport(void) usb_status_t UsbSystemKeyboardAction(void) { - SwitchActiveUsbSystemKeyboardReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( - UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX, - (uint8_t*)GetInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH); + UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX, + (uint8_t *)ActiveUsbSystemKeyboardReport, USB_SYSTEM_KEYBOARD_REPORT_LENGTH); if (usb_status == kStatus_USB_Success) { UsbSystemKeyboardActionCounter++; - } else { - SwitchActiveUsbSystemKeyboardReport(); // Switch back, as the command failed + SwitchActiveUsbSystemKeyboardReport(); } return usb_status; } From 6eceb6ad30930848ae7ad8d4bfc5c5d2b7f68b99 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Fri, 29 Jun 2018 12:54:06 -0700 Subject: [PATCH 21/46] Default to kStatus_USB_Success --- .../usb_interfaces/usb_interface_basic_keyboard.c | 11 +++-------- right/src/usb_interfaces/usb_interface_generic_hid.c | 12 ++++-------- .../usb_interfaces/usb_interface_media_keyboard.c | 12 +++--------- right/src/usb_interfaces/usb_interface_mouse.c | 12 +++--------- .../usb_interfaces/usb_interface_system_keyboard.c | 12 +++--------- 5 files changed, 16 insertions(+), 43 deletions(-) diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.c b/right/src/usb_interfaces/usb_interface_basic_keyboard.c index 290959d..2203f1f 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.c @@ -35,16 +35,13 @@ usb_status_t UsbBasicKeyboardAction(void) usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, void *param) { - usb_status_t error = kStatus_USB_Error; + usb_status_t error = kStatus_USB_Success; switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: - error = kStatus_USB_Success; - break; case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: - error = kStatus_USB_InvalidRequest; break; case kUSB_DeviceHidEventSetReport: { usb_device_hid_report_struct_t *report = (usb_device_hid_report_struct_t*)param; @@ -70,20 +67,18 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi case kUSB_DeviceHidEventGetProtocol: case kUSB_DeviceHidEventSetIdle: case kUSB_DeviceHidEventSetProtocol: - break; default: break; } - return error; } usb_status_t UsbBasicKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration) { - return kStatus_USB_Error; + return kStatus_USB_Success; } usb_status_t UsbBasicKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) { - return kStatus_USB_Error; + return kStatus_USB_Success; } diff --git a/right/src/usb_interfaces/usb_interface_generic_hid.c b/right/src/usb_interfaces/usb_interface_generic_hid.c index 446821e..5bd4569 100644 --- a/right/src/usb_interfaces/usb_interface_generic_hid.c +++ b/right/src/usb_interfaces/usb_interface_generic_hid.c @@ -15,7 +15,7 @@ static usb_status_t UsbReceiveData(void) usb_status_t UsbGenericHidCallback(class_handle_t handle, uint32_t event, void *param) { - usb_status_t error = kStatus_USB_Error; + usb_status_t error = kStatus_USB_Success; switch (event) { case kUSB_DeviceHidEventSendResponse: @@ -28,22 +28,18 @@ usb_status_t UsbGenericHidCallback(class_handle_t handle, uint32_t event, void * GenericHidOutBuffer, USB_GENERIC_HID_OUT_BUFFER_LENGTH); UsbGenericHidActionCounter++; - return UsbReceiveData(); + error = UsbReceiveData(); break; case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventSetReport: case kUSB_DeviceHidEventRequestReportBuffer: - error = kStatus_USB_InvalidRequest; - break; case kUSB_DeviceHidEventGetIdle: case kUSB_DeviceHidEventGetProtocol: case kUSB_DeviceHidEventSetIdle: case kUSB_DeviceHidEventSetProtocol: - break; default: break; } - return error; } @@ -52,7 +48,7 @@ usb_status_t UsbGenericHidSetConfiguration(class_handle_t handle, uint8_t config if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) { return UsbReceiveData(); } - return kStatus_USB_Error; + return kStatus_USB_Success; } usb_status_t UsbGenericHidSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) @@ -60,5 +56,5 @@ usb_status_t UsbGenericHidSetInterface(class_handle_t handle, uint8_t interface, if (USB_GENERIC_HID_INTERFACE_INDEX == interface) { return UsbReceiveData(); } - return kStatus_USB_Error; + return kStatus_USB_Success; } diff --git a/right/src/usb_interfaces/usb_interface_media_keyboard.c b/right/src/usb_interfaces/usb_interface_media_keyboard.c index 2fce4e9..9ea8eea 100644 --- a/right/src/usb_interfaces/usb_interface_media_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_media_keyboard.c @@ -33,37 +33,31 @@ usb_status_t UsbMediaKeyboardAction(void) usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, void *param) { - usb_status_t error = kStatus_USB_Error; + usb_status_t error = kStatus_USB_Success; switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: - error = kStatus_USB_Success; - break; case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventSetReport: case kUSB_DeviceHidEventRequestReportBuffer: - error = kStatus_USB_InvalidRequest; - break; case kUSB_DeviceHidEventGetIdle: case kUSB_DeviceHidEventGetProtocol: case kUSB_DeviceHidEventSetIdle: case kUSB_DeviceHidEventSetProtocol: - break; default: break; } - return error; } usb_status_t UsbMediaKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration) { - return kStatus_USB_Error; + return kStatus_USB_Success; } usb_status_t UsbMediaKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) { - return kStatus_USB_Error; + return kStatus_USB_Success; } diff --git a/right/src/usb_interfaces/usb_interface_mouse.c b/right/src/usb_interfaces/usb_interface_mouse.c index 34a8165..60861cd 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.c +++ b/right/src/usb_interfaces/usb_interface_mouse.c @@ -33,37 +33,31 @@ usb_status_t usbMouseAction(void) usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param) { - usb_status_t error = kStatus_USB_Error; + usb_status_t error = kStatus_USB_Success; switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: - error = kStatus_USB_Success; - break; case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventSetReport: case kUSB_DeviceHidEventRequestReportBuffer: - error = kStatus_USB_InvalidRequest; - break; case kUSB_DeviceHidEventGetIdle: case kUSB_DeviceHidEventGetProtocol: case kUSB_DeviceHidEventSetIdle: case kUSB_DeviceHidEventSetProtocol: - break; default: break; } - return error; } usb_status_t UsbMouseSetConfiguration(class_handle_t handle, uint8_t configuration) { - return kStatus_USB_Error; + return kStatus_USB_Success; } usb_status_t UsbMouseSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) { - return kStatus_USB_Error; + return kStatus_USB_Success; } diff --git a/right/src/usb_interfaces/usb_interface_system_keyboard.c b/right/src/usb_interfaces/usb_interface_system_keyboard.c index 7d741bd..747290b 100644 --- a/right/src/usb_interfaces/usb_interface_system_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_system_keyboard.c @@ -33,37 +33,31 @@ usb_status_t UsbSystemKeyboardAction(void) usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, void *param) { - usb_status_t error = kStatus_USB_Error; + usb_status_t error = kStatus_USB_Success; switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: - error = kStatus_USB_Success; - break; case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventSetReport: case kUSB_DeviceHidEventRequestReportBuffer: - error = kStatus_USB_InvalidRequest; - break; case kUSB_DeviceHidEventGetIdle: case kUSB_DeviceHidEventGetProtocol: case kUSB_DeviceHidEventSetIdle: case kUSB_DeviceHidEventSetProtocol: - break; default: break; } - return error; } usb_status_t UsbSystemKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration) { - return kStatus_USB_Error; + return kStatus_USB_Success; } usb_status_t UsbSystemKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) { - return kStatus_USB_Error; + return kStatus_USB_Success; } From 4214f3e0b616d0ff60c6f05d8672d84e0e00255f Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Wed, 27 Jun 2018 22:57:07 -0700 Subject: [PATCH 22/46] Use a semaphore to control the rate at which reports are updated --- .../usb_interface_basic_keyboard.c | 3 ++ .../usb_interface_media_keyboard.c | 3 ++ .../src/usb_interfaces/usb_interface_mouse.c | 3 ++ .../usb_interface_system_keyboard.c | 3 ++ right/src/usb_report_updater.c | 36 ++++++++++++------- right/src/usb_report_updater.h | 1 + 6 files changed, 36 insertions(+), 13 deletions(-) diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.c b/right/src/usb_interfaces/usb_interface_basic_keyboard.c index 2203f1f..77146dd 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.c @@ -1,5 +1,6 @@ #include "led_display.h" #include "usb_composite_device.h" +#include "usb_report_updater.h" static usb_basic_keyboard_report_t usbBasicKeyboardReports[2]; uint32_t UsbBasicKeyboardActionCounter; @@ -40,6 +41,8 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: + UsbReportUpdateSemaphore &= ~(1 << USB_BASIC_KEYBOARD_INTERFACE_INDEX); + break; case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: break; diff --git a/right/src/usb_interfaces/usb_interface_media_keyboard.c b/right/src/usb_interfaces/usb_interface_media_keyboard.c index 9ea8eea..186e230 100644 --- a/right/src/usb_interfaces/usb_interface_media_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_media_keyboard.c @@ -1,4 +1,5 @@ #include "usb_composite_device.h" +#include "usb_report_updater.h" uint32_t UsbMediaKeyboardActionCounter; static usb_media_keyboard_report_t usbMediaKeyboardReports[2]; @@ -38,6 +39,8 @@ usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, voi switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: + UsbReportUpdateSemaphore &= ~(1 << USB_MEDIA_KEYBOARD_INTERFACE_INDEX); + break; case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventSetReport: diff --git a/right/src/usb_interfaces/usb_interface_mouse.c b/right/src/usb_interfaces/usb_interface_mouse.c index 60861cd..7f18f35 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.c +++ b/right/src/usb_interfaces/usb_interface_mouse.c @@ -1,4 +1,5 @@ #include "usb_composite_device.h" +#include "usb_report_updater.h" uint32_t UsbMouseActionCounter; static usb_mouse_report_t usbMouseReports[2]; @@ -38,6 +39,8 @@ usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: + UsbReportUpdateSemaphore &= ~(1 << USB_MOUSE_INTERFACE_INDEX); + break; case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventSetReport: diff --git a/right/src/usb_interfaces/usb_interface_system_keyboard.c b/right/src/usb_interfaces/usb_interface_system_keyboard.c index 747290b..2304b56 100644 --- a/right/src/usb_interfaces/usb_interface_system_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_system_keyboard.c @@ -1,4 +1,5 @@ #include "usb_composite_device.h" +#include "usb_report_updater.h" uint32_t UsbSystemKeyboardActionCounter; static usb_system_keyboard_report_t usbSystemKeyboardReports[2]; @@ -38,6 +39,8 @@ usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, vo switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: + UsbReportUpdateSemaphore &= ~(1 << USB_SYSTEM_KEYBOARD_INTERFACE_INDEX); + break; case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventSetReport: diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 642ca2e..5daa5de 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -25,6 +25,8 @@ static uint16_t DoubleTapSwitchLayerReleaseTimeout = 100; static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT]; +volatile uint8_t UsbReportUpdateSemaphore = 0; + mouse_kinetic_state_t MouseMoveState = { .isScroll = false, .upState = SerializedMouseAction_MoveUp, @@ -402,20 +404,16 @@ static void updateActiveUsbReports(void) } uint32_t UsbReportUpdateCounter; -static uint32_t lastMouseUpdateTimeMicros; void UpdateUsbReports(void) { - UsbReportUpdateCounter++; - if (((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->interruptInPipeBusy || - ((usb_device_hid_struct_t *)UsbCompositeDevice.mediaKeyboardHandle)->interruptInPipeBusy || - ((usb_device_hid_struct_t *)UsbCompositeDevice.systemKeyboardHandle)->interruptInPipeBusy || - ((usb_device_hid_struct_t *)UsbCompositeDevice.mouseHandle)->interruptInPipeBusy) { - return; - } else if (Timer_GetElapsedTimeMicros(&lastMouseUpdateTimeMicros) < 1000U * USB_BASIC_KEYBOARD_INTERRUPT_IN_INTERVAL) { + usb_status_t status; + + if (UsbReportUpdateSemaphore) { return; } - Timer_SetCurrentTimeMicros(&lastMouseUpdateTimeMicros); + + UsbReportUpdateCounter++; ResetActiveUsbBasicKeyboardReport(); ResetActiveUsbMediaKeyboardReport(); @@ -426,24 +424,36 @@ void UpdateUsbReports(void) bool HasUsbBasicKeyboardReportChanged = memcmp(ActiveUsbBasicKeyboardReport, GetInactiveUsbBasicKeyboardReport(), sizeof(usb_basic_keyboard_report_t)) != 0; if (HasUsbBasicKeyboardReportChanged) { - UsbBasicKeyboardAction(); + UsbReportUpdateSemaphore |= 1 << USB_BASIC_KEYBOARD_INTERFACE_INDEX; + do { + status = UsbBasicKeyboardAction(); + } while (status != kStatus_USB_Success); } bool HasUsbMediaKeyboardReportChanged = memcmp(ActiveUsbMediaKeyboardReport, GetInactiveUsbMediaKeyboardReport(), sizeof(usb_media_keyboard_report_t)) != 0; if (HasUsbMediaKeyboardReportChanged) { - UsbMediaKeyboardAction(); + UsbReportUpdateSemaphore |= 1 << USB_MEDIA_KEYBOARD_INTERFACE_INDEX; + do { + status = UsbMediaKeyboardAction(); + } while (status != kStatus_USB_Success); } bool HasUsbSystemKeyboardReportChanged = memcmp(ActiveUsbSystemKeyboardReport, GetInactiveUsbSystemKeyboardReport(), sizeof(usb_system_keyboard_report_t)) != 0; if (HasUsbSystemKeyboardReportChanged) { - UsbSystemKeyboardAction(); + UsbReportUpdateSemaphore |= 1 << USB_SYSTEM_KEYBOARD_INTERFACE_INDEX; + do { + status = UsbSystemKeyboardAction(); + } while (status != kStatus_USB_Success); } // Send out the mouse position and wheel values continuously if the report is not zeros, but only send the mouse button states when they change. bool HasUsbMouseReportChanged = memcmp(ActiveUsbMouseReport, GetInactiveUsbMouseReport(), sizeof(usb_mouse_report_t)) != 0; if (HasUsbMouseReportChanged || ActiveUsbMouseReport->x || ActiveUsbMouseReport->y || ActiveUsbMouseReport->wheelX || ActiveUsbMouseReport->wheelY) { - usbMouseAction(); + UsbReportUpdateSemaphore |= 1 << USB_MOUSE_INTERFACE_INDEX; + do { + status = usbMouseAction(); + } while (status != kStatus_USB_Success); } if (IsHostSleeping && (previousLayer != LayerId_Base || HasUsbBasicKeyboardReportChanged || HasUsbMediaKeyboardReportChanged || HasUsbSystemKeyboardReportChanged || HasUsbMouseReportChanged)) { diff --git a/right/src/usb_report_updater.h b/right/src/usb_report_updater.h index 1a0f28b..33589f8 100644 --- a/right/src/usb_report_updater.h +++ b/right/src/usb_report_updater.h @@ -70,6 +70,7 @@ extern mouse_kinetic_state_t MouseMoveState; extern mouse_kinetic_state_t MouseScrollState; extern uint32_t UsbReportUpdateCounter; + extern volatile uint8_t UsbReportUpdateSemaphore; // Functions: From bd97bba4b544af54d14a7ef58c91080368403997 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Fri, 29 Jun 2018 13:19:49 -0700 Subject: [PATCH 23/46] Wake up the host before attempting to send reports --- right/src/usb_report_updater.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 5daa5de..4594a72 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -423,6 +423,14 @@ void UpdateUsbReports(void) updateActiveUsbReports(); bool HasUsbBasicKeyboardReportChanged = memcmp(ActiveUsbBasicKeyboardReport, GetInactiveUsbBasicKeyboardReport(), sizeof(usb_basic_keyboard_report_t)) != 0; + bool HasUsbMediaKeyboardReportChanged = memcmp(ActiveUsbMediaKeyboardReport, GetInactiveUsbMediaKeyboardReport(), sizeof(usb_media_keyboard_report_t)) != 0; + bool HasUsbSystemKeyboardReportChanged = memcmp(ActiveUsbSystemKeyboardReport, GetInactiveUsbSystemKeyboardReport(), sizeof(usb_system_keyboard_report_t)) != 0; + bool HasUsbMouseReportChanged = memcmp(ActiveUsbMouseReport, GetInactiveUsbMouseReport(), sizeof(usb_mouse_report_t)) != 0; + + if (IsHostSleeping && (previousLayer != LayerId_Base || HasUsbBasicKeyboardReportChanged || HasUsbMediaKeyboardReportChanged || HasUsbSystemKeyboardReportChanged || HasUsbMouseReportChanged)) { + WakeUpHost(true); // Wake up the host if any key is pressed and the computer is sleeping. + } + if (HasUsbBasicKeyboardReportChanged) { UsbReportUpdateSemaphore |= 1 << USB_BASIC_KEYBOARD_INTERFACE_INDEX; do { @@ -430,7 +438,6 @@ void UpdateUsbReports(void) } while (status != kStatus_USB_Success); } - bool HasUsbMediaKeyboardReportChanged = memcmp(ActiveUsbMediaKeyboardReport, GetInactiveUsbMediaKeyboardReport(), sizeof(usb_media_keyboard_report_t)) != 0; if (HasUsbMediaKeyboardReportChanged) { UsbReportUpdateSemaphore |= 1 << USB_MEDIA_KEYBOARD_INTERFACE_INDEX; do { @@ -438,7 +445,6 @@ void UpdateUsbReports(void) } while (status != kStatus_USB_Success); } - bool HasUsbSystemKeyboardReportChanged = memcmp(ActiveUsbSystemKeyboardReport, GetInactiveUsbSystemKeyboardReport(), sizeof(usb_system_keyboard_report_t)) != 0; if (HasUsbSystemKeyboardReportChanged) { UsbReportUpdateSemaphore |= 1 << USB_SYSTEM_KEYBOARD_INTERFACE_INDEX; do { @@ -447,7 +453,6 @@ void UpdateUsbReports(void) } // Send out the mouse position and wheel values continuously if the report is not zeros, but only send the mouse button states when they change. - bool HasUsbMouseReportChanged = memcmp(ActiveUsbMouseReport, GetInactiveUsbMouseReport(), sizeof(usb_mouse_report_t)) != 0; if (HasUsbMouseReportChanged || ActiveUsbMouseReport->x || ActiveUsbMouseReport->y || ActiveUsbMouseReport->wheelX || ActiveUsbMouseReport->wheelY) { UsbReportUpdateSemaphore |= 1 << USB_MOUSE_INTERFACE_INDEX; @@ -455,8 +460,4 @@ void UpdateUsbReports(void) status = usbMouseAction(); } while (status != kStatus_USB_Success); } - - if (IsHostSleeping && (previousLayer != LayerId_Base || HasUsbBasicKeyboardReportChanged || HasUsbMediaKeyboardReportChanged || HasUsbSystemKeyboardReportChanged || HasUsbMouseReportChanged)) { - WakeUpHost(true); // Wake up the host if any key is pressed and the computer is sleeping. - } } From 39819e6058fa40da9b8a0f50385bbf163b40801e Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Fri, 29 Jun 2018 13:29:40 -0700 Subject: [PATCH 24/46] Type Backspace instead of b --- right/src/usb_report_updater.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 4594a72..97de319 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -330,7 +330,7 @@ static void updateActiveUsbReports(void) if (simulateKeypresses) { sendChar = !sendChar; - ActiveUsbBasicKeyboardReport->scancodes[basicScancodeIndex++] = sendChar ? HID_KEYBOARD_SC_A : HID_KEYBOARD_SC_B; + ActiveUsbBasicKeyboardReport->scancodes[basicScancodeIndex++] = sendChar ? HID_KEYBOARD_SC_A : HID_KEYBOARD_SC_BACKSPACE; } for (uint8_t slotId=0; slotId Date: Fri, 29 Jun 2018 17:23:15 -0700 Subject: [PATCH 25/46] Rename usbMouseAction to UsbMouseAction --- right/src/usb_interfaces/usb_interface_mouse.c | 2 +- right/src/usb_interfaces/usb_interface_mouse.h | 2 +- right/src/usb_report_updater.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/right/src/usb_interfaces/usb_interface_mouse.c b/right/src/usb_interfaces/usb_interface_mouse.c index 7f18f35..15fd1fe 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.c +++ b/right/src/usb_interfaces/usb_interface_mouse.c @@ -20,7 +20,7 @@ void ResetActiveUsbMouseReport(void) bzero(ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH); } -usb_status_t usbMouseAction(void) +usb_status_t UsbMouseAction(void) { usb_status_t usb_status = USB_DeviceHidSend( UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX, diff --git a/right/src/usb_interfaces/usb_interface_mouse.h b/right/src/usb_interfaces/usb_interface_mouse.h index b2258a1..3c3da99 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.h +++ b/right/src/usb_interfaces/usb_interface_mouse.h @@ -42,6 +42,6 @@ void ResetActiveUsbMouseReport(void); usb_mouse_report_t* GetInactiveUsbMouseReport(void); - usb_status_t usbMouseAction(void); + usb_status_t UsbMouseAction(void); #endif diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 97de319..fa23530 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -457,7 +457,7 @@ void UpdateUsbReports(void) ActiveUsbMouseReport->wheelX || ActiveUsbMouseReport->wheelY) { UsbReportUpdateSemaphore |= 1 << USB_MOUSE_INTERFACE_INDEX; do { - status = usbMouseAction(); + status = UsbMouseAction(); } while (status != kStatus_USB_Success); } } From b93f2115025ff248cfb3666af2cbd4f421c31417 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Fri, 29 Jun 2018 22:44:42 -0700 Subject: [PATCH 26/46] Don't retry sending a report if it fails --- right/src/usb_report_updater.c | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index fa23530..c82c46f 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -407,8 +407,6 @@ uint32_t UsbReportUpdateCounter; void UpdateUsbReports(void) { - usb_status_t status; - if (UsbReportUpdateSemaphore) { return; } @@ -433,31 +431,23 @@ void UpdateUsbReports(void) if (HasUsbBasicKeyboardReportChanged) { UsbReportUpdateSemaphore |= 1 << USB_BASIC_KEYBOARD_INTERFACE_INDEX; - do { - status = UsbBasicKeyboardAction(); - } while (status != kStatus_USB_Success); + UsbBasicKeyboardAction(); } if (HasUsbMediaKeyboardReportChanged) { UsbReportUpdateSemaphore |= 1 << USB_MEDIA_KEYBOARD_INTERFACE_INDEX; - do { - status = UsbMediaKeyboardAction(); - } while (status != kStatus_USB_Success); + UsbMediaKeyboardAction(); } if (HasUsbSystemKeyboardReportChanged) { UsbReportUpdateSemaphore |= 1 << USB_SYSTEM_KEYBOARD_INTERFACE_INDEX; - do { - status = UsbSystemKeyboardAction(); - } while (status != kStatus_USB_Success); + UsbSystemKeyboardAction(); } // Send out the mouse position and wheel values continuously if the report is not zeros, but only send the mouse button states when they change. if (HasUsbMouseReportChanged || ActiveUsbMouseReport->x || ActiveUsbMouseReport->y || ActiveUsbMouseReport->wheelX || ActiveUsbMouseReport->wheelY) { UsbReportUpdateSemaphore |= 1 << USB_MOUSE_INTERFACE_INDEX; - do { - status = UsbMouseAction(); - } while (status != kStatus_USB_Success); + UsbMouseAction(); } } From 8f6251bc4dbbdf10819c40812c251deec58de718 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Fri, 29 Jun 2018 22:51:16 -0700 Subject: [PATCH 27/46] Only set the semaphore if the report is successfully requested --- right/src/usb_report_updater.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index c82c46f..efd0600 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -407,6 +407,8 @@ uint32_t UsbReportUpdateCounter; void UpdateUsbReports(void) { + usb_status_t status; + if (UsbReportUpdateSemaphore) { return; } @@ -430,24 +432,32 @@ void UpdateUsbReports(void) } if (HasUsbBasicKeyboardReportChanged) { - UsbReportUpdateSemaphore |= 1 << USB_BASIC_KEYBOARD_INTERFACE_INDEX; - UsbBasicKeyboardAction(); + status = UsbBasicKeyboardAction(); + if (status == kStatus_USB_Success) { + UsbReportUpdateSemaphore |= 1 << USB_BASIC_KEYBOARD_INTERFACE_INDEX; + } } if (HasUsbMediaKeyboardReportChanged) { - UsbReportUpdateSemaphore |= 1 << USB_MEDIA_KEYBOARD_INTERFACE_INDEX; - UsbMediaKeyboardAction(); + status = UsbMediaKeyboardAction(); + if (status == kStatus_USB_Success) { + UsbReportUpdateSemaphore |= 1 << USB_MEDIA_KEYBOARD_INTERFACE_INDEX; + } } if (HasUsbSystemKeyboardReportChanged) { - UsbReportUpdateSemaphore |= 1 << USB_SYSTEM_KEYBOARD_INTERFACE_INDEX; - UsbSystemKeyboardAction(); + status = UsbSystemKeyboardAction(); + if (status == kStatus_USB_Success) { + UsbReportUpdateSemaphore |= 1 << USB_SYSTEM_KEYBOARD_INTERFACE_INDEX; + } } // Send out the mouse position and wheel values continuously if the report is not zeros, but only send the mouse button states when they change. if (HasUsbMouseReportChanged || ActiveUsbMouseReport->x || ActiveUsbMouseReport->y || ActiveUsbMouseReport->wheelX || ActiveUsbMouseReport->wheelY) { - UsbReportUpdateSemaphore |= 1 << USB_MOUSE_INTERFACE_INDEX; - UsbMouseAction(); + status = UsbMouseAction(); + if (status == kStatus_USB_Success) { + UsbReportUpdateSemaphore |= 1 << USB_MOUSE_INTERFACE_INDEX; + } } } From d3dfc9bd2c00a0f2612c8bb33a3cc8587855b1e6 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Fri, 29 Jun 2018 22:53:27 -0700 Subject: [PATCH 28/46] Revert "Simplify logic" This reverts commit 994e2f6b79ce76f12e8f17c0c6d691caab7046b5. --- right/src/usb_interfaces/usb_interface_basic_keyboard.c | 8 +++++--- right/src/usb_interfaces/usb_interface_media_keyboard.c | 8 +++++--- right/src/usb_interfaces/usb_interface_mouse.c | 8 +++++--- right/src/usb_interfaces/usb_interface_system_keyboard.c | 8 +++++--- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.c b/right/src/usb_interfaces/usb_interface_basic_keyboard.c index 77146dd..df6fecb 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.c @@ -24,12 +24,14 @@ void ResetActiveUsbBasicKeyboardReport(void) usb_status_t UsbBasicKeyboardAction(void) { + SwitchActiveUsbBasicKeyboardReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( - UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX, - (uint8_t *)ActiveUsbBasicKeyboardReport, USB_BASIC_KEYBOARD_REPORT_LENGTH); + UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX, + (uint8_t*)GetInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH); if (usb_status == kStatus_USB_Success) { UsbBasicKeyboardActionCounter++; - SwitchActiveUsbBasicKeyboardReport(); + } else { + SwitchActiveUsbBasicKeyboardReport(); // Switch back, as the command failed } return usb_status; } diff --git a/right/src/usb_interfaces/usb_interface_media_keyboard.c b/right/src/usb_interfaces/usb_interface_media_keyboard.c index 186e230..d155f36 100644 --- a/right/src/usb_interfaces/usb_interface_media_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_media_keyboard.c @@ -22,12 +22,14 @@ void ResetActiveUsbMediaKeyboardReport(void) usb_status_t UsbMediaKeyboardAction(void) { + SwitchActiveUsbMediaKeyboardReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( - UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX, - (uint8_t *)ActiveUsbMediaKeyboardReport, USB_MEDIA_KEYBOARD_REPORT_LENGTH); + UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX, + (uint8_t*)GetInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH); if (usb_status == kStatus_USB_Success) { UsbMediaKeyboardActionCounter++; - SwitchActiveUsbMediaKeyboardReport(); + } else { + SwitchActiveUsbMediaKeyboardReport(); // Switch back, as the command failed } return usb_status; } diff --git a/right/src/usb_interfaces/usb_interface_mouse.c b/right/src/usb_interfaces/usb_interface_mouse.c index 15fd1fe..ba77d84 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.c +++ b/right/src/usb_interfaces/usb_interface_mouse.c @@ -22,12 +22,14 @@ void ResetActiveUsbMouseReport(void) usb_status_t UsbMouseAction(void) { + SwitchActiveUsbMouseReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( - UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX, - (uint8_t *)ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH); + UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX, + (uint8_t*)GetInactiveUsbMouseReport(), USB_MOUSE_REPORT_LENGTH); if (usb_status == kStatus_USB_Success) { UsbMouseActionCounter++; - SwitchActiveUsbMouseReport(); + } else { + SwitchActiveUsbMouseReport(); // Switch back, as the command failed } return usb_status; } diff --git a/right/src/usb_interfaces/usb_interface_system_keyboard.c b/right/src/usb_interfaces/usb_interface_system_keyboard.c index 2304b56..3d10762 100644 --- a/right/src/usb_interfaces/usb_interface_system_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_system_keyboard.c @@ -22,12 +22,14 @@ void ResetActiveUsbSystemKeyboardReport(void) usb_status_t UsbSystemKeyboardAction(void) { + SwitchActiveUsbSystemKeyboardReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( - UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX, - (uint8_t *)ActiveUsbSystemKeyboardReport, USB_SYSTEM_KEYBOARD_REPORT_LENGTH); + UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX, + (uint8_t*)GetInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH); if (usb_status == kStatus_USB_Success) { UsbSystemKeyboardActionCounter++; - SwitchActiveUsbSystemKeyboardReport(); + } else { + SwitchActiveUsbSystemKeyboardReport(); // Switch back, as the command failed } return usb_status; } From e5afa33b79c4cbd3bb713f34b17410939819c4dd Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Fri, 29 Jun 2018 23:06:31 -0700 Subject: [PATCH 29/46] Allow scanning to continue if the host is asleep --- right/src/usb_report_updater.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index efd0600..87f78ca 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -409,7 +409,7 @@ void UpdateUsbReports(void) { usb_status_t status; - if (UsbReportUpdateSemaphore) { + if (UsbReportUpdateSemaphore && !IsHostSleeping) { return; } From 217259ba63dae31896a17ee7837b55a64ae4dd85 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 30 Jun 2018 16:36:52 +0200 Subject: [PATCH 30/46] Cancel the ongoing transfer if it is still in progress --- right/src/usb_interfaces/usb_interface_basic_keyboard.c | 8 ++++++-- right/src/usb_report_updater.c | 8 ++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.c b/right/src/usb_interfaces/usb_interface_basic_keyboard.c index 2bf39e8..058ccd7 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.c @@ -23,8 +23,12 @@ void ResetActiveUsbBasicKeyboardReport(void) usb_status_t UsbBasicKeyboardAction(void) { - if (((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->interruptInPipeBusy) - return kStatus_USB_Busy; // The previous report has not been sent yet + if (((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->interruptInPipeBusy) { + ((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->interruptInPipeBusy = 0; + return USB_DeviceCancel(((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->handle, + (USB_BASIC_KEYBOARD_ENDPOINT_INDEX & USB_ENDPOINT_NUMBER_MASK) | + USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_IN); + } UsbBasicKeyboardActionCounter++; SwitchActiveUsbBasicKeyboardReport(); // Switch the active report diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 7710b85..877f235 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -402,20 +402,20 @@ static void updateActiveUsbReports(void) } uint32_t UsbReportUpdateCounter; -static uint32_t lastMouseUpdateTimeMicros; +static uint32_t lastMouseUpdateTime; void UpdateUsbReports(void) { UsbReportUpdateCounter++; - if (((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->interruptInPipeBusy || + /*if (((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->interruptInPipeBusy || ((usb_device_hid_struct_t *)UsbCompositeDevice.mediaKeyboardHandle)->interruptInPipeBusy || ((usb_device_hid_struct_t *)UsbCompositeDevice.systemKeyboardHandle)->interruptInPipeBusy || ((usb_device_hid_struct_t *)UsbCompositeDevice.mouseHandle)->interruptInPipeBusy) { return; - } else if (Timer_GetElapsedTimeMicros(&lastMouseUpdateTimeMicros) < 1000U * USB_BASIC_KEYBOARD_INTERRUPT_IN_INTERVAL) { + } else */if (Timer_GetElapsedTime(&lastMouseUpdateTime) < USB_BASIC_KEYBOARD_INTERRUPT_IN_INTERVAL) { return; } - Timer_SetCurrentTimeMicros(&lastMouseUpdateTimeMicros); + Timer_SetCurrentTime(&lastMouseUpdateTime); ResetActiveUsbBasicKeyboardReport(); ResetActiveUsbMediaKeyboardReport(); From 9938f14d20d6e098538643be304dc4ade1990420 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 30 Jun 2018 16:43:43 +0200 Subject: [PATCH 31/46] Set the USB interrupt priority to the maximum possible --- right/src/init_peripherals.c | 7 ++++--- right/src/usb_composite_device.h | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/right/src/init_peripherals.c b/right/src/init_peripherals.c index e45afc7..506e223 100644 --- a/right/src/init_peripherals.c +++ b/right/src/init_peripherals.c @@ -16,6 +16,7 @@ #include "usb_api.h" #include "slave_scheduler.h" #include "bootloader/wormhole.h" +#include "usb_composite_device.h" bool IsBusPalOn; volatile uint32_t I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_NORMAL_BAUD_RATE; @@ -63,13 +64,13 @@ static void initBusPalState(void) { static void initInterruptPriorities(void) { - NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1); - NVIC_SetPriority(I2C_EEPROM_BUS_IRQ_ID, 0); + NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 2); + NVIC_SetPriority(I2C_EEPROM_BUS_IRQ_ID, 1); NVIC_SetPriority(PIT_TIMER_IRQ_ID, 3); NVIC_SetPriority(PIT_KEY_SCANNER_IRQ_ID, 4); NVIC_SetPriority(PIT_KEY_DEBOUNCER_IRQ_ID, 4); NVIC_SetPriority(I2C_MAIN_BUS_IRQ_ID, 4); - NVIC_SetPriority(USB_IRQ_ID, 4); + NVIC_SetPriority(USB_IRQ_ID, USB_DEVICE_INTERRUPT_PRIORITY); } static void delay(void) diff --git a/right/src/usb_composite_device.h b/right/src/usb_composite_device.h index 7c35485..d2a8a31 100644 --- a/right/src/usb_composite_device.h +++ b/right/src/usb_composite_device.h @@ -10,7 +10,7 @@ // Macros: #define CONTROLLER_ID kUSB_ControllerKhci0 - #define USB_DEVICE_INTERRUPT_PRIORITY 3 + #define USB_DEVICE_INTERRUPT_PRIORITY 0 // Typedefs: From 11a8ffbaf58342d1f9599178997f5b2f3ad75dd3 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 30 Jun 2018 16:48:25 +0200 Subject: [PATCH 32/46] Make sure the composite device is attached before setting the kStatus_USB_Success flag --- right/src/usb_interfaces/usb_interface_basic_keyboard.c | 4 +++- right/src/usb_interfaces/usb_interface_generic_hid.c | 4 ++++ right/src/usb_interfaces/usb_interface_media_keyboard.c | 4 +++- right/src/usb_interfaces/usb_interface_mouse.c | 4 +++- right/src/usb_interfaces/usb_interface_system_keyboard.c | 4 +++- 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.c b/right/src/usb_interfaces/usb_interface_basic_keyboard.c index 058ccd7..a8431f3 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.c @@ -48,7 +48,9 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: - error = kStatus_USB_Success; + if (UsbCompositeDevice.attach) { + error = kStatus_USB_Success; + } break; case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: diff --git a/right/src/usb_interfaces/usb_interface_generic_hid.c b/right/src/usb_interfaces/usb_interface_generic_hid.c index 446821e..1fcfe51 100644 --- a/right/src/usb_interfaces/usb_interface_generic_hid.c +++ b/right/src/usb_interfaces/usb_interface_generic_hid.c @@ -18,7 +18,11 @@ usb_status_t UsbGenericHidCallback(class_handle_t handle, uint32_t event, void * usb_status_t error = kStatus_USB_Error; switch (event) { + // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: + if (UsbCompositeDevice.attach) { + error = kStatus_USB_Success; + } break; case kUSB_DeviceHidEventRecvResponse: UsbProtocolHandler(); diff --git a/right/src/usb_interfaces/usb_interface_media_keyboard.c b/right/src/usb_interfaces/usb_interface_media_keyboard.c index aa7e74e..b286f99 100644 --- a/right/src/usb_interfaces/usb_interface_media_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_media_keyboard.c @@ -42,7 +42,9 @@ usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, voi switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: - error = kStatus_USB_Success; + if (UsbCompositeDevice.attach) { + error = kStatus_USB_Success; + } break; case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: diff --git a/right/src/usb_interfaces/usb_interface_mouse.c b/right/src/usb_interfaces/usb_interface_mouse.c index 89e9ddb..200899b 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.c +++ b/right/src/usb_interfaces/usb_interface_mouse.c @@ -42,7 +42,9 @@ usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: - error = kStatus_USB_Success; + if (UsbCompositeDevice.attach) { + error = kStatus_USB_Success; + } break; case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: diff --git a/right/src/usb_interfaces/usb_interface_system_keyboard.c b/right/src/usb_interfaces/usb_interface_system_keyboard.c index 10ca8d9..fd19699 100644 --- a/right/src/usb_interfaces/usb_interface_system_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_system_keyboard.c @@ -42,7 +42,9 @@ usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, vo switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: - error = kStatus_USB_Success; + if (UsbCompositeDevice.attach) { + error = kStatus_USB_Success; + } break; case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: From b9b5eb2c76c5aa8eacb3831df547fb7e50f98184 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 30 Jun 2018 16:52:39 +0200 Subject: [PATCH 33/46] Make sure the device is attached before sending the report --- right/src/usb_interfaces/usb_interface_basic_keyboard.c | 3 +++ right/src/usb_interfaces/usb_interface_generic_hid.c | 3 +++ right/src/usb_interfaces/usb_interface_media_keyboard.c | 3 +++ right/src/usb_interfaces/usb_interface_mouse.c | 3 +++ right/src/usb_interfaces/usb_interface_system_keyboard.c | 3 +++ 5 files changed, 15 insertions(+) diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.c b/right/src/usb_interfaces/usb_interface_basic_keyboard.c index a8431f3..05c2d61 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.c @@ -23,6 +23,9 @@ void ResetActiveUsbBasicKeyboardReport(void) usb_status_t UsbBasicKeyboardAction(void) { + if (!UsbCompositeDevice.attach) + return kStatus_USB_Error; // The device is not attached + if (((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->interruptInPipeBusy) { ((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->interruptInPipeBusy = 0; return USB_DeviceCancel(((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->handle, diff --git a/right/src/usb_interfaces/usb_interface_generic_hid.c b/right/src/usb_interfaces/usb_interface_generic_hid.c index 1fcfe51..38e0f05 100644 --- a/right/src/usb_interfaces/usb_interface_generic_hid.c +++ b/right/src/usb_interfaces/usb_interface_generic_hid.c @@ -7,6 +7,9 @@ uint8_t GenericHidOutBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH]; static usb_status_t UsbReceiveData(void) { + if (!UsbCompositeDevice.attach) + return kStatus_USB_Error; // The device is not attached + return USB_DeviceHidRecv(UsbCompositeDevice.genericHidHandle, USB_GENERIC_HID_ENDPOINT_OUT_INDEX, GenericHidInBuffer, diff --git a/right/src/usb_interfaces/usb_interface_media_keyboard.c b/right/src/usb_interfaces/usb_interface_media_keyboard.c index b286f99..bd6eb04 100644 --- a/right/src/usb_interfaces/usb_interface_media_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_media_keyboard.c @@ -21,6 +21,9 @@ void ResetActiveUsbMediaKeyboardReport(void) usb_status_t UsbMediaKeyboardAction(void) { + if (!UsbCompositeDevice.attach) + return kStatus_USB_Error; // The device is not attached + if (((usb_device_hid_struct_t *)UsbCompositeDevice.mediaKeyboardHandle)->interruptInPipeBusy) return kStatus_USB_Busy; // The previous report has not been sent yet diff --git a/right/src/usb_interfaces/usb_interface_mouse.c b/right/src/usb_interfaces/usb_interface_mouse.c index 200899b..059b92d 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.c +++ b/right/src/usb_interfaces/usb_interface_mouse.c @@ -21,6 +21,9 @@ void ResetActiveUsbMouseReport(void) usb_status_t usbMouseAction(void) { + if (!UsbCompositeDevice.attach) + return kStatus_USB_Error; // The device is not attached + if (((usb_device_hid_struct_t *)UsbCompositeDevice.mouseHandle)->interruptInPipeBusy) return kStatus_USB_Busy; // The previous report has not been sent yet diff --git a/right/src/usb_interfaces/usb_interface_system_keyboard.c b/right/src/usb_interfaces/usb_interface_system_keyboard.c index fd19699..90788d6 100644 --- a/right/src/usb_interfaces/usb_interface_system_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_system_keyboard.c @@ -21,6 +21,9 @@ void ResetActiveUsbSystemKeyboardReport(void) usb_status_t UsbSystemKeyboardAction(void) { + if (!UsbCompositeDevice.attach) + return kStatus_USB_Error; // The device is not attached + if (((usb_device_hid_struct_t *)UsbCompositeDevice.systemKeyboardHandle)->interruptInPipeBusy) return kStatus_USB_Busy; // The previous report has not been sent yet From 409bd01af6d161f4ce0be93f243b2a348137b410 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 30 Jun 2018 17:28:19 +0200 Subject: [PATCH 34/46] Decreasing the USB priority actually works better Needs more testing --- right/src/usb_composite_device.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/right/src/usb_composite_device.h b/right/src/usb_composite_device.h index d2a8a31..d32a57e 100644 --- a/right/src/usb_composite_device.h +++ b/right/src/usb_composite_device.h @@ -10,7 +10,7 @@ // Macros: #define CONTROLLER_ID kUSB_ControllerKhci0 - #define USB_DEVICE_INTERRUPT_PRIORITY 0 + #define USB_DEVICE_INTERRUPT_PRIORITY 5 // Typedefs: From b6f59563c7c57793a3c1ce67b51d9192f750fd27 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 30 Jun 2018 18:25:03 +0200 Subject: [PATCH 35/46] Revert cancelling a transfer, as the USB endpoint is still locked up --- right/src/usb_interfaces/usb_interface_basic_keyboard.c | 8 ++------ right/src/usb_report_updater.c | 4 ++-- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.c b/right/src/usb_interfaces/usb_interface_basic_keyboard.c index 05c2d61..1df3fe9 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.c @@ -26,12 +26,8 @@ usb_status_t UsbBasicKeyboardAction(void) if (!UsbCompositeDevice.attach) return kStatus_USB_Error; // The device is not attached - if (((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->interruptInPipeBusy) { - ((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->interruptInPipeBusy = 0; - return USB_DeviceCancel(((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->handle, - (USB_BASIC_KEYBOARD_ENDPOINT_INDEX & USB_ENDPOINT_NUMBER_MASK) | - USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_IN); - } + if (((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->interruptInPipeBusy) + return kStatus_USB_Busy; // The previous report has not been sent yet UsbBasicKeyboardActionCounter++; SwitchActiveUsbBasicKeyboardReport(); // Switch the active report diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 877f235..a296667 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -407,12 +407,12 @@ static uint32_t lastMouseUpdateTime; void UpdateUsbReports(void) { UsbReportUpdateCounter++; - /*if (((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->interruptInPipeBusy || + if (((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->interruptInPipeBusy || ((usb_device_hid_struct_t *)UsbCompositeDevice.mediaKeyboardHandle)->interruptInPipeBusy || ((usb_device_hid_struct_t *)UsbCompositeDevice.systemKeyboardHandle)->interruptInPipeBusy || ((usb_device_hid_struct_t *)UsbCompositeDevice.mouseHandle)->interruptInPipeBusy) { return; - } else */if (Timer_GetElapsedTime(&lastMouseUpdateTime) < USB_BASIC_KEYBOARD_INTERRUPT_IN_INTERVAL) { + } else if (Timer_GetElapsedTime(&lastMouseUpdateTime) < USB_BASIC_KEYBOARD_INTERRUPT_IN_INTERVAL) { return; } Timer_SetCurrentTime(&lastMouseUpdateTime); From c870f335a7f0ab4e119cc84c80075ade9b2f6515 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 30 Jun 2018 18:55:31 +0200 Subject: [PATCH 36/46] Set the other interrupts back to the value there were before --- right/src/init_peripherals.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/right/src/init_peripherals.c b/right/src/init_peripherals.c index 506e223..2103a3b 100644 --- a/right/src/init_peripherals.c +++ b/right/src/init_peripherals.c @@ -64,8 +64,8 @@ static void initBusPalState(void) { static void initInterruptPriorities(void) { - NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 2); - NVIC_SetPriority(I2C_EEPROM_BUS_IRQ_ID, 1); + NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1); + NVIC_SetPriority(I2C_EEPROM_BUS_IRQ_ID, 0); NVIC_SetPriority(PIT_TIMER_IRQ_ID, 3); NVIC_SetPriority(PIT_KEY_SCANNER_IRQ_ID, 4); NVIC_SetPriority(PIT_KEY_DEBOUNCER_IRQ_ID, 4); From f16a004583e5aded66e9870205b5b101e4ea89a7 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Sat, 30 Jun 2018 13:06:23 -0700 Subject: [PATCH 37/46] Revert "Default to kStatus_USB_Success" This reverts commit 6eceb6ad30930848ae7ad8d4bfc5c5d2b7f68b99. --- .../usb_interfaces/usb_interface_basic_keyboard.c | 10 +++++++--- right/src/usb_interfaces/usb_interface_generic_hid.c | 12 ++++++++---- .../usb_interfaces/usb_interface_media_keyboard.c | 11 ++++++++--- right/src/usb_interfaces/usb_interface_mouse.c | 11 ++++++++--- .../usb_interfaces/usb_interface_system_keyboard.c | 11 ++++++++--- 5 files changed, 39 insertions(+), 16 deletions(-) diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.c b/right/src/usb_interfaces/usb_interface_basic_keyboard.c index df6fecb..087e14a 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.c @@ -38,15 +38,17 @@ usb_status_t UsbBasicKeyboardAction(void) usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, void *param) { - usb_status_t error = kStatus_USB_Success; + usb_status_t error = kStatus_USB_Error; switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: UsbReportUpdateSemaphore &= ~(1 << USB_BASIC_KEYBOARD_INTERFACE_INDEX); + error = kStatus_USB_Success; break; case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: + error = kStatus_USB_InvalidRequest; break; case kUSB_DeviceHidEventSetReport: { usb_device_hid_report_struct_t *report = (usb_device_hid_report_struct_t*)param; @@ -72,18 +74,20 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi case kUSB_DeviceHidEventGetProtocol: case kUSB_DeviceHidEventSetIdle: case kUSB_DeviceHidEventSetProtocol: + break; default: break; } + return error; } usb_status_t UsbBasicKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration) { - return kStatus_USB_Success; + return kStatus_USB_Error; } usb_status_t UsbBasicKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) { - return kStatus_USB_Success; + return kStatus_USB_Error; } diff --git a/right/src/usb_interfaces/usb_interface_generic_hid.c b/right/src/usb_interfaces/usb_interface_generic_hid.c index 5bd4569..446821e 100644 --- a/right/src/usb_interfaces/usb_interface_generic_hid.c +++ b/right/src/usb_interfaces/usb_interface_generic_hid.c @@ -15,7 +15,7 @@ static usb_status_t UsbReceiveData(void) usb_status_t UsbGenericHidCallback(class_handle_t handle, uint32_t event, void *param) { - usb_status_t error = kStatus_USB_Success; + usb_status_t error = kStatus_USB_Error; switch (event) { case kUSB_DeviceHidEventSendResponse: @@ -28,18 +28,22 @@ usb_status_t UsbGenericHidCallback(class_handle_t handle, uint32_t event, void * GenericHidOutBuffer, USB_GENERIC_HID_OUT_BUFFER_LENGTH); UsbGenericHidActionCounter++; - error = UsbReceiveData(); + return UsbReceiveData(); break; case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventSetReport: case kUSB_DeviceHidEventRequestReportBuffer: + error = kStatus_USB_InvalidRequest; + break; case kUSB_DeviceHidEventGetIdle: case kUSB_DeviceHidEventGetProtocol: case kUSB_DeviceHidEventSetIdle: case kUSB_DeviceHidEventSetProtocol: + break; default: break; } + return error; } @@ -48,7 +52,7 @@ usb_status_t UsbGenericHidSetConfiguration(class_handle_t handle, uint8_t config if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) { return UsbReceiveData(); } - return kStatus_USB_Success; + return kStatus_USB_Error; } usb_status_t UsbGenericHidSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) @@ -56,5 +60,5 @@ usb_status_t UsbGenericHidSetInterface(class_handle_t handle, uint8_t interface, if (USB_GENERIC_HID_INTERFACE_INDEX == interface) { return UsbReceiveData(); } - return kStatus_USB_Success; + return kStatus_USB_Error; } diff --git a/right/src/usb_interfaces/usb_interface_media_keyboard.c b/right/src/usb_interfaces/usb_interface_media_keyboard.c index d155f36..faf335e 100644 --- a/right/src/usb_interfaces/usb_interface_media_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_media_keyboard.c @@ -36,33 +36,38 @@ usb_status_t UsbMediaKeyboardAction(void) usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, void *param) { - usb_status_t error = kStatus_USB_Success; + usb_status_t error = kStatus_USB_Error; switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: UsbReportUpdateSemaphore &= ~(1 << USB_MEDIA_KEYBOARD_INTERFACE_INDEX); + error = kStatus_USB_Success; break; case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventSetReport: case kUSB_DeviceHidEventRequestReportBuffer: + error = kStatus_USB_InvalidRequest; + break; case kUSB_DeviceHidEventGetIdle: case kUSB_DeviceHidEventGetProtocol: case kUSB_DeviceHidEventSetIdle: case kUSB_DeviceHidEventSetProtocol: + break; default: break; } + return error; } usb_status_t UsbMediaKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration) { - return kStatus_USB_Success; + return kStatus_USB_Error; } usb_status_t UsbMediaKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) { - return kStatus_USB_Success; + return kStatus_USB_Error; } diff --git a/right/src/usb_interfaces/usb_interface_mouse.c b/right/src/usb_interfaces/usb_interface_mouse.c index ba77d84..ba6824f 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.c +++ b/right/src/usb_interfaces/usb_interface_mouse.c @@ -36,33 +36,38 @@ usb_status_t UsbMouseAction(void) usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param) { - usb_status_t error = kStatus_USB_Success; + usb_status_t error = kStatus_USB_Error; switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: UsbReportUpdateSemaphore &= ~(1 << USB_MOUSE_INTERFACE_INDEX); + error = kStatus_USB_Success; break; case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventSetReport: case kUSB_DeviceHidEventRequestReportBuffer: + error = kStatus_USB_InvalidRequest; + break; case kUSB_DeviceHidEventGetIdle: case kUSB_DeviceHidEventGetProtocol: case kUSB_DeviceHidEventSetIdle: case kUSB_DeviceHidEventSetProtocol: + break; default: break; } + return error; } usb_status_t UsbMouseSetConfiguration(class_handle_t handle, uint8_t configuration) { - return kStatus_USB_Success; + return kStatus_USB_Error; } usb_status_t UsbMouseSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) { - return kStatus_USB_Success; + return kStatus_USB_Error; } diff --git a/right/src/usb_interfaces/usb_interface_system_keyboard.c b/right/src/usb_interfaces/usb_interface_system_keyboard.c index 3d10762..a432675 100644 --- a/right/src/usb_interfaces/usb_interface_system_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_system_keyboard.c @@ -36,33 +36,38 @@ usb_status_t UsbSystemKeyboardAction(void) usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, void *param) { - usb_status_t error = kStatus_USB_Success; + usb_status_t error = kStatus_USB_Error; switch (event) { // This report is received when the report has been sent case kUSB_DeviceHidEventSendResponse: UsbReportUpdateSemaphore &= ~(1 << USB_SYSTEM_KEYBOARD_INTERFACE_INDEX); + error = kStatus_USB_Success; break; case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventSetReport: case kUSB_DeviceHidEventRequestReportBuffer: + error = kStatus_USB_InvalidRequest; + break; case kUSB_DeviceHidEventGetIdle: case kUSB_DeviceHidEventGetProtocol: case kUSB_DeviceHidEventSetIdle: case kUSB_DeviceHidEventSetProtocol: + break; default: break; } + return error; } usb_status_t UsbSystemKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration) { - return kStatus_USB_Success; + return kStatus_USB_Error; } usb_status_t UsbSystemKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting) { - return kStatus_USB_Success; + return kStatus_USB_Error; } From cba1ef97b63bf0e6f60a5b14e90302e5eef8ddee Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 30 Jun 2018 22:31:32 +0200 Subject: [PATCH 38/46] Revert "Set the USB interrupt priority to the maximum possible" --- right/src/init_peripherals.c | 3 +-- right/src/usb_composite_device.h | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/right/src/init_peripherals.c b/right/src/init_peripherals.c index f820fdc..7efcb20 100644 --- a/right/src/init_peripherals.c +++ b/right/src/init_peripherals.c @@ -16,7 +16,6 @@ #include "usb_api.h" #include "slave_scheduler.h" #include "bootloader/wormhole.h" -#include "usb_composite_device.h" bool IsBusPalOn; volatile uint32_t I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_NORMAL_BAUD_RATE; @@ -70,7 +69,7 @@ static void initInterruptPriorities(void) NVIC_SetPriority(PIT_KEY_SCANNER_IRQ_ID, 4); NVIC_SetPriority(PIT_KEY_DEBOUNCER_IRQ_ID, 4); NVIC_SetPriority(I2C_MAIN_BUS_IRQ_ID, 4); - NVIC_SetPriority(USB_IRQ_ID, USB_DEVICE_INTERRUPT_PRIORITY); + NVIC_SetPriority(USB_IRQ_ID, 4); } static void delay(void) diff --git a/right/src/usb_composite_device.h b/right/src/usb_composite_device.h index d32a57e..7c35485 100644 --- a/right/src/usb_composite_device.h +++ b/right/src/usb_composite_device.h @@ -10,7 +10,7 @@ // Macros: #define CONTROLLER_ID kUSB_ControllerKhci0 - #define USB_DEVICE_INTERRUPT_PRIORITY 5 + #define USB_DEVICE_INTERRUPT_PRIORITY 3 // Typedefs: From 9fe73233afa14667fc419a6fa76b749bc15cba30 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 30 Jun 2018 22:36:48 +0200 Subject: [PATCH 39/46] Fix merge issue --- right/src/usb_report_updater.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 3def481..d294d89 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -409,6 +409,9 @@ static void updateActiveUsbReports(void) } uint32_t UsbReportUpdateCounter; + +void UpdateUsbReports(void) +{ usb_status_t status; if (UsbReportUpdateSemaphore && !IsHostSleeping) { From 7606f311c83ada8ae0c32155bac59d12db33cf83 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 30 Jun 2018 22:36:59 +0200 Subject: [PATCH 40/46] Fix coding style --- right/src/usb_interfaces/usb_interface_generic_hid.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/right/src/usb_interfaces/usb_interface_generic_hid.c b/right/src/usb_interfaces/usb_interface_generic_hid.c index 38e0f05..0c293c7 100644 --- a/right/src/usb_interfaces/usb_interface_generic_hid.c +++ b/right/src/usb_interfaces/usb_interface_generic_hid.c @@ -7,8 +7,9 @@ uint8_t GenericHidOutBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH]; static usb_status_t UsbReceiveData(void) { - if (!UsbCompositeDevice.attach) + if (!UsbCompositeDevice.attach) { return kStatus_USB_Error; // The device is not attached + } return USB_DeviceHidRecv(UsbCompositeDevice.genericHidHandle, USB_GENERIC_HID_ENDPOINT_OUT_INDEX, From 6612f7cced3a3b3e6a454b12db1e135d0256b814 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 30 Jun 2018 22:48:52 +0200 Subject: [PATCH 41/46] Fixed warning --- right/src/timer.h | 1 + 1 file changed, 1 insertion(+) diff --git a/right/src/timer.h b/right/src/timer.h index 5acbcce..810bfc1 100644 --- a/right/src/timer.h +++ b/right/src/timer.h @@ -20,5 +20,6 @@ uint32_t Timer_GetElapsedTimeMicros(uint32_t *time); uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time); uint32_t Timer_GetElapsedTimeAndSetCurrentMicros(uint32_t *time); + void Timer_Delay(uint32_t length); #endif From 8c7eb079ec8f29ca62a85ea66cd58bb7215fd3e5 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 30 Jun 2018 23:03:50 +0200 Subject: [PATCH 42/46] Re-added code from 994e2f6b79ce76f12e8f17c0c6d691caab7046b5 --- right/src/usb_interfaces/usb_interface_basic_keyboard.c | 8 +++----- right/src/usb_interfaces/usb_interface_media_keyboard.c | 8 +++----- right/src/usb_interfaces/usb_interface_mouse.c | 8 +++----- right/src/usb_interfaces/usb_interface_system_keyboard.c | 8 +++----- 4 files changed, 12 insertions(+), 20 deletions(-) diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.c b/right/src/usb_interfaces/usb_interface_basic_keyboard.c index afebbd5..90a2108 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.c @@ -28,14 +28,12 @@ usb_status_t UsbBasicKeyboardAction(void) return kStatus_USB_Error; // The device is not attached } - SwitchActiveUsbBasicKeyboardReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( - UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX, - (uint8_t*)GetInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH); + UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX, + (uint8_t *)ActiveUsbBasicKeyboardReport, USB_BASIC_KEYBOARD_REPORT_LENGTH); if (usb_status == kStatus_USB_Success) { UsbBasicKeyboardActionCounter++; - } else { - SwitchActiveUsbBasicKeyboardReport(); // Switch back, as the command failed + SwitchActiveUsbBasicKeyboardReport(); } return usb_status; } diff --git a/right/src/usb_interfaces/usb_interface_media_keyboard.c b/right/src/usb_interfaces/usb_interface_media_keyboard.c index 145377e..e83e081 100644 --- a/right/src/usb_interfaces/usb_interface_media_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_media_keyboard.c @@ -26,14 +26,12 @@ usb_status_t UsbMediaKeyboardAction(void) return kStatus_USB_Error; // The device is not attached } - SwitchActiveUsbMediaKeyboardReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( - UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX, - (uint8_t*)GetInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH); + UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX, + (uint8_t *)ActiveUsbMediaKeyboardReport, USB_MEDIA_KEYBOARD_REPORT_LENGTH); if (usb_status == kStatus_USB_Success) { UsbMediaKeyboardActionCounter++; - } else { - SwitchActiveUsbMediaKeyboardReport(); // Switch back, as the command failed + SwitchActiveUsbMediaKeyboardReport(); } return usb_status; } diff --git a/right/src/usb_interfaces/usb_interface_mouse.c b/right/src/usb_interfaces/usb_interface_mouse.c index 94afe11..6d69a99 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.c +++ b/right/src/usb_interfaces/usb_interface_mouse.c @@ -26,14 +26,12 @@ usb_status_t UsbMouseAction(void) return kStatus_USB_Error; // The device is not attached } - SwitchActiveUsbMouseReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( - UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX, - (uint8_t*)GetInactiveUsbMouseReport(), USB_MOUSE_REPORT_LENGTH); + UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX, + (uint8_t *)ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH); if (usb_status == kStatus_USB_Success) { UsbMouseActionCounter++; - } else { - SwitchActiveUsbMouseReport(); // Switch back, as the command failed + SwitchActiveUsbMouseReport(); } return usb_status; } diff --git a/right/src/usb_interfaces/usb_interface_system_keyboard.c b/right/src/usb_interfaces/usb_interface_system_keyboard.c index f3d1415..c8e55eb 100644 --- a/right/src/usb_interfaces/usb_interface_system_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_system_keyboard.c @@ -26,14 +26,12 @@ usb_status_t UsbSystemKeyboardAction(void) return kStatus_USB_Error; // The device is not attached } - SwitchActiveUsbSystemKeyboardReport(); // Switch the active report usb_status_t usb_status = USB_DeviceHidSend( - UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX, - (uint8_t*)GetInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH); + UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX, + (uint8_t *)ActiveUsbSystemKeyboardReport, USB_SYSTEM_KEYBOARD_REPORT_LENGTH); if (usb_status == kStatus_USB_Success) { UsbSystemKeyboardActionCounter++; - } else { - SwitchActiveUsbSystemKeyboardReport(); // Switch back, as the command failed + SwitchActiveUsbSystemKeyboardReport(); } return usb_status; } From edf34de4b5363640a672191ce7be1986fab5db8b Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 30 Jun 2018 23:23:12 +0200 Subject: [PATCH 43/46] Fixed comment --- right/src/usb_interfaces/usb_interface_basic_keyboard.c | 2 +- right/src/usb_interfaces/usb_interface_generic_hid.c | 2 +- right/src/usb_interfaces/usb_interface_media_keyboard.c | 2 +- right/src/usb_interfaces/usb_interface_mouse.c | 2 +- right/src/usb_interfaces/usb_interface_system_keyboard.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.c b/right/src/usb_interfaces/usb_interface_basic_keyboard.c index 90a2108..0548f10 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.c @@ -43,7 +43,7 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi usb_status_t error = kStatus_USB_Error; switch (event) { - // This report is received when the report has been sent + // This event is received when the report has been sent case kUSB_DeviceHidEventSendResponse: UsbReportUpdateSemaphore &= ~(1 << USB_BASIC_KEYBOARD_INTERFACE_INDEX); if (UsbCompositeDevice.attach) { diff --git a/right/src/usb_interfaces/usb_interface_generic_hid.c b/right/src/usb_interfaces/usb_interface_generic_hid.c index 0c293c7..349c779 100644 --- a/right/src/usb_interfaces/usb_interface_generic_hid.c +++ b/right/src/usb_interfaces/usb_interface_generic_hid.c @@ -22,7 +22,7 @@ usb_status_t UsbGenericHidCallback(class_handle_t handle, uint32_t event, void * usb_status_t error = kStatus_USB_Error; switch (event) { - // This report is received when the report has been sent + // This event is received when the report has been sent case kUSB_DeviceHidEventSendResponse: if (UsbCompositeDevice.attach) { error = kStatus_USB_Success; diff --git a/right/src/usb_interfaces/usb_interface_media_keyboard.c b/right/src/usb_interfaces/usb_interface_media_keyboard.c index e83e081..7f17de9 100644 --- a/right/src/usb_interfaces/usb_interface_media_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_media_keyboard.c @@ -41,7 +41,7 @@ usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, voi usb_status_t error = kStatus_USB_Error; switch (event) { - // This report is received when the report has been sent + // This event is received when the report has been sent case kUSB_DeviceHidEventSendResponse: UsbReportUpdateSemaphore &= ~(1 << USB_MEDIA_KEYBOARD_INTERFACE_INDEX); if (UsbCompositeDevice.attach) { diff --git a/right/src/usb_interfaces/usb_interface_mouse.c b/right/src/usb_interfaces/usb_interface_mouse.c index 6d69a99..f02bff5 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.c +++ b/right/src/usb_interfaces/usb_interface_mouse.c @@ -41,7 +41,7 @@ usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param usb_status_t error = kStatus_USB_Error; switch (event) { - // This report is received when the report has been sent + // This event is received when the report has been sent case kUSB_DeviceHidEventSendResponse: UsbReportUpdateSemaphore &= ~(1 << USB_MOUSE_INTERFACE_INDEX); if (UsbCompositeDevice.attach) { diff --git a/right/src/usb_interfaces/usb_interface_system_keyboard.c b/right/src/usb_interfaces/usb_interface_system_keyboard.c index c8e55eb..633f90f 100644 --- a/right/src/usb_interfaces/usb_interface_system_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_system_keyboard.c @@ -41,7 +41,7 @@ usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, vo usb_status_t error = kStatus_USB_Error; switch (event) { - // This report is received when the report has been sent + // This event is received when the report has been sent case kUSB_DeviceHidEventSendResponse: UsbReportUpdateSemaphore &= ~(1 << USB_SYSTEM_KEYBOARD_INTERFACE_INDEX); if (UsbCompositeDevice.attach) { From 5b32c0da43dcae8df6babe3b58d2b3072bd47dec Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 30 Jun 2018 23:42:39 +0200 Subject: [PATCH 44/46] Disable the key press test code --- right/src/usb_report_updater.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index d294d89..a9fda2b 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -292,8 +292,6 @@ static uint8_t secondaryRoleState = SecondaryRoleState_Released; static uint8_t secondaryRoleSlotId; static uint8_t secondaryRoleKeyId; static secondary_role_t secondaryRole; -static bool simulateKeypresses = false; -static bool sendChar = false; static void updateActiveUsbReports(void) { @@ -328,6 +326,10 @@ static void updateActiveUsbReports(void) bool layerGotReleased = previousLayer != LayerId_Base && activeLayer == LayerId_Base; LedDisplay_SetLayer(activeLayer); +#if 0 // Used to toggle key presses at the maximum rate - this was used to reproduce: https://github.com/UltimateHackingKeyboard/firmware/issues/122 + static bool simulateKeypresses = false; + static bool sendChar = false; + key_state_t *testKeyState = &KeyStates[SlotId_LeftKeyboardHalf][0]; if (!testKeyState->previous && testKeyState->current && activeLayer == LayerId_Fn) { simulateKeypresses = !simulateKeypresses; @@ -337,6 +339,7 @@ static void updateActiveUsbReports(void) sendChar = !sendChar; ActiveUsbBasicKeyboardReport->scancodes[basicScancodeIndex++] = sendChar ? HID_KEYBOARD_SC_A : HID_KEYBOARD_SC_BACKSPACE; } +#endif for (uint8_t slotId=0; slotId Date: Sat, 30 Jun 2018 23:44:58 +0200 Subject: [PATCH 45/46] Just define the usb_status_t variable inside the if-statements --- right/src/usb_report_updater.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index a9fda2b..2b78ab3 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -415,8 +415,6 @@ uint32_t UsbReportUpdateCounter; void UpdateUsbReports(void) { - usb_status_t status; - if (UsbReportUpdateSemaphore && !IsHostSleeping) { return; } @@ -440,21 +438,21 @@ void UpdateUsbReports(void) } if (HasUsbBasicKeyboardReportChanged) { - status = UsbBasicKeyboardAction(); + usb_status_t status = UsbBasicKeyboardAction(); if (status == kStatus_USB_Success) { UsbReportUpdateSemaphore |= 1 << USB_BASIC_KEYBOARD_INTERFACE_INDEX; } } if (HasUsbMediaKeyboardReportChanged) { - status = UsbMediaKeyboardAction(); + usb_status_t status = UsbMediaKeyboardAction(); if (status == kStatus_USB_Success) { UsbReportUpdateSemaphore |= 1 << USB_MEDIA_KEYBOARD_INTERFACE_INDEX; } } if (HasUsbSystemKeyboardReportChanged) { - status = UsbSystemKeyboardAction(); + usb_status_t status = UsbSystemKeyboardAction(); if (status == kStatus_USB_Success) { UsbReportUpdateSemaphore |= 1 << USB_SYSTEM_KEYBOARD_INTERFACE_INDEX; } @@ -463,7 +461,7 @@ void UpdateUsbReports(void) // Send out the mouse position and wheel values continuously if the report is not zeros, but only send the mouse button states when they change. if (HasUsbMouseReportChanged || ActiveUsbMouseReport->x || ActiveUsbMouseReport->y || ActiveUsbMouseReport->wheelX || ActiveUsbMouseReport->wheelY) { - status = UsbMouseAction(); + usb_status_t status = UsbMouseAction(); if (status == kStatus_USB_Success) { UsbReportUpdateSemaphore |= 1 << USB_MOUSE_INTERFACE_INDEX; } From 5bd479ab8e96e3ec976b313aee7070c4abe04052 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sun, 1 Jul 2018 00:04:26 +0200 Subject: [PATCH 46/46] Fixed unused variable This was due to a merge conflict in c69f664e850a224730728274a8b4b1b76698d7c2 --- right/src/timer.c | 1 - 1 file changed, 1 deletion(-) diff --git a/right/src/timer.c b/right/src/timer.c index 1d1be35..3ddf4b9 100644 --- a/right/src/timer.c +++ b/right/src/timer.c @@ -2,7 +2,6 @@ #include "timer.h" #include "peripherals/test_led.h" -static volatile uint32_t CurrentTime; static uint32_t timerClockFrequency; static volatile uint32_t currentTime, delayLength;