/**
******************************************************************************
* @file pmu.h
* @author HUGE-IC Application Team
* @version V1.0.0
* @date 2021.01.14
* @brief This file contains all the PowerDomain firmware functions.
******************************************************************************
* @attention
*
*
© COPYRIGHT 2021 HUGE-IC
*
*
* Revision History
* V1.0.0 2021.01.14 First Release, move from sysctrl
*
******************************************************************************
*/
#ifndef __PMU_H__
#define __PMU_H__
#include "typesdef.h"
#ifdef __cplusplus
extern "C" {
#endif
#define CORE_LVD_CON (0x00>>0)
#define CORE_LVD_CON1 (0x04>>0)
#define CORE_LVD_CON2 (0x08>>0)
#define CORE_PMUCON0 (0x10>>0)
#define CORE_PMUCON1 (0x14>>0)
#define CORE_PMUCON2 (0x18>>0)
#define CORE_PMUCON3 (0x1c>>0)
#define CORE_PMUCON4 (0x20>>0)
#define CORE_PMUCON5 (0x24>>0)
#define CORE_RFCON0 (0x28>>0)
#define CORE_RFCON1 (0x2c>>0)
#define CORE_PMUCON6 (0x30>>0)
#define CORE_PMUCON7 (0x34>>0)
#define CORE_PMUCON8 (0x38>>0)
#define CORE_PMUCON9 (0x3c>>0)
#define CORE_PMUCON10 (0x40>>0)
#define CORE_PMUCON11 (0x44>>0)
#define CORE_PMUCON12 (0x48>>0)
#define CORE_PMUCON13 (0x4c>>0)
#define CORE_PNDCLR (0x50>>0)
//-------------RTC part1 start---------------
#define CORE_RTCWPR (0x54>>0) //54
#define CORE_RTCCTR (0x58>>0) //58
#define CORE_RTCPDR (0x5c>>0) //5c
#define CORE_RTCISR (0x60>>0) //60
#define CORE_RTCSSR (0x64>>0) //64
#define CORE_RTCTMR (0x68>>0) //68
#define CORE_RTCDAR (0x6c>>0) //6c
#define CORE_RTCALR0R (0x70>>0) //70
#define CORE_RTCWUTR (0x74>>0) //74
#define CORE_RTCTSSSR (0x78>>0) //78
#define CORE_RTCTSTMR (0x7c>>0) //7c
//-------------RTC part1 end---------------
#define CORE_TMRCON (0x80>>0)
#define CORE_TMRPR (0x84>>0)
#define CORE_TMRRPT (0x88>>0)
#define CORE_TMRTRIM (0x8c>>0)
#define CORE_TMRPR2 (0x90>>0)
//-------------RTC part2 start---------------
//#define CORE_TMRRTCC (0x94>>0)
#define CORE_RTCTSDAR (0x94>>0) //94
#define CORE_RTCCALR (0x98>>0) //98
#define CORE_RTCSSSR (0x9c>>0) //9c
//-------------RTC part2 start---------------
#define CORE_WKCON (0xa0>>0)
#define CORE_WKCON1 (0xa4>>0)
#define CORE_WKCON2 (0xa8>>0)
#define CORE_SECCON (0xb0>>0)
#define CORE_SECDAT (0xb4>>0)
#define CORE_SECADR (0xb8>>0)
#define CORE_SECKEY (0xbc>>0)
#define CORE_CMPCON (0xc0>>0)
#define CORE_CMPCON1 (0xc4>>0)
#if 0 //vernus
#define CORE_TMR0CON (0xd0>>0)
#define CORE_TMR1CON (0xd4>>0)
#define CORE_TMR2CON (0xd8>>0)
#define CORE_TMR3CON (0xdc>>0)
#else //vernus200= eagle v2
#define CORE_PMUCON14 (0xc8>>0)
#define CORE_PMUCON15 (0xcc>>0)
#define CORE_TMR_CON (0xd0>>0)
#define CORE_TMR0CON (0xd4>>0)
#define CORE_TMR1CON (0xd8>>0)
#define CORE_TMR2CON (0xdc>>0)
#define CORE_TMR3CON (0xe0>>0)
#define CORE_WDTCON (0xe4>>0)
#define CORE_WDTKEY (0xe8>>0)
#endif
typedef struct
{
__IO uint32 LVD_CON;
__IO uint32 LVD_CON1;
__IO uint32 LVD_CON2;
__IO uint32 TMRAOCNTL;
__IO uint32 PMUCON0;
__IO uint32 PMUCON1;
__IO uint32 PMUCON2;
__IO uint32 PMUCON3;
__IO uint32 PMUCON4;
__IO uint32 PMUCON5;
__IO uint32 RFCON0;
__IO uint32 RFCON1;
__IO uint32 PMUCON6;
__IO uint32 PMUCON7;
__IO uint32 PMUCON8;
__IO uint32 PMUCON9;
__IO uint32 PMUCON10; //40
__IO uint32 PMUCON11;
__IO uint32 PMUCON12;
__IO uint32 PMUCON13;
__IO uint32 PNDCLR; //50
__IO uint32 RTCWPR; //54
__IO uint32 RTCCTR; //58
__IO uint32 RTCPDR; //5c
__IO uint32 RTCISR; //60
__IO uint32 RTCSSR; //64
__IO uint32 RTCTMR; //68
__IO uint32 RTCDAR; //6c
__IO uint32 RTCALR0R; //70
__IO uint32 RTCWUTR; //74
__IO uint32 RTCTSSSR; //78
__IO uint32 RTCTSTMR; //7c
__IO uint32 TMRCON; //80
__IO uint32 TMRPR;
__IO uint32 TMRRPT;
__IO uint32 TMRTRIM;
__IO uint32 TMRPR2; //90
__IO uint32 RTCTSDAR; //94
__IO uint32 RTCCALR; //98
__IO uint32 RTCSSSR; //9c
__IO uint32 WKCON; //a0
__IO uint32 WKCON1;
__IO uint32 WKCON2;
__IO uint32 TMRAOCNTH;
__IO uint32 SECCON; //b0
__IO uint32 SECDAT;
__IO uint32 SECADDR;
__IO uint32 SECKEY;
__IO uint32 CMPCON; //c0
__IO uint32 CMPCON1; //c4
__IO uint32 PMUCON14; //c8
__IO uint32 PMUCON15; //cc
__IO uint32 TMR_CON; //d0
__IO uint32 TMR0CON0; //d4
__IO uint32 TMR1CON0; //d8
__IO uint32 TMR2CON0; //dc
__IO uint32 TMR3CON0; //e0
__IO uint32 WDTCON; //e4
__IO uint32 WDTKEY; //e8
__IO uint32 PMUCON16; //ec
__IO uint32 RTC_VCCHVD_CON; //f0
__IO uint32 RTC_VCCHVD_PND; //f4
} PMU_TypeDef;
#define PMU ((PMU_TypeDef *) PMU_BASE)
#define PMU_REG_SET_BITS(reg, bits) do { pmu_reg_write((uint32)®, (reg)|(bits)); } while(0)
#define PMU_REG_CLR_BITS(reg, bits) do { pmu_reg_write((uint32)®, (reg) & ~(bits)); } while(0)
#define PMU_REG_SET_VALUE(reg, bit_mask, val, bit_pos) do { pmu_reg_write((uint32)®, ((reg) & ~(bit_mask)) | (((val) << (bit_pos)) & (bit_mask)) ); } while(0)
#define PMU_REG_BIT_FUN(fun_name, reg, bits)\
__STATIC_INLINE void fun_name##_en(void) { PMU_REG_SET_BITS(reg, bits); }\
__STATIC_INLINE void fun_name##_dis(void) { PMU_REG_CLR_BITS(reg, bits); }
/* lvdcon */
#define pmu_vcam_oc_int_en() PMU_REG_CLR_BITS(PMU->LVD_CON, BIT(31))
#define pmu_vcam_oc_int_dis() PMU_REG_SET_BITS(PMU->LVD_CON, BIT(31))
#define PMU_VCAM_OC_PENDING (PMU->LVD_CON & BIT(30))
#define PMU_V15_OC_PENDING (PMU->LVD_CON & BIT(29))
#define PMU_VDD_OC_PENDING (PMU->LVD_CON & BIT(28))
#define PMU_VDD_LV_PENDING (PMU->LVD_CON & BIT(27))
#define PMU_VCC_LV_PENDING (PMU->LVD_CON & BIT(26))
#define PMU_VCC1_LV_PENDING (PMU->LVD_CON & BIT(25)) //?
#define PMU_VCC15_LV_PENDING (PMU->LVD_CON & BIT(24))
#define pmu_vcc1_lv_int_en() PMU_REG_CLR_BITS(PMU->LVD_CON, BIT(23))
#define pmu_vcc1_lv_int_dis() PMU_REG_SET_BITS(PMU->LVD_CON, BIT(23))
#define pmu_vcc15_oc_int_en() PMU_REG_CLR_BITS(PMU->LVD_CON, BIT(22))
#define pmu_vcc15_oc_int_dis() PMU_REG_SET_BITS(PMU->LVD_CON, BIT(22))
#define pmu_lvd_oe_en() PMU_REG_SET_BITS(PMU->LVD_CON, BIT(21))
#define pmu_lvd_oe_dis() PMU_REG_CLR_BITS(PMU->LVD_CON, BIT(21))
#define pmu_vdd_oc_int_en() PMU_REG_CLR_BITS(PMU->LVD_CON, BIT(20))
#define pmu_vdd_oc_int_dis() PMU_REG_SET_BITS(PMU->LVD_CON, BIT(20))
#define pmu_vdd_lv_reset_en() PMU_REG_SET_BITS(PMU->LVD_CON, BIT(19))
#define pmu_vdd_lv_reset_dis() PMU_REG_CLR_BITS(PMU->LVD_CON, BIT(19))
#define pmu_vcc_lv_reset_en() PMU_REG_SET_BITS(PMU->LVD_CON, BIT(18))
#define pmu_vcc_lv_reset_dis() PMU_REG_CLR_BITS(PMU->LVD_CON, BIT(18))
#define pmu_vcc15_lv_reset_en() PMU_REG_SET_BITS(PMU->LVD_CON, BIT(17))
#define pmu_vcc15_lv_reset_dis() PMU_REG_CLR_BITS(PMU->LVD_CON, BIT(17))
enum vcc15_oc_level {
VCC15_OC_200MA = 0,
VCC15_OC_90MA = 0x3,
VCC15_OC_70MA,
VCC15_OC_60MA,
VCC15_OC_50MA,
};
#define pmu_vcc15_oc_level_set(vcc15_oc_level) PMU_REG_SET_VALUE(PMU->LVD_CON, 0x0001c000, vcc15_oc_level, 14)
enum vdd_oc_level {
VDD_OC_50MA,
VDD_OC_100MA,
VDD_OC_150MA,
VDD_OC_200MA,
};
#define pmu_vdd_oc_level_set(vdd_oc_level) PMU_REG_SET_VALUE(PMU->LVD_CON, 0x00003000, vdd_oc_level, 12)
enum vcc15_lv_level {
VCC15_LV_0V86_T_0V90,
VCC15_LV_1V00_T_1V05,
VCC15_LV_1V14_T_1V19,
VCC15_LV_1V29_T_1V35,
};
#define pmu_vcc15_lv_level_set(vcc15_lv_level) PMU_REG_SET_VALUE(PMU->LVD_CON, 0x00000c00, vcc15_lv_level, 10)
enum vdd_lv_level {
VDD_LV_0V64_T_0V68,
VDD_LV_0V74_T_0V78,
VDD_LV_0V84_T_0V88,
VDD_LV_0V84_T_0V98,
};
#define pmu_vdd_lv_level_set(vdd_lv_level) PMU_REG_SET_VALUE(PMU->LVD_CON, 0x00000300, vdd_lv_level, 8)
enum avcc_lv_level {
AVCC_LV_1V90_T_1V99,
AVCC_LV_2V06_T_2V16,
AVCC_LV_2V21_T_2V31,
AVCC_LV_2V33_T_2V44,
AVCC_LV_2V46_T_2V58,
AVCC_LV_2V62_T_2V74,
AVCC_LV_2V75_T_2V87,
AVCC_LV_2V90_T_3V04,
};
#define pmu_avcc_lv_level_set(avcc_lv_level) PMU_REG_SET_VALUE(PMU->LVD_CON, 0x000000e0, avcc_lv_level, 5)
enum vcc1_lv_level {
VCC1_LV_2V54_T_2V66,
VCC1_LV_1V46_T_1V53,
};
#define pmu_vcc1_lv_level_set(vcc1_lv_level) PMU_REG_SET_VALUE(PMU->LVD_CON, 0x00000010, vcc1_lv_level, 4)
#define pmu_vdd_lv_detect_en() PMU_REG_SET_BITS(PMU->LVD_CON, BIT(3))
#define pmu_vdd_lv_detect_dis() PMU_REG_CLR_BITS(PMU->LVD_CON, BIT(3))
#define pmu_avcc_lv_detect_en() PMU_REG_SET_BITS(PMU->LVD_CON, BIT(2))
#define pmu_avcc_lv_detect_dis() PMU_REG_CLR_BITS(PMU->LVD_CON, BIT(2))
#define pmu_vcc1_lv_detect_en() PMU_REG_SET_BITS(PMU->LVD_CON, BIT(1))
#define pmu_vcc1_lv_detect_dis() PMU_REG_CLR_BITS(PMU->LVD_CON, BIT(1))
#define pmu_vcc15_lv_detect_en() PMU_REG_SET_BITS(PMU->LVD_CON, BIT(0))
#define pmu_vcc15_lv_detect_dis() PMU_REG_CLR_BITS(PMU->LVD_CON, BIT(0))
/* lvdcon1 */
#define PMU_VDD18_OC_PENDING (PMU->LVD_CON1 & BIT(31))
#define PMU_VDD12_OC_PENDING (PMU->LVD_CON1 & BIT(30))
#define pmu_vcc_lv_detect_sync_en() PMU_REG_CLR_BITS(PMU->LVD_CON1, BIT(30))
#define pmu_vcc_lv_detect_sync_dis() PMU_REG_SET_BITS(PMU->LVD_CON1, BIT(30))
#define pmu_vdd_lv_detect_filter_en() PMU_REG_CLR_BITS(PMU->LVD_CON1, BIT(29))
#define pmu_vdd_lv_detect_filter_dis() PMU_REG_SET_BITS(PMU->LVD_CON1, BIT(29))
#define pmu_vcc_lv_detect_filter_en() PMU_REG_CLR_BITS(PMU->LVD_CON1, BIT(28))
#define pmu_vcc_lv_detect_filter_dis() PMU_REG_SET_BITS(PMU->LVD_CON1, BIT(28))
#define pmu_vdd_oc_lv_ldetect_filter_set(level) PMU_REG_SET_VALUE(PMU->LVD_CON1, 0x0FE00000, level, 21)
#define pmu_vdd_oc_lv_ldetect_filter_set(level) PMU_REG_SET_VALUE(PMU->LVD_CON1, 0x0FE00000, level, 21)
#define pmu_vdd_oc_lv_hdetect_filter_set(level) PMU_REG_SET_VALUE(PMU->LVD_CON1, 0x01FC000, level, 14)
#define pmu_vdd_oc_lv_hdetect_filter_set(level) PMU_REG_SET_VALUE(PMU->LVD_CON1, 0x01FC000, level, 14)
#define pmu_vcc_oc_lv_ldetect_filter_set(level) PMU_REG_SET_VALUE(PMU->LVD_CON1, 0x00003f80, level, 7)
#define pmu_vcc_oc_lv_ldetect_filter_set(level) PMU_REG_SET_VALUE(PMU->LVD_CON1, 0x00003f80, level, 7)
#define pmu_vcc_oc_lv_hdetect_filter_set(level) PMU_REG_SET_VALUE(PMU->LVD_CON1, 0x0000007f, level, 0)
#define pmu_vcc_oc_lv_hdetect_filter_set(level) PMU_REG_SET_VALUE(PMU->LVD_CON1, 0x0000007f, level, 0)
/* lvdcon2 */
#define pmu_vdd12_oc_int_en() PMU_REG_CLR_BITS(PMU->LVD_CON2, BIT(31))
#define pmu_vdd12_oc_int_dis() PMU_REG_SET_BITS(PMU->LVD_CON2, BIT(31))
#define pmu_vdd18_oc_int_en() PMU_REG_CLR_BITS(PMU->LVD_CON2, BIT(30))
#define pmu_vdd18_oc_int_dis() PMU_REG_SET_BITS(PMU->LVD_CON2, BIT(30))
#define pmu_vcc1_lv_detect_filter_en() PMU_REG_CLR_BITS(PMU->LVD_CON2, BIT(29))
#define pmu_vcc1_lv_detect_filter_dis() PMU_REG_SET_BITS(PMU->LVD_CON2, BIT(29))
#define pmu_vcc15_lv_detect_filter_en() PMU_REG_CLR_BITS(PMU->LVD_CON2, BIT(28))
#define pmu_vcc15_lv_detect_filter_dis() PMU_REG_SET_BITS(PMU->LVD_CON2, BIT(28))
#define pmu_vcc1_oc_lv_ldetect_filter_set(level) PMU_REG_SET_VALUE(PMU->LVD_CON2, 0x0FE00000, level, 21)
#define pmu_vcc1_oc_lv_ldetect_filter_set(level) PMU_REG_SET_VALUE(PMU->LVD_CON2, 0x0FE00000, level, 21)
#define pmu_vcc1_oc_lv_hdetect_filter_set(level) PMU_REG_SET_VALUE(PMU->LVD_CON2, 0x001FC000, level, 14)
#define pmu_vcc1_oc_lv_hdetect_filter_set(level) PMU_REG_SET_VALUE(PMU->LVD_CON2, 0x001FC000, level, 14)
#define pmu_vcc15_oc_lv_ldetect_filter_set(level) PMU_REG_SET_VALUE(PMU->LVD_CON2, 0x00003f80, level, 7)
#define pmu_vcc15_oc_lv_ldetect_filter_set(level) PMU_REG_SET_VALUE(PMU->LVD_CON2, 0x00003f80, level, 7)
#define pmu_vcc15_oc_lv_hdetect_filter_set(level) PMU_REG_SET_VALUE(PMU->LVD_CON2, 0x0000007f, level, 0)
#define pmu_vcc15_oc_lv_hdetect_filter_set(level) PMU_REG_SET_VALUE(PMU->LVD_CON2, 0x0000007f, level, 0)
/* CORE_PMUCON0 */
#define pmu_ftmclr_en() PMU_REG_SET_BITS(PMU->PMUCON0, BIT(31))
#define pmu_ftmclr_dis() PMU_REG_CLR_BITS(PMU->PMUCON0, BIT(31))
#define pmu_port_wk_auto_dis_en() PMU_REG_SET_BITS(PMU->PMUCON0, BIT(29))
#define pmu_port_wk_auto_dis_dis() PMU_REG_CLR_BITS(PMU->PMUCON0, BIT(29))
#define pmu_mclr_soft_en() PMU_REG_SET_BITS(PMU->PMUCON0, BIT(28))
#define pmu_mclr_soft_dis() PMU_REG_CLR_BITS(PMU->PMUCON0, BIT(28))
#define pmu_led_io_mux_en() PMU_REG_CLR_BITS(PMU->PMUCON0, BIT(27))
#define pmu_led_io_mux_dis() PMU_REG_SET_BITS(PMU->PMUCON0, BIT(27))
enum pd_tmr1_clk_sel {
PD_TMR1_CLK_RC128K,
PD_TMR1_CLK_XOSC,
PD_TMR1_CLK_RC8M,
PD_TMR1_CLK_LX32K,
};
#define pmu_pd_tmr1_clk_sel(pd_tmr1_clk_sel) PMU_REG_SET_VALUE(PMU->PMUCON0, 0x06000000, pd_tmr1_clk_sel, 25)
#define pmu_pd_mem2_en() PMU_REG_SET_BITS(PMU->PMUCON0, BIT(24))
#define pmu_pd_mem2_dis() PMU_REG_CLR_BITS(PMU->PMUCON0, BIT(24))
#define pmu_fls_pg_en() PMU_REG_SET_BITS(PMU->PMUCON0, BIT(23))
#define pmu_fls_pg_dis() PMU_REG_CLR_BITS(PMU->PMUCON0, BIT(23))
#define pmu_pd_mem32k_en() PMU_REG_SET_BITS(PMU->PMUCON0, BIT(22))
#define pmu_pd_mem32k_dis() PMU_REG_CLR_BITS(PMU->PMUCON0, BIT(22))
#define pmu_pd_ulp_en() PMU_REG_SET_BITS(PMU->PMUCON0, BIT(21))
#define pmu_pd_ulp_dis() PMU_REG_CLR_BITS(PMU->PMUCON0, BIT(21))
#define pmu_pd_io_latch_en() PMU_REG_SET_BITS(PMU->PMUCON0, BIT(20))
#define pmu_pd_io_latch_dis() PMU_REG_CLR_BITS(PMU->PMUCON0, BIT(20))
#define pmu_pd_rf_latch_en() PMU_REG_CLR_BITS(PMU->PMUCON0, BIT(19))
#define pmu_pd_rf_latch_dis() PMU_REG_SET_BITS(PMU->PMUCON0, BIT(19))
#define pmu_pd_osc_en() PMU_REG_SET_BITS(PMU->PMUCON0, BIT(18))
#define pmu_pd_osc_dis() PMU_REG_CLR_BITS(PMU->PMUCON0, BIT(18))
#define pmu_pd_osc_hw_trim_en() PMU_REG_SET_BITS(PMU->PMUCON0, BIT(17))
#define pmu_pd_osc_hw_trim_dis() PMU_REG_CLR_BITS(PMU->PMUCON0, BIT(17))
enum pd_tmr_clk_sel {
PD_TMR_CLK_RC128K,
PD_TMR_CLK_XOSC,
PD_TMR_CLK_RC32K,
PD_TMR_CLK_LX32K,
};
#define pmu_pd_tmr_clk_sel(pd_tmr_clk_sel) PMU_REG_SET_VALUE(PMU->PMUCON0, 0x00018000, pd_tmr_clk_sel, 15)
#define pmu_io_clk_en() PMU_REG_SET_BITS(PMU->PMUCON0, BIT(14))
#define pmu_io_clk_dis() PMU_REG_CLR_BITS(PMU->PMUCON0, BIT(14))
#define pmu_pd_wdt_en() PMU_REG_SET_BITS(PMU->PMUCON0, BIT(11))
#define pmu_pd_wdt_dis() PMU_REG_CLR_BITS(PMU->PMUCON0, BIT(11))
enum lpvdd_vol_level {
LPVDD_VOL_0V74,
LPVDD_VOL_0V81,
LPVDD_VOL_0V88,
LPVDD_VOL_0V95,
LPVDD_VOL_1V02,
LPVDD_VOL_1V09,
LPVDD_VOL_1V16,
LPVDD_VOL_1V23,
};
#define pmu_lpvdd_vol_set(lpvdd_vol_level) PMU_REG_SET_VALUE(PMU->PMUCON0, 0x00000700, lpvdd_vol_level, 8)
/* CORE_PMUCON1 */
/* CORE_PMUCON2 */
/* CORE_PMUCON3 */
/* CORE_PMUCON4 */
#define pmu_vdd_en() PMU_REG_SET_BITS(PMU->PMUCON4, BIT(9))
#define pmu_vdd_dis() PMU_REG_CLR_BITS(PMU->PMUCON4, BIT(9))
/* CORE_PMUCON5 */
enum vdd15_vol_level {
VDD15_VOL_1V2,
VDD15_VOL_1V3,
VDD15_VOL_1V4,
VDD15_VOL_1V5,
VDD15_VOL_1V6,
VDD15_VOL_1V7,
VDD15_VOL_1V8,
VDD15_VOL_1V9,
VDD15_VOL_2V0,
VDD15_VOL_2V1,
VDD15_VOL_2V2,
VDD15_VOL_2V3,
VDD15_VOL_2V4,
VDD15_VOL_2V5,
};
#define pmu_vdd15_vol_set(vdd15_vol_level) PMU_REG_SET_VALUE(PMU->PMUCON5, 0xF, vdd15_vol_level, 0)
#define pmu_hirc_8mhz_en() PMU_REG_SET_BITS(PMU->PMUCON5, BIT(24))
#define pmu_hirc_8mhz_dis() PMU_REG_CLR_BITS(PMU->PMUCON5, BIT(24))
/* CORE_PMUCON7 */
enum pmu_con7_bits_funcs {
PMU_BOOT_DIRECT_RUN, //0
PMU_APP_DEADCODE_PENDING,
PMU_CP_FAIL_PENDING,
PMU_BOOT_CODE_POS,
PMU_DIRECT_RUN_DISABLE_SIGN, //4
PMU_SKIP_MASTER_BOOT_SIGN,
PMU_SKIP_TEST_MODE_SIGN,
PMU_SKIP_PSRAM_SIGN,
PMU_RSV8, //8
PMU_RSV9,
PMU_RSV10,
PMU_RSV11,
PMU_RSV12,
PMU_RSV13,
PMU_RSV14,
PMU_RSV15,
PMU_DSLEEP_INIT_SIGN, //16
PMU_LPWDT_LOCK_SIGN,
PMU_WDT1_LOCK_SIGN,
PMU_WDT_LOCK_SIGN,
PMU_APP_SOFTRESET_SIGN, //20
PMU_WIFI_TEST_MODE_SIGN,
PMU_RSV22,
PMU_BOOT_DIRECT_RUN_PENDING2,
};
#define pmu_boot_direct_run_en() PMU_REG_SET_BITS(PMU->PMUCON7, BIT(0))
#define pmu_boot_direct_run_dis() PMU_REG_CLR_BITS(PMU->PMUCON7, BIT(0))
#define pmu_get_boot_direct_run_pending() ((PMU->PMUCON7 & BIT(0)))
#define pmu_get_deadcode_pending() ((PMU->PMUCON7 & BIT(1)) ? 1 : 0)
#define pmu_clr_deadcode_pending() PMU_REG_CLR_BITS(PMU->PMUCON7, BIT(1))
#define pmu_get_cp_fail_pending() ((PMU->PMUCON7 & BIT(2)) ? 1 : 0)
#define pmu_clr_cp_fail_pending() PMU_REG_CLR_BITS(PMU->PMUCON7, BIT(2))
#define pmu_get_boot_code_pos() ((PMU->PMUCON7 & BIT(3)) ? 1 : 0)
#define GET_DIRECT_RUN_DISABLE_SIGN() ((PMU->PMUCON7 & BIT(4)) ? 1 : 0)
#define SET_DIRECT_RUN_DISABLE_SIGN(n)\
do {\
if (n) PMU_REG_SET_BITS(PMU->PMUCON7, BIT(4));\
else PMU_REG_CLR_BITS(PMU->PMUCON7, BIT(4));\
} while(0)
#define GET_SKIP_MASTER_BOOT_SIGN() ((PMU->PMUCON7 & BIT(5)) ? 1 : 0)
#define SET_SKIP_MASTER_BOOT_SIGN(n)\
do {\
if (n) PMU_REG_SET_BITS(PMU->PMUCON7, BIT(5));\
else PMU_REG_CLR_BITS(PMU->PMUCON7, BIT(5));\
} while(0)
#define GET_SKIP_TEST_MODE_SIGN() ((PMU->PMUCON7 & BIT(6)))
#define SET_SKIP_TEST_MODE_SIGN(n)\
do {\
if (n) PMU_REG_SET_BITS(PMU->PMUCON7, BIT(6));\
else PMU_REG_CLR_BITS(PMU->PMUCON7, BIT(6));\
} while(0)
#define GET_SKIP_PSRAM_SIGN() ((PMU->PMUCON7 & BIT(7)))
#define SET_SKIP_PSRAM_SIGN(n)\
do {\
if (n) PMU_REG_SET_BITS(PMU->PMUCON7, BIT(7));\
else PMU_REG_CLR_BITS(PMU->PMUCON7, BIT(7));\
} while(0)
/* PMU->PMUCON7[8:19] : not used */
/* PMU->PMUCON7[20] */
#define GET_APP_SOFTRESET_SIGN() ((PMU->PMUCON7 & BIT(20)))
#define SET_APP_SOFTRESET_SIGN(n)\
do {\
if (n) PMU_REG_SET_BITS(PMU->PMUCON7, BIT(20));\
else PMU_REG_CLR_BITS(PMU->PMUCON7, BIT(20));\
} while(0)
/* PMU->PMUCON7[22] */
#define GET_WIFI_TEST_MODE_SIGN() ((PMU->PMUCON7 & BIT(21)))
#define SET_WIFI_TEST_MODE_SIGN(n)\
do {\
if (n) PMU_REG_SET_BITS(PMU->PMUCON7, BIT(21));\
else PMU_REG_CLR_BITS(PMU->PMUCON7, BIT(21));\
} while(0)
#define pmu_get_boot_direct_run_pending2() ((PMU->PMUCON7 & BIT(23)))
#define pmu_set_direct_run_pengding2() PMU_REG_SET_BITS(PMU->PMUCON7, BIT(23))
#define pmu_clr_direct_run_pengding2() PMU_REG_CLR_BITS(PMU->PMUCON7, BIT(23))
#define pmu_set_direct_run_addr(addr) PMU_REG_SET_VALUE(PMU->PMUCON7, 0xFF000000, ((addr >> 12) & 0xFF), 24)
/* CORE_PMUCON8 */
#define pmu_jtag_io_en() PMU_REG_SET_BITS(PMU->PMUCON8, BIT(0))
#define pmu_jtag_io_dis() PMU_REG_CLR_BITS(PMU->PMUCON8, BIT(0))
/* CORE_PMUCON11 */
#define VCCFLS_PG_DISABLE()\
do {\
pmu_reg_write((uint32)&PMU->PMUCON0, PMU->PMUCON0 & (~ BIT(23))); \
pmu_reg_write((uint32)&PMU->PMUCON11, PMU->PMUCON11 | (BIT(17))); \
} while(0)
#define VCCFLS_PG_ENABLE()\
do {\
pmu_reg_write((uint32)&PMU->PMUCON11, PMU->PMUCON11 & (~ BIT(17)));\
pmu_reg_write((uint32)&PMU->PMUCON0, PMU->PMUCON0 | BIT(23)); \
} while(0)
#define pmu_efuse_program_dis() PMU_REG_CLR_BITS(PMU->PMUCON11, BIT(31))
#define pmu_efuse_program_en() PMU_REG_SET_BITS(PMU->PMUCON11, BIT(31))
#define pmu_vcam_lc_dis() PMU_REG_CLR_BITS(PMU->PMUCON11, BIT(29))
#define pmu_vcam_lc_en() PMU_REG_SET_BITS(PMU->PMUCON11, BIT(29))
#define pmu_vcam_pg_en() PMU_REG_SET_BITS(PMU->PMUCON11, BIT(16))
#define pmu_vcam_pg_dis() PMU_REG_CLR_BITS(PMU->PMUCON11, BIT(16))
#define pmu_vcam_oc_detect_en() PMU_REG_SET_BITS(PMU->PMUCON11, BIT(15))
#define pmu_vcam_oc_detect_dis() PMU_REG_CLR_BITS(PMU->PMUCON11, BIT(15))
#define pmu_vcam_en() PMU_REG_SET_BITS(PMU->PMUCON11, BIT(14))
#define pmu_vcam_dis() PMU_REG_CLR_BITS(PMU->PMUCON11, BIT(14))
#define pmu_vcam_discharge_en() PMU_REG_SET_BITS(PMU->PMUCON11, BIT(13))
#define pmu_vcam_discharge_dis() PMU_REG_CLR_BITS(PMU->PMUCON11, BIT(13))
/* CORE_PNDCLR */
#define pmu_vcam2_oc_pending_clr() PMU_REG_SET_BITS(PMU->PNDCLR, BIT(30))
#define pmu_vcc18_oc_pending_clr() PMU_REG_SET_BITS(PMU->PNDCLR, BIT(29))
#define pmu_vcam_oc_pending_clr() PMU_REG_SET_BITS(PMU->PNDCLR, BIT(22))
#define pmu_vcc15_oc_pending_clr() PMU_REG_SET_BITS(PMU->PNDCLR, BIT(13))
#define pmu_vdd_oc_pending_clr() PMU_REG_SET_BITS(PMU->PNDCLR, BIT(12))
enum vcam_vol_level {
VCAM_VOL_2V50,
VCAM_VOL_2V55,
VCAM_VOL_2V60,
VCAM_VOL_2V65,
VCAM_VOL_2V70,
VCAM_VOL_2V75,
VCAM_VOL_2V80,
VCAM_VOL_2V85,
VCAM_VOL_2V90,
VCAM_VOL_2V95,
VCAM_VOL_3V00,
VCAM_VOL_3V05,
VCAM_VOL_3V10,
VCAM_VOL_3V15,
VCAM_VOL_3V20,
VCAM_VOL_3V25,
};
#define pmu_set_vcam_vol(vcam_vol_level) PMU_REG_SET_VALUE(PMU->PMUCON11, 0x01e00000, vcam_vol_level, 21)
enum vcam_oc_level {
VCAM_OC_750MA,
VCAM_OC_300MA,
VCAM_OC_200MA,
VCAM_OC_100MA,
};
#define pmu_vcam_oc_set(vcam_oc_level) PMU_REG_SET_VALUE(PMU->PMUCON11, 0x00000600, vcam_oc_level, 9)
/* CORE_RFCON0 */
#define pmu_xo_cs_set(xo_cs_vdd) PMU_REG_SET_VALUE(PMU->RFCON0, 0x03f80000, xo_cs_vdd, 19)
#define xo_set_cs_sec(xo_cs_vdd) pmu_xo_cs_set(xo_cs_vdd)
#define pmu_xosc_en() PMU_REG_SET_BITS(PMU->RFCON0, BIT(0))
#define pmu_xosc_dis() PMU_REG_CLR_BITS(PMU->RFCON0, BIT(0))
enum vcc_ldo_vol_level {
VCC_LDO_VOL_1V00,
VCC_LDO_VOL_1V05,
VCC_LDO_VOL_1V10,
VCC_LDO_VOL_1V15,
VCC_LDO_VOL_1V20,
VCC_LDO_VOL_1V25,
VCC_LDO_VOL_1V30,
VCC_LDO_VOL_1V35,
VCC_LDO_VOL_1V40,
VCC_LDO_VOL_1V45,
VCC_LDO_VOL_1V50,
VCC_LDO_VOL_1V55,
VCC_LDO_VOL_1V60,
VCC_LDO_VOL_1V65,
VCC_LDO_VOL_1V70,
VCC_LDO_VOL_1V75,
VCC_LDO_VOL_1V80,
VCC_LDO_VOL_1V85,
VCC_LDO_VOL_1V90,
VCC_LDO_VOL_1V95,
VCC_LDO_VOL_2V00,
VCC_LDO_VOL_2V05,
VCC_LDO_VOL_2V10,
VCC_LDO_VOL_2V15,
VCC_LDO_VOL_2V20,
VCC_LDO_VOL_2V25,
VCC_LDO_VOL_2V30,
VCC_LDO_VOL_2V35,
VCC_LDO_VOL_2V40,
VCC_LDO_VOL_2V45,
VCC_LDO_VOL_2V50,
VCC_LDO_VOL_2V55,
};
struct system_reset_pending_bits {
uint32 srp_mclr : 1, /* mclr pin reset */
srp_soft : 1, /* cpu0 mcu reset */
srp_wdt : 1, /* cpu0 watchdog reset */
srp_lp_wdt : 1, /* lowpower watchdog reset */
srp_wdt1 : 1, /* cpu1 watchdog reset */
srp_soft1 : 1, /* cpu1 mcu reset */
Reserved0 : 2,
srp_lvd : 1, /* vcc lower voltage reset */
srp_lvd_vcam_cur_ov : 1,/* vcam over-current */
srp_lvd_vcc15_cur_ov : 1,/* vcc15 over-current */
srp_lvd_vdd_cur_ov : 1, /* vdd over-current */
srp_lvd_vdd_vol_low : 1, /* vdd voltage low */
srp_lvd_vcc_vol_low : 1, /* vcc voltage low */
srp_lvd_vcc1_vol_low : 1, /* vcc1 voltage low */
srp_lvd_vcc15_vol_low : 1, /* vcc15 voltage low */
srp_deep_sleep : 1,
srp_lvd_vdd18_cur_ov : 1, /* vdd18 over-current */
srp_lvd_vcam2_cur_ov : 1, /* vcam2 over-current */
Reserved : 13;
};
struct system_reset_info {
union {
uint32 system_reset_pending;
struct system_reset_pending_bits system_reset_pending_bits_s;
};
} __attribute__((packed));
extern struct system_reset_info sri;
void pmu_reg_write(uint32 reg_addr, uint32 data) ;
void pmu_dcdc_open(void);
void pmu_vccfls_power_set(uint32 power_on, uint32 suply_3p3v);
/* PC[8:13] power domain : VCC or VCC18 */
void pmu_vccsd_power_set(uint32 power_on, uint32 suply_3p3v);
int32 pmu_vdd18_ldo_en(uint32 en, enum vcc_ldo_vol_level vol);
int pmu_is_vdd18_ldo_en(void);
int pmu_get_vdd18_ldo_vol(void);
/**
* strongly recommend vol same with vcc18 when power for mipi sensor
*/
int32 pmu_vcam2_ldo_en(uint32 en, enum vcc_ldo_vol_level vol);
int pmu_is_vcam2_ldo_en(void);
int pmu_get_vcam2_ldo_vol(void);
void pmu_tsensor_chan_sel_sec(uint8 chan_idx);
void pmu_pd_set_anatop_en_sec(void);
int jtag_map_set(uint8 val);
void tsensor_open(void);
void tsensor_close(void);
void lvd_irq_handler(void *data);
void sys_reset_detect(void);
void sys_reset_pending_clr(void);
void sys_reset_show(void);
void pmu_vdd_core_set(uint32 vddcore);
#ifdef __cplusplus
}
#endif
#endif //__PMU_H__
/******************* (C) COPYRIGHT 2021 HUGE-IC *****END OF FILE****/