diff --git a/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s b/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s index 38b4513..12a3f39 100644 --- a/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s +++ b/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s @@ -98,6 +98,13 @@ #define CRT0_CALL_DESTRUCTORS TRUE #endif +/** + * @brief Magic number for jumping to bootloader. + */ +#if !defined(MAGIC_BOOTLOADER_NUMBER) || defined(__DOXYGEN__) +#define MAGIC_BOOTLOADER_NUMBER 0xDEADBEEF +#endif + /*===========================================================================*/ /* Code section. */ /*===========================================================================*/ @@ -117,6 +124,17 @@ .thumb_func .global Reset_Handler Reset_Handler: + +#ifdef BOOTLOADER_ADDRESS + /* jump to bootloader code */ + ldr r0, =__ram0_end__-4 + ldr r1, =MAGIC_BOOTLOADER_NUMBER + ldr r2, [r0, #0] + str r0, [r0, #0] /* erase stored magic */ + cmp r2, r1 + beq Bootloader_Jump +#endif /* BOOTLOADER_ADDRESS */ + /* Interrupts are globally masked initially.*/ cpsid i @@ -230,6 +248,21 @@ endfiniloop: ldr r1, =__default_exit bx r1 +#ifdef BOOTLOADER_ADDRESS +/* + * Jump-to-bootloader function. + */ + + .align 2 + .thumb_func +Bootloader_Jump: + ldr r0, =BOOTLOADER_ADDRESS + ldr r1, [r0, #0] + mov sp, r1 + ldr r0, [r0, #4] + bx r0 +#endif /* BOOTLOADER_ADDRESS */ + #endif /** @} */ diff --git a/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s b/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s index fcfa4de..2d560da 100644 --- a/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s +++ b/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s @@ -133,6 +133,13 @@ #define CRT0_CPACR_INIT 0x00F00000 #endif +/** + * @brief Magic number for jumping to bootloader. + */ +#if !defined(MAGIC_BOOTLOADER_NUMBER) || defined(__DOXYGEN__) +#define MAGIC_BOOTLOADER_NUMBER 0xDEADBEEF +#endif + /*===========================================================================*/ /* Code section. */ /*===========================================================================*/ @@ -157,6 +164,16 @@ .thumb_func .global Reset_Handler Reset_Handler: +#ifdef BOOTLOADER_ADDRESS + /* jump to bootloader code */ + ldr r0, =__ram0_end__-4 + ldr r1, =MAGIC_BOOTLOADER_NUMBER + ldr r2, [r0, #0] + str r0, [r0, #0] /* erase stored magic */ + cmp r2, r1 + beq Bootloader_Jump +#endif /* BOOTLOADER_ADDRESS */ + /* Interrupts are globally masked initially.*/ cpsid i @@ -289,6 +306,21 @@ endfiniloop: /* Branching to the defined exit handler.*/ b __default_exit +#ifdef BOOTLOADER_ADDRESS +/* + * Jump-to-bootloader function. + */ + + .align 2 + .thumb_func +Bootloader_Jump: + ldr r0, =BOOTLOADER_ADDRESS + ldr r1, [r0, #0] + mov sp, r1 + ldr r0, [r0, #4] + bx r0 +#endif /* BOOTLOADER_ADDRESS */ + #endif /* !defined(__DOXYGEN__) */ /** @} */