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
+ {
65
+ uint32_t sysMemAddr = 0 ;
66
+ if (devSysMemAddr [0 ].devID == SYSMEM_ADDR_COMMON ) {
67
+ sysMemAddr = devSysMemAddr [0 ].sysMemAddr ;
68
+ } else {
69
+ uint32_t devId = LL_DBGMCU_GetDeviceID ();
70
+ for (uint32_t id = 0 ; devSysMemAddr [id ].devID != 0 ; id ++ ) {
71
+ if (devSysMemAddr [id ].devID == devId ) {
72
+ sysMemAddr = devSysMemAddr [id ].sysMemAddr ;
73
+ break ;
74
+ }
75
+ }
76
+ }
77
+ return sysMemAddr ;
78
+ }
79
+
80
+ /* Request to jump to system memory boot */
81
+ WEAK void jumpToBootloaderRequested (void )
82
+ {
83
+ enableBackupDomain ();
84
+ setBackupRegister (SYSBL_MAGIC_NUMBER_BKP_INDEX , SYSBL_MAGIC_NUMBER_BKP_VALUE );
85
+ NVIC_SystemReset ();
86
+ }
87
+
88
+ /* Jump to system memory boot from user application */
89
+ WEAK void jumpToBootloader (void )
90
+ {
91
+ enableBackupDomain ();
92
+ if (getBackupRegister (SYSBL_MAGIC_NUMBER_BKP_INDEX ) == SYSBL_MAGIC_NUMBER_BKP_VALUE ) {
93
+ setBackupRegister (SYSBL_MAGIC_NUMBER_BKP_INDEX , 0 );
94
+
95
+ #ifdef USBCON
96
+ USBD_reenumerate ();
97
+ #endif
98
+ void (* sysMemBootJump )(void );
99
+
100
+ /**
101
+ * Get system memory address
102
+ *
103
+ * Available in AN2606 document:
104
+ * Table xxx Bootloader device-dependent parameters
105
+ */
106
+ volatile uint32_t sysMem_addr = getSysMemAddr ();
107
+ if (sysMem_addr != 0 ) {
108
+ #ifdef __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH
109
+ /* Remap system Flash memory at address 0x00000000 */
110
+ __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH ();
111
+ #endif
112
+
113
+ /**
114
+ * Set jump memory location for system memory
115
+ * Use address with 4 bytes offset which specifies jump location
116
+ * where program starts
117
+ */
118
+ sysMemBootJump = (void (* )(void ))(* ((uint32_t * )(sysMem_addr + 4 )));
119
+
120
+ /**
121
+ * Set main stack pointer.
122
+ * This step must be done last otherwise local variables in this function
123
+ * don't have proper value since stack pointer is located on different position
124
+ *
125
+ * Set direct address location which specifies stack pointer in SRAM location
126
+ */
127
+ __set_MSP (* (uint32_t * )sysMem_addr );
128
+
129
+ /**
130
+ * Jump to set location
131
+ * This will start system memory execution
132
+ */
133
+ sysMemBootJump ();
134
+
135
+ while (1 );
136
+ }
137
+ }
138
+ }
139
+
140
+ /*
141
+ * Legacy maple bootloader support
142
+ */
6
143
#ifdef BL_LEGACY_LEAF
7
144
void dtr_togglingHook (uint8_t * buf , uint32_t * len )
8
145
{
@@ -17,6 +154,9 @@ void dtr_togglingHook(uint8_t *buf, uint32_t *len)
17
154
}
18
155
#endif /* BL_LEGACY_LEAF */
19
156
157
+ /*
158
+ * HID bootloader support
159
+ */
20
160
#ifdef BL_HID
21
161
void dtr_togglingHook (uint8_t * buf , uint32_t * len )
22
162
{
0 commit comments