Files
E3/20250218-ETH-CAN_loadV1.3/e3_176_ref/drivers/include/sdrv_pmu.h
2025-11-14 21:41:29 +08:00

1070 lines
33 KiB
C

/**
* @file sdrv_pmu.h
* @brief SemiDrive PMU header file.
*
* @copyright Copyright (c) 2022 Semidrive Semiconductor.
* All rights reserved.
*/
#ifndef SDRV_PMU_DRV_H_
#define SDRV_PMU_DRV_H_
#include <sdrv_common.h>
#include <types.h>
#include <part.h>
#define SDRV_PMU_WAKEUP_PIN0_MASK (0X1U)
#define SDRV_PMU_WAKEUP_PIN1_MASK (0X2U)
#define SDRV_PMU_WAKEUP_RTC_MASK (0X4U)
#define SDRV_PMU_WAKEUP_BC_MASK (0X8U)
/**
* @brief PMU status error code.
*/
enum sdrv_pmu_error {
SDRV_PMU_CONFIG_TYPE_WRONG = SDRV_ERROR_STATUS(SDRV_STATUS_GROUP_PMU, 0),
SDRV_PMU_CONFIG_NOT_SUPPORT = SDRV_ERROR_STATUS(SDRV_STATUS_GROUP_PMU, 1),
};
/**
* @brief Description for SRCS_BITS each bit.
*/
#if CONFIG_E3 || CONFIG_D3
enum srcs_bit {
SRCS_RSTGEN_SF_I_IST_EN_RTC_OVRD = 0U,
SRCS_RSTGEN_SF_I_IST_EN_RTC_OVVAL = 1U,
SRCS_ISTC_RTC_SS_POST_EN_OVVAL = 2U,
SRCS_ISTC_RTC_SS_POST_EN_OVRD = 3U,
SRCS_ISTC_PLL_CFG_POST_EN_OVVAL = 4U,
SRCS_ISTC_PLL_CFG_POST_EN_OVRD = 8U,
SRCS_ISTC_POWER_CFG_POST_EN_OVVAL = 9U,
SRCS_ISTC_POWER_CFG_POST_EN_OVRD = 13U,
SRCS_PT_SNS_SF_PT_SNS_AP_CVEN33_FORCE_OFF = 14U,
SRCS_ANA_SF_ANALOG_IP_CVEN33_FORCE_OFF = 15U,
SRCS_DCDC_ISO_EN_B = 16U,
SRCS_LDO_ISO_EN_B = 17U,
SRCS_BGR_LDO_AUTO_DISABLE_BY_PMU_EN = 18U,
SRCS_BGR_SF_AUTO_DISABLE_BY_SMC_EN = 19U,
SRCS_WAKEUP0_FALL_EDGE_TO_PULSE_EN = 20U,
SRCS_POR_SF_PU33_B = 21U,
SRCS_RC24M_PU33_B = 22U,
SRCS_VD_SF_PU33_B = 23U,
SRCS_BGR_ANA_PU33_B = 24U,
SRCS_BGR_SF_PU33_B = 25U,
SRCS_BGR_LDO_PU33_B = 26U,
SRCS_POR_AP_PU33_B = 27U,
SRCS_VD_AP_PU33_B = 28U,
SRCS_BGR_AP_PU33_B = 29U,
SRCS_BGR_DISP_PU33_B = 30U,
SRCS_WAKEUP0_RISE_EDGE_TO_PULSE_EN = 31U,
};
#endif
#if CONFIG_E3L
enum srcs_bit {
SRCS_RSTGEN_SF_I_IST_EN_RTC_OVRD = 0U,
SRCS_RSTGEN_SF_I_IST_EN_RTC_OVVAL = 1U,
SRCS_ISTC_RTC_SS_POST_EN_OVVAL = 2U,
SRCS_ISTC_RTC_SS_POST_EN_OVRD = 3U,
SRCS_ISTC_PLL_CFG_POST_EN_OVVAL = 4U,
SRCS_ISTC_PLL_CFG_POST_EN_OVRD = 8U,
SRCS_ISTC_POWER_CFG_POST_EN_OVVAL = 9U,
SRCS_ISTC_POWER_CFG_POST_EN_OVRD = 13U,
SRCS_DCDC_ISO_EN_B = 16U,
SRCS_SCR_CFG_LATCH_EN = 17U,
SRCS_BGR_SF_AUTO_DISABLE_BY_SMC_EN = 19U,
SRCS_WAKEUP0_FALL_EDGE_TO_PULSE_EN = 20U,
SRCS_POR_SF_PU33_B = 21U,
SRCS_RC24M_PU33_B = 22U,
SRCS_VD_SF_PU33_B = 23U,
SRCS_BGR_ANA_PU33_B = 24U,
SRCS_BGR_SF_PU33_B = 25U,
SRCS_SADC1_CVEN33 = 26U,
SRCS_SACMP1_CVEN33 = 27U,
SRCS_APAD_CVEN33_B0_B1 = 28U,
SRCS_APAD_CVEN33_B2_B8 = 29U,
SRCS_OTHER_CVEN33 = 30U,
SRCS_WAKEUP0_RISE_EDGE_TO_PULSE_EN = 31U,
};
#endif
/**
* @brief Definition for pmu wakeup pin and button control active level or pulse.
*/
typedef enum sdrv_pmu_polarity {
SDRV_PMU_HIGH_LEVEL = 0,
SDRV_PMU_LOW_LEVEL,
SDRV_PMU_RISING_EDGE,
SDRV_PMU_FALLING_EDGE,
} sdrv_pmu_polarity_e;
/**
* @brief Definition for pmu select which edge needs to apply the filter.
*/
typedef enum sdrv_pmu_edge_filter_enum {
SDRV_PMU_FILTER_RISING = 0,
SDRV_PMU_FILTER_FALLING,
SDRV_PMU_FILTER_BOTH_EDGE,
} sdrv_pmu_edge_filter_e;
/**
* @brief Definition for pmu wakeup pin.
*/
typedef enum sdrv_pmu_wakeup_pin {
SDRV_PMU_WAKEUP_PIN_0 = 0,
SDRV_PMU_WAKEUP_PIN_1,
} sdrv_pmu_wakeup_pin_e;
/**
* @brief Definition for wakeup pin glitch, glitch is enable if wakeup edge < 32K cycle.
*/
typedef enum sdrv_pmu_wakeup_glitch {
SDRV_PMU_GLITCH_NONE = 0,
SDRV_PMU_GLITCH_RISING = 1,
SDRV_PMU_GLITCH_FALLING = 2,
SDRV_PMU_GLITCH_BOTH = 3,
} sdrv_pmu_wakeup_glitch_e;
/**
* @brief Definition for pmu wakeup pin logic.
*/
typedef enum sdrv_pmu_wakeup_pin_logic {
SDRV_PMU_WAKEUP_PIN_OR = 0, /**< generate wakeup event either pin0 or pin1 active. */
SDRV_PMU_WAKEUP_PIN_AND, /**< generate wakeup event both pin0/1 active. */
} sdrv_pmu_wakeup_pin_logic_e;
/**
* @brief Definition for pmu action when receive wakeup during rtc state.
*
* PMU has RTC and OFF state. During RTC state, pmu doesn't respond to wakeup
* event. It only responds to wakeup event in OFF state.
*/
typedef enum sdrv_pmu_wakeup_in_rtc {
SDRV_PMU_WAKEUP_IN_RTC_IGNORE = 0, /**< ignore wakeup event in rtc state */
SDRV_PMU_WAKEUP_IN_RTC_LATCH, /**< latch wakeup event in rtc state */
} sdrv_pmu_wakeup_in_rtc_e;
/**
* @brief Definition for PMU work mode.
*/
typedef enum sdrv_pmu_mode {
SDRV_PMU_RUN = 0,
SDRV_PMU_SLEEP,
SDRV_PMU_HIBERNATE,
SDRV_PMU_RTC,
} sdrv_pmu_mode_e;
/**
* @brief Definition for config pwrctrl and pwron delay setting in different period.
*/
typedef enum sdrv_pmu_delay_period {
SDRV_PMU_PWRUP_DELAY = 0,
SDRV_PMU_RUN_DELAY,
SDRV_PMU_SLEEP_DELAY,
SDRV_PMU_HIB_DELAY,
SDRV_PMU_RTC_DELAY,
} sdrv_pmu_delay_period_e;
/**
* @brief Definition for config minimal delay for state transition.
*/
typedef enum sdrv_pmu_state {
SDRV_PMU_STATE_PWR_ON = 0,
SDRV_PMU_STATE_PWRUP_RUN,
SDRV_PMU_STATE_SLEEP_RUN,
SDRV_PMU_STATE_HIBERNATE_RUN,
} sdrv_pmu_state_e;
/**
* @brief Definition for pmu pwr_ctrl and pwr_on enable or disable.
*/
typedef enum sdrv_pmu_ctrl {
SDRV_PMU_CTRL_OFF = 0,
SDRV_PMU_CTRL_ON,
} sdrv_pmu_ctrl_e;
/**
* @brief Definition for pmu pwr_ctrl and pwr_on operate by hardware or
* software override.
*/
typedef enum sdrv_pmu_operate {
SDRV_PMU_MANUAL = 0,
SDRV_PMU_AUTO,
} sdrv_pmu_operate_e;
/**
* @brief Definition for PWRCTRL active level.
*/
typedef enum sdrv_pmu_pwr_ctrl_polarity {
SDRV_PMU_PWR_CTRL_HIGH_ACTIVE = 0,
SDRV_PMU_PWR_CTRL_LOW_ACTIVE,
} sdrv_pmu_pwr_ctrl_polarity_e;
/**
* @brief Definition for pmu pwr_ctrl.
*/
typedef enum sdrv_pmu_pwr_ctrl {
SDRV_PMU_PWR_CTRL_0 = 0,
SDRV_PMU_PWR_CTRL_1,
SDRV_PMU_PWR_CTRL_2,
SDRV_PMU_PWR_CTRL_3,
} sdrv_pmu_pwr_ctrl_e;
/**
* @brief Definition for pmu pwr_on, now pwr_on_0 use for internal
* DCDC, pwr_on_2 use for internal LDO.
*/
typedef enum sdrv_pmu_pwr_on {
SDRV_PMU_PWR_ON_0 = 0,
SDRV_PMU_PWR_ON_1,
SDRV_PMU_PWR_ON_2,
SDRV_PMU_PWR_ON_3,
} sdrv_pmu_pwr_on_e;
/**
* @brief Definition for pmu pwr_on control target. It use for hardware power on
* sequence.
*/
typedef enum sdrv_pmu_target {
SDRV_PMU_SAF = 0,
SDRV_PMU_AP,
SDRV_PMU_OTHER,
} sdrv_pmu_target_e;
/**
* @brief Definition for pmu power good config.
*/
typedef enum sdrv_pmu_pg {
SDRV_PMU_POWER_GOOD_ENABLE = 0,
SDRV_PMU_POWER_GOOD_DISABLE,
} sdrv_pmu_pg_e;
/**
* @brief Definition for wakeup source.
*/
typedef enum sdrv_pmu_wakeup_src {
SDRV_PMU_WAKEUP_BY_BC = 0x1U,
SDRV_PMU_WAKEUP_BY_RTC = 0x2U,
SDRV_PMU_WAKEUP_BY_PIN = 0x4U,
SDRV_PMU_WAKEUP_BY_HW_RESET = 0x8U,
} sdrv_pmu_wakeup_src_e;
/**
* @brief Definition for hardware power down request.
*/
typedef enum sdrv_pmu_hw_power_down_req {
SDRV_PMU_SEM_INT_POWER_DOWN_REQ = 0x1U,
SDRV_PMU_RESERVED_POWER_DOWN_REQ = 0x2U,
SDRV_PMU_FS32K_LVPG_POWER_DOWN_REQ = 0x4U,
SDRV_PMU_VD_SF_INT_POWER_DOWN_REQ = 0x8U,
SDRV_PMU_VD_AP_INT_POWER_DOWN_REQ = 0x10U,
SDRV_PMU_SF_PT_SENSOR_INT_POWER_DOWN_REQ = 0x20U,
SDRV_PMU_AP_PT_SENSOR_INT_POWER_DOWN_REQ = 0x40U,
SDRV_PMU_EFUSE_VIO_POWER_DOWN_REQ = 0x80U,
} sdrv_pmu_hw_power_down_req_e;
/**
* @brief Definition for power down reason.
*/
typedef enum sdrv_pmu_power_down_reason {
SDRV_PMU_POWER_DOWN_SMC_CHECK_FAIL = 0U,
SDRV_PMU_POWER_DOWN_RESERVED,
SDRV_PMU_POWER_DOWN_SEM_INT,
SDRV_PMU_POWER_DOWN_RESERVED_1,
SDRV_PMU_POWER_DOWN_FS32K_LVPG,
SDRV_PMU_POWER_DOWN_VD_SF_INT,
SDRV_PMU_POWER_DOWN_VD_AP_INT,
SDRV_PMU_POWER_DOWN_SF_PT_SENSOR_INT,
SDRV_PMU_POWER_DOWN_AP_PT_SENSOR_INT,
SDRV_PMU_POWER_DOWN_EFUSE_VIO,
SDRV_PMU_POWER_DOWN_SOFTWARE,
SDRV_PMU_POWER_DOWN_BC,
} sdrv_pmu_power_down_reason_e;
/**
* @brief Definition for PMU interrupt type.
*/
typedef enum sdrv_pmu_int_type {
SDRV_PMU_INT_PWRON0_RDY_TIMEOUT = 1U << 0U,
SDRV_PMU_INT_PWRON2_RDY_TIMEOUT = 1U << 2U,
SDRV_PMU_INT_PWRUP_TO_RUN_TIMEOUT = 1U << 4U,
SDRV_PMU_INT_SLEEP_TO_RUN_TIMEOUT = 1U << 5U,
SDRV_PMU_INT_HIBERNATE_TO_RUN_TIMEOUT = 1U << 6U,
SDRV_PMU_INT_LOCKSTEP_ERR = 1U << 7U,
SDRV_PMU_INT_SWM_WARN = 1U << 10U,
SDRV_PMU_INT_SWM_FATAL = 1U << 11U,
SDRV_PMU_INT_POWER_DOWN_REQ = 1U << 12U,
} sdrv_pmu_int_type_e;
/**
* @brief Definition for PMU Wakeup pin and BC edge filter config.
* filter time = 32K cycle * (2 ^ sample interval) * (counter + 2)
*/
typedef struct sdrv_pmu_edge_filter {
bool enable_filter; /**< enable filter for wakeup pin */
uint8_t filter_sample_interval; /**< sample interval setting for wakeup pin */
uint8_t filter_count; /**< filter counter for wakeup pin */
sdrv_pmu_edge_filter_e filter_type; /**< filter type */
} sdrv_pmu_edge_filter_t;
/**
* @brief Definition for PMU BC level filter config.
*/
typedef struct sdrv_pmu_level_filter {
uint8_t min_window_for_on;
uint8_t max_window_for_on;
uint8_t min_window_for_off;
uint8_t max_window_for_off;
} sdrv_pmu_level_filter_t;
/**
* @brief Definition for PMU BC level filter enable config.
*/
typedef struct sdrv_pmu_level_filter_enable {
uint8_t bc_cnt_unit; /**< real window setting is min/max window * 2^bc_cnt_unit
bc_cnt_unit must be smaller than 12 */
bool max_window_for_on_en;
bool max_window_for_off_en;
} sdrv_pmu_level_filter_enable_t;
/**
* @brief Definition for button config active level or pulse to enter/exit rtc mode.
*/
typedef struct sdrv_pmu_bc_config {
sdrv_pmu_polarity_e bc_off_pol; /**< enter RTC mode */
sdrv_pmu_polarity_e bc_on_pol; /**< exit RTC mode */
} sdrv_pmu_bc_config_t;
/**
* @brief Definition for wakeup pin active level or pulse to wakeup.
*/
typedef struct sdrv_pmu_wakeup_pin_config {
sdrv_pmu_polarity_e pin_pol; /**< wakeup signal active type */
} sdrv_pmu_wakeup_pin_config_t;
/**
* @brief Definition for wakeup pins config parameters.
*/
typedef struct sdrv_pmu_wakeuppins_config {
sdrv_pmu_wakeup_pin_logic_e logic;
sdrv_pmu_wakeup_in_rtc_e latch;
bool wakepin0_en;
sdrv_pmu_wakeup_glitch_e wakepin0_glitch;
sdrv_pmu_polarity_e wakepin0_pol;
sdrv_pmu_edge_filter_t wakepin0_filter;
bool wakepin1_en;
sdrv_pmu_polarity_e wakepin1_pol;
sdrv_pmu_edge_filter_t wakepin1_filter;
} sdrv_pmu_wakeuppins_config_t;
/**
* @brief Definition for button control config parameters.
*/
typedef struct sdrv_pmu_buttonctrl_config {
sdrv_pmu_bc_config_t polarity;
sdrv_pmu_edge_filter_t edge_filter;
sdrv_pmu_level_filter_enable_t level_filter_en;
sdrv_pmu_level_filter_t level_filter_para;
bool fsm_enable;
} sdrv_pmu_buttonctrl_config_t;
/**
* @brief Definition for power good watchdog on pwron.
*/
typedef struct sdrv_pmu_pwron_wdt_config {
uint8_t por_tw; /**< power good time window. */
uint8_t por_tw_adj; /**< power good time window adjustment */
uint8_t wdt_div; /**< counter increase interval */
} sdrv_pmu_pwron_wdt_config_t;
/**
* @brief Definition for WDT counter and enable config.
*/
typedef struct sdrv_pmu_pwron_wdt_enable {
bool pwron_wdt_en; /**< enable pwron watchdog counter */
uint8_t wdt_counter; /**< timeout setting */
} sdrv_pmu_pwron_wdt_enable_t;
/**
* @brief Definition for pmu pwr ctrl config.
*/
typedef struct sdrv_pmu_pwrctrl_config {
sdrv_pmu_ctrl_e ctrl_status; /**< on or off */
sdrv_pmu_operate_e ctrl_operate; /**< auto or manual */
} sdrv_pmu_pwrctrl_config_t;
/**
* @brief Definition for setting for pwrctrl0-3 minimal delay enable config.
*/
typedef struct sdrv_pmu_pwrctrl_min_delay_config {
bool pwrup_run_min_delay_en;
bool sleep_run_min_delay_en;
bool hibernate_run_min_delay_en;
} sdrv_pmu_pwrctrl_min_delay_config_t;
/**
* @brief Definition for pmu pwr on config.
*/
typedef struct sdrv_pmu_pwron_config {
sdrv_pmu_ctrl_e ctrl_status; /**< on or off */
sdrv_pmu_operate_e ctrl_operate; /**< auto or manual */
} sdrv_pmu_pwron_config_t;
/**
* @brief Enable wakeup source when in RTC mode.
*
* This function enable which source can use to wakeup from RTC mode.
* Source are: SDRV_PMU_WAKEUP_PIN0_MASK, SDRV_PMU_WAKEUP_PIN1_MASK
* SDRV_PMU_WAKEUP_RTC_MASK, SDRV_PMU_WAKEUP_BC_MASK
*
* @param [in] enable_bitmap OR'ed value of the source.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_wakeup_enable(uint32_t enable_bitmap);
/**
* @brief Disable wakeup source when in RTC mode.
*
* This function disable which source can use to wakeup from RTC mode.
* Source are: SDRV_PMU_WAKEUP_PIN0_MASK, SDRV_PMU_WAKEUP_PIN1_MASK
* SDRV_PMU_WAKEUP_RTC_MASK, SDRV_PMU_WAKEUP_BC_MASK
*
* @param [in] disable_bitmap OR'ed value of the source.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_wakeup_disable(uint32_t disable_bitmap);
/**
* @brief Config button control register.
*
* This function config button control enter/exit rtc mode active level or
* pulse.
*
* @param [in] bc_config button control config.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_button_control_init(sdrv_pmu_bc_config_t *bc_config);
/**
* @brief Config edge filter for button control.
*
* @param [in] filter_config edge filter parameters.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_button_control_edge_filter_config(sdrv_pmu_edge_filter_t *filter_config);
/**
* @brief Config level filter parameters for button control.
*
* @param [in] filter_config level filter parameters.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_button_control_level_filter_para(sdrv_pmu_level_filter_t *filter_config);
/**
* @brief Enable level filter for button control.
*
* @param [in] filter_config level filter config.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_button_control_level_filter_config(sdrv_pmu_level_filter_enable_t *filter_config);
/**
* @brief Config hardware power down request enable.
*
* @param [in] enable_bitmap OR' value defined in sdrv_pmu_hw_power_down_req_e.
* @param [in] enable enable or disable.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_hardware_power_down_request_enable(uint32_t enable_bitmap, bool enable);
/**
* @brief Enable or Disable button control function.
*
* This function config whether use button control or not.
*
* @param [in] enable true represents enable, false represents disable.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_button_control_enable(bool enable);
/**
* @brief Enable status monitor for button control.
*
* This function enable satus monitor for button control.
* When enabled, only responds the valid power on request in BC_OFF state,
* and only respond the valid power off request in BC_ON state.
*
* @param [in] enable true represents enable fsm check, false represents disable fsm check.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_button_control_fsm_enable(bool enable);
/**
* @brief Initialize button control parameter config.
*
* @param [in] config bc config parameter.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_button_control_config(sdrv_pmu_buttonctrl_config_t *config);
/**
* @brief Config specific wakeup pin.
*
* This function config wakeup pin active level or pulse.
*
* @param [in] wakeup_pin wakeup pin defined in sdrv_pmu_wakeup_pin_e.
* @param [in] pin_config wakeup pin config parameters.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_wakeup_pin_init(sdrv_pmu_wakeup_pin_e wakeup_pin, sdrv_pmu_wakeup_pin_config_t *pin_config);
/**
* @brief Config edge filter for wakeup pin.
*
* This function config edge filter parameters for specific wakeup pin.
*
* @param [in] wakeup_pin wakeup pin defined in sdrv_pmu_wakeup_pin_e.
* @param [in] filter_config wakeup pin filter parameters.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_wakeup_pin_filter_config(sdrv_pmu_wakeup_pin_e wakeup_pin, sdrv_pmu_edge_filter_t *filter_config);
/**
* @brief Enable or Disable specific system wakeup pin.
*
* This function config whether specific wakeup pin use or not.
*
* @param [in] wakeup_pin wakeup pin defined in sdrv_pmu_wakeup_pin_e.
* @param [in] enable true represents enable, false represents disable.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_wakeup_pin_enable(sdrv_pmu_wakeup_pin_e wakeup_pin, bool enable);
/**
* @brief Config wakeup pin 0/1 generate wakeup event logic.
*
* This function config whether generate wakeup event needs both wakeup pins active or not.
*
* @param [in] logic defined in sdrv_pmu_wakeup_pin_logic_e.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_wakeup_pin_logic_set(sdrv_pmu_wakeup_pin_logic_e logic);
/**
* @brief Config pmu action when receive wakeup event during rtc state.
*
* PMU has RTC and OFF state. During RTC state, pmu doesn't respond to wakeup
* event. It only responds to wakeup event in OFF state. This function config whether pmu ignore
* rtc state wakeup event or latch wakeup when enter off state.
*
* @param [in] latch defined in sdrv_pmu_wakeup_in_rtc_e.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_wakeup_latch_set(sdrv_pmu_wakeup_in_rtc_e latch);
/**
* @brief Config Wake pin 0 and 1 enable and active level.
*
* @param [in] config config parameters defined in sdrv_pmu_wakeuppins_config_t.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_wakeup_pins_config(sdrv_pmu_wakeuppins_config_t *config);
/**
* @brief Software trigger power down.
*
* This function write register to trigger power down request. After call this function, system will enter
* RTC mode at once.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_power_down(void);
/**
* @brief Config power good watchdog parameters for pwron.
*
* @param [in] wdt_config pwron watchdog config parameters.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_pwron_watchdog_config(sdrv_pmu_pwron_wdt_config_t *wdt_config);
/**
* @brief Enable power good watchdog counter for specific pwron.
*
* @param [in] pwron pwron defined in sdrv_pmu_pwr_on_e.
* @param [in] enable_config enable config.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_pwron_watchdog_enable(sdrv_pmu_pwr_on_e pwron, sdrv_pmu_pwron_wdt_enable_t *enable_config);
/**
* @brief Config pwr ctrl output level for different mode.
*
* This function config pwr ctrl output level under run/sleep/hibernate/rtc mode.
*
* @param [in] ctrl pwr ctrl pin defined in sdrv_pmu_pwr_ctrl_e.
* @param [in] mode pmu work mode defined in sdrv_pmu_mode_e.
* @param [in] config config parameters.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_pwrctrl_config(sdrv_pmu_pwr_ctrl_e ctrl, sdrv_pmu_mode_e mode, sdrv_pmu_pwrctrl_config_t *config);
/**
* @brief Config pwrctrl0-3 minimal delay enable config during pwrup/sleep/hibernate to run mode.
*
* @param [in] config minimal delay enable config.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_pwrctrl_min_delay_config(sdrv_pmu_pwrctrl_min_delay_config_t *config);
/**
* @brief Config pwrctrl0-3 active level.
*
* @param [in] ctrl pwr ctrl pin defined in sdrv_pmu_pwr_ctrl_e.
* @param [in] pol high or low level represents pwrctrl on.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_pwrctrl_polarity_config(sdrv_pmu_pwr_ctrl_e ctrl, sdrv_pmu_pwr_ctrl_polarity_e pol);
/**
* @brief Enable software override pwrctrl.
*
* @param [in] ctrl pwr ctrl pin defined in sdrv_pmu_pwr_ctrl_e.
* @param [in] enable true or false.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_pwrctrl_software_override_enable(sdrv_pmu_pwr_ctrl_e ctrl, bool enable);
/**
* @brief Software override pwrctrl value.
*
* @param [in] ctrl pwr ctrl pin defined in sdrv_pmu_pwr_ctrl_e.
* @param [in] value true or false.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_pwrctrl_software_override_value(sdrv_pmu_pwr_ctrl_e ctrl, bool value);
/**
* @brief Config pwrctrl delay setting in different period.
*
* Delay time = 32Kcycle * (2^delay) * (delay_adj * 2 + 1)
*
* @param [in] period period defined in sdrv_pmu_delay_period_e.
* @param [in] ctrl pwr ctrl pin defined in sdrv_pmu_pwr_ctrl_e.
* @param [in] delay delay value.
* @param [in] delay_adj delay adjust value.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_pwrctrl_delay_config(sdrv_pmu_delay_period_e period, sdrv_pmu_pwr_ctrl_e ctrl, uint8_t delay, uint8_t delay_adj);
/**
* @brief Config pwr on whether work for different mode.
*
* This function config pwr on whether work under run/sleep/hibernate/rtc mode.
*
* @param [in] ctrl pwr on defined in sdrv_pmu_pwr_on_e.
* @param [in] mode pmu work mode defined in sdrv_pmu_mode_e.
* @param [in] config config parameters.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_pwron_config(sdrv_pmu_pwr_on_e ctrl, sdrv_pmu_mode_e mode, sdrv_pmu_pwron_config_t *config);
/**
* @brief Config pwron power supply target under different mode.
*
* @param [in] ctrl pwr on defined in sdrv_pmu_pwr_on_e.
* @param [in] mode pmu work mode defined in sdrv_pmu_mode_e.
* @param [in] target target defined in sdrv_pmu_target_e.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_pwron_target_config_with_mode(sdrv_pmu_pwr_on_e ctrl, sdrv_pmu_mode_e mode, sdrv_pmu_target_e target);
/**
* @brief Config internal DCDC/LDO power supply.
*
* This function config internal DCDC/LDO power supply to SAF/AP/Others.
* It will effect hardware power on sequence.
*
* @param [in] ctrl pwr on defined in sdrv_pmu_pwr_on_e.
* @param [in] target target defined in sdrv_pmu_target_e.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_pwron_target_config(sdrv_pmu_pwr_on_e ctrl, sdrv_pmu_target_e target);
/**
* @brief Config SAF/AP domain whether powered under different mode.
*
* This function config SAF/AP domain whether powered in run/sleep/hibernate/rtc mode.
* For example, if AP domain config powered in run mode and not powered in hibernate mode,
* after wakeup from hibernate to run, hardware will auto reset ap domain.
*
* @param [in] target target defined in sdrv_pmu_target_e.
* @param [in] mode mode defined in sdrv_pmu_mode_e.
* @param [in] powered true represents powered, false represents not powered.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_target_power_on_config(sdrv_pmu_target_e target, sdrv_pmu_mode_e mode, bool powered);
/**
* @brief Config pwron delay setting in different period.
*
* Delay time = 32Kcycle * (2^delay) * (delay_adj * 2 + 1)
*
* @param [in] period period defined in sdrv_pmu_delay_period_e.
* @param [in] ctrl pwron defined in sdrv_pmu_pwr_on_e.
* @param [in] delay delay value.
* @param [in] delay_adj delay adjust value.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_pwron_delay_config(sdrv_pmu_delay_period_e period, sdrv_pmu_pwr_on_e ctrl, uint8_t delay, uint8_t delay_adj);
/**
* @brief Enable software override pwron.
*
* @param [in] ctrl pwron defined in sdrv_pmu_pwr_on_e.
* @param [in] enable true or false.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_pwron_software_override_enable(sdrv_pmu_pwr_on_e ctrl, bool enable);
/**
* @brief Software override pwron value.
*
* @param [in] ctrl pwron defined in sdrv_pmu_pwr_on_e.
* @param [in] value true or false.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_pwron_software_override_value(sdrv_pmu_pwr_on_e ctrl, bool value);
/**
* @brief Config minimal delay for pmu state transition.
*
* Delay time = 32Kcycle * (2^delay) * (delay_adj * 2 + 1)
*
* @param [in] state state defined in sdrv_pmu_state_e.
* @param [in] delay delay value.
* @param [in] delay_adj delay adjust.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_minimal_delay_for_state_transition(sdrv_pmu_state_e state, uint8_t delay, uint8_t delay_adj);
/**
* @brief Enable PMU internal interrupt.
*
* @param [in] bitmap OR'Value defined in sdrv_pmu_int_type_e.
* @param [in] enable true or false.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_interrupt_enable(uint32_t bitmap, bool enable);
/**
* @brief Get PMU internal interrupt status.
*
* @return OR'Value defined in sdrv_pmu_int_type_e.
*/
uint32_t sdrv_pmu_get_interrupt_status(void);
/**
* @brief Clear PMU internal interrupt status.
*
* @param [in] bitmap OR'Value defined in sdrv_pmu_int_type_e.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_clear_interrupt_status(uint32_t bitmap);
/**
* @brief Set corresponding bit to 1 for 32bit state retention bits register.
*
* @param [in] bitmap each bit description in enum srcs_bit
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_srcs_set(uint32_t bitmap);
/**
* @brief Clear corresponding bit to 0 for 32bit state retention bits register.
*
* @param [in] bitmap each bit description in enum srcs_bit
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_srcs_clear(uint32_t bitmap);
/**
* @brief Enable or disable analog IP power.
*
* This function config PMU to control SF voltage detect analog power.
* Default is power on.
*
* @param [in] enable true represents power on, false represents power down.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_vd_sf_ana_enable(bool enable);
/**
* @brief Enable or disable analog IP power.
*
* This function config PMU to control SF POR analog power.
* Default is power on.
*
* @param [in] enable true represents power on, false represents power down.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_por_sf_enable(bool enable);
/**
* @brief Enable or disable analog IP power.
*
* This function config PMU to control rc24m analog power.
* Default is power on.
*
* @param [in] enable true represents power on, false represents power down.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_rc24m_enable(bool enable);
/**
* @brief Enable or disable analog IP power.
*
* This function config PMU to control bgr_sf power.
* Default is power on.
*
* @param [in] enable true represents power on, false represents power down.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_bgr_sf_enable(bool enable);
/**
* @brief Enable or disable analog IP power.
*
* This function config PMU to control bgr ldo power.
* Default is power on.
*
* @param [in] enable true represents power on, false represents power down.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_bgr_ldo_enable(bool enable);
/**
* @brief Enable or disable analog IP power.
*
* This function config PMU to control bgr ana sf1 sf2 power.
* Default is power on.
*
* @param [in] enable true represents power on, false represents power down.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_bgr_ana_sf1_sf2_enable(bool enable);
/**
* @brief Enable or disable analog IP power.
*
* This function config PMU to control AP voltage detect analog power.
* Default is power on.
*
* @param [in] enable true represents power on, false represents power down.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_vd_ap_enable(bool enable);
/**
* @brief Enable or disable analog IP power.
*
* This function config PMU to control AP POR analog power.
* Default is power on.
*
* @param [in] enable true represents power on, false represents power down.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_por_ap_enable(bool enable);
/**
* @brief Enable or disable analog IP power.
*
* This function config PMU to control bgr ap power.
* Default is power on.
*
* @param [in] enable true represents power on, false represents power down.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_bgr_ap_enable(bool enable);
/**
* @brief Enable or disable analog IP power.
*
* This function config PMU to control bgr display power.
* Default is power on.
*
* @param [in] enable true represents power on, false represents power down.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_bgr_disp_enable(bool enable);
/**
* @brief Enable or disable analog IP power.
*
* This function config PMU to control pt_sns_sf/pt_sns_ap, analog ip, such as adc, acmp cven33 power.
* Default is power on.
*
* @param [in] enable true represents power on, false represents power down.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_analog_cven33_enable(bool enable);
/**
* @brief Enable or disable analog IP power.
*
* This function config PMU to control pt_sns_sf/pt_sns_ap cven33 power.
* Default is power on.
*
* @param [in] enable true represents power on, false represents power down.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_pt_sns_enable(bool enable);
/**
* @brief Enable or disable analog IP power.
*
* This function config PMU to control ana_sf analog IP cven33 power.
* Default is power on.
*
* @param [in] enable true represents power on, false represents power down.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_ana_sf_analog_enable(bool enable);
/**
* @brief Config bgr_ldo auto-disable.
*
* This function config whether bgr_ldo auto-disable with rc24m/xtal24m when enter low power mode.
*
* @param [in] enable true represents auto-disable with rc24m/xtal24m, false represents not.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_bgr_ldo_auto_disable(bool enable);
/**
* @brief Config bgr_sf auto-disable.
*
* This function config whether bgr_sf auto-disable with rc24m/xtal24m when enter low power mode.
*
* @param [in] enable true represents auto-disable with rc24m/xtal24m, false represents not.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_bgr_sf_auto_disable(bool enable);
/**
* @brief Enable glitch circle for wakeup pin 0.
*
* This function enable glitch circle for wakeup pin 0, in this case, it can glitch < 32khz pulse.
* When enable this feature, filter for wakeup 0 will be disabled.
*
* @param [in] mask OR'ed value, bit0: rising edge, bit1: falling edge.
* for example: (1<<0) | (1<<1) means both edge.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_wakeup0_glitch_enable(uint32_t mask);
/**
* @brief Disable glitch circle for wakeup pin 0.
*
* This function disable glitch circle for wakeup pin 0, in this case, it can't glitch < 32khz pulse.
* When both edge disabled, filter for wakeup 0 will be re-enabled.
*
* @param [in] mask OR'ed value, bit0: rising edge, bit1: falling edge.
* for example: (1<<0) | (1<<1) means both edge.
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_wakeup0_glitch_disable(uint32_t mask);
/**
* @brief Config saf domain 3.3v and 0.8v power good monitor.
*
* This function config saf domain power monitor , when enabled, once 3.3v or 0.8v is
* not good, saf isolate and sf_por_b is assert. After power is good, saf isolate and
* sf_por_b deassert.
*
* @param [in] cfg SDRV_PMU_POWER_GOOD_ENABLE/SDRV_PMU_POWER_GOOD_DISABLE
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_saf_domain_power_good_monitor(sdrv_pmu_pg_e cfg);
/**
* @brief Config ap domain 3.3v and 0.8v power good monitor.
*
* This function config ap domain power monitor , when enabled, once 3.3v or 0.8v is
* not good, ap isolate and sf_por_b is assert. After power is good, ap isolate and
* sf_por_b deassert.
*
* @param [in] cfg SDRV_PMU_POWER_GOOD_ENABLE/SDRV_PMU_POWER_GOOD_DISABLE
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_ap_domain_power_good_monitor(sdrv_pmu_pg_e cfg);
/**
* @brief Config saf domain power good consider or ignore when switching from RTC state to OFF state.
*
* This function config saf domain power good whether consider when enter RTC mode. If enabled, switching
* from RTC state to OFF state only when the power down counter is done and saf domain power are not good.
* If disabled, switching from RTC state to OFF state only when the power down counter is done, but ignore
* saf domain power good.
*
* @param [in] cfg SDRV_PMU_POWER_GOOD_ENABLE/SDRV_PMU_POWER_GOOD_DISABLE
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_rtc_to_off_saf_domain_power_good(sdrv_pmu_pg_e cfg);
/**
* @brief Config ap domain power good consider or ignore when switching from RTC state to OFF state.
*
* This function config ap domain power good whether consider when enter RTC mode. If enabled, switching
* from RTC state to OFF state only when the power down counter is done and ap domain power are not good.
* If disabled, switching from RTC state to OFF state only when the power down counter is done, but ignore
* ap domain power good.
*
* @param [in] cfg SDRV_PMU_POWER_GOOD_ENABLE/SDRV_PMU_POWER_GOOD_DISABLE
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_rtc_to_off_ap_domain_power_good(sdrv_pmu_pg_e cfg);
/**
* @brief Get system wakeup source.
*
* This function read pmu wakeup source, return value is OR'ed value of sdrv_pmu_wakeup_src_e
*
* @return uint32_t OR'ed value of sdrv_pmu_wakeup_src_e
*/
uint32_t sdrv_pmu_get_wakeup_source(void);
/**
* @brief Clear system wakeup source.
*
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_clear_wakeup_source(void);
/**
* @brief Get system power down reason.
*
* This function return last power down reason, each bit represent reason see sdrv_pmu_power_down_reason_e.
*
* @return uint32_t power down reason.
*/
uint32_t sdrv_pmu_get_power_down_reason(void);
/**
* @brief Clear system power down reason.
*
* @return SDRV_STATUS_OK or error code.
*/
status_t sdrv_pmu_clear_power_down_reason(void);
/**
* @brief Get PMU internal state.
*
* @return PMU_STATE register value.
*/
uint32_t sdrv_pmu_get_state(void);
#endif /* SDRV_PMU_DRV_H_ */