blob: 83ae6206648e7041e114c85f19716f94431f1286 [file] [log] [blame]
/*
* Copyright (c) 2019 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "retained.h"
#include <inttypes.h>
#include <stdio.h>
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/kernel.h>
#include <zephyr/pm/device.h>
#include <zephyr/sys/poweroff.h>
#include <zephyr/sys/util.h>
static const struct gpio_dt_spec sw0 = GPIO_DT_SPEC_GET(DT_ALIAS(sw0), gpios);
int main(void)
{
int rc;
const struct device *const cons = DEVICE_DT_GET(DT_CHOSEN(zephyr_console));
if (!device_is_ready(cons)) {
printf("%s: device not ready.\n", cons->name);
return 0;
}
printf("\n%s system off demo\n", CONFIG_BOARD);
if (IS_ENABLED(CONFIG_APP_RETENTION)) {
bool retained_ok = retained_validate();
/* Increment for this boot attempt and update. */
retained.boots += 1;
retained_update();
printf("Retained data: %s\n", retained_ok ? "valid" : "INVALID");
printf("Boot count: %u\n", retained.boots);
printf("Off count: %u\n", retained.off_count);
printf("Active Ticks: %" PRIu64 "\n", retained.uptime_sum);
} else {
printf("Retained data not supported\n");
}
/* configure sw0 as input, interrupt as level active to allow wake-up */
rc = gpio_pin_configure_dt(&sw0, GPIO_INPUT);
if (rc < 0) {
printf("Could not configure sw0 GPIO (%d)\n", rc);
return 0;
}
rc = gpio_pin_interrupt_configure_dt(&sw0, GPIO_INT_LEVEL_ACTIVE);
if (rc < 0) {
printf("Could not configure sw0 GPIO interrupt (%d)\n", rc);
return 0;
}
printf("Entering system off; press sw0 to restart\n");
rc = pm_device_action_run(cons, PM_DEVICE_ACTION_SUSPEND);
if (rc < 0) {
printf("Could not suspend console (%d)\n", rc);
return 0;
}
if (IS_ENABLED(CONFIG_APP_RETENTION)) {
/* Update the retained state */
retained.off_count += 1;
retained_update();
}
sys_poweroff();
return 0;
}