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:
Nikodem Kastelik 2024-12-16 15:56:32 +01:00 committed by Benjamin Cabé
commit 74423027de

View file

@ -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