stm32: Move dfu reboot logic to new dfu_reboot.c file

Move the stm32 DFU reboot logic to a new dfu_reboot.c file.  This
simplifies the per-chip code.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor
2022-12-15 11:23:28 -05:00
parent b6cd77f6e3
commit 4af8786587
10 changed files with 84 additions and 164 deletions

View File

@@ -208,38 +208,12 @@ clock_setup(void)
* Bootloader
****************************************************************/
#define USB_BOOT_FLAG_ADDR (0x24000000 + 0x8000) // Place flag in "AXI SRAM"
#define USB_BOOT_FLAG 0x55534220424f4f54 // "USB BOOT"
// Flag that bootloader is desired and reboot
static void
usb_reboot_for_dfu_bootloader(void)
{
irq_disable();
uint64_t *bflag = (void*)USB_BOOT_FLAG_ADDR;
*bflag = USB_BOOT_FLAG;
SCB_CleanDCache_by_Addr((void*)bflag, sizeof(*bflag));
NVIC_SystemReset();
}
// Check if rebooting into system DFU Bootloader
static void
check_usb_dfu_bootloader(void)
{
if (!CONFIG_USB || *(uint64_t*)USB_BOOT_FLAG_ADDR != USB_BOOT_FLAG)
return;
*(uint64_t*)USB_BOOT_FLAG_ADDR = 0;
uint32_t *sysbase = (uint32_t*)0x1FF09800;
asm volatile("mov sp, %0\n bx %1"
: : "r"(sysbase[0]), "r"(sysbase[1]));
}
// Handle reboot requests
void
bootloader_request(void)
{
try_request_canboot();
usb_reboot_for_dfu_bootloader();
dfu_reboot();
}
@@ -259,7 +233,7 @@ armcm_main(void)
RCC->D3CCIPR = 0x00000000;
SCB->VTOR = (uint32_t)VectorTable;
check_usb_dfu_bootloader();
dfu_reboot_check();
clock_setup();