80#define OS_MS_PER_TICK (OS_SYS_MS_PER_SECOND / LOSCFG_BASE_CORE_TICK_PER_SECOND)
82#ifdef LOSCFG_KERNEL_PM
83#define PM_INFO_SHOW(seqBuf, arg...) do { \
84 if (seqBuf != NULL) { \
85 (void)LosBufPrintf((struct SeqBuf *)seqBuf, ##arg); \
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
99 CHAR name[OS_PM_LOCK_NAME_MAX];
116#define PM_EVENT_LOCK_MASK 0xF
117#define PM_EVENT_LOCK_RELEASE 0x1
151 LOS_ASSERT(pm->
sysctrl != NULL);
170 if (((prepare == 0) || (prepare == OS_PM_SYS_DEVICE_EARLY)) && (pm->
sysctrl->
late != NULL)) {
179 if (sysSuspendEarly != NULL) {
180 ret = sysSuspendEarly(mode);
182 *prepare = OS_PM_SYS_EARLY;
187 if (deviceSuspend != NULL) {
188 ret = deviceSuspend(mode);
190 *prepare = OS_PM_SYS_DEVICE_EARLY;
214 *deviceSuspend = NULL;
223 Suspend sysSuspendEarly, deviceSuspend;
226 BOOL tickTimerStop = FALSE;
230 PRINT_ERR(
"Pm suspend mode is normal sleep! lock count %d\n", pm->
lock);
248 if (!tickTimerStop) {
284 if (sysctrl->
early != NULL) {
287 if (sysctrl->
late != NULL) {
331 PRINT_ERR(
"Pm, %d is an unsupported type\n", type);
345 if (pm->
device == device) {
379 PRINT_ERR(
"Pm, %d is an unsupported type\n", type);
463 while (list != head) {
464 lock = LOS_DL_LIST_ENTRY(list,
OsPmLockCB, list);
465 PM_INFO_SHOW(m,
"%-30s%5u\n\r", lock->
name, lock->
count);
493 if (pm->
lock >= OS_PM_LOCK_MAX) {
498 while (list != head) {
500 if (strcmp(name, listNode->
name) == 0) {
515 err = memcpy_s(lock->
name, OS_PM_LOCK_NAME_MAX, name, len + 1);
524 }
else if (lock->
count < OS_PM_LOCK_MAX) {
528 if ((lock->
swtmrID != OS_INVALID) && (lock->
count > 1)) {
534 if (pm->
lock < OS_PM_LOCK_MAX) {
560 BOOL isRelease = FALSE;
578 while (list != head) {
580 if (strcmp(name, listNode->
name) == 0) {
591 }
else if (lock->
count > 0) {
593 if (lock->
count == 0) {
608 if (lockFree != NULL) {
610 (VOID)
LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, lockFree);
622 const CHAR *name = (
const CHAR *)arg;
625 PRINT_ERR(
"Pm delay lock %s release faled! : 0x%x\n", name, ret);
635 if ((name == NULL) || !millisecond) {
639 ticks = (
UINT32)((millisecond + OS_MS_PER_TICK - 1) / OS_MS_PER_TICK);
640#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
642 OS_SWTMR_ROUSES_ALLOW, OS_SWTMR_ALIGN_INSENSITIVE);
667 if (ret > PM_EVENT_LOCK_MASK) {
668 PRINT_ERR(
"%s event read failed! ERROR: 0x%x\n", __FUNCTION__, ret);
695 PRINTK(
"Enter pm default handler!!!\n");
LITE_OS_SEC_TEXT UINT32 LOS_EventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, UINT32 timeout)
读取指定事件类型,超时时间为相对时间:单位为Tick
LITE_OS_SEC_TEXT UINT32 LOS_EventWrite(PEVENT_CB_S eventCB, UINT32 events)
写指定的事件类型
LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventInit(PEVENT_CB_S eventCB)
初始化一个事件控制块
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
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.
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelete(LOS_DL_LIST *node)
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart(UINT16 swtmrID)
接口函数 启动定时器 参数定时任务ID
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrDelete(UINT16 swtmrID)
接口函数 删除定时器
LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate(UINT32 interval, UINT8 mode, SWTMR_PROC_FUNC handler, UINT16 *swtmrID, UINTPTR arg)
创建定时器,设置定时器的定时时长、定时器模式、回调函数,并返回定时器ID
LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskUnlock(VOID)
Unlock the task scheduling.
LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskLock(VOID)
Lock the task scheduling.
VOID OsPmCpuSuspend(LosPmCB *pm)
UINT32 LOS_PmUnregister(LOS_PmNodeType type, VOID *node)
Unregister a power management node.
STATIC UINT32 OsPmSuspendSleep(LosPmCB *pm)
UINT32 LOS_PmModeSet(LOS_SysSleepEnum mode)
Set low power mode.
VOID LOS_PmLockInfoShow(struct SeqBuf *m)
显示所有电源锁信息
STATIC UINT32 OsPmSysctrlUnregister(LosPmCB *pm, LosPmSysctrl *sysctrl)
UINT32 LOS_PmLockCountGet(VOID)
获取电源锁数量
STATIC VOID OsPmResumePrepare(LosPmCB *pm, UINT32 mode, UINT32 prepare)
UINT32 LOS_PmReadLock(VOID)
Gets the current PM lock status.
STATIC UINT32 OsPmSuspendPrepare(Suspend sysSuspendEarly, Suspend deviceSuspend, UINT32 mode, UINT32 *prepare)
STATIC LosPmSysctrl g_sysctrl
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...
UINT32 OsPmLockRequest(const CHAR *name, UINT32 swtmrID)
请求获取指定的锁
STATIC UINT32 OsPmSuspendCheck(LosPmCB *pm, Suspend *sysSuspendEarly, Suspend *deviceSuspend, LOS_SysSleepEnum *mode)
STATIC UINT32 OsPmSysctrlRegister(LosPmCB *pm, LosPmSysctrl *sysctrl)
STATIC VOID OsPmSwtmrHandler(UINT32 arg)
STATIC VOID OsPmTickTimerStart(LosPmCB *pm)
STATIC UINT32 OsPmDeviceUnregister(LosPmCB *pm, LosPmDevice *device)
UINT32 LOS_PmSuspend(UINT32 wakeCount)
The system enters the low-power flow.
UINT32(* Suspend)(UINT32 mode)
电源锁控制块
STATIC UINT32 OsPmSuspendDefaultHandler(VOID)
UINT32 LOS_PmLockRelease(const CHAR *name)
Release the lock in current mode so that the next time the system enters the idle task,...
VOID LOS_PmWakeSet(VOID)
Set the system wake up flag.
STATIC UINT32 OsPmDeviceRegister(LosPmCB *pm, LosPmDevice *device)
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...
STATIC BOOL OsPmTickTimerStop(LosPmCB *pm)
STATIC SPIN_LOCK_INIT(g_pmSpin)
电源模块自旋锁
STATIC VOID OsPmCpuResume(LosPmCB *pm)
STATIC LosPmCB g_pmCB
电源控制块全局遍历
UINT32 LOS_PmRegister(LOS_PmNodeType type, VOID *node)
Register a power management node.
STATIC VOID OsPmSysctrlInit(VOID)
LOS_SysSleepEnum LOS_PmModeGet(VOID)
获取电源模式
STATIC EVENT_CB_S g_pmEvent
LOS_MODULE_INIT(OsPmInit, LOS_INIT_LEVEL_KMOD_EXTENDED)
VOID OsSchedExpireTimeUpdate(VOID)
VOID OsSchedResponseTimeReset(UINT64 responseTime)
VOID LOS_SpinUnlockRestore(SPIN_LOCK_S *lock, UINT32 intSave)
VOID LOS_SpinLock(SPIN_LOCK_S *lock)
VOID LOS_SpinLockSave(SPIN_LOCK_S *lock, UINT32 *intSave)
VOID LOS_SpinUnlock(SPIN_LOCK_S *lock)
struct LOS_DL_LIST * pstNext
LOS_DL_LIST lockList
电源锁链表头,上面挂的是 OsPmLockCB
LOS_SysSleepEnum pmMode
模式类型
VOID(* resume)(UINT32 mode)
UINT32(* suspend)(UINT32 mode)
VOID(* lightResume)(VOID)
UINT32(* early)(UINT32 mode)
VOID(* normalResume)(VOID)
VOID(* late)(UINT32 mode)
UINT32(* deepSuspend)(VOID)
UINT32(* normalSuspend)(VOID)
UINT32(* lightSuspend)(VOID)
VOID(* shutdownResume)(VOID)
UINT32(* shutdownSuspend)(VOID)
CHAR name[OS_PM_LOCK_NAME_MAX]
电源锁名称
LOS_DL_LIST list
电源锁链表,上面挂的是 OsPmLockCB