/*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====* guilin_lite2.c GENERAL DESCRIPTION This file is for ASR I2C package. EXTERNALIZED FUNCTIONS INITIALIZATION AND SEQUENCING REQUIREMENTS Copyright (c) 2017 by ASR, Incorporated. All Rights Reserved. *====*====*====*====*====*====*====*====*====*====*====*====*====*====*====* *=========================================================================== EDIT HISTORY FOR MODULE This section contains comments describing changes made to the module. Notice that changes are listed in reverse chronological order. when who what, where, why -------- ------ ---------------------------------------------------------- 03/07/2018 Qianying Created module ===========================================================================*/ /*=========================================================================== INCLUDE FILES FOR MODULE ===========================================================================*/ #include "common.h" #include "guilin_lite2.h" #include "pmic.h" //#include "UART.h" //#include "bsp.h" /*=========================================================================== LOCAL DEFINITIONS AND DECLARATIONS FOR MODULE This section contains local definitions for constants, macros, types, variables and other items needed by this module. ===========================================================================*/ /*=========================================================================== EXTERN DEFINITIONS AND DECLARATIONS FOR MODULE ===========================================================================*/ /*=========================================================================== INTERNAL FUNCTION DEFINITIONS ===========================================================================*/ /*************************************************************************/ /* */ /* FUNCTION */ /* */ /* GuilinLite2Read */ /* */ /* DESCRIPTION */ /* */ /* The function Read GuilinLite2 by PI2C interface. */ /* */ /* CALLED BY */ /* */ /* Application */ /* */ /* CALLS */ /* */ /* Application The application function */ /* */ /* INPUTS */ /* */ /* None N/A */ /* */ /* OUTPUTS */ /* */ /* None N/A */ /* */ /*************************************************************************/ int GuilinLite2Read( GuilinLite2_Reg_Type guilin_lite2_reg_type, unsigned char reg, unsigned char *value ) { int res = 0; INT32 result; switch( guilin_lite2_reg_type ) { case GUILIN_LITE2_BASE_Reg: { res = USTICAI2CReadDi_base(reg); GUILIN_LITE2_UART_DEBUG( "[%s] SLAVE=[BASE], REG=[0x%.2x] , VAL=[0x%.2x]", __FUNCTION__,reg,res); break; } case GUILIN_LITE2_POWER_Reg: { res = USTICAI2CReadDi_power(reg); GUILIN_LITE2_UART_DEBUG( "[%s] SLAVE=[POWER], REG=[0x%.2x] , VAL=[0x%.2x]", __FUNCTION__,reg,res); break; } default: { GUILIN_LITE2_UART_DEBUG( "[%s] UNKNOW TARGET REG", __FUNCTION__); break; } } *value = res; return 0; } /*************************************************************************/ /* */ /* FUNCTION */ /* */ /* GuilinLite2Write */ /* */ /* DESCRIPTION */ /* */ /* The function Write GuilinLite2 by PI2C interface. */ /* */ /* CALLED BY */ /* */ /* Application */ /* */ /* CALLS */ /* */ /* Application The application function */ /* */ /* INPUTS */ /* */ /* None N/A */ /* */ /* OUTPUTS */ /* */ /* None N/A */ /* */ /*************************************************************************/ int GuilinLite2Write( GuilinLite2_Reg_Type guilin_lite2_reg_type, unsigned char reg, unsigned char value ) { INT32 result; switch( guilin_lite2_reg_type ) { case GUILIN_LITE2_BASE_Reg: { USTICAI2CWriteDi_base(reg, value); GUILIN_LITE2_UART_DEBUG( "[%s] SLAVE=[BASE ], REG=[0x%.2x] , VAL=[0x%.2x]", __FUNCTION__,reg,value); break; } case GUILIN_LITE2_POWER_Reg: { USTICAI2CWriteDi_power(reg, value); GUILIN_LITE2_UART_DEBUG( "[%s] SLAVE=[POWER] , REG=[0x%.2x] , VAL=[0x%.2x]", __FUNCTION__,reg,value); break; } default: { GUILIN_LITE2_UART_DEBUG( "[%s] UNKNOW TARGET REG", __FUNCTION__); break; } } return 0; } /*************************************************************************/ /* */ /* FUNCTION */ /* */ /* GuilinLite2ClkInit */ /* */ /* DESCRIPTION */ /* */ /* The function initialize the Ustia clock. */ /* */ /* CALLED BY */ /* */ /* Application */ /* */ /* CALLS */ /* */ /* Application The application function */ /* */ /* INPUTS */ /* */ /* None N/A */ /* */ /* OUTPUTS */ /* */ /* meas_val The 12bit ADC value */ /* */ /*************************************************************************/ void GuilinLite2ClkInit( void ) { } void GuilinLite2_VBUCK1_Set_FPWM( void ) { unsigned char var = 0; //set fpwm mode for buck1, power page, @0x25[3]=1 GuilinLite2Read( GUILIN_LITE2_POWER_Reg, GUILIN_LITE2_VBUCK1_FSM_REG4, &var ); var |= 0x1<<3; GuilinLite2Write( GUILIN_LITE2_POWER_Reg, GUILIN_LITE2_VBUCK1_FSM_REG4, var ); } //VBUCK FUNC int GuilinLite2_VBUCK_Set_Enable(unsigned char reg, unsigned char enable){ unsigned char tmp; //keep the ENABLE_BIT[6:0] as previous if(GUILIN_LITE2_CONTAIN_VBUCK_EN_BIT(reg)) { GuilinLite2Read( GUILIN_LITE2_POWER_Reg, reg, &tmp ); if(enable){ tmp |= GUILIN_LITE2_VBUCK_ENABLE_MASK; }else{ tmp &= ~GUILIN_LITE2_VBUCK_ENABLE_MASK; } return GuilinLite2Write( GUILIN_LITE2_POWER_Reg, reg, tmp ); } else { GUILIN_LITE2_UART_DEBUG("[%s] ERROR REG=[0x%.2x]",__FUNCTION__,reg); return 1; } } int GuilinLite2_VBUCK_Set_Slpmode(unsigned char reg, unsigned char mode){ unsigned char tmp; //keep other expect SLP_BIT[4:3] if(GUILIN_LITE2_CONTAIN_VBUCK_SLEEP_MODE_BIT(reg)) { GuilinLite2Read( GUILIN_LITE2_POWER_Reg, reg, &tmp ); tmp &= ~GUILIN_LITE2_VBUCK_SLEEP_MODE_MASK; tmp |= (mode & GUILIN_LITE2_VBUCK_SLEEP_MODE_MASK); return GuilinLite2Write( GUILIN_LITE2_POWER_Reg, reg, tmp ); } else { GUILIN_LITE2_UART_DEBUG("[%s] ERROR REG=[0x%.2x]",__FUNCTION__,reg); return 1; } } int GuilinLite2_VBUCK_Set_VOUT(unsigned char reg, unsigned char value){ unsigned char tmp; // keep the ENABLE_BIT as previous if(GUILIN_LITE2_CONTAIN_VBUCK_ACTIVE_VOUT_BIT(reg)) { GuilinLite2Read( GUILIN_LITE2_POWER_Reg, reg, &tmp ); tmp &= ~GUILIN_LITE2_CONTAIN_VBUCK_ACTIVE_VOUT_MASK; tmp |= (value & GUILIN_LITE2_CONTAIN_VBUCK_ACTIVE_VOUT_MASK); } //keep the DVC_ENABLE_BIT bit as previous else if(GUILIN_LITE2_CONTAIN_VBUCK_SLEEP_VOUT_BIT(reg)) { GuilinLite2Read( GUILIN_LITE2_POWER_Reg, reg, &tmp ); tmp &= ~GUILIN_LITE2_CONTAIN_VBUCK_SLEEP_VOUT_MASK; tmp |= (value & GUILIN_LITE2_CONTAIN_VBUCK_SLEEP_VOUT_MASK); } else{ GUILIN_LITE2_UART_DEBUG("[%s] ERROR REG=[0x%.2x]",__FUNCTION__,reg); return 1; } return GuilinLite2Write( GUILIN_LITE2_POWER_Reg, reg, tmp ); } //LDO FUNC int GuilinLite2_LDO_Set_Enable(unsigned char reg, unsigned char enable){ unsigned char tmp; //keep the ENABLE_BIT[5:0] as previous if(GUILIN_LITE2_CONTAIN_LDO_EN_BIT(reg)) { GuilinLite2Read( GUILIN_LITE2_POWER_Reg, reg, &tmp ); if(enable){ tmp |= GUILIN_LITE2_LDO_ENABLE_MASK; }else{ tmp &= ~GUILIN_LITE2_LDO_ENABLE_MASK; } return GuilinLite2Write( GUILIN_LITE2_POWER_Reg, reg, tmp ); } else { GUILIN_LITE2_UART_DEBUG("[%s] ERROR REG=[0x%.2x]",__FUNCTION__,reg); return 1; } } int GuilinLite2_LDO_Set_Slpmode(unsigned char reg, unsigned char mode){ unsigned char tmp; //keep the SLP_MODE[3:0] if(GUILIN_LITE2_CONTAIN_LDO_SLEEP_MODE_BIT(reg)) { GuilinLite2Read( GUILIN_LITE2_POWER_Reg, reg, &tmp ); mode &= GUILIN_LITE2_LDO_SLEEP_MODE_MASK; tmp &= ~GUILIN_LITE2_LDO_SLEEP_MODE_MASK; tmp |= mode; return GuilinLite2Write( GUILIN_LITE2_POWER_Reg, reg, tmp ); } else { GUILIN_LITE2_UART_DEBUG("[%s] ERROR REG=[0x%.2x]",__FUNCTION__,reg); return 1; } } int GuilinLite2_LDO_Set_VOUT(unsigned char reg, unsigned char value){ unsigned char tmp; if(GUILIN_LITE2_CONTAIN_LDO_ACTIVE_VOUT_BIT(reg)) { GuilinLite2Read( GUILIN_LITE2_POWER_Reg, reg, &tmp ); tmp &= ~GUILIN_LITE2_LDO_ACTIVE_VOUT_MASK; tmp |= (value & GUILIN_LITE2_LDO_ACTIVE_VOUT_MASK); } else if(GUILIN_LITE2_CONTAIN_LDO_SLEEP_VOUT_BIT(reg)) { GuilinLite2Read( GUILIN_LITE2_POWER_Reg, reg, &tmp ); tmp &= ~GUILIN_LITE2_LDO_SLEEP_VOUT_MASK; tmp |= (value & GUILIN_LITE2_LDO_SLEEP_VOUT_MASK); }else{ GUILIN_LITE2_UART_DEBUG("[%s] ERROR REG=[0x%.2x]",__FUNCTION__,reg); return 1; } return GuilinLite2Write( GUILIN_LITE2_POWER_Reg, reg, tmp ); } //ICAT EXPORTED FUNCTION - PMIC,GUILIN_LITE2,SW_reset int GuilinLite2_SW_Reset(void){ unsigned char tmp; //set discharge_time to 0 GuilinLite2Read( GUILIN_LITE2_BASE_Reg, GUILIN_LITE2_RESET_DISCHARGE_REG , &tmp); tmp &= ~GUILIN_LITE2_RESET_DISCHARGE_MASK; GuilinLite2Write( GUILIN_LITE2_BASE_Reg, GUILIN_LITE2_RESET_DISCHARGE_REG, tmp); //set fault_wu_en then set fault_wu GuilinLite2Read( GUILIN_LITE2_BASE_Reg, GUILIN_LITE2_FAULT_WU_REG, &tmp); GuilinLite2Write( GUILIN_LITE2_BASE_Reg, GUILIN_LITE2_FAULT_WU_REG, (tmp|GUILIN_LITE2_FAULT_WU_ENABLE_BIT)); GuilinLite2Read( GUILIN_LITE2_BASE_Reg, GUILIN_LITE2_FAULT_WU_REG, &tmp); GuilinLite2Write( GUILIN_LITE2_BASE_Reg, GUILIN_LITE2_FAULT_WU_REG, (tmp|GUILIN_LITE2_FAULT_WU_BIT)); //force a software powerdown GUILIN_LITE2_UART_DEBUG( "PMIC Reset......"); GuilinLite2Read( GUILIN_LITE2_BASE_Reg, GUILIN_LITE2_RESET_REG ,&tmp ); GuilinLite2Write( GUILIN_LITE2_BASE_Reg, GUILIN_LITE2_RESET_REG ,(tmp | GUILIN_LITE2_SW_PDOWN_BIT)); return 0; } void GuilinLite2_VBUCK1_CFG(UINT8 value) { if ((value < GUILIN_LITE2_VBUCK_0V50)||(value > GUILIN_LITE2_VBUCK_1V20)) { GUILIN_LITE2_UART_DEBUG("Wrong buck1 value input!\r\n"); return; } GuilinLite2_VBUCK_Set_VOUT(GUILIN_LITE2_VBUCK1_ACTIVE_VOUT_REG,value); } void GuilinLite2_Ldo_6_set_2_8(void) { GuilinLite2_LDO_Set_VOUT(GUILIN_LITE2_LDO6_ACTIVE_VOUT_REG, GUILIN_LITE2_LDO6_ACTIVE_2V80); } void GuilinLite2_Ldo_6_set(BOOL OnOff) { GuilinLite2_LDO_Set_Enable(GUILIN_LITE2_LDO6_ENABLE_REG,OnOff); } void GuilinLite2_Ldo_3_set_1_8(void) { GuilinLite2_LDO_Set_VOUT(GUILIN_LITE2_LDO3_ACTIVE_VOUT_REG,GUILIN_LITE2_LDO3_ACTIVE_1V80); } void GuilinLite2_Ldo_3_set_3_0(void) { GuilinLite2_LDO_Set_VOUT(GUILIN_LITE2_LDO3_ACTIVE_VOUT_REG, GUILIN_LITE2_LDO3_ACTIVE_3V00); } void GuilinLite2_Ldo_3_set(BOOL OnOff) { GuilinLite2_LDO_Set_Enable(GUILIN_LITE2_LDO3_ENABLE_REG,OnOff); } #define GUILIN_LITE2_EN_VINLDO_SNS_MASK 0x30 void SetRatioDivResTo803L(unsigned char ratio) { unsigned char var; GuilinLite2Read(GUILIN_LITE2_BASE_Reg, 0x1D, &var); if (ratio == 0) var &= ~GUILIN_LITE2_EN_VINLDO_SNS_MASK; else var |= ratio; GuilinLite2Write(GUILIN_LITE2_BASE_Reg, 0x1D, var); } void SetRatioDivRes(unsigned char ratio) { ratio = (ratio << 4) & GUILIN_LITE2_EN_VINLDO_SNS_MASK; SetRatioDivResTo803L(ratio); }