!795 低功耗增加idle选项

Merge pull request !795 from zhushengle/pm
This commit is contained in:
openharmony_ci 2022-08-23 13:06:03 +00:00 committed by Gitee
commit b38f135242
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
3 changed files with 33 additions and 2 deletions

View File

@ -129,7 +129,8 @@ STATIC BOOL OsPmTickTimerStop(LosPmCB *pm)
#endif #endif
LosPmTickTimer *tickTimer = pm->tickTimer; LosPmTickTimer *tickTimer = pm->tickTimer;
if ((tickTimer == NULL) || (tickTimer->tickLock == NULL)) { if ((tickTimer == NULL) || (tickTimer->tickLock == NULL) ||
(pm->pmMode == LOS_SYS_NORMAL_SLEEP)) {
return FALSE; return FALSE;
} }
@ -167,7 +168,6 @@ STATIC VOID OsPmCpuResume(LosPmCB *pm)
STATIC VOID OsPmCpuSuspend(LosPmCB *pm) STATIC VOID OsPmCpuSuspend(LosPmCB *pm)
{ {
/* cpu enter low power mode */ /* cpu enter low power mode */
LOS_ASSERT(pm->sysctrl != NULL);
if (pm->sysMode == LOS_SYS_NORMAL_SLEEP) { if (pm->sysMode == LOS_SYS_NORMAL_SLEEP) {
pm->sysctrl->normalSuspend(); pm->sysctrl->normalSuspend();
@ -226,6 +226,8 @@ STATIC UINT32 OsPmSuspendCheck(LosPmCB *pm, Suspend *sysSuspendEarly, Suspend *d
return LOS_NOK; return LOS_NOK;
} }
LOS_ASSERT(pm->sysctrl != NULL);
pm->isWake = FALSE; pm->isWake = FALSE;
*mode = pm->sysMode; *mode = pm->sysMode;
*sysSuspendEarly = pm->sysctrl->early; *sysSuspendEarly = pm->sysctrl->early;
@ -260,6 +262,10 @@ STATIC UINT32 OsPmSuspendSleep(LosPmCB *pm)
goto EXIT; goto EXIT;
} }
if (pm->sysctrl->suspendCheck != NULL) {
pm->sysctrl->suspendCheck(mode);
}
tickTimerStop = OsPmTickTimerStop(pm); tickTimerStop = OsPmTickTimerStop(pm);
if (!tickTimerStop) { if (!tickTimerStop) {
OsSchedResetSchedResponseTime(0); OsSchedResetSchedResponseTime(0);
@ -283,6 +289,9 @@ EXIT:
STATIC VOID OsPmNormalSleep(VOID) STATIC VOID OsPmNormalSleep(VOID)
{ {
#if (LOSCFG_KERNEL_PM_IDLE == 1)
(VOID)LOS_PmSuspend(0);
#else
UINT32 intSave; UINT32 intSave;
LosPmCB *pm = &g_pmCB; LosPmCB *pm = &g_pmCB;
@ -293,6 +302,7 @@ STATIC VOID OsPmNormalSleep(VOID)
OsPmCpuResume(pm); OsPmCpuResume(pm);
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
#endif
} }
STATIC UINT32 OsPmDeviceRegister(LosPmCB *pm, LosPmDevice *device) STATIC UINT32 OsPmDeviceRegister(LosPmCB *pm, LosPmDevice *device)
@ -343,6 +353,9 @@ STATIC UINT32 OsPmSysctrlRegister(LosPmCB *pm, LosPmSysctrl *sysctrl)
if (sysctrl->late != NULL) { if (sysctrl->late != NULL) {
pm->sysctrl->late = sysctrl->late; pm->sysctrl->late = sysctrl->late;
} }
if (sysctrl->suspendCheck != NULL) {
pm->sysctrl->suspendCheck = sysctrl->suspendCheck;
}
if (sysctrl->normalSuspend != NULL) { if (sysctrl->normalSuspend != NULL) {
pm->sysctrl->normalSuspend = sysctrl->normalSuspend; pm->sysctrl->normalSuspend = sysctrl->normalSuspend;
} }

View File

@ -165,6 +165,8 @@ typedef struct {
* Unlocked task scheduling. * Unlocked task scheduling.
*/ */
VOID (*late)(UINT32 mode); VOID (*late)(UINT32 mode);
/* Final check before low-power consumption. */
VOID (*suspendCheck)(UINT32 mode);
/* The system enters the Normal sleep mode. /* The system enters the Normal sleep mode.
* In normal mode, the value cannot be NULL. * In normal mode, the value cannot be NULL.
*/ */

View File

@ -663,6 +663,22 @@ extern UINT8 *m_aucSysMem0;
#define LOSCFG_KERNEL_SIGNAL 0 #define LOSCFG_KERNEL_SIGNAL 0
#endif #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 #ifdef __cplusplus
#if __cplusplus #if __cplusplus
} }