@@ -40,9 +40,26 @@ typedef struct {
4040 uint32_t CTRL ;
4141} _mpu_context_t ;
4242
43+ typedef struct {
44+ uint32_t ICSR ;
45+ uint32_t VTOR ;
46+ uint32_t AIRCR ;
47+ uint32_t SCR ;
48+ uint32_t CCR ;
49+ uint32_t SHPR [12U ];
50+ uint32_t SHCSR ;
51+ uint32_t CFSR ;
52+ uint32_t HFSR ;
53+ uint32_t DFSR ;
54+ uint32_t MMFAR ;
55+ uint32_t BFAR ;
56+ uint32_t AFSR ;
57+ } _scb_context_t ;
58+
4359struct backup {
4460 _nvic_context_t nvic_context ;
4561 _mpu_context_t mpu_context ;
62+ _scb_context_t scb_context ;
4663};
4764
4865static __noinit struct backup backup_data ;
@@ -107,10 +124,45 @@ static void nvic_resume(_nvic_context_t *backup)
107124 memcpy ((uint32_t * )NVIC -> IPR , backup -> IPR , sizeof (NVIC -> IPR ));
108125}
109126
127+ static void scb_suspend (_scb_context_t * backup )
128+ {
129+ backup -> ICSR = SCB -> ICSR ;
130+ backup -> VTOR = SCB -> VTOR ;
131+ backup -> AIRCR = SCB -> AIRCR ;
132+ backup -> SCR = SCB -> SCR ;
133+ backup -> CCR = SCB -> CCR ;
134+ memcpy (backup -> SHPR , (uint32_t * )SCB -> SHPR , sizeof (SCB -> SHPR ));
135+ backup -> SHCSR = SCB -> SHCSR ;
136+ backup -> CFSR = SCB -> CFSR ;
137+ backup -> HFSR = SCB -> HFSR ;
138+ backup -> DFSR = SCB -> DFSR ;
139+ backup -> MMFAR = SCB -> MMFAR ;
140+ backup -> BFAR = SCB -> BFAR ;
141+ backup -> AFSR = SCB -> AFSR ;
142+ }
143+
144+ static void scb_resume (_scb_context_t * backup )
145+ {
146+ SCB -> ICSR = backup -> ICSR ;
147+ SCB -> VTOR = backup -> VTOR ;
148+ SCB -> AIRCR = backup -> AIRCR ;
149+ SCB -> SCR = backup -> SCR ;
150+ SCB -> CCR = backup -> CCR ;
151+ memcpy ((uint32_t * )SCB -> SHPR , backup -> SHPR , sizeof (SCB -> SHPR ));
152+ SCB -> SHCSR = backup -> SHCSR ;
153+ SCB -> CFSR = backup -> CFSR ;
154+ SCB -> HFSR = backup -> HFSR ;
155+ SCB -> DFSR = backup -> DFSR ;
156+ SCB -> MMFAR = backup -> MMFAR ;
157+ SCB -> BFAR = backup -> BFAR ;
158+ SCB -> AFSR = backup -> AFSR ;
159+ }
160+
110161int soc_s2ram_suspend (pm_s2ram_system_off_fn_t system_off )
111162{
112163 int ret ;
113164
165+ scb_suspend (& backup_data .scb_context );
114166 nvic_suspend (& backup_data .nvic_context );
115167 mpu_suspend (& backup_data .mpu_context );
116168 ret = arch_pm_s2ram_suspend (system_off );
@@ -120,7 +172,7 @@ int soc_s2ram_suspend(pm_s2ram_system_off_fn_t system_off)
120172
121173 mpu_resume (& backup_data .mpu_context );
122174 nvic_resume (& backup_data .nvic_context );
123-
175+ scb_resume ( & backup_data . scb_context );
124176 return ret ;
125177}
126178
0 commit comments