Files
fastbee/sdk/合宙/air780e/csdk/luatos-soc-2022/interface/include/luat_pm.h
2023-03-04 03:44:56 +08:00

345 lines
11 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) 2022 OpenLuat & AirM2M
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef LUAT_PM_H
#define LUAT_PM_H
#include "luat_base.h"
/**
* @defgroup luatos_pm 电源管理接口
* @{
*/
/* ------------------------------------------------ sleep begin----------------------------------------------- */
#define LUAT_PM_SLEEP_MODE_NONE 0 ///< 系统处于活跃状态,未采取任何的降低功耗状态
#define LUAT_PM_SLEEP_MODE_IDLE 1 ///< 空闲模式,该模式在系统空闲时停止 CPU 和部分时钟,任意事件或中断均可以唤醒
#define LUAT_PM_SLEEP_MODE_LIGHT 2 ///< 轻度睡眠模式CPU 停止,多数时钟和外设停止
#define LUAT_PM_SLEEP_MODE_DEEP 3 ///< 深度睡眠模式CPU 停止,仅少数低功耗外设工作,可被特殊中断唤醒
#define LUAT_PM_SLEEP_MODE_STANDBY 4 ///< 待机模式CPU 停止,设备上下文丢失(可保存至特殊外设),唤醒后通常复位
//#define LUAT_PM_SLEEP_MODE_SHUTDOWN 5 ///<关断模式,比 Standby 模式功耗更低, 上下文通常不可恢复, 唤醒后复位
/**
* @brief 设置最深休眠模式标记
*
* @param mode 最深休眠模式
* @param vote_tag 休眠标记
* @return int =0成功其他失败
*/
int luat_pm_set_sleep_mode(int mode, const char *vote_tag);
/**
* @brief 获取休眠标记对应的休眠模式
*
* @param vote_tag 休眠标记
* @return int = -1 失败,其他成功
*/
int luat_pm_get_sleep_mode(const char *vote_tag);
typedef void (*luat_pm_sleep_callback_t)(int mode);
/**
* @brief 注册休眠前回调函数
*
* @param callback_fun 休眠前用户回调
* @return int =0成功其他失败
*/
int luat_pm_sleep_register_pre_handler(luat_pm_sleep_callback_t callback_fun);
/**
* @brief 解注册休眠前回调函数
*
* @return int =0成功其他失败
*/
int luat_pm_sleep_deregister_pre_handler(void);
/**
* @brief 注册唤醒后回调函数
*
* @param callback_fun 唤醒后用户回调
* @return int =0成功其他失败
*/
int luat_pm_sleep_register_post_handler(luat_pm_sleep_callback_t callback_fun);
/**
* @brief 解注册唤醒后回调函数
*
* @param callback_fun 唤醒后用户回调
* @return int =0成功其他失败
*/
int luat_pm_sleep_deregister_post_handler(void);
/*------------------------------------------------ sleep end----------------------------------------------- */
/* ----------------------------------------------- wkaeup begin---------------------------------------------- */
/**
* @brief wakeupPad
*/
typedef enum LUAT_PM_WAKEUP_PAD
{
LUAT_PM_WAKEUP_PAD_0 = 0, /**<wakeupid_0*/
LUAT_PM_WAKEUP_PAD_1, /**<wakeupid_1*/
LUAT_PM_WAKEUP_PAD_2,/**<wakeupid_2*/
LUAT_PM_WAKEUP_PAD_3,/**<wakeupid_3*/
LUAT_PM_WAKEUP_PAD_4,/**<wakeupid_4*/
LUAT_PM_WAKEUP_PAD_5,/**<wakeupid_5*/
LUAT_PM_WAKEUP_LPUART,/**<LPUART 唤醒*/
LUAT_PM_WAKEUP_LPUSB,/**<LPUSB唤醒*/
LUAT_PM_WAKEUP_PWRKEY,/**<PWRKEY唤醒*/
LUAT_PM_WAKEUP_CHARGE,/**<CHARGE唤醒*/
LUAT_PM_WAKEUP_PAD_MAX
}LUAT_PM_WAKEUP_PAD_E;
/**
* @brief wakeupPad配置参数
*/
typedef struct luat_pm_wakeup_pad_cfg
{
uint8_t pos_edge_enable;
uint8_t neg_edge_enable;
uint8_t pull_up_enable;
uint8_t pull_down_enable;
}luat_pm_wakeup_pad_cfg_t;
/**
* @brief 定义wakeupPad中断回调函数类型
*/
typedef void (*luat_pm_wakeup_pad_isr_callback_t)(LUAT_PM_WAKEUP_PAD_E num);
/**
* @brief 设置wakeupPad中断回调函数
*
* @param callback_fun wakeupPad中断回调函数
* @return int =0成功其他失败
*/
int luat_pm_wakeup_pad_set_callback(luat_pm_wakeup_pad_isr_callback_t callback_fun);
/**
* @brief 配置wakeupPad中断参数和GPIO20-22输入配置冲突不可以和GPIO的API同时使用建议使用GPIO的API
*
* @param enable 中断使能
* @param source_id wakeupPad
* @param cfg wakeupPad配置参数
* @return int =0成功其他失败
*/
int luat_pm_wakeup_pad_set(uint8_t enable, LUAT_PM_WAKEUP_PAD_E source_id, luat_pm_wakeup_pad_cfg_t *cfg);
/**
* @brief 获取wakeupPad引脚电平
*
* @param source_id wakeupPad
* @return int =-1失败0为低电平1为高电平
*/
int luat_pm_wakeup_pad_get_value(LUAT_PM_WAKEUP_PAD_E source_id);
/**
* @brief powerkey设置模式
*/
typedef enum LUAT_PM_POWERKEY_MODE
{
LUAT_PM_PWRKEY_PWRON_MODE = 0, /**默认*/
LUAT_PM_PWRKEY_WAKEUP_LOWACTIVE_MODE, /**低电平按下*/
LUAT_PM_PWRKEY_WAKEUP_HIGHACTIVE_MODE, /**高电平按下*/
LUAT_PM_PWRKEY_UNKNOW_MODE,
}LUAT_PM_POWERKEY_MODE_E;
/**
* @brief powerkey状态
*/
typedef enum LUAT_PM_POWERKEY_STATE
{
LUAT_PM_PWRKEY_RELEASE = 0, /**释放*/
LUAT_PM_PWRKEY_PRESS, /**按下*/
LUAT_PM_PWRKEY_LONGPRESS, /**长按*/
LUAT_PM_PWRKEY_REPEAT, /**重复激活*/
}LUAT_PM_POWERKEY_STATE_E;
/**
* @brief powerkey配置参数
*/
typedef struct
{
int16_t long_press_timeout; /**长按超时时间*/
int16_t repeat_timeout; /**重复超时时间*/
int16_t pwroff_timeout; /**关机时间,此值无意义*/
}luat_pm_pwrkey_cfg_t;
typedef void(* luat_pm_pwrkey_callback_t)(LUAT_PM_POWERKEY_MODE_E status);
/**
* @brief 配置powerkey按键
*
* @param mode 中断使能
* @param pullUpEn wakeupPad
* @param cfg powerkey配置参数
* @param callback powerkey回调函数
* @return int =0成功其他失败
*/
int luat_pm_set_pwrkey(LUAT_PM_POWERKEY_MODE_E mode, bool pullUpEn, luat_pm_pwrkey_cfg_t *cfg, luat_pm_pwrkey_callback_t callback);
/* ------------------------------------------------ wakeup end----------------------------------------------- */
/* ---------------------------------------- power on/off/reboot begin---------------------------------------- */
/**
* @brief 开机原因
*/
typedef enum LUAT_PM_POWERON_REASON
{
LUAT_PM_POWERON_REASON_KEY, /**<按键开机*/
LUAT_PM_POWERON_REASON_CHARGER, /**<充电开机*/
LUAT_PM_POWERON_REASON_ALARM, /**<闹钟开机*/
LUAT_PM_POWERON_REASON_REBOOT, /**<软件重启开机*/
LUAT_PM_POWERON_REASON_EXCEPTION, /**<异常重启*/
LUAT_PM_POWERON_REASON_RESET, /**<reset 键重启*/
LUAT_PM_POWERON_REASON_WDT, /**<看门狗重启*/
LUAT_PM_POWERON_REASON_UNKOWN = 0xFF /**<未知原因*/
} LUAT_PM_POWERON_REASON_E;
/**
* @brief 获取开机原因
* @param NULL
* @return @see LUAT_PM_POWERON_REASON_E
*/
int luat_pm_get_poweron_reason(void);
/**
* @brief 设置设备关机
*/
int luat_pm_poweroff(void);
/**
* @brief 设备重启
*/
int luat_pm_reboot(void);
/* ----------------------------------------- power on/off/reboot end----------------------------------------- */
/* --------------------------------------------- vbat/vbus begin--------------------------------------------- */
/**
* @brief 获取充电器状态
* @param status 充电器状态
*/
int luat_pm_get_vbus_status(uint8_t *status);
/**
* @brief 电源管理事件变化参数
*/
typedef enum LUAT_PM_EVENT
{
LUAT_PM_BATTERY_VOLT_EVENT = 0,/**<电池电量发生变化*/
LUAT_PM_VBUS_STATUS_EVENT/**<VBUS状态发生变化*/
}LUAT_PM_EVENT_E;
/**
* @brief 定义PM_event事件处理函数
*/
typedef void (*luat_pm_event_callback_t)(LUAT_PM_EVENT_E event, uint32_t param);
/**
* @brief 定义PM_event事件处理函数回调函数
* @param luat_pm_event_callback_t 指针函数
*/
int luat_pm_event_register_handler(luat_pm_event_callback_t callback_fun);
/* ---------------------------------------------- vbat/vbus end---------------------------------------------- */
/* ------------------------------------------------ timer begin----------------------------------------------- */\
/**
* @brief 深度睡眠模式的软件定时器ID
*/
typedef enum LUAT_PM_DEEPSLEEP_TIMERID
{
LUAT_PM_DEEPSLEEP_TIMER_ID0 = 0, /**0和1最大定时时间为2.5小时精度为10ms不需要存储信息到flash*/
LUAT_PM_DEEPSLEEP_TIMER_ID1,
LUAT_PM_DEEPSLEEP_TIMER_ID2, /**2到6最大定时时间为740小时精度为10ms需要存储信息到flash此类定时器尽量避免反复启动停止防止减少flash寿命如果定时时长不超过2.5小时建议使用0和1*/
LUAT_PM_DEEPSLEEP_TIMER_ID3,
LUAT_PM_DEEPSLEEP_TIMER_ID4,
LUAT_PM_DEEPSLEEP_TIMER_ID5,
LUAT_PM_DEEPSLEEP_TIMER_ID6,
}LUAT_PM_DEEPSLEEP_TIMERID_E;
/**
* @brief 从深度休眠模式下唤醒的原因
*/
typedef enum LUAT_PM_WAKEUP_REASON
{
LUAT_PM_WAKEUP_FROM_POR = 0,
LUAT_PM_WAKEUP_FROM_RTC,
LUAT_PM_WAKEUP_FROM_PAD,
LUAT_PM_WAKEUP_FROM_LPUART,
LUAT_PM_WAKEUP_FROM_LPUSB,
LUAT_PM_WAKEUP_FROM_PWRKEY,
LUAT_PM_WAKEUP_FROM_CHARG,
}LUAT_PM_WAKEUP_REASON_E;
/**
* @brief 定义定时时间到后的回调函数类型
*/
typedef LUAT_RT_RET_TYPE (*luat_pm_deep_sleep_mode_timer_callback_t)(LUAT_PM_DEEPSLEEP_TIMERID_E timer_id);
/**
* @brief 注册深度睡眠模式下的软件定时器超时回调函数
*
* @param timer_id 定时器ID
* @param callback 回调函数
* @return int =0成功其他失败
*/
int luat_pm_deep_sleep_mode_register_timer_cb(LUAT_PM_DEEPSLEEP_TIMERID_E timer_id, luat_pm_deep_sleep_mode_timer_callback_t callback);
/**
* @brief 启动深度睡眠模式下的软件定时器
*
* @param timer_id 定时器ID
* @param timeout 超时时间单位ms
* @return int =0成功其他失败
*/
int luat_pm_deep_sleep_mode_timer_start(LUAT_PM_DEEPSLEEP_TIMERID_E timer_id, int timeout);
/**
* @brief 停止深度睡眠模式下的软件定时器
*
* @param timer_id 定时器ID
* @return int =0成功其他失败
*/
int luat_pm_deep_sleep_mode_timer_stop(LUAT_PM_DEEPSLEEP_TIMERID_E timer_id);
/**
* @brief 检查深度睡眠模式下的软件定时器是否正在运行
*
* @param timer_id 定时器ID
* @return int =0未运行int =1正在运行
*/
int luat_pm_deep_sleep_mode_timer_is_running(LUAT_PM_DEEPSLEEP_TIMERID_E timer_id);
/**
* @brief 获取唤醒原因
*
* @return LUAT_PM_WAKEUP_REASON
*/
int luat_pm_get_wakeup_reason(void);
/*------------------------------------------------ timer end----------------------------------------------- */
/**
* @brief 手动控制USB电源
*
* @param onoff 0关其他开
* @return int =0成功其他失败
*/
int luat_pm_set_usb_power(uint8_t onoff);
/**@}*/
#endif