aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Ciesielski2012-10-22 14:45:44 -0700
committerJeff Ciesielski2012-10-22 14:45:44 -0700
commit94abf6e529a6ca3c9ed663113dedeef34e297661 (patch)
treeaa30e93588c5845d4ef04766c1a79b89ee7b8c96
parentdd5e797d6187a48ed944a5f34630f200e9fc8649 (diff)
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
-rw-r--r--lib/stm32/f1/vector.c19
1 files changed, 15 insertions, 4 deletions
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 <stdint.h>
/* 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 <stdint.h>
-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