Skip to content

Commit 8784685

Browse files
committed
soc: arm: stm32: Add ROM bootloader support
Add jump to ROM bootloader for STM32 when bootmode is set via retention boot mode feature. Signed-off-by: Peter Johanson <[email protected]>
1 parent 6bb4cb5 commit 8784685

File tree

4 files changed

+77
-0
lines changed

4 files changed

+77
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Copyright (c) 2025 Peter Johanson
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
description: ST STM32 ROM Bootloader Details
5+
6+
compatible: "st,stm32-bootloader"
7+
8+
include: base.yaml
9+
10+
properties:
11+
reg:
12+
required: true

soc/st/stm32/Kconfig

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ config STM32_BACKUP_SRAM_INIT_PRIORITY
3838
help
3939
STM32 Backup SRAM device initialization priority.
4040

41+
config STM32_BOOTLOADER
42+
bool "STM32 Bootloader Support"
43+
depends on RETENTION_BOOT_MODE && DT_HAS_ST_STM32_BOOTLOADER_ENABLED
44+
help
45+
Enable support for jumping into the STM32 when the bootmode is set.
46+
4147
config STM32_ENABLE_DEBUG_SLEEP_STOP
4248
bool "Allow debugger attach in stop/sleep Mode"
4349
help

soc/st/stm32/common/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ endif()
1919
zephyr_sources_ifdef(CONFIG_STM32_BACKUP_SRAM stm32_backup_sram.c)
2020
zephyr_linker_sources_ifdef(CONFIG_STM32_BACKUP_SRAM SECTIONS stm32_backup_sram.ld)
2121

22+
zephyr_sources_ifdef(CONFIG_STM32_BOOTLOADER stm32_bootloader.c)
23+
2224
if (NOT CONFIG_DEBUG AND CONFIG_PM)
2325
zephyr_sources_ifdef(CONFIG_DT_HAS_SWJ_CONNECTOR_ENABLED pm_debug_swj.c)
2426
endif()
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright (c) 2020 Google LLC.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <soc.h>
8+
#include <zephyr/init.h>
9+
#include <zephyr/retention/retention.h>
10+
#include <zephyr/retention/bootmode.h>
11+
#include <stm32_ll_system.h>
12+
13+
static const uint32_t bootloader = DT_REG_ADDR(DT_INST(0, st_stm32_bootloader));
14+
static FUNC_NORETURN void jump_to_bootloader(void)
15+
{
16+
int i;
17+
void (*jmp)(void);
18+
19+
__disable_irq();
20+
21+
for (i = 0; i < ARRAY_SIZE(NVIC->ICER); i++) {
22+
NVIC->ICER[i] = 0xFFFFFFFF;
23+
NVIC->ICPR[i] = 0xFFFFFFFF;
24+
}
25+
26+
LL_SYSCFG_SetRemapMemory(LL_SYSCFG_REMAP_SYSTEMFLASH);
27+
28+
jmp = (void (*)(void))(void (*)(void))(*((uint32_t *)((bootloader + 4))));
29+
30+
/*
31+
* We need to clear a few things set by the Zephyr early startup code
32+
*/
33+
__set_CONTROL(0);
34+
#if !defined(CONFIG_CPU_CORTEX_M0)
35+
__set_BASEPRI(0);
36+
#endif
37+
38+
__set_MSP(*(uint32_t *)bootloader);
39+
40+
__enable_irq();
41+
42+
jmp();
43+
44+
CODE_UNREACHABLE;
45+
}
46+
47+
static int bootloader_check_boot_init(void)
48+
{
49+
if (bootmode_check(BOOT_MODE_TYPE_BOOTLOADER) > 0) {
50+
bootmode_clear();
51+
jump_to_bootloader();
52+
}
53+
54+
return 0;
55+
}
56+
57+
SYS_INIT(bootloader_check_boot_init, EARLY, 0);

0 commit comments

Comments
 (0)