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 }