22
33#include "stm32_def.h"
44#include "backup.h"
5+ #include "stm32yyxx_ll_system.h"
6+ #include "usbd_if.h"
57
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+ */
6146#ifdef BL_LEGACY_LEAF
7147void dtr_togglingHook (uint8_t * buf , uint32_t * len )
8148{
@@ -17,6 +157,9 @@ void dtr_togglingHook(uint8_t *buf, uint32_t *len)
17157}
18158#endif /* BL_LEGACY_LEAF */
19159
160+ /*
161+ * HID bootloader support
162+ */
20163#ifdef BL_HID
21164void dtr_togglingHook (uint8_t * buf , uint32_t * len )
22165{
0 commit comments