From e44d815d92d13b9c9858abac567226351e0c5483 Mon Sep 17 00:00:00 2001 From: Heesub Shin Date: Thu, 13 Jul 2017 15:13:50 +0900 Subject: [PATCH] s5j/pm: add missing callbacks for PM framework BSP should provide an implementation of up_idle() in order to use the PM framework that NuttX supports, but it is missing in S5J. This commit adds up_idle() and other additional callback implementation. However, this commit does not any functional differences at all, because PM callbacks are blank and doing nothing for now. Change-Id: Iced2074dd71afd545b6cf1ed74164e3cc525a019 Signed-off-by: Heesub Shin --- os/arch/arm/src/s5j/Make.defs | 4 +- os/arch/arm/src/s5j/s5j_idle.c | 167 +++++++++++++++++++++++++++++++++++++ os/arch/arm/src/s5j/s5j_pm.h | 9 ++ os/arch/arm/src/s5j/s5j_pmnormal.c | 74 ++++++++++++++++ 4 files changed, 252 insertions(+), 2 deletions(-) create mode 100644 os/arch/arm/src/s5j/s5j_idle.c create mode 100644 os/arch/arm/src/s5j/s5j_pmnormal.c diff --git a/os/arch/arm/src/s5j/Make.defs b/os/arch/arm/src/s5j/Make.defs index 9d326bd..afa6b82 100644 --- a/os/arch/arm/src/s5j/Make.defs +++ b/os/arch/arm/src/s5j/Make.defs @@ -95,7 +95,6 @@ CMN_CSRCS += arm_schedulesigaction.c arm_sigdeliver.c arm_syscall.c CMN_CSRCS += arm_unblocktask.c arm_undefinedinsn.c CMN_CSRCS += arm_copyarmstate.c CMN_CSRCS += up_checkstack.c -CMN_CSRCS += up_idle.c # Configuration dependent C files ifeq ($(CONFIG_ARMV7M_MPU),y) @@ -114,6 +113,7 @@ ifneq ($(CONFIG_SCHED_TICKLESS),y) CHIP_CSRCS += s5j_timerisr.c endif +CHIP_CSRCS += s5j_idle.c CHIP_CSRCS += s5j_boot.c s5j_irq.c CHIP_CSRCS += s5j_serial.c CHIP_CSRCS += s5j_mac.c @@ -165,7 +165,7 @@ endif ifeq ($(CONFIG_PM),y) CHIP_CSRCS += s5j_pminitialize.c -CHIP_CSRCS += s5j_pmstandby.c s5j_pmstop.c +CHIP_CSRCS += s5j_pmnormal.c s5j_pmstandby.c s5j_pmstop.c endif CHIP_CSRCS += s5j_clock.c diff --git a/os/arch/arm/src/s5j/s5j_idle.c b/os/arch/arm/src/s5j/s5j_idle.c new file mode 100644 index 0000000..0f2732f --- /dev/null +++ b/os/arch/arm/src/s5j/s5j_idle.c @@ -0,0 +1,167 @@ +/**************************************************************************** + * + * Copyright 2017 Samsung Electronics All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the License. + * + ****************************************************************************/ +/**************************************************************************** + * arch/arm/src/s5j/s5j_idle.c + * + * Copyright (C) 2011-2012, 2015-2016 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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 +#include + +#include +#include +#include + +#include + +#include "up_internal.h" +#include "s5j_pm.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ +#define PM_IDLE_DOMAIN 0 /* Revisit */ + +/**************************************************************************** + * 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(PM_IDLE_DOMAIN); + + /* Check for state changes */ + if (newstate != oldstate) { + flags = irqsave(); + + /* Then force the global state change */ + ret = pm_changestate(PM_IDLE_DOMAIN, newstate); + if (ret < 0) { + /* The new state change failed, revert to the preceding state */ + pm_changestate(PM_IDLE_DOMAIN, oldstate); + } else { + /* Save the new state */ + oldstate = newstate; + } + + /* MCU-specific power management logic */ + switch (newstate) { + case PM_NORMAL: + s5j_pmnormal(); + break; + + case PM_IDLE: + break; + + case PM_STANDBY: + s5j_pmstop(); + break; + + case PM_SLEEP: + s5j_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. */ + asm("WFI"); +#endif +} diff --git a/os/arch/arm/src/s5j/s5j_pm.h b/os/arch/arm/src/s5j/s5j_pm.h index ab7c868..eb855c0 100644 --- a/os/arch/arm/src/s5j/s5j_pm.h +++ b/os/arch/arm/src/s5j/s5j_pm.h @@ -80,6 +80,15 @@ extern "C" { ****************************************************************************/ /**************************************************************************** + * Name: s5j_pmnormal + * + * Description: + * Enter NORMAL mode. + * + ****************************************************************************/ +int s5j_pmnormal(void); + +/**************************************************************************** * Name: s5j_pmstop * * Description: diff --git a/os/arch/arm/src/s5j/s5j_pmnormal.c b/os/arch/arm/src/s5j/s5j_pmnormal.c new file mode 100644 index 0000000..db917ba --- /dev/null +++ b/os/arch/arm/src/s5j/s5j_pmnormal.c @@ -0,0 +1,74 @@ +/**************************************************************************** + * + * Copyright 2017 Samsung Electronics All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the License. + * + ****************************************************************************/ +/**************************************************************************** + * arch/arm/src/s5j/s5j_pmnormal.c + * + * Copyright (C) 2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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 + +#include "up_arch.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: s5j_pmnormal + * + * Description: + * Enter NORMAL mode. + * + ****************************************************************************/ +void s5j_pmnormal(void) +{ + +} -- 2.7.4