demo工程暂存 优化菜单界面UI和功能
This commit is contained in:
591
MCU/components/drivers/peripheral/Src/driver_pmu.c
Normal file
591
MCU/components/drivers/peripheral/Src/driver_pmu.c
Normal file
@ -0,0 +1,591 @@
|
||||
#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);
|
||||
}
|
Reference in New Issue
Block a user