K74B/87400/drivers/hal/src/pmu_device.c
2024-01-25 14:22:18 +08:00

204 lines
4.6 KiB
C

/**
* @copyright 2017 Indie Semiconductor.
*
* This file is proprietary to Indie Semiconductor.
* All rights reserved. Reproduction or distribution, in whole
* or in part, is forbidden except by express written permission
* of Indie Semiconductor.
*
* @file pmu_device.c
* @Author: Jack.Pan
* @E-mail:jack.pan@indiemicro.com
* @Date: 2020/09/10
*/
#include <stddef.h>
#include <pmu_device.h>
#include <errno.h>
#include <isrfuncs.h>
#include <gpio_device.h>
#include <lin_device.h>
#include <wica_sfr.h>
#include <pwm_device.h>
#include <wdt_device.h>
static __INLINE void WDTA_Start(void);
void BOR_Handler(void)
{
}
void PMU_BORInit(Bor1V5Thres_t lowThreshold, Bor3V3Thres_t highThreshold)
{
TRIMHV_SFRS->PMUTRIM.TRIM_VREF_BUF = HWCFG_GetBGBUFFCalibValue();
TRIMHV_SFRS->PMUTRIM.VDD3V3_LDO_TRIM = HWCFG_Get3V3CalibValue();
TRIMHV_SFRS->PMUTRIM.OCP_CTRL_3V3 = HWCFG_Get3V3_OCPValue();
TRIMHV_SFRS->PMUTRIM.VDD1V5_LDO_TRIM = HWCFG_Get1V5_CalibValue();
TRIMHV_SFRS->PMUTRIM.OCP_CTRL_1V5 = HWCFG_Get1V5_OCPValue();
TRIMHV_SFRS->BORCONFIG.S_BOR_1P5V = (uint8_t)lowThreshold;
TRIMHV_SFRS->BORCONFIG.S_BOR_3P3V = (uint8_t)highThreshold;
TRIMHV_SFRS->BORACTION.VDD1V5 = (uint8_t)PMU_BROWNOUT_RESET;
TRIMHV_SFRS->BORACTION.VDD3V3 = (uint8_t)PMU_BROWNOUT_RESET;
TRIMHV_SFRS->BORACTION.BOR_1V5_LOCK = 1U;
TRIMHV_SFRS->BORACTION.BOR_3V3_LOCK = 1U;
TRIMHV_SFRS->OVTEMPCONFIG.TEMPSENSE_EN = 1U; /* enable temperature sensor */
EVTHOLD_SFRS->HOLD = 0U; /* clear Lullaby_Handler after wake up */
}
void PMU_WakeTimerInit(PMU_WAKEUP_TIMEER_MODE_t mode, PMU_WAKEUP_TIMEER_Interval_t interval)
{
if (mode == WAKEUP_TIMEER_DISABLE){
WICA_SFRS->CTRL.TIMER_ENA = 0U;
}else{
WICA_SFRS->CTRL.TIMER_TAPSEL = (uint8_t)interval;
WICA_SFRS->CTRL.TIMER_ENA = 1U;
}
}
void PMU_EnterDeepSleepMode(void)
{
CRGA_SFRS->MODULERSTREQ |= MODUE_SOFT_RESET_PWM;
/* Add GPIO function here for low power mode*/
/* set gpios to input with power up resistor */
// for (uint8_t i = (uint8_t)GPIO_INIT_PORT_1; i<= (uint8_t)GPIO_INIT_PORT_4; i++ ){
// GPIO_Init((GpioInitPort_t)i,GPIO_MUX_GPIO,GPIO_DIR_INPUT,GPIO_PULL_UP);
// }
/* end of GPIO settigns */
TRIMHV_SFRS->OVTEMPCONFIG.TEMPSENSE_EN = 0U; /* disbale temperature sensor when sleep */
CRGA_SFRS->OVTEMPACTION.OVERTEMP_EN = 0U;
TRIMHV_SFRS->VBATTRIM.BAT_UV_EN = 0U;
TRIMHV_SFRS->VBATTRIM.BAT_OV_EN = 0U;
// SYSCTRLA_REG_PMU_ACCESS_KEY.PMU_ACCESS_KEY = 0x0A;
// PMUA_SFRS->CTRL.PD1V5_ENA_HIBERNATE = 1U;
/*IOCTRLA_SFRS->LINSGFCONF.LINSRXGF3RD_ENA = 0U;*/
/* clear all of wake up flags */
/* Enable wakeup detect and IRQ when LINS is in sleep mode(LINS_REG_CTRL.SLEEP = 1U;) */
WICA_SFRS->CTRL.LINS_IRQCLR = 1U;
WICA_SFRS->CTRL.LINS_IRQENA = 1U;
WICA_SFRS->CTRL.LINS_ENA = 1U;
WICA_SFRS->CTRL.LINS_IRQENA = 1U;
NVIC_EnableIRQ(WULIN_IRQn);
NVIC_EnableIRQ(Lullaby_IRQn); /* Enable Lullaby interrupt*/
EVTHOLD_SFRS->HOLD = 1U; /* Trigger ISR then entering sleep in ISR */
/* Waiting to enter sleep mode */
for(;;){
}
}
/* Please make sure here and don't delete these functions!!!! or it would cause severe error*/
/* hibernate wake up interrupt ISR */
void Lullaby_Handler(void)
{
/* Set lin to sleep mode */
if (TRIMHV_SFRS->LINS.LINS_SLEEP == 1U){
TRIMHV_SFRS->LINS.LINS_SLEEP = 0U;
}
TRIMHV_SFRS->LINS.LINS_SLEEP = 1U;
/* Enter sleep mode */
PMUA_SFRS->CTRL.HIBERNATE = 1U;
}
#pragma optimize=none
static __INLINE void WDTA_Start(void)
{
CRGA_SFRS->WDTACTION.WDTBARKCNTCLR = 1U;
WDTA_SFRS->CTRL.TIMEOUTSEL = (uint8_t)WDTA_INTERVAL_9216MS;
WDTA_SFRS->CLEAR = 0x3c574ad6U;
WDTA_SFRS->STOPR.STOP = 0U;/* start wdt*/
}
void NMI_Handler(void)
{
uint32_t temp = FLASH_SFRS->FLSECCR.ADDRECC;
FLASH_SFRS->FLSECCR.ECCD = 1;
FLASH_SFRS->FLSECCR.ECCC = 1;
SYSCFG_SFRS->SRAMCFGR.SRAMECCD = 1;
SYSCFG_SFRS->SRAMCFGR.SRAMECCC = 1;
for(;;){}
}
void HardFault_Handler(void)
{
WDTA_Start();
for(;;){}
}
void SVC_Handler(void)
{
WDTA_Start();
for(;;){}
}
void PendSV_Handler(void)
{
WDTA_Start();
for(;;){}
}
void MemManage_Handler(void)
{
}
void BusFault_Handler(void)
{
}
void UsageFault_Handler(void)
{
}
void Divider_Handler(void)
{
}
void FlashEcc_Handler(void)
{
}
void RamEcc_Handler(void)
{
}
void CR_Handler(void)
{
}
void CSA_OCP_Handler(void)
{
}
void error(void)
{
}