592 lines
19 KiB
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);
|
||
|
}
|