File tree Expand file tree Collapse file tree 3 files changed +47
-16
lines changed Expand file tree Collapse file tree 3 files changed +47
-16
lines changed Original file line number Diff line number Diff line change @@ -496,7 +496,8 @@ if(CONFIG_MCUBOOT_CLEANUP_ARM_CORE)
496
496
)
497
497
endif ()
498
498
499
- if (CONFIG_SOC_NRF54H20_PM_S2RAM_OVERRIDE)
499
+ if (CONFIG_SOC_EARLY_RESET_HOOK)
500
+ zephyr_library_sources(${BOOT_DIR} /zephyr/nrf54h20_custom_s2ram.S)
500
501
zephyr_library_sources(${BOOT_DIR} /zephyr/nrf54h20_custom_s2ram.c)
501
502
endif ()
502
503
Original file line number Diff line number Diff line change
1
+ /*
2
+ * Copyright (c) 2025, Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ /**
8
+ * @file
9
+ * @brief ARM Cortex-M suspend-to-RAM resume intermediary code (S2RAM)
10
+ */
11
+
12
+
13
+
14
+ /*
15
+ * resume or
16
+ * reboot reboot==T
17
+ *[S2RAM sleep]---------->[ boot (reset.S) ]---->[soc_early_reset_hook]---------->[regular boot]
18
+ * |
19
+ * | resume==T
20
+ * \/
21
+ * [jump to well-known]
22
+ * [ App reset vector ]
23
+ */
24
+
25
+
26
+
27
+ #include <zephyr/toolchain.h>
28
+ #include <zephyr/arch/cpu.h>
29
+
30
+ GTEXT(pm_s2ram_mark_check_and_mediate)
31
+
32
+ GTEXT(soc_early_reset_hook)
33
+ SECTION_FUNC(TEXT, soc_early_reset_hook)
34
+ #if DT_NODE_EXISTS(DT_NODELABEL(pm_s2ram_stack)) &&\
35
+ DT_NODE_HAS_COMPAT(DT_NODELABEL(pm_s2ram_stack), zephyr_memory_region)
36
+ ldr r0, =DT_REG_ADDR(DT_NODELABEL(pm_s2ram_stack)) + DT_REG_SIZE(DT_NODELABEL(pm_s2ram_stack))
37
+ #else
38
+ #error "The support of bridge for S2RAM resume requires dedicated small stack"
39
+ #endif
40
+ msr msp, r0
41
+ push {r0, lr}
42
+ bl pm_s2ram_mark_check_and_mediate
43
+ pop {r0, pc}
Original file line number Diff line number Diff line change @@ -45,17 +45,6 @@ void s2ram_designate_slot(uint8_t slot)
45
45
}
46
46
#endif
47
47
48
- int soc_s2ram_suspend (pm_s2ram_system_off_fn_t system_off )
49
- {
50
- (void )(system_off );
51
- return -1 ;
52
- }
53
-
54
- void pm_s2ram_mark_set (void )
55
- {
56
- /* empty */
57
- }
58
-
59
48
struct arm_vector_table {
60
49
uint32_t msp ;
61
50
uint32_t reset ;
@@ -66,13 +55,13 @@ struct arm_vector_table {
66
55
*/
67
56
#define APP_EXE_START_OFFSET 0x800 /* nRF54H20 */
68
57
69
- bool pm_s2ram_mark_check_and_clear (void )
58
+ void pm_s2ram_mark_check_and_mediate (void )
70
59
{
71
60
uint32_t reset_reason = nrf_resetinfo_resetreas_local_get (NRF_RESETINFO );
72
61
73
62
if (reset_reason != NRF_RESETINFO_RESETREAS_LOCAL_UNRETAINED_MASK ) {
74
63
/* Normal boot */
75
- return false ;
64
+ return ;
76
65
}
77
66
78
67
/* S2RAM resume expected, do doublecheck */
@@ -120,6 +109,4 @@ bool pm_s2ram_mark_check_and_clear(void)
120
109
121
110
resume_failed :
122
111
FIH_PANIC ;
123
-
124
- return true;
125
112
}
You can’t perform that action at this time.
0 commit comments