Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Kernel Liteos A
提交
b3489d49
K
Kernel Liteos A
项目概览
OpenHarmony
/
Kernel Liteos A
1 年多 前同步成功
通知
467
Star
414
Fork
55
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
4
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel Liteos A
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
4
Issue
4
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
b3489d49
编写于
11月 30, 2021
作者:
O
openharmony_ci
提交者:
Gitee
11月 30, 2021
浏览文件
操作
浏览文件
下载
差异文件
!721 feat: 提供低功耗默认处理框架
Merge pull request !721 from zhushengle/pm
上级
ba843825
212d1bd1
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
73 addition
and
31 deletion
+73
-31
kernel/extended/power/los_pm.c
kernel/extended/power/los_pm.c
+73
-31
未找到文件。
kernel/extended/power/los_pm.c
浏览文件 @
b3489d49
...
...
@@ -54,7 +54,6 @@
#define OS_PM_SYS_EARLY 1
#define OS_PM_SYS_DEVICE_EARLY 2
typedef
UINT32
(
*
SysSuspend
)(
VOID
);
typedef
UINT32
(
*
Suspend
)(
UINT32
mode
);
typedef
struct
{
...
...
@@ -80,6 +79,9 @@ typedef struct {
STATIC
EVENT_CB_S
g_pmEvent
;
STATIC
LosPmCB
g_pmCB
;
STATIC
SPIN_LOCK_INIT
(
g_pmSpin
);
STATIC
LosPmSysctrl
g_sysctrl
;
STATIC
VOID
OsPmSysctrlInit
(
VOID
);
STATIC
VOID
OsPmTickTimerStart
(
LosPmCB
*
pm
)
{
...
...
@@ -104,31 +106,25 @@ STATIC VOID OsPmCpuResume(LosPmCB *pm)
}
}
STATIC
SysSuspend
OsPmCpuSuspend
(
LosPmCB
*
pm
)
VOID
OsPmCpuSuspend
(
LosPmCB
*
pm
)
{
SysSuspend
sysSuspend
=
NULL
;
/* cpu enter low power mode */
LOS_ASSERT
(
pm
->
sysctrl
!=
NULL
);
if
(
pm
->
sysMode
==
LOS_SYS_NORMAL_SLEEP
)
{
sysSuspend
=
pm
->
sysctrl
->
normalSuspend
;
pm
->
sysctrl
->
normalSuspend
()
;
}
else
if
(
pm
->
sysMode
==
LOS_SYS_LIGHT_SLEEP
)
{
sysSuspend
=
pm
->
sysctrl
->
lightSuspend
;
pm
->
sysctrl
->
lightSuspend
()
;
}
else
if
(
pm
->
sysMode
==
LOS_SYS_DEEP_SLEEP
)
{
sysSuspend
=
pm
->
sysctrl
->
deepSuspend
;
pm
->
sysctrl
->
deepSuspend
()
;
}
else
{
sysSuspend
=
pm
->
sysctrl
->
shutdownSuspend
;
pm
->
sysctrl
->
shutdownSuspend
()
;
}
LOS_ASSERT
(
sysSuspend
!=
NULL
);
return
sysSuspend
;
}
STATIC
VOID
OsPmResumePrepare
(
LosPmCB
*
pm
,
UINT32
mode
,
UINT32
prepare
)
{
if
((
prepare
==
0
)
&&
(
pm
->
device
->
resume
!=
NULL
))
{
if
((
prepare
==
0
)
&&
(
pm
->
device
!=
NULL
)
&&
(
pm
->
device
->
resume
!=
NULL
))
{
pm
->
device
->
resume
(
mode
);
}
...
...
@@ -173,7 +169,11 @@ STATIC UINT32 OsPmSuspendCheck(LosPmCB *pm, Suspend *sysSuspendEarly, Suspend *d
pm
->
isWake
=
FALSE
;
*
mode
=
pm
->
sysMode
;
*
sysSuspendEarly
=
pm
->
sysctrl
->
early
;
*
deviceSuspend
=
pm
->
device
->
suspend
;
if
(
pm
->
device
!=
NULL
)
{
*
deviceSuspend
=
pm
->
device
->
suspend
;
}
else
{
*
deviceSuspend
=
NULL
;
}
LOS_SpinUnlock
(
&
g_pmSpin
);
return
LOS_OK
;
}
...
...
@@ -185,7 +185,6 @@ STATIC UINT32 OsPmSuspendSleep(LosPmCB *pm)
LOS_SysSleepEnum
mode
;
UINT32
prepare
=
0
;
BOOL
tickTimerStop
=
FALSE
;
SysSuspend
sysSuspend
;
UINT64
currTime
;
ret
=
OsPmSuspendCheck
(
pm
,
&
sysSuspendEarly
,
&
deviceSuspend
,
&
mode
);
...
...
@@ -214,14 +213,7 @@ STATIC UINT32 OsPmSuspendSleep(LosPmCB *pm)
OsSchedUpdateExpireTime
(
currTime
);
}
sysSuspend
=
OsPmCpuSuspend
(
pm
);
LOS_SpinUnlockRestore
(
&
g_pmSpin
,
intSave
);
if
(
!
pm
->
isWake
)
{
ret
=
sysSuspend
();
}
LOS_SpinLockSave
(
&
g_pmSpin
,
&
intSave
);
OsPmCpuSuspend
(
pm
);
OsPmCpuResume
(
pm
);
...
...
@@ -230,8 +222,8 @@ STATIC UINT32 OsPmSuspendSleep(LosPmCB *pm)
EXIT:
pm
->
sysMode
=
LOS_SYS_NORMAL_SLEEP
;
OsPmResumePrepare
(
pm
,
(
UINT32
)
mode
,
prepare
);
LOS_SpinUnlockRestore
(
&
g_pmSpin
,
intSave
);
LOS_SpinUnlockRestore
(
&
g_pmSpin
,
intSave
);
LOS_TaskUnlock
();
return
ret
;
}
...
...
@@ -252,7 +244,36 @@ STATIC UINT32 OsPmDeviceRegister(LosPmCB *pm, LosPmDevice *device)
STATIC
UINT32
OsPmSysctrlRegister
(
LosPmCB
*
pm
,
LosPmSysctrl
*
sysctrl
)
{
LOS_SpinLock
(
&
g_pmSpin
);
pm
->
sysctrl
=
sysctrl
;
if
(
sysctrl
->
early
!=
NULL
)
{
pm
->
sysctrl
->
early
=
sysctrl
->
early
;
}
if
(
sysctrl
->
late
!=
NULL
)
{
pm
->
sysctrl
->
late
=
sysctrl
->
late
;
}
if
(
sysctrl
->
normalSuspend
!=
NULL
)
{
pm
->
sysctrl
->
normalSuspend
=
sysctrl
->
normalSuspend
;
}
if
(
sysctrl
->
normalResume
!=
NULL
)
{
pm
->
sysctrl
->
normalResume
=
sysctrl
->
normalResume
;
}
if
(
sysctrl
->
lightSuspend
!=
NULL
)
{
pm
->
sysctrl
->
lightSuspend
=
sysctrl
->
lightSuspend
;
}
if
(
sysctrl
->
lightResume
!=
NULL
)
{
pm
->
sysctrl
->
lightResume
=
sysctrl
->
lightResume
;
}
if
(
sysctrl
->
deepSuspend
!=
NULL
)
{
pm
->
sysctrl
->
deepSuspend
=
sysctrl
->
deepSuspend
;
}
if
(
sysctrl
->
deepResume
!=
NULL
)
{
pm
->
sysctrl
->
deepResume
=
sysctrl
->
deepResume
;
}
if
(
sysctrl
->
shutdownSuspend
!=
NULL
)
{
pm
->
sysctrl
->
shutdownSuspend
=
sysctrl
->
shutdownSuspend
;
}
if
(
sysctrl
->
shutdownResume
!=
NULL
)
{
pm
->
sysctrl
->
shutdownResume
=
sysctrl
->
shutdownResume
;
}
LOS_SpinUnlock
(
&
g_pmSpin
);
return
LOS_OK
;
...
...
@@ -297,8 +318,10 @@ STATIC UINT32 OsPmDeviceUnregister(LosPmCB *pm, LosPmDevice *device)
STATIC
UINT32
OsPmSysctrlUnregister
(
LosPmCB
*
pm
,
LosPmSysctrl
*
sysctrl
)
{
(
VOID
)
sysctrl
;
LOS_SpinLock
(
&
g_pmSpin
);
pm
->
sysctrl
=
NULL
;
OsPmSysctrlInit
();
pm
->
pmMode
=
LOS_SYS_NORMAL_SLEEP
;
LOS_SpinUnlock
(
&
g_pmSpin
);
return
LOS_OK
;
...
...
@@ -359,11 +382,6 @@ UINT32 LOS_PmModeSet(LOS_SysSleepEnum mode)
}
LOS_SpinLock
(
&
g_pmSpin
);
if
((
mode
!=
LOS_SYS_NORMAL_SLEEP
)
&&
(
pm
->
device
==
NULL
))
{
LOS_SpinUnlock
(
&
g_pmSpin
);
return
LOS_EINVAL
;
}
if
((
mode
==
LOS_SYS_LIGHT_SLEEP
)
&&
(
pm
->
sysctrl
->
lightSuspend
==
NULL
))
{
LOS_SpinUnlock
(
&
g_pmSpin
);
return
LOS_EINVAL
;
...
...
@@ -634,6 +652,28 @@ BOOL OsIsPmMode(VOID)
return
FALSE
;
}
STATIC
UINT32
OsPmSuspendDefaultHandler
(
VOID
)
{
PRINTK
(
"Enter pm default handler!!!
\n
"
);
WFI
;
return
LOS_OK
;
}
STATIC
VOID
OsPmSysctrlInit
(
VOID
)
{
/* Default handler functions, which are implemented by the product */
g_sysctrl
.
early
=
NULL
;
g_sysctrl
.
late
=
NULL
;
g_sysctrl
.
normalSuspend
=
OsPmSuspendDefaultHandler
;
g_sysctrl
.
normalResume
=
NULL
;
g_sysctrl
.
lightSuspend
=
OsPmSuspendDefaultHandler
;
g_sysctrl
.
lightResume
=
NULL
;
g_sysctrl
.
deepSuspend
=
OsPmSuspendDefaultHandler
;
g_sysctrl
.
deepResume
=
NULL
;
g_sysctrl
.
shutdownSuspend
=
NULL
;
g_sysctrl
.
shutdownResume
=
NULL
;
}
UINT32
OsPmInit
(
VOID
)
{
LosPmCB
*
pm
=
&
g_pmCB
;
...
...
@@ -644,6 +684,8 @@ UINT32 OsPmInit(VOID)
LOS_ListInit
(
&
pm
->
lockList
);
(
VOID
)
LOS_EventInit
(
&
g_pmEvent
);
OsPmSysctrlInit
();
pm
->
sysctrl
=
&
g_sysctrl
;
return
LOS_OK
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录