stm32: Separate out USB DFU reboot logic in stm32l4.c
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
parent
be74c72555
commit
b6cd77f6e3
|
@ -7,7 +7,6 @@
|
||||||
#include "autoconf.h" // CONFIG_CLOCK_REF_FREQ
|
#include "autoconf.h" // CONFIG_CLOCK_REF_FREQ
|
||||||
#include "board/armcm_boot.h" // VectorTable
|
#include "board/armcm_boot.h" // VectorTable
|
||||||
#include "board/irq.h" // irq_disable
|
#include "board/irq.h" // irq_disable
|
||||||
#include "board/usb_cdc.h" // usb_request_bootloader
|
|
||||||
#include "command.h" // DECL_CONSTANT_STR
|
#include "command.h" // DECL_CONSTANT_STR
|
||||||
#include "internal.h" // enable_pclock
|
#include "internal.h" // enable_pclock
|
||||||
#include "sched.h" // sched_main
|
#include "sched.h" // sched_main
|
||||||
|
@ -68,25 +67,6 @@ gpio_clock_enable(GPIO_TypeDef *regs)
|
||||||
RCC->AHB2ENR;
|
RCC->AHB2ENR;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define USB_BOOT_FLAG_ADDR (CONFIG_RAM_START + CONFIG_RAM_SIZE - 4096)
|
|
||||||
#define USB_BOOT_FLAG 0x55534220424f4f54 // "USB BOOT"
|
|
||||||
|
|
||||||
// Handle USB reboot requests
|
|
||||||
void
|
|
||||||
usb_request_bootloader(void)
|
|
||||||
{
|
|
||||||
irq_disable();
|
|
||||||
// System DFU Bootloader
|
|
||||||
*(uint64_t*)USB_BOOT_FLAG_ADDR = USB_BOOT_FLAG;
|
|
||||||
NVIC_SystemReset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
bootloader_request(void)
|
|
||||||
{
|
|
||||||
usb_request_bootloader();
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !CONFIG_STM32_CLOCK_REF_INTERNAL
|
#if !CONFIG_STM32_CLOCK_REF_INTERNAL
|
||||||
DECL_CONSTANT_STR("RESERVE_PINS_crystal", "PC14,PC15");
|
DECL_CONSTANT_STR("RESERVE_PINS_crystal", "PC14,PC15");
|
||||||
#endif
|
#endif
|
||||||
|
@ -154,17 +134,54 @@ clock_setup(void)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main entry point - called from armcm_boot.c:ResetHandler()
|
|
||||||
void
|
/****************************************************************
|
||||||
armcm_main(void)
|
* Bootloader
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
#define USB_BOOT_FLAG_ADDR (CONFIG_RAM_START + CONFIG_RAM_SIZE - 4096)
|
||||||
|
#define USB_BOOT_FLAG 0x55534220424f4f54 // "USB BOOT"
|
||||||
|
|
||||||
|
// Flag that bootloader is desired and reboot
|
||||||
|
static void
|
||||||
|
usb_reboot_for_dfu_bootloader(void)
|
||||||
{
|
{
|
||||||
if (CONFIG_USBSERIAL && *(uint64_t*)USB_BOOT_FLAG_ADDR == USB_BOOT_FLAG) {
|
irq_disable();
|
||||||
|
// System DFU Bootloader
|
||||||
|
*(uint64_t*)USB_BOOT_FLAG_ADDR = USB_BOOT_FLAG;
|
||||||
|
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;
|
*(uint64_t*)USB_BOOT_FLAG_ADDR = 0;
|
||||||
uint32_t *sysbase = (uint32_t*)0x1fff0000;
|
uint32_t *sysbase = (uint32_t*)0x1fff0000;
|
||||||
asm volatile("mov sp, %0\n bx %1"
|
asm volatile("mov sp, %0\n bx %1"
|
||||||
: : "r"(sysbase[0]), "r"(sysbase[1]));
|
: : "r"(sysbase[0]), "r"(sysbase[1]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handle USB reboot requests
|
||||||
|
void
|
||||||
|
bootloader_request(void)
|
||||||
|
{
|
||||||
|
usb_reboot_for_dfu_bootloader();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************
|
||||||
|
* Startup
|
||||||
|
****************************************************************/
|
||||||
|
|
||||||
|
// Main entry point - called from armcm_boot.c:ResetHandler()
|
||||||
|
void
|
||||||
|
armcm_main(void)
|
||||||
|
{
|
||||||
|
check_usb_dfu_bootloader();
|
||||||
|
|
||||||
// Run SystemInit() and then restore VTOR
|
// Run SystemInit() and then restore VTOR
|
||||||
SystemInit();
|
SystemInit();
|
||||||
SCB->VTOR = (uint32_t)VectorTable;
|
SCB->VTOR = (uint32_t)VectorTable;
|
||||||
|
|
Loading…
Reference in New Issue