diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2019-10-26 17:11:04 -0400 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2019-10-26 17:11:04 -0400 |
commit | 5131ec5eb0ec4c6292ff57da2bfda0e522d67003 (patch) | |
tree | 03a0eb6ce1553ad1e3f335a30ad7746f196ffe1b /src | |
parent | 2ecc8d8f62b40c3b241d8091220fbe959d9b67ee (diff) | |
download | kutter-5131ec5eb0ec4c6292ff57da2bfda0e522d67003.tar.gz kutter-5131ec5eb0ec4c6292ff57da2bfda0e522d67003.tar.xz kutter-5131ec5eb0ec4c6292ff57da2bfda0e522d67003.zip |
stm32: Add support for flashing over usb on stm32f042
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'src')
-rw-r--r-- | src/stm32/Makefile | 1 | ||||
-rw-r--r-- | src/stm32/stm32f0.c | 15 |
2 files changed, 16 insertions, 0 deletions
diff --git a/src/stm32/Makefile b/src/stm32/Makefile index 3ff257a7..5d5a8408 100644 --- a/src/stm32/Makefile +++ b/src/stm32/Makefile @@ -49,6 +49,7 @@ $(OUT)klipper.bin: $(OUT)klipper.elf $(Q)$(OBJCOPY) -O binary $< $@ # Flash rules +FLASH_TYPE-$(CONFIG_MACH_STM32F0) := stm32f0 FLASH_TYPE-$(CONFIG_MACH_STM32F1) := stm32f1 FLASH_TYPE-$(CONFIG_MACH_STM32F4) := stm32f4 diff --git a/src/stm32/stm32f0.c b/src/stm32/stm32f0.c index 8f1361a3..26a3512c 100644 --- a/src/stm32/stm32f0.c +++ b/src/stm32/stm32f0.c @@ -6,6 +6,7 @@ #include "autoconf.h" // CONFIG_CLOCK_REF_8M #include "board/armcm_boot.h" // armcm_main +#include "board/irq.h" // irq_disable #include "command.h" // DECL_CONSTANT_STR #include "internal.h" // enable_pclock #include "sched.h" // sched_main @@ -86,10 +87,16 @@ gpio_peripheral(uint32_t gpio, uint32_t mode, int pullup) regs->OSPEEDR = (regs->OSPEEDR & ~m_msk) | (0x02 << m_shift); } +#define USB_BOOT_FLAG_ADDR (CONFIG_RAM_START + CONFIG_RAM_SIZE - 1024) +#define USB_BOOT_FLAG 0x55534220424f4f54 // "USB BOOT" + // Handle USB reboot requests void usb_request_bootloader(void) { + irq_disable(); + *(uint64_t*)USB_BOOT_FLAG_ADDR = USB_BOOT_FLAG; + NVIC_SystemReset(); } #if CONFIG_CLOCK_REF_8M @@ -153,6 +160,14 @@ hsi48_setup(void) void armcm_main(void) { + if (CONFIG_USBSERIAL && CONFIG_MACH_STM32F042 + && *(uint64_t*)USB_BOOT_FLAG_ADDR == USB_BOOT_FLAG) { + *(uint64_t*)USB_BOOT_FLAG_ADDR = 0; + uint32_t *sysbase = (uint32_t*)0x1fffc400; + asm volatile("mov sp, %0\n bx %1" + : : "r"(sysbase[0]), "r"(sysbase[1])); + } + SystemInit(); // Set flash latency |