/*******************************************************************************
*
*
* File:         hal_pwr.h
* Description： pwr hal层头文件
* Version：      V0.1
* Date：         2023-07-21
* Author：       lyw
 *******************************************************************************/
#ifndef __HAL_PWR_H__
#define __HAL_PWR_H__

/*******************************************************************************
* 1.Included files
*******************************************************************************/
#include "tau_device_datatype.h"
#include "tau_common.h"
#include "hal_gpio.h"

/*******************************************************************************
* 2.Global constant and macro definitions using #define
*******************************************************************************/

/*******************************************************************************
* 3.Global structures, unions and enumerations using typedef
*******************************************************************************/
/**
* @brief IC主供电电源选择
*/
typedef enum
{
    PWR_SEL_IOV18           = 0,           /* IC选择IOV18主供电(默认值)          */
    PWR_SEL_TP18            = 1,           /* IC选择TP18主供电                */
    PWR_SEL_VCC             = 2,           /* IC选择VCC主供电                 */
    PWR_SEL_VDD13CP         = 3,           /* IC选择VDD13CP外接电源主供电*/
} pwr_main_power_sel_e;

/**
* @brief Sleep mode 供电模式
*/
typedef enum
{
    PWR_SLEEP_IN_NON               = 0,           /* Sleep Mode期间无外部供电(默认值) */
    PWR_SLEEP_IN_TP18              = 1,           /* Sleep Mode期间TP18有电,其他电源掉电或不存在 */
    PWR_SLEEP_IN_VCC               = 2,           /* Sleep Mode期间VCC有电,其他电源掉电或不存在 */
    PWR_SLEEP_IN_VCC_TP18          = 3,           /* Sleep Mode期间TP18与VCC有电,其他电源掉电或不存在 */
    PWR_SLEEP_IN_IOV18             = 4,           /* Sleep Mode期间IOV18有电,其他电源掉电或不存在 */
    PWR_SLEEP_IN_IOV18_TP18        = 5,           /* Sleep Mode期间IOV18与TP18有电,其他电源掉电或不存在 */
    PWR_SLEEP_IN_IOV18_VCC         = 6,           /* Sleep Mode期间IOV18与VCC有电,其他电源掉电或不存在 */
    PWR_SLEEP_IN_IOV18_VCC_TP18    = 7,           /* Sleep Mode期间IOV18、TP18、VCC均有电,其他电源掉电或不存在 */
} pwr_sleep_power_sel_e;

/**
* @brief sleep mode 唤醒沿配置
*/
typedef enum
{
    WUP_RISING_EDGE  = 2,  /* 上升沿唤醒 */
    WUP_FALLING_EDGE = 3   /* 下降沿唤醒 */
} pwr_wakeup_trigger_e;

/**
* @brief 软件启动原因
*/
typedef enum
{
    RF_POWER_ON             = 0,  /* Power On,正常上电 */
    RF_CORE_RST             = 1,  /* 软件reset, 调用NVIC_SystemReset产生reset */
    RF_WDT_RST              = 2,  /* WDT reset */
    RF_CHIP_RST             = 3,  /* Chip reset,调用hal_system_reset_chip产生的reset */
    RF_APRSTN_WAKEUP        = 4,  /* deep sleep mode 下AP_RSTN reset  */
    RF_TDINT_WAKEUP         = 5   /* deep sleep mode 下TD_INT reset  */
} pwr_reset_flag_e;

/**
* @brief pwr sleep mode type
* 不同sleep mode具体应用场景见《PWR说明文档》
*/
typedef enum
{
    PWR_NORMAL_SLEEP_MODE  = 0, /* 待机下需要处理外设(I2C)等事件使用,调用hal_pwr_enter_normal_sleep_mode 进入,hal_pwr_exit_sleep_mode退出 */
    PWR_STOP_SLEEP_MODE    = 1, /* 待机下需要通过任意GPIO唤醒时使用此模式,进入之前关闭所有模块以及MCU,通过hal_pwr_set_stop_sleep_wakeup_pin 注册GPIO中唤醒源,调用hal_pwr_enter_stop_sleep_mode 进入,hal_pwr_exit_sleep_mode退出 */
    PWR_DEEP_SLEEP_MODE    = 2  /* 待机下只需要通过AP RSTN跟TD INT引脚唤醒使用时使用此模式,调用hal_pwr_enter_deep_sleep_mode 唤醒后重启,通过hal_pwr_get_reset_flag确定唤醒源 */
} pwr_sleep_mode_e;

/*! @brief HV LDO输出电压配置*/
typedef enum _pwr_hv_ldo_e
{
    HV_LDO_0            = 0,    /*1.20V*/
    HV_LDO_1            = 1,    /*1.26V*/
    HV_LDO_2            = 2,    /*1.32V*/
    HV_LDO_3            = 3,    /*1.38V*/
    HV_LDO_4            = 4,    /*1.44V*/
    HV_LDO_5            = 5,    /*1.50V*/
    HV_LDO_6            = 6,    /*1.56V*/
    HV_LDO_7            = 7,    /*1.62V*/
    HV_LDO_8            = 8,    /*1.68V*/
    HV_LDO_9            = 9,    /*1.74V*/
    HV_LDO_10            = 10,    /*1.80V*/
    HV_LDO_11            = 11,    /*1.86V*/
    HV_LDO_12            = 12,    /*2.04V*/
    HV_LDO_13            = 13,    /*2.46V*/
    HV_LDO_14            = 14,    /*3.00V*/
    HV_LDO_15            = 15,    /*3.30V*/
} pwr_hv_ldo_e;

/*! @brief LDO 13S输出电压配置*/
typedef enum _pwr_ldo_13s_e
{
    LDO_13S_0            = 0,    /*1.22V*/
    LDO_13S_1            = 1,    /*1.25V*/
    LDO_13S_2            = 2,    /*1.27V*/
    LDO_13S_3            = 3,    /*1.30V*/
    LDO_13S_4            = 4,    /*1.33V*/
    LDO_13S_5            = 5,    /*1.37V*/
    LDO_13S_6            = 6,    /*1.40V*/
    LDO_13S_7            = 7,    /*1.43V*/
} pwr_ldo_13s_e;

/*! @brief LDO 18S输出电压配置*/
typedef enum _pwr_ldo_18s_e
{
    LDO_18S_0            = 0,    /*1.61V*/
    LDO_18S_1            = 1,    /*1.64V*/
    LDO_18S_2            = 2,    /*1.67V*/
    LDO_18S_3            = 3,    /*1.70V*/
    LDO_18S_4            = 4,    /*1.74V*/
    LDO_18S_5            = 5,    /*1.77V*/
    LDO_18S_6            = 6,    /*1.80V*/
    LDO_18S_7            = 7,    /*1.83V*/
} pwr_ldo_18s_e;

/*! @brief PWR PVD index */
typedef enum
{
    PVD_IOVCC          = 3,
    PVD_VCI            = 15,
} pwr_pvd_index_e;

/*******************************************************************************
* 4.Global variable extern declarations
*******************************************************************************/

/*******************************************************************************
* 5.Global function prototypes
*******************************************************************************/
/**
* @brief  IC主供电选择,如果是配置vcc主供电，可通过hal_pwr_get_vcc_power_ready获取电源状态
*         注:上电只能配置一次,不可随意切换
* @param  power_sel 主供电选择,见枚举描述
* @retval none
*/
void hal_pwr_set_main_power(pwr_main_power_sel_e power_sel);

/**
* @brief  获取VCC电源稳定状态,使用hal_pwr_set_main_power切换电源后,通过此接口获取电源稳定状态
* eg: 使用hal_pwr_set_main_power切换至VCC主供电,在VCC电源接口上电之前,此接口返回值为false
* @param  None
* @retval true-电源切换完成 false-电源未切换完成
*/
bool hal_pwr_get_vcc_power_ready(void);

/**
* @brief  配置VCC开关,芯片启动默认打开VCC CP,不存在VCC的情况下可关闭
* @param  enable: true:打开CP, false:关闭CP
* @retval none
*/
void hal_pwr_set_vcc_enable(bool enable);

/**
* @brief  sleep mode 期间电源情况配置
* 调用sleep mode之前配置,根据配置情况在sleep mode自动切换电源
* exit sleep mode后切换回hal_pwr_set_main_power的电源
* @param  powerin =000 息屏期间状态，IOV18掉电0，VCC掉电0，TP18也掉电0；
* @retval none
*/
void hal_pwr_set_sleep_mode_power(pwr_sleep_power_sel_e power_sel);

/**
* @brief  进入normal sleep mode 模式（详细使用方法见《PWR说明文档》）
*         待机下需要处理外设(I2C)等事件使用,图像通路关闭,MCU&外设正常运行
*         调用hal_pwr_exit_sleep_mode退出
* @param  none
* @retval bool true/false
*/
bool hal_pwr_enter_normal_sleep_mode(void);

/**
* @brief  进入stop sleep mode 模式（详细使用方法见《PWR说明文档》）
*         待机下需要通过任意GPIO唤醒时使用此模式，进入之前关闭所有模块,通过hal_pwr_set_stop_sleep_wakeup_pin 注册GPIO中唤醒源。
*         调用此接口后MCU会停止运行,等待中断唤醒后该函数才返回,调用hal_pwr_exit_sleep_mode真正退出stop sleep mode
* @param  none
* @retval io_pad_e:唤醒接口
*/
io_pad_e hal_pwr_enter_stop_sleep_mode(void);

/**
* @brief  注册 stop sleep mode 唤醒IO （详细使用方法见文档）
* @param  pad ：Pin name
* @param  trig：唤醒触发模式
* @retval true/false
*/
bool hal_pwr_set_stop_sleep_wakeup_pin(io_pad_e pad, pwr_wakeup_trigger_e trig);

/**
* @brief  进入deep sleep mode 模式, 等待AP_RSTN 或者TD_INT 唤醒
*         待机下只需要通过AP RSTN跟TD INT引脚唤醒使用时使用此模式，唤醒后重启,通过hal_pwr_get_reset_flag确定唤醒源
*         注意, 如果需要使用deep sleep mode,TD INT引脚不能悬空,必须有上拉或者下拉保证确定电平,否则会导致误唤醒
* @param  polarity true:上升沿唤醒 false:下降沿唤醒
* @retval none
*/
void hal_pwr_enter_deep_sleep_mode(pwr_wakeup_trigger_e ap_rstn_trig, pwr_wakeup_trigger_e td_int_trig);

/**
* @brief 退出sleep mode, normal/stop sleep mode都需要通过此接口退出
* @param  none
* @retval true/false
*/
bool hal_pwr_exit_sleep_mode(void);

/**
* @brief  获取系统复位原因
* @param  none
* @retval reset flag,见pwr_reset_flag_e
*/
pwr_reset_flag_e hal_pwr_get_reset_flag(void);

/**
* @brief  打开ELVCC作为供电电源
* @param  none
* @retval
*/
void hal_pwr_elvcc_ldo_en(bool enable);


/**
* @brief
* @param  HV LDO输出电压配置
          =0000：1.20V，
          =0001：1.26V，
          =0010：1.32V，
          =0011：1.38V，
          =0100：1.44V，
          =0101：1.50V，
          =0110：1.56V，
          =0111：1.62V，
          =1000：1.68V，
          =1001：1.74V，
          =1010：1.80V，
          =1011：1.86V，
          =1100：2.04V，
          =1101：2.46V，
          =1110：3.00V，
          =1111：3.30V
* @retval none
*/
void hal_pwr_elvcc_vol_set(pwr_hv_ldo_e voltage);

/**
* @brief
* @param  LDO18_S模块使能控制，=0关闭，默认关闭；=1开启
* @retval none
*/
void hal_pwr_ldo18s_en(bool enable);


/**
* @brief
* @param  LDO18_S输出电压配置，
         000=1.61V
         001=1.64V
         010=1.67V
         011=1.70V
         100=1.74V
         101=1.77V
         110=1.80V
         111=1.83V
* @retval none
*/
void hal_pwr_ldo18s_set(pwr_ldo_18s_e voltage);

/**
* @brief
* @param  LDO13_S模块使能控制，=0关闭，默认关闭；=1开启
* @retval none
*/
void hal_pwr_ldo13s_en(bool enable);


/**
* @brief
* @param  LDO13_S输出电压配置，
          000=1.22V,
          001=1.25V,
          010=1.27V,
          011=1.30V,
          100=1.33V，
          101=1.37V，
          110=1.40V，
          111=1.43V
* @retval none
*/
void hal_pwr_ldo13s_set(pwr_ldo_13s_e voltage);

/**
* @brief PVD(电源检查)开关接口,
*        PVD默认均为打开,注意!电源切换(如主供电切换,进出sleep mode)必须打开PVD!
* @param index:  PVD选择 IOVCC/VCI
* @param enable: PVD开关
* @retval none
*/
void hal_pwr_set_pvd(pwr_pvd_index_e index, bool enable);


#endif /* __HAL_PWR_H__ */
