📄 powermanagement.c
字号:
/***********************************************************
File: powermanagement.c
Created date: 15 August 2006
Author: Chen.Fei
Copy Right @ Jade corpation
Description:
This file only apply for AS3603.
external function:
void PM_BackLight(double val)
void PM_NorFlash(double val)
void PM_NandFlash(double val)
void PM_Cmos(double val)
void PM_Sim(double val)
void PM_Z228_3v3(double val)
void PM_Z228_1v2(double val)
void PM_WiFi(double val)
void PM_Sdram(double val)
void PM_ChargeDefaultConfig(void)
void PM_ChargeInitial(void)
U32 PM_ChargeStart(void)
U32 PM_ChargeFinish(void)
U32 PM_ChargePreTime(void)
void PM_ChargeInitial(void)
bool PM_ChargeUpdate(U32* uiQacc,U32* uiTime)
bool PM_ChargeIsFull(void)
void PM_AudioInit(void)
void PM_AudioOpen(void)
void PM_AudioClose(void)
void PM_AudioSilence(void)
void PM_AudioVolumn(int vol)
void hw_delay(U32 n)
internal function:
U32 PM_PowerOff()
U32 PM_ForceReset(void)
U32 PM_OverTemperatureDetection()
U32 PM_ChargeStart()
U32 PM_ChargeFinish()
U32 PM_EnableBuck(U32 on)
U32 PM_SetBuckVoltage(double buck_v)
U32 PM_SetRf1Voltage(double rf1_v)
U32 PM_SetRf2Voltage(double rf1_v)
U32 PM_SetRf3Voltage(double rf1_v)
U32 PM_SetRf4Voltage(double rf1_v)
U32 PM_EnableRf1(U32 on)
U32 PM_EnableRf2(U32 on)
U32 PM_EnableRf3(U32 on)
U32 PM_EnableRf4(U32 on)
U32 PM_SetAna1Voltage(double ana1_v)
U32 PM_SetAna2Voltage(double ana2_v)
U32 PM_SetDig1Voltage(double dig1_v)
U32 PM_SetDig2Voltage(double dig2_v)
U32 PM_SetSimVoltage(double sim_v)
U32 PM_EnableAna1(U32 on)
U32 PM_EnableAna2(U32 on)
U32 PM_EnableDig1(U32 on)
U32 PM_EnableDig2(U32 on)
U32 PM_EnableSim(U32 on)
U32 PM_ConfigStepUp(void)
U32 PM_EnableStepUp(U32 on)
U32 PM_PowerOnInitial(void)
U32 PM_Gpio1Output(U32 data)
U32 PM_ReadInterruptStatus(void)
U32 PM_SetCurrent(U32 channel, double current)
U32 PM_EnableCurrent(U32 channel, U32 on)
void WriteAs3603(unsigned char reg_num,unsigned char value)
unsigned char ReadAs3603(unsigned char reg_num)
***********************************************************/
#include <stdio.h>
#include "powermanagement.h"
#include "I2C_extern.h"
#include <windows.h>
#include <pkfuncs.h>
#include <ceddk.h>
#include <types.h>
#include <waveddsi.h>
#include <wavedbg.h>
#include <oalfuncs.h>
//#include "wavmsg.h"
//#include "pdd_audio.h"
//#include <dma.h>
#include "oalintr.h"
//#include "wavemdd.h"
//add for power apmliter
#include "powermanagement.h"
//globle
volatile double g_chargeQAcc = 0.0;
volatile double g_IAvg = 0.0;
volatile U32 g_chargeTime = 0;
volatile U32 g_dischargeTime = 0;
volatile U32 g_chargeUpdateNumber = 0;
#if 1
void PM_delay(U32 n)
{
U32 i = 50000*n;
while(i--);
}
//============================I2C START========================
void WriteAs3603(unsigned char reg_num,unsigned char value)
{
unsigned char cmd[2];
//RETAILMSG(1,(_T("In WriteAs3603\r\n")));
I2C_PinMask( 1 ); // enable i2c pin mask
InitI2C();
/* brief: This API is used to transmit data
** para : length -- the length of the buffer
** para : buffer -- the pointer of data
** para : target -- the address of the target
*/
cmd[0] = reg_num;
cmd[1] = value;
TransmitData(2, cmd, 0x82>>1);
PM_delay(1);
DeleteI2C();
I2C_PinMask( 0 ); // disable i2c pin mask
}
unsigned char ReadAs3603(unsigned char reg_num)
{
unsigned char cmd[2];
unsigned char value;
// RETAILMSG(1,(_T("In ReadAs3603\r\n")));
I2C_PinMask( 1 ); // enable i2c pin mask
InitI2C();
/* brief: This API is used to transmit data
** para : length -- the length of the buffer
** para : buffer -- the pointer of data
** para : target -- the address of the target
*/
cmd[0] = reg_num;
value = ReadData(1, cmd, 0x82>>1);
PM_delay(1);
DeleteI2C();
I2C_PinMask( 0 ); // disable i2c pin mask
return value;
}
//=============================I2C END===========================
#endif
//=============================Audio Amplifier START===========================
void PM_AudioInit(void)
{
//RETAILMSG(1,(_T("In PM_AudioInit\r\n")));
WriteAs3603(AUDIOCTRL_REG, 0x01);//Amplifier on;<32;<8;Output off
WriteAs3603(AUDIOCTRL2_REG, 0x01);//Stereo;Normal;pulldown
}
void PM_AudioOpen(void)
{
U8 value;
value = ReadAs3603(AUDIOCTRL_REG) | 0x01;
WriteAs3603(AUDIOCTRL_REG, value);
}
void PM_AudioClose(void)
{
U8 value;
value = ReadAs3603(AUDIOCTRL_REG) & 0xfe;
WriteAs3603(AUDIOCTRL_REG, value);
}
void PM_AudioSilence(void)
{
U8 value;
value = ReadAs3603(AUDIOCTRL_REG);
value &= 0x0f;
WriteAs3603(AUDIOCTRL_REG, value);
}
U8 PM_AudioVolumn(int vol)
{
U8 i;
U8 value;
int db[15] = {-22,-19,-16,-13,-10,-7,-4,0,2,5,8,11,14,17,20};
for(i = 0;i < 15;i++)
{
if(vol == db[i])
{
break;
}
}
if(i == 15)
{
return false;
}
value = ReadAs3603(AUDIOCTRL_REG) & 0x0f;
value |= (i+1) << 4;
WriteAs3603(AUDIOCTRL_REG, value);
//RETAILMSG( 1 , (TEXT("In PowerAmplifier set \r\n")));
return true;
}
//=============================Audio Amplifier END===========================
/************************************************************************/
/* */
/************************************************************************/
//======================Reset BEGIN=====================
U32 PM_PowerOff(void)
{
WriteAs3603(RESETCONTROL_REG, 0x02); // Closed all power output
return 1;
}
U32 PM_ForceReset(void)
{
WriteAs3603(RESETCONTROL_REG, 0x01);
return 1;
}
U32 PM_OverTemperatureDetection(void)
{
unsigned char data;
U32 flag = 1;
// WriteAs3603(OVERTEMPETURE_REG, 0x01); //Enable overtemperature detetion
data = ReadAs3603(OVERTEMPETURE_REG); //Read temperature status
if(data & 0x04)
{
#ifdef _DEBUG
printf("Tempeture>140");
#endif
flag = 140;
}
else if(data & 0x02)
{
#ifdef _DEBUG
printf("Tempeture>110");
#endif
flag = 110;
}
WriteAs3603(OVERTEMPETURE_REG, 0x09); //Clear overtemperature flag bit
WriteAs3603(OVERTEMPETURE_REG, 0x01);
return flag;
}
//======================Reset END=====================
//======================Step Down BEGIN=====================
// Set buck channel on/off
U32 PM_EnableBuck(U32 on)
{
unsigned char regvalue;
regvalue = ReadAs3603(POWERCTRL_REG);
if(on == 0)
regvalue = regvalue & 0xdf;
else
regvalue = regvalue | 0x20;
WriteAs3603(POWERCTRL_REG, regvalue);
return 1;
}
// Set buck channel voltage
U32 PM_SetBuckVoltage(double buck_v)
{
unsigned char regvalue;
U32 temp;
double f = buck_v * 10.0;
U32 value = (U32)f;
if(value > 30 || value < 10)
{
#ifdef _DEBUG
printf("Buck channel voltage is between 1.0v and 3.0v");
#endif
return 0;
}
value = (value-10);
temp = (U32)value;
regvalue = (char)(temp & 0x1f);
WriteAs3603(STEPDOWN_REG, regvalue);
return 1;
}
//======================Step Down END=====================
//======================LDO BEGIN=====================
// Set RF1 channel voltage
U32 PM_SetRf1Voltage(double rf1_v)
{
unsigned char regvalue;
U32 temp;
double f = rf1_v * 100.0;
U32 value = (U32)f;
if(value > 340 || value < 185)
{
#ifdef _DEBUG
printf("RF1 channel voltage is between 1.85v and 3.4v");
#endif
return 0;
}
value = (value-185)/5;
temp = (U32)value;
regvalue = (char)(temp & 0x1f);
WriteAs3603(RF1VOLTAGE_REG, regvalue);
return 1;
}
// Set RF2 channel voltage
U32 PM_SetRf2Voltage(double rf2_v)
{
unsigned char regvalue;
U32 temp;
double f = rf2_v * 100.0;
U32 value = (U32)f;
if(value > 340 || value < 185)
{
#ifdef _DEBUG
printf("RF2 channel voltage is between 1.85v and 3.4v");
#endif
return 0;
}
value = (value-185)/5;
temp = (U32)value;
regvalue = (char)(temp & 0x1f);
WriteAs3603(RF2VOLTAGE_REG, regvalue);
return 1;
}
// Set RF3 channel voltage
U32 PM_SetRf3Voltage(double rf3_v)
{
unsigned char regvalue;
U32 temp;
double f = rf3_v * 100.0;
U32 value = (U32)f;
if(value > 340 || value < 185)
{
#ifdef _DEBUG
printf("RF3 channel voltage is between 1.85v and 3.4v");
#endif
return 0;
}
value = (value-185)/5;
temp = (U32)value;
regvalue = (char)(temp & 0x1f);
WriteAs3603(RF3VOLTAGE_REG, regvalue);
return 1;
}
// Set RF4 channel voltage
U32 PM_SetRf4Voltage(double rf4_v)
{
unsigned char regvalue;
U32 temp;
double f = rf4_v * 100.0;
U32 value = (U32)f;
if(value > 340 || value < 185)
{
#ifdef _DEBUG
printf("RF4 channel voltage is between 1.85v and 3.4v");
#endif
return 0;
}
value = (value-185)/5;
temp = (U32)value;
regvalue = (char)(temp & 0x1f);
WriteAs3603(RF4VOLTAGE_REG, regvalue);
return 1;
}
// Set RF1 channel on/off
U32 PM_EnableRf1(U32 on)
{
unsigned char regvalue;
regvalue = ReadAs3603(RFSWITCH_REG);
if(on == 0)
regvalue = regvalue & 0xEF;
else
{
if((regvalue & 0x01) == 0x01)
{
regvalue = regvalue & 0xFE; //Enables VRF. Set ana_sw = 0 before setting rf_on = 1.
WriteAs3603(RFSWITCH_REG, regvalue);
}
regvalue = regvalue | 0x10;
}
WriteAs3603(RFSWITCH_REG, regvalue);
return 1;
}
// Set RF2 channel on/off
U32 PM_EnableRf2(U32 on)
{
unsigned char regvalue;
regvalue = ReadAs3603(RFSWITCH_REG);
if(on == 0)
regvalue = regvalue & 0xDF;
else
{
if((regvalue & 0x02) == 0x02)
{
regvalue = regvalue & 0xFD; //Enables VRF. Set ana_sw = 0 before setting rf_on = 1.
WriteAs3603(RFSWITCH_REG, regvalue);
}
regvalue = regvalue | 0x20;
}
WriteAs3603(RFSWITCH_REG, regvalue);
return 1;
}
// Set RF3 channel on/off
U32 PM_EnableRf3(U32 on)
{
unsigned char regvalue;
regvalue = ReadAs3603(RFSWITCH_REG);
if(on == 0)
regvalue = regvalue & 0xBF;
else
{
if((regvalue & 0x04) == 0x04)
{
regvalue = regvalue & 0xFB; //Enables VRF. Set ana_sw = 0 before setting rf_on = 1.
WriteAs3603(RFSWITCH_REG, regvalue);
}
regvalue = regvalue | 0x40;
}
WriteAs3603(RFSWITCH_REG, regvalue);
return 1;
}
// Set RF4 channel on/off
U32 PM_EnableRf4(U32 on)
{
unsigned char regvalue;
regvalue = ReadAs3603(RFSWITCH_REG);
if(on == 0)
regvalue = regvalue & 0x7F;
else
{
if((regvalue & 0x08) == 0x08)
{
regvalue = regvalue & 0xF7; //Enables VRF. Set ana_sw = 0 before setting rf_on = 1.
WriteAs3603(RFSWITCH_REG, regvalue);
}
regvalue = regvalue | 0x80;
}
WriteAs3603(RFSWITCH_REG, regvalue);
return 1;
}
// Set Ana1 channel voltage
U32 PM_SetAna1Voltage(double ana1_v)
{
unsigned char regvalue, last;
U32 temp;
double f = ana1_v * 10.0;
U32 value = (U32)f;
if(value > 32 || value < 25)
{
#ifdef _DEBUG
printf("Ana1 channel voltage is between 2.5v and 3.2v");
#endif
return 0;
}
last = ReadAs3603(ANAVOLTAGE_REG);
last = last & 0x1F;
value = value - 25;
temp = (U32)value;
regvalue = ((char)temp) << 5;
regvalue += last;
WriteAs3603(ANAVOLTAGE_REG, regvalue);
return 1;
}
// Set Ana2 channel voltage
U32 PM_SetAna2Voltage(double ana2_v)
{
unsigned char regvalue, last;
U32 temp;
double f = ana2_v * 100.0;
U32 value = (U32)f;
if(value > 340 || value < 185)
{
#ifdef _DEBUG
printf("Ana2 channel voltage is between 1.85v and 3.4v");
#endif
return 0;
}
last = ReadAs3603(ANAVOLTAGE_REG);
last = last & 0xE0;
value = (value-185)/5;
temp = (U32)value;
regvalue = ((char)temp) & 0x1F;
regvalue += last;
WriteAs3603(ANAVOLTAGE_REG, regvalue);
return 1;
}
// Set DIG1 channel voltage
U32 PM_SetDig1Voltage(double dig1_v)
{
unsigned char regvalue;
U32 temp;
double f = dig1_v * 100.0;
U32 value = (U32)f;
if(value > 250 || value < 75)
{
#ifdef _DEBUG
printf("Dig1 channel voltage is between 0.75v and 2.5v");
#endif
return 0;
}
if(value >= 75 && value <= 180)
{
value = (value-75)/5;
temp = (U32)value;
regvalue = ((char)temp);
}
else if(value > 180 && value <= 250)
{
value = (value-180)/10;
temp = (U32)value;
regvalue = ((char)temp) + 0x23;
}
regvalue = regvalue & 0x3F;
WriteAs3603(DIG1VOLTAGE_REG, regvalue);
return 1;
}
// Set DIG2 channel voltage
U32 PM_SetDig2Voltage(double dig2_v)
{
unsigned char regvalue, last;
U32 temp;
double f = dig2_v * 100.0;
U32 value = (U32)f;
if(value > 250 || value < 75)
{
#ifdef _DEBUG
printf("Dig2 channel voltage is between 0.75v and 2.5v");
#endif
return 0;
}
last = ReadAs3603(DIG2VOLTAGE_REG);
last = last & 0xC0;
if(value >= 75 && value <= 180)
{
value = (value-75)/5;
temp = (U32)value;
regvalue = ((char)temp);
}
else if(value > 180 && value <= 250)
{
value = (value-180)/10;
temp = (U32)value;
regvalue = ((char)temp) + 0x23;
}
regvalue = regvalue & 0x3F;
regvalue += last;
WriteAs3603(DIG2VOLTAGE_REG, regvalue);
return 1;
}
// Set SIM channel voltage
U32 PM_SetSimVoltage(double sim_v)
{
unsigned char regvalue, last;
double f = sim_v * 10.0;
U32 value = (U32)f;
if(!(value == 18 || value == 30))
{
#ifdef _DEBUG
printf("Dig2 channel voltage is 1.8v or 3.0v");
#endif
return 0;
}
last = ReadAs3603(DIG2VOLTAGE_REG);
if(value == 18)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -