From 298a08fee365df01cffb03ac934fdf3d44d49344 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= Date: Wed, 7 Nov 2018 13:25:37 +0100 Subject: [PATCH 1/6] bench_pm: Helper application for testing pm behavior The application assists in measuring wake up delays and for measuring power consumption of different low power modes. --- bench_pm/Makefile | 13 ++ bench_pm/README.md | 43 ++++ .../dist/analogdiscovery2/bench_pm.dwf3work | Bin 0 -> 4500 bytes bench_pm/main.c | 208 ++++++++++++++++++ 4 files changed, 264 insertions(+) create mode 100644 bench_pm/Makefile create mode 100644 bench_pm/README.md create mode 100644 bench_pm/dist/analogdiscovery2/bench_pm.dwf3work create mode 100644 bench_pm/main.c diff --git a/bench_pm/Makefile b/bench_pm/Makefile new file mode 100644 index 0000000..f90503e --- /dev/null +++ b/bench_pm/Makefile @@ -0,0 +1,13 @@ +APPLICATION = bench_pm +BOARD ?= frdm-kw41z + +RIOTBASE ?= $(CURDIR)/../../RIOT +QUIET ?= 1 +CFLAGS += -DDEVELHELP + +FEATURES_OPTIONAL = periph_rtt periph_gpio_irq + +# Disable auto_init to avoid starting any extra services +DISABLE_MODULE += auto_init + +include $(RIOTBASE)/Makefile.include diff --git a/bench_pm/README.md b/bench_pm/README.md new file mode 100644 index 0000000..eeb5bbf --- /dev/null +++ b/bench_pm/README.md @@ -0,0 +1,43 @@ +Purpose +======= + +This project is used to provide a baseline for the power consumption of the +platform when no software is interfering with the low power modes. The +application is designed to be used as a test subject for measuring power +consumption and timing of low power modes. + +Hardware requirements +===================== + +The data collection relies on external measurement equipment. An oscilloscope, +or logic analyzer and a multimeter is required for any meaningful measurements. + +Test outputs +============ + +The test uses the board's LED0, LED1 pins as feedback from the application to +the logic analyzer to signal when a low power mode is exited. +The wake up request is triggered by UART RX activity, or a configurable GPIO pin. + +Set up +====== + +Connect the logic analyzer to trigger on the chosen GPIO wake pin (or UART RX +pin, if not using the GPIO), connect the LED0 pin to the logic analyzer as well. + +The LED0 pin will be asserted immediately when control returns to the main thread. +The LED1 pin is asserted by the ISR. + +Tested hardware +=============== + +The application is designed to run on the FRDM-KW41Z (or a custom R41Z board), +but some care has been taken to allow building for different platforms without +any major changes. + +Future work +=========== + +The logic analyzer requirement could be eliminated by creating a measurement +application which can run on a different board for driving the test and taking +measurements. diff --git a/bench_pm/dist/analogdiscovery2/bench_pm.dwf3work b/bench_pm/dist/analogdiscovery2/bench_pm.dwf3work new file mode 100644 index 0000000000000000000000000000000000000000..02e22c7fc5604e2068ac443d3f5feaca1dd261f2 GIT binary patch literal 4500 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 M>K%anKZNA}0~14bPXGV_ literal 0 HcmV?d00001 diff --git a/bench_pm/main.c b/bench_pm/main.c new file mode 100644 index 0000000..b99ca30 --- /dev/null +++ b/bench_pm/main.c @@ -0,0 +1,208 @@ +/* + * Copyright (C) 2017-2018 SKF AB + * Copyright (C) 2014 Freie UniversitÀt Berlin + * + * 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 tests + * @{ + * + * @file + * @brief Test for low power modes and wake up timings + * + * This test will switch to different low power modes and wait for wake events. + * + * @author Hauke Petersen + * + * @} + */ + +#include +#include + +#include "cpu.h" +#include "board.h" +#include "periph_conf.h" +#include "periph/rtt.h" +#ifdef MODULE_PM_LAYERED +#include "pm_layered.h" +#endif +#ifdef MODULE_PERIPH_GPIO_IRQ +#include "periph/gpio.h" +#endif +#ifdef MODULE_PERIPH_LLWU +/* Kinetis specific low leakage mode handling */ +#include "llwu.h" +#endif + +#ifndef ENABLE_DEBUG +/* Enabling debug prints will affect timing measurements */ +#define ENABLE_DEBUG (0) +#endif +#include "debug.h" + +#ifdef MODULE_PERIPH_RTT +#define PRINT_RTT() (printf("RTT: %" PRIu32 "\n", rtt_get_counter())) +#else +#define PRINT_RTT() +#endif + +#ifndef GPIO_WAKE_PIN +#if defined(BOARD_FRDM_KW41Z) +#define GPIO_WAKE_PIN GPIO_PIN(PORT_C, 4) /* FRDM-KW41Z -> SW3 */ +#elif defined(BOARD_FRDM_K22F) +#define GPIO_WAKE_PIN GPIO_PIN(PORT_C, 1) /* FRDM-K22F -> SW2 */ +#elif defined(BOARD_FRDM_K64F) +#define GPIO_WAKE_PIN GPIO_PIN(PORT_A, 4) /* FRDM-K64F -> SW3 */ +#elif defined(BOARD_SAMR21_XPRO) +#define GPIO_WAKE_PIN BTN0_PIN /* SAMR21-XPRO -> SW0 */ +#endif /* defined(BOARD_xxx) */ +#endif /* !defined(GPIO_WAKE_PIN) */ + +#ifndef LLWU_WAKE_PIN +#if defined(BOARD_FRDM_KW41Z) +#define LLWU_WAKE_PIN LLWU_WAKEUP_PIN_PTC4 +#elif defined(BOARD_FRDM_K22F) +#define LLWU_WAKE_PIN LLWU_WAKEUP_PIN_PTC1 +#elif defined(BOARD_FRDM_K64F) +#define LLWU_WAKE_PIN LLWU_WAKEUP_PIN_PTA4 +#endif +#endif /* LLWU_WAKE_PIN */ + +#ifndef TEST_PIN_ON +#define TEST_PIN_ON LED0_ON +#endif +#ifndef TEST_PIN_OFF +#define TEST_PIN_OFF LED0_OFF +#endif + +#ifndef TEST_ISR_PIN_ON +#ifdef LED1_ON +#define TEST_ISR_PIN_ON LED1_ON +#else +#define TEST_ISR_PIN_ON +#endif +#endif +#ifndef TEST_ISR_PIN_OFF +#ifdef LED1_OFF +#define TEST_ISR_PIN_OFF LED1_OFF +#else +#define TEST_ISR_PIN_OFF +#endif +#endif + +#ifdef MODULE_PERIPH_RTT +#define TICKS_TO_WAIT (10 * RTT_FREQUENCY) +#endif /* MODULE_PERIPH_RTT */ + +static volatile unsigned busy = 0; + +#ifdef MODULE_PERIPH_RTT +static void cb_rtt(void *arg) +{ + (void)arg; + TEST_ISR_PIN_ON; + DEBUG("RTT IRQ\n"); + + busy = 0; +} +#endif /* MODULE_PERIPH_RTT */ + +#ifdef MODULE_PERIPH_LLWU +static void cb_llwu(void *arg) +{ + (void)arg; + TEST_ISR_PIN_ON; + DEBUG("llwu pin\n"); + + busy = 0; +} +#endif /* MODULE_PERIPH_LLWU */ + +#ifdef MODULE_PERIPH_GPIO_IRQ +static void cb_gpio(void *arg) +{ + (void)arg; + TEST_ISR_PIN_ON; + DEBUG("gpio pin\n"); + + busy = 0; +} +#endif /* MODULE_PERIPH_GPIO_IRQ */ + +int main(void) +{ + TEST_PIN_ON; + puts("\nRIOT power consumption and wake timing test application"); + +#ifdef MODULE_PERIPH_LLWU + /* Kinetis specific */ + puts("Enable LLWU wake up from RTC"); + llwu_wakeup_module_enable(LLWU_WAKEUP_MODULE_RTC_ALARM); + puts("Enable LLWU IRQ on PTC4 (SW4) falling"); + gpio_init(GPIO_WAKE_PIN, GPIO_IN); + llwu_wakeup_pin_set(LLWU_WAKE_PIN, LLWU_WAKEUP_EDGE_FALLING, cb_llwu, NULL); +#endif /* MODULE_PERIPH_LLWU */ +#ifdef MODULE_PERIPH_GPIO_IRQ + puts("Enable GPIO IRQ on PTC4 (SW4) falling"); + int res = gpio_init_int(GPIO_WAKE_PIN, GPIO_IN_PU, GPIO_FALLING, cb_gpio, NULL); + if (res != 0) { + printf("!! gpio_init_int: %d\n", res); + } +#endif /* MODULE_PERIPH_GPIO_IRQ */ + +#ifdef MODULE_PERIPH_RTT + puts("Initializing the RTT driver"); + rtt_init(); +#endif /* MODULE_PERIPH_RTT */ + +#if ENABLE_CLKOUT + /* Kinetis specific, clock monitor via CLKOUT on pin PTB3 */ + puts("Enable CLKOUT on PTB3"); + PORTB->PCR[3] = PORT_PCR_MUX(4); + /* Select which clock to output */ + SIM->SOPT2 = (SIM->SOPT2 & ~SIM_SOPT2_CLKOUTSEL_MASK) | SIM_SOPT2_CLKOUTSEL(2); + /* Use a logic analyzer or oscilloscope to look at the signal */ +#endif + + while (1) { + PRINT_RTT(); + puts("Busy spin"); + { +#ifdef MODULE_PERIPH_RTT + uint32_t rtt_target = rtt_get_counter() + TICKS_TO_WAIT; + rtt_target &= RTT_MAX_VALUE; + rtt_set_alarm(rtt_target, cb_rtt, 0); +#endif /* MODULE_PERIPH_RTT */ + busy = 1; + TEST_PIN_OFF; + TEST_ISR_PIN_OFF; + while (busy) { + __asm__ volatile ("" ::: "memory"); + } + TEST_PIN_ON; + PRINT_RTT(); + } +#ifdef MODULE_PM_LAYERED + for (int k = PM_NUM_MODES; 0 <= k; --k) { +#ifdef MODULE_PERIPH_RTT + uint32_t rtt_target = rtt_get_counter() + TICKS_TO_WAIT; + rtt_target &= RTT_MAX_VALUE; + rtt_set_alarm(rtt_target, cb_rtt, 0); +#endif /* MODULE_PERIPH_RTT */ + PRINT_RTT(); + printf("pm_set(%d)\n", k); + TEST_PIN_OFF; + TEST_ISR_PIN_OFF; + pm_set((unsigned)k); + TEST_PIN_ON; + printf("wake from %d\n", k); + } +#endif + } + return 0; +} From 00643c7d7d34f1e6597e4b46c5a8ca73d43820ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= Date: Fri, 16 Nov 2018 12:33:14 +0100 Subject: [PATCH 2/6] fixup! bench_pm: Helper application for testing pm behavior --- bench_pm/Makefile | 2 +- bench_pm/main.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bench_pm/Makefile b/bench_pm/Makefile index f90503e..e1a602e 100644 --- a/bench_pm/Makefile +++ b/bench_pm/Makefile @@ -3,7 +3,7 @@ BOARD ?= frdm-kw41z RIOTBASE ?= $(CURDIR)/../../RIOT QUIET ?= 1 -CFLAGS += -DDEVELHELP +DEVELHELP ?= 1 FEATURES_OPTIONAL = periph_rtt periph_gpio_irq diff --git a/bench_pm/main.c b/bench_pm/main.c index b99ca30..8ac0622 100644 --- a/bench_pm/main.c +++ b/bench_pm/main.c @@ -16,7 +16,7 @@ * * This test will switch to different low power modes and wait for wake events. * - * @author Hauke Petersen + * @author Joakim NohlgÄrd * * @} */ From 9f088b0ba4f7a3483eb5c96c030780fac4edb7d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= Date: Tue, 20 Nov 2018 09:01:28 +0100 Subject: [PATCH 3/6] squash bench_pm Update configuration macros --- bench_pm/main.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/bench_pm/main.c b/bench_pm/main.c index 8ac0622..01705b9 100644 --- a/bench_pm/main.c +++ b/bench_pm/main.c @@ -52,26 +52,26 @@ #endif #ifndef GPIO_WAKE_PIN -#if defined(BOARD_FRDM_KW41Z) -#define GPIO_WAKE_PIN GPIO_PIN(PORT_C, 4) /* FRDM-KW41Z -> SW3 */ -#elif defined(BOARD_FRDM_K22F) -#define GPIO_WAKE_PIN GPIO_PIN(PORT_C, 1) /* FRDM-K22F -> SW2 */ -#elif defined(BOARD_FRDM_K64F) -#define GPIO_WAKE_PIN GPIO_PIN(PORT_A, 4) /* FRDM-K64F -> SW3 */ -#elif defined(BOARD_SAMR21_XPRO) -#define GPIO_WAKE_PIN BTN0_PIN /* SAMR21-XPRO -> SW0 */ -#endif /* defined(BOARD_xxx) */ -#endif /* !defined(GPIO_WAKE_PIN) */ +#ifdef BTN0_PIN +#define GPIO_WAKE_PIN BTN0_PIN +#else +#error Missing GPIO_WAKE_PIN configuration +#endif +#endif +#ifdef MODULE_PERIPH_LLWU +/* Platform specific configuration for testing Kinetis low leakage wake up module (LLWU) */ #ifndef LLWU_WAKE_PIN +/* This macro should correspond to the pin used in the GPIO_WAKE_PIN macro */ #if defined(BOARD_FRDM_KW41Z) #define LLWU_WAKE_PIN LLWU_WAKEUP_PIN_PTC4 #elif defined(BOARD_FRDM_K22F) #define LLWU_WAKE_PIN LLWU_WAKEUP_PIN_PTC1 #elif defined(BOARD_FRDM_K64F) -#define LLWU_WAKE_PIN LLWU_WAKEUP_PIN_PTA4 +#define LLWU_WAKE_PIN LLWU_WAKEUP_PIN_PTC6 #endif #endif /* LLWU_WAKE_PIN */ +#endif /* MODULE_PERIPH_LLWU */ #ifndef TEST_PIN_ON #define TEST_PIN_ON LED0_ON From 668e89ffc36dce9782c494e737231159a04faa38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= Date: Fri, 7 Dec 2018 09:40:13 +0100 Subject: [PATCH 4/6] bench_pm: conditionally define test pins --- bench_pm/main.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/bench_pm/main.c b/bench_pm/main.c index 01705b9..12c8f13 100644 --- a/bench_pm/main.c +++ b/bench_pm/main.c @@ -74,23 +74,21 @@ #endif /* MODULE_PERIPH_LLWU */ #ifndef TEST_PIN_ON -#define TEST_PIN_ON LED0_ON +#ifdef LED0_ON +#define TEST_PIN_ON LED0_ON +#define TEST_PIN_OFF LED0_OFF +#else +#define TEST_PIN_ON +#define TEST_PIN_OFF #endif -#ifndef TEST_PIN_OFF -#define TEST_PIN_OFF LED0_OFF #endif #ifndef TEST_ISR_PIN_ON #ifdef LED1_ON -#define TEST_ISR_PIN_ON LED1_ON +#define TEST_ISR_PIN_ON LED1_ON +#define TEST_ISR_PIN_OFF LED1_OFF #else #define TEST_ISR_PIN_ON -#endif -#endif -#ifndef TEST_ISR_PIN_OFF -#ifdef LED1_OFF -#define TEST_ISR_PIN_OFF LED1_OFF -#else #define TEST_ISR_PIN_OFF #endif #endif From 26a439dfd6b323bc9316ebfa7b9216f1a07f3cb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= Date: Fri, 7 Dec 2018 09:40:25 +0100 Subject: [PATCH 5/6] bench_pm: implement coma mode --- bench_pm/main.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/bench_pm/main.c b/bench_pm/main.c index 12c8f13..a5196dc 100644 --- a/bench_pm/main.c +++ b/bench_pm/main.c @@ -45,6 +45,15 @@ #endif #include "debug.h" +#if COMA_MODE +/* For testing deepest low power modes without any interference */ +#undef MODULE_PERIPH_GPIO_IRQ +#undef MODULE_PERIPH_RTT +#undef MODULE_PERIPH_LLWU +#undef LED0_ON +#undef LED1_ON +#endif + #ifdef MODULE_PERIPH_RTT #define PRINT_RTT() (printf("RTT: %" PRIu32 "\n", rtt_get_counter())) #else @@ -167,6 +176,14 @@ int main(void) /* Use a logic analyzer or oscilloscope to look at the signal */ #endif +#if COMA_MODE + puts("Coma mode, going to pm_set(0), not coming back"); + while (1) { + pm_set(0); + puts("woke up unexpectedly, going to pm_set(0)"); + } +#endif + while (1) { PRINT_RTT(); puts("Busy spin"); From ddcc6ab47348ab969017de695667ceb30547fd65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= Date: Fri, 7 Dec 2018 09:50:17 +0100 Subject: [PATCH 6/6] squash bench_pm: Clean up defines --- bench_pm/main.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/bench_pm/main.c b/bench_pm/main.c index a5196dc..53e7900 100644 --- a/bench_pm/main.c +++ b/bench_pm/main.c @@ -60,13 +60,15 @@ #define PRINT_RTT() #endif +#ifdef MODULE_PERIPH_GPIO_IRQ #ifndef GPIO_WAKE_PIN #ifdef BTN0_PIN #define GPIO_WAKE_PIN BTN0_PIN #else #error Missing GPIO_WAKE_PIN configuration -#endif -#endif +#endif /* BTN0_PIN */ +#endif /* GPIO_WAKE_PIN */ +#endif /* MODULE_PERIPH_GPIO_IRQ */ #ifdef MODULE_PERIPH_LLWU /* Platform specific configuration for testing Kinetis low leakage wake up module (LLWU) */ @@ -89,8 +91,8 @@ #else #define TEST_PIN_ON #define TEST_PIN_OFF -#endif -#endif +#endif /* LED0_ON */ +#endif /* TEST_PIN_ON */ #ifndef TEST_ISR_PIN_ON #ifdef LED1_ON @@ -99,8 +101,8 @@ #else #define TEST_ISR_PIN_ON #define TEST_ISR_PIN_OFF -#endif -#endif +#endif /* LED1_ON */ +#endif /* TEST_ISR_PIN_ON */ #ifdef MODULE_PERIPH_RTT #define TICKS_TO_WAIT (10 * RTT_FREQUENCY) @@ -154,6 +156,7 @@ int main(void) gpio_init(GPIO_WAKE_PIN, GPIO_IN); llwu_wakeup_pin_set(LLWU_WAKE_PIN, LLWU_WAKEUP_EDGE_FALLING, cb_llwu, NULL); #endif /* MODULE_PERIPH_LLWU */ + #ifdef MODULE_PERIPH_GPIO_IRQ puts("Enable GPIO IRQ on PTC4 (SW4) falling"); int res = gpio_init_int(GPIO_WAKE_PIN, GPIO_IN_PU, GPIO_FALLING, cb_gpio, NULL);