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
+ {0x442 , 0x1FFFD800 },
27
+ #elif STM32F1xx
28
+ {0x412 , 0x1FFFF000 },
29
+ {0x410 , 0x1FFFF000 },
30
+ {0x414 , 0x1FFFF000 },
31
+ {0x420 , 0x1FFFF000 },
32
+ {0x428 , 0x1FFFF000 },
33
+ {0x418 , 0x1FFFB000 },
34
+ {0x430 , 0x1FFFE000 },
35
+ #elif STM32F2xx
36
+ {0x411 , 0x1FFF0000 },
37
+ #elif STM32F3xx
38
+ {SYSMEM_ADDR_COMMON , 0x1FFFD800 },
39
+ #elif STM32F4xx
40
+ {SYSMEM_ADDR_COMMON , 0x1FFF0000 },
41
+ #elif STM32F7xx
42
+ {SYSMEM_ADDR_COMMON , 0x1FF00000 },
43
+ #elif STM32G0xx
44
+ {SYSMEM_ADDR_COMMON , 0x1FFF0000 },
45
+ #elif STM32G4xx
46
+ {SYSMEM_ADDR_COMMON , 0x1FFF0000 },
47
+ #elif STM32H7xx
48
+ {0x450 , 0x1FF00000 },
49
+ #elif STM32L0xx
50
+ {SYSMEM_ADDR_COMMON , 0x1FF00000 },
51
+ #elif STM32L1xx
52
+ {SYSMEM_ADDR_COMMON , 0x1FF00000 },
53
+ #elif STM32L4xx
54
+ {SYSMEM_ADDR_COMMON , 0x1FFF0000 },
55
+ #elif STM32WBxx
56
+ {SYSMEM_ADDR_COMMON , 0x1FFF0000 },
57
+ #else
58
+ #warning "No system memory address for this serie!"
59
+ #endif
60
+ {0x0000 , 0x00000000 }
61
+ };
62
+
63
+ uint32_t getSysMemAddr (void ) {
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
+ if (sysMem_addr != 0 ) {
107
+ #ifdef __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH
108
+ /* Remap system Flash memory at address 0x00000000 */
109
+ __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH ();
110
+ #endif
111
+
112
+ /**
113
+ * Set jump memory location for system memory
114
+ * Use address with 4 bytes offset which specifies jump location
115
+ * where program starts
116
+ */
117
+ sysMemBootJump = (void (* )(void ))(* ((uint32_t * )(sysMem_addr + 4 )));
118
+
119
+ /**
120
+ * Set main stack pointer.
121
+ * This step must be done last otherwise local variables in this function
122
+ * don't have proper value since stack pointer is located on different position
123
+ *
124
+ * Set direct address location which specifies stack pointer in SRAM location
125
+ */
126
+ __set_MSP (* (uint32_t * )sysMem_addr );
127
+
128
+ /**
129
+ * Jump to set location
130
+ * This will start system memory execution
131
+ */
132
+ sysMemBootJump ();
133
+
134
+ while (1 );
135
+ }
136
+ }
137
+ }
138
+
139
+ /*
140
+ * Legacy maple bootloader support
141
+ */
6
142
#ifdef BL_LEGACY_LEAF
7
143
void dtr_togglingHook (uint8_t * buf , uint32_t * len )
8
144
{
@@ -17,6 +153,9 @@ void dtr_togglingHook(uint8_t *buf, uint32_t *len)
17
153
}
18
154
#endif /* BL_LEGACY_LEAF */
19
155
156
+ /*
157
+ * HID bootloader support
158
+ */
20
159
#ifdef BL_HID
21
160
void dtr_togglingHook (uint8_t * buf , uint32_t * len )
22
161
{
0 commit comments