5450 lines
159 KiB
C
5450 lines
159 KiB
C
/*--------------------------------------------------------------------------------------------------------------------
|
|
(C) Copyright 2006, 2007 Marvell DSPC Ltd. All Rights Reserved.
|
|
-------------------------------------------------------------------------------------------------------------------*/
|
|
|
|
/*--------------------------------------------------------------------------------------------------------------------
|
|
INTEL CONFIDENTIAL
|
|
Copyright 2006 Intel Corporation All Rights Reserved.
|
|
The source code contained or described herein and all documents related to the source code (Material? are owned
|
|
by Intel Corporation or its suppliers or licensors. Title to the Material remains with Intel Corporation or
|
|
its suppliers and licensors. The Material contains trade secrets and proprietary and confidential information of
|
|
Intel or its suppliers and licensors. The Material is protected by worldwide copyright and trade secret laws and
|
|
treaty provisions. No part of the Material may be used, copied, reproduced, modified, published, uploaded, posted,
|
|
transmitted, distributed, or disclosed in any way without Intels prior express written permission.
|
|
|
|
No license under any patent, copyright, trade secret or other intellectual property right is granted to or
|
|
conferred upon you by disclosure or delivery of the Materials, either expressly, by implication, inducement,
|
|
estoppel or otherwise. Any license under such intellectual property rights must be express and approved by
|
|
Intel in writing.
|
|
-------------------------------------------------------------------------------------------------------------------*/
|
|
|
|
/*********************************************************************
|
|
* M O D U L E B O D Y *
|
|
**********************************************************************
|
|
* Title: I2C package *
|
|
* *
|
|
* Filename: I2C.c *
|
|
* *
|
|
* Target, platform: Common Platform, HW platform *
|
|
* *
|
|
* Authors: Adi Dayan *
|
|
* *
|
|
* Description: *
|
|
* *
|
|
* Notes: *
|
|
**********************************************************************/
|
|
|
|
/************* External include definitions ***************************/
|
|
|
|
/************************** MACROS ***************************************/
|
|
#include "osa.h"
|
|
#include "diag.h"
|
|
#include "ripc.h"
|
|
|
|
#include "PMChip.h"
|
|
#include "PMChip_nvm_harbell.h" // for PMC_Nvm_File_t definition
|
|
#include "bsp.h"
|
|
|
|
#include "pmic.h"
|
|
#include "ningbo.h"
|
|
#include "guilin.h"
|
|
#include "guilin_lite.h"
|
|
#include "guilin_lite2.h"
|
|
#include "guilin_lite3.h"
|
|
#include "pmic_onkey.h"
|
|
#include "pmic_rtc.h"
|
|
#include "intc.h"
|
|
#include "rtc.h"
|
|
#include "intc_list.h"
|
|
#include "utilities.h"
|
|
#include "lfs_cache.h"
|
|
#include "UART.h"
|
|
#include "MRD.h"
|
|
#include "bsp_hisr.h"
|
|
|
|
//fix build warnning
|
|
#include "FreqChange.h"
|
|
#include "usb2_device.h"
|
|
#include "mvUsbDevApi.h"
|
|
#include "EE_silentReset.h"
|
|
#include "quec_cust_feature.h"
|
|
#include "cgpio.h"
|
|
|
|
#include "dev_api.h" // quectel add
|
|
#include "asr_property.h"
|
|
|
|
unsigned char pmic_id=PMIC_UNAVAILABLE;
|
|
/* I2C Semaphore reference. */
|
|
OSSemaRef I2CApp_SemaRef;
|
|
|
|
/************* External include definitions ***************************/
|
|
volatile unsigned long I2C_REGISTER_BASE_ADDR = 0xD4037000;
|
|
|
|
#define SET 1
|
|
#define CLEAR 0
|
|
#define PMU_XCGR_READ (( volatile UINT32 *)(0xD4051024))
|
|
#define I2C_FUN_CLK_ADD (( volatile UINT32 *)(0xD4051024))
|
|
#define I2C_APB_CLK_ADD (( volatile UINT32 *)(0xD401502c))
|
|
#define PMU_XCGR_EN_I2C_FUN_CLK ((0x1 << 22) |(0x1 << 6))
|
|
#define I2C_APB_CLK_ENABLE 0x3
|
|
#define I2C_APB_RESET 0x4
|
|
|
|
#define I2C_DEVICE_ERROR 0xDEADBEEF
|
|
#define I2C_STATUS_ARRAY_SIZE 4
|
|
#define I2C_RECORD_FLAG 0x494E4954
|
|
#ifdef QUECTEL_PROJECT_CUST
|
|
#define PMIC_HISR_STACK_SIZE 2048
|
|
#endif
|
|
|
|
/*********************** Sub-Package Parameters *************************/
|
|
/* I2C device status*/
|
|
typedef struct I2CDeviceStatus
|
|
{
|
|
UINT32 RecordFlag;
|
|
UINT32 BaseAddress;
|
|
UINT32 SlaveAddress;
|
|
UINT32 DeviceStatus;
|
|
} I2CDeviceStatus;
|
|
|
|
I2CDeviceStatus I2CStatusArray[I2C_STATUS_ARRAY_SIZE];
|
|
|
|
typedef void (*I2CMasterNotifyDataReceived)( UINT8 * , UINT16 , UINT16 );
|
|
|
|
typedef struct
|
|
{
|
|
UINT8 activeSlaveAddress;
|
|
UINT8 *RxBufferPtr;
|
|
UINT16 dataSize;
|
|
UINT16 ID;
|
|
I2CMasterNotifyDataReceived callBack;
|
|
} I2C_ReceiveRequestParams;
|
|
|
|
|
|
static BOOL _repeat_start = TRUE;
|
|
|
|
extern PMIC_RTC_OFFSET_STORAGE m_pmic_rtc_offset_storage_type;
|
|
static I2C_ReceiveRequestParams _receiveReqParams;
|
|
extern UINT32 VbatTempEventSetFlag;
|
|
extern UINT8 TempReadResult[2];
|
|
extern UINT8 VbatReadResult[2];
|
|
extern UINT16 TempmesurementAlignedValue;
|
|
extern UINT16 VoltmesurementAlignedValue;
|
|
extern UINT32 TempMesurementvoltage;
|
|
extern UINT32 VbatMesurementvoltage;
|
|
extern UINT32 ThermisterValue;
|
|
extern UINT32 VbatMesurementvoltage_back;
|
|
extern UINT32 RFtemprature_back;
|
|
extern UINT8 Vbat_Temp_test_InitFlag;
|
|
extern Pmic_Int_Handler mNingboIntHandler[];
|
|
extern Pmic_Int_Handler mGuilinIntHandler[];
|
|
extern Pmic_Int_Handler mGuilinLiteIntHandler[];
|
|
extern Pmic_Int_Handler mGuilinLite2IntHandler[];
|
|
extern Pmic_Int_Handler mGuilinLite3IntHandler[];
|
|
|
|
extern UINT8 check_if_DCS_mode(void);
|
|
extern BOOL m_rtc_update_alarm_expire_flag_app;//only for PM803L rtc expired which need be delay for 1S
|
|
|
|
extern PMC_Nvm_File_t *nvmConfig;
|
|
|
|
extern BOOL Termistor_VCC_18V(void);
|
|
extern BOOL Is_LGE_LYRA_Board(void);
|
|
#ifdef QUECTEL_OPEN_CPU
|
|
extern void PMIC_SW_POWERDOWN(void);
|
|
extern void PMIC_SW_RESET(void);
|
|
#endif
|
|
#if (defined(LTEONLY_THIN) || defined(LTEGSM_THIN))
|
|
#define PMIC_DEBUG 0
|
|
#else
|
|
#define PMIC_DEBUG 1
|
|
#endif
|
|
|
|
|
|
#if PMIC_DEBUG
|
|
#define PMIC_UART_DEBUG(fmt,...) uart_printf(fmt, ##__VA_ARGS__)
|
|
#else
|
|
#define PMIC_UART_DEBUG(fmt,...)
|
|
#endif
|
|
|
|
|
|
static Pmic_Int_Handler mPmicIntHandler [PM812_INTC_MAX+1];
|
|
static UINT32 last_pmic_int_status;
|
|
UINT8 power_up_reason;
|
|
UINT8 power_down_reason;
|
|
UINT8 power_down_reason2;
|
|
UINT8 hot_power_flag;
|
|
|
|
extern PMIC_RTC_Setting m_pmic_rtc_setting;
|
|
/**********************************************************************************/
|
|
/****** These structures are use to send/received data by valye only *********/
|
|
#ifdef QUECTEL_PROJECT_CUST
|
|
extern void USB2MgrDeviceUnplug(void);
|
|
#define UART1_TX_PIN_NUM (52)
|
|
static void QUEC_SET_MAINUART_TX_GPIO(void)
|
|
{
|
|
unsigned long pin_mfprReg_data;
|
|
GPIO_PinConfiguration gpio_pin_config;
|
|
pin_mfprReg_data = *((volatile unsigned long *)(GPIO_MFPR_ADDR(UART1_TX_PIN_NUM)));
|
|
pin_mfprReg_data = (pin_mfprReg_data & ~(0x07)); //fun0 is GPIO mode
|
|
pin_mfprReg_data = (pin_mfprReg_data | (GPIO_BIT_PULL_SEL) | (GPIO_BIT_PULLUP)) & ~(GPIO_BIT_PULLDN); //set pull up
|
|
*((volatile unsigned long *)(GPIO_MFPR_ADDR(UART1_TX_PIN_NUM))) = pin_mfprReg_data;
|
|
|
|
GpioSetDirection(UART1_TX_PIN_NUM,0);
|
|
}
|
|
#endif
|
|
|
|
extern void ACIPCDAPLPMRequest(UINT32 request);
|
|
extern INT16 GetPm803VbatAdc(ADC_TEMP_t tempType);
|
|
|
|
void ustica_I2CInit(void)
|
|
{
|
|
*((volatile UINT32 *)0xd401E140) = 0xd0c2|1<<3|1<<9; //PMR_SCL ->CP_TWSI_SCL
|
|
*((volatile UINT32 *)0xd401E144) = 0xd0c2|1<<3|1<<9; //PWR_SDA ->CP_TWSI_SDA
|
|
}
|
|
|
|
void ustica_I2CEnableclockandPin(void)
|
|
{
|
|
// *(volatile unsigned long*)0xD4090104 |= 0x2; //enable PLL1_614 for PWIC I2C
|
|
return;
|
|
}
|
|
|
|
static void ustica_I2CResetUnitDi ( void )
|
|
{
|
|
UINT32 ICRRegValue;
|
|
|
|
// Read the control register
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
|
|
ICRRegValue &= ~I2C_ICR_MASTER_ABORT; // Clear the abort bit
|
|
ICRRegValue &= ~I2C_ICR_START; // Clear the start bit
|
|
ICRRegValue &= ~I2C_ICR_STOP; // Clear the stop bit
|
|
ICRRegValue &= ~I2C_ICR_ACK_NACK_CONTROL; // Clear the ACK bit
|
|
ICRRegValue &= ~I2C_ICR_TRANSFER_BYTE; // Clear the transfer_byte bit
|
|
|
|
|
|
// clear the ICR register
|
|
I2C_REG_WRITE(I2C_ICR_REG, I2C_REG_CLEAR_VALUE);
|
|
|
|
// Set the RESET bit in the ICR rewgister
|
|
I2C_REG_BIT_WRITE(I2C_ICR_REG, I2C_ICR_UNIT_RESET_BIT, SET);
|
|
|
|
// clear the ISR register after reset
|
|
I2C_REG_WRITE(I2C_ISR_REG, I2C_ISR_CLEAR_ALL_INTERRUPTS);
|
|
|
|
// Clear the RESET bit in the ICR rewgister
|
|
I2C_REG_BIT_WRITE(I2C_ICR_REG, I2C_ICR_UNIT_RESET_BIT, CLEAR);
|
|
|
|
// Restore the ICR register
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue);
|
|
|
|
}
|
|
|
|
|
|
void ustica_I2CConfigureDi( void )
|
|
{
|
|
UINT32 controlRegValue = I2C_ICR_REG_INIT_VALUE;
|
|
|
|
|
|
|
|
// reset the I2C unit
|
|
ustica_I2CResetUnitDi();
|
|
|
|
I2C_REG_WRITE(I2C_ILCR_REG, 0x082C469F); //~400K
|
|
I2C_REG_WRITE(I2C_IWCR_REG, 0x142A);
|
|
controlRegValue |= FAST_MODE_ENABLE;
|
|
|
|
I2C_REG_WRITE(I2C_ICR_REG, controlRegValue);
|
|
|
|
I2C_REG_WRITE(I2C_ISAR_REG, I2C_OWN_SLAVE_ADDRESS);
|
|
|
|
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* Function: i2cWaitStatusDirect
|
|
*************************************************************************
|
|
* Description: - waits for specific status register value
|
|
* - time is limited
|
|
* - breaks when _error_was_detected indicates error detected by interrupt
|
|
* - breaks when _arbitration_loss_was_detected indicates error detected by interrupt
|
|
*
|
|
* Parameters: bitsSet contains '1' where 1 is expected
|
|
* bitsCleared contains '1' where 0 is expected
|
|
* Return value: I2C_RC_OK if got it or error code otherwise
|
|
*
|
|
* Notes:
|
|
************************************************************************/
|
|
static I2C_ReturnCode ustica_i2cWaitStatusDirect ( UINT32 bitsSet , UINT32 bitsCleared )
|
|
{
|
|
|
|
|
|
UINT32 statusRegValue;
|
|
UINT32 countLimit = LOOP_COUNTER_LIMIT;
|
|
UINT32 mask = bitsSet|bitsCleared; // all bits we care of
|
|
UINT32 value = bitsSet;
|
|
|
|
do
|
|
{
|
|
I2C_REG_READ(I2C_ISR_REG,statusRegValue);
|
|
countLimit--;
|
|
}
|
|
while ( (( statusRegValue & mask ) != value ) &&
|
|
(!( I2C_REG_BIT_READ(statusRegValue, I2C_ISR_BUS_ERROR_DETECTED_BIT) ) &&
|
|
(countLimit > 0) &&
|
|
(!( I2C_REG_BIT_READ(statusRegValue, I2C_ISR_ARBITRATION_LOSS_DETECTED_BIT) )) ));
|
|
|
|
if ( I2C_REG_BIT_READ(statusRegValue, I2C_ISR_ARBITRATION_LOSS_DETECTED_BIT) )
|
|
return I2C_ISR_ARBITRATION_LOSS;
|
|
|
|
// check for timeout, reset the I2C device for next operations and return error if needed
|
|
if ( countLimit == 0 )
|
|
{
|
|
UINT32 ICRRegValue = 0;
|
|
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
ICRRegValue |= I2C_ICR_MASTER_ABORT;
|
|
ICRRegValue &= ~I2C_ICR_TRANSFER_BYTE;
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue );
|
|
return I2C_RC_TIMEOUT_ERROR;
|
|
}
|
|
else
|
|
if ( ( I2C_REG_BIT_READ(statusRegValue, I2C_ISR_BUS_ERROR_DETECTED_BIT) ))
|
|
return I2C_ISR_BUS_ERROR;
|
|
|
|
return I2C_RC_OK;
|
|
}
|
|
|
|
/************************************************************************
|
|
* Function: masterSendDirect
|
|
*************************************************************************
|
|
* Description: This function is used to write data to I2C slaves in the
|
|
* boot stage only while the OS system and INTC are not up.
|
|
*
|
|
* Parameters:
|
|
*
|
|
* Return value:
|
|
*
|
|
* Notes:
|
|
************************************************************************/
|
|
static I2C_ReturnCode ustica_masterSendDirect(UINT8 *data, UINT16 dataSize, UINT8 slaveAddress, BOOL repeatedStart , BOOL MasterReceiveCalled )
|
|
{
|
|
UINT32 ICRRegValue = 0;
|
|
int i;
|
|
I2C_ReturnCode I2CReturnCode = I2C_RC_OK;
|
|
|
|
|
|
|
|
/* Check the bus for free - If there is an arbitration loss, stay until it become free */
|
|
do
|
|
{
|
|
// check if 'Arbitration Loss' was detected
|
|
if ( I2CReturnCode == I2C_ISR_ARBITRATION_LOSS )
|
|
{
|
|
I2C_STATUS_REG_CLEAR_BIT(I2C_ISR_ARBITRATION_LOSS_DETECTED_BIT);
|
|
|
|
|
|
// Read the control register
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
|
|
ICRRegValue &= ~I2C_ICR_START; // Clear the start bit
|
|
ICRRegValue &= ~I2C_ICR_TRANSFER_BYTE; // Clear the transfer_byte bit
|
|
|
|
// Write to the ICR register
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue);
|
|
|
|
for ( i = 0; i < 50000; i++ ); /* A little delay to enable others master to finish without interruption */
|
|
/* the bus arbiter, and reduce the arbitration sequences */
|
|
}
|
|
|
|
// write IDBR register: target slave address and R/W# bit=0 for write transaction.
|
|
I2C_REG_WRITE(I2C_IDBR_REG, I2C_SLAVE_WRITE(slaveAddress) );
|
|
|
|
// write ICR register: set START bit, clear STOP bit, set Transfer Byte bit to initiate the access
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
ICRRegValue &= ~I2C_ICR_STOP;
|
|
ICRRegValue |= (I2C_ICR_START | I2C_ICR_TRANSFER_BYTE);
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue );
|
|
|
|
I2CReturnCode = ustica_i2cWaitStatusDirect ( (I2C_REG_BIT(I2C_ISR_IDBR_TRANSMIT_EMPTY_BIT) | I2C_REG_BIT(I2C_ISR_UNIT_BUSY_BIT)),
|
|
I2C_REG_BIT(I2C_ISR_READ_WRITE_MODE_BIT) );
|
|
|
|
// clear 'IDBR Transmit Empty' bit (write '1')
|
|
I2C_STATUS_REG_CLEAR_BIT(I2C_ISR_IDBR_TRANSMIT_EMPTY_BIT);
|
|
|
|
if ( ( I2CReturnCode != I2C_ISR_ARBITRATION_LOSS ) && ( I2CReturnCode != I2C_RC_OK ))
|
|
{
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
ICRRegValue &= 0xfff0;
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue );
|
|
|
|
return I2CReturnCode;
|
|
}
|
|
}
|
|
// check if 'Arbitration Loss' was detected
|
|
while ( I2CReturnCode == I2C_ISR_ARBITRATION_LOSS );
|
|
|
|
// write ICR register: clear START bit, clear STOP bit
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
ICRRegValue &= ~I2C_ICR_STOP;
|
|
ICRRegValue &= ~I2C_ICR_START;
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue );
|
|
|
|
/*** Send data bytes - all, except the last byte ***/
|
|
for ( i = 0; i < ( dataSize - 1 ); i++ )
|
|
{
|
|
// write data byte to the IDBR register
|
|
I2C_REG_WRITE(I2C_IDBR_REG, *data);
|
|
data++;
|
|
|
|
// Set 'Tranfer Byte' bit to intiate the access
|
|
I2C_REG_BIT_WRITE(I2C_ICR_REG, I2C_ICR_TRANSFER_BYTE_BIT, SET);
|
|
|
|
if((I2CReturnCode = ustica_i2cWaitStatusDirect(I2C_REG_BIT(I2C_ISR_IDBR_TRANSMIT_EMPTY_BIT)|I2C_REG_BIT(I2C_ISR_UNIT_BUSY_BIT),
|
|
I2C_REG_BIT(I2C_ISR_READ_WRITE_MODE_BIT))) != I2C_RC_OK)
|
|
return I2CReturnCode;
|
|
|
|
// clear 'IDBR Transmit Empty' bit (write '1')
|
|
I2C_STATUS_REG_CLEAR_BIT(I2C_ISR_IDBR_TRANSMIT_EMPTY_BIT);
|
|
}
|
|
|
|
|
|
/*** Send the last byte with STOP bit ***/
|
|
|
|
// write the last data byte to the IDBR register
|
|
I2C_REG_WRITE(I2C_IDBR_REG, *data);
|
|
|
|
// write ICR: clear START bit
|
|
I2C_REG_BIT_WRITE(I2C_ICR_REG, I2C_ICR_START_BIT, CLEAR);
|
|
|
|
if (( repeatedStart == FALSE ) || ( MasterReceiveCalled == FALSE ))
|
|
I2C_REG_BIT_WRITE(I2C_ICR_REG, I2C_ICR_STOP_BIT, SET);
|
|
|
|
I2C_REG_BIT_WRITE(I2C_ICR_REG, I2C_ICR_TRANSFER_BYTE_BIT, SET);
|
|
|
|
// if (repeatedStart)
|
|
// {
|
|
// if ((I2CReturnCode = i2cWaitStatusDirect (I2C_REG_BIT(I2C_ISR_IDBR_TRANSMIT_EMPTY_BIT)|I2C_REG_BIT(I2C_ISR_UNIT_BUSY_BIT),
|
|
// I2C_REG_BIT(I2C_ISR_READ_WRITE_MODE_BIT)))!=I2C_RC_OK)
|
|
// return I2CReturnCode;
|
|
// }
|
|
// else
|
|
if ((I2CReturnCode = ustica_i2cWaitStatusDirect (I2C_REG_BIT(I2C_ISR_IDBR_TRANSMIT_EMPTY_BIT),
|
|
I2C_REG_BIT(I2C_ISR_READ_WRITE_MODE_BIT)))!=I2C_RC_OK)
|
|
return I2CReturnCode;
|
|
|
|
// clear 'IDBR Transmit Empty' bit (write '1')
|
|
I2C_STATUS_REG_CLEAR_BIT(I2C_ISR_IDBR_TRANSMIT_EMPTY_BIT);
|
|
I2C_REG_BIT_WRITE(I2C_ICR_REG, I2C_ICR_STOP_BIT, CLEAR);
|
|
|
|
return I2C_RC_OK;
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* Function: I2CBusStateGetDirect
|
|
*************************************************************************
|
|
* Description: This function is used to read the I2C Bus Monitor
|
|
* Register - IBMR.
|
|
*
|
|
* Parameters:
|
|
*
|
|
* Return value:
|
|
*
|
|
* Notes:
|
|
************************************************************************/
|
|
|
|
/************************************************************************
|
|
* Function: I2CMasterSendDataDirect
|
|
*************************************************************************
|
|
* Description: This function is used to write data to I2C slaves in the
|
|
* boot stage only while the OS system and INTC are not up.
|
|
*
|
|
* Parameters:
|
|
*
|
|
* Return value:
|
|
*
|
|
* Notes:
|
|
************************************************************************/
|
|
I2C_ReturnCode ustica_I2CMasterSendDataDirect( UINT8 *data , UINT16 dataSize , UINT8 slaveAddress , BOOL protected , UINT16 userId )
|
|
{
|
|
UINT32 XCGR_val;
|
|
I2C_ReturnCode I2CReturnCode;
|
|
BOOL chipBusy;
|
|
|
|
#if 0
|
|
return I2C_RC_OK; //qianying, for FPGA ONLY
|
|
|
|
#ifndef EDEN_1928
|
|
XCGR_val = *PMU_XCGR_READ;
|
|
*I2C_FUN_CLK_ADD = XCGR_val | PMU_XCGR_EN_I2C_FUN_CLK; //
|
|
if(AC_IS_CPONLY)
|
|
{
|
|
*I2C_APB_CLK_ADD = I2C_APB_CLK_ENABLE; //1920 // I2c APB Clock ;I2c Functional Clock
|
|
}
|
|
#endif
|
|
#endif
|
|
CHECK_IF_CHIP_BUSY(chipBusy);
|
|
if ( chipBusy == TRUE )
|
|
return I2C_RC_CHIP_BUSY;
|
|
|
|
I2CReturnCode = ustica_masterSendDirect(data, dataSize, slaveAddress, _repeat_start , FALSE);
|
|
#if 0
|
|
#ifndef EDEN_1928
|
|
if(!AC_IS_SHM)
|
|
{
|
|
//clock off
|
|
XCGR_val = *PMU_XCGR_READ;
|
|
*I2C_FUN_CLK_ADD = XCGR_val &(~PMU_XCGR_EN_I2C_FUN_CLK); //
|
|
if(AC_IS_CPONLY)
|
|
{
|
|
XCGR_val = *I2C_APB_CLK_ADD;//1920
|
|
*I2C_APB_CLK_ADD = XCGR_val & (~I2C_APB_CLK_ENABLE); // I2c APB Clock ;I2c Functional Clock
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
return I2CReturnCode;
|
|
}
|
|
/************************************************************************/
|
|
/************************************************************************/
|
|
static UINT16 ustica_I2CIntLISRDirect ( void )
|
|
{
|
|
UINT32 statusRegValue , ICRRegValue = 0;
|
|
|
|
|
|
|
|
//check interrupt source
|
|
I2C_REG_READ(I2C_ISR_REG,statusRegValue);
|
|
|
|
if ( I2C_REG_BIT_READ(statusRegValue, I2C_ISR_IDBR_RECEIVE_FULL_BIT) )
|
|
{
|
|
// clear 'IDBR Receive Full' bit (write '1')
|
|
I2C_STATUS_REG_CLEAR_BIT(I2C_ISR_IDBR_RECEIVE_FULL_BIT);
|
|
{
|
|
|
|
// read the received byte
|
|
I2C_REG_READ(I2C_IDBR_REG,*_receiveReqParams.RxBufferPtr);
|
|
_receiveReqParams.RxBufferPtr++;
|
|
_receiveReqParams.dataSize--;
|
|
|
|
// write ICR: clear STOP bit(1), clear ACK/NACK bit(2)
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
ICRRegValue &= ~I2C_ICR_STOP;
|
|
ICRRegValue &= ~I2C_ICR_ACK_NACK_CONTROL;
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue );
|
|
|
|
|
|
if ( _receiveReqParams.dataSize > 1 )
|
|
{
|
|
// write ICR: clear START bit, clear STOP bit, send ACK bit (0 for ACK),
|
|
// set Transfer Byte bit to initiate the access
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
ICRRegValue &= ~I2C_ICR_START;
|
|
ICRRegValue &= ~I2C_ICR_STOP;
|
|
ICRRegValue &= ~I2C_ICR_ACK_NACK_CONTROL;
|
|
ICRRegValue |= I2C_ICR_TRANSFER_BYTE;
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue );
|
|
}
|
|
else if ( _receiveReqParams.dataSize == 1 ) //last byte remaing to read (with STOP signal)
|
|
{
|
|
// write ICR: clear START bit, set STOP bit, send NACK bit (1 for NACK),
|
|
// set Transfer Byte bit to initiate the access
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
ICRRegValue &= ~I2C_ICR_START;
|
|
ICRRegValue |= (I2C_ICR_STOP | I2C_ICR_ACK_NACK_CONTROL | I2C_ICR_TRANSFER_BYTE);
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue );
|
|
}
|
|
else
|
|
{
|
|
// disable 'IDBR Buffer Full' interrupt
|
|
I2C_REG_BIT_WRITE(I2C_ICR_REG, I2C_ICR_IDBR_RECEIVE_FULL_INT_ENABLE_BIT, CLEAR);
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( I2C_REG_BIT_READ(statusRegValue, I2C_ISR_BUS_ERROR_DETECTED_BIT) )
|
|
{
|
|
// clear 'Bus Error Detected' bit (write '1')
|
|
I2C_STATUS_REG_CLEAR_BIT(I2C_ISR_BUS_ERROR_DETECTED_BIT);
|
|
|
|
}
|
|
|
|
if ( statusRegValue & I2C_ISR_UNEXPECTED_INTERRUPTS )
|
|
{
|
|
// clear 'I2C_ISR_UNEXPECTED_INTERRUPTS ' bits (write '1')
|
|
I2C_REG_WRITE(I2C_ISR_REG,I2C_ISR_UNEXPECTED_INTERRUPTS);
|
|
|
|
}
|
|
|
|
return _receiveReqParams.dataSize;
|
|
|
|
}
|
|
/************************************************************************
|
|
* Function: I2CMasterReceiveDataDirect
|
|
*************************************************************************
|
|
* Description: This function is used to read data from I2C slaves in the
|
|
* boot stage only while the OS system and INTC are not up.
|
|
*
|
|
* Parameters:
|
|
*
|
|
* Return value:
|
|
*
|
|
* Notes:
|
|
************************************************************************/
|
|
I2C_ReturnCode ustica_I2CMasterReceiveDataDirect ( UINT8 *cmd,
|
|
UINT16 cmdLength,
|
|
UINT8 writeSlaveAddress,
|
|
BOOL protected,
|
|
UINT8 *designatedRxBufferPtr,
|
|
UINT16 dataSize,
|
|
UINT8 readSlaveAddress )
|
|
{
|
|
UINT32 XCGR_val;
|
|
I2C_ReturnCode I2CReturnCode;
|
|
UINT32 ICRRegValue = 0;
|
|
BOOL chipBusy;
|
|
int result;
|
|
UINT32 countLimit = LOOP_COUNTER_LIMIT;
|
|
// store the request parameters (to be used from the ISR and by the I2C task when error)
|
|
_receiveReqParams.RxBufferPtr = designatedRxBufferPtr;
|
|
_receiveReqParams.dataSize = dataSize;
|
|
|
|
#if 0
|
|
return I2C_RC_OK; //qianying, for FPGA ONLY
|
|
|
|
if ( dataSize == 0 )
|
|
return I2C_RC_INVALID_DATA_SIZE;
|
|
#ifndef EDEN_1928
|
|
|
|
XCGR_val = *PMU_XCGR_READ;
|
|
*I2C_FUN_CLK_ADD = XCGR_val | PMU_XCGR_EN_I2C_FUN_CLK; // I2c Functional Clock
|
|
if(AC_IS_CPONLY)
|
|
{
|
|
*I2C_APB_CLK_ADD = I2C_APB_CLK_ENABLE; //1920 // I2c APB Clock
|
|
}
|
|
#endif
|
|
#endif
|
|
CHECK_IF_CHIP_BUSY(chipBusy);
|
|
if(chipBusy)
|
|
return I2C_RC_CHIP_BUSY;
|
|
|
|
if ( (cmdLength != 0) && (cmd != NULL) ) /* if command is associated with the received request */
|
|
{
|
|
I2CReturnCode = ustica_masterSendDirect(cmd, cmdLength, writeSlaveAddress, _repeat_start, TRUE);
|
|
|
|
if( I2CReturnCode != I2C_RC_OK )
|
|
return I2CReturnCode;
|
|
}
|
|
|
|
/*** send Read Request ***/
|
|
// write IDBR: target slave address and R/W# bit (1 for read)
|
|
I2C_REG_WRITE(I2C_IDBR_REG, I2C_SLAVE_READ(readSlaveAddress) );
|
|
|
|
// write ICR: set START bit, clear STOP bit, set Transfer Byte bit to initiate the access
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
ICRRegValue &= ~I2C_ICR_STOP;
|
|
ICRRegValue |= (I2C_ICR_START | I2C_ICR_TRANSFER_BYTE);
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue );
|
|
|
|
I2CReturnCode = ustica_i2cWaitStatusDirect(I2C_REG_BIT(I2C_ISR_IDBR_TRANSMIT_EMPTY_BIT)|I2C_REG_BIT(I2C_ISR_UNIT_BUSY_BIT)|I2C_REG_BIT(I2C_ISR_READ_WRITE_MODE_BIT), 0 );
|
|
|
|
// clear 'IDBR Transmit Empty' bit (write '1')
|
|
I2C_STATUS_REG_CLEAR_BIT(I2C_ISR_IDBR_TRANSMIT_EMPTY_BIT);
|
|
|
|
if ( I2CReturnCode != I2C_RC_OK )
|
|
return I2CReturnCode;
|
|
|
|
|
|
// Initiate the read process:
|
|
|
|
if ( dataSize == 1 ) // only one byte to read
|
|
{
|
|
// write ICR: set STOP bit, set ACK/NACK bit (1 for NACK)
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
ICRRegValue &= ~I2C_ICR_START;
|
|
ICRRegValue |= (I2C_ICR_STOP | I2C_ICR_ACK_NACK_CONTROL);
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue );
|
|
}
|
|
else // more than one byte to read
|
|
{
|
|
// write ICR: clear STOP bit, clear ACK/NACK bit (0 for ACK)
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
ICRRegValue &= ~I2C_ICR_STOP;
|
|
ICRRegValue &= ~I2C_ICR_ACK_NACK_CONTROL;
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue );
|
|
}
|
|
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
ICRRegValue &= ~I2C_ICR_START;
|
|
ICRRegValue |= I2C_ICR_TRANSFER_BYTE;
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue );
|
|
|
|
while ( ustica_I2CIntLISRDirect() )
|
|
{
|
|
countLimit--;
|
|
}
|
|
|
|
if(countLimit ==0)
|
|
{
|
|
UINT32 ICRRegValue = 0;
|
|
PMIC_UART_DEBUG("I2Ctimeout,reg=0x%x,slaveAddr=0x%x.\r\n",*cmd,writeSlaveAddress);
|
|
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
ICRRegValue |= I2C_ICR_MASTER_ABORT;
|
|
ICRRegValue &= ~I2C_ICR_TRANSFER_BYTE;
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue );
|
|
return I2C_RC_TIMEOUT_ERROR;
|
|
}
|
|
|
|
return I2C_RC_OK;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* Function: I2CRecordDeviceStatus
|
|
*
|
|
* Descrioption
|
|
* The function record I2C device status.
|
|
*
|
|
* Parameters:
|
|
* Inputs :
|
|
* error: The I2C device status.
|
|
* slaveAddress: The slave address of device.
|
|
* Outputs:
|
|
* N/A.
|
|
*
|
|
* Returns:
|
|
* N/A.
|
|
*
|
|
* Notes:
|
|
* N/A.
|
|
**************************************************************************/
|
|
BOOL I2CRecordDeviceStatus(UINT32 SlaveAddress, BOOL error)
|
|
{
|
|
UINT8 i = 0;
|
|
UINT32 cpsr = 0;
|
|
BOOL status = FALSE;
|
|
|
|
/*---------------------------------------------------------------------*/
|
|
for ( i = 0; i < I2C_STATUS_ARRAY_SIZE; i++ )
|
|
{
|
|
cpsr = disableInterrupts();
|
|
|
|
if ( I2C_RECORD_FLAG != I2CStatusArray[i].RecordFlag )
|
|
{
|
|
I2CStatusArray[i].RecordFlag = I2C_RECORD_FLAG;
|
|
I2CStatusArray[i].BaseAddress = I2C_REGISTER_BASE_ADDR;
|
|
I2CStatusArray[i].SlaveAddress = SlaveAddress;
|
|
|
|
if(error)
|
|
{
|
|
I2CStatusArray[i].DeviceStatus = I2C_DEVICE_ERROR;
|
|
}
|
|
else
|
|
{
|
|
I2CStatusArray[i].DeviceStatus = 0;
|
|
}
|
|
|
|
status = TRUE;
|
|
}
|
|
|
|
restoreInterrupts(cpsr);
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* Function: I2CDeviceCheckStatus
|
|
*
|
|
* Descrioption
|
|
* The function check the I2C device status.
|
|
*
|
|
* Parameters:
|
|
* Inputs :
|
|
* slaveAddress: The slave address of decice.
|
|
* Outputs:
|
|
* N/A.
|
|
*
|
|
* Returns:
|
|
* N/A.
|
|
*
|
|
* Notes:
|
|
* N/A.
|
|
**************************************************************************/
|
|
BOOL I2CDeviceCheckStatus(UINT32 SlaveAddress)
|
|
{
|
|
UINT8 i = 0;
|
|
UINT32 cpsr = 0;
|
|
BOOL status = TRUE;
|
|
|
|
/*---------------------------------------------------------------------*/
|
|
|
|
for ( i = 0; i < I2C_STATUS_ARRAY_SIZE; i++ )
|
|
{
|
|
cpsr = disableInterrupts();
|
|
|
|
if (( I2CStatusArray[i].BaseAddress == I2C_REGISTER_BASE_ADDR )&&
|
|
( I2CStatusArray[i].SlaveAddress == SlaveAddress )&&
|
|
( I2CStatusArray[i].RecordFlag == I2C_RECORD_FLAG )&&
|
|
( I2CStatusArray[i].DeviceStatus == I2C_DEVICE_ERROR))
|
|
{
|
|
status = FALSE;
|
|
}
|
|
|
|
restoreInterrupts(cpsr);
|
|
}
|
|
|
|
return status;
|
|
} /* End at_client_get_callback_function() */
|
|
|
|
/*************************************************************************
|
|
* Function: MastI2CSend
|
|
*
|
|
* Descrioption
|
|
* The i2c reading with not re-entery.
|
|
*
|
|
* Parameters:
|
|
* Inputs :
|
|
* I2CAddr : The address of device register.
|
|
* slaveAddress : The slave address of decice.
|
|
* Outputs:
|
|
* N/A.
|
|
*
|
|
* Returns:
|
|
* RegData : The data of reading from device register.
|
|
*
|
|
* Notes:
|
|
* N/A.
|
|
**************************************************************************/
|
|
static I2C_ReturnCode MastI2CSend(UINT8 Slave_addr, UINT8 RegAddr, UINT8 RegData )
|
|
{
|
|
UINT16 read_times = 0;
|
|
UINT32 i = 0;
|
|
volatile UINT32 ICRRegValue = 0;
|
|
UINT8 param_data[3] = {0};
|
|
I2C_ReturnCode status = I2C_RC_NOT_OK;
|
|
|
|
param_data[0] = RegAddr;
|
|
param_data[1] = RegData;
|
|
param_data[2] = 0;
|
|
|
|
status = ustica_I2CMasterSendDataDirect(param_data , 2 , Slave_addr , FALSE, 0 );
|
|
|
|
read_times = 0;
|
|
while ( status != I2C_RC_OK )
|
|
{
|
|
read_times ++;
|
|
if (read_times >= 3)
|
|
{
|
|
PMIC_UART_DEBUG("Send: reset I2Cbus\r\n");
|
|
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
ICRRegValue |= I2C_ICR_BUS_RESET;
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue );
|
|
|
|
do
|
|
{
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
}while (ICRRegValue & I2C_ICR_BUS_RESET);
|
|
|
|
PMIC_UART_DEBUG("Send: reset I2Cbus ends\r\n");
|
|
}
|
|
usticaInit();
|
|
|
|
for( i = 0; i < 0x10000; i++ ); /* Short delay. */
|
|
|
|
status = ustica_I2CMasterSendDataDirect(param_data , 2 , Slave_addr , FALSE, 0 );
|
|
|
|
if( read_times >= 6 )
|
|
{
|
|
PMIC_UART_DEBUG("\r\nMastI2CSend: 0x%x, Slave_addr = 0x%x, I2CRegAddr = 0x%x, RegData = 0x%x.\r\n",status, Slave_addr, RegAddr, RegData);
|
|
#if PMIC_DEBUG
|
|
DIAG_FILTER(HAL, PI2C, MastI2CSend1, DIAG_INFORMATION)
|
|
diagPrintf("MastI2CSend: 0x%x, Slave_addr = 0x%x, I2CRegAddr = 0x%x, RegData = 0x%x.", status, Slave_addr, RegAddr, RegData);
|
|
#endif
|
|
break;
|
|
}
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* Function: I2CMastReceive
|
|
*
|
|
* Descrioption
|
|
* The i2c reading with not re-entery.
|
|
*
|
|
* Parameters:
|
|
* Inputs :
|
|
* I2CAddr : The address of device register.
|
|
* slaveAddress : The slave address of decice.
|
|
* Outputs:
|
|
* N/A.
|
|
*
|
|
* Returns:
|
|
* RegData : The data of reading from device register.
|
|
*
|
|
* Notes:
|
|
* N/A.
|
|
**************************************************************************/
|
|
static UINT8 MastI2CReceive(UINT8 Slave_addr, UINT8 I2CRegAddr)
|
|
{
|
|
UINT32 i = 0;
|
|
volatile UINT32 ICRRegValue = 0;
|
|
UINT16 read_times = 0;
|
|
UINT8 I2CRegData = 0;
|
|
I2C_ReturnCode status = I2C_RC_NOT_OK;
|
|
|
|
Slave_addr &=0xFE;
|
|
status = ustica_I2CMasterReceiveDataDirect( &I2CRegAddr,
|
|
1 /*cmd lenght*/,
|
|
Slave_addr,
|
|
FALSE /*not protected*/,
|
|
&I2CRegData,
|
|
0x1,
|
|
(Slave_addr|0x1));
|
|
|
|
read_times = 0;
|
|
while ( status != I2C_RC_OK )
|
|
{
|
|
read_times ++;
|
|
if (read_times >= 3)
|
|
{
|
|
PMIC_UART_DEBUG("Rcv: reset I2Cbus\r\n");
|
|
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
ICRRegValue |= I2C_ICR_BUS_RESET;
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue );
|
|
|
|
do
|
|
{
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
}while (ICRRegValue & I2C_ICR_BUS_RESET);
|
|
|
|
PMIC_UART_DEBUG("Rcv: reset I2Cbus ends\r\n");
|
|
}
|
|
usticaInit();
|
|
|
|
for(i=0;i<0x10000;i++);
|
|
status = ustica_I2CMasterReceiveDataDirect( &I2CRegAddr,
|
|
1 /*cmd lenght*/,
|
|
Slave_addr,
|
|
FALSE /*not protected*/,
|
|
&I2CRegData,
|
|
0x1,
|
|
(Slave_addr|0x1));
|
|
if( read_times >= 6 )
|
|
{
|
|
PMIC_UART_DEBUG("\r\nMastI2CReceive: 0x%x, Slave_addr = 0x%x, I2CRegAddr = 0x%x.\r\n",status, Slave_addr, I2CRegAddr);
|
|
#if PMIC_DEBUG
|
|
DIAG_FILTER(HAL, PI2C, MastI2CReceive1, DIAG_INFORMATION)
|
|
diagPrintf("MastI2CReceive: 0x%x, Slave_addr = 0x%x, I2CRegAddr = 0x%x.", status, Slave_addr, I2CRegAddr);
|
|
#endif
|
|
break;
|
|
}
|
|
}
|
|
|
|
return I2CRegData;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* Function: I2CSend
|
|
*
|
|
* Descrioption
|
|
* The i2c writting with re-entery.
|
|
*
|
|
* Parameters:
|
|
* Inputs :
|
|
* RegAddr : The address of device register.
|
|
* RegData : The data of writing into device register.
|
|
* slaveAddress : The slave address of decice.
|
|
* Outputs:
|
|
* N/A.
|
|
*
|
|
* Returns:
|
|
* N/A.
|
|
*
|
|
* Notes:
|
|
* N/A.
|
|
**************************************************************************/
|
|
I2C_ReturnCode I2CSend( UINT8 Slave_addr, UINT8 RegAddr, UINT8 RegData )
|
|
{
|
|
I2C_ReturnCode res = I2C_RC_OK;
|
|
OSA_STATUS osaStatus = OS_SUCCESS;
|
|
|
|
if((OS_Current_Interrupt_Count() != 0)||
|
|
CurrentThreadIsHISR())
|
|
{
|
|
/* Lisr Or hisr */
|
|
res = MastI2CSend(Slave_addr, RegAddr,RegData);
|
|
}
|
|
else
|
|
{
|
|
/* task */
|
|
osaStatus = OSASemaphoreAcquire(I2CApp_SemaRef, OS_SUSPEND);
|
|
ASSERT(osaStatus == OS_SUCCESS);
|
|
|
|
res = MastI2CSend(Slave_addr, RegAddr,RegData);
|
|
|
|
osaStatus = OSASemaphoreRelease(I2CApp_SemaRef);
|
|
ASSERT(osaStatus == OS_SUCCESS);
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
* Function: I2CReceive
|
|
*
|
|
* Descrioption
|
|
* The i2c reading with re-entery.
|
|
*
|
|
* Parameters:
|
|
* Inputs :
|
|
* I2CAddr : The address of device register.
|
|
* slaveAddress : The slave address of decice.
|
|
* Outputs:
|
|
* N/A.
|
|
*
|
|
* Returns:
|
|
* RegData : The data of reading from device register.
|
|
*
|
|
* Notes:
|
|
* N/A.
|
|
**************************************************************************/
|
|
UINT8 I2CReceive( UINT8 Slave_addr, UINT8 I2CRegAddr )
|
|
{
|
|
UINT8 res = 0;
|
|
OSA_STATUS osaStatus = OS_SUCCESS;
|
|
|
|
if((OS_Current_Interrupt_Count() != 0)||
|
|
CurrentThreadIsHISR())
|
|
{
|
|
/* LISR or Hisr */
|
|
res = MastI2CReceive( Slave_addr, I2CRegAddr);
|
|
}
|
|
else
|
|
{
|
|
/* Task */
|
|
osaStatus = OSASemaphoreAcquire(I2CApp_SemaRef, OS_SUSPEND);
|
|
ASSERT(osaStatus == OS_SUCCESS);
|
|
|
|
res = MastI2CReceive( Slave_addr, I2CRegAddr );
|
|
|
|
osaStatus = OSASemaphoreRelease(I2CApp_SemaRef);
|
|
ASSERT(osaStatus == OS_SUCCESS);
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
void USTICAI2CWriteDi_base(unsigned char I2CRegAddr, unsigned char I2CRegData)
|
|
{
|
|
I2CSend(PMC_I2C_WRITE_BASE_SLAVE_ADDRESS, I2CRegAddr, I2CRegData);
|
|
}
|
|
unsigned char USTICAI2CReadDi_base(unsigned char I2CRegAddr)
|
|
{
|
|
return I2CReceive(PMC_I2C_WRITE_BASE_SLAVE_ADDRESS, I2CRegAddr);
|
|
}
|
|
|
|
void USTICAI2CWriteDi_power(unsigned char I2CRegAddr, unsigned char I2CRegData)
|
|
{
|
|
I2CSend(PMC_I2C_WRITE_POWER_SLAVE_ADDRESS, I2CRegAddr, I2CRegData);
|
|
}
|
|
unsigned char USTICAI2CReadDi_power(unsigned char I2CRegAddr)
|
|
{
|
|
return I2CReceive(PMC_I2C_WRITE_POWER_SLAVE_ADDRESS, I2CRegAddr);
|
|
}
|
|
|
|
void USTICAI2CWriteDi_GPADC(unsigned char I2CRegAddr, unsigned char I2CRegData)
|
|
{
|
|
I2CSend(PMC_I2C_WRITE_GPADC_SLAVE_ADDRESS, I2CRegAddr, I2CRegData);
|
|
}
|
|
unsigned char USTICAI2CReadDi_GPADC(unsigned char I2CRegAddr)
|
|
{
|
|
return I2CReceive(PMC_I2C_WRITE_GPADC_SLAVE_ADDRESS, I2CRegAddr);
|
|
}
|
|
|
|
void USTICAI2CWriteDi_TEST(unsigned char I2CRegAddr, unsigned char I2CRegData)
|
|
{
|
|
I2CSend(PMC_I2C_WRITE_TEST_SLAVE_ADDRESS, I2CRegAddr, I2CRegData);
|
|
}
|
|
|
|
unsigned char USTICAI2CReadDi_TEST(unsigned char I2CRegAddr)
|
|
{
|
|
return I2CReceive(PMC_I2C_READ_TEST_SLAVE_ADDRESS, I2CRegAddr);
|
|
}
|
|
|
|
void USTICAI2CWriteDi_AUDIO(unsigned char I2CRegAddr, unsigned char I2CRegData)
|
|
{
|
|
I2CSend(PMC_I2C_WRITE_AUDIO_SLAVE_ADDRESS, I2CRegAddr, I2CRegData);
|
|
}
|
|
unsigned char USTICAI2CReadDi_AUDIO(unsigned char I2CRegAddr)
|
|
{
|
|
return I2CReceive(PMC_I2C_WRITE_AUDIO_SLAVE_ADDRESS, I2CRegAddr);
|
|
}
|
|
|
|
void set_hp1n2(unsigned char enable)
|
|
{
|
|
volatile unsigned char regval;
|
|
|
|
regval = USTICAI2CReadDi_power(0xE2);
|
|
regval &= ~(0x3<<4);
|
|
regval |= (0x1<<4);
|
|
USTICAI2CWriteDi_power(0xE2, regval);
|
|
|
|
regval = USTICAI2CReadDi_AUDIO(0x01);
|
|
if(enable)
|
|
regval |= 0x1;
|
|
else
|
|
regval &= ~0x1;
|
|
USTICAI2CWriteDi_AUDIO(0x01, regval);
|
|
|
|
regval = USTICAI2CReadDi_AUDIO(0x26);
|
|
if(enable)
|
|
regval |= ((0x1 << 3) | (0x1 << 0));
|
|
else
|
|
regval &= ~((0x1 << 3) | (0x1 << 0));
|
|
USTICAI2CWriteDi_AUDIO(0x26, regval);
|
|
|
|
}
|
|
|
|
void ustica_vbuck1_0_set(unsigned long value)
|
|
{
|
|
PMIC_UART_DEBUG("ustica_vbuck1_0_set\r\n");
|
|
USTICAI2CWriteDi_power(USTICA_VBUCK_1_SET_0_REG,value);
|
|
}
|
|
#ifdef LWIP_IPNETBUF_SUPPORT
|
|
extern void _usb_dci_vusb20_stop_transter(void);
|
|
#endif
|
|
|
|
volatile UINT32 USBphyRegOn = 0;
|
|
void ustica_USB_shutdown(void)
|
|
{
|
|
volatile unsigned long regval;
|
|
|
|
//uart_printf("ustica_USB_shutdown\r\n");
|
|
USBphyRegOn = *(volatile unsigned long *)0xD428285C;
|
|
regval = *(volatile unsigned long *)0xD428285C;
|
|
//regval &= ~((0x1<<5)|(0x1<<0));
|
|
//regval |= ((0x1<<4)|(0x1<<1));
|
|
regval &= ~(0x1<<3);
|
|
*(volatile unsigned long *)0xD428285C = regval;
|
|
|
|
|
|
}
|
|
extern volatile UINT32 usb_shutdown;
|
|
|
|
void ustica_USB_turnOn(void)
|
|
{
|
|
|
|
//uart_printf("ustica_USB_turnOn\r\n");
|
|
if(USBphyRegOn != 0)
|
|
*(volatile unsigned long *)0xD428285C = USBphyRegOn;
|
|
usb_shutdown = 0;
|
|
}
|
|
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
|
|
extern void craneCommPMPowerupUsbPhy(void);
|
|
// ningBoUsbConnectCheck() that defined in ningbo_dm.c can implement the same/alike function
|
|
void PM813_VBUS_IS_DETECTED(void)
|
|
{
|
|
if(GetUsbPmLock()==0)
|
|
{
|
|
SetUsbPmLock(1);
|
|
}
|
|
if (PMIC_READ_REG_BASE(NINGBO_STATUS_REG1) & NINGBO_VBUS_STATUS_BIT)
|
|
{
|
|
ustica_USB_turnOn();
|
|
craneCommPMPowerupUsbPhy();
|
|
}
|
|
else
|
|
{
|
|
SetUsbPmLock(0);
|
|
#ifdef LWIP_IPNETBUF_SUPPORT
|
|
SetUsbEnumFlag(FALSE);
|
|
#endif
|
|
}
|
|
}
|
|
void PM813_VBUS_int_test_callback()
|
|
{
|
|
PM813_VBUS_IS_DETECTED();
|
|
}
|
|
|
|
void PM813_VBUS_INTC_ENABLE(BOOL onoff)
|
|
{
|
|
onoff ? Ningbo_INT_ENABLE(NINGBO_VBUS_DET_INT): Ningbo_INT_DISABLE(NINGBO_VBUS_DET_INT);
|
|
}
|
|
|
|
//ICAT EXPORTED FUNCTION - SW_PLAT,PM812,VBUS_INTC_test
|
|
void PM813_VBUS_int()
|
|
{
|
|
if (PMIC_IS_PM813())
|
|
{
|
|
Ningbo_INT_CALLBACK_REGISTER(NINGBO_VBUS_DET_INT, PM813_VBUS_int_test_callback);
|
|
//PM812_VBUS_BIND_INTC(PM812_VBUS_int_test_callback);
|
|
PM813_VBUS_INTC_ENABLE(TRUE);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
//ICAT EXPORTED FUNCTION - ADEMO,START_PS,usticaInit
|
|
void usticaInit(void)
|
|
{
|
|
ustica_I2CEnableclockandPin();
|
|
ustica_I2CConfigureDi();
|
|
}
|
|
|
|
void PM812_bk4clkfll_set_2m(void)
|
|
{
|
|
}
|
|
|
|
|
|
void PM812_PowerSave_Config(void)
|
|
{
|
|
}
|
|
|
|
void PM812_vbuck1_set_fpwm(void)
|
|
{
|
|
}
|
|
|
|
void PM812_vbuck4_set_fpwm(void)
|
|
{
|
|
}
|
|
|
|
void PM812_vbuck3_set_1_25(void)
|
|
{
|
|
}
|
|
|
|
void PM812_vbuck4_set_1_85(void)
|
|
{
|
|
}
|
|
|
|
void PM812_vbuck4_set_2_00(void)
|
|
{
|
|
}
|
|
|
|
void PM812_APT_enable(void)
|
|
{
|
|
}
|
|
|
|
void PM812_BUCK5_Enable(void)
|
|
{
|
|
}
|
|
|
|
static void PM812_LDO_Enable(int ldo_num,BOOL OnOff)
|
|
{
|
|
}
|
|
|
|
//(sleep vol & activate vol ) should set together to reduce PI2C operation times
|
|
static void PM812_LDO_VOUT_CFG(int addr,int act_vol,int slp_vol)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_3_set_2_8(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_3_set(BOOL OnOff)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_4_set_1_8(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_4_set_3_0(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_4_set(BOOL OnOff)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_10_set_1_8(void)
|
|
{
|
|
}
|
|
void PM812_Ldo_10_set_3_0(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_10_set(BOOL OnOff)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_12_set_1_8(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_12_set_2_8(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_12_set_3_0(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_12_set(BOOL OnOff)
|
|
{
|
|
}
|
|
|
|
//add for mmi team 's request
|
|
unsigned int PM812_REG_DUMP(unsigned char page, unsigned char addr)
|
|
{
|
|
|
|
unsigned char regval;
|
|
int result;
|
|
|
|
UINT32 ICRRegValue;
|
|
UINT32 ISARRegValue;
|
|
|
|
result = Get_RIPC_ustica(3,200);
|
|
if (result == RIPC_FAILURE)
|
|
ASSERT(0);
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
I2C_REG_READ(I2C_ISAR_REG,ISARRegValue);
|
|
|
|
ustica_I2CEnableclockandPin();
|
|
ustica_I2CConfigureDi();
|
|
|
|
switch(page){
|
|
case PM812_BASE_PAGE_READ_SLAVE_ADDR:
|
|
if(addr >= PM812_INT_STATUS_1_REG && addr <= PM812_INT_STATUS_4_REG){
|
|
//PM812 INT STATUS was not allowed to read by this API
|
|
ASSERT(0);
|
|
}
|
|
regval = USTICAI2CReadDi_base(addr);
|
|
break;
|
|
case PM812_POWER_PAGE_READ_SLAVE_ADDR:
|
|
regval = USTICAI2CReadDi_power(addr);
|
|
break;
|
|
case PM812_GPADC_PAGE_READ_SLAVE_ADDR:
|
|
regval = USTICAI2CReadDi_GPADC(addr);
|
|
break;
|
|
default:
|
|
regval = 0;
|
|
}
|
|
|
|
#if PMIC_DEBUG
|
|
DIAG_FILTER(HAL, PM812, PM812_REG_DUMP, DIAG_INFORMATION)
|
|
diagPrintf("[PM812_REG_DUMP] PAGE=%d , ADDR=0xx , val=0x%x",page,addr,regval);
|
|
#endif
|
|
|
|
I2C_REG_WRITE(I2C_ISAR_REG,ISARRegValue);
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue);
|
|
|
|
Release_RIPC_ustica(3);
|
|
|
|
return regval;
|
|
}
|
|
|
|
void PM812_Ldo_5_set_3_1(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_5_set(BOOL OnOff)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_6_set_1_8(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_6_set_2_8(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_6_set(BOOL OnOff)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_8_set_2_8(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_8_set(BOOL OnOff)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_9_set_1_8(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_9_set(BOOL OnOff)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_11_set_2_8(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_11_set(BOOL OnOff)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_13_set_2_8(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_13_set(BOOL OnOff)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_15_set_2_8(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_15_set(BOOL OnOff)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_16_set_2_8(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_16_set(BOOL OnOff)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_17_set_2_8(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_17_set(BOOL OnOff)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_18_set_1_8(void)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_18_set(BOOL OnOff)
|
|
{
|
|
}
|
|
|
|
void PM812_Ldo_19_Config(void) //for RF power supply
|
|
{
|
|
}
|
|
|
|
void PM812SetLDO3OffOnSleep(void)
|
|
{
|
|
}
|
|
|
|
void PM812_32K_OUT2_Enable(void)
|
|
{
|
|
}
|
|
|
|
unsigned char GetPMICID(void)
|
|
{
|
|
unsigned char regval;
|
|
int result;
|
|
UINT32 ICRRegValue;
|
|
UINT32 ISARRegValue;
|
|
|
|
result = Get_RIPC_ustica(3,200);
|
|
if (result == RIPC_FAILURE)
|
|
ASSERT(0);
|
|
|
|
I2C_REG_READ(I2C_ICR_REG,ICRRegValue);
|
|
I2C_REG_READ(I2C_ISAR_REG,ISARRegValue);
|
|
|
|
ustica_I2CEnableclockandPin();
|
|
ustica_I2CConfigureDi();
|
|
|
|
regval = USTICAI2CReadDi_base(0x00);
|
|
|
|
I2C_REG_WRITE(I2C_ISAR_REG,ISARRegValue);
|
|
I2C_REG_WRITE(I2C_ICR_REG, ICRRegValue);
|
|
Release_RIPC_ustica(3);
|
|
|
|
PMIC_UART_DEBUG("PMIC_ID = 0x%x\r\n", regval);
|
|
return regval;
|
|
}
|
|
|
|
//switch external 32k crystal oscillator
|
|
void PM812_RTC_USE_XO(void)
|
|
{
|
|
}
|
|
|
|
static void PI2C_WRITE_REG(UINT8 page,UINT8 addr, UINT8 value)
|
|
{
|
|
switch(page)
|
|
{
|
|
case PMC_I2C_WRITE_BASE_SLAVE_ADDRESS:
|
|
USTICAI2CWriteDi_base(addr,value);
|
|
break;
|
|
case PMC_I2C_WRITE_POWER_SLAVE_ADDRESS:
|
|
USTICAI2CWriteDi_power(addr,value);
|
|
break;
|
|
case PMC_I2C_WRITE_GPADC_SLAVE_ADDRESS:
|
|
USTICAI2CWriteDi_GPADC(addr,value);
|
|
break;
|
|
case PMC_I2C_WRITE_TEST_SLAVE_ADDRESS:
|
|
USTICAI2CWriteDi_TEST(addr,value);
|
|
break;
|
|
case PMC_I2C_WRITE_AUDIO_SLAVE_ADDRESS:
|
|
USTICAI2CWriteDi_AUDIO(addr,value);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
}
|
|
return;
|
|
}
|
|
|
|
static UINT8 PI2C_READ_REG(UINT8 page,UINT8 addr)
|
|
{
|
|
UINT8 ret=0;
|
|
|
|
switch(page)
|
|
{
|
|
case PMC_I2C_READ_BASE_SLAVE_ADDRESS:
|
|
ret = USTICAI2CReadDi_base(addr);
|
|
break;
|
|
case PMC_I2C_READ_POWER_SLAVE_ADDRESS:
|
|
ret = USTICAI2CReadDi_power(addr);
|
|
break;
|
|
case PMC_I2C_READ_GPADC_SLAVE_ADDRESS:
|
|
ret = USTICAI2CReadDi_GPADC(addr);
|
|
break;
|
|
case PMC_I2C_READ_TEST_SLAVE_ADDRESS:
|
|
ret = USTICAI2CReadDi_TEST(addr);
|
|
break;
|
|
case PMC_I2C_READ_AUDIO_SLAVE_ADDRESS:
|
|
ret = USTICAI2CReadDi_AUDIO(addr);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void PMIC_WRITE_REG_GPADC(UINT8 addr, UINT8 value) {PI2C_WRITE_REG(PMC_I2C_WRITE_GPADC_SLAVE_ADDRESS,addr,value);}
|
|
UINT8 PMIC_READ_REG_GPADC(UINT8 addr) {return PI2C_READ_REG(PMC_I2C_READ_GPADC_SLAVE_ADDRESS,addr);}
|
|
|
|
void PMIC_WRITE_REG_POWER(UINT8 addr, UINT8 value) {PI2C_WRITE_REG(PMC_I2C_WRITE_POWER_SLAVE_ADDRESS,addr, value);}
|
|
UINT8 PMIC_READ_REG_POWER(UINT8 addr) {return PI2C_READ_REG(PMC_I2C_READ_POWER_SLAVE_ADDRESS,addr);}
|
|
|
|
void PMIC_WRITE_REG_BASE(UINT8 addr, UINT8 value) {PI2C_WRITE_REG(PMC_I2C_WRITE_BASE_SLAVE_ADDRESS,addr,value);}
|
|
UINT8 PMIC_READ_REG_BASE(UINT8 addr) {return PI2C_READ_REG(PMC_I2C_READ_BASE_SLAVE_ADDRESS,addr);}
|
|
|
|
void PMIC_WRITE_REG_TEST(UINT8 addr, UINT8 value) {PI2C_WRITE_REG(PMC_I2C_WRITE_TEST_SLAVE_ADDRESS,addr,value);}
|
|
UINT8 PMIC_READ_REG_TEST(UINT8 addr) {return PI2C_READ_REG(PMC_I2C_READ_TEST_SLAVE_ADDRESS,addr);}
|
|
|
|
void PMIC_WRITE_REG_AUDIO(UINT8 addr, UINT8 value) {PI2C_WRITE_REG(PMC_I2C_WRITE_AUDIO_SLAVE_ADDRESS,addr,value);}
|
|
UINT8 PMIC_READ_REG_AUDIO(UINT8 addr) {return PI2C_READ_REG(PMC_I2C_READ_AUDIO_SLAVE_ADDRESS,addr);}
|
|
|
|
static UINT32 PMIC_GET_RTC_REG_32(UINT8 start)
|
|
{
|
|
COUNTER_32 cnt;
|
|
|
|
cnt.cnt_8[0] = PMIC_READ_REG_BASE(start+0);
|
|
cnt.cnt_8[1] = PMIC_READ_REG_BASE(start+1);
|
|
cnt.cnt_8[2] = PMIC_READ_REG_BASE(start+2);
|
|
cnt.cnt_8[3] = PMIC_READ_REG_BASE(start+3);
|
|
|
|
return cnt.cnt_32;
|
|
}
|
|
|
|
static void PMIC_SET_RTC_REG_32(UINT8 start,UINT32 data)
|
|
{
|
|
COUNTER_32 cnt;
|
|
cnt.cnt_32 = data;
|
|
|
|
PMIC_WRITE_REG_BASE(start+0 ,cnt.cnt_8[0]);
|
|
PMIC_WRITE_REG_BASE(start+1 ,cnt.cnt_8[1]);
|
|
PMIC_WRITE_REG_BASE(start+2 ,cnt.cnt_8[2]);
|
|
PMIC_WRITE_REG_BASE(start+3 ,cnt.cnt_8[3]);
|
|
}
|
|
|
|
//power up / down log
|
|
static UINT8 PM812_GET_POWER_UP_LOG()
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
return PMIC_READ_REG_BASE(NINGBO_PWRUP_LOG_REG);
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
return PMIC_READ_REG_BASE(GUILIN_PWRUP_LOG_REG);
|
|
#endif
|
|
case PMIC_803:
|
|
return PMIC_READ_REG_BASE(GUILIN_LITE_PWRUP_LOG_REG);
|
|
case PMIC_803L:
|
|
return PMIC_READ_REG_BASE(GUILIN_LITE2_PWRUP_LOG_REG);
|
|
case PMIC_807:
|
|
return PMIC_READ_REG_BASE(GUILIN_LITE3_PWRUP_LOG_REG);
|
|
default:
|
|
ASSERT(0);
|
|
return 0;
|
|
}
|
|
}
|
|
static void PM812_CLR_POWER_UP_LOG(UINT8 tmp)
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
PMIC_WRITE_REG_BASE(NINGBO_PWRUP_LOG_REG,tmp);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
PMIC_WRITE_REG_BASE(GUILIN_PWRUP_LOG_REG,tmp);
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE_PWRUP_LOG_REG,tmp);
|
|
break;
|
|
case PMIC_803L:
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE2_PWRUP_LOG_REG,tmp);
|
|
break;
|
|
case PMIC_807:
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE3_PWRUP_LOG_REG,tmp);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
static UINT8 PM812_GET_POWER_DOWN_LOG()
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
return PMIC_READ_REG_BASE(NINGBO_POWERDOWN_LOG_REG);
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
return PMIC_READ_REG_BASE(GUILIN_POWERDOWN_LOG_REG);
|
|
#endif
|
|
case PMIC_803:
|
|
return PMIC_READ_REG_BASE(GUILIN_LITE_POWERDOWN_LOG_REG);
|
|
case PMIC_803L:
|
|
return PMIC_READ_REG_BASE(GUILIN_LITE2_POWERDOWN_LOG_REG);
|
|
case PMIC_807:
|
|
return PMIC_READ_REG_BASE(GUILIN_LITE3_POWERDOWN_LOG_REG);
|
|
default:
|
|
ASSERT(0);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
static void PM812_CLR_POWER_DOWN_LOG(UINT8 tmp)
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
PMIC_WRITE_REG_BASE(NINGBO_POWERDOWN_LOG_REG,tmp);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
PMIC_WRITE_REG_BASE(GUILIN_POWERDOWN_LOG_REG,tmp);
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE_POWERDOWN_LOG_REG,tmp);
|
|
break;
|
|
case PMIC_803L:
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE2_POWERDOWN_LOG_REG,tmp);
|
|
break;
|
|
case PMIC_807:
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE3_POWERDOWN_LOG_REG,tmp);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static UINT8 PM812_GET_POWER_DOWN_LOG2()
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
return PMIC_READ_REG_BASE(NINGBO_POWERDOWN_LOG_REG2);
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
return PMIC_READ_REG_BASE(GUILIN_POWERDOWN_LOG_REG2);
|
|
#endif
|
|
case PMIC_803:
|
|
return PMIC_READ_REG_BASE(GUILIN_LITE_POWERDOWN_LOG_REG2);
|
|
case PMIC_803L:
|
|
return PMIC_READ_REG_BASE(GUILIN_LITE2_POWERDOWN_LOG_REG2);
|
|
case PMIC_807:
|
|
return PMIC_READ_REG_BASE(GUILIN_LITE3_POWERDOWN_LOG_REG2);
|
|
default:
|
|
ASSERT(0);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
static void PM812_CLR_POWER_DOWN_LOG2(UINT8 tmp)
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
PMIC_WRITE_REG_BASE(NINGBO_POWERDOWN_LOG_REG2,tmp);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
PMIC_WRITE_REG_BASE(GUILIN_POWERDOWN_LOG_REG2,tmp);
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE_POWERDOWN_LOG_REG2,tmp);
|
|
break;
|
|
case PMIC_803L:
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE2_POWERDOWN_LOG_REG2,tmp);
|
|
break;
|
|
case PMIC_807:
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE3_POWERDOWN_LOG_REG2,tmp);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
//ICAT EXPORTED FUNCTION - SW_PLAT,PM812,DELAY_SW_PDOWN
|
|
void PM812_DELAY_SW_PDOWN()
|
|
{
|
|
UINT8 tmp;
|
|
//delay 4s for debug manul operation
|
|
//e.g plug-out the USB to avoid EXTON_WU
|
|
PMIC_UART_DEBUG("[%s] \r\n",__func__);
|
|
|
|
OSATaskSleep(400);
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
tmp = PMIC_READ_REG_BASE(NINGBO_MISC_CFG_REG1);
|
|
tmp |= NINGBO_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(NINGBO_MISC_CFG_REG1,tmp);
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE_WAKEUP_REG1);
|
|
tmp |= GUILIN_LITE_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE_WAKEUP_REG1,tmp);
|
|
break;
|
|
case PMIC_803L:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE2_WAKEUP_REG1);
|
|
tmp |= GUILIN_LITE2_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE2_WAKEUP_REG1,tmp);
|
|
break;
|
|
case PMIC_807:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE3_WAKEUP_REG1);
|
|
tmp |= GUILIN_LITE3_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE3_WAKEUP_REG1,tmp);
|
|
break;
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_WAKEUP_REG1);
|
|
tmp |= GUILIN_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_WAKEUP_REG1,tmp);
|
|
break;
|
|
#endif
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
void PM812_FAULT_WU_EN_ENABLE()
|
|
{
|
|
UINT8 tmp;
|
|
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
tmp = PMIC_READ_REG_BASE(NINGBO_FAULT_WU_REG);
|
|
tmp |= (NINGBO_FAULT_WU_ENABLE_BIT);
|
|
PMIC_WRITE_REG_BASE(NINGBO_FAULT_WU_REG,tmp);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_FAULT_WU_REG);
|
|
tmp |= (GUILIN_FAULT_WU_ENABLE_BIT);
|
|
PMIC_WRITE_REG_BASE(GUILIN_FAULT_WU_REG,tmp);
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE_FAULT_WU_REG);
|
|
tmp |= (GUILIN_LITE_FAULT_WU_ENABLE_BIT);
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE_FAULT_WU_REG,tmp);
|
|
break;
|
|
case PMIC_803L:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE2_FAULT_WU_REG);
|
|
tmp |= (GUILIN_LITE2_FAULT_WU_ENABLE_BIT);
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE2_FAULT_WU_REG,tmp);
|
|
break;
|
|
case PMIC_807:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE3_FAULT_WU_REG);
|
|
tmp |= (GUILIN_LITE3_FAULT_WU_ENABLE_BIT);
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE3_FAULT_WU_REG,tmp);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
void PM812_FAULT_WU_ENABLE()
|
|
{
|
|
UINT8 tmp;
|
|
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
tmp = PMIC_READ_REG_BASE(NINGBO_FAULT_WU_REG);
|
|
tmp |= (NINGBO_FAULT_WU_BIT);
|
|
PMIC_WRITE_REG_BASE(NINGBO_FAULT_WU_REG,tmp);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_FAULT_WU_REG);
|
|
tmp |= (GUILIN_FAULT_WU_BIT);
|
|
PMIC_WRITE_REG_BASE(GUILIN_FAULT_WU_REG,tmp);
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE_FAULT_WU_REG);
|
|
tmp |= (GUILIN_LITE_FAULT_WU_BIT);
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE_FAULT_WU_REG,tmp);
|
|
break;
|
|
case PMIC_803L:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE2_FAULT_WU_REG);
|
|
tmp |= (GUILIN_LITE2_FAULT_WU_BIT);
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE2_FAULT_WU_REG,tmp);
|
|
break;
|
|
case PMIC_807:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE3_FAULT_WU_REG);
|
|
tmp |= (GUILIN_LITE3_FAULT_WU_BIT);
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE3_FAULT_WU_REG,tmp);
|
|
break;
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813S:
|
|
tmp = PMIC_READ_REG_BASE(NINGBO_FAULT_WU_REG);
|
|
tmp |= (NINGBO2_FAULT_WU_BIT);
|
|
PMIC_WRITE_REG_BASE(NINGBO_FAULT_WU_REG,tmp);
|
|
break;
|
|
#endif
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
void PM812_FAULT_WU_EN_DISABLE()
|
|
{
|
|
UINT8 tmp;
|
|
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
tmp = PMIC_READ_REG_BASE(NINGBO_FAULT_WU_REG);
|
|
tmp &= ~(NINGBO_FAULT_WU_ENABLE_BIT);
|
|
PMIC_WRITE_REG_BASE(NINGBO_FAULT_WU_REG,tmp);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_FAULT_WU_REG);
|
|
tmp &= ~(GUILIN_FAULT_WU_ENABLE_BIT);
|
|
PMIC_WRITE_REG_BASE(GUILIN_FAULT_WU_REG,tmp);
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE_FAULT_WU_REG);
|
|
tmp &= ~(GUILIN_LITE_FAULT_WU_ENABLE_BIT);
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE_FAULT_WU_REG,tmp);
|
|
break;
|
|
case PMIC_803L:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE2_FAULT_WU_REG);
|
|
tmp &= ~(GUILIN_LITE2_FAULT_WU_ENABLE_BIT);
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE2_FAULT_WU_REG,tmp);
|
|
break;
|
|
case PMIC_807:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE3_FAULT_WU_REG);
|
|
tmp &= ~(GUILIN_LITE3_FAULT_WU_ENABLE_BIT);
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE3_FAULT_WU_REG,tmp);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
void PMIC_PowerDown(void)
|
|
{
|
|
UINT8 tmp;
|
|
|
|
PMIC_UART_DEBUG("PDOWN!\r\n");
|
|
|
|
#ifdef LFS_USE_CACHE
|
|
LfsMutexLock(TRUE);
|
|
lfs_write_back_to_flash(FALSE, TRUE);
|
|
#endif
|
|
|
|
PM812_FAULT_WU_EN_DISABLE();
|
|
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
if (PMIC_IS_PM813()||PMIC_IS_PM813S())
|
|
{
|
|
PMIC_WRITE_REG_BASE(0x4C,0x0); //disable PWM
|
|
tmp = PMIC_READ_REG_BASE(NINGBO_MISC_CFG_REG1);
|
|
tmp |= NINGBO_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(NINGBO_MISC_CFG_REG1,tmp);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
//extern void set_diag_cache_flag(unsigned int val);
|
|
|
|
//ICAT EXPORTED FUNCTION - SW_PLAT,PM812,SW_PDOWN
|
|
void PM812_SW_PDOWN(void)
|
|
{
|
|
UINT8 tmp;
|
|
UINT32 callerAddress ;
|
|
|
|
#if defined(__ARMCC_VERSION)
|
|
callerAddress= (__ARMCC_VERSION >= 200000) ? __return_address() : 0 ; // Keep first.
|
|
#else
|
|
callerAddress = 0;
|
|
#endif
|
|
|
|
RTI_LOG("SW_PDOWN @0x%x",callerAddress);
|
|
|
|
#ifdef AT_OVER_UART //workaround to remove extra 0x00 on cp uart tx when system power down
|
|
if (IsChipCraneL())
|
|
{
|
|
extern void PMIC_Set_CP_UART_PowerOff_and_AIB_3_3V(void);
|
|
PMIC_Set_CP_UART_PowerOff_and_AIB_3_3V();
|
|
}
|
|
#endif
|
|
|
|
#ifdef LFS_USE_CACHE
|
|
LfsMutexLock(TRUE);
|
|
lfs_write_back_to_flash(FALSE, TRUE);
|
|
#endif
|
|
|
|
if (PM812_CHARGER_IS_DETECTED())
|
|
{ //if charger attached, prepare to enter "powering-off charging"
|
|
SysRestartReasonSet((SW_RESTART_REASON)'C');
|
|
PM812_FAULT_WU_EN_ENABLE();
|
|
PM812_FAULT_WU_ENABLE();
|
|
}
|
|
else
|
|
PM812_FAULT_WU_EN_DISABLE();
|
|
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
PMIC_WRITE_REG_BASE(0x4C,0x0); //disable PWM
|
|
tmp = PMIC_READ_REG_BASE(NINGBO_MISC_CFG_REG1);
|
|
tmp |= NINGBO_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(NINGBO_MISC_CFG_REG1,tmp);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_WAKEUP_REG1);
|
|
tmp |= GUILIN_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_WAKEUP_REG1,tmp);
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE_WAKEUP_REG1);
|
|
tmp |= GUILIN_LITE_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE_WAKEUP_REG1,tmp);
|
|
break;
|
|
case PMIC_803L:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE2_WAKEUP_REG1);
|
|
tmp |= GUILIN_LITE2_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE2_WAKEUP_REG1,tmp);
|
|
break;
|
|
case PMIC_807:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE3_WAKEUP_REG1);
|
|
tmp |= GUILIN_LITE3_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE3_WAKEUP_REG1,tmp);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
//ICAT EXPORTED FUNCTION - SW_PLAT,PM812,SW_PDOWN_SLT
|
|
void PM812_SW_PDOWN_SLT()
|
|
{
|
|
UINT8 tmp;
|
|
UINT32 callerAddress ;
|
|
|
|
#if defined(__ARMCC_VERSION)
|
|
callerAddress= (__ARMCC_VERSION >= 200000) ? __return_address() : 0 ; // Keep first.
|
|
#else
|
|
callerAddress = 0;
|
|
#endif
|
|
|
|
RTI_LOG("SW_PDOWN_SLT @0x%x",callerAddress);
|
|
|
|
#ifdef LFS_USE_CACHE
|
|
LfsMutexLock(TRUE);
|
|
lfs_write_back_to_flash(FALSE, TRUE);
|
|
#endif
|
|
|
|
PM812_FAULT_WU_EN_DISABLE();
|
|
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
PMIC_WRITE_REG_BASE(0x4C,0x0); //disable PWM
|
|
tmp = PMIC_READ_REG_BASE(NINGBO_MISC_CFG_REG1);
|
|
tmp |= NINGBO_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(NINGBO_MISC_CFG_REG1,tmp);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_WAKEUP_REG1);
|
|
tmp |= GUILIN_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_WAKEUP_REG1,tmp);
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE_WAKEUP_REG1);
|
|
tmp |= GUILIN_LITE_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE_WAKEUP_REG1,tmp);
|
|
break;
|
|
case PMIC_803L:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE2_WAKEUP_REG1);
|
|
tmp |= GUILIN_LITE2_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE2_WAKEUP_REG1,tmp);
|
|
break;
|
|
case PMIC_807:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE3_WAKEUP_REG1);
|
|
tmp |= GUILIN_LITE3_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE3_WAKEUP_REG1,tmp);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
//ICAT EXPORTED FUNCTION - SW_PLAT,PM812,SW_RESET
|
|
void PM812_SW_RESET(void)
|
|
{
|
|
UINT8 tmp;
|
|
UINT32 callerAddress ;
|
|
|
|
#if defined(__ARMCC_VERSION)
|
|
callerAddress= (__ARMCC_VERSION >= 200000) ? __return_address() : 0 ; // Keep first.
|
|
#else
|
|
callerAddress = 0;
|
|
#endif
|
|
|
|
RTI_LOG("SW_RESET @0x%x",callerAddress);
|
|
|
|
#ifdef AT_OVER_UART //workaround to remove extra 0x00 on cp uart tx when system power down
|
|
if (IsChipCraneL())
|
|
{
|
|
extern void PMIC_Set_CP_UART_PowerOff_and_AIB_3_3V(void);
|
|
PMIC_Set_CP_UART_PowerOff_and_AIB_3_3V();
|
|
}
|
|
#endif
|
|
|
|
#ifdef QUECTEL_PROJECT_CUST
|
|
QUEC_SET_MAINUART_TX_GPIO();
|
|
USB2MgrDeviceUnplug();
|
|
#endif
|
|
|
|
#ifdef LFS_USE_CACHE
|
|
LfsMutexLock(TRUE);
|
|
lfs_write_back_to_flash(FALSE, TRUE);
|
|
#endif
|
|
//set FAULT_WU & FAULT_WU_EN
|
|
//NOTICE : have to set these flag one by one
|
|
PM812_FAULT_WU_EN_ENABLE();
|
|
PM812_FAULT_WU_ENABLE();
|
|
|
|
//SW_PDOWN
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
PMIC_WRITE_REG_BASE(0x4C,0x0); //disable PWM
|
|
tmp = PMIC_READ_REG_BASE(NINGBO_MISC_CFG_REG1);
|
|
tmp |= NINGBO_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(NINGBO_MISC_CFG_REG1,tmp);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_WAKEUP_REG1);
|
|
tmp |= GUILIN_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_WAKEUP_REG1,tmp);
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE_WAKEUP_REG1);
|
|
tmp |= GUILIN_LITE_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE_WAKEUP_REG1,tmp);
|
|
break;
|
|
case PMIC_803L:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE2_WAKEUP_REG1);
|
|
tmp |= GUILIN_LITE2_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE2_WAKEUP_REG1,tmp);
|
|
break;
|
|
case PMIC_807:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE3_WAKEUP_REG1);
|
|
tmp |= GUILIN_LITE3_SW_PDOWN_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE3_WAKEUP_REG1,tmp);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
//ICAT EXPORTED FUNCTION - SW_PLAT,PM812,RESET_ALL
|
|
void PM812_RESET_ALL(void)
|
|
{
|
|
UINT8 tmp;
|
|
PMIC_UART_DEBUG("[%s] \r\n",__func__);
|
|
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
tmp = PMIC_READ_REG_BASE(NINGBO_MISC_CFG_REG1);
|
|
tmp |= NINGBO_RESET_PMIC_BIT;
|
|
PMIC_WRITE_REG_BASE(NINGBO_MISC_CFG_REG1,tmp);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_WAKEUP_REG1);
|
|
tmp |= GUILIN_RESET_PMIC_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_WAKEUP_REG1,tmp);
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE_WAKEUP_REG1);
|
|
tmp |= GUILIN_LITE_RESET_PMIC_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE_WAKEUP_REG1,tmp);
|
|
break;
|
|
case PMIC_803L:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE2_WAKEUP_REG1);
|
|
tmp |= GUILIN_LITE2_RESET_PMIC_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE2_WAKEUP_REG1,tmp);
|
|
break;
|
|
case PMIC_807:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE3_WAKEUP_REG1);
|
|
tmp |= GUILIN_LITE3_RESET_PMIC_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE3_WAKEUP_REG1,tmp);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
//[5:3] WD_TIMER_ACT
|
|
//WD_TIMER_SLP=8*WD_TIMER_ACT by default
|
|
void PM812_SET_WD_TIMEOUT_ACT(UINT8 input_timeout){
|
|
//TODO: should refactor pmic struct in ther furture
|
|
typedef enum {
|
|
PMIC_WDT_8s,
|
|
PMIC_WDT_16s,
|
|
PMIC_WDT_32s,
|
|
PMIC_WDT_64s,
|
|
PMIC_WDT_256s
|
|
}PMIC_WD_TIMEOUT;
|
|
|
|
UINT8 timeout = 0;
|
|
UINT8 tmp = PMIC_READ_REG_BASE(PM812_WAKEUP_2_REG);
|
|
tmp &= ~PM812_WD_TIMER_ACT_BITS;
|
|
switch (input_timeout)
|
|
{
|
|
case PMIC_WDT_8s:
|
|
timeout = PM812_WD_TIMER_8s;
|
|
break;
|
|
case PMIC_WDT_16s:
|
|
timeout = PM812_WD_TIMER_16s;
|
|
break;
|
|
case PMIC_WDT_32s:
|
|
timeout = PM812_WD_TIMER_32s;
|
|
break;
|
|
case PMIC_WDT_64s:
|
|
timeout = PM812_WD_TIMER_64s;
|
|
break;
|
|
case PMIC_WDT_256s:
|
|
timeout = PM812_WD_TIMER_256s;
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
PMIC_WRITE_REG_BASE(PM812_WAKEUP_2_REG,(tmp|timeout));
|
|
}
|
|
|
|
void PM812_WD_RESET(void)
|
|
{
|
|
}
|
|
|
|
void PM812_WD_MODE(BOOL enable)
|
|
{
|
|
}
|
|
|
|
void PM812_WD_ENABLE(BOOL enable){
|
|
}
|
|
|
|
//RTC controller reg
|
|
//20200320@xiaoke implement RTC statemachine for pm802
|
|
UINT8 PM812_RTC_GET_CONTROL_REG(void)
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
return PMIC_READ_REG_BASE(NINGBO_RTC_CTRL_REG);
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
//20200320@xiaoke implement RTC statemachine for pm802
|
|
return PMIC_READ_REG_BASE(GUILIN_RTC_CTRL_REG);
|
|
#endif
|
|
case PMIC_803:
|
|
return 0;
|
|
case PMIC_803L:
|
|
return PMIC_READ_REG_BASE(GUILIN_LITE2_RTC_CTRL_REG);
|
|
case PMIC_807:
|
|
return PMIC_READ_REG_BASE(GUILIN_LITE3_RTC_CTRL_REG);
|
|
default:
|
|
ASSERT(0);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
//20200320@xiaoke implement RTC statemachine for pm802
|
|
void PM812_RTC_SET_CONTROL_REG(UINT8 ctl)
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
PMIC_WRITE_REG_BASE(NINGBO_RTC_CTRL_REG,ctl);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
//20200320@xiaoke implement RTC statemachine for pm802
|
|
PMIC_WRITE_REG_BASE(GUILIN_RTC_CTRL_REG,ctl);
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
break;
|
|
case PMIC_803L:
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE2_RTC_CTRL_REG,ctl);
|
|
break;
|
|
case PMIC_807:
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE3_RTC_CTRL_REG,ctl);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
//rtc counter
|
|
//20200320@xiaoke implement RTC statemachine for pm802
|
|
UINT32 PM812_RTC_GET_32B_COUNTER(void)
|
|
{
|
|
if (!check_if_DCS_mode() && !CHIP_IS_CRANELR && !CHIP_IS_CRANELG && !CHIP_IS_CRANELRH)
|
|
{
|
|
return SCS_GetRtcCounter();
|
|
}else{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
return PMIC_GET_RTC_REG_32(NINGBO_RTC_COUNT_REG1);
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
//20200320@xiaoke implement RTC statemachine for pm802
|
|
return PMIC_GET_RTC_REG_32(GUILIN_RTC_COUNT_REG1);
|
|
#endif
|
|
case PMIC_803:
|
|
//20200904@xiaoke for SCS mode (Single Crystal Scenario)
|
|
return SCS_GetRtcCounter();
|
|
case PMIC_803L:
|
|
return PMIC_GET_RTC_REG_32(GUILIN_LITE2_RTC_COUNT_REG1);
|
|
case PMIC_807:
|
|
return PMIC_GET_RTC_REG_32(GUILIN_LITE3_RTC_COUNT_REG1);
|
|
default:
|
|
ASSERT(0);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
UINT8 PMIC_RTC_USERDATA_REG(void)
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
return NINGBO_RTC_USERDATA_SETTING_MARK_REG;
|
|
case PMIC_813S:
|
|
return NINGBO2_RTC_USERDATA_SETTING_MARK_REG;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
return GUILIN_RTC_USERDATA_SETTING_MARK_REG;
|
|
#endif
|
|
case PMIC_803:
|
|
//20200904@xiaoke for PM803 userdata reg
|
|
return GUILIN_LITE_RTC_USERDATA_SETTING_MARK_REG;
|
|
case PMIC_803L:
|
|
return GUILIN_LITE2_RTC_USERDATA_SETTING_MARK_REG;
|
|
case PMIC_807:
|
|
return GUILIN_LITE3_RTC_USERDATA_SETTING_MARK_REG;
|
|
default:
|
|
ASSERT(0);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
void PMIC_RTC_USERDATA_CFG_SET(UINT8 bit_mask,BOOL marked)
|
|
{
|
|
UINT8 addr= PMIC_RTC_USERDATA_REG();
|
|
UINT8 tmp = PMIC_READ_REG_BASE(addr);
|
|
|
|
PMIC_UART_DEBUG("[%s]bit_mask=[%x],marked=[%x]\r\n",__func__,bit_mask,marked);
|
|
|
|
if(marked){
|
|
tmp |= bit_mask;
|
|
}else{
|
|
tmp &= (~bit_mask);
|
|
}
|
|
|
|
PMIC_WRITE_REG_BASE(addr,tmp);
|
|
}
|
|
|
|
BOOL PMIC_RTC_USERDATA_CFG_GET(UINT8 bit_mask)
|
|
{
|
|
PMIC_UART_DEBUG("[%s] bit_mask=[%x] \r\n",__func__,bit_mask);
|
|
return (PMIC_READ_REG_BASE(PMIC_RTC_USERDATA_REG()) & (bit_mask))?TRUE:FALSE;
|
|
}
|
|
|
|
//20190513@xiaokeweng : RTC_APP_OFFSET implement ++
|
|
//dof offset offset , the first 32bit of user data
|
|
//20200320@xiaoke implement RTC statemachine for pm802
|
|
UINT32 PM812_RTC_GET_32B_SYS_OFFSET(void)
|
|
{
|
|
UINT32 tmp = 0;
|
|
|
|
if(m_pmic_rtc_offset_storage_type == PMIC_RTC_OFFSET_IN_NVM)
|
|
{
|
|
tmp = m_pmic_rtc_setting.pmic_rtc_setting_sys_offset;
|
|
}else{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
tmp = PMIC_GET_RTC_REG_32(NINGBO_RTC_SYS_OFFSET_REG);
|
|
break;
|
|
case PMIC_813S:
|
|
tmp = PMIC_GET_RTC_REG_32(NINGBO2_RTC_SYS_OFFSET_REG);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
#endif
|
|
//20200904@xiaoke for PM803 storage RTC_OFFSET into NVM follow PM802
|
|
case PMIC_803:
|
|
case PMIC_803L:
|
|
case PMIC_807:
|
|
//20200706@xiaokeweng : for PM802 switch the storage of RTC_OFFSET from PMIC-regs into NVM
|
|
//store sys_offset/app_offset/timezone pmic_rtc config into NVM but the pmic-userdata-regs
|
|
tmp = m_pmic_rtc_setting.pmic_rtc_setting_sys_offset;
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
return tmp;
|
|
|
|
}
|
|
void PM812_RTC_SET_32B_SYS_OFFSET(UINT32 offset)
|
|
{
|
|
if(m_pmic_rtc_offset_storage_type == PMIC_RTC_OFFSET_IN_NVM)
|
|
{
|
|
m_pmic_rtc_setting.pmic_rtc_setting_sys_offset=offset;
|
|
pmic_rtc_setting_save();
|
|
}else{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
return PMIC_SET_RTC_REG_32(NINGBO_RTC_SYS_OFFSET_REG,offset);
|
|
case PMIC_813S:
|
|
return PMIC_SET_RTC_REG_32(NINGBO2_RTC_SYS_OFFSET_REG,offset);
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
#endif
|
|
case PMIC_803:
|
|
case PMIC_803L:
|
|
case PMIC_807:
|
|
//20200706@xiaokeweng : for PM802 switch the storage of RTC_OFFSET from PMIC-regs into NVM
|
|
//store sys_offset/app_offset/timezone pmic_rtc config into NVM but the pmic-userdata-regs
|
|
m_pmic_rtc_setting.pmic_rtc_setting_sys_offset=offset;
|
|
pmic_rtc_setting_save();
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
//mmi application offset , the 2nd 32bit of user data
|
|
UINT32 PM812_RTC_GET_32B_APP_OFFSET(void)
|
|
{
|
|
UINT32 tmp = 0;
|
|
|
|
if(m_pmic_rtc_offset_storage_type == PMIC_RTC_OFFSET_IN_NVM)
|
|
{
|
|
tmp = m_pmic_rtc_setting.pmic_rtc_setting_app_offset;
|
|
}else{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
tmp = PMIC_GET_RTC_REG_32(NINGBO_RTC_APP_OFFSET_REG);
|
|
break;
|
|
case PMIC_813S:
|
|
tmp = PMIC_GET_RTC_REG_32(NINGBO2_RTC_APP_OFFSET_REG);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
#endif
|
|
case PMIC_803:
|
|
case PMIC_803L:
|
|
case PMIC_807:
|
|
//20200706@xiaokeweng : for PM802 switch the storage of RTC_OFFSET from PMIC-regs into NVM
|
|
//store sys_offset/app_offset/timezone pmic_rtc config into NVM but the pmic-userdata-regs
|
|
tmp = m_pmic_rtc_setting.pmic_rtc_setting_app_offset;
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
return tmp;
|
|
}
|
|
|
|
void PM812_RTC_SET_32B_APP_OFFSET(UINT32 offset)
|
|
{
|
|
if(m_pmic_rtc_offset_storage_type == PMIC_RTC_OFFSET_IN_NVM)
|
|
{
|
|
m_pmic_rtc_setting.pmic_rtc_setting_app_offset=offset;
|
|
pmic_rtc_setting_save();
|
|
}else{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
PMIC_SET_RTC_REG_32(NINGBO_RTC_APP_OFFSET_REG,offset);
|
|
break;
|
|
case PMIC_813S:
|
|
PMIC_SET_RTC_REG_32(NINGBO2_RTC_APP_OFFSET_REG,offset);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
#endif
|
|
//20200904@xiaoke for PM803 storage RTC_OFFSET into NVM follow PM802
|
|
case PMIC_803:
|
|
case PMIC_803L:
|
|
case PMIC_807:
|
|
//20200706@xiaokeweng : for PM802 switch the storage of RTC_OFFSET from PMIC-regs into NVM
|
|
//store sys_offset/app_offset/timezone pmic_rtc config into NVM but the pmic-userdata-regs
|
|
m_pmic_rtc_setting.pmic_rtc_setting_app_offset=offset;
|
|
pmic_rtc_setting_save();
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
//20190513@xiaokeweng : RTC_APP_OFFSET implement --
|
|
//RTC EXPIRE
|
|
UINT32 PM812_RTC_GET_32B_EXPIR_1(void)
|
|
{
|
|
if (!check_if_DCS_mode() && !CHIP_IS_CRANELR && !CHIP_IS_CRANELG && !CHIP_IS_CRANELRH)
|
|
{
|
|
return SCS_GetRtcAlarm();
|
|
}else{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
return PMIC_GET_RTC_REG_32(NINGBO_RTC_EXPIRE1_REG1);
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
return PMIC_GET_RTC_REG_32(GUILIN_RTC_EXPIRE1_REG1);
|
|
#endif
|
|
case PMIC_803:
|
|
//20200904@xiaoke for SCS mode (Single Crystal Scenario)
|
|
return SCS_GetRtcAlarm();
|
|
case PMIC_803L:
|
|
return PMIC_GET_RTC_REG_32(GUILIN_LITE2_RTC_EXPIRE_REG1);
|
|
case PMIC_807:
|
|
return PMIC_GET_RTC_REG_32(GUILIN_LITE3_RTC_EXPIRE_REG1);
|
|
default:
|
|
ASSERT(0);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
//20190513@xiaokeweng : RTC_APP_OFFSET implement ++
|
|
#if 0
|
|
UINT32 PM812_RTC_GET_32B_EXPIR_2()
|
|
{
|
|
if (PMIC_IS_PM812())
|
|
return PMIC_GET_RTC_REG_32(PM812_RTC_EXPIRE2_1_reg);
|
|
else
|
|
return PMIC_GET_RTC_REG_32(NINGBO_RTC_EXPIRE2_REG1);
|
|
|
|
}
|
|
#endif
|
|
//20190513@xiaokeweng : RTC_APP_OFFSET implement --
|
|
void PM812_RTC_SET_32B_EXPIR_1(UINT32 expir)
|
|
{
|
|
if (!check_if_DCS_mode() && !CHIP_IS_CRANELR && !CHIP_IS_CRANELG && !CHIP_IS_CRANELRH)
|
|
{
|
|
SCS_SetRtcAlarm(expir);
|
|
}else{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
PMIC_SET_RTC_REG_32(NINGBO_RTC_EXPIRE1_REG1,expir);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
PMIC_SET_RTC_REG_32(GUILIN_RTC_EXPIRE1_REG1,expir);
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
//20200904@xiaoke for SCS mode (Single Crystal Scenario)
|
|
SCS_SetRtcAlarm(expir);
|
|
break;
|
|
case PMIC_803L:
|
|
PMIC_SET_RTC_REG_32(GUILIN_LITE2_RTC_EXPIRE_REG1,expir);
|
|
if(m_rtc_update_alarm_expire_flag_app == TRUE)
|
|
{
|
|
OSATaskSleep(200); //ensure the EXPIRE regs updated
|
|
m_rtc_update_alarm_expire_flag_app = FALSE;
|
|
}
|
|
break;
|
|
case PMIC_807:
|
|
if(m_rtc_update_alarm_expire_flag_app == TRUE)
|
|
{
|
|
PMIC_SET_RTC_REG_32(GUILIN_LITE3_RTC_EXPIRE_REG1,expir);
|
|
OSATaskSleep(200); //ensure the EXPIRE regs updated
|
|
}
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
#ifdef SCS_BUT_WITHOUT_ALARM_IO_PAD
|
|
internal_rtc_alarm_update();
|
|
#endif//SCS_BUT_WITHOUT_ALARM_IO_PAD
|
|
|
|
PM812_DUMP_STATE();
|
|
}
|
|
|
|
//20190513@xiaokeweng : RTC_APP_OFFSET implement ++
|
|
#if 0
|
|
void PM812_RTC_SET_32B_EXPIR_2(UINT32 expir)
|
|
{
|
|
if (PMIC_IS_PM812())
|
|
return PMIC_SET_RTC_REG_32(PM812_RTC_EXPIRE2_1_reg,expir);
|
|
else if (PMIC_IS_PM802())
|
|
return PMIC_SET_RTC_REG_32(GUILIN_RTC_EXPIRE2_REG1,expir);
|
|
else
|
|
return PMIC_SET_RTC_REG_32(NINGBO_RTC_EXPIRE2_REG1,expir);
|
|
|
|
}
|
|
#endif
|
|
//20190513@xiaokeweng : RTC_APP_OFFSET implement --
|
|
void PM812_RTC_ENABLE_EXPIR_1(void)
|
|
{
|
|
UINT8 tmp;
|
|
|
|
if (!check_if_DCS_mode() && !CHIP_IS_CRANELR && !CHIP_IS_CRANELG && !CHIP_IS_CRANELRH)
|
|
{
|
|
SCS_EnableAlarm();
|
|
}else{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
tmp = PMIC_READ_REG_BASE(NINGBO_RTC_CTRL_REG);
|
|
tmp |= NINGBO_RTC_ALARM_SET1_BIT;
|
|
PMIC_WRITE_REG_BASE(NINGBO_RTC_CTRL_REG,tmp);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_RTC_CTRL_REG);
|
|
tmp |= GUILIN_RTC_ALARM_SET1_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_RTC_CTRL_REG,tmp);
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
//20200904@xiaoke for SCS mode (Single Crystal Scenario)
|
|
SCS_EnableAlarm();
|
|
break;
|
|
case PMIC_803L:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE2_RTC_CTRL_REG);
|
|
tmp |= GUILIN_LITE2_RTC_ALARM_SET_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE2_RTC_CTRL_REG,tmp);
|
|
break;
|
|
case PMIC_807:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE3_RTC_CTRL_REG);
|
|
tmp |= GUILIN_LITE3_RTC_ALARM_SET_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE3_RTC_CTRL_REG,tmp);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//20190618@xiaokeweng : for RTC_alarm adjustment follow RTC_Set update ++
|
|
BOOL PMIC_RTC_GET_EXPIR_1_ENABLE_STATE()
|
|
{
|
|
if (!check_if_DCS_mode() && !CHIP_IS_CRANELR && !CHIP_IS_CRANELG && !CHIP_IS_CRANELRH)
|
|
{
|
|
return SCS_IsAlarmEnabled();
|
|
}else{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
return (PMIC_READ_REG_BASE(NINGBO_RTC_CTRL_REG)&NINGBO_RTC_ALARM_SET1_BIT);
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
return (PMIC_READ_REG_BASE(GUILIN_RTC_CTRL_REG)&GUILIN_RTC_ALARM_SET1_BIT);
|
|
#endif
|
|
case PMIC_803:
|
|
return SCS_IsAlarmEnabled();
|
|
case PMIC_803L:
|
|
return (PMIC_READ_REG_BASE(GUILIN_LITE2_RTC_CTRL_REG)&GUILIN_LITE2_RTC_ALARM_SET_BIT);
|
|
case PMIC_807:
|
|
return (PMIC_READ_REG_BASE(GUILIN_LITE3_RTC_CTRL_REG)&GUILIN_LITE3_RTC_ALARM_SET_BIT);
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
//20190618@xiaokeweng : for RTC_alarm adjustment follow RTC_Set update --
|
|
|
|
|
|
|
|
//20190513@xiaokeweng : RTC_APP_OFFSET implement ++
|
|
#if 0
|
|
void PM812_RTC_ENABLE_EXPIR_2()
|
|
{
|
|
UINT8 tmp;
|
|
if (PMIC_IS_PM812())
|
|
{
|
|
tmp = PMIC_READ_REG_BASE(PM812_RTC_CONTROL_REG);
|
|
tmp |= PM812_RTC_ALARM_SET2_BIT;
|
|
PMIC_WRITE_REG_BASE(PM812_RTC_CONTROL_REG,tmp);
|
|
}
|
|
else if (PMIC_IS_PM802())
|
|
{
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_RTC_CTRL_REG);
|
|
tmp |= GUILIN_RTC_ALARM_SET2_BIT;
|
|
PMIC_WRITE_REG_BASE(GUILIN_RTC_CTRL_REG,tmp);
|
|
}
|
|
else
|
|
{
|
|
tmp = PMIC_READ_REG_BASE(NINGBO_RTC_CTRL_REG);
|
|
tmp |= NINGBO_RTC_ALARM_SET2_BIT;
|
|
PMIC_WRITE_REG_BASE(NINGBO_RTC_CTRL_REG,tmp);
|
|
}
|
|
}
|
|
|
|
//20190618@xiaokeweng : for RTC_alarm adjustment follow RTC_Set update ++
|
|
BOOL PMIC_RTC_GET_EXPIR_2_ENABLE_STATE()
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
case PMIC_812:
|
|
return (PMIC_READ_REG_BASE(PM812_RTC_CONTROL_REG)&PM812_RTC_ALARM_SET2_BIT);
|
|
case PMIC_813:
|
|
return (PMIC_READ_REG_BASE(NINGBO_RTC_CTRL_REG)&NINGBO_RTC_ALARM_SET2_BIT);
|
|
case PMIC_802:
|
|
return (PMIC_READ_REG_BASE(GUILIN_RTC_CTRL_REG)&GUILIN_RTC_ALARM_SET2_BIT);
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
//20190618@xiaokeweng : for RTC_alarm adjustment follow RTC_Set update --
|
|
#endif
|
|
//20190513@xiaokeweng : RTC_APP_OFFSET implement --
|
|
void PM812_RTC_DISABLE_EXPIR_1(void)
|
|
{
|
|
UINT8 tmp;
|
|
|
|
if (!check_if_DCS_mode() && !CHIP_IS_CRANELR && !CHIP_IS_CRANELG && !CHIP_IS_CRANELRH)
|
|
{
|
|
SCS_DisableAlarm();
|
|
}else{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
tmp = PMIC_READ_REG_BASE(NINGBO_RTC_CTRL_REG);
|
|
tmp &= (~NINGBO_RTC_ALARM_SET1_BIT);
|
|
PMIC_WRITE_REG_BASE(NINGBO_RTC_CTRL_REG,tmp);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_RTC_CTRL_REG);
|
|
tmp &= (~GUILIN_RTC_ALARM_SET1_BIT);
|
|
PMIC_WRITE_REG_BASE(GUILIN_RTC_CTRL_REG,tmp);
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
SCS_DisableAlarm();
|
|
break;
|
|
case PMIC_803L:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE2_RTC_CTRL_REG);
|
|
tmp &= (~GUILIN_LITE2_RTC_ALARM_SET_BIT);
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE2_RTC_CTRL_REG,tmp);
|
|
break;
|
|
case PMIC_807:
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE3_RTC_CTRL_REG);
|
|
tmp &= (~GUILIN_LITE3_RTC_ALARM_SET_BIT);
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE3_RTC_CTRL_REG,tmp);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//20190513@xiaokeweng : RTC_APP_OFFSET implement ++
|
|
#if 0
|
|
void PM812_RTC_DISABLE_EXPIR_2()
|
|
{
|
|
UINT8 tmp;
|
|
if (PMIC_IS_PM812())
|
|
{
|
|
tmp = PMIC_READ_REG_BASE(PM812_RTC_CONTROL_REG);
|
|
tmp &= (~PM812_RTC_ALARM_SET2_BIT);
|
|
PMIC_WRITE_REG_BASE(PM812_RTC_CONTROL_REG,tmp);
|
|
}
|
|
else if (PMIC_IS_PM802())
|
|
{
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_RTC_CTRL_REG);
|
|
tmp &= (~GUILIN_RTC_ALARM_SET2_BIT);
|
|
PMIC_WRITE_REG_BASE(GUILIN_RTC_CTRL_REG,tmp);
|
|
}
|
|
else
|
|
{
|
|
tmp = PMIC_READ_REG_BASE(NINGBO_RTC_CTRL_REG);
|
|
tmp &= (~NINGBO_RTC_ALARM_SET2_BIT);
|
|
PMIC_WRITE_REG_BASE(NINGBO_RTC_CTRL_REG,tmp);
|
|
}
|
|
}
|
|
#endif
|
|
//20190513@xiaokeweng : RTC_APP_OFFSET implement --
|
|
|
|
static UINT32 PM812_GET_INT_TO_HOST_ENABLE_REG()
|
|
{
|
|
COUNTER_32 tmp;
|
|
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
tmp.cnt_8[3] = PMIC_READ_REG_BASE(NINGBO_INT_ENABLE_REG1);
|
|
tmp.cnt_8[2] = PMIC_READ_REG_BASE(NINGBO_INT_ENABLE_REG2);
|
|
tmp.cnt_8[1] = 0;
|
|
tmp.cnt_8[0] = 0;
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
tmp.cnt_8[3] = PMIC_READ_REG_BASE(GUILIN_INT_ENABLE_REG1);
|
|
tmp.cnt_8[2] = PMIC_READ_REG_BASE(GUILIN_INT_ENABLE_REG2);
|
|
tmp.cnt_8[1] = 0;
|
|
tmp.cnt_8[0] = 0;
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
tmp.cnt_8[3] = PMIC_READ_REG_BASE(GUILIN_LITE_INT_ENABLE_REG1);
|
|
tmp.cnt_8[2] = 0;
|
|
tmp.cnt_8[1] = 0;
|
|
tmp.cnt_8[0] = 0;
|
|
break;
|
|
case PMIC_803L:
|
|
tmp.cnt_8[3] = PMIC_READ_REG_BASE(GUILIN_LITE2_INT_ENABLE_REG1);
|
|
tmp.cnt_8[2] = 0;
|
|
tmp.cnt_8[1] = 0;
|
|
tmp.cnt_8[0] = 0;
|
|
break;
|
|
case PMIC_807:
|
|
tmp.cnt_8[3] = PMIC_READ_REG_BASE(GUILIN_LITE3_INT_ENABLE_REG1);
|
|
tmp.cnt_8[2] = 0;
|
|
tmp.cnt_8[1] = 0;
|
|
tmp.cnt_8[0] = 0;
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
}
|
|
|
|
return tmp.cnt_32;
|
|
}
|
|
|
|
static UINT32 PMIC_GET_INT_STATUS_SNAPSHOT()
|
|
{
|
|
//NOTICE: once PMIC_INTn status REG readed by master processor
|
|
// the PMIC_INTn would auto clear by PMIC , so snapshot the
|
|
// val for debug , func should only internal invoke by pmic.c
|
|
COUNTER_32 tmp;
|
|
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
//reconfigure interrupt mode
|
|
PMIC_WRITE_REG_BASE(NINGBO_MISC_CFG_REG2, 0x0);
|
|
tmp.cnt_8[3] = PMIC_READ_REG_BASE(NINGBO_INT_STATUS_REG1);
|
|
tmp.cnt_8[2] = PMIC_READ_REG_BASE(NINGBO_INT_STATUS_REG2);
|
|
tmp.cnt_8[1] = PMIC_READ_REG_BASE(NINGBO2_INT_STATUS_REG3);
|
|
tmp.cnt_8[0] = PMIC_READ_REG_BASE(NINGBO2_INT_STATUS_REG4);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
tmp.cnt_8[3] = 0;
|
|
tmp.cnt_8[2] = 0;
|
|
tmp.cnt_8[1] = PMIC_READ_REG_BASE(GUILIN_INT_STATUS_REG1);
|
|
tmp.cnt_8[0] = PMIC_READ_REG_BASE(GUILIN_INT_STATUS_REG2);
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
tmp.cnt_8[3] = 0;
|
|
tmp.cnt_8[2] = 0;
|
|
tmp.cnt_8[1] = 0;
|
|
tmp.cnt_8[0] = PMIC_READ_REG_BASE(GUILIN_LITE_INT_STATUS_REG1);
|
|
break;
|
|
case PMIC_803L:
|
|
tmp.cnt_8[3] = 0;
|
|
tmp.cnt_8[2] = 0;
|
|
tmp.cnt_8[1] = 0;
|
|
tmp.cnt_8[0] = PMIC_READ_REG_BASE(GUILIN_LITE2_INT_STATUS_REG1);
|
|
break;
|
|
case PMIC_807:
|
|
tmp.cnt_8[3] = 0;
|
|
tmp.cnt_8[2] = 0;
|
|
tmp.cnt_8[1] = 0;
|
|
tmp.cnt_8[0] = PMIC_READ_REG_BASE(GUILIN_LITE3_INT_STATUS_REG1);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
}
|
|
|
|
return tmp.cnt_32;
|
|
}
|
|
|
|
UINT32 PMIC_GET_INT_TO_HOST_STATUS_REG()
|
|
{
|
|
last_pmic_int_status = PMIC_GET_INT_STATUS_SNAPSHOT();
|
|
return last_pmic_int_status;
|
|
}
|
|
|
|
void PMIC_CLEAR_INT_TO_HOST_STATUS_REG()
|
|
{
|
|
UINT32 tmp=0;
|
|
UINT32 try_times=0;
|
|
|
|
tmp = PMIC_GET_INT_STATUS_SNAPSHOT();
|
|
PMIC_UART_DEBUG("[%s] ++ to read clean int_reg=[%x]\r\n",__func__,tmp);
|
|
while(tmp){
|
|
tmp = PMIC_GET_INT_STATUS_SNAPSHOT();
|
|
PMIC_UART_DEBUG("[%s] WARNING failed to read clean int_reg=[%x]\r\n",__func__,tmp);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
static void PM812_PRE_REG_SNAPSHOT()
|
|
{
|
|
UINT8 tmp = PM812_RTC_GET_CONTROL_REG();
|
|
}
|
|
|
|
//TODO:RTC TRIM need or NTP sync ?
|
|
|
|
//enable/disable the INT report to master processer
|
|
static void PM812_INT_TO_HOST_ENABLE(PM812_INTC intc)
|
|
{
|
|
UINT8 reg_addr = PM812_INTC_TO_ENABLE_REG(intc);
|
|
UINT8 tmp = PMIC_READ_REG_BASE(reg_addr);
|
|
tmp |= PM812_INTC_TO_ENABLE_BIT(intc);
|
|
PMIC_WRITE_REG_BASE(reg_addr,tmp);
|
|
}
|
|
static void PM812_INT_TO_HOST_DISABLE(PM812_INTC intc)
|
|
{
|
|
UINT8 reg_addr = PM812_INTC_TO_ENABLE_REG(intc);
|
|
UINT8 tmp = PMIC_READ_REG_BASE(reg_addr);
|
|
tmp &= (~(PM812_INTC_TO_ENABLE_BIT(intc)));
|
|
PMIC_WRITE_REG_BASE(reg_addr,tmp);
|
|
}
|
|
|
|
//ICAT EXPORTED FUNCTION - SW_PLAT,PM812,DUMP_STATE
|
|
void PM812_DUMP_STATE(void)
|
|
{
|
|
//power up / down log
|
|
PMIC_UART_DEBUG("[PMIC] power_up_reason =[0x%x]\r\n",power_up_reason);
|
|
PMIC_UART_DEBUG("[PMIC] power_down_reason =[0x%x]\r\n",power_down_reason);
|
|
PMIC_UART_DEBUG("[PMIC] power_down_reason2 =[0x%x]\r\n",power_down_reason2);
|
|
PMIC_UART_DEBUG("[PMIC] last_pmic_int_status =[0x%x]\r\n",last_pmic_int_status);
|
|
|
|
//RTC count
|
|
PMIC_UART_DEBUG("[PMIC] RTC_GET_32B_COUNTER =[0x%x]\r\n",PM812_RTC_GET_32B_COUNTER());
|
|
PMIC_UART_DEBUG("[PMIC] RTC_GET_32B_EXPIR_1 =[0x%x]\r\n",PM812_RTC_GET_32B_EXPIR_1());
|
|
PMIC_UART_DEBUG("[PMIC] RTC_GET_CONTROL_REG =[0x%x]\r\n",PM812_RTC_GET_CONTROL_REG());
|
|
PMIC_UART_DEBUG("[PMIC] GET_INT_TO_HOST_ENABLE_REG =[0x%x]\r\n",PM812_GET_INT_TO_HOST_ENABLE_REG());
|
|
PMIC_UART_DEBUG("[PMIC] RTC_GET_32B_APP_OFFSET =[0x%x]\r\n",PM812_RTC_GET_32B_APP_OFFSET());
|
|
PMIC_UART_DEBUG("[PMIC] RTC_GET_32B_SYS_OFFSET =[0x%x]\r\n",PM812_RTC_GET_32B_SYS_OFFSET());
|
|
}
|
|
|
|
static void PM812_POWER_UP_ACTIONS()
|
|
{
|
|
//storage alarm power status
|
|
PM812_PRE_REG_SNAPSHOT();
|
|
|
|
//read PMIC_INT to reset all PMIC_INT_STATUS reltated reg
|
|
PMIC_CLEAR_INT_TO_HOST_STATUS_REG();
|
|
|
|
//power up log & power down log
|
|
power_up_reason = PM812_GET_POWER_UP_LOG();
|
|
PM812_CLR_POWER_UP_LOG(power_up_reason);
|
|
power_down_reason = PM812_GET_POWER_DOWN_LOG();
|
|
PM812_CLR_POWER_DOWN_LOG(power_down_reason);
|
|
power_down_reason2 = PM812_GET_POWER_DOWN_LOG2();
|
|
PM812_CLR_POWER_DOWN_LOG2(power_down_reason2);
|
|
}
|
|
|
|
UINT8 PM812_GET_POWER_UP_REASON(void)
|
|
{
|
|
return power_up_reason;
|
|
}
|
|
|
|
UINT8 PM812_GET_POWER_DOWN_REASON(void)
|
|
{
|
|
return power_down_reason;
|
|
}
|
|
|
|
UINT8 PM812_GET_POWER_DOWN_REASON2(void)
|
|
{
|
|
return power_down_reason2;
|
|
}
|
|
|
|
BOOL PMIC_IS_ALARM_TRIGGERD_POWERUP(void){
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
if(!check_if_DCS_mode()){
|
|
return (PM812_GET_POWER_UP_REASON() & NINGBO_EXTON1_WAKEUP_BIT)?TRUE:FALSE;
|
|
}else{
|
|
return (PM812_GET_POWER_UP_REASON() & NINGBO_RTC_ALARM_WU_BIT)?TRUE:FALSE;
|
|
}
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
if(!check_if_DCS_mode()){
|
|
return (PM812_GET_POWER_UP_REASON() & GUILIN_EXTON1_INT_OCCURRED)?TRUE:FALSE;
|
|
}else{
|
|
return (PM812_GET_POWER_UP_REASON() & GUILIN_RTC_INT_OCCURRED)?TRUE:FALSE;
|
|
}
|
|
#endif
|
|
case PMIC_803:
|
|
return (PM812_GET_POWER_UP_REASON() & GUILIN_LITE_RTC_INT_OCCURRED)?TRUE:FALSE;
|
|
case PMIC_803L:
|
|
return (PM812_GET_POWER_UP_REASON() & GUILIN_LITE2_RTC_INT_OCCURRED)?TRUE:FALSE;
|
|
case PMIC_807:
|
|
return (PM812_GET_POWER_UP_REASON() & GUILIN_LITE3_RTC_INT_OCCURRED)?TRUE:FALSE;
|
|
default:
|
|
ASSERT(0);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
BOOL PMIC_ID_GET(void)
|
|
{
|
|
if (pmic_id == PMIC_UNAVAILABLE){
|
|
RTI_LOG("GetPMICID = 0x%02x\r\n",GetPMICID());
|
|
pmic_id = (GetPMICID()&0xF8)>>3;//initial pmic_id after boot
|
|
}
|
|
return pmic_id;
|
|
}
|
|
|
|
BOOL PMIC_COMP_ID_GET(void)
|
|
{
|
|
static UINT8 pmic_complete_id = PMIC_UNAVAILABLE;
|
|
if (pmic_complete_id == PMIC_UNAVAILABLE)
|
|
pmic_complete_id = GetPMICID();
|
|
return pmic_complete_id;
|
|
}
|
|
|
|
/* Following APIs reflect PMIC series. */
|
|
BOOL PMIC_IS_PM812(void)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL PMIC_IS_PM813(void)
|
|
{
|
|
return ((PMIC_ID_GET() == PMIC_813)||(PMIC_ID_GET() == PMIC_813A3));
|
|
}
|
|
|
|
BOOL PMIC_IS_PM813_A1(void)
|
|
{
|
|
return (PMIC_COMP_ID_GET() == PMIC_813_A1);
|
|
}
|
|
|
|
BOOL PMIC_IS_PM813_A2(void)
|
|
{
|
|
return (PMIC_COMP_ID_GET() == PMIC_813_A2);
|
|
}
|
|
|
|
BOOL PMIC_IS_PM813_A3(void)
|
|
{
|
|
return (PMIC_COMP_ID_GET() == PMIC_813_A3);
|
|
}
|
|
|
|
BOOL PMIC_IS_PM802(void)
|
|
{
|
|
return (PMIC_ID_GET() == PMIC_802);
|
|
}
|
|
|
|
BOOL PMIC_IS_PM803(void)
|
|
{
|
|
return (PMIC_ID_GET() == PMIC_803);
|
|
}
|
|
|
|
BOOL PMIC_IS_PM813S(void)
|
|
{
|
|
return (PMIC_ID_GET() == PMIC_813S);
|
|
}
|
|
|
|
BOOL PMIC_IS_PM813S_A0(void)
|
|
{
|
|
return (PMIC_COMP_ID_GET() == PMIC_813S_A0);
|
|
}
|
|
|
|
BOOL PMIC_IS_PM802S(void)
|
|
{
|
|
return (PMIC_ID_GET() == PMIC_802S);
|
|
}
|
|
|
|
BOOL PMIC_IS_PM803L(void)
|
|
{
|
|
return (PMIC_ID_GET() == PMIC_803L);
|
|
}
|
|
|
|
BOOL PMIC_IS_PM813L(void)
|
|
{
|
|
return (PMIC_ID_GET() == PMIC_813L);
|
|
}
|
|
|
|
BOOL PMIC_IS_PM807(void)
|
|
{
|
|
return (PMIC_ID_GET() == PMIC_807);
|
|
}
|
|
|
|
OSTaskRef PmicHisrTask;
|
|
#ifdef QUECTEL_PROJECT_CUST
|
|
unsigned char PmicHisrTask_Stack[PMIC_HISR_STACK_SIZE];
|
|
#else
|
|
#if (defined(LTEONLY_THIN) || defined(LTEGSM_THIN))
|
|
unsigned char PmicHisrTask_Stack[1024];
|
|
#else
|
|
unsigned char PmicHisrTask_Stack[2048];
|
|
#endif
|
|
#endif
|
|
OSFlagRef PmicHisrTask_FlgRef;
|
|
|
|
static void PMICHISRTask(void);
|
|
|
|
#ifdef SCS_BUT_WITHOUT_ALARM_IO_PAD
|
|
OSTaskRef no_alarm_io_PmicHisrTask;
|
|
unsigned char no_alarm_io_PmicHisrTask_Stack[2048];
|
|
OSFlagRef no_alarm_io_PmicHisrTask_FlgRef;
|
|
static void no_alarm_io_PMICHISRTask(void);
|
|
|
|
|
|
void internal_rtc_alarm_update(void){
|
|
UINT32 offset = 0;
|
|
|
|
offset = PM812_RTC_GET_32B_EXPIR_1() - PM812_RTC_GET_32B_COUNTER();
|
|
PMIC_UART_DEBUG("[NO_ALARM_IO][%s]offset =[%x]\r\n",__func__,offset);
|
|
|
|
RtcHwRegisters.RTAR = RtcHwRegisters.RCNR + (offset);
|
|
PMIC_UART_DEBUG("[NO_ALARM_IO][%s]RtcHwRegisters.RCNR=[%x]\r\n",__func__,RtcHwRegisters.RCNR);
|
|
PMIC_UART_DEBUG("[NO_ALARM_IO][%s]RtcHwRegisters.RTAR=[%x]\r\n",__func__,RtcHwRegisters.RTAR);
|
|
}
|
|
|
|
void no_alarm_rtc_alarm_enable(BOOL onoff){
|
|
//translate from below refer to RTC_stub.c:
|
|
//onoff?RTC_ALARM_ENABLE:RTC_ALARM_DISABLE;
|
|
//
|
|
PMIC_UART_DEBUG("[NO_ALARM_IO][%s][%d]",__func__,onoff);
|
|
if(onoff){
|
|
RtcHwRegisters.RTSR = (RtcHwRegisters.RTSR|0x04)&~0x03;
|
|
INTCEnable(INTC_SRC_RTC_ALARM);
|
|
}else{
|
|
INTCDisable(INTC_SRC_RTC_ALARM);
|
|
RtcHwRegisters.RTSR = (RtcHwRegisters.RTSR & ~0x04)&~0x03;
|
|
}
|
|
}
|
|
|
|
void no_alarm_io_rtc_signal_clear(void){
|
|
//translate from below refer to RTC_stub.c:
|
|
//RTC_AL_BIT_CLEAR;
|
|
//
|
|
PMIC_UART_DEBUG("[NO_ALARM_IO][%s]",__func__);
|
|
RtcHwRegisters.RTSR = ((RtcHwRegisters.RTSR & (0x0c)) | 0x01);
|
|
}
|
|
#endif//SCS_BUT_WITHOUT_ALARM_IO_PAD
|
|
|
|
|
|
extern void cpu_dvc_init(void);
|
|
extern unsigned char CRN_SVC_FP[];
|
|
|
|
void cfg_pmic_dvc_level_by_svc_data(void)
|
|
{
|
|
unsigned char var;
|
|
|
|
switch (PMIC_ID_GET()){
|
|
#if !defined(NOT_SUPPORT_PM803)
|
|
case PMIC_803:
|
|
GuilinLiteWrite( GUILIN_LITE_POWER_Reg, GUILIN_LITE_VBUCK1_DVC_VOUT_REG_SET0, CRN_SVC_FP[0] );//416
|
|
GuilinLiteWrite( GUILIN_LITE_POWER_Reg, GUILIN_LITE_VBUCK1_DVC_VOUT_REG_SET1, CRN_SVC_FP[1] );//499
|
|
GuilinLiteWrite( GUILIN_LITE_POWER_Reg, GUILIN_LITE_VBUCK1_DVC_VOUT_REG_SET2, CRN_SVC_FP[2] );//624
|
|
GuilinLiteWrite( GUILIN_LITE_POWER_Reg, GUILIN_LITE_VBUCK1_DVC_VOUT_REG_SET3, CRN_SVC_FP[3] );//832
|
|
GuilinLiteRead( GUILIN_LITE_POWER_Reg, GUILIN_LITE_VBUCK1_SLEEP_VOUT_REG, &var );
|
|
GuilinLiteWrite( GUILIN_LITE_POWER_Reg, GUILIN_LITE_VBUCK1_SLEEP_VOUT_REG, (var|(0x1<<7))); //enable DVC_buck1
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
GuilinWrite( GUILIN_POWER_Reg, GUILIN_VBUCK1_DVC_VOUT_REG_SET0, CRN_SVC_FP[0] );//416
|
|
GuilinWrite( GUILIN_POWER_Reg, GUILIN_VBUCK1_DVC_VOUT_REG_SET1, CRN_SVC_FP[1] );//499
|
|
GuilinWrite( GUILIN_POWER_Reg, GUILIN_VBUCK1_DVC_VOUT_REG_SET2, CRN_SVC_FP[2] );//624
|
|
GuilinWrite( GUILIN_POWER_Reg, GUILIN_VBUCK1_DVC_VOUT_REG_SET3, CRN_SVC_FP[3] );//832
|
|
GuilinRead( GUILIN_POWER_Reg, GUILIN_VBUCK1_SLEEP_VOUT_REG, &var );
|
|
GuilinWrite( GUILIN_POWER_Reg, GUILIN_VBUCK1_SLEEP_VOUT_REG, (var|(0x1<<7))); //enable DVC_buck1
|
|
break;
|
|
case PMIC_802S:
|
|
GuilinWrite( GUILIN_POWER_Reg, GUILIN2_VBUCK1_DVC_VOUT_REG_SET0, CRN_SVC_FP[0] );//416
|
|
GuilinWrite( GUILIN_POWER_Reg, GUILIN2_VBUCK1_DVC_VOUT_REG_SET1, CRN_SVC_FP[1] );//499
|
|
GuilinWrite( GUILIN_POWER_Reg, GUILIN2_VBUCK1_DVC_VOUT_REG_SET2, CRN_SVC_FP[2] );//624
|
|
GuilinWrite( GUILIN_POWER_Reg, GUILIN2_VBUCK1_DVC_VOUT_REG_SET3, CRN_SVC_FP[3] );//832
|
|
GuilinRead( GUILIN_POWER_Reg, GUILIN_VBUCK1_SLEEP_VOUT_REG, &var );
|
|
GuilinWrite( GUILIN_POWER_Reg, GUILIN_VBUCK1_SLEEP_VOUT_REG, (var|(0x1<<7))); //enable DVC_buck1
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
NingboWrite( NINGBO_POWER_Reg, NINGBO_VBUCK1_DVC_VOUT_REG_SET0, CRN_SVC_FP[0] );//416
|
|
NingboWrite( NINGBO_POWER_Reg, NINGBO_VBUCK1_DVC_VOUT_REG_SET1, CRN_SVC_FP[1] );//499
|
|
NingboWrite( NINGBO_POWER_Reg, NINGBO_VBUCK1_DVC_VOUT_REG_SET2, CRN_SVC_FP[2] );//624
|
|
NingboWrite( NINGBO_POWER_Reg, NINGBO_VBUCK1_DVC_VOUT_REG_SET3, CRN_SVC_FP[3] );//832
|
|
NingboRead( NINGBO_POWER_Reg, NINGBO_VBUCK1_SLEEP_VOUT_REG, &var );
|
|
NingboWrite( NINGBO_POWER_Reg, NINGBO_VBUCK1_SLEEP_VOUT_REG, (var|(0x1<<7))); //enable DVC_buck1
|
|
break;
|
|
#endif
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void PMIC_Phase1Init(void)
|
|
{
|
|
OSA_STATUS osStatus = OS_SUCCESS;
|
|
unsigned char var = 0;
|
|
PMIC_UART_DEBUG("PMIC_Phase1Init\r\n");
|
|
|
|
osStatus = OSASemaphoreCreate (&I2CApp_SemaRef,1,OSA_FIFO);
|
|
ASSERT(osStatus == OS_SUCCESS);
|
|
osStatus = OSAFlagCreate( &PmicHisrTask_FlgRef );
|
|
ASSERT( osStatus == OS_SUCCESS );
|
|
#ifdef QUECTEL_PROJECT_CUST
|
|
osStatus = OSATaskCreate( &PmicHisrTask, PmicHisrTask_Stack, PMIC_HISR_STACK_SIZE, 45, "pmic_HISR_T", (void (*)(void *))PMICHISRTask, NULL );
|
|
#else
|
|
#if (defined(LTEONLY_THIN) || defined(LTEGSM_THIN))
|
|
osStatus = OSATaskCreate( &PmicHisrTask, PmicHisrTask_Stack, 1024, 45, "pmic_HISR_T", (void (*)(void *))PMICHISRTask, NULL );
|
|
#else
|
|
osStatus = OSATaskCreate( &PmicHisrTask, PmicHisrTask_Stack, 2048, 45, "pmic_HISR_T", (void (*)(void *))PMICHISRTask, NULL );
|
|
#endif
|
|
#endif
|
|
ASSERT(osStatus == OS_SUCCESS);
|
|
|
|
#ifdef SCS_BUT_WITHOUT_ALARM_IO_PAD
|
|
osStatus = OSAFlagCreate( &no_alarm_io_PmicHisrTask_FlgRef );
|
|
ASSERT( osStatus == OS_SUCCESS );
|
|
osStatus = OSATaskCreate( &no_alarm_io_PmicHisrTask
|
|
, no_alarm_io_PmicHisrTask_Stack
|
|
, 2048, 45, "mrtc_HISR_T"
|
|
, (void (*)(void *))no_alarm_io_PMICHISRTask
|
|
, NULL );
|
|
ASSERT(osStatus == OS_SUCCESS);
|
|
#endif//SCS_BUT_WITHOUT_ALARM_IO_PAD
|
|
|
|
usticaInit(); //init clock and TWSI ctrl
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
memset( mGuilinIntHandler, 0 , sizeof(mGuilinIntHandler[GUILIN_INTC_MAX+1]));
|
|
#if 1 //set to 10pf once if cap is 20pf in default
|
|
if (check_if_DCS_mode())
|
|
{
|
|
GuilinRead( GUILIN_BASE_Reg, GUILIN_CRYSTAL_CAP_SET_REG, &var );
|
|
if( (var&0xE0) != 0x20)
|
|
{
|
|
var &= ~0xE0;
|
|
var |= 0x20;
|
|
GuilinWrite( GUILIN_BASE_Reg, GUILIN_CRYSTAL_CAP_SET_REG, var );
|
|
}
|
|
}
|
|
#endif
|
|
Guilin_Aditional_Workaround();
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
#if 1 //set to 10pf once if cap is 20pf in default
|
|
if (check_if_DCS_mode())
|
|
{
|
|
NingboRead( NINGBO_BASE_Reg, NINGBO_CRYSTAL_CAP_SET_REG, &var );
|
|
if( (var&0xE0) != 0x20)
|
|
{
|
|
var &= ~0xE0;
|
|
var |= 0x20;
|
|
NingboWrite( NINGBO_BASE_Reg, NINGBO_CRYSTAL_CAP_SET_REG, var );
|
|
}
|
|
}
|
|
#endif
|
|
memset( mNingboIntHandler, 0 , sizeof(mNingboIntHandler[NINGBO_INTC_MAX+1]));
|
|
Ningbo_Aditional_Workaround();
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM803)
|
|
case PMIC_803:
|
|
memset( mGuilinLiteIntHandler, 0 , sizeof(mGuilinLiteIntHandler[GUILIN_LITE_INTC_MAX+1]));
|
|
GuilinLite_Aditional_Workaround();
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM803L)
|
|
case PMIC_803L:
|
|
memset( mGuilinLite2IntHandler, 0 , sizeof(mGuilinLite2IntHandler[GUILIN_LITE2_INTC_MAX+1]));
|
|
GuilinLite2_Aditional_Workaround();
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM807)
|
|
case PMIC_807:
|
|
memset( mGuilinLite3IntHandler, 0 , sizeof(mGuilinLite3IntHandler[GUILIN_LITE3_INTC_MAX+1]));
|
|
GuilinLite3_Aditional_Workaround();
|
|
break;
|
|
#endif
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
|
|
Crane_Get_Svc_Level_Values(); //get voltage values for each DVC level
|
|
|
|
/* raise more steps(1~4) if need by cust, it must be called at here */
|
|
Crane_Set_Svc_cust(0);
|
|
|
|
cpu_dvc_init();
|
|
cfg_pmic_dvc_level_by_svc_data();
|
|
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
if (PMIC_IS_PM813()||PMIC_IS_PM813S())
|
|
{
|
|
#if !defined (ENABLE_SLT_FEATURE)
|
|
Ningbo_SoftwareNotProceedUntilReach3400();
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#ifdef QUECTEL_PROJECT_CUST
|
|
if(PMIC_IS_PM803())
|
|
{
|
|
unsigned char *reg;
|
|
extern const char* asr_property_get(const char *name);
|
|
reg = (unsigned char *)asr_property_get("power_down_reg");
|
|
|
|
//power up log & power down log
|
|
power_up_reason = PM812_GET_POWER_UP_LOG();
|
|
power_down_reason = reg[2];
|
|
power_down_reason2 = reg[3];
|
|
hot_power_flag = reg[5];
|
|
// ref@preboot pmic.c pmic_setup()
|
|
if(power_down_reason == 0xFF)
|
|
{
|
|
power_down_reason = 0x0;
|
|
}
|
|
if(power_down_reason2 == 0xFF)
|
|
{
|
|
power_down_reason2 = 0x0;
|
|
}
|
|
if(hot_power_flag == 0xFF)
|
|
{
|
|
hot_power_flag = 0x0;
|
|
}
|
|
|
|
}
|
|
else if(PMIC_IS_PM803L() || PMIC_IS_PM807())
|
|
{
|
|
|
|
unsigned char *reg;
|
|
extern const char* asr_property_get(const char *name);
|
|
reg = (unsigned char *)asr_property_get("power_down_reg");
|
|
|
|
//power up log & power down log
|
|
PM812_POWER_UP_ACTIONS();//pmic803L的寄存器需要写1后才能清除,同803读清除机制不同
|
|
power_down_reason = reg[2];
|
|
power_down_reason2 = reg[3];
|
|
hot_power_flag = reg[5];
|
|
// ref@preboot pmic.c pmic_setup()
|
|
if(power_down_reason == 0xFF)
|
|
{
|
|
power_down_reason = 0x0;
|
|
}
|
|
if(power_down_reason2 == 0xFF)
|
|
{
|
|
power_down_reason2 = 0x0;
|
|
}
|
|
if(hot_power_flag == 0xFF)
|
|
{
|
|
hot_power_flag = 0x0;
|
|
}
|
|
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
|
|
//to storage the power up reason log
|
|
PM812_POWER_UP_ACTIONS();
|
|
}
|
|
//PM813_VBUS_int(); disable USB connection by pmic INT
|
|
|
|
pmic_rtc_offset_storage_type_detect();
|
|
}
|
|
|
|
static OS_HISR g_pmic_hisr_ref;
|
|
|
|
static void PMICHISRTask(void)
|
|
{
|
|
UINT32 flag_value = 0;
|
|
PmicCallback isr;
|
|
COUNTER_32 tmp;
|
|
UINT8 intc;
|
|
OSA_STATUS status = OS_SUCCESS;
|
|
|
|
while(1)
|
|
{
|
|
status = OSAFlagWait( PmicHisrTask_FlgRef, 0x01, OSA_FLAG_OR_CLEAR,&flag_value, OSA_SUSPEND );
|
|
ASSERT( status == OS_SUCCESS );
|
|
if( flag_value & 0x01 )
|
|
{
|
|
//0. storage RTC_STATUS firstly it would be auto clear once PMIC_INT_STATUS read
|
|
PM812_PRE_REG_SNAPSHOT();
|
|
|
|
//1. read PMIC_INT_STATUS_REG_1 + 2
|
|
UINT32 int_status = PMIC_GET_INT_TO_HOST_STATUS_REG();
|
|
// uart_printf("pmcint:%x\r\n",int_status);
|
|
|
|
//2. check and handle with callback isr func
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S: //use 813 ints temply.
|
|
{
|
|
for(intc=0;intc<=NINGBO_INTC_MAX;intc++)
|
|
{
|
|
if(mNingboIntHandler[intc].pmic_intc_enabled && (int_status & NINGBO_INTC_TO_STATUS_BIT(intc)))
|
|
{
|
|
if (PMIC_IS_PM813_A1())
|
|
if (intc == NINGBO_VBUS_UVLO_INT)
|
|
Ningbo_INT_DISABLE(NINGBO_VBUS_UVLO_INT); //disable uvlo int here.
|
|
|
|
#if PMIC_DEBUG
|
|
DIAG_FILTER(SW_PLAT, PMIC, PMIC_HISR_FUNC2, DIAG_INFORMATION)
|
|
diagPrintf ("PM813(S) HISR: intc %d", intc);
|
|
#endif
|
|
mNingboIntHandler[intc].pmic_intc_enabled = FALSE;
|
|
|
|
if(!check_if_DCS_mode()){
|
|
if (int_status & NINGBO_INTC_TO_STATUS_BIT(NINGBO_EXTON1_INT)) {
|
|
//force clear SCS WAKEUP SIGNAL
|
|
SCS_ClearWakeupSignal();
|
|
//the SCS WAKEUP SIGNAL clear may trigger another PMIC RTC intterrupt
|
|
//caused (Basepage,0x05)=0x4 marked, which take side effect to the next SCS RTC intterrput.
|
|
//therefore, do another read action to clean as below.
|
|
PMIC_CLEAR_INT_TO_HOST_STATUS_REG();
|
|
}
|
|
}
|
|
|
|
isr = mNingboIntHandler[intc].pmic_isr;
|
|
if(isr)
|
|
(isr)();//call isr func
|
|
else
|
|
PMIC_UART_DEBUG("No PMIC int callback!\r\n");
|
|
mNingboIntHandler[intc].pmic_intc_enabled = TRUE;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
{
|
|
for(intc=0;intc<=GUILIN_INTC_MAX;intc++)
|
|
{
|
|
if(mGuilinIntHandler[intc].pmic_intc_enabled && (int_status & GUILIN_INTC_TO_STATUS_BIT(intc)))
|
|
{
|
|
#if PMIC_DEBUG
|
|
DIAG_FILTER(SW_PLAT, PMIC, PMIC_HISR_FUNC3, DIAG_INFORMATION)
|
|
diagPrintf ("PM802 HISR: intc %d", intc);
|
|
#endif
|
|
mGuilinIntHandler[intc].pmic_intc_enabled = FALSE;
|
|
|
|
if(!check_if_DCS_mode()){
|
|
if (int_status & GUILIN_INTC_TO_STATUS_BIT(GUILIN_EXTON1_INT)) {
|
|
//force clear SCS WAKEUP SIGNAL
|
|
SCS_ClearWakeupSignal();
|
|
//the SCS WAKEUP SIGNAL clear may trigger another PMIC RTC intterrupt
|
|
//caused (Basepage,0x05)=0x4 marked, which take side effect to the next SCS RTC intterrput.
|
|
//therefore, do another read action to clean as below.
|
|
PMIC_CLEAR_INT_TO_HOST_STATUS_REG();
|
|
}
|
|
}
|
|
|
|
isr = mGuilinIntHandler[intc].pmic_isr;
|
|
if(isr) (isr)();//call isr func
|
|
mGuilinIntHandler[intc].pmic_intc_enabled = TRUE;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM803)
|
|
case PMIC_803:
|
|
{
|
|
for(intc=0;intc<=GUILIN_LITE_INTC_MAX;intc++)
|
|
{
|
|
if(mGuilinLiteIntHandler[intc].pmic_intc_enabled && (int_status & GUILIN_LITE_INTC_TO_STATUS_BIT(intc)))
|
|
{
|
|
#if PMIC_DEBUG
|
|
DIAG_FILTER(SW_PLAT, PMIC, PMIC_HISR_FUNC4, DIAG_INFORMATION)
|
|
diagPrintf ("PM803 HISR: intc %d", intc);
|
|
#endif
|
|
mGuilinLiteIntHandler[intc].pmic_intc_enabled = FALSE;
|
|
|
|
if(!check_if_DCS_mode()){
|
|
if (int_status & GUILIN_LITE_INTC_TO_STATUS_BIT(GUILIN_LITE_RTC_ALARM_INT)) {
|
|
//force clear SCS WAKEUP SIGNAL
|
|
SCS_ClearWakeupSignal();
|
|
//the SCS WAKEUP SIGNAL clear may trigger another PMIC RTC intterrupt
|
|
//caused (Basepage,0x05)=0x4 marked, which take side effect to the next SCS RTC intterrput.
|
|
//therefore, do another read action to clean as below.
|
|
PMIC_CLEAR_INT_TO_HOST_STATUS_REG();
|
|
}
|
|
}
|
|
|
|
isr = mGuilinLiteIntHandler[intc].pmic_isr;
|
|
if(isr) (isr)();//call isr func
|
|
mGuilinLiteIntHandler[intc].pmic_intc_enabled = TRUE;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM803L)
|
|
case PMIC_803L:
|
|
{
|
|
for(intc=0;intc<=GUILIN_LITE2_INTC_MAX;intc++)
|
|
{
|
|
if(mGuilinLite2IntHandler[intc].pmic_intc_enabled && (int_status & GUILIN_LITE2_INTC_TO_STATUS_BIT(intc)))
|
|
{
|
|
#if PMIC_DEBUG
|
|
DIAG_FILTER(SW_PLAT, PMIC, PMIC_HISR_FUNC5, DIAG_INFORMATION)
|
|
diagPrintf ("PM803L HISR: intc %d", intc);
|
|
#endif
|
|
mGuilinLite2IntHandler[intc].pmic_intc_enabled = FALSE;
|
|
#if 0
|
|
if(!check_if_DCS_mode()){
|
|
if (int_status & GUILIN_LITE2_INTC_TO_STATUS_BIT(GUILIN_LITE2_RTC_ALARM_INT)) {
|
|
//force clear SCS WAKEUP SIGNAL
|
|
SCS_ClearWakeupSignal();
|
|
//the SCS WAKEUP SIGNAL clear may trigger another PMIC RTC intterrupt
|
|
//caused (Basepage,0x05)=0x4 marked, which take side effect to the next SCS RTC intterrput.
|
|
//therefore, do another read action to clean as below.
|
|
PMIC_CLEAR_INT_TO_HOST_STATUS_REG();
|
|
}
|
|
}
|
|
#endif
|
|
isr = mGuilinLite2IntHandler[intc].pmic_isr;
|
|
if(isr) (isr)();//call isr func
|
|
mGuilinLite2IntHandler[intc].pmic_intc_enabled = TRUE;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM807)
|
|
case PMIC_807:
|
|
{
|
|
for(intc=0;intc<=GUILIN_LITE3_INTC_MAX;intc++)
|
|
{
|
|
if(mGuilinLite3IntHandler[intc].pmic_intc_enabled && (int_status & GUILIN_LITE3_INTC_TO_STATUS_BIT(intc)))
|
|
{
|
|
#if PMIC_DEBUG
|
|
DIAG_FILTER(SW_PLAT, PMIC, PMIC_HISR_FUNC5, DIAG_INFORMATION)
|
|
diagPrintf ("PM807 HISR: intc %d", intc);
|
|
#endif
|
|
mGuilinLite3IntHandler[intc].pmic_intc_enabled = FALSE;
|
|
#if 0
|
|
if(!check_if_DCS_mode()){
|
|
if (int_status & GUILIN_LITE2_INTC_TO_STATUS_BIT(GUILIN_LITE2_RTC_ALARM_INT)) {
|
|
//force clear SCS WAKEUP SIGNAL
|
|
SCS_ClearWakeupSignal();
|
|
//the SCS WAKEUP SIGNAL clear may trigger another PMIC RTC intterrupt
|
|
//caused (Basepage,0x05)=0x4 marked, which take side effect to the next SCS RTC intterrput.
|
|
//therefore, do another read action to clean as below.
|
|
PMIC_CLEAR_INT_TO_HOST_STATUS_REG();
|
|
}
|
|
}
|
|
#endif
|
|
isr = mGuilinLite3IntHandler[intc].pmic_isr;
|
|
if(isr) (isr)();//call isr func
|
|
mGuilinLite3IntHandler[intc].pmic_intc_enabled = TRUE;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
#endif
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
|
|
#ifdef CHARGE_DM
|
|
extern OSTaskRef chargeManagerTaskRef_FlgRef;
|
|
extern UINT32 pmic_int_status_charge;
|
|
pmic_int_status_charge = int_status;
|
|
status = OSAFlagSet(chargeManagerTaskRef_FlgRef, 0x01, OSA_FLAG_OR);
|
|
ASSERT(status == OS_SUCCESS);
|
|
#endif
|
|
}
|
|
//enable INTC_SRC_PMIC
|
|
INTCEnable(INTC_SRC_PMIC);
|
|
}
|
|
}
|
|
|
|
#ifdef SCS_BUT_WITHOUT_ALARM_IO_PAD
|
|
static OS_HISR no_alarm_io_g_pmic_hisr_ref;
|
|
Pmic_Int_Handler m_no_alarm_io_rtc_handler;
|
|
static void no_alarm_io_PMICHISRTask(void)
|
|
{
|
|
UINT32 flag_value = 0;
|
|
PmicCallback isr;
|
|
COUNTER_32 tmp;
|
|
UINT8 intc;
|
|
OSA_STATUS status = OS_SUCCESS;
|
|
|
|
while(1)
|
|
{
|
|
status = OSAFlagWait( no_alarm_io_PmicHisrTask_FlgRef, 0x01, OSA_FLAG_OR_CLEAR,&flag_value, OSA_SUSPEND );
|
|
ASSERT( status == OS_SUCCESS );
|
|
|
|
if( flag_value & 0x01 )
|
|
{
|
|
no_alarm_io_rtc_signal_clear();
|
|
//disable SCS alarm flag
|
|
PM812_RTC_DISABLE_EXPIR_1();
|
|
|
|
//exec callback
|
|
isr = m_no_alarm_io_rtc_handler.pmic_isr;
|
|
if(isr) (isr)();//call isr func
|
|
}
|
|
}
|
|
}
|
|
#endif//SCS_BUT_WITHOUT_ALARM_IO_PAD
|
|
|
|
|
|
#ifdef CHARGE_DM
|
|
extern void chargeManagePhase2Init(void);
|
|
#endif
|
|
|
|
void PMIC_Phase2Init(void)
|
|
{
|
|
INTC_ReturnCode intcStatus;
|
|
|
|
PMIC_UART_DEBUG("PMIC_Phase2Init");
|
|
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
// NingboClkInit();
|
|
// Ningbo_VBUCK1_Set_FPWM();
|
|
//Buck2 is required to be 2.1V, which is the input for LDO6/7/11, 2.0V may be bad for RF perf.
|
|
Ningbo_VBUCK_Set_VOUT(NINGBO_VBUCK2_ACTIVE_VOUT_REG,NINGBO_VBUCK_2V10);
|
|
NingboWrite( NINGBO_BASE_Reg, NINGBO_MISC_CFG_REG2, 0x0 );
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
// GuilinClkInit();
|
|
// Guilin_VBUCK1_Set_FPWM();
|
|
Guilin_VBUCK4_Set_FPWM();
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM803)
|
|
case PMIC_803:
|
|
GuilinLiteClkInit();
|
|
// GuilinLite_VBUCK1_Set_FPWM();
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM803L)
|
|
case PMIC_803L:
|
|
GuilinLite2ClkInit();
|
|
// GuilinLite2_VBUCK1_Set_FPWM();
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM807)
|
|
case PMIC_807:
|
|
GuilinLite3ClkInit();
|
|
// GuilinLite3_VBUCK1_Set_FPWM();
|
|
break;
|
|
#endif
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
if (!check_if_DCS_mode() && !CHIP_IS_CRANELR && !CHIP_IS_CRANELG && !CHIP_IS_CRANELRH)
|
|
{
|
|
//20200904@xiaoke for CRANE-G+PM803 SCS mode (Single Crystal Scenario)
|
|
SCS_RtcInit();
|
|
//clear signal on I/O pad ALARM_WAKEUP for SCS mode
|
|
if(PMIC_IS_ALARM_TRIGGERD_POWERUP())
|
|
{
|
|
PMIC_UART_DEBUG("[PMIC] SCS_ClearWakeupSignal()\r\n");
|
|
SCS_ClearWakeupSignal();
|
|
}
|
|
} else if (CHIP_IS_CRANELR || CHIP_IS_CRANELG || CHIP_IS_CRANELRH) {
|
|
#include "rtc_hw.h"
|
|
RtcHwRegisters.RTTR = 32786;
|
|
}
|
|
|
|
PMIC_CLEAR_INT_TO_HOST_STATUS_REG();//make sure to clean all ints
|
|
//dump RTC power up status
|
|
PM812_DUMP_STATE();
|
|
pmic_rtc_setting_init_fetch();
|
|
|
|
#ifdef QUEC_3601_PMIC_PWRKEY_9374
|
|
PMIC_PWRKey_Init(); //added for pwrkey
|
|
#else
|
|
#if defined(PMIC_ONKEY)
|
|
#ifdef CRANE_MCU_DONGLE
|
|
SysPowerOffInit();//add lh 2019/11/19
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
//set pimc hisr
|
|
OS_Create_HISR(&g_pmic_hisr_ref ,"PMICHISR" ,PMIC_HISR_FUNC ,HISR_STACK_LEVEL_1 | HISR_PRIORITY_2);
|
|
|
|
//bind & enable INTC_SRC_PMIC
|
|
intcStatus = INTCConfigure (INTC_SRC_PMIC,
|
|
INTC_IRQ,
|
|
INTC_RISING_EDGE);
|
|
intcStatus = INTCBind( INTC_SRC_PMIC, PMIC_LISR_FUNC);
|
|
// INTCEnable(INTC_SRC_PMIC); //move to main.c
|
|
|
|
#ifdef SCS_BUT_WITHOUT_ALARM_IO_PAD
|
|
PMIC_UART_DEBUG("[NO_ALARM_IO][%s]\r\n",__func__);
|
|
OS_Create_HISR(&no_alarm_io_g_pmic_hisr_ref ,"mRTCHISR" ,no_alarm_io_PMIC_HISR_FUNC ,HISR_STACK_LEVEL_1 | HISR_PRIORITY_2);
|
|
INTCConfigure(INTC_SRC_RTC_ALARM, INTC_IRQ, INTC_RISING_EDGE);
|
|
INTCBind(INTC_SRC_RTC_ALARM, no_alarm_io_PMIC_LISR_FUNC);
|
|
|
|
if(PMIC_RTC_GET_EXPIR_1_ENABLE_STATE()){
|
|
PMIC_UART_DEBUG("[NO_ALARM_IO][%s] force disable alarm \r\n",__func__);
|
|
PM812_RTC_DISABLE_EXPIR_1();
|
|
}
|
|
#endif//SCS_BUT_WITHOUT_ALARM_IO_PAD
|
|
|
|
#ifdef CHARGE_DM
|
|
chargeManagePhase2Init();
|
|
#endif
|
|
|
|
//millisecond align calculate from 32K tick
|
|
RTC_PERIODIC_INTC_Init();
|
|
RTC_millisecond_align_trigger();
|
|
}
|
|
|
|
void PMIC_Phase3Init(void)
|
|
{
|
|
PMIC_UART_DEBUG("PMIC_Phase3Init,Clk Init\r\n");
|
|
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
NingboClkInit();
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
GuilinClkInit();
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
#ifdef SCS_BUT_WITHOUT_ALARM_IO_PAD
|
|
static void no_alarm_io_PMIC_LISR_FUNC(UINT32 isr)
|
|
{
|
|
UINT32 status;
|
|
|
|
//disable PMIC_INTn intrrupt to avoid re-trigger
|
|
INTCDisable(INTC_SRC_RTC_ALARM);
|
|
|
|
status = OS_Activate_HISR(&no_alarm_io_g_pmic_hisr_ref);
|
|
|
|
ASSERT(status == OS_SUCCESS);
|
|
}
|
|
#endif//SCS_BUT_WITHOUT_ALARM_IO_PAD
|
|
|
|
|
|
|
|
//PMIC LISR
|
|
static void PMIC_LISR_FUNC(UINT32 isr)
|
|
{
|
|
UINT32 status;
|
|
status = OS_Activate_HISR(&g_pmic_hisr_ref);
|
|
|
|
ASSERT(status == OS_SUCCESS);
|
|
//disable PMIC_INTn intrrupt to avoid re-trigger
|
|
INTCDisable(INTC_SRC_PMIC);
|
|
}
|
|
#ifndef LTEONLY_THIN
|
|
void PM812_INT_DISABLE(PM812_INTC intc)
|
|
{
|
|
PMIC_UART_DEBUG("[%s] intc=[%d]\r\n",__func__,intc);
|
|
mPmicIntHandler[intc].pmic_intc_enabled = FALSE;
|
|
PM812_INT_TO_HOST_DISABLE(intc);
|
|
}
|
|
|
|
void PM812_INT_ENABLE(PM812_INTC intc)
|
|
{
|
|
PMIC_UART_DEBUG("[%s] intc=[%d]\r\n",__func__,intc);
|
|
mPmicIntHandler[intc].pmic_intc_enabled = TRUE;
|
|
PM812_INT_TO_HOST_ENABLE(intc);
|
|
}
|
|
|
|
void PM812_INT_CALLBACK_REGISTER(PM812_INTC intc,PmicCallback isr)
|
|
{
|
|
PMIC_UART_DEBUG("[%s] intc=[%d] , isr=[%x]\r\n",__func__,intc,isr);
|
|
mPmicIntHandler[intc].pmic_isr = isr;
|
|
|
|
}
|
|
#endif
|
|
#ifdef SCS_BUT_WITHOUT_ALARM_IO_PAD
|
|
void no_alarm_io_PMIC_HISR_FUNC(void)
|
|
{
|
|
OSA_STATUS os_status;
|
|
|
|
os_status = OSAFlagSet( no_alarm_io_PmicHisrTask_FlgRef, 0x01, OSA_FLAG_OR );
|
|
ASSERT( os_status == OS_SUCCESS );
|
|
}
|
|
#endif//SCS_BUT_WITHOUT_ALARM_IO_PAD
|
|
|
|
|
|
|
|
//PMIC HISR
|
|
void PMIC_HISR_FUNC(void)
|
|
{
|
|
OSA_STATUS os_status;
|
|
os_status = OSAFlagSet( PmicHisrTask_FlgRef, 0x01, OSA_FLAG_OR );
|
|
ASSERT( os_status == OS_SUCCESS );
|
|
}
|
|
|
|
BOOL PM812_ONKEY_IS_DETECTED(void)
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
return ((PMIC_READ_REG_BASE(NINGBO_STATUS_REG1) & NINGBO_ONKEY_STATUS_BIT) ? TRUE : FALSE);
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
return ((PMIC_READ_REG_BASE(GUILIN_STATUS_REG1) & GUILIN_ONKEY_PRESSED) ? TRUE : FALSE);
|
|
#endif
|
|
case PMIC_803:
|
|
return ((PMIC_READ_REG_BASE(GUILIN_LITE_STATUS_REG1) & GUILIN_LITE_ONKEY_PRESSED) ? TRUE : FALSE);
|
|
case PMIC_803L:
|
|
return ((PMIC_READ_REG_BASE(GUILIN_LITE2_STATUS_REG1) & GUILIN_LITE2_ONKEY_PRESSED) ? TRUE : FALSE);
|
|
case PMIC_807:
|
|
return ((PMIC_READ_REG_BASE(GUILIN_LITE3_STATUS_REG1) & GUILIN_LITE3_ONKEY_PRESSED) ? TRUE : FALSE);
|
|
default:
|
|
ASSERT(0);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
BOOL PM812_EXTON_IS_DETECTED(void)
|
|
{
|
|
//check whether EXTON pin is connected
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
return ((PMIC_READ_REG_BASE(NINGBO_STATUS_REG1) & (NINGBO_VBUS_STATUS_BIT | NINGBO_VBUS_OVP_BIT | NINGBO_VBUS_UVLO_BIT)) ? TRUE : FALSE);
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
return ((PMIC_READ_REG_BASE(NINGBO_READONLY_DATA_2_REG) & (NINGBO_RONLY_DATA_CHG_OK)) ? TRUE : FALSE);
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
return ((PMIC_READ_REG_BASE(GUILIN_STATUS_REG1) & GUILIN_EXTON1_DETECT) ? TRUE : FALSE);
|
|
#endif
|
|
case PMIC_803:
|
|
return ((PMIC_READ_REG_BASE(GUILIN_LITE_STATUS_REG1) & GUILIN_LITE_EXTON1_DETECT) ? TRUE : FALSE);
|
|
case PMIC_803L:
|
|
return ((PMIC_READ_REG_BASE(GUILIN_LITE2_STATUS_REG1) & GUILIN_LITE2_EXTON1_DETECT) ? TRUE : FALSE);
|
|
case PMIC_807:
|
|
return ((PMIC_READ_REG_BASE(GUILIN_LITE3_STATUS_REG1) & GUILIN_LITE3_EXTON1_DETECT) ? TRUE : FALSE);
|
|
default:
|
|
ASSERT(0);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
BOOL PM812_CHARGER_IS_DETECTED(void)
|
|
{
|
|
//for FIH board only check EXTON_STATUS
|
|
return PM812_EXTON_IS_DETECTED();
|
|
}
|
|
|
|
BOOL PM812_BATTERY_IS_DETECTED(void)
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
return ((PMIC_READ_REG_BASE(NINGBO_STATUS_REG1) & NINGBO_VBAT_STATUS_BIT) ? TRUE : FALSE);
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
return ((PMIC_READ_REG_BASE(GUILIN_STATUS_REG1) & GUILIN_BAT_DETECT) ? TRUE : FALSE);
|
|
#endif
|
|
case PMIC_803:
|
|
return ((PMIC_READ_REG_BASE(GUILIN_LITE_STATUS_REG1) & GUILIN_LITE_BAT_DETECT) ? TRUE : FALSE);
|
|
case PMIC_803L:
|
|
return ((PMIC_READ_REG_BASE(GUILIN_LITE2_STATUS_REG1) & GUILIN_LITE2_BAT_DETECT) ? TRUE : FALSE);
|
|
case PMIC_807:
|
|
return ((PMIC_READ_REG_BASE(GUILIN_LITE3_STATUS_REG1) & GUILIN_LITE3_BAT_DETECT) ? TRUE : FALSE);
|
|
default:
|
|
ASSERT(0);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
//for CHARER bind on USB_VBUS
|
|
BOOL PM812_VBUS_IS_AVAILABLE(void)
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
return ((PMIC_READ_REG_BASE(NINGBO_STATUS_REG1) & (NINGBO_VBUS_STATUS_BIT | NINGBO_VBUS_OVP_BIT | NINGBO_VBUS_UVLO_BIT)) ? TRUE : FALSE);
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
return ((PMIC_READ_REG_BASE(NINGBO_READONLY_DATA_2_REG) & (NINGBO_RONLY_DATA_CHG_OK)) ? TRUE : FALSE);
|
|
#endif
|
|
case PMIC_803:
|
|
#ifdef QUECTEL_PROJECT_CUST
|
|
case PMIC_802:
|
|
case PMIC_803L:
|
|
case PMIC_807:
|
|
{
|
|
/*PMIC802/PMIC803 do not support charger(so VBUS detectio is impossible),
|
|
we check PMUap offset0x7C ,bit15 to detect VBUS state
|
|
*/
|
|
//uart_printf("DBG========PM812 is called in kernel!\n");
|
|
return (((*(volatile unsigned long*)0xd428287c >>15)&0x1) ? TRUE : FALSE);
|
|
}
|
|
#endif
|
|
default:
|
|
PMIC_UART_DEBUG("No charger function!\r\n");
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
//3.4 default
|
|
UINT32 PM812_GET_VCHG_LOW_TH()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
//4.2 default
|
|
UINT32 PM812_GET_VCHG_UPP_TH()
|
|
{
|
|
//NOT SUPPORTED IN PM813
|
|
return 0;
|
|
}
|
|
|
|
void PM812_SET_VCHG_LOW_TH(UINT8 low)
|
|
{
|
|
//NOT SUPPORTED IN PM813
|
|
}
|
|
|
|
void PM812_SET_VCHG_UPP_TH(UINT8 upp)
|
|
{
|
|
//NOT SUPPORTED IN PM813
|
|
}
|
|
|
|
//for 12bit vol meas
|
|
UINT16 PM812_GPADC_READ_VOL_MEAS(UINT8 meaReg)
|
|
{
|
|
UINT16 meas_val;
|
|
UINT8 reg_value[2],tmp;
|
|
|
|
/* Read two registers, the alignment will be done as follows:
|
|
Register 1 - bits 7:0 => 8 MSB bits <11:4> of measurement value
|
|
Register 2 - bits 3:0 => 4 LSB bits <3:0> of measurement value
|
|
*/
|
|
if (PMIC_IS_PM813())
|
|
{
|
|
tmp = PMIC_READ_REG_GPADC(NINGBO_GPADC_MODE_CONTROL_REG);
|
|
PMIC_WRITE_REG_GPADC(NINGBO_GPADC_MODE_CONTROL_REG,(tmp&~NINGBO_GPADC_EN));//disable GPADC to get proper value
|
|
}
|
|
reg_value[0] = PMIC_READ_REG_GPADC(meaReg+0);
|
|
reg_value[1] = PMIC_READ_REG_GPADC(meaReg+1);
|
|
|
|
meas_val = (reg_value[0] << 4) | (reg_value[1] & 0x0F);
|
|
|
|
return meas_val;
|
|
}
|
|
void PM812_BIAS_ENABLE(PM812_BIAS_EN bias_en)
|
|
{
|
|
}
|
|
void PM812_BIAS_DISABLE(PM812_BIAS_EN bias_en)
|
|
{
|
|
}
|
|
|
|
void PM812_BIAS_OUT_ON(PM812_BIAS_OUT bias_out)
|
|
{
|
|
}
|
|
|
|
void PM812_BIAS_OUT_OFF(PM812_BIAS_OUT bias_out)
|
|
{
|
|
}
|
|
|
|
void PM812_MEAS_ENABLE(PM812_MEAS_EN meas_en)
|
|
{
|
|
}
|
|
|
|
void PM812_MEAS_DISABLE(PM812_MEAS_EN meas_en)
|
|
{
|
|
}
|
|
|
|
void PM812_GPADC_SW_TRIG()
|
|
{
|
|
UINT8 tmp;
|
|
if (PMIC_IS_PM802()||PMIC_IS_PM802S())
|
|
{
|
|
tmp = PMIC_READ_REG_GPADC(GUILIN_GPADC_MISC_CONFIG_REG2);
|
|
tmp |= GUILIN_GPADC_SW_TRIG_BIT;
|
|
PMIC_WRITE_REG_GPADC(GUILIN_GPADC_MISC_CONFIG_REG2,tmp);
|
|
}
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
else if(PMIC_IS_PM813()||PMIC_IS_PM813S())
|
|
{
|
|
tmp = PMIC_READ_REG_GPADC(NINGBO_GPADC_MODE_CONTROL_REG);
|
|
tmp |= NINGBO_GPADC_SW_TRIG_BIT;
|
|
PMIC_WRITE_REG_GPADC(NINGBO_GPADC_MODE_CONTROL_REG,tmp);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void PM812_GPADC_NONSTOP_TRIG_ENABLE(void)
|
|
{
|
|
UINT8 tmp;
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
if (PMIC_IS_PM802()||PMIC_IS_PM802S())
|
|
{
|
|
tmp = PMIC_READ_REG_GPADC(GUILIN_GPADC_MISC_CONFIG_REG2);
|
|
tmp |= (GUILIN_NON_STOP|GUILIN_GPADC_EN);
|
|
PMIC_WRITE_REG_GPADC(GUILIN_GPADC_MISC_CONFIG_REG2,tmp);
|
|
}else
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
if(PMIC_IS_PM813()||PMIC_IS_PM813S())
|
|
{
|
|
tmp = PMIC_READ_REG_GPADC(NINGBO_GPADC_MODE_CONTROL_REG);
|
|
tmp |= (NINGBO_NON_STOP|NINGBO_GPADC_EN);
|
|
PMIC_WRITE_REG_GPADC(NINGBO_GPADC_MODE_CONTROL_REG,tmp);
|
|
}else
|
|
#endif
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
void PM812_GPADC_NONSTOP_TRIG_DISABLE(void)
|
|
{
|
|
UINT8 tmp;
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
if (PMIC_IS_PM802()||PMIC_IS_PM802S())
|
|
{
|
|
tmp = PMIC_READ_REG_GPADC(GUILIN_GPADC_MISC_CONFIG_REG2);
|
|
tmp &= ~(GUILIN_NON_STOP|GUILIN_GPADC_EN);
|
|
PMIC_WRITE_REG_GPADC(GUILIN_GPADC_MISC_CONFIG_REG2,tmp);
|
|
}else
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
if(PMIC_IS_PM813()||PMIC_IS_PM813S())
|
|
{
|
|
tmp = PMIC_READ_REG_GPADC(NINGBO_GPADC_MODE_CONTROL_REG);
|
|
tmp &= ~(NINGBO_NON_STOP|NINGBO_GPADC_EN);
|
|
PMIC_WRITE_REG_GPADC(NINGBO_GPADC_MODE_CONTROL_REG,tmp);
|
|
}else
|
|
#endif
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
void PM812_BD_ENABLE(UINT8 bit)
|
|
{
|
|
}
|
|
|
|
void PM812_BD_DISABLE(UINT8 bit)
|
|
{
|
|
}
|
|
//sec: 1~16
|
|
UINT8 PM812_GET_LONKEY_PRESS_TIME(void)
|
|
{
|
|
UINT8 tmp = 0;
|
|
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
if (PMIC_IS_PM802()||PMIC_IS_PM802S())
|
|
{
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_RTC_MISC_3_REG);
|
|
return (((tmp >> 4) & 0x0f) + 1);
|
|
}
|
|
else
|
|
#endif
|
|
if (PMIC_IS_PM803())
|
|
{
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE_RTC_MISC_3_REG);
|
|
return (((tmp >> 4) & 0x0f) + 1);
|
|
}
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
else if(PMIC_IS_PM813()||PMIC_IS_PM813S())
|
|
{
|
|
tmp = PMIC_READ_REG_BASE(NINGBO_RTC_MISC_3_REG);
|
|
return (((tmp >> 4) & 0x0f) + 1);
|
|
}
|
|
#endif
|
|
else
|
|
{
|
|
return tmp;
|
|
}
|
|
}
|
|
|
|
//sec: 1~16
|
|
void PM812_SET_LONKEY_PRESS_TIME(UINT8 sec)
|
|
{
|
|
UINT8 tmp;
|
|
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
if (PMIC_IS_PM802()||PMIC_IS_PM802S())
|
|
{
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_RTC_MISC_3_REG);
|
|
tmp &= 0x0f;
|
|
sec = ((sec-1) <<4);
|
|
PMIC_WRITE_REG_BASE(GUILIN_RTC_MISC_3_REG,(tmp|sec));
|
|
}
|
|
else
|
|
#endif
|
|
if (PMIC_IS_PM803())
|
|
{
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE_RTC_MISC_3_REG);
|
|
tmp &= 0x0f;
|
|
sec = ((sec-1) <<4);
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE_RTC_MISC_3_REG,(tmp|sec));
|
|
}
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
else if(PMIC_IS_PM813()||PMIC_IS_PM813S())
|
|
{
|
|
tmp = PMIC_READ_REG_BASE(NINGBO_RTC_MISC_3_REG);
|
|
tmp &= 0x0f;
|
|
sec = ((sec-1) <<4);
|
|
PMIC_WRITE_REG_BASE(NINGBO_RTC_MISC_3_REG,(tmp|sec));
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void PM812_LONKEY_ENABLE_SET(UINT8 LONGKEY_NUM,BOOL enable)
|
|
{
|
|
UINT8 tmp;
|
|
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
if (PMIC_IS_PM802()||PMIC_IS_PM802S())
|
|
{
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_CLK_32K_SEL_REG);
|
|
//LONGKEY_1
|
|
if(LONGKEY_NUM == GUILIN_LONGKEY_1){
|
|
enable?(tmp |= GUILIN_LONGKEY_EN1):(tmp &= (~GUILIN_LONGKEY_EN1));
|
|
PMIC_UART_DEBUG("PM802_LONKEY_ENABLE_SET LONGKEY_1,tmp=0x%x \r\n",tmp);
|
|
PMIC_WRITE_REG_BASE(GUILIN_CLK_32K_SEL_REG,tmp);
|
|
//LONGKEY_2
|
|
}else if (LONGKEY_NUM == GUILIN_LONGKEY_2){
|
|
enable?(tmp |= GUILIN_LONGKEY_EN2):(tmp &= (~GUILIN_LONGKEY_EN2));
|
|
PMIC_UART_DEBUG("PM802_LONKEY_ENABLE_SET LONGKEY_2,tmp=0x%x \r\n",tmp);
|
|
PMIC_WRITE_REG_BASE(GUILIN_CLK_32K_SEL_REG,tmp);
|
|
}
|
|
}
|
|
else
|
|
#endif
|
|
if (PMIC_IS_PM803())
|
|
{
|
|
tmp = PMIC_READ_REG_BASE(GUILIN_LITE_CLK_32K_SEL_REG);
|
|
//LONGKEY_1
|
|
if(LONGKEY_NUM == GUILIN_LITE_LONGKEY_1){
|
|
enable?(tmp |= GUILIN_LITE_LONGKEY_EN1):(tmp &= (~GUILIN_LITE_LONGKEY_EN1));
|
|
PMIC_UART_DEBUG("PM803_LONKEY_ENABLE_SET LONGKEY_1,tmp=0x%x \r\n",tmp);
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE_CLK_32K_SEL_REG,tmp);
|
|
//LONGKEY_2
|
|
}else if (LONGKEY_NUM == GUILIN_LITE_LONGKEY_2){
|
|
enable?(tmp |= GUILIN_LITE_LONGKEY_EN2):(tmp &= (~GUILIN_LITE_LONGKEY_EN2));
|
|
PMIC_UART_DEBUG("PM803_LONKEY_ENABLE_SET LONGKEY_2,tmp=0x%x \r\n",tmp);
|
|
PMIC_WRITE_REG_BASE(GUILIN_LITE_CLK_32K_SEL_REG,tmp);
|
|
}
|
|
}
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
else if(PMIC_IS_PM813()||PMIC_IS_PM813S())
|
|
{
|
|
tmp = PMIC_READ_REG_BASE(NINGBO_CLK_32K_SEL_REG);
|
|
//LONGKEY_1
|
|
if(LONGKEY_NUM == NINGBO_LONGKEY_1){
|
|
enable?(tmp |= NINGBO_LONGKEY_EN1):(tmp &= (~NINGBO_LONGKEY_EN1));
|
|
PMIC_UART_DEBUG("PM813_LONKEY_ENABLE_SET LONGKEY_1,tmp=0x%x \r\n",tmp);
|
|
PMIC_WRITE_REG_BASE(NINGBO_CLK_32K_SEL_REG,tmp);
|
|
//LONGKEY_2
|
|
}else if (LONGKEY_NUM == NINGBO_LONGKEY_2){
|
|
enable?(tmp |= NINGBO_LONGKEY_EN2):(tmp &= (~NINGBO_LONGKEY_EN2));
|
|
PMIC_UART_DEBUG("PM813_LONKEY_ENABLE_SET LONGKEY_2,tmp=0x%x \r\n",tmp);
|
|
PMIC_WRITE_REG_BASE(NINGBO_CLK_32K_SEL_REG,tmp);
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
//LONGKEY_NUM: 1/2
|
|
BOOL PM812_LONKEY_ENABLE_GET(UINT8 LONGKEY_NUM)
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
if(PMIC_IS_PM802()||PMIC_IS_PM802S())
|
|
{
|
|
PMIC_UART_DEBUG("PM802_LONKEY_ENABLE_GET , NUM=%d",LONGKEY_NUM);
|
|
return (PMIC_READ_REG_BASE(GUILIN_CLK_32K_SEL_REG) &
|
|
((LONGKEY_NUM==GUILIN_LONGKEY_1)?GUILIN_LONGKEY_EN1:GUILIN_LONGKEY_EN2));
|
|
}
|
|
else
|
|
#endif
|
|
if(PMIC_IS_PM803())
|
|
{
|
|
PMIC_UART_DEBUG("PM803_LONKEY_ENABLE_GET , NUM=%d",LONGKEY_NUM);
|
|
return (PMIC_READ_REG_BASE(GUILIN_LITE_CLK_32K_SEL_REG) &
|
|
((LONGKEY_NUM==GUILIN_LITE_LONGKEY_1)?GUILIN_LITE_LONGKEY_EN1:GUILIN_LITE_LONGKEY_EN2));
|
|
}
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
else if(PMIC_IS_PM813()||PMIC_IS_PM813S())
|
|
{
|
|
PMIC_UART_DEBUG("PM813_LONKEY_ENABLE_GET , NUM=%d",LONGKEY_NUM);
|
|
return (PMIC_READ_REG_BASE(NINGBO_CLK_32K_SEL_REG) &
|
|
((LONGKEY_NUM==NINGBO_LONGKEY_1)?NINGBO_LONGKEY_EN1:NINGBO_LONGKEY_EN2));
|
|
}
|
|
#endif
|
|
else
|
|
{
|
|
PMIC_UART_DEBUG("PM812_LONKEY_ENABLE_GET: it shouldn't reach here, NUM=%d",LONGKEY_NUM);
|
|
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
void PM812_VBUCK1_CFG(UINT8 value)
|
|
{
|
|
}
|
|
|
|
void PM812_VBUCK2_CFG(UINT8 value)
|
|
{
|
|
}
|
|
|
|
void PM812_VLDO7_SWITCH(UINT8 onoff)
|
|
{
|
|
}
|
|
|
|
void PM812_PwmSetLevel(UINT8 level)
|
|
{
|
|
}
|
|
|
|
//ICAT EXPORTED FUNCTION - SW_PLAT, PM812, Buck1Cfg
|
|
void PM812_Buck1_Config(volatile void *base)
|
|
{
|
|
}
|
|
|
|
//ICAT EXPORTED FUNCTION - SW_PLAT, PM812, Buck2Cfg
|
|
void PM812_Buck2_Config(volatile void *base)
|
|
{
|
|
}
|
|
|
|
unsigned int get_cp_dvc_fix_by_dsp(void);
|
|
|
|
void PlatformVcoreConfigTop(void)
|
|
{ // Set 1.10V by default for top level
|
|
if(CurrentThreadIsHISR()){
|
|
return;
|
|
}
|
|
|
|
if (get_cp_dvc_fix_by_dsp()){
|
|
PMIC_UART_DEBUG("%s dvc fixed!\r\n", __func__);
|
|
return;
|
|
}
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
Ningbo_VBUCK1_CFG(NINGBO_VBUCK_1V1000);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
Guilin_VBUCK1_CFG(GUILIN_VBUCK_1V1000);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM803)
|
|
case PMIC_803:
|
|
GuilinLite_VBUCK1_CFG(GUILIN_LITE_VBUCK_1V1000);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM803L)
|
|
case PMIC_803L:
|
|
GuilinLite2_VBUCK1_CFG(CRN_SVC_FP[3]);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM807)
|
|
case PMIC_807:
|
|
GuilinLite3_VBUCK1_CFG(CRN_SVC_FP[3]);
|
|
break;
|
|
#endif
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void PlatformVcoreConfigHigh(void)
|
|
{ // Set 1.05V by default for higher level
|
|
if(CurrentThreadIsHISR()){
|
|
return;
|
|
}
|
|
|
|
if (get_cp_dvc_fix_by_dsp()){
|
|
PMIC_UART_DEBUG("%s dvc fixed!\r\n", __func__);
|
|
return;
|
|
}
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
Ningbo_VBUCK1_CFG(NINGBO_VBUCK_1V0500);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
Guilin_VBUCK1_CFG(GUILIN_VBUCK_1V0500);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM803)
|
|
case PMIC_803:
|
|
GuilinLite_VBUCK1_CFG(GUILIN_LITE_VBUCK_1V0500);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM803L)
|
|
case PMIC_803L:
|
|
GuilinLite2_VBUCK1_CFG(CRN_SVC_FP[2]);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM807)
|
|
case PMIC_807:
|
|
GuilinLite3_VBUCK1_CFG(CRN_SVC_FP[2]);
|
|
break;
|
|
#endif
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void PlatformVcoreConfigLow(void)
|
|
{ // Set 1.00V by default
|
|
if(CurrentThreadIsHISR()){
|
|
return;
|
|
}
|
|
|
|
if (get_cp_dvc_fix_by_dsp()){
|
|
PMIC_UART_DEBUG("%s dvc fixed!\r\n", __func__);
|
|
return;
|
|
}
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
Ningbo_VBUCK1_CFG(NINGBO_VBUCK_1V0000);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
Guilin_VBUCK1_CFG(GUILIN_VBUCK_1V0000);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM803)
|
|
case PMIC_803:
|
|
GuilinLite_VBUCK1_CFG(GUILIN_LITE_VBUCK_1V0000);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM803L)
|
|
case PMIC_803L:
|
|
GuilinLite2_VBUCK1_CFG(CRN_SVC_FP[0]);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM807)
|
|
case PMIC_807:
|
|
GuilinLite3_VBUCK1_CFG(CRN_SVC_FP[0]);
|
|
break;
|
|
#endif
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void PlatformBuckAptConfig(void)
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
Ningbo_BUCK3_Enable();
|
|
Ningbo_APT_enable();
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
Guilin_BUCK5_Enable();
|
|
Guilin_APT_enable();
|
|
break;
|
|
#endif
|
|
case PMIC_803:
|
|
case PMIC_803L:
|
|
case PMIC_807:
|
|
//Guilin-lite doesn't support RF APT.
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void PlatformVcoreConfigForDro(void)
|
|
{ // Set 1.05V for DRO reading
|
|
UINT8 buck1;
|
|
|
|
if(CHIP_IS_CRANE)
|
|
buck1 = VOLTAGE_1_05;
|
|
else if(CHIP_IS_CRANEG)
|
|
buck1 = VOLTAGE_0_80;
|
|
else if(CHIP_IS_CRANEM || CHIP_IS_CRANEL || CHIP_IS_CRANELS)
|
|
buck1 = VOLTAGE_0_90;
|
|
else if(CHIP_IS_CRANELR || CHIP_IS_CRANELG || CHIP_IS_CRANELRH)
|
|
;//PM803L
|
|
else
|
|
return;
|
|
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
Ningbo_VBUCK1_CFG(buck1);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
Guilin_VBUCK1_CFG(buck1);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM803)
|
|
case PMIC_803:
|
|
GuilinLite_VBUCK1_CFG(buck1);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM803L)
|
|
case PMIC_803L:
|
|
GuilinLite2_VBUCK1_CFG(GUILIN_LITE2_VBUCK_0V90);//1602 or 1608 or 1607
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM807)
|
|
case PMIC_807:
|
|
GuilinLite3_VBUCK1_CFG(GUILIN_LITE3_VBUCK_0V90);//1602 or 1608 or 1607
|
|
break;
|
|
#endif
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void PlatformRfSwitchPowerConfig(void)
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
Ningbo_Ldo_1_set_2_8();
|
|
// Ningbo_LDO_Set_Slpmode(NINGBO_LDO1_SLEEP_MODE_REG,NINGBO_LDO_OFF); //also used for LCD, can't off.
|
|
Ningbo_Ldo_1_set(TRUE);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
Guilin_Ldo_1_set_2_8();
|
|
#ifdef PROJ_ASR_APP_001
|
|
Guilin_LDO_Set_Slpmode(GUILIN_LDO1_SLEEP_MODE_REG,GUILIN_LDO_ACTIVE);
|
|
#else
|
|
Guilin_LDO_Set_Slpmode(GUILIN_LDO1_SLEEP_MODE_REG,GUILIN_LDO_OFF);
|
|
#endif
|
|
Guilin_Ldo_1_set(TRUE);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM803)
|
|
case PMIC_803:
|
|
GuilinLite_Ldo_6_set_2_8();
|
|
#ifdef PROJ_ASR_APP_001
|
|
GuilinLite_LDO_Set_Slpmode(GUILIN_LITE_LDO6_SLEEP_MODE_REG,GUILIN_LITE_LDO_ACTIVE);
|
|
#else
|
|
#ifndef MIN_SYS
|
|
|
|
#if QUECTEL_PROJECT_CUST
|
|
//add 20240711 解决800M LE新PA硬件休眠耗流高问题
|
|
#if defined (__QUECTEL_PROJECT_EC800MCN_LE__) || defined (__QUECTEL_PROJECT_EC800MCN_LF__)
|
|
extern int quec_pa_level_check(void);
|
|
if(1 == quec_pa_level_check())
|
|
{
|
|
GuilinLite_LDO_Set_Slpmode(GUILIN_LDO6_SLEEP_MODE_REG,GUILIN_LITE_LDO_ACTIVE);
|
|
}
|
|
else
|
|
{
|
|
GuilinLite_LDO_Set_Slpmode(GUILIN_LDO6_SLEEP_MODE_REG,GUILIN_LITE_LDO_OFF);
|
|
}
|
|
#else
|
|
|
|
GuilinLite_LDO_Set_Slpmode(GUILIN_LITE_LDO6_SLEEP_MODE_REG,GUILIN_LITE_LDO_OFF);
|
|
#endif
|
|
#else
|
|
GuilinLite_LDO_Set_Slpmode(GUILIN_LDO6_SLEEP_MODE_REG,GUILIN_LITE_LDO_OFF);
|
|
#endif
|
|
#else
|
|
GuilinLite_LDO_Set_Slpmode(GUILIN_LITE_LDO6_SLEEP_MODE_REG,GUILIN_LITE_LDO_OFF);
|
|
#endif
|
|
#endif
|
|
|
|
GuilinLite_Ldo_6_set(TRUE);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM803L)
|
|
case PMIC_803L:
|
|
GuilinLite2_Ldo_6_set_2_8();
|
|
#ifdef PROJ_ASR_APP_001
|
|
GuilinLite2_LDO_Set_Slpmode(GUILIN_LITE2_LDO6_SLEEP_MODE_REG,GUILIN_LITE2_LDO_ACTIVE);
|
|
#else
|
|
GuilinLite2_LDO_Set_Slpmode(GUILIN_LITE2_LDO6_SLEEP_MODE_REG,GUILIN_LITE2_LDO_OFF);
|
|
#endif
|
|
GuilinLite2_Ldo_6_set(TRUE);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM807)
|
|
case PMIC_807: //use LDO4(USB) for RF switch power, no need to set
|
|
break;
|
|
#endif
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Camera_Avdd_Power_off(void)
|
|
{
|
|
#ifndef NOT_SUPPORT_PM813
|
|
if(PMIC_IS_PM813() || PMIC_IS_PM813S())
|
|
{
|
|
Ningbo_LDO_Set_Enable(NINGBO_LDO10_ENABLE_REG,0);
|
|
}
|
|
else
|
|
#endif
|
|
#ifndef NOT_SUPPORT_PM802
|
|
if(PMIC_IS_PM802()) //PM802
|
|
{
|
|
Guilin_Ldo_6_set(0);//EC600S USE PM802 LDO6 For AVDD
|
|
}
|
|
else
|
|
#endif
|
|
#ifndef NOT_SUPPORT_PM803
|
|
if(PMIC_IS_PM803())
|
|
{
|
|
GuilinLite_Ldo_7_set(0);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
//felix.liu modify 20230313 achieve camvdd output 2.8v
|
|
void Camera_Avdd_Power_set(Camera_Pwr_Val ldoVal)
|
|
{
|
|
if (ldoVal > CAM_VDD_MAX)
|
|
{
|
|
fatal_printf("Wrong Camera AVDD input!\r\n");
|
|
return;
|
|
}
|
|
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
if (PMIC_IS_PM813()||PMIC_IS_PM813S())
|
|
{
|
|
Ningbo_LDO_Set_VOUT(NINGBO_LDO10_ACTIVE_VOUT_REG, (ldoVal<<2));
|
|
Ningbo_LDO_Set_Enable(NINGBO_LDO10_ENABLE_REG,1);
|
|
}
|
|
else
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
if(PMIC_IS_PM802())//shaohua.li //EC600S PM802 LDO6 For Camera AVDD
|
|
{
|
|
Guilin_Ldo_6_set_2_8();
|
|
Guilin_Ldo_6_set(1);
|
|
}
|
|
else
|
|
#endif
|
|
#ifndef NOT_SUPPORT_PM803
|
|
if(PMIC_IS_PM803())
|
|
{
|
|
if(CAM_VDD_2V80 == ldoVal)
|
|
{
|
|
GuilinLite_Ldo_7_set_2_8();
|
|
GuilinLite_Ldo_7_set(1);
|
|
}
|
|
else
|
|
{
|
|
GuilinLite_Ldo_7_set(0);
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void Camera_Dvdd_Power_set(Camera_Pwr_Val ldoVal)
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
if (ldoVal > CAM_VDD_MAX)
|
|
{
|
|
fatal_printf("Wrong Camera DVDD input!\r\n");
|
|
return;
|
|
}
|
|
|
|
if (PMIC_IS_PM813()||PMIC_IS_PM813S())
|
|
{
|
|
Ningbo_LDO_Set_VOUT(NINGBO_LDO11_ACTIVE_VOUT_REG, (ldoVal<<2));
|
|
Ningbo_LDO_Set_Enable(NINGBO_LDO11_ENABLE_REG,1);
|
|
}
|
|
#endif
|
|
}
|
|
void Camera_IOvdd_Power_off(void)
|
|
{
|
|
#ifndef NOT_SUPPORT_PM813
|
|
if(PMIC_IS_PM813() || PMIC_IS_PM813S())
|
|
{
|
|
Ningbo_LDO_Set_Enable(NINGBO_LDO13_ENABLE_REG,0);
|
|
}
|
|
else
|
|
#endif
|
|
#ifndef NOT_SUPPORT_PM802
|
|
if(PMIC_IS_PM802()) //PM802
|
|
{
|
|
if(CHIP_IS_CRANEM)//600ncn_ld
|
|
{
|
|
raw_uart_log("hard_ver is v1.2\r\n");
|
|
GpioSetDirection(49, GPIO_OUT_PIN);
|
|
GpioSetLevel(49,GPIORC_HIGH);
|
|
}
|
|
else //600s
|
|
{
|
|
Guilin_Ldo_4_set(on_off);//EC600S USE PM802 LDO6 For IOVDD
|
|
}
|
|
}
|
|
else
|
|
#endif
|
|
#ifndef NOT_SUPPORT_PM803
|
|
//add for cam iovdd ctrl
|
|
if(PMIC_IS_PM803())
|
|
{
|
|
GpioSetDirection(77, GPIO_OUT_PIN);
|
|
GpioSetLevel(77,GPIORC_HIGH);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
|
|
void Camera_IOvdd_Power_set(Camera_Pwr_Val ldoVal)
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
UINT8 tmp;
|
|
if (ldoVal > CAM_VDD_MAX)
|
|
{
|
|
fatal_printf("Wrong Camera IOVDD input!\r\n");
|
|
return;
|
|
}
|
|
|
|
if (PMIC_IS_PM813()||PMIC_IS_PM813S())
|
|
{
|
|
switch(ldoVal)
|
|
{
|
|
case CAM_VDD_1V70: tmp = NINGBO_LDO13_ACTIVE_1V70; break;
|
|
case CAM_VDD_1V80: tmp = NINGBO_LDO13_ACTIVE_1V80; break;
|
|
case CAM_VDD_1V90: tmp = NINGBO_LDO13_ACTIVE_1V90; break;
|
|
case CAM_VDD_2V50: tmp = NINGBO_LDO13_ACTIVE_2V50; break;
|
|
case CAM_VDD_2V80: tmp = NINGBO_LDO13_ACTIVE_2V80; break;
|
|
case CAM_VDD_2V90: tmp = NINGBO_LDO13_ACTIVE_2V90; break;
|
|
case CAM_VDD_3V10: tmp = NINGBO_LDO13_ACTIVE_3V10; break;
|
|
case CAM_VDD_3V30: tmp = NINGBO_LDO13_ACTIVE_3V30; break;
|
|
default:
|
|
PMIC_UART_DEBUG("Camera IOvdd input value Not supported, use 2.8v!\r\n");
|
|
tmp = NINGBO_LDO13_ACTIVE_2V80; break;
|
|
}
|
|
Ningbo_LDO_Set_VOUT(NINGBO_LDO13_ACTIVE_VOUT_REG, tmp);
|
|
Ningbo_LDO_Set_Enable(NINGBO_LDO13_ENABLE_REG,1);
|
|
}
|
|
|
|
#endif
|
|
#ifndef NOT_SUPPORT_PM803
|
|
//add for cam iovdd ctrl
|
|
if(PMIC_IS_PM803())
|
|
{
|
|
|
|
GpioSetDirection(77, GPIO_OUT_PIN);
|
|
GpioSetLevel(77,GPIORC_LOW);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
UINT8 SysRestartReasonGlobal=0;
|
|
UINT32 SysRestartReasonGetFlag=0;
|
|
|
|
void SysRestartReasonGetGlobal(void)
|
|
{
|
|
if(SysRestartReasonGetFlag==0)
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
SysRestartReasonGlobal = PMIC_READ_REG_BASE(PMIC_REG_FOR_SW_RESTART_REASON_STR);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
#endif
|
|
case PMIC_803:
|
|
SysRestartReasonGlobal = PMIC_READ_REG_BASE(PMIC_REG_FOR_USR_DEF_FLAGS_STR);
|
|
break;
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802S:
|
|
SysRestartReasonGlobal = PMIC_READ_REG_BASE(PM802S_REG_FOR_USR_DEF_FLAGS_STR);
|
|
break;
|
|
#endif
|
|
case PMIC_803L:
|
|
SysRestartReasonGlobal = PMIC_READ_REG_BASE(PM803L_REG_FOR_USR_DEF_FLAGS_STR);
|
|
break;
|
|
case PMIC_807:
|
|
SysRestartReasonGlobal = PMIC_READ_REG_BASE(PM807_REG_FOR_USR_DEF_FLAGS_STR);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
|
|
SysRestartReasonGetFlag=1;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void SysRestartReasonSet(SW_RESTART_REASON reason)
|
|
{
|
|
UINT8 desc[40] = {0};
|
|
UINT8 rsn = (UINT8)reason;
|
|
|
|
|
|
switch (rsn)
|
|
{
|
|
case 'C':
|
|
strcpy((char *)desc, "Charging in powering off"); //set by UI
|
|
break;
|
|
case 'R':
|
|
strcpy((char *)desc, "Rd production mode"); //set by preboot
|
|
break;
|
|
case 'A':
|
|
strcpy((char *)desc, "rtc Alarm"); //set according to pmic
|
|
break;
|
|
case 'N':
|
|
strcpy((char *)desc, "Normal powering on"); //set otherwise
|
|
break;
|
|
case 'E':
|
|
strcpy((char *)desc, "Error reset (WDT)"); //set by WDT indication
|
|
break;
|
|
case 'D':
|
|
strcpy((char *)desc, "image Download"); //set by AT cmd and checked by preboot
|
|
break;
|
|
default:
|
|
PMIC_UART_DEBUG("[SYSRST_SET]Restart reason not supported!");
|
|
return;
|
|
}
|
|
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
PMIC_WRITE_REG_BASE(PMIC_REG_FOR_SW_RESTART_REASON_STR, rsn);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
#endif
|
|
case PMIC_803:
|
|
PMIC_WRITE_REG_BASE(PMIC_REG_FOR_USR_DEF_FLAGS_STR, rsn);
|
|
break;
|
|
case PMIC_803L:
|
|
PMIC_WRITE_REG_BASE(PM803L_REG_FOR_USR_DEF_FLAGS_STR, rsn);
|
|
break;
|
|
case PMIC_807:
|
|
PMIC_WRITE_REG_BASE(PM807_REG_FOR_USR_DEF_FLAGS_STR, rsn);
|
|
#if QUECTEL_PROJECT_CUST
|
|
OSATaskSleep(2);
|
|
//QUECTEL ADD FIX 因为CP和 boot测读取pmic 的寄存器地址不统一导致,在cp侧设置C8区域,但是在boot侧读取的却是cf区域,无法进入强制烧录
|
|
//特地添加的兼容方案,同时写入 C8 CF 这样无论boot读取那一个地址的值都是正常的
|
|
PMIC_WRITE_REG_BASE(PM807_REG_FOR_USR_DEF_FLAGS_STR_BACK_UP, rsn);
|
|
//DON'T delete
|
|
#endif
|
|
break;
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802S:
|
|
PMIC_WRITE_REG_BASE(PM802S_REG_FOR_USR_DEF_FLAGS_STR, rsn);
|
|
break;
|
|
#endif
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
|
|
PMIC_UART_DEBUG("[SYSRST]Restart reason set: %s", desc);
|
|
}
|
|
|
|
UINT8 SysRestartReasonGet(void)
|
|
{
|
|
UINT8 reason = 0;
|
|
|
|
if(SysRestartReasonGetFlag==0)
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
reason=PMIC_READ_REG_BASE(PMIC_REG_FOR_SW_RESTART_REASON_STR);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
#endif
|
|
case PMIC_803:
|
|
reason=PMIC_READ_REG_BASE(PMIC_REG_FOR_USR_DEF_FLAGS_STR);
|
|
break;
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802S:
|
|
reason=PMIC_READ_REG_BASE(PM802S_REG_FOR_USR_DEF_FLAGS_STR);
|
|
break;
|
|
#endif
|
|
case PMIC_803L:
|
|
reason=PMIC_READ_REG_BASE(PM803L_REG_FOR_USR_DEF_FLAGS_STR);
|
|
break;
|
|
case PMIC_807:
|
|
reason=PMIC_READ_REG_BASE(PM807_REG_FOR_USR_DEF_FLAGS_STR);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
reason = SysRestartReasonGlobal;
|
|
|
|
if(reason==0)
|
|
reason='N';
|
|
|
|
switch (reason)
|
|
{
|
|
case 'C':
|
|
case 'R':
|
|
case 'A':
|
|
case 'N':
|
|
case 'E':
|
|
break;
|
|
default:
|
|
return 0;
|
|
}
|
|
return reason;
|
|
}
|
|
|
|
void SysRestartReasonPrint(void)
|
|
{
|
|
UINT8 desc[40] = {0};
|
|
UINT8 reason = 0;
|
|
|
|
if(SysRestartReasonGetFlag==0)
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
reason=PMIC_READ_REG_BASE(PMIC_REG_FOR_SW_RESTART_REASON_STR);
|
|
break;
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
#endif
|
|
case PMIC_803:
|
|
reason=PMIC_READ_REG_BASE(PMIC_REG_FOR_USR_DEF_FLAGS_STR);
|
|
break;
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802S:
|
|
reason=PMIC_READ_REG_BASE(PM802S_REG_FOR_USR_DEF_FLAGS_STR);
|
|
break;
|
|
#endif
|
|
case PMIC_803L:
|
|
reason=PMIC_READ_REG_BASE(PM803L_REG_FOR_USR_DEF_FLAGS_STR);
|
|
break;
|
|
case PMIC_807:
|
|
reason=PMIC_READ_REG_BASE(PM807_REG_FOR_USR_DEF_FLAGS_STR);
|
|
break;
|
|
default:
|
|
ASSERT(0);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
reason = SysRestartReasonGlobal;
|
|
|
|
if(reason==0)
|
|
reason='N';
|
|
|
|
switch (reason)
|
|
{
|
|
case 'C':
|
|
strcpy((char *)desc, "Charging in powering off");
|
|
break;
|
|
case 'R':
|
|
strcpy((char *)desc, "Rd production mode");
|
|
break;
|
|
case 'A':
|
|
strcpy((char *)desc, "rtc Alarm");
|
|
break;
|
|
case 'N':
|
|
strcpy((char *)desc, "Normal power on");
|
|
break;
|
|
case 'E':
|
|
strcpy((char *)desc, "Error reset (WDT)");
|
|
break;
|
|
default:
|
|
PMIC_UART_DEBUG("[SYSRST_PRT]SW restart reason unknown!\r\n");
|
|
return;
|
|
}
|
|
RTI_LOG("SW restart reason: %s", desc);
|
|
}
|
|
|
|
UINT8 isSysRestartByCharging(void)
|
|
{
|
|
return (SysRestartReasonGet() == 'C');
|
|
}
|
|
|
|
UINT8 isSysRestartByRdProduction(void)
|
|
{
|
|
return (SysRestartReasonGet() == 'R');
|
|
}
|
|
|
|
UINT8 isSysRestartByAlarm(void)
|
|
{
|
|
return (SysRestartReasonGet() == 'A');
|
|
}
|
|
|
|
UINT8 isSysRestartByNormal(void)
|
|
{
|
|
return (SysRestartReasonGet() == 'N');
|
|
}
|
|
|
|
UINT8 isSysRestartByError(void)
|
|
{
|
|
return (SysRestartReasonGet() == 'E');
|
|
}
|
|
|
|
void pmic_user_defined_flags_set(UINT8 flag)
|
|
{
|
|
UINT8 var = 0;
|
|
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
if(PMIC_IS_PM813()||PMIC_IS_PM813S())
|
|
{
|
|
var=PMIC_READ_REG_BASE(PMIC_REG_FOR_USR_DEF_FLAGS_STR);
|
|
var &= ~0xF;
|
|
var |= (flag & 0xF); //only use low 4 bits
|
|
PMIC_WRITE_REG_BASE(PMIC_REG_FOR_USR_DEF_FLAGS_STR, var);
|
|
}
|
|
else
|
|
#endif
|
|
if(PMIC_IS_PM802()||PMIC_IS_PM803()||PMIC_IS_PM802S())
|
|
{
|
|
var=PMIC_READ_REG_BASE(PM802_REG_FOR_USR_DEF_FLAGS_STR);
|
|
var &= ~0xF0;
|
|
var |= (flag<<4); //only use high 4 bits
|
|
PMIC_WRITE_REG_BASE(PM802_REG_FOR_USR_DEF_FLAGS_STR, var);
|
|
}
|
|
}
|
|
|
|
UINT8 pmic_user_defined_flags_get(void)
|
|
{
|
|
UINT8 var = 0;
|
|
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
if(PMIC_IS_PM813()||PMIC_IS_PM813S())
|
|
{
|
|
var = PMIC_READ_REG_BASE(PMIC_REG_FOR_USR_DEF_FLAGS_STR);
|
|
return (var & 0xF); //only use low 4 bits
|
|
}
|
|
else
|
|
#endif
|
|
if(PMIC_IS_PM802()||PMIC_IS_PM803()||PMIC_IS_PM802S())
|
|
{
|
|
var=PMIC_READ_REG_BASE(PM802_REG_FOR_USR_DEF_FLAGS_STR);
|
|
return (var>>4); //only use high 4 bits
|
|
}
|
|
else
|
|
{
|
|
return var;
|
|
}
|
|
}
|
|
|
|
BOOL pmic_lcdbacklight_current_status_get(void)
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
if (PMIC_IS_PM813()||PMIC_IS_PM813S()){
|
|
return PM813_LcdBacklight_Status_Get();
|
|
}else
|
|
#endif
|
|
#if (!defined(NOT_SUPPORT_PM802))
|
|
if(PMIC_IS_PM802()||PMIC_IS_PM802S()){
|
|
return PM802_LcdBacklight_Status_Get();
|
|
}else
|
|
#endif
|
|
#if (!defined(NOT_SUPPORT_PM803))
|
|
if(PMIC_IS_PM803()){
|
|
return PM803_LcdBacklight_Status_Get();
|
|
}else
|
|
#endif
|
|
{
|
|
return FALSE;//not supported for other PMIC in this func
|
|
}
|
|
}
|
|
|
|
UINT8 pmic_lcdbacklight_level_get(void)
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
if (PMIC_IS_PM813()||PMIC_IS_PM813S()){
|
|
return PM813_LcdBacklight_Level_Get();
|
|
}else
|
|
#endif
|
|
#if (!defined(NOT_SUPPORT_PM802))
|
|
if(PMIC_IS_PM802()||PMIC_IS_PM802S()){
|
|
return PM802_LcdBacklight_Level_Get();
|
|
}else
|
|
#endif
|
|
#if (!defined(NOT_SUPPORT_PM803))
|
|
if(PMIC_IS_PM803()){
|
|
return PM803_LcdBacklight_Level_Get();
|
|
}else
|
|
#endif
|
|
{
|
|
return 0xFF;//not supported for other PMIC in this func
|
|
}
|
|
}
|
|
|
|
//Indicate for UI whether LCD is initialized within LOGO.bin
|
|
BOOL m_lcd_ever_configed = FALSE;
|
|
|
|
void pmic_userdata_set_app_lcd_ever_configed(void)
|
|
{
|
|
unsigned char var = 0;
|
|
|
|
if( m_lcd_ever_configed == FALSE)
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
if(PMIC_IS_PM813())
|
|
{//use BP_0xF7[4]
|
|
NingboRead( NINGBO_BASE_Reg, NINGBO_RTC_USER_DATA_4_REG, &var );
|
|
var |= 0x10; //BIT_4
|
|
NingboWrite( NINGBO_BASE_Reg, NINGBO_RTC_USER_DATA_4_REG, var );
|
|
}
|
|
else if(PMIC_IS_PM813S())
|
|
{//use BP_0xCF[4]
|
|
NingboRead( NINGBO_BASE_Reg, NINGBO2_RTC_USER_DATA_15_REG, &var );
|
|
var |= 0x10; //BIT_4
|
|
NingboWrite( NINGBO_BASE_Reg, NINGBO2_RTC_USER_DATA_15_REG, var );
|
|
}
|
|
else
|
|
#endif
|
|
#if (!defined(NOT_SUPPORT_PM802))
|
|
if(PMIC_IS_PM802()||PMIC_IS_PM802S())
|
|
{//use BP_0xEB[7]
|
|
GuilinRead( GUILIN_BASE_Reg, 0xEB, &var );
|
|
var |= 0x80; //BIT_7
|
|
GuilinWrite( GUILIN_BASE_Reg, 0xEB, var );
|
|
}else
|
|
#endif
|
|
#if (!defined(NOT_SUPPORT_PM803))
|
|
if(PMIC_IS_PM803()){
|
|
GuilinLiteRead( GUILIN_LITE_BASE_Reg, 0xEB, &var );
|
|
var |= 0x80; //BIT_7
|
|
GuilinLiteWrite( GUILIN_LITE_BASE_Reg, 0xEB, var );
|
|
}
|
|
#endif
|
|
PMIC_UART_DEBUG("[%s]\r\n",__func__);
|
|
}
|
|
}
|
|
|
|
//to detect LCD ever being configed during booting
|
|
BOOL pmic_userdata_get_app_lcd_ever_configed(void)
|
|
{
|
|
unsigned char var = 0;
|
|
|
|
if(m_lcd_ever_configed == FALSE)
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
if(PMIC_IS_PM813())
|
|
{//use BP_0xF7[4]
|
|
NingboRead( NINGBO_BASE_Reg, NINGBO_RTC_USER_DATA_4_REG, &var );
|
|
m_lcd_ever_configed = (var & 0x10)?TRUE:FALSE;
|
|
NingboWrite( NINGBO_BASE_Reg, NINGBO_RTC_USER_DATA_4_REG, var&~(0x10));//clear corresponding bits
|
|
}
|
|
else if(PMIC_IS_PM813S())
|
|
{//use BP_0xCF[4]
|
|
NingboRead( NINGBO_BASE_Reg, NINGBO2_RTC_USER_DATA_15_REG, &var );
|
|
m_lcd_ever_configed = (var & 0x10)?TRUE:FALSE;
|
|
NingboWrite( NINGBO_BASE_Reg, NINGBO2_RTC_USER_DATA_15_REG, var&~(0x10));//clear corresponding bits
|
|
}
|
|
else
|
|
#endif
|
|
#if (!defined(NOT_SUPPORT_PM802))
|
|
if(PMIC_IS_PM802()||PMIC_IS_PM802S())
|
|
{//use BP_0xEB[7]
|
|
GuilinRead( GUILIN_BASE_Reg, 0xEB, &var );
|
|
m_lcd_ever_configed = (var & 0x80)?TRUE:FALSE;
|
|
GuilinWrite( GUILIN_BASE_Reg, 0xEB, var&~(0x80));//clear corresponding bits
|
|
}else
|
|
#endif
|
|
#if (!defined(NOT_SUPPORT_PM803))
|
|
if(PMIC_IS_PM803())
|
|
{
|
|
GuilinLiteRead( GUILIN_LITE_BASE_Reg, 0xEB, &var );
|
|
m_lcd_ever_configed = (var & 0x80)?TRUE:FALSE;
|
|
GuilinLiteWrite( GUILIN_LITE_BASE_Reg, 0xEB, var&~(0x80));//clear corresponding bits
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
PMIC_UART_DEBUG("[%s] failed\r\n",__func__);
|
|
}
|
|
}
|
|
|
|
PMIC_UART_DEBUG("[%s]=[%d]\r\n",__func__,m_lcd_ever_configed);
|
|
return m_lcd_ever_configed;
|
|
}
|
|
|
|
|
|
void pmic_set_sys_restart_reason(void)
|
|
{
|
|
if (isSysRestartByRdProduction())
|
|
{
|
|
set_calib_production_mode(1); //RD production mode detected.
|
|
}
|
|
else if (Is_silentReset())
|
|
{
|
|
SysRestartReasonSet((SW_RESTART_REASON)'E'); //error
|
|
}
|
|
else if (SysRestartReasonGet() == 'C') //already signed by UI
|
|
{
|
|
;
|
|
}
|
|
else if (PMIC_IS_ALARM_TRIGGERD_POWERUP())
|
|
{
|
|
SysRestartReasonSet((SW_RESTART_REASON)'A'); //alarm
|
|
}
|
|
else if (PM812_GET_POWER_UP_REASON() & ((0x1<<5)|(0x1<<0)))
|
|
{
|
|
SysRestartReasonSet((SW_RESTART_REASON)'N'); //fault_wu & onkey_wu
|
|
}
|
|
else if (PM812_GET_POWER_UP_REASON() & ((0x1<<6)|(0x1<<3)|(0x1<<2)))
|
|
{
|
|
SysRestartReasonSet((SW_RESTART_REASON)'C'); //charge -- vbus & bat_wu & exton2
|
|
}
|
|
else if (PMIC_IS_PM803() && (PM812_GET_POWER_UP_REASON() & (0x1<<1)))
|
|
{
|
|
SysRestartReasonSet((SW_RESTART_REASON)'C'); //charge -- exton1n for pm803
|
|
}
|
|
|
|
SysRestartReasonGetGlobal();
|
|
SysRestartReasonSet((SW_RESTART_REASON)'N');
|
|
}
|
|
|
|
UINT32 PMIC_readVbat(void)
|
|
{
|
|
switch (PMIC_ID_GET())
|
|
{
|
|
#if !defined(NOT_SUPPORT_PM802)
|
|
case PMIC_802:
|
|
case PMIC_802S:
|
|
return pm802_get_battery_voltage();
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM813)
|
|
case PMIC_813:
|
|
case PMIC_813A3:
|
|
case PMIC_813S:
|
|
return pm813_get_battery_voltage_withoutCharger();
|
|
#endif
|
|
#if !defined(NOT_SUPPORT_PM803)
|
|
#if defined(DM_RF_ADC_SUPPORT)
|
|
case PMIC_803:
|
|
return (UINT32)GetPm803VbatAdc(TEMP_NORMAL);
|
|
#endif
|
|
#endif
|
|
case PMIC_803L:
|
|
case PMIC_807:
|
|
return 0;
|
|
default:
|
|
ASSERT(0);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
//ICAT EXPORTED FUNCTION - SW_PLAT,PMIC,PMIC_Vbat
|
|
void PMIC_Vbat(void)
|
|
{
|
|
UINT32 tmp = PMIC_readVbat();
|
|
PMIC_UART_DEBUG("\r\nPMIC_Vbat: %d\r\n",tmp);
|
|
}
|
|
|
|
BOOL isLcdEverInitedUponBooting(void)
|
|
{
|
|
return pmic_userdata_get_app_lcd_ever_configed();
|
|
}
|
|
//TODO : may need further porting FUNCs
|
|
//
|
|
UINT8 PMCWriteRegister(UINT8 regToWrite, UINT8 value,UINT16 image_ena)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL PMCGetGPADCValue(PMC_adc_reg_t reg,PMCGetGPADCValueNotifyFunc bindFunc)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
void PMCNotifyEventBind (UINT32 mask,PMCNotifyEventFunc pmcBindFunc)
|
|
{
|
|
}
|
|
|
|
//extern BOOL diagCommSdLogEnable(void);
|
|
|
|
void at_power_control(int flag) //1, power off; 2, reset;
|
|
{
|
|
extern int enterCfunValue;
|
|
extern int CurrentCfunValue;
|
|
|
|
CPUartLogPrintf("%s, flag %d, enterCfunValue 0x%x, CurrentCfunValue 0x%x, ticks=%d",__func__,
|
|
flag, enterCfunValue,CurrentCfunValue,OSAGetTicks());
|
|
RTI_LOG("%s,flag=%d,ticks=%d",__func__,flag,OSAGetTicks());
|
|
|
|
//Rui.xu@2021/08/23:STASR1601-4314,Prevent calling large system functions during FOTA upgrade
|
|
#ifndef MIN_SYS
|
|
if (!IsMiniSystem())
|
|
{
|
|
if(GetCfunValue() != 0) {
|
|
CPUartLogPrintf("set CFUN0,tick=%d",OSAGetTicks());
|
|
RTI_LOG("set CFUN0,tick=%d",OSAGetTicks());
|
|
SetCfunValue(0);
|
|
wait_cfun_done();
|
|
}
|
|
}
|
|
#endif
|
|
RTI_LOG("CFUN0 done,tick=%d",OSAGetTicks());
|
|
CPUartLogPrintf("CFUN0 done,tick=%d",OSAGetTicks());
|
|
|
|
//if(diagCommSdLogEnable()) //leoyang++for sdcard log enable
|
|
{
|
|
// flush_sd_log();
|
|
}
|
|
//diag_comm_transmit_finish();
|
|
|
|
OSATaskSleep(100);
|
|
CPUartLogPrintf("End,tick=%d",OSAGetTicks());
|
|
RTI_LOG("End,ticks:%d",OSAGetTicks());
|
|
|
|
if(flag == 1) //poweroff
|
|
{
|
|
#ifndef MIN_SYS
|
|
if (!IsMiniSystem())
|
|
{
|
|
PMIC_SW_POWERDOWN();
|
|
CPUartLogPrintf("You should not see this!!! otherwise, might PDOWN failure");
|
|
}
|
|
#endif
|
|
}
|
|
else if(flag == 2) //reset
|
|
{
|
|
#ifndef MIN_SYS
|
|
if (!IsMiniSystem())
|
|
PMIC_SW_RESET();
|
|
#endif
|
|
}
|
|
return ;
|
|
|
|
}
|
|
|