diff options
Diffstat (limited to 'nuttx/arch/arm/src/stm32/stm32_idle.c')
-rw-r--r-- | nuttx/arch/arm/src/stm32/stm32_idle.c | 211 |
1 files changed, 0 insertions, 211 deletions
diff --git a/nuttx/arch/arm/src/stm32/stm32_idle.c b/nuttx/arch/arm/src/stm32/stm32_idle.c deleted file mode 100644 index 83a6808c5..000000000 --- a/nuttx/arch/arm/src/stm32/stm32_idle.c +++ /dev/null @@ -1,211 +0,0 @@ -/**************************************************************************** - * arch/arm/src/stm32/stm32_idle.c - * - * Copyright (C) 2011-2012 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt <gnutt@nuttx.org> - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include <arch/board/board.h> -#include <nuttx/config.h> - -#include <nuttx/arch.h> -#include <nuttx/power/pm.h> - -#include <arch/irq.h> - -#include "chip.h" -#include "stm32_pm.h" -#include "up_internal.h" - -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - -/* Does the board support an IDLE LED to indicate that the board is in the - * IDLE state? - */ - -#if defined(CONFIG_ARCH_LEDS) && defined(LED_IDLE) -# define BEGIN_IDLE() up_ledon(LED_IDLE) -# define END_IDLE() up_ledoff(LED_IDLE) -#else -# define BEGIN_IDLE() -# define END_IDLE() -#endif - -/**************************************************************************** - * Private Data - ****************************************************************************/ - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: up_idlepm - * - * Description: - * Perform IDLE state power management. - * - ****************************************************************************/ - -#ifdef CONFIG_PM -static void up_idlepm(void) -{ - static enum pm_state_e oldstate = PM_NORMAL; - enum pm_state_e newstate; - irqstate_t flags; - int ret; - - /* Decide, which power saving level can be obtained */ - - newstate = pm_checkstate(); - - /* Check for state changes */ - - if (newstate != oldstate) - { - flags = irqsave(); - - /* Perform board-specific, state-dependent logic here */ - - llvdbg("newstate= %d oldstate=%d\n", newstate, oldstate); - - /* Then force the global state change */ - - ret = pm_changestate(newstate); - if (ret < 0) - { - /* The new state change failed, revert to the preceding state */ - - (void)pm_changestate(oldstate); - } - else - { - /* Save the new state */ - - oldstate = newstate; - } - - /* MCU-specific power management logic */ - - switch (newstate) - { - case PM_NORMAL: - break; - - case PM_IDLE: - break; - - case PM_STANDBY: - stm32_pmstop(true); - break; - - case PM_SLEEP: - (void)stm32_pmstandby(); - break; - - default: - break; - } - - irqrestore(flags); - } -} -#else -# define up_idlepm() -#endif - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: up_idle - * - * Description: - * up_idle() is the logic that will be executed when their is no other - * ready-to-run task. This is processor idle time and will continue until - * some interrupt occurs to cause a context switch from the idle task. - * - * Processing in this state may be processor-specific. e.g., this is where - * power management operations might be performed. - * - ****************************************************************************/ - -void up_idle(void) -{ -#if defined(CONFIG_SUPPRESS_INTERRUPTS) || defined(CONFIG_SUPPRESS_TIMER_INTS) - /* If the system is idle and there are no timer interrupts, then process - * "fake" timer interrupts. Hopefully, something will wake up. - */ - - sched_process_timer(); -#else - - /* Perform IDLE mode power management */ - - up_idlepm(); - - /* Sleep until an interrupt occurs to save power. - * - * NOTE: There is an STM32F107 errata that is fixed by the following - * workaround: - * - * "2.17.11 Ethernet DMA not working after WFI/WFE instruction - * Description - * If a WFI/WFE instruction is executed to put the system in sleep mode - * while the Ethernet MAC master clock on the AHB bus matrix is ON and all - * remaining masters clocks are OFF, the Ethernet DMA will be not able to - * perform any AHB master accesses during sleep mode." - * - * Workaround - * Enable DMA1 or DMA2 clocks in the RCC_AHBENR register before - * executing the WFI/WFE instruction." - * - * Here the workaround is just to avoid SLEEP mode for the connectivity - * line parts if Ethernet is enabled. The errate recommends a more - * general solution: Enabling DMA1/2 clocking in stm32f10xx_rcc.c if the - * STM32107 Ethernet peripheral is enabled. - */ - -#if !defined(CONFIG_STM32_CONNECTIVITYLINE) || !defined(CONFIG_STM32_ETHMAC) - BEGIN_IDLE(); - asm("WFI"); - END_IDLE(); -#endif -#endif -} - |