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/15] 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/15] 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/15] 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/15] 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/15] 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/15] 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/15] 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/15] 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/15] 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/15] 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/15] 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/15] 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/15] 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/15] 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/15] 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