/* * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * 3. Neither the name of the copyright holder nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _LOS_PM_H #define _LOS_PM_H #include "los_config.h" #include "los_compiler.h" #include "los_list.h" #include "los_error.h" /** * @ingroup los_pm * Pm error code: Invalid low-power mode. * * Value: 0x02002001 * */ #define LOS_ERRNO_PM_INVALID_MODE LOS_ERRNO_OS_ERROR(LOS_MOD_PM, 0x01) /** * @ingroup los_pm * Pm error code: Invalid input parameter. * * Value: 0x02002002 * */ #define LOS_ERRNO_PM_INVALID_PARAM LOS_ERRNO_OS_ERROR(LOS_MOD_PM, 0x02) /** * @ingroup los_pm * Pm error code: The current mode is unlocked. * * Value: 0x02002003 * */ #define LOS_ERRNO_PM_NOT_LOCK LOS_ERRNO_OS_ERROR(LOS_MOD_PM, 0x03) /** * @ingroup los_pm * Pm error code: The lock limit has been exceeded. * * Value: 0x02002004 * */ #define LOS_ERRNO_PM_LOCK_LIMIT LOS_ERRNO_OS_ERROR(LOS_MOD_PM, 0x04) /** * @ingroup los_pm * Pm error code: Invalid device node. * * Value: 0x02002005 * */ #define LOS_ERRNO_PM_INVALID_NODE LOS_ERRNO_OS_ERROR(LOS_MOD_PM, 0x05) /** * @ingroup los_pm * Pm error code: Invalid type. * * Value: 0x02002006 * */ #define LOS_ERRNO_PM_INVALID_TYPE LOS_ERRNO_OS_ERROR(LOS_MOD_PM, 0x06) /** * @ingroup los_pm * Pm error code: The hook for mode is not implemented. * * Value: 0x02002007 * */ #define LOS_ERRNO_PM_HANDLER_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_PM, 0x07) /** * @ingroup los_pm * Pm error code: Deep and shutdown must implement the Tick Timer related interface. * * Value: 0x02002008 * */ #define LOS_ERRNO_PM_TICK_TIMER_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_PM, 0x08) /** * @ingroup los_pm * Pm error code: Device is not registered. * * Value: 0x02002009 * */ #define LOS_ERRNO_PM_DEVICE_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_PM, 0x09) /** * @ingroup los_pm * Pm error code: The delay lock has already been activated. * * Value: 0x0200200a * */ #define LOS_ERRNO_PM_ALREADY_LOCK LOS_ERRNO_OS_ERROR(LOS_MOD_PM, 0x0a) typedef enum { LOS_SYS_NORMAL_SLEEP = 0, LOS_SYS_LIGHT_SLEEP, LOS_SYS_DEEP_SLEEP, LOS_SYS_SHUTDOWN, } LOS_SysSleepEnum; typedef enum { LOS_PM_TYPE_DEVICE = 0, LOS_PM_TYPE_TICK_TIMER, LOS_PM_TYPE_SYSCTRL, } LOS_PmNodeType; typedef struct { UINT32 (*suspend)(UINT32 mode); /* The device enters low-power consumption, Unlocked task scheduling. */ VOID (*resume)(UINT32 mode); /* The device exits from low-power consumption, Unlocked task scheduling. */ } LosPmDevice; typedef struct { /* Low-power timer related implementation functions. * The function is not NULL, the low-power timer is enabled. */ UINT32 freq; /* The frequency of the low-power timer */ VOID (*timerStart)(UINT64); /* Start the low-power timer and set the response period */ VOID (*timerStop)(VOID); /* Turn off the low-power timer */ UINT64 (*timerCycleGet)(VOID); /* Gets the time the system sleeps */ /* When the low-power timer is enabled, the function of tickLock is to turn off the system tick timer and * clear the timer's count value to zero. * When the low-power timer is disabled, the function of tickLock is to pause the system timer. */ VOID (*tickLock)(VOID); /* When the low-power timer is enabled, the function of tickUnlock is to restart the system tick timer. * When the low-power timer is disabled, the function of tickUnlock is to restore the system tick timer. */ VOID (*tickUnlock)(VOID); } LosPmTickTimer; typedef struct { /* Preparations before the CPU enters low-power consumption. * All modes except normal mode are invoked. * Unlocked task scheduling. */ UINT32 (*early)(UINT32 mode); /* The system performs low-power recovery. * All modes except normal mode are invoked. * 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. */ UINT32 (*normalSuspend)(VOID); /* The system recovers from normal sleep. * The value can be NULL. */ VOID (*normalResume)(VOID); /* The system enters the light sleep mode. * In light sleep mode, the value cannot be NULL. */ UINT32 (*lightSuspend)(VOID); /* The system recovers from light sleep. * The value can be NULL. */ VOID (*lightResume)(VOID); /* The system enters the deep sleep mode. * In deep sleep mode, the value cannot be NULL. */ UINT32 (*deepSuspend)(VOID); /* The system recovers from deep sleep. * The value can be NULL. */ VOID (*deepResume)(VOID); /* The system enters the shutdown mode. * In shutdown mode, the value cannot be NULL. */ UINT32 (*shutdownSuspend)(VOID); /* The system recovers from shutdown. * In shutdown mode, the value cannot be NULL. */ VOID (*shutdownResume)(VOID); } LosPmSysctrl; /** * @ingroup los_pm * @brief Initialize system low-power frame. * * @par Description: * This API is used to initialize the system low-power frame. * * @attention None. * * @param None. * * @retval error code, LOS_OK means success. * @par Dependency: *