]> git.gir.st - tmk_keyboard.git/blob - tmk_core/tool/chibios/ch-bootloader-jump.patch
Implement jump-to-bootloader.
[tmk_keyboard.git] / tmk_core / tool / chibios / ch-bootloader-jump.patch
1 diff --git a/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s b/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s
2 index 38b4513..12a3f39 100644
3 --- a/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s
4 +++ b/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s
5 @@ -98,6 +98,13 @@
6 #define CRT0_CALL_DESTRUCTORS TRUE
7 #endif
8
9 +/**
10 + * @brief Magic number for jumping to bootloader.
11 + */
12 +#if !defined(MAGIC_BOOTLOADER_NUMBER) || defined(__DOXYGEN__)
13 +#define MAGIC_BOOTLOADER_NUMBER 0xDEADBEEF
14 +#endif
15 +
16 /*===========================================================================*/
17 /* Code section. */
18 /*===========================================================================*/
19 @@ -117,6 +124,17 @@
20 .thumb_func
21 .global Reset_Handler
22 Reset_Handler:
23 +
24 +#ifdef BOOTLOADER_ADDRESS
25 + /* jump to bootloader code */
26 + ldr r0, =__ram0_end__-4
27 + ldr r1, =MAGIC_BOOTLOADER_NUMBER
28 + ldr r2, [r0, #0]
29 + str r0, [r0, #0] /* erase stored magic */
30 + cmp r2, r1
31 + beq Bootloader_Jump
32 +#endif /* BOOTLOADER_ADDRESS */
33 +
34 /* Interrupts are globally masked initially.*/
35 cpsid i
36
37 @@ -230,6 +248,21 @@ endfiniloop:
38 ldr r1, =__default_exit
39 bx r1
40
41 +#ifdef BOOTLOADER_ADDRESS
42 +/*
43 + * Jump-to-bootloader function.
44 + */
45 +
46 + .align 2
47 + .thumb_func
48 +Bootloader_Jump:
49 + ldr r0, =BOOTLOADER_ADDRESS
50 + ldr r1, [r0, #0]
51 + mov sp, r1
52 + ldr r0, [r0, #4]
53 + bx r0
54 +#endif /* BOOTLOADER_ADDRESS */
55 +
56 #endif
57
58 /** @} */
59 diff --git a/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s b/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s
60 index fcfa4de..2d560da 100644
61 --- a/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s
62 +++ b/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s
63 @@ -133,6 +133,13 @@
64 #define CRT0_CPACR_INIT 0x00F00000
65 #endif
66
67 +/**
68 + * @brief Magic number for jumping to bootloader.
69 + */
70 +#if !defined(MAGIC_BOOTLOADER_NUMBER) || defined(__DOXYGEN__)
71 +#define MAGIC_BOOTLOADER_NUMBER 0xDEADBEEF
72 +#endif
73 +
74 /*===========================================================================*/
75 /* Code section. */
76 /*===========================================================================*/
77 @@ -157,6 +164,16 @@
78 .thumb_func
79 .global Reset_Handler
80 Reset_Handler:
81 +#ifdef BOOTLOADER_ADDRESS
82 + /* jump to bootloader code */
83 + ldr r0, =__ram0_end__-4
84 + ldr r1, =MAGIC_BOOTLOADER_NUMBER
85 + ldr r2, [r0, #0]
86 + str r0, [r0, #0] /* erase stored magic */
87 + cmp r2, r1
88 + beq Bootloader_Jump
89 +#endif /* BOOTLOADER_ADDRESS */
90 +
91 /* Interrupts are globally masked initially.*/
92 cpsid i
93
94 @@ -289,6 +306,21 @@ endfiniloop:
95 /* Branching to the defined exit handler.*/
96 b __default_exit
97
98 +#ifdef BOOTLOADER_ADDRESS
99 +/*
100 + * Jump-to-bootloader function.
101 + */
102 +
103 + .align 2
104 + .thumb_func
105 +Bootloader_Jump:
106 + ldr r0, =BOOTLOADER_ADDRESS
107 + ldr r1, [r0, #0]
108 + mov sp, r1
109 + ldr r0, [r0, #4]
110 + bx r0
111 +#endif /* BOOTLOADER_ADDRESS */
112 +
113 #endif /* !defined(__DOXYGEN__) */
114
115 /** @} */
Imprint / Impressum