MXC-A36_2024.04.17/MXC-Screen_display/components/drivers/peripheral/Src/driver_pmu.c

592 lines
19 KiB
C

#include "fr30xx.h"
#define PMU_FSM_ON_DIV 0x04 //the follow tcnt based <((DIV+1))*40K_CLK(rc)>
#define PMU_PMU_ON_CNT (0x18<<0)
//the follow tcnt should <= PMU_PMU_ON_CNT
#define PMU_BBG_ON_CNT (0x01<<0)
#define PMU_SYSBUCK_ON_CNT (0x03<<0)
#define PMU_IOBUCK_ON_CNT (0x03<<0)
#define PMU_IOLDO1_ON_CNT (0x03<<0)
#define PMU_IOLDO2_ON_CNT (0x03<<0)
#define PMU_APPDLDO_ON_CNT (0x06<<0)
#define PMU_DSPDLDO_ON_CNT (0x06<<0)
#define PMU_PKSTPD_ON_CNT (0x0c<<0)
#define PMU_MEMPK_ON_CNT (0x10<<0)
#define PMU_MEMPD_ON_CNT (0x10<<0)
#define PMU_OSCLDO_ON_CNT (0x06<<0)
#define PMU_OSC_ON_CNT (0x08<<0)
#define PMU_RC24PD_ON_CNT (0x10<<0)
#define PMU_RAMPK_ON_CNT (0x18<<0)
#define PMU_PMUISO_ON_CNT (0x17<<0)
#define PMU_IOISO_ON_CNT (0x17<<0)
#define PMU_IORTON_ON_CNT (0x17<<0)
#define PMU_IOSNS_ON_CNT (0x17<<0)
#define PMU_RSTN_ON_CNT (0x18<<0)
#define PMU_FSM_OFF_DIV (0x00<<5) //the follow tcnt based <((DIV+1))*40K_CLK(rc)>
#define PMU_PMU_OFF_CNT (0x06<<5)
//the follow tcnt should <= PMU_PMU_OFF_CNT
#define PMU_BBG_OFF_CNT (0x05<<5)
#define PMU_SYSBUCK_OFF_CNT (0x04<<5)
#define PMU_IOBUCK_OFF_CNT (0x01<<5)
#define PMU_IOLDO1_OFF_CNT (0x01<<5)
#define PMU_IOLDO2_OFF_CNT (0x01<<5)
#define PMU_APPDLDO_OFF_CNT (0x03<<5)
#define PMU_DSPDLDO_OFF_CNT (0x03<<5)
#define PMU_PKSTPD_OFF_CNT (0x01<<5)
#define PMU_MEMPK_OFF_CNT (0x01<<5)
#define PMU_MEMPD_OFF_CNT (0x03<<5)
#define PMU_OSCLDO_OFF_CNT (0x03<<5)
#define PMU_OSC_OFF_CNT (0x01<<5)
#define PMU_RC24PD_OFF_CNT (0x03<<5)
#define PMU_RAMPK_OFF_CNT (0x01<<5)
#define PMU_PMUISO_OFF_CNT (0x01<<5)
#define PMU_IOISO_OFF_CNT (0x02<<5)
#define PMU_IORTON_OFF_CNT (0x02<<5)
#define PMU_IOSNS_OFF_CNT (0x02<<5)
#define PMU_RSTN_OFF_CNT (0x01<<5)
void pmu_init(void)
{
/* setup sleep and wakeup counters */
ool_write(PMU_REG_FSM_TIMER , PMU_FSM_ON_DIV | PMU_FSM_OFF_DIV );
ool_write(PMU_REG_PMU_ONOFF_CNT , PMU_PMU_ON_CNT | PMU_PMU_OFF_CNT );
ool_write(PMU_REG_BBG_ONOFF_CNT , PMU_BBG_ON_CNT | PMU_BBG_OFF_CNT );
ool_write(PMU_REG_SYSBUCK_ONOFF_CNT , PMU_SYSBUCK_ON_CNT | PMU_SYSBUCK_OFF_CNT);
ool_write(PMU_REG_IOBUCK_ONOFF_CNT , PMU_IOBUCK_ON_CNT | PMU_IOBUCK_OFF_CNT );
ool_write(PMU_REG_IOLDO1_ONOFF_CNT , PMU_IOLDO1_ON_CNT | PMU_IOLDO1_OFF_CNT );
ool_write(PMU_REG_IOLDO2_ONOFF_CNT , PMU_IOLDO2_ON_CNT | PMU_IOLDO2_OFF_CNT );
ool_write(PMU_REG_APPDLDO_ONOFF_CNT , PMU_APPDLDO_ON_CNT | PMU_APPDLDO_OFF_CNT);
ool_write(PMU_REG_DSPDLDO_ONOFF_CNT , PMU_DSPDLDO_ON_CNT | PMU_DSPDLDO_OFF_CNT);
ool_write(PMU_REG_PKSTPD_ONOFF_CNT , PMU_PKSTPD_ON_CNT | PMU_PKSTPD_OFF_CNT );
ool_write(PMU_REG_MEMPK_ONOFF_CNT , PMU_MEMPK_ON_CNT | PMU_MEMPK_OFF_CNT );
ool_write(PMU_REG_MEMPD_ONOFF_CNT , PMU_MEMPD_ON_CNT | PMU_MEMPD_OFF_CNT );
ool_write(PMU_REG_OSCLDO_ONOFF_CNT , PMU_OSCLDO_ON_CNT | PMU_OSCLDO_OFF_CNT );
ool_write(PMU_REG_OSC_ONOFF_CNT , PMU_OSC_ON_CNT | PMU_OSC_OFF_CNT );
ool_write(PMU_REG_RC24PD_ONOFF_CNT , PMU_RC24PD_ON_CNT | PMU_RC24PD_OFF_CNT );
ool_write(PMU_REG_RAMPK_ONOFF_CNT , PMU_RAMPK_ON_CNT | PMU_RAMPK_OFF_CNT );
ool_write(PMU_REG_PMUISO_ONOFF_CNT , PMU_PMUISO_ON_CNT | PMU_PMUISO_OFF_CNT );
ool_write(PMU_REG_IOISO_ONOFF_CNT , PMU_IOISO_ON_CNT | PMU_IOISO_OFF_CNT );
ool_write(PMU_REG_IORTON_ONOFF_CNT , PMU_IORTON_ON_CNT | PMU_IORTON_OFF_CNT );
ool_write(PMU_REG_IOSNS_ONOFF_CNT , PMU_IOSNS_ON_CNT | PMU_IOSNS_OFF_CNT );
ool_write(PMU_REG_RSTN_ONOFF_CNT , PMU_RSTN_ON_CNT | PMU_RSTN_OFF_CNT );
/* splite PKVDDH and PKVDD */
ool_write(PMU_REG_PKVDDH_CTRL_0, 0x60);
ool_write(PMU_REG_PKVDDH_CTRL_0, 0x70);
/* shut down OSC buffer */
ool_write(PMU_REG_OSC_CTRL_1, ool_read(PMU_REG_OSC_CTRL_1) & (~0x04));
/* PLL analog clock enable */
ool_write(PMU_REG_OSC_CTRL_1, ool_read(PMU_REG_OSC_CTRL_1)|0x0B);
/* set PKVDD to 0.85v */
ool_write(PMU_REG_PKVDD_CTRL, 0x7a);
/* set PKVDDH to 1.1v, set RAMPKVDD to 0.7v */
ool_write(PMU_REG_PKVDDH_CTRL_1, 0x34);
/* buck load inductor will not be shorted */
ool_write(PMU_REG_SYSBUCK_CTRL_1, 0x43);
/* disable internal load of sys-buck and io-buck */
ool_write(PMU_REG_IOBUCK_CTRL_4, 0x73);
ool_write(PMU_REG_SYSBUCK_CTRL_4, 0x73);
/*
* IOLDO dynamic bias, used to avoid unexpect leakage when IOLDO
* output configuration is large than VBAT input voltage
*/
ool_write(PMU_REG_IOLDO1_CTRL_1, ool_read(PMU_REG_IOLDO1_CTRL_1) | (1<<4));
ool_write(PMU_REG_IOLDO2_CTRL_1, ool_read(PMU_REG_IOLDO2_CTRL_1) | (1<<4));
/* enable BT sleep timer clock */
ool_write(PMU_REG_CLK_EN, PMU_LP_TICK_CLK_EN_BIT);
#if 0
/* sleep and wake up is controlled by TICK */
ool_write(PMU_REG_SLP_WK_SRC, PMU_SLP_TICK_EN_BIT | PMU_WK_TICK_EN_BIT);
/*
* BIT0: BB generate sleep signal en
* BIT1: external interrupt wakeup BT timer enable
*/
ool_write(PMU_REG_TICK_CTRL, PMU_TICK_SLP_PMU_EN_BIT | PMU_EXT_WK_TICK_EN_BIT | PMU_IRQ_WK_TICK_EN_BIT);
/* reset lp tick */
ool_write(PMU_REG_RST, PMU_LP_TICK_SFT_RST_BIT);
while (ool_read(PMU_REG_RST) & PMU_LP_TICK_SFT_RST_BIT);
#else
/* sleep and wake up is controlled by TICK */
ool_write(PMU_REG_SLP_WK_SRC, PMU_SLP_CPU_EN_BIT | PMU_WK_IRQ_EN_BIT);
/* release RTC clock */
ool_write(PMU_REG_CLK_EN, ool_read(PMU_REG_CLK_EN) | PMU_RTC_CLK_EN_BIT);
/* release interrupt mask of RTC alarm B */
ool_write16(PMU_REG_INT_MASK, ool_read16(PMU_REG_INT_MASK) | PMU_RTC_B_INT_MSK_BIT);
#endif
/* disable power fsm */
ool_write(0x85, 0xff);
/* IO33 and IO18 always on */
ool_write(0x63, 0x18);
/* set mask of GPIO SNS & ISO */
ool_write(0x64, ool_read(0x64) | 0x80 | 0x20); //bit7 : GPIO_SNS; bit5 : GPIO_ISO
// /* configure PMU_PIN_8 output BBG_EN signal */
// ool_write(PMU_REG_DIAG_CTRL, 0x82);
//// ool_write16(PMU_REG_PIN_IOMUX_L, 0xffff);
// ool_write(PMU_REG_PIN_IOMUX_H, 0x03);
// /* disable input as default setting */
// ool_write16(PMU_REG_PIN_INPUT_EN, 0x0000);
/* remove internal cap of osc */
ool_write(PMU_REG_OSC_CTRL_4, 0x20);
}
/******************************************************************************
* @fn pmu_adc_power_ctrl
*
* @brief ADC power control. true: enable.
* false: disable.
*/
void pmu_adc_power_ctrl(bool enable)
{
if (enable)
ool_write(PMU_REG_ADC_CTL, ool_read(PMU_REG_ADC_CTL) | PMU_ADC_CTL_POWER_BIT);
else
ool_write(PMU_REG_ADC_CTL, ool_read(PMU_REG_ADC_CTL) & ~PMU_ADC_CTL_POWER_BIT);
}
/******************************************************************************
* @fn pmu_vbe_power_ctrl
*
* @brief VBE(For temperature detection) power control. true: enable.
* false: disable.
*/
void pmu_vbe_power_ctrl(bool enable)
{
if (enable)
ool_write(PMU_REG_BBG_CTL, ool_read(PMU_REG_BBG_CTL) | PMU_BBG_CTL_VBE_EN_BIT);
else
ool_write(PMU_REG_BBG_CTL, ool_read(PMU_REG_BBG_CTL) & ~PMU_BBG_CTL_VBE_EN_BIT);
}
/******************************************************************************
* @fn pmu_auldo_power_ctrl
*
* @brief audio ldo power control. true: enable.
* false: disable.
*/
void pmu_auldo_power_ctrl(bool enable)
{
if (enable)
ool_write(PMU_REG_AULDO_CTL, ool_read(PMU_REG_AULDO_CTL) & ~PMU_AULDO_CTL_PD_BIT);
else
ool_write(PMU_REG_AULDO_CTL, ool_read(PMU_REG_AULDO_CTL) | PMU_AULDO_CTL_PD_BIT);
}
/*********************************************************************
* @fn pmu_enable_charge
*
* @brief enable charge function, and set charge current & voltage.
*
* @param cur - charge current, @ref enum_PMU_charge_current_t
* @param vol - charge terminal voltage, @ref enum_PMU_charge_end_vol_t
*
* @return None.
*/
void pmu_charge_enable(enum_PMU_charge_current_t cur, enum_PMU_charge_end_vol_t vol)
{
/* charge reference select BBG */
ool_write(PMU_REG_CHG_CFG_CD, ool_read(PMU_REG_CHG_CFG_CD) | PMU_CHG_CFG_REF_SEL_BIT);
/* config charge voltage */
ool_write(PMU_REG_CHG_CFG_CB, (ool_read(PMU_REG_CHG_CFG_CB)&0x8F) | (vol << PMU_CHG_CFG_END_VOL_POS));
/* config charge current */
ool_write(PMU_REG_CHG_CFG_C8, (ool_read(PMU_REG_CHG_CFG_C8)&0xC0) | (cur));
/* enable charge */
ool_write(PMU_REG_CHG_CFG_CD, ool_read(PMU_REG_CHG_CFG_CD) | PMU_CHG_CFG_ENABLE_BIT);
}
/*********************************************************************
* @fn pmu_charge_disable
*
* @brief disable charge function.
*/
void pmu_charge_disable(void)
{
/* disable charge */
ool_write(PMU_REG_CHG_CFG_CD, ool_read(PMU_REG_CHG_CFG_CD) & ~PMU_CHG_CFG_ENABLE_BIT);
}
/*********************************************************************
* @fn pmu_charge_monitor_en
*
* @brief Charging in/out monitor interrupt enable.
*/
void pmu_charge_monitor_en(enum_PMU_charge_type_t charge_type)
{
if (charge_type == PMU_CHARGING_IN)
ool_write(PMU_REG_ANA_LEVEL, ool_read(PMU_REG_ANA_LEVEL) & ~PMU_CHG_ACOK_LEVEL_BIT);
else
ool_write(PMU_REG_ANA_LEVEL, ool_read(PMU_REG_ANA_LEVEL) | PMU_CHG_ACOK_LEVEL_BIT);
ool_write(PMU_REG_CLK_EN, ool_read(PMU_REG_CLK_EN) | PMU_FILTER_CLK_EN_BIT);
ool_write(PMU_REG_CHG_ACOK_FILTER, 100);
ool_write(PMU_REG_ANA_INT_EN, ool_read(PMU_REG_ANA_INT_EN) | PMU_CHG_ACOK_INT_EN_BIT);
pmu_enable_isr(PMU_CHG_ACOK_INT_MASK_BIT);
}
/*********************************************************************
* @fn pmu_battery_full_monitor_en
*
* @brief battery_full monitor interrupt enable
*/
void pmu_battery_full_monitor_en(enum_PMU_battery_type_t battery_type)
{
if (battery_type == PMU_BATTERY_FULL)
ool_write(PMU_REG_ANA_LEVEL, ool_read(PMU_REG_ANA_LEVEL) & ~PMU_BATFULL_LEVEL_BIT);
else
ool_write(PMU_REG_ANA_LEVEL, ool_read(PMU_REG_ANA_LEVEL) | PMU_BATFULL_LEVEL_BIT);
ool_write(PMU_REG_CLK_EN, ool_read(PMU_REG_CLK_EN) | PMU_FILTER_CLK_EN_BIT);
ool_write(PMU_REG_BAT_FULL_FILTER, 200);
ool_write(PMU_REG_ANA_INT_EN, ool_read(PMU_REG_ANA_INT_EN) | PMU_BATFULL_INT_EN_BIT);
pmu_enable_isr(PMU_BATFULL_INT_MASK_BIT);
}
void pmu_set_pin_pull(enum_PMU_PINx_t bits, enum_PMU_GPIO_PULL_t type)
{
uint8_t en_reg = PMU_REG_PIN_PULL_EN;
uint8_t pull_reg = PMU_REG_PIN_PULL_SEL;
if(type == PMU_GPIO_NO_PULL) {
ool_write16(en_reg, (ool_read16(en_reg) & (~bits)));
}
else {
if(type == PMU_GPIO_PULL_UP) {
ool_write16(pull_reg, (ool_read16(pull_reg) | bits));
}
else if(type == PMU_GPIO_PULL_DOWN) {
ool_write16(pull_reg, (ool_read16(pull_reg) & (~bits)));
}
else {
return;
}
ool_write16(en_reg, (ool_read16(en_reg) | bits));
}
}
void pmu_set_pin_dir(enum_PMU_PINx_t bits, enum_PMU_GPIO_MODE_t dir)
{
uint8_t oe_reg = PMU_REG_PIN_OUTPUT_EN;
uint8_t ie_reg = PMU_REG_PIN_INPUT_EN;
if(dir == PMU_GPIO_MODE_INPUT) {
ool_write16(oe_reg, ool_read16(oe_reg) | bits);
ool_write16(ie_reg, ool_read16(ie_reg) | (bits << 2));
}
else {
ool_write16(oe_reg, ool_read16(oe_reg) & (~bits));
ool_write16(ie_reg, ool_read16(ie_reg) & (~bits << 2));
}
}
void pmu_set_pin_value(enum_PMU_PINx_t bits, uint8_t value)
{
uint8_t data_reg = PMU_REG_PIN_DATA;
if (value == 0)
ool_write16(data_reg, (ool_read16(data_reg) & (~bits)));
else
ool_write16(data_reg, (ool_read16(data_reg) | bits));
}
uint8_t pmu_get_pin_value(enum_PMU_PINx_t bit)
{
uint8_t data_reg = PMU_REG_PIN_DATA;
return ( (ool_read16(data_reg) & (1<<bit))>>bit );
}
void pmu_set_pin_xor_en(enum_PMU_PINx_t bits, bool en)
{
uint8_t xor_reg = PMU_REG_PIN_XOR_EN;
if(en) {
ool_write16(xor_reg, ool_read16(xor_reg) | (bits));
}
else {
ool_write16(xor_reg, ool_read16(xor_reg) & (~bits));
}
}
/*********************************************************************
* @fn pmu_port_wakeup_func_set
*
* @brief PortPin wakeup function congfig
*
* @param bits: Select Pin. 0x01--PIN0 0x80--PIN7
*/
void pmu_port_wakeup_func_set(enum_PMU_PINx_t bits)
{
uint8_t last_status_reg = PMU_REG_PIN_LAST_V;
uint8_t data_reg = PMU_REG_PIN_DATA;
/* Config input Pull up */
pmu_set_pin_pull(bits, PMU_GPIO_PULL_UP);
pmu_set_pin_dir(bits, PMU_GPIO_MODE_INPUT);
/* Read the current value and write */
ool_write16(last_status_reg, ool_read16(data_reg));
/* XOR Enable */
pmu_set_pin_xor_en(bits, true);
/* XOR interrupt enable */
ool_write(PMU_REG_PIN_INT_EN, 0x01);
}
/*********************************************************************
* @fn pmu_gpio_int_init
*
* @brief pmu pin wakeup function config. Compare with pmu_port_wakeup_func_set, this
* function provides two parameter to set pull mode and initial value
*
* @param bits: Select Pin. 0x01--PIN0 0x80--PIN7
* pull: pull mode selection, @ref enum_PMU_GPIO_PULL_t
* init_value: initial value. Once the level of corresponding pin changes to opposite
* level with initial value, PMU_GPIO_PMU_INT will be generated.
*/
void pmu_gpio_int_init(enum_PMU_PINx_t bits, enum_PMU_GPIO_PULL_t pull, uint8_t init_value)
{
uint8_t last_status_reg = PMU_REG_PIN_LAST_V;
uint8_t data_reg = PMU_REG_PIN_DATA;
/* Config input Pull up */
pmu_set_pin_pull(bits, pull);
pmu_set_pin_dir(bits, PMU_GPIO_MODE_INPUT);
/* Read the current value and write */
if (init_value) {
ool_write16(last_status_reg, ool_read16(last_status_reg) | bits);
}
else {
ool_write16(last_status_reg, ool_read16(last_status_reg) & (~bits));
}
/* XOR Enable */
pmu_set_pin_xor_en(bits, true);
/* XOR interrupt enable */
ool_write(PMU_REG_PIN_INT_EN, 0x01);
}
/*********************************************************************
* @fn pmu_port_wakeup_func_clear
*
* @brief Get rtc current counter value
*
* @param bits: Select Pin. 0x01--PIN0 0x80--PIN7
*/
void pmu_port_wakeup_func_clear(enum_PMU_PINx_t bits)
{
/* XOR Disable */
pmu_set_pin_xor_en(bits, false);
}
void pmu_enable_isr(uint16_t isr_map)
{
ool_write16(PMU_REG_INT_MASK, ool_read16(PMU_REG_INT_MASK) | isr_map);
}
void pmu_disable_isr(uint16_t isr_map)
{
ool_write16(PMU_REG_INT_MASK, ool_read16(PMU_REG_INT_MASK) & (~isr_map));
}
uint16_t pmu_get_isr_state(void)
{
return ool_read16(PMU_REG_INT_STATUS);
}
void pmu_clear_isr_state(uint16_t state_map)
{
if (state_map & PMU_BATFULL_INT_STATUS_BIT) {
ool_write(PMU_REG_ANA_INT_CLR, ool_read(PMU_REG_ANA_INT_CLR) | PMU_BATFULL_INT_CLR_BIT);
}
if (state_map & PMU_CHG_ACOK_INT_STATUS_BIT) {
ool_write(PMU_REG_ANA_INT_CLR, ool_read(PMU_REG_ANA_INT_CLR) | PMU_CHG_ACOK_INT_CLR_BIT);
}
if (state_map & PMU_LVD_INT_STATUS_BIT) {
ool_write(PMU_REG_ANA_INT_CLR, ool_read(PMU_REG_ANA_INT_CLR) | PMU_LVD_INT_CLR_BIT);
}
if (state_map & PMU_WDT_INT_STATUS_BIT) {
ool_write(PMU_REG_RTC_CTRL, ool_read(PMU_REG_RTC_CTRL) | PMU_WDT_CLR_BIT);
}
if (state_map & PMU_RTC_A_INT_STATUS_BIT) {
ool_write(PMU_REG_RTC_CTRL, ool_read(PMU_REG_RTC_CTRL) | PMU_RTC_ALARM_A_CLR_BIT);
}
if (state_map & PMU_GPIO_PMU_INT_STATUS_BIT) {
// ool_write16(PMU_REG_PIN_XOR_CLR, ool_read16(PMU_REG_PIN_XOR_RESULT));
}
if (state_map & PMU_GPIO_GROUPH_INT_STATUS_BIT) {
ool_write(PMU_REG_WKUP_INT_CLR, ool_read(PMU_REG_WKUP_INT_CLR) | 0x01);
}
if (state_map & PMU_GPIO_GROUPL_INT_STATUS_BIT) {
ool_write(PMU_REG_WKUP_INT_CLR, ool_read(PMU_REG_WKUP_INT_CLR) | 0x02);
}
}
#if 0
void pmu_lvd_enable(enum_PMU_LVD_THD_t thd)
{
uint8_t value;
value = ool_read(0xa3);
value &= 0x1f;
value |= (thd << 5);
ool_write(0xa3, value);
ool_write(PMU_REG_ANA_LAST_V, ool_read(PMU_REG_ANA_LAST_V) & (~PMU_ANA_LAST_LVD_V_BIT));
ool_write(PMU_REG_ANA_XOR_EN, ool_read(PMU_REG_ANA_XOR_EN) | PMU_ANA_XOR_LVD_EN_BIT);
ool_write(PMU_REG_ANA_INT_EN, ool_read(PMU_REG_ANA_INT_EN) | PMU_LVD_INT_EN_BIT);
pmu_enable_isr(PMU_LVD_INT_MSK_BIT);
}
void pmu_lvd_disable(void)
{
pmu_disable_isr(PMU_LVD_INT_MSK_BIT);
}
void pmu_adkey0_start(void)
{
/*adkey0 interrupt enable*/
ool_write(PMU_REG_ANA_INT_EN, PMU_KEY0_INT_EN_BIT);
/*adkey0 xor enable*/
ool_write16(PMU_REG_ANA_XOR_EN, ool_read(PMU_REG_ANA_XOR_EN) | 0x04);
/*enable adkey0*/
pmu_enable_isr(PMU_ADKEY0_INT_MSK_BIT);
ool_write(PMU_REG_ADKEY_CFG, 0xdb);
NVIC_EnableIRQ(PMU_IRQn);
}
void pmu_adkey1_start(void)
{
/*adkey1 interrupt enable*/
ool_write(PMU_REG_ANA_INT_EN, PMU_KEY1_INT_EN_BIT);
/*adkey1 xor enable*/
ool_write16(PMU_REG_ANA_XOR_EN, ool_read(PMU_REG_ANA_XOR_EN) | 0x08);
/*enable adkey1*/
pmu_enable_isr(PMU_ADKEY1_INT_MSK_BIT);
ool_write(PMU_REG_ADKEY_CFG, 0xdb);
NVIC_EnableIRQ(PMU_IRQn);
}
#endif
__WEAK void PMU_Battery_Full_IRQHandler(void)
{
}
__WEAK void PMU_Charge_Monitor_IRQHandler(void)
{
}
__WEAK void RTC_ALARMA_IRQHandler(void)
{
}
__WEAK void RTC_ALARMB_IRQHandler(void)
{
}
__WEAK void PMU_GPIO_PMU_IRQHandler(void)
{
}
__WEAK void PMU_GPIO_GROUPH_IRQHandler(void)
{
}
__WEAK void PMU_GPIO_GROUPL_IRQHandler(void)
{
}
__WEAK void PMU_LVD_IRQHandler(void)
{
}
__WEAK void PMU_ADKEY0_IRQHandler(void)
{
}
__WEAK void PMU_ADKEY1_IRQHandler(void)
{
}
__WEAK void PMU_IWDT_IRQhandler(void)
{
}
void pmu_irq(void)
{
uint16_t state_map = pmu_get_isr_state();
// printf("%s state%d \r\n",__func__,state_map);
// pmu_clear_isr_state(state_map);
if (state_map & PMU_BATFULL_INT_STATUS_BIT) {
PMU_Battery_Full_IRQHandler();
}
if (state_map & PMU_CHG_ACOK_INT_STATUS_BIT) {
PMU_Charge_Monitor_IRQHandler();
}
if (state_map & PMU_LVD_INT_STATUS_BIT) {
PMU_LVD_IRQHandler();
}
if (state_map & PMU_RTC_A_INT_STATUS_BIT) {
RTC_ALARMA_IRQHandler();
}
if (state_map & PMU_RTC_B_INT_STATUS_BIT) {
RTC_ALARMB_IRQHandler();
}
if (state_map & PMU_GPIO_PMU_INT_STATUS_BIT) {
PMU_GPIO_PMU_IRQHandler();
}
if (state_map & PMU_GPIO_GROUPH_INT_STATUS_BIT) {
PMU_GPIO_GROUPH_IRQHandler();
}
if (state_map & PMU_GPIO_GROUPL_INT_STATUS_BIT) {
PMU_GPIO_GROUPL_IRQHandler();
}
if (state_map & PMU_ADKEY0_INT_STATUS_BIT) {
PMU_ADKEY0_IRQHandler();
}
if (state_map & PMU_ADKEY1_INT_STATUS_BIT) {
PMU_ADKEY1_IRQHandler();
}
if (state_map & PMU_WDT_INT_STATUS_BIT) {
PMU_IWDT_IRQhandler();
}
pmu_clear_isr_state(state_map);
}