From 9add4b4b928b057d0589923525e6ac617607bfad Mon Sep 17 00:00:00 2001 From: zhushengle Date: Mon, 22 Aug 2022 17:04:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BD=8E=E5=8A=9F=E8=80=97=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0idle=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Close #I5N9J2 Signed-off-by: zhushengle Change-Id: I066ff415709145e585f1eb94e70263361d3d71af --- components/power/los_pm.c | 17 +++++++++++++++-- components/power/los_pm.h | 2 ++ kernel/include/los_config.h | 16 ++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/components/power/los_pm.c b/components/power/los_pm.c index 500d882b..2a691970 100644 --- a/components/power/los_pm.c +++ b/components/power/los_pm.c @@ -129,7 +129,8 @@ STATIC BOOL OsPmTickTimerStop(LosPmCB *pm) #endif LosPmTickTimer *tickTimer = pm->tickTimer; - if ((tickTimer == NULL) || (tickTimer->tickLock == NULL)) { + if ((tickTimer == NULL) || (tickTimer->tickLock == NULL) || + (pm->pmMode == LOS_SYS_NORMAL_SLEEP)) { return FALSE; } @@ -167,7 +168,6 @@ STATIC VOID OsPmCpuResume(LosPmCB *pm) STATIC VOID OsPmCpuSuspend(LosPmCB *pm) { /* cpu enter low power mode */ - LOS_ASSERT(pm->sysctrl != NULL); if (pm->sysMode == LOS_SYS_NORMAL_SLEEP) { pm->sysctrl->normalSuspend(); @@ -226,6 +226,8 @@ STATIC UINT32 OsPmSuspendCheck(LosPmCB *pm, Suspend *sysSuspendEarly, Suspend *d return LOS_NOK; } + LOS_ASSERT(pm->sysctrl != NULL); + pm->isWake = FALSE; *mode = pm->sysMode; *sysSuspendEarly = pm->sysctrl->early; @@ -260,6 +262,10 @@ STATIC UINT32 OsPmSuspendSleep(LosPmCB *pm) goto EXIT; } + if (pm->sysctrl->suspendCheck != NULL) { + pm->sysctrl->suspendCheck(mode); + } + tickTimerStop = OsPmTickTimerStop(pm); if (!tickTimerStop) { OsSchedResetSchedResponseTime(0); @@ -283,6 +289,9 @@ EXIT: STATIC VOID OsPmNormalSleep(VOID) { +#if (LOSCFG_KERNEL_PM_IDLE == 1) + (VOID)LOS_PmSuspend(0); +#else UINT32 intSave; LosPmCB *pm = &g_pmCB; @@ -293,6 +302,7 @@ STATIC VOID OsPmNormalSleep(VOID) OsPmCpuResume(pm); LOS_IntRestore(intSave); +#endif } STATIC UINT32 OsPmDeviceRegister(LosPmCB *pm, LosPmDevice *device) @@ -343,6 +353,9 @@ STATIC UINT32 OsPmSysctrlRegister(LosPmCB *pm, LosPmSysctrl *sysctrl) if (sysctrl->late != NULL) { pm->sysctrl->late = sysctrl->late; } + if (sysctrl->suspendCheck != NULL) { + pm->sysctrl->suspendCheck = sysctrl->suspendCheck; + } if (sysctrl->normalSuspend != NULL) { pm->sysctrl->normalSuspend = sysctrl->normalSuspend; } diff --git a/components/power/los_pm.h b/components/power/los_pm.h index ccaca6ee..aea1dfb7 100644 --- a/components/power/los_pm.h +++ b/components/power/los_pm.h @@ -165,6 +165,8 @@ typedef struct { * Unlocked task scheduling. */ VOID (*late)(UINT32 mode); + /* Final check before low-power consumption. */ + VOID (*suspendCheck)(UINT32 mode); /* The system enters the Normal sleep mode. * In normal mode, the value cannot be NULL. */ diff --git a/kernel/include/los_config.h b/kernel/include/los_config.h index 35db8d1e..fe418720 100644 --- a/kernel/include/los_config.h +++ b/kernel/include/los_config.h @@ -663,6 +663,22 @@ extern UINT8 *m_aucSysMem0; #define LOSCFG_KERNEL_SIGNAL 0 #endif +/** + * @ingroup los_config + * Configuration item to enable kernel power module. + */ +#ifndef LOSCFG_KERNEL_PM +#define LOSCFG_KERNEL_PM 0 +#endif + +/** + * @ingroup los_config + * Configuration item to enable kernel power module in idle task. + */ +#ifndef LOSCFG_KERNEL_PM_IDLE +#define LOSCFG_KERNEL_PM_IDLE 0 +#endif + #ifdef __cplusplus #if __cplusplus }