📄 powermanagement.c
字号:
/***********************************************************
File: powermanagement.c
Created date: 15 August 2006
Author: Chen.Fei
Modify: qzsu 2006-11-11
Copy Right @ Jade corpation
Description:
This file only apply for AS3603.
***********************************************************/
#include <stdio.h>
#include ".\inc\I2C_extern.h"
#include ".\inc\powermanagement.h"
//#define I2C_WINCE
#ifdef I2C_WINCE
#include <windows.h>
#include <ceddk.h>
#include <Pkfuncs.h>
#endif
//#define _DEBUG
void PM_AudioInit(void);
void PM_AudioOpen(void);
void PM_AudioClose(void);
void PM_AudioSilence(void);
U8 PM_AudioVolumn(int vol);
void PM_delay(U32 n);
/*****************************************
Fuction: delay
Input: U32 n--ms
Output: none
Return: none
Modify:
*******************************************/
void PM_delay(U32 n)
{
volatile U32 i = 50000*n;
while(i--);
}
//============================I2C START========================
/*****************************************
Fuction: write data to as3603
Input: unsigned char reg_num -- resigter address
unsigned char value -- the data of writing
Output: none
Return: none
Modify:
*******************************************/
void WriteAs3603(unsigned char reg_num,unsigned char value)
{
unsigned char cmd[2];
I2C_PinMask( 1 ); // enable i2c pin mask
PM_delay(1);
/* 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);
I2C_PinMask( 0 ); // disable i2c pin mask
PM_delay(1);
}
/*****************************************
Fuction: read data from as3603
Input: unsigned char reg_num -- resigter address
Output: none
Return: the data of readed from as3603
Modify:
*******************************************/
unsigned char ReadAs3603(unsigned char reg_num)
{
unsigned char cmd[2];
unsigned char value;
I2C_PinMask( 1 ); // enable i2c pin mask
cmd[0] = reg_num;
value = ReadData(1, cmd, 0x82>>1);
PM_delay(1);
I2C_PinMask( 0 ); // disable i2c pin mask
return value;
}
//=============================I2C END===========================
/************************************************************************/
/* */
/************************************************************************/
//======================Reset BEGIN=====================
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
/*****************************************
Fuction: Enables the Step Down DC/DC Converter.
Input: 1 Step Down DC/DC Converter is on.
0 Step Down DC/DC Converter is off.
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
U32 PM_EnableBuck(U32 on)
{
unsigned char regvalue;
regvalue = ReadAs3603(POWERCTRL_REG); // 76 5 4 3 2 1 0
// N/A buck_on ldo_sim_on ldo_dig2_on ldo_dig1_on ldo_ana2_on ldo_ana1_on
if(on == 0)
regvalue = regvalue & 0xdf; // 5(buck_on is off)
else
regvalue = regvalue | 0x20; // 5(buck_on is on)
WriteAs3603(POWERCTRL_REG, regvalue);
return 1;
}
// Set buck channel voltage
/*****************************************
Fuction: Set buck channel voltage
Input: buck channel voltage,[1.0~3.0]
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
U32 PM_SetBuckVoltage(double buck_v)
{
unsigned char regvalue;
U32 temp;
double f = buck_v * 10.0;
U32 value = (U32)f;//double to int
if(value > 30 || value < 10)
{
#ifdef _DEBUG
printf("Buck channel voltage is between 1.0v and 3.0v");
#endif
return 0;
}
//Controls the voltage selection for the Step Down DC/DC Converter.
//00000 = 1.0V
//......(LSB = 100mV)
//10011 = 2.9V
//10100-11111 = 3.0V
value = (value-10);
temp = (U32)value;
regvalue = (char)(temp & 0x1f);
WriteAs3603(STEPDOWN_REG, regvalue); // 765 43210
// N/A buck_v
return 1;
}
//======================Step Down END=====================
//======================LDO BEGIN=====================
// Set RF1 channel voltage
/*****************************************
Fuction: Set LDO_RF1 Voltage Register
Input: RF1 channel voltage,[1.85~3.40]
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
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;
}
//00000 = 1.85V
//......(LSB = 50mV)
//11111 = 3.40V
value = (value-185)/5;
temp = (U32)value;
regvalue = (char)(temp & 0x1f);
WriteAs3603(RF1VOLTAGE_REG, regvalue); // 765 43210
// N/A ldo_rf1_v
return 1;
}
// Set RF2 channel voltage
/*****************************************
Fuction: Set LDO_RF2 Voltage Register
Input: RF2 channel voltage,[1.85~3.40]
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
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;
}
//00000 = 1.85V
//......(LSB = 50mV)
//11111 = 3.40V
value = (value-185)/5;
temp = (U32)value;
regvalue = (char)(temp & 0x1f);
WriteAs3603(RF2VOLTAGE_REG, regvalue); // 765 43210
// N/A ldo_rf2_v
return 1;
}
/*****************************************
Fuction: Set LDO_RF3 Voltage Register
Input: RF3 channel voltage,[1.85~3.40]
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
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;
}
//00000 = 1.85V
//......(LSB = 50mV)
//11111 = 3.40V
value = (value-185)/5;
temp = (U32)value;
regvalue = (char)(temp & 0x1f);
WriteAs3603(RF3VOLTAGE_REG, regvalue); // 765 43210
// N/A ldo_rf3_v
return 1;
}
/*****************************************
Fuction: Set LDO_RF4 Voltage Register
Input: RF4 channel voltage,[1.85~3.40]
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
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;
}
//00000 = 1.85V
//......(LSB = 50mV)
//11111 = 3.40V
value = (value-185)/5;
temp = (U32)value;
regvalue = (char)(temp & 0x1f);
WriteAs3603(RF4VOLTAGE_REG, regvalue); // 765 43210
// N/A ldo_rf4_v
return 1;
}
/*****************************************
Fuction: Set RF1 channel on/off
Input: 0 off
1 on
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
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 ana1_sw = 0 before setting ldo_rf1_on = 1.
WriteAs3603(RFSWITCH_REG, regvalue);
}
regvalue = regvalue | 0x10;
}
WriteAs3603(RFSWITCH_REG, regvalue); // 7 6 5 4 3 2 1 0
// ldo_rf4_on ldo_rf3_on ldo_rf2_on ldo_rf1_on rf4_sw rf3_sw ana2_sw ana1_sw
return 1;
}
/*****************************************
Fuction: Set RF2 channel on/off
Input: 0 off
1 on
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
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 ana2_sw = 0 before setting ldo_rf2_on = 1.
WriteAs3603(RFSWITCH_REG, regvalue);
}
regvalue = regvalue | 0x20;
}
WriteAs3603(RFSWITCH_REG, regvalue); // 7 6 5 4 3 2 1 0
// ldo_rf4_on ldo_rf3_on ldo_rf2_on ldo_rf1_on rf4_sw rf3_sw ana2_sw ana1_sw
return 1;
}
/*****************************************
Fuction: Set RF3 channel on/off
Input: 0 off
1 on
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
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 rf3_sw = 0 before setting ldo_rf3_on = 1.
WriteAs3603(RFSWITCH_REG, regvalue);
}
regvalue = regvalue | 0x40;
}
WriteAs3603(RFSWITCH_REG, regvalue); // 7 6 5 4 3 2 1 0
// ldo_rf4_on ldo_rf3_on ldo_rf2_on ldo_rf1_on rf4_sw rf3_sw ana2_sw ana1_sw
return 1;
}
/*****************************************
Fuction: Set RF4 channel on/off
Input: 0 off
1 on
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
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 rf4_sw = 0 before setting ldo_rf4_on = 1.
WriteAs3603(RFSWITCH_REG, regvalue);
}
regvalue = regvalue | 0x80;
}
WriteAs3603(RFSWITCH_REG, regvalue); // 7 6 5 4 3 2 1 0
// ldo_rf4_on ldo_rf3_on ldo_rf2_on ldo_rf1_on rf4_sw rf3_sw ana2_sw ana1_sw
return 1;
}
/*****************************************
Fuction: Set Ana1 channel voltage
Input: Ana1 channel voltage,[2.5~3.2]
Output: none
Return: 1 success
0 fail
Modify: 2006-11-20
qzsu
old:regvalue = ((char)temp) & 0x1F;
new:regvalue = ((unsigned char)temp) & 0x1F;
*******************************************/
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\r\n");
#endif
return 0;
}
last = ReadAs3603(ANAVOLTAGE_REG); // 765 43210
// ldo_ana1_v ldo_ana2_v
last = last & 0x1F;//mask the first 3 bit,save ana2
//Sets the voltage for LDO VANA_1.
//000 = 2.5V
//...(LSB = 100mV)
//111 = 3.2V
value = value - 25;
temp = (U32)value;
regvalue = ((unsigned char)temp) << 5;
regvalue += last;//ana1+ana2
WriteAs3603(ANAVOLTAGE_REG, regvalue); // 765 43210
// ldo_ana1_v ldo_ana2_v
return 1;
}
/*****************************************
Fuction: Set Ana2 channel voltage
Input: Ana2 channel voltage,[1.85~3.40]
Output: none
Return: 1 success
0 fail
Modify: 2006-11-20
qzsu
old:regvalue = ((char)temp) & 0x1F;
new:regvalue = ((unsigned char)temp) & 0x1F;
*******************************************/
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\r\n");
#endif
return 0;
}
last = ReadAs3603(ANAVOLTAGE_REG); // 765 43210
// ldo_ana1_v ldo_ana2_v
last = last & 0xE0;//mask the last 5 bit,save ana1
//Sets the voltage for LDO VANA_2.
//00000 = 1.85V
//...(LSB = 50mV)
//11111 = 3.40V
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -