blob: d53e501789854b8fec076354baf2f0d3d0e4e4b0 [file] [log] [blame]
/*
* Copyright (c) 2022 Carlo Caione <ccaione@baylibre.com>
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/pm/pm.h>
#include <zephyr/pm/policy.h>
#include <zephyr/arch/common/pm_s2ram.h>
#include <hal/nrf_power.h>
#include <hal/nrf_regulators.h>
#include <hal/nrf_gpio.h>
static int system_off(void)
{
nrf_regulators_system_off(NRF_REGULATORS);
/*
* We should never reach this point if the system is powered off. If we
* do, return -EBUSY.
*/
return -EBUSY;
}
static void do_suspend(void)
{
int ret;
/*
* Save the CPU context (including the return address),set the SRAM
* marker and power off the system.
*/
ret = arch_pm_s2ram_suspend(system_off);
/*
* XXX: On resuming or error we return exactly *HERE*
*/
if (ret != 0) {
printk("Something went wrong during suspend");
}
}
void main(void)
{
printk("S2RAM demo (%s)\n", CONFIG_BOARD);
/*
* Enable wake-up button and LED1
*/
nrf_gpio_cfg_input(23, NRF_GPIO_PIN_PULLUP);
nrf_gpio_cfg_sense_set(23, NRF_GPIO_PIN_SENSE_LOW);
nrf_gpio_cfg_output(28);
/*
* Sleep enough time to trigger S2RAM
*/
while (true) {
k_msleep(1000);
}
}
void pm_state_set(enum pm_state state, uint8_t substate_id)
{
if (state != PM_STATE_SUSPEND_TO_RAM) {
return;
}
do_suspend();
}
void pm_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
if (state != PM_STATE_SUSPEND_TO_RAM) {
return;
}
/*
* Turn the LED3 on
*/
nrf_gpio_cfg_output(30);
/*
* XXX: Read the README.rst
*
* This is not a fully functional test. To have the kernel back in a
* fully functional state, here we should restore all the peripherals
* of the platforms that will not be restored by the PM subsystem (like
* NVIC, PMU, RTC, etc...). We are still missing the framework and code
* for that, so for now we stop here.
*/
irq_unlock(0);
while (true) {
/* stop here */
}
}