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+ {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+ */
6143#ifdef BL_LEGACY_LEAF
7144void dtr_togglingHook (uint8_t * buf , uint32_t * len )
8145{
@@ -17,6 +154,9 @@ void dtr_togglingHook(uint8_t *buf, uint32_t *len)
17154}
18155#endif /* BL_LEGACY_LEAF */
19156
157+ /*
158+ * HID bootloader support
159+ */
20160#ifdef BL_HID
21161void dtr_togglingHook (uint8_t * buf , uint32_t * len )
22162{
0 commit comments