更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_pm.c
浏览该文件的文档.
1/*
2 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
3 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this list of
9 * conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
12 * of conditions and the following disclaimer in the documentation and/or other materials
13 * provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
16 * to endorse or promote products derived from this software without specific prior written
17 * permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include "los_pm.h"
33#include "securec.h"
34#include "los_sched_pri.h"
35#include "los_init.h"
36#include "los_memory.h"
37#include "los_spinlock.h"
38#include "los_swtmr.h"
39#include "los_mp.h"
40
41/**
42 * @brief 删除链:删除由装入点管理的文件
43 * @verbatim
44 @note_link http://weharmonyos.com/openharmony/zh-cn/readme/%E7%94%B5%E6%BA%90%E7%AE%A1%E7%90%86%E5%AD%90%E7%B3%BB%E7%BB%9F.html
45 电源管理子系统提供如下功能:
46 重启系统。
47 管理休眠运行锁。
48 系统电源状态查询。
49 充电和电池状态查询和上报。
50 亮灭屏管理和亮度调节。
51 /base/powermgr
52 ├── battery_manager # 电池服务组件
53 │ ├── hdi # HDI层
54 │ ├── interfaces # 接口层
55 │ ├── sa_profile # SA配置文件
56 │ ├── services # 服务层
57 │ └── utils # 工具和通用层
58 ├── display_manager # 显示控制组件
59 │ ├── interfaces # 接口层
60 │ └── sa_profile # SA配置文件
61 │ └── services # 服务层
62 │ └── utils # 工具和通用层
63 ├── powermgr_lite # 轻量级电源管理组件
64 │ ├── interfaces # 接口层
65 │ └── services # 服务层
66 └── power_manager # 电源管理服务组件
67 ├── interfaces # 接口层
68 ├── sa_profile # SA配置文件
69 └── services # 服务层
70 └── utils # 工具和通用层
71 开发者通过电源管理子系统提供的接口可以进行申请和释放休眠运行锁RunningLock、获取电池信息、亮度调节、重启设备、关机等操作。
72
73 电源管理子系统相关仓库
74
75 powermgr_battery_manager
76 powermgr_power_manager
77 powermgr_display_manager
78 * @endverbatim
79 */
80#define OS_MS_PER_TICK (OS_SYS_MS_PER_SECOND / LOSCFG_BASE_CORE_TICK_PER_SECOND)
81
82#ifdef LOSCFG_KERNEL_PM
83#define PM_INFO_SHOW(seqBuf, arg...) do { \
84 if (seqBuf != NULL) { \
85 (void)LosBufPrintf((struct SeqBuf *)seqBuf, ##arg); \
86 } else { \
87 PRINTK(arg); \
88 } \
89} while (0)
90
91#define OS_PM_LOCK_MAX 0xFFFFU
92#define OS_PM_LOCK_NAME_MAX 28
93#define OS_PM_SYS_EARLY 1
94#define OS_PM_SYS_DEVICE_EARLY 2
95
96typedef UINT32 (*Suspend)(UINT32 mode);
97///< 电源锁控制块
98typedef struct {
99 CHAR name[OS_PM_LOCK_NAME_MAX]; ///< 电源锁名称
100 UINT32 count; ///< 数量
102 LOS_DL_LIST list; ///< 电源锁链表,上面挂的是 OsPmLockCB
103} OsPmLockCB;
104///< 电源管理控制块
105typedef struct {
106 LOS_SysSleepEnum pmMode; ///< 模式类型
108 UINT16 lock; ///< 锁数量
113 LOS_DL_LIST lockList; ///< 电源锁链表头,上面挂的是 OsPmLockCB
114} LosPmCB;
115
116#define PM_EVENT_LOCK_MASK 0xF
117#define PM_EVENT_LOCK_RELEASE 0x1
119STATIC LosPmCB g_pmCB; ///< 电源控制块全局遍历
120STATIC SPIN_LOCK_INIT(g_pmSpin); ///< 电源模块自旋锁
122
123STATIC VOID OsPmSysctrlInit(VOID);
124
126{
127 (VOID)pm;
128 return;
129}
130
132{
133 (VOID)pm;
134 return FALSE;
135}
136
137STATIC VOID OsPmCpuResume(LosPmCB *pm)
138{
139 if ((pm->sysMode == LOS_SYS_NORMAL_SLEEP) && (pm->sysctrl->normalResume != NULL)) {
140 pm->sysctrl->normalResume();
141 } else if ((pm->sysMode == LOS_SYS_LIGHT_SLEEP) && (pm->sysctrl->lightResume != NULL)) {
142 pm->sysctrl->lightResume();
143 } else if ((pm->sysMode == LOS_SYS_DEEP_SLEEP) && (pm->sysctrl->deepResume != NULL)) {
144 pm->sysctrl->deepResume();
145 }
146}
147
149{
150 /* cpu enter low power mode */
151 LOS_ASSERT(pm->sysctrl != NULL);
152
153 if (pm->sysMode == LOS_SYS_NORMAL_SLEEP) {
154 pm->sysctrl->normalSuspend();
155 } else if (pm->sysMode == LOS_SYS_LIGHT_SLEEP) {
156 pm->sysctrl->lightSuspend();
157 } else if (pm->sysMode == LOS_SYS_DEEP_SLEEP) {
158 pm->sysctrl->deepSuspend();
159 } else {
161 }
162}
163
164STATIC VOID OsPmResumePrepare(LosPmCB *pm, UINT32 mode, UINT32 prepare)
165{
166 if ((prepare == 0) && (pm->device != NULL) && (pm->device->resume != NULL)) {
167 pm->device->resume(mode);
168 }
169
170 if (((prepare == 0) || (prepare == OS_PM_SYS_DEVICE_EARLY)) && (pm->sysctrl->late != NULL)) {
171 pm->sysctrl->late(mode);
172 }
173}
174
175STATIC UINT32 OsPmSuspendPrepare(Suspend sysSuspendEarly, Suspend deviceSuspend, UINT32 mode, UINT32 *prepare)
176{
177 UINT32 ret;
178
179 if (sysSuspendEarly != NULL) {
180 ret = sysSuspendEarly(mode);
181 if (ret != LOS_OK) {
182 *prepare = OS_PM_SYS_EARLY;
183 return ret;
184 }
185 }
186
187 if (deviceSuspend != NULL) {
188 ret = deviceSuspend(mode);
189 if (ret != LOS_OK) {
190 *prepare = OS_PM_SYS_DEVICE_EARLY;
191 return ret;
192 }
193 }
194
195 return LOS_OK;
196}
197
198STATIC UINT32 OsPmSuspendCheck(LosPmCB *pm, Suspend *sysSuspendEarly, Suspend *deviceSuspend, LOS_SysSleepEnum *mode)
199{
200 LOS_SpinLock(&g_pmSpin);
201 pm->sysMode = pm->pmMode;
202 if (pm->lock > 0) {
204 LOS_SpinUnlock(&g_pmSpin);
205 return LOS_NOK;
206 }
207
208 pm->isWake = FALSE;
209 *mode = pm->sysMode;
210 *sysSuspendEarly = pm->sysctrl->early;
211 if (pm->device != NULL) {
212 *deviceSuspend = pm->device->suspend;
213 } else {
214 *deviceSuspend = NULL;
215 }
216 LOS_SpinUnlock(&g_pmSpin);
217 return LOS_OK;
218}
219
221{
222 UINT32 ret, intSave;
223 Suspend sysSuspendEarly, deviceSuspend;
224 LOS_SysSleepEnum mode;
225 UINT32 prepare = 0;
226 BOOL tickTimerStop = FALSE;
227
228 ret = OsPmSuspendCheck(pm, &sysSuspendEarly, &deviceSuspend, &mode);
229 if (ret != LOS_OK) {
230 PRINT_ERR("Pm suspend mode is normal sleep! lock count %d\n", pm->lock);
231 return ret;
232 }
233
234 ret = OsPmSuspendPrepare(sysSuspendEarly, deviceSuspend, (UINT32)mode, &prepare);
235 if (ret != LOS_OK) {
236 LOS_SpinLockSave(&g_pmSpin, &intSave);
237 LOS_TaskLock();
238 goto EXIT;
239 }
240
241 LOS_SpinLockSave(&g_pmSpin, &intSave);
242 LOS_TaskLock();
243 if (pm->isWake || (pm->lock > 0)) {
244 goto EXIT;
245 }
246
247 tickTimerStop = OsPmTickTimerStop(pm);
248 if (!tickTimerStop) {
251 }
252
253 OsPmCpuSuspend(pm);
254
255 OsPmCpuResume(pm);
256
258
259EXIT:
261 OsPmResumePrepare(pm, (UINT32)mode, prepare);
262
263 LOS_SpinUnlockRestore(&g_pmSpin, intSave);
265 return ret;
266}
267
269{
270 if ((device->suspend == NULL) || (device->resume == NULL)) {
271 return LOS_EINVAL;
272 }
273
274 LOS_SpinLock(&g_pmSpin);
275 pm->device = device;
276 LOS_SpinUnlock(&g_pmSpin);
277
278 return LOS_OK;
279}
280
282{
283 LOS_SpinLock(&g_pmSpin);
284 if (sysctrl->early != NULL) {
285 pm->sysctrl->early = sysctrl->early;
286 }
287 if (sysctrl->late != NULL) {
288 pm->sysctrl->late = sysctrl->late;
289 }
290 if (sysctrl->normalSuspend != NULL) {
291 pm->sysctrl->normalSuspend = sysctrl->normalSuspend;
292 }
293 if (sysctrl->normalResume != NULL) {
294 pm->sysctrl->normalResume = sysctrl->normalResume;
295 }
296 if (sysctrl->lightSuspend != NULL) {
297 pm->sysctrl->lightSuspend = sysctrl->lightSuspend;
298 }
299 if (sysctrl->lightResume != NULL) {
300 pm->sysctrl->lightResume = sysctrl->lightResume;
301 }
302 if (sysctrl->deepSuspend != NULL) {
303 pm->sysctrl->deepSuspend = sysctrl->deepSuspend;
304 }
305 if (sysctrl->deepResume != NULL) {
306 pm->sysctrl->deepResume = sysctrl->deepResume;
307 }
308 if (sysctrl->shutdownSuspend != NULL) {
310 }
311 if (sysctrl->shutdownResume != NULL) {
312 pm->sysctrl->shutdownResume = sysctrl->shutdownResume;
313 }
314 LOS_SpinUnlock(&g_pmSpin);
315
316 return LOS_OK;
317}
318
320{
321 LosPmCB *pm = &g_pmCB;
322
323 if (node == NULL) {
324 return LOS_EINVAL;
325 }
326
327 switch (type) {
329 return OsPmDeviceRegister(pm, (LosPmDevice *)node);
331 PRINT_ERR("Pm, %d is an unsupported type\n", type);
332 return LOS_EINVAL;
334 return OsPmSysctrlRegister(pm, (LosPmSysctrl *)node);
335 default:
336 break;
337 }
338
339 return LOS_EINVAL;
340}
341
343{
344 LOS_SpinLock(&g_pmSpin);
345 if (pm->device == device) {
346 pm->device = NULL;
348 LOS_SpinUnlock(&g_pmSpin);
349 return LOS_OK;
350 }
351
352 LOS_SpinUnlock(&g_pmSpin);
353 return LOS_EINVAL;
354}
355
357{
358 (VOID)sysctrl;
359 LOS_SpinLock(&g_pmSpin);
362 LOS_SpinUnlock(&g_pmSpin);
363
364 return LOS_OK;
365}
366
368{
369 LosPmCB *pm = &g_pmCB;
370
371 if (node == NULL) {
372 return LOS_EINVAL;
373 }
374
375 switch (type) {
377 return OsPmDeviceUnregister(pm, (LosPmDevice *)node);
379 PRINT_ERR("Pm, %d is an unsupported type\n", type);
380 return LOS_EINVAL;
382 return OsPmSysctrlUnregister(pm, (LosPmSysctrl *)node);
383 default:
384 break;
385 }
386
387 return LOS_EINVAL;
388}
389
391{
392 LosPmCB *pm = &g_pmCB;
393
394 LOS_SpinLock(&g_pmSpin);
395 pm->isWake = TRUE;
396 LOS_SpinUnlock(&g_pmSpin);
397 return;
398}
399/// 获取电源模式
401{
402 LOS_SysSleepEnum mode;
403 LosPmCB *pm = &g_pmCB;
404
405 LOS_SpinLock(&g_pmSpin);
406 mode = pm->pmMode;
407 LOS_SpinUnlock(&g_pmSpin);
408
409 return mode;
410}
412{
413 LosPmCB *pm = &g_pmCB;
414 INT32 sleepMode = (INT32)mode;
415
416 if ((sleepMode < 0) || (sleepMode > LOS_SYS_SHUTDOWN)) {
417 return LOS_EINVAL;
418 }
419
420 LOS_SpinLock(&g_pmSpin);
421 if ((mode == LOS_SYS_LIGHT_SLEEP) && (pm->sysctrl->lightSuspend == NULL)) {
422 LOS_SpinUnlock(&g_pmSpin);
423 return LOS_EINVAL;
424 }
425
426 if ((mode == LOS_SYS_DEEP_SLEEP) && (pm->sysctrl->deepSuspend == NULL)) {
427 LOS_SpinUnlock(&g_pmSpin);
428 return LOS_EINVAL;
429 }
430
431 if ((mode == LOS_SYS_SHUTDOWN) && (pm->sysctrl->shutdownSuspend == NULL)) {
432 LOS_SpinUnlock(&g_pmSpin);
433 return LOS_EINVAL;
434 }
435
436 pm->pmMode = mode;
437 LOS_SpinUnlock(&g_pmSpin);
438
439 return LOS_OK;
440}
441
442///获取电源锁数量
444{
445 UINT16 count;
446 LosPmCB *pm = &g_pmCB;
447
448 LOS_SpinLock(&g_pmSpin);
449 count = pm->lock;
450 LOS_SpinUnlock(&g_pmSpin);
451
452 return (UINT32)count;
453}
454///显示所有电源锁信息
456{
457 LosPmCB *pm = &g_pmCB;
458 OsPmLockCB *lock = NULL;
459 LOS_DL_LIST *head = &pm->lockList;
460 LOS_DL_LIST *list = head->pstNext;
461
462 LOS_SpinLock(&g_pmSpin);
463 while (list != head) {//遍历链表
464 lock = LOS_DL_LIST_ENTRY(list, OsPmLockCB, list);//获取 OsPmLockCB 实体
465 PM_INFO_SHOW(m, "%-30s%5u\n\r", lock->name, lock->count); //打印名称和数量
466 list = list->pstNext;
467 }
468 LOS_SpinUnlock(&g_pmSpin);
469
470 return;
471}
472///请求获取指定的锁
473UINT32 OsPmLockRequest(const CHAR *name, UINT32 swtmrID)
474{
475 INT32 len;
476 errno_t err;
477 UINT32 ret = LOS_EINVAL;
478 LosPmCB *pm = &g_pmCB;
479 OsPmLockCB *lock = NULL;
480 LOS_DL_LIST *head = &pm->lockList;
481 LOS_DL_LIST *list = head->pstNext;
482
483 if (OS_INT_ACTIVE) {
484 return LOS_EINTR;
485 }
486
487 len = strlen(name);
488 if (len <= 0) {
489 return LOS_EINVAL;
490 }
491
492 LOS_SpinLock(&g_pmSpin);
493 if (pm->lock >= OS_PM_LOCK_MAX) {
494 LOS_SpinUnlock(&g_pmSpin);
495 return LOS_EINVAL;
496 }
497 //遍历找到参数对应的 OsPmLockCB
498 while (list != head) {
499 OsPmLockCB *listNode = LOS_DL_LIST_ENTRY(list, OsPmLockCB, list);
500 if (strcmp(name, listNode->name) == 0) {
501 lock = listNode;
502 break;
503 }
504
505 list = list->pstNext;
506 }
507
508 if (lock == NULL) {//没有记录则创建记录
509 lock = LOS_MemAlloc((VOID *)OS_SYS_MEM_ADDR, sizeof(OsPmLockCB));
510 if (lock == NULL) {
511 LOS_SpinUnlock(&g_pmSpin);
512 return LOS_ENOMEM;
513 }
514
515 err = memcpy_s(lock->name, OS_PM_LOCK_NAME_MAX, name, len + 1);
516 if (err != EOK) {
517 LOS_SpinUnlock(&g_pmSpin);
518 (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, lock);
519 return err;
520 }
521 lock->count = 1;//数量增加
522 lock->swtmrID = swtmrID;
523 LOS_ListTailInsert(head, &lock->list);//从尾部插入链表中
524 } else if (lock->count < OS_PM_LOCK_MAX) {
525 lock->count++;//存在记录时,数量增加
526 }
527
528 if ((lock->swtmrID != OS_INVALID) && (lock->count > 1)) {
529 lock->count--;
530 LOS_SpinUnlock(&g_pmSpin);
531 return LOS_EINVAL;
532 }
533
534 if (pm->lock < OS_PM_LOCK_MAX) {
535 pm->lock++;//总数量增加
536 ret = LOS_OK;
537 }
538
539 LOS_SpinUnlock(&g_pmSpin);
540 return ret;
541}
542
544{
545 if (name == NULL) {
546 return LOS_EINVAL;
547 }
548
549 return OsPmLockRequest(name, OS_INVALID);
550}
551//释放方式跟系统描述符(sysfd)很像
553{
554 UINT32 ret = LOS_EINVAL;
555 LosPmCB *pm = &g_pmCB;
556 OsPmLockCB *lock = NULL;
557 LOS_DL_LIST *head = &pm->lockList;
558 LOS_DL_LIST *list = head->pstNext;
559 OsPmLockCB *lockFree = NULL;
560 BOOL isRelease = FALSE;
561 UINT32 mode;
562
563 if (name == NULL) {
564 return LOS_EINVAL;
565 }
566
567 if (OS_INT_ACTIVE) {
568 return LOS_EINTR;
569 }
570
571 LOS_SpinLock(&g_pmSpin);
572 if (pm->lock == 0) {
573 LOS_SpinUnlock(&g_pmSpin);
574 return LOS_EINVAL;
575 }
576
577 mode = (UINT32)pm->pmMode;
578 while (list != head) {//遍历找到参数对应的 OsPmLockCB
579 OsPmLockCB *listNode = LOS_DL_LIST_ENTRY(list, OsPmLockCB, list);
580 if (strcmp(name, listNode->name) == 0) {
581 lock = listNode;
582 break;//找到返回
583 }
584
585 list = list->pstNext;//继续遍历下一个结点
586 }
587
588 if (lock == NULL) {
589 LOS_SpinUnlock(&g_pmSpin);
590 return LOS_EINVAL;
591 } else if (lock->count > 0) {//有记录且有数量
592 lock->count--; //数量减少
593 if (lock->count == 0) {//没有了
594 LOS_ListDelete(&lock->list);//讲自己从链表中摘除
595 lockFree = lock;
596 }
597 }
598
599 if (pm->lock > 0) {
600 pm->lock--;
601 if (pm->lock == 0) {
602 isRelease = TRUE;
603 }
604 ret = LOS_OK;
605 }
606 LOS_SpinUnlock(&g_pmSpin);
607
608 if (lockFree != NULL) {
609 (VOID)LOS_SwtmrDelete(lockFree->swtmrID);
610 (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, lockFree);
611 }
612
613 if (isRelease && (mode > LOS_SYS_NORMAL_SLEEP)) {
614 (VOID)LOS_EventWrite(&g_pmEvent, PM_EVENT_LOCK_RELEASE);
615 }
616
617 return ret;
618}
619
620STATIC VOID OsPmSwtmrHandler(UINT32 arg)
621{
622 const CHAR *name = (const CHAR *)arg;
623 UINT32 ret = LOS_PmLockRelease(name);
624 if (ret != LOS_OK) {
625 PRINT_ERR("Pm delay lock %s release faled! : 0x%x\n", name, ret);
626 }
627}
628
629UINT32 LOS_PmTimeLockRequest(const CHAR *name, UINT64 millisecond)
630{
631 UINT32 ticks;
632 UINT16 swtmrID;
633 UINT32 ret;
634
635 if ((name == NULL) || !millisecond) {
636 return LOS_EINVAL;
637 }
638
639 ticks = (UINT32)((millisecond + OS_MS_PER_TICK - 1) / OS_MS_PER_TICK);
640#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
641 ret = LOS_SwtmrCreate(ticks, LOS_SWTMR_MODE_ONCE, OsPmSwtmrHandler, &swtmrID, (UINT32)(UINTPTR)name,
642 OS_SWTMR_ROUSES_ALLOW, OS_SWTMR_ALIGN_INSENSITIVE);
643#else
644 ret = LOS_SwtmrCreate(ticks, LOS_SWTMR_MODE_ONCE, OsPmSwtmrHandler, &swtmrID, (UINT32)(UINTPTR)name);
645#endif
646 if (ret != LOS_OK) {
647 return ret;
648 }
649
650 ret = OsPmLockRequest(name, swtmrID);
651 if (ret != LOS_OK) {
652 (VOID)LOS_SwtmrDelete(swtmrID);
653 return ret;
654 }
655
656 ret = LOS_SwtmrStart(swtmrID);
657 if (ret != LOS_OK) {
658 (VOID)LOS_PmLockRelease(name);
659 }
660
661 return ret;
662}
663
665{
666 UINT32 ret = LOS_EventRead(&g_pmEvent, PM_EVENT_LOCK_MASK, LOS_WAITMODE_OR | LOS_WAITMODE_CLR, LOS_WAIT_FOREVER);
667 if (ret > PM_EVENT_LOCK_MASK) {
668 PRINT_ERR("%s event read failed! ERROR: 0x%x\n", __FUNCTION__, ret);
669 }
670
671 return LOS_OK;
672}
673
675{
676 (VOID)wakeCount;
677 return OsPmSuspendSleep(&g_pmCB);
678}
679
681{
682 LosPmCB *pm = &g_pmCB;
683
684 LOS_SpinLock(&g_pmSpin);
685 if ((pm->sysMode != LOS_SYS_NORMAL_SLEEP) && (pm->lock == 0)) {
686 LOS_SpinUnlock(&g_pmSpin);
687 return TRUE;
688 }
689 LOS_SpinUnlock(&g_pmSpin);
690 return FALSE;
691}
692
694{
695 PRINTK("Enter pm default handler!!!\n");
696 WFI;
697 return LOS_OK;
698}
699
700STATIC VOID OsPmSysctrlInit(VOID)
701{
702 /* Default handler functions, which are implemented by the product */
703 g_sysctrl.early = NULL;
704 g_sysctrl.late = NULL;
706 g_sysctrl.normalResume = NULL;
708 g_sysctrl.lightResume = NULL;
710 g_sysctrl.deepResume = NULL;
713}
714
716{
717 LosPmCB *pm = &g_pmCB;
718
719 (VOID)memset_s(pm, sizeof(LosPmCB), 0, sizeof(LosPmCB));//全局链表置0
720
722 LOS_ListInit(&pm->lockList);//初始化链表
723 (VOID)LOS_EventInit(&g_pmEvent);
724
726 pm->sysctrl = &g_sysctrl;
727 return LOS_OK;
728}
729
730LOS_MODULE_INIT(OsPmInit, LOS_INIT_LEVEL_KMOD_EXTENDED);//以扩展方式初始化电源管理模块
731#endif
LITE_OS_SEC_TEXT UINT32 LOS_EventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, UINT32 timeout)
读取指定事件类型,超时时间为相对时间:单位为Tick
Definition: los_event.c:313
LITE_OS_SEC_TEXT UINT32 LOS_EventWrite(PEVENT_CB_S eventCB, UINT32 events)
写指定的事件类型
Definition: los_event.c:318
LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventInit(PEVENT_CB_S eventCB)
初始化一个事件控制块
Definition: los_event.c:95
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
Definition: los_list.h:104
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListTailInsert(LOS_DL_LIST *list, LOS_DL_LIST *node)
Insert a node to the tail of a doubly linked list.
Definition: los_list.h:244
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelete(LOS_DL_LIST *node)
Definition: los_list.h:292
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
Definition: los_memory.c:1123
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
Definition: los_memory.c:1369
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart(UINT16 swtmrID)
接口函数 启动定时器 参数定时任务ID
Definition: los_swtmr.c:764
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrDelete(UINT16 swtmrID)
接口函数 删除定时器
Definition: los_swtmr.c:889
LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate(UINT32 interval, UINT8 mode, SWTMR_PROC_FUNC handler, UINT16 *swtmrID, UINTPTR arg)
创建定时器,设置定时器的定时时长、定时器模式、回调函数,并返回定时器ID
Definition: los_swtmr.c:712
@ LOS_SWTMR_MODE_ONCE
Definition: los_swtmr.h:232
LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskUnlock(VOID)
Unlock the task scheduling.
Definition: los_task.c:1148
LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskLock(VOID)
Lock the task scheduling.
Definition: los_task.c:1139
VOID OsPmCpuSuspend(LosPmCB *pm)
Definition: los_pm.c:148
UINT32 LOS_PmUnregister(LOS_PmNodeType type, VOID *node)
Unregister a power management node.
Definition: los_pm.c:367
STATIC UINT32 OsPmSuspendSleep(LosPmCB *pm)
Definition: los_pm.c:220
UINT32 LOS_PmModeSet(LOS_SysSleepEnum mode)
Set low power mode.
Definition: los_pm.c:411
VOID LOS_PmLockInfoShow(struct SeqBuf *m)
显示所有电源锁信息
Definition: los_pm.c:455
STATIC UINT32 OsPmSysctrlUnregister(LosPmCB *pm, LosPmSysctrl *sysctrl)
Definition: los_pm.c:356
UINT32 LOS_PmLockCountGet(VOID)
获取电源锁数量
Definition: los_pm.c:443
STATIC VOID OsPmResumePrepare(LosPmCB *pm, UINT32 mode, UINT32 prepare)
Definition: los_pm.c:164
UINT32 LOS_PmReadLock(VOID)
Gets the current PM lock status.
Definition: los_pm.c:664
STATIC UINT32 OsPmSuspendPrepare(Suspend sysSuspendEarly, Suspend deviceSuspend, UINT32 mode, UINT32 *prepare)
Definition: los_pm.c:175
STATIC LosPmSysctrl g_sysctrl
Definition: los_pm.c:121
UINT32 LOS_PmLockRequest(const CHAR *name)
Request to obtain the lock in current mode, so that the system will not enter this mode when it enter...
Definition: los_pm.c:543
UINT32 OsPmLockRequest(const CHAR *name, UINT32 swtmrID)
请求获取指定的锁
Definition: los_pm.c:473
STATIC UINT32 OsPmSuspendCheck(LosPmCB *pm, Suspend *sysSuspendEarly, Suspend *deviceSuspend, LOS_SysSleepEnum *mode)
Definition: los_pm.c:198
STATIC UINT32 OsPmSysctrlRegister(LosPmCB *pm, LosPmSysctrl *sysctrl)
Definition: los_pm.c:281
BOOL OsIsPmMode(VOID)
Definition: los_pm.c:680
STATIC VOID OsPmSwtmrHandler(UINT32 arg)
Definition: los_pm.c:620
STATIC VOID OsPmTickTimerStart(LosPmCB *pm)
Definition: los_pm.c:125
STATIC UINT32 OsPmDeviceUnregister(LosPmCB *pm, LosPmDevice *device)
Definition: los_pm.c:342
UINT32 LOS_PmSuspend(UINT32 wakeCount)
The system enters the low-power flow.
Definition: los_pm.c:674
UINT32(* Suspend)(UINT32 mode)
电源锁控制块
Definition: los_pm.c:96
STATIC UINT32 OsPmSuspendDefaultHandler(VOID)
Definition: los_pm.c:693
UINT32 LOS_PmLockRelease(const CHAR *name)
Release the lock in current mode so that the next time the system enters the idle task,...
Definition: los_pm.c:552
VOID LOS_PmWakeSet(VOID)
Set the system wake up flag.
Definition: los_pm.c:390
STATIC UINT32 OsPmDeviceRegister(LosPmCB *pm, LosPmDevice *device)
Definition: los_pm.c:268
UINT32 LOS_PmTimeLockRequest(const CHAR *name, UINT64 millisecond)
Request to obtain the lock in current mode, so that the system will not enter this mode when it enter...
Definition: los_pm.c:629
STATIC BOOL OsPmTickTimerStop(LosPmCB *pm)
Definition: los_pm.c:131
STATIC SPIN_LOCK_INIT(g_pmSpin)
电源模块自旋锁
STATIC VOID OsPmCpuResume(LosPmCB *pm)
Definition: los_pm.c:137
STATIC LosPmCB g_pmCB
电源控制块全局遍历
Definition: los_pm.c:119
UINT32 OsPmInit(VOID)
Definition: los_pm.c:715
UINT32 LOS_PmRegister(LOS_PmNodeType type, VOID *node)
Register a power management node.
Definition: los_pm.c:319
STATIC VOID OsPmSysctrlInit(VOID)
Definition: los_pm.c:700
LOS_SysSleepEnum LOS_PmModeGet(VOID)
获取电源模式
Definition: los_pm.c:400
STATIC EVENT_CB_S g_pmEvent
Definition: los_pm.c:118
LOS_MODULE_INIT(OsPmInit, LOS_INIT_LEVEL_KMOD_EXTENDED)
LOS_SysSleepEnum
Definition: los_pm.h:41
@ LOS_SYS_DEEP_SLEEP
Definition: los_pm.h:44
@ LOS_SYS_LIGHT_SLEEP
Definition: los_pm.h:43
@ LOS_SYS_SHUTDOWN
Definition: los_pm.h:45
@ LOS_SYS_NORMAL_SLEEP
Definition: los_pm.h:42
LOS_PmNodeType
Definition: los_pm.h:48
@ LOS_PM_TYPE_TICK_TIMER
Definition: los_pm.h:50
@ LOS_PM_TYPE_DEVICE
Definition: los_pm.h:49
@ LOS_PM_TYPE_SYSCTRL
Definition: los_pm.h:51
VOID OsSchedExpireTimeUpdate(VOID)
Definition: los_sched.c:88
VOID OsSchedResponseTimeReset(UINT64 responseTime)
Definition: los_sched.c:189
VOID LOS_SpinUnlockRestore(SPIN_LOCK_S *lock, UINT32 intSave)
Definition: los_spinlock.c:108
VOID LOS_SpinLock(SPIN_LOCK_S *lock)
Definition: los_spinlock.c:50
VOID LOS_SpinLockSave(SPIN_LOCK_S *lock, UINT32 *intSave)
Definition: los_spinlock.c:98
VOID LOS_SpinUnlock(SPIN_LOCK_S *lock)
Definition: los_spinlock.c:84
unsigned short UINT16
Definition: los_typedef.h:56
signed int INT32
Definition: los_typedef.h:60
long unsigned int UINT64
Definition: los_typedef.h:66
unsigned long UINTPTR
Definition: los_typedef.h:68
unsigned int UINT32
Definition: los_typedef.h:57
char CHAR
Definition: los_typedef.h:63
size_t BOOL
Definition: los_typedef.h:88
struct LOS_DL_LIST * pstNext
Definition: los_list.h:84
UINT16 lock
锁数量
Definition: los_pm.c:108
UINT64 enterSleepTime
Definition: los_pm.c:112
LosPmDevice * device
Definition: los_pm.c:110
LOS_DL_LIST lockList
电源锁链表头,上面挂的是 OsPmLockCB
Definition: los_pm.c:113
BOOL isWake
Definition: los_pm.c:109
LOS_SysSleepEnum sysMode
Definition: los_pm.c:107
LOS_SysSleepEnum pmMode
模式类型
Definition: los_pm.c:106
LosPmSysctrl * sysctrl
Definition: los_pm.c:111
VOID(* resume)(UINT32 mode)
Definition: los_pm.h:56
UINT32(* suspend)(UINT32 mode)
Definition: los_pm.h:55
VOID(* lightResume)(VOID)
Definition: los_pm.h:85
UINT32(* early)(UINT32 mode)
Definition: los_pm.h:64
VOID(* normalResume)(VOID)
Definition: los_pm.h:77
VOID(* deepResume)(VOID)
Definition: los_pm.h:93
VOID(* late)(UINT32 mode)
Definition: los_pm.h:69
UINT32(* deepSuspend)(VOID)
Definition: los_pm.h:89
UINT32(* normalSuspend)(VOID)
Definition: los_pm.h:73
UINT32(* lightSuspend)(VOID)
Definition: los_pm.h:81
VOID(* shutdownResume)(VOID)
Definition: los_pm.h:101
UINT32(* shutdownSuspend)(VOID)
Definition: los_pm.h:97
UINT32 count
数量
Definition: los_pm.c:100
UINT32 swtmrID
Definition: los_pm.c:101
CHAR name[OS_PM_LOCK_NAME_MAX]
电源锁名称
Definition: los_pm.c:99
LOS_DL_LIST list
电源锁链表,上面挂的是 OsPmLockCB
Definition: los_pm.c:102