2
2
3
3
#include "stm32_def.h"
4
4
#include "backup.h"
5
+ #include "stm32yyxx_ll_system.h"
6
+ #include "usbd_if.h"
5
7
8
+ /*
9
+ * STM32 built-in bootloader in system memory support
10
+ */
11
+ /* Private definitions to manage system memory address */
12
+ #define SYSMEM_ADDR_COMMON 0xFFF
13
+
14
+ typedef struct {
15
+ uint32_t devID ;
16
+ uint32_t sysMemAddr ;
17
+ } devSysMemAddr_str ;
18
+
19
+ devSysMemAddr_str devSysMemAddr [] = {
20
+ #ifdef STM32F0xx
21
+ {0x440 , 0x1FFFEC00 },
22
+ {0x444 , 0x1FFFEC00 },
23
+ {0x442 , 0x1FFFD800 },
24
+ {0x445 , 0x1FFFC400 },
25
+ {0x448 , 0x1FFFC800 },
26
+ #elif STM32F1xx
27
+ {0x412 , 0x1FFFF000 },
28
+ {0x410 , 0x1FFFF000 },
29
+ {0x414 , 0x1FFFF000 },
30
+ {0x420 , 0x1FFFF000 },
31
+ {0x428 , 0x1FFFF000 },
32
+ {0x418 , 0x1FFFB000 },
33
+ {0x430 , 0x1FFFE000 },
34
+ #elif STM32F2xx
35
+ {0x411 , 0x1FFF0000 },
36
+ #elif STM32F3xx
37
+ {SYSMEM_ADDR_COMMON , 0x1FFFD800 },
38
+ #elif STM32F4xx
39
+ {SYSMEM_ADDR_COMMON , 0x1FFF0000 },
40
+ #elif STM32F7xx
41
+ {SYSMEM_ADDR_COMMON , 0x1FF00000 },
42
+ #elif STM32G0xx
43
+ {SYSMEM_ADDR_COMMON , 0x1FFF0000 },
44
+ #elif STM32G4xx
45
+ {SYSMEM_ADDR_COMMON , 0x1FFF0000 },
46
+ #elif STM32H7xx
47
+ {0x450 , 0x1FF00000 },
48
+ #elif STM32L0xx
49
+ {SYSMEM_ADDR_COMMON , 0x1FF00000 },
50
+ #elif STM32L1xx
51
+ {SYSMEM_ADDR_COMMON , 0x1FF00000 },
52
+ #elif STM32L4xx
53
+ {SYSMEM_ADDR_COMMON , 0x1FFF0000 },
54
+ #elif STM32WBxx
55
+ {SYSMEM_ADDR_COMMON , 0x1FFF0000 },
56
+ #else
57
+ #warning "No system memory address for this serie!"
58
+ #endif
59
+ {0x0000 , 0x00000000 }
60
+ };
61
+
62
+ uint32_t getSysMemAddr (void )
63
+ {
64
+ uint32_t sysMemAddr = 0 ;
65
+ if (devSysMemAddr [0 ].devID == SYSMEM_ADDR_COMMON ) {
66
+ sysMemAddr = devSysMemAddr [0 ].sysMemAddr ;
67
+ } else {
68
+ uint32_t devId = LL_DBGMCU_GetDeviceID ();
69
+ for (uint32_t id = 0 ; devSysMemAddr [id ].devID != 0 ; id ++ ) {
70
+ if (devSysMemAddr [id ].devID == devId ) {
71
+ sysMemAddr = devSysMemAddr [id ].sysMemAddr ;
72
+ break ;
73
+ }
74
+ }
75
+ }
76
+ return sysMemAddr ;
77
+ }
78
+
79
+ /* Request to jump to system memory boot */
80
+ WEAK void jumpToBootloaderRequested (void )
81
+ {
82
+ enableBackupDomain ();
83
+ setBackupRegister (SYSBL_MAGIC_NUMBER_BKP_INDEX , SYSBL_MAGIC_NUMBER_BKP_VALUE );
84
+ NVIC_SystemReset ();
85
+ }
86
+
87
+ /* Jump to system memory boot from user application */
88
+ WEAK void jumpToBootloader (void )
89
+ {
90
+ enableBackupDomain ();
91
+ if (getBackupRegister (SYSBL_MAGIC_NUMBER_BKP_INDEX ) == SYSBL_MAGIC_NUMBER_BKP_VALUE ) {
92
+ setBackupRegister (SYSBL_MAGIC_NUMBER_BKP_INDEX , 0 );
93
+
94
+ #ifdef USBCON
95
+ USBD_reenumerate ();
96
+ #endif
97
+ void (* sysMemBootJump )(void );
98
+
99
+ /**
100
+ * Get system memory address
101
+ *
102
+ * Available in AN2606 document:
103
+ * Table xxx Bootloader device-dependent parameters
104
+ */
105
+ volatile uint32_t sysMem_addr = getSysMemAddr ();
106
+ /*
107
+ * If the system address is not not referenced in 'devSysMemAddr' array,
108
+ * does not do anything
109
+ */
110
+ if (sysMem_addr != 0 ) {
111
+ #ifdef __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH
112
+ /* Remap system Flash memory at address 0x00000000 */
113
+ __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH ();
114
+ #endif
115
+
116
+ /**
117
+ * Set jump memory location for system memory
118
+ * Use address with 4 bytes offset which specifies jump location
119
+ * where program starts
120
+ */
121
+ sysMemBootJump = (void (* )(void ))(* ((uint32_t * )(sysMem_addr + 4 )));
122
+
123
+ /**
124
+ * Set main stack pointer.
125
+ * This step must be done last otherwise local variables in this function
126
+ * don't have proper value since stack pointer is located on different position
127
+ *
128
+ * Set direct address location which specifies stack pointer in SRAM location
129
+ */
130
+ __set_MSP (* (uint32_t * )sysMem_addr );
131
+
132
+ /**
133
+ * Jump to set location
134
+ * This will start system memory execution
135
+ */
136
+ sysMemBootJump ();
137
+
138
+ while (1 );
139
+ }
140
+ }
141
+ }
142
+
143
+ /*
144
+ * Legacy maple bootloader support
145
+ */
6
146
#ifdef BL_LEGACY_LEAF
7
147
void dtr_togglingHook (uint8_t * buf , uint32_t * len )
8
148
{
@@ -17,6 +157,9 @@ void dtr_togglingHook(uint8_t *buf, uint32_t *len)
17
157
}
18
158
#endif /* BL_LEGACY_LEAF */
19
159
160
+ /*
161
+ * HID bootloader support
162
+ */
20
163
#ifdef BL_HID
21
164
void dtr_togglingHook (uint8_t * buf , uint32_t * len )
22
165
{
0 commit comments