soc: nordic: poweroff: add retention management
RAM retention is disabled for all RAM blocks before entering System OFF to achieve lowest power consumption. RAM retention can still be enabled using retained_mem driver. Signed-off-by: Nikodem Kastelik <nikodem.kastelik@nordicsemi.no>
This commit is contained in:
parent
7e84571dcd
commit
74423027de
1 changed files with 38 additions and 0 deletions
|
@ -5,6 +5,7 @@
|
|||
|
||||
#include <zephyr/sys/poweroff.h>
|
||||
#include <zephyr/toolchain.h>
|
||||
#include <zephyr/drivers/retained_mem/nrf_retained_mem.h>
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_NRF51X) || defined(CONFIG_SOC_SERIES_NRF52X)
|
||||
#include <hal/nrf_power.h>
|
||||
|
@ -17,8 +18,45 @@
|
|||
#include <helpers/nrfx_reset_reason.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_HAS_NORDIC_RAM_CTRL)
|
||||
#include <helpers/nrfx_ram_ctrl.h>
|
||||
#endif
|
||||
|
||||
void z_sys_poweroff(void)
|
||||
{
|
||||
#if defined(CONFIG_HAS_NORDIC_RAM_CTRL)
|
||||
uint8_t *ram_start;
|
||||
size_t ram_size;
|
||||
|
||||
#if defined(NRF_MEMORY_RAM_BASE)
|
||||
ram_start = (uint8_t *)NRF_MEMORY_RAM_BASE;
|
||||
#else
|
||||
ram_start = (uint8_t *)NRF_MEMORY_RAM0_BASE;
|
||||
#endif
|
||||
|
||||
ram_size = 0;
|
||||
#if defined(NRF_MEMORY_RAM_SIZE)
|
||||
ram_size += NRF_MEMORY_RAM_SIZE;
|
||||
#endif
|
||||
#if defined(NRF_MEMORY_RAM0_SIZE)
|
||||
ram_size += NRF_MEMORY_RAM0_SIZE;
|
||||
#endif
|
||||
#if defined(NRF_MEMORY_RAM1_SIZE)
|
||||
ram_size += NRF_MEMORY_RAM1_SIZE;
|
||||
#endif
|
||||
#if defined(NRF_MEMORY_RAM2_SIZE)
|
||||
ram_size += NRF_MEMORY_RAM2_SIZE;
|
||||
#endif
|
||||
|
||||
/* Disable retention for all memory blocks */
|
||||
nrfx_ram_ctrl_retention_enable_set(ram_start, ram_size, false);
|
||||
#endif /* defined(CONFIG_HAS_NORDIC_RAM_CTRL) */
|
||||
|
||||
#if defined(CONFIG_RETAINED_MEM_NRF_RAM_CTRL)
|
||||
/* Restore retention for retained_mem driver regions defined in devicetree */
|
||||
(void)z_nrf_retained_mem_retention_apply();
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SOC_SERIES_NRF54LX)
|
||||
nrfx_reset_reason_clear(UINT32_MAX);
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue