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) \ 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 + 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) { diff --git a/right/src/timer.c b/right/src/timer.c index 4106877..2a61051 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,50 @@ 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 + + // 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; +} + 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 diff --git a/right/src/usb_interfaces/usb_interface_basic_keyboard.c b/right/src/usb_interfaces/usb_interface_basic_keyboard.c index f1bef4f..2bf39e8 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.c @@ -4,17 +4,16 @@ static usb_basic_keyboard_report_t usbBasicKeyboardReports[2]; uint32_t UsbBasicKeyboardActionCounter; usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports; -volatile bool IsUsbBasicKeyboardReportSent = false; 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) @@ -22,14 +21,20 @@ void ResetActiveUsbBasicKeyboardReport(void) bzero(ActiveUsbBasicKeyboardReport, USB_BASIC_KEYBOARD_REPORT_LENGTH); } -static usb_status_t UsbBasicKeyboardAction(void) +usb_status_t UsbBasicKeyboardAction(void) { - usb_status_t status = USB_DeviceHidSend( - UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX, - (uint8_t*)getInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH); - IsUsbBasicKeyboardReportSent = true; + if (((usb_device_hid_struct_t *)UsbCompositeDevice.basicKeyboardHandle)->interruptInPipeBusy) + return kStatus_USB_Busy; // The previous report has not been sent yet + UsbBasicKeyboardActionCounter++; - return status; + 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) { + SwitchActiveUsbBasicKeyboardReport(); // Switch back, as the command failed + } + return usb_status; } usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, void *param) @@ -37,11 +42,11 @@ 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: - if (UsbCompositeDevice.attach) { - return UsbBasicKeyboardAction(); - } + error = kStatus_USB_Success; break; + case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: error = kStatus_USB_InvalidRequest; break; @@ -61,7 +66,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; } @@ -79,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_basic_keyboard.h b/right/src/usb_interfaces/usb_interface_basic_keyboard.h index 2a7fea0..2f41c6a 100644 --- a/right/src/usb_interfaces/usb_interface_basic_keyboard.h +++ b/right/src/usb_interfaces/usb_interface_basic_keyboard.h @@ -31,7 +31,6 @@ // Variables: - extern volatile bool IsUsbBasicKeyboardReportSent; extern uint32_t UsbBasicKeyboardActionCounter; extern usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport; @@ -42,6 +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 8147734..aa7e74e 100644 --- a/right/src/usb_interfaces/usb_interface_media_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_media_keyboard.c @@ -3,16 +3,15 @@ uint32_t UsbMediaKeyboardActionCounter; static usb_media_keyboard_report_t usbMediaKeyboardReports[2]; usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport = usbMediaKeyboardReports; -volatile bool IsUsbMediaKeyboardReportSent = false; -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) @@ -20,14 +19,20 @@ void ResetActiveUsbMediaKeyboardReport(void) bzero(ActiveUsbMediaKeyboardReport, USB_MEDIA_KEYBOARD_REPORT_LENGTH); } -static usb_status_t UsbMediaKeyboardAction(void) +usb_status_t UsbMediaKeyboardAction(void) { - usb_status_t status = USB_DeviceHidSend( - UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX, - (uint8_t*)getInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH); - IsUsbMediaKeyboardReportSent = true; + if (((usb_device_hid_struct_t *)UsbCompositeDevice.mediaKeyboardHandle)->interruptInPipeBusy) + return kStatus_USB_Busy; // The previous report has not been sent yet + UsbMediaKeyboardActionCounter++; - return status; + 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) { + SwitchActiveUsbMediaKeyboardReport(); // Switch back, as the command failed + } + return usb_status; } usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, void *param) @@ -35,11 +40,11 @@ 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: - if (UsbCompositeDevice.attach) { - return UsbMediaKeyboardAction(); - } + error = kStatus_USB_Success; break; + case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventSetReport: case kUSB_DeviceHidEventRequestReportBuffer: @@ -59,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_media_keyboard.h b/right/src/usb_interfaces/usb_interface_media_keyboard.h index 8b39fb2..a236e8d 100644 --- a/right/src/usb_interfaces/usb_interface_media_keyboard.h +++ b/right/src/usb_interfaces/usb_interface_media_keyboard.h @@ -28,7 +28,6 @@ // Variables: - extern volatile bool IsUsbMediaKeyboardReportSent; extern uint32_t UsbMediaKeyboardActionCounter; extern usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport; @@ -39,6 +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 711e3cd..89e9ddb 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.c +++ b/right/src/usb_interfaces/usb_interface_mouse.c @@ -3,16 +3,15 @@ uint32_t UsbMouseActionCounter; static usb_mouse_report_t usbMouseReports[2]; usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports; -volatile bool IsUsbMouseReportSent = false; -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) @@ -20,25 +19,32 @@ void ResetActiveUsbMouseReport(void) bzero(ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH); } -static volatile usb_status_t usbMouseAction(void) +usb_status_t usbMouseAction(void) { - usb_mouse_report_t *mouseReport = getInactiveUsbMouseReport(); - IsUsbMouseReportSent = true; - return USB_DeviceHidSend(UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX, - (uint8_t*)mouseReport, USB_MOUSE_REPORT_LENGTH); + 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) { + SwitchActiveUsbMouseReport(); // Switch back, as the command failed + } + return usb_status; } usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param) { - UsbMouseActionCounter++; 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) { - return usbMouseAction(); - } + error = kStatus_USB_Success; break; + case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventSetReport: case kUSB_DeviceHidEventRequestReportBuffer: @@ -58,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_mouse.h b/right/src/usb_interfaces/usb_interface_mouse.h index e1a2cc7..b2258a1 100644 --- a/right/src/usb_interfaces/usb_interface_mouse.h +++ b/right/src/usb_interfaces/usb_interface_mouse.h @@ -31,7 +31,6 @@ // Variables: - extern volatile bool IsUsbMouseReportSent; extern uint32_t UsbMouseActionCounter; extern usb_mouse_report_t* ActiveUsbMouseReport; @@ -42,6 +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 e039069..10ca8d9 100644 --- a/right/src/usb_interfaces/usb_interface_system_keyboard.c +++ b/right/src/usb_interfaces/usb_interface_system_keyboard.c @@ -3,16 +3,15 @@ uint32_t UsbSystemKeyboardActionCounter; static usb_system_keyboard_report_t usbSystemKeyboardReports[2]; usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport = usbSystemKeyboardReports; -volatile bool IsUsbSystemKeyboardReportSent = false; -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) @@ -20,14 +19,20 @@ void ResetActiveUsbSystemKeyboardReport(void) bzero(ActiveUsbSystemKeyboardReport, USB_SYSTEM_KEYBOARD_REPORT_LENGTH); } -static usb_status_t UsbSystemKeyboardAction(void) +usb_status_t UsbSystemKeyboardAction(void) { - usb_status_t status = USB_DeviceHidSend( - UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX, - (uint8_t*)getInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH); - IsUsbSystemKeyboardReportSent = true; + if (((usb_device_hid_struct_t *)UsbCompositeDevice.systemKeyboardHandle)->interruptInPipeBusy) + return kStatus_USB_Busy; // The previous report has not been sent yet + UsbSystemKeyboardActionCounter++; - return status; + 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) { + SwitchActiveUsbSystemKeyboardReport(); // Switch back, as the command failed + } + return usb_status; } usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, void *param) @@ -35,11 +40,11 @@ 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: - if (UsbCompositeDevice.attach) { - return UsbSystemKeyboardAction(); - } + error = kStatus_USB_Success; break; + case kUSB_DeviceHidEventRecvResponse: case kUSB_DeviceHidEventGetReport: case kUSB_DeviceHidEventSetReport: case kUSB_DeviceHidEventRequestReportBuffer: @@ -59,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; } diff --git a/right/src/usb_interfaces/usb_interface_system_keyboard.h b/right/src/usb_interfaces/usb_interface_system_keyboard.h index 0a84353..9c22bda 100644 --- a/right/src/usb_interfaces/usb_interface_system_keyboard.h +++ b/right/src/usb_interfaces/usb_interface_system_keyboard.h @@ -29,7 +29,6 @@ // Variables: - extern volatile bool IsUsbSystemKeyboardReportSent; extern uint32_t UsbSystemKeyboardActionCounter; extern usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport; @@ -40,6 +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 2fdf5ed..642ca2e 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; slotIdinterruptInPipeBusy || + ((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); ResetActiveUsbBasicKeyboardReport(); ResetActiveUsbMediaKeyboardReport(); @@ -419,35 +424,29 @@ void UpdateUsbReports(void) updateActiveUsbReports(); - static usb_basic_keyboard_report_t last_basic_report = { .scancodes[0] = 0xFF }; - if (memcmp(ActiveUsbBasicKeyboardReport, &last_basic_report, sizeof(usb_basic_keyboard_report_t)) != 0) { - last_basic_report = *ActiveUsbBasicKeyboardReport; - SwitchActiveUsbBasicKeyboardReport(); - IsUsbBasicKeyboardReportSent = false; + bool HasUsbBasicKeyboardReportChanged = memcmp(ActiveUsbBasicKeyboardReport, GetInactiveUsbBasicKeyboardReport(), sizeof(usb_basic_keyboard_report_t)) != 0; + if (HasUsbBasicKeyboardReportChanged) { + UsbBasicKeyboardAction(); } - static usb_media_keyboard_report_t last_media_report = { .scancodes[0] = 0xFF }; - if (memcmp(ActiveUsbMediaKeyboardReport, &last_media_report, sizeof(usb_media_keyboard_report_t)) != 0) { - last_media_report = *ActiveUsbMediaKeyboardReport; - SwitchActiveUsbMediaKeyboardReport(); - IsUsbMediaKeyboardReportSent = false; + bool HasUsbMediaKeyboardReportChanged = memcmp(ActiveUsbMediaKeyboardReport, GetInactiveUsbMediaKeyboardReport(), sizeof(usb_media_keyboard_report_t)) != 0; + if (HasUsbMediaKeyboardReportChanged) { + UsbMediaKeyboardAction(); } - static usb_system_keyboard_report_t last_system_report = { .scancodes[0] = 0xFF }; - if (memcmp(ActiveUsbSystemKeyboardReport, &last_system_report, sizeof(usb_system_keyboard_report_t)) != 0) { - last_system_report = *ActiveUsbSystemKeyboardReport; - SwitchActiveUsbSystemKeyboardReport(); - IsUsbSystemKeyboardReportSent = false; + bool HasUsbSystemKeyboardReportChanged = memcmp(ActiveUsbSystemKeyboardReport, GetInactiveUsbSystemKeyboardReport(), sizeof(usb_system_keyboard_report_t)) != 0; + if (HasUsbSystemKeyboardReportChanged) { + UsbSystemKeyboardAction(); } - static usb_mouse_report_t last_mouse_report = { .buttons = 0xFF }; - if (memcmp(ActiveUsbMouseReport, &last_mouse_report, sizeof(usb_mouse_report_t)) != 0) { - last_mouse_report = *ActiveUsbMouseReport; - SwitchActiveUsbMouseReport(); - IsUsbMouseReportSent = false; + // 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 || !IsUsbBasicKeyboardReportSent || !IsUsbMediaKeyboardReportSent || !IsUsbSystemKeyboardReportSent || !IsUsbMouseReportSent) && 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. } }