diff --git a/Application/Tasks/UsbDataHandler.c b/Application/Tasks/UsbDataHandler.c index 7d8df8d..4f2dc96 100644 --- a/Application/Tasks/UsbDataHandler.c +++ b/Application/Tasks/UsbDataHandler.c @@ -61,6 +61,7 @@ union { cls_light_ThemeSettings msg_cls_light_ThemeSettings; cls_light_SaveThemeSettings msg_cls_light_SaveThemeSettings; cls_light_RequestThemeSetting msg_cls_light_RequestThemeSetting; + cls_usb_JumpToBootloader msg_cls_usb_JumpToBootloader; } mem_msg_decode; @@ -119,6 +120,7 @@ message_handler_t message_handlers[] = { MESSAGE_HANDLER(cls_usb_PackageType_LIGHT_SETTING_THEME, cls_light_ThemeSettings), MESSAGE_HANDLER(cls_usb_PackageType_LIGHT_SETTING_THEME_SAVE, cls_light_SaveThemeSettings), MESSAGE_HANDLER(cls_usb_PackageType_LIGHT_REQUEST_THEME, cls_light_RequestThemeSetting), + MESSAGE_HANDLER(cls_usb_PackageType_JUMP_TO_BOOTLOADER, cls_usb_JumpToBootloader), }; diff --git a/Application/Tasks/UsbDataHandler.h b/Application/Tasks/UsbDataHandler.h index d79fffc..de94b60 100644 --- a/Application/Tasks/UsbDataHandler.h +++ b/Application/Tasks/UsbDataHandler.h @@ -122,6 +122,7 @@ void UsbDataHandler_Runner(); */ int UsbDataHandler_RxCallback(uint8_t* Buf, uint32_t Len); +void DataClbk_cls_usb_JumpToBootloader(void* msg, uint32_t length); void DataClbk_cls_firmware_Start(void* msg, uint32_t length); void DataClbk_cls_firmware_Package(void* msg, uint32_t length); diff --git a/Core/Src/main.c b/Core/Src/main.c index afd2120..341278b 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -285,6 +285,48 @@ void ULOG_SendLPUART(ulog_level_t level, char *msg) { HAL_UART_Transmit(&hlpuart1, (const uint8_t*)ulog_send_buffer, send_length, LOG_TIMEOUT); } +void JumpToBootloader(void) +{ +#define conBootloadAddress 0x1FF09800 + + void (*SysMemBootJump)(void); + uint8_t i; + + __disable_irq(); + // Reset USB + //USBD_DeInit(&hUsbDeviceHS); + + //De-init all peripherals + //HAL_ADC_DeInit(&hadc1); + + // Disable Systick + SysTick->CTRL = 0; + SysTick->LOAD = 0; + SysTick->VAL = 0; + + // Reset clock to default + HAL_RCC_DeInit(); + + // Clear all interrupt bits + for (i = 0; i < sizeof(NVIC->ICER) / sizeof(NVIC->ICER[0]); i++) + { + NVIC->ICER[i] = 0xFFFFFFFF; + NVIC->ICPR[i] = 0xFFFFFFFF; + } + + __enable_irq(); + + SysMemBootJump = (void (*)(void)) (*((uint32_t *) (conBootloadAddress + 4))); + __set_MSP(*(uint32_t *)conBootloadAddress); + SysMemBootJump(); + + while (1); // Just in case... +} + + +void DataClbk_cls_usb_JumpToBootloader(void* msg, uint32_t length) { + JumpToBootloader(); +} /* USER CODE END 4 */ /* MPU Configuration */ diff --git a/tools/bootloader.py b/tools/bootloader.py new file mode 100644 index 0000000..e7566b1 --- /dev/null +++ b/tools/bootloader.py @@ -0,0 +1,13 @@ +from usb_pb2 import PackageType, JumpToBootloader +from vcp_driver import * + +if __name__ == "__main__": + ser = setup_connection() + # Create a message + request = JumpToBootloader() + request.magic = 0xdeadbeef + # Serialize the request to a bytearray + request_data = request.SerializeToString() + + # Send the request + send_package(PackageType.JUMP_TO_BOOTLOADER, request_data, ser)