diff --git a/core/kernel_init.c b/core/kernel_init.c index 76b2694491..2516f72e11 100644 --- a/core/kernel_init.c +++ b/core/kernel_init.c @@ -28,6 +28,8 @@ #include "irq.h" #include "log.h" +#include "periph/pm.h" + #ifdef MODULE_SCHEDSTATISTICS #include "sched.h" #endif @@ -64,6 +66,7 @@ static void *idle_thread(void *arg) (void) arg; while (1) { + pm_set_lowest(); } return NULL; diff --git a/drivers/include/periph/pm.h b/drivers/include/periph/pm.h new file mode 100644 index 0000000000..ff3f355308 --- /dev/null +++ b/drivers/include/periph/pm.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2016 Kaspar Schleiser + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @defgroup drivers_periph_pm Power Management + * @ingroup drivers_periph + * @brief The kernels power management interface + * @{ + * + * The following functions *must* be available for every platform: + * + * pm_reboot() + * pm_off() + * + * @file + * @brief Power management interface + * + * @author Kaspar Schleiser + */ + +#ifndef PM_H_ +#define PM_H_ + +#include "assert.h" +#include "periph_cpu.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** + * @brief Reboot MCU + */ +void pm_reboot(void); + +/** + * @brief Turn off MCU completely + */ +void pm_off(void); + +/** + * @brief Switches the MCU to the lowest possible power mode + * + * This function will be called by the idle thread. + */ +void pm_set_lowest(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __PM_H_ */ +/** @} */ diff --git a/drivers/periph_common/pm.c b/drivers/periph_common/pm.c new file mode 100644 index 0000000000..afd31b741e --- /dev/null +++ b/drivers/periph_common/pm.c @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2016 Kaspar Schleiser + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup drivers_periph_pm + * @{ + * + * @file + * @brief Platform-independent power management fallback code + * + * @author Kaspar Schleiser + * + * @} + */ + +#include "irq.h" +#include "periph/pm.h" + +#define ENABLE_DEBUG (0) +#include "debug.h" + +void __attribute__((weak)) pm_set_lowest(void) {} + +void __attribute__((weak)) pm_off(void) +{ + irq_disable(); + while(1) {}; +}