diff --git a/right/src/slave_drivers/uhk_module_driver.c b/right/src/slave_drivers/uhk_module_driver.c index e0bcbdc..731f9e4 100644 --- a/right/src/slave_drivers/uhk_module_driver.c +++ b/right/src/slave_drivers/uhk_module_driver.c @@ -174,6 +174,19 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId) BoolBitsToBytes(rxMessage->data, CurrentKeyStates[slotId], uhkModuleState->features.keyCount); } status = kStatus_Uhk_NoTransfer; + *uhkModulePhase = UhkModulePhase_JumpToBootloader; + break; + + // Jump to bootloader + case UhkModulePhase_JumpToBootloader: + if (uhkModuleState->jumpToBootloader) { + txMessage.data[0] = SlaveCommand_JumpToBootloader; + txMessage.length = 1; + status = tx(i2cAddress); + uhkModuleState->jumpToBootloader = false; + } else { + status = kStatus_Uhk_NoTransfer; + } *uhkModulePhase = UhkModulePhase_SetTestLed; break; diff --git a/right/src/slave_drivers/uhk_module_driver.h b/right/src/slave_drivers/uhk_module_driver.h index 848c1b6..65aea8e 100644 --- a/right/src/slave_drivers/uhk_module_driver.h +++ b/right/src/slave_drivers/uhk_module_driver.h @@ -47,8 +47,9 @@ UhkModulePhase_ProcessKeystates, // Misc phases - UhkModulePhase_SetLedPwmBrightness, + UhkModulePhase_JumpToBootloader, UhkModulePhase_SetTestLed, + UhkModulePhase_SetLedPwmBrightness, } uhk_module_phase_t; @@ -67,6 +68,7 @@ uint8_t firmwareI2cAddress; uint8_t bootloaderI2cAddress; uhk_module_features_t features; + bool jumpToBootloader; } uhk_module_state_t; typedef struct { diff --git a/right/src/usb_protocol_handler.c b/right/src/usb_protocol_handler.c index d2a5692..2fc9ec1 100644 --- a/right/src/usb_protocol_handler.c +++ b/right/src/usb_protocol_handler.c @@ -265,6 +265,18 @@ void getDebugInfo(void) GenericHidOutBuffer[8] = (ticks >> 56) & 0xff; */} +void jumpToSlaveBootloader(void) +{ + uint8_t uhkModuleDriverId = GenericHidInBuffer[1]; + + if (uhkModuleDriverId >= UHK_MODULE_MAX_COUNT) { + setError(JumpToBootloaderError_InvalidModuleDriverId); + return; + } + + UhkModuleStates[uhkModuleDriverId].jumpToBootloader = true; +} + // The main protocol handler function void UsbProtocolHandler(void) @@ -316,6 +328,9 @@ void UsbProtocolHandler(void) case UsbCommand_GetDebugInfo: getDebugInfo(); break; + case UsbCommand_JumpToSlaveBootloader: + jumpToSlaveBootloader(); + break; default: break; } diff --git a/right/src/usb_protocol_handler.h b/right/src/usb_protocol_handler.h index 0fae7c1..11445e9 100644 --- a/right/src/usb_protocol_handler.h +++ b/right/src/usb_protocol_handler.h @@ -23,6 +23,7 @@ UsbCommand_ReadUserConfiguration = 15, UsbCommand_GetKeyboardState = 16, UsbCommand_GetDebugInfo = 17, + UsbCommand_JumpToSlaveBootloader = 18, } usb_command_t; typedef enum { @@ -35,6 +36,10 @@ ConfigTransferResponse_BufferOutOfBounds = 2, } config_transfer_response_t; + typedef enum { + JumpToBootloaderError_InvalidModuleDriverId = 1, + } jump_to_bootloader_error_t; + // Functions: void UsbProtocolHandler(void);