From 94abf6e529a6ca3c9ed663113dedeef34e297661 Mon Sep 17 00:00:00 2001 From: Jeff Ciesielski Date: Mon, 22 Oct 2012 14:45:44 -0700 Subject: stm32/f1: Add user_reset_hook to reset_handler w/ jump_to_dfu preset This allows for pragramatic jumping to the DFU bootloader on CL devices, or could be used for things like CRC checking of the firmware before boot --- lib/stm32/f1/vector.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'lib/stm32/f1') diff --git a/lib/stm32/f1/vector.c b/lib/stm32/f1/vector.c index d660774..87fd655 100644 --- a/lib/stm32/f1/vector.c +++ b/lib/stm32/f1/vector.c @@ -18,7 +18,8 @@ */ #define WEAK __attribute__ ((weak)) - +#define NAKED __attribute__((naked)) +#include /* Symbols exported by the linker script(s): */ extern unsigned _data_loadaddr, _data, _edata, _ebss, _stack; @@ -191,10 +192,10 @@ void (*const vector_table[]) (void) = { otg_fs_isr, /* Addr: 0x0000_014C */ }; -#include -void reset_handler(void) +void WEAK user_reset_hook(void); + +void handle_dfu_bootloader(void) { - volatile unsigned *src, *dest; uint32_t reset_str = *((uint32_t *)0x2000FFF0); if (reset_str == 0xDEADBEEF) { @@ -204,8 +205,17 @@ void reset_handler(void) asm("ldr r0, [r0, #4]"); asm("bx r0"); } + +} + +void NAKED reset_handler(void) +{ + volatile unsigned *src, *dest; + __asm__("MSR msp, %0" : : "r"(&_stack)); + user_reset_hook(); + for (src = &_data_loadaddr, dest = &_data; dest < &_edata; src++, dest++) *dest = *src; @@ -226,6 +236,7 @@ void null_handler(void) /* Do nothing. */ } +#pragma weak user_reset_hook = handle_dfu_bootloader #pragma weak nmi_handler = null_handler #pragma weak hard_fault_handler = blocking_handler #pragma weak mem_manage_handler = blocking_handler -- cgit v1.2.3