📄 powermanagement.c
字号:
value = (value-185)/5;
temp = (U32)value;
regvalue = ((unsigned char)temp) & 0x1F;//save the last 5 bit
regvalue += last;//ana1+ana2
WriteAs3603(ANAVOLTAGE_REG, regvalue); // 765 43210
// ldo_ana1_v ldo_ana2_v
return 1;
}
/*****************************************
Fuction: Set DIG1 channel voltage
Input: DIG1 channel voltage,[0.75~2.50]
Output: none
Return: 1 success
0 fail
Modify: 2006-11-20
qzsu
old:regvalue = ((char)temp);
new:regvalue = ((unsigned char)temp);
old:regvalue = ((char)temp) + 0x23;
new:regvalue = ((unsigned char)temp) + 0x23;
*******************************************/
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 = ((unsigned char)temp);
}
else if(value > 180 && value <= 250)
{
value = (value-180)/10;
temp = (U32)value;
regvalue = ((unsigned char)temp) + 0x23;
}
regvalue = regvalue & 0x3F;
WriteAs3603(DIG1VOLTAGE_REG, regvalue); // 76 543210
// N/A ldo_dig1_v
return 1;
}
/*****************************************
Fuction: Set DIG2 channel voltage
Input: DIG2 channel voltage,[0.75~2.50]
Output: none
Return: 1 success
0 fail
Modify: 2006-11-20
qzsu
old:regvalue = ((char)temp);
new:regvalue = ((unsigned char)temp);
old:regvalue = ((char)temp) + 0x23;
new:regvalue = ((unsigned char)temp) + 0x23;
*******************************************/
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); // 7 6 543210
// N/A ldo_sim_v ldo_dig2_v
last = last & 0xC0;
if(value >= 75 && value <= 180)
{
value = (value-75)/5;
temp = (U32)value;
regvalue = ((unsigned char)temp);
}
else if(value > 180 && value <= 250)
{
value = (value-180)/10;
temp = (U32)value;
regvalue = ((unsigned char)temp) + 0x23;
}
regvalue = regvalue & 0x3F;
regvalue += last;
WriteAs3603(DIG2VOLTAGE_REG, regvalue); // 7 6 543210
// N/A ldo_sim_v ldo_dig2_v
return 1;
}
/*****************************************
Fuction: Set SIM channel voltage
Input: SIM channel voltage,[0.75~2.50]
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
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); // 7 6 543210
// N/A ldo_sim_v ldo_dig2_v
//Sets the voltage for LDO VSIM.
//0 = 1.8V
//1 = 3.0V (default)
if(value == 18)
{
regvalue = last & 0xBF;
}
else if(value == 30)
{
regvalue = last | 0x40;
}
else
return 0;
WriteAs3603(DIG2VOLTAGE_REG, regvalue); // 7 6 543210
// N/A ldo_sim_v ldo_dig2_v
return 1;
}
// Set Ana1 channel on/off
/*****************************************
Fuction: Set Ana1 channel on/off
Input: 1 LDO VANA_1 is on.
0 LDO VANA_1 is off.
Note: Do not set this bit = 0 or serial interface access will be disabled.
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
U32 PM_EnableAna1(U32 on)
{
unsigned char regvalue;
regvalue = ReadAs3603(POWERCTRL_REG);
//Enables control of LDO VANA_1.
//0 = LDO VANA_1 is off.
//1 = LDO VANA_1 is on.
//Note: Do not set this bit = 0 or serial interface access will be disabled.
if(on == 0)
regvalue = regvalue & 0xFE;
else
regvalue = regvalue | 0x01;
WriteAs3603(POWERCTRL_REG, regvalue); // 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
return 1;
}
/*****************************************
Fuction: Set Ana2 channel on/off
Input: 1 LDO VANA_2 is on.
0 LDO VANA_2 is off.
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
U32 PM_EnableAna2(U32 on)
{
unsigned char regvalue;
regvalue = ReadAs3603(POWERCTRL_REG);
if(on == 0)
regvalue = regvalue & 0xFD;
else
regvalue = regvalue | 0x02;
WriteAs3603(POWERCTRL_REG, regvalue); // 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
return 1;
}
/*****************************************
Fuction: Set Dig1 channel on/off
Input: 1 LDO VDIG_1 is on.
0 LDO VDIG_1 is off.
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
U32 PM_EnableDig1(U32 on)
{
unsigned char regvalue;
regvalue = ReadAs3603(POWERCTRL_REG);
if(on == 0)
regvalue = regvalue & 0xFB;
else
regvalue = regvalue | 0x04;
WriteAs3603(POWERCTRL_REG, regvalue); // 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
return 1;
}
/*****************************************
Fuction: Set Dig2 channel on/off
Input: 1 LDO VDIG_2 is on.
0 LDO VDIG_2 is off.
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
U32 PM_EnableDig2(U32 on)
{
unsigned char regvalue;
regvalue = ReadAs3603(POWERCTRL_REG);
if(on == 0)
regvalue = regvalue & 0xF7;
else
regvalue = regvalue | 0x08;
WriteAs3603(POWERCTRL_REG, regvalue); // 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
return 1;
}
/*****************************************
Fuction: Set Sim channel on/off
Input: 1 LDO VSIM is on.
0 LDO VSIM is off.
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
U32 PM_EnableSim(U32 on)
{
unsigned char regvalue;
regvalue = ReadAs3603(POWERCTRL_REG);
if(on == 0)
regvalue = regvalue & 0xEF;
else
regvalue = regvalue | 0x10;
WriteAs3603(POWERCTRL_REG, regvalue); // 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
return 1;
}
//======================LDO END=====================
//======================Step Up BEGIN=====================
/*****************************************
Fuction: Step Up DC/DC Converter channel on/off
Input: 0 = Step Up DC/DC Converter is off.
1 = Step Up DC/DC Converter is on.
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
U32 PM_EnableStepUp(U32 on)
{
unsigned char regvalue;
regvalue = ReadAs3603(STEPUPCTRL_REG);
if(on == 0)
regvalue = regvalue & 0xFE;
else
regvalue = regvalue | 0x01;
WriteAs3603(STEPUPCTRL_REG, regvalue); // 7654 3 2 1 0
// N/A stpup_low_curr stpup_freq stpup_sw_on stpup_on
return 1;
}
//======================Step Up END=====================
//======================GPIO BEGIN=====================
// Sets GPIO Read
U32 PM_GpioRead(void)
{
unsigned char regvalue;
regvalue = ReadAs3603(GPIOSIGNAL_REG);
return regvalue;
}
// Sets GPIO Write
U32 PM_GpioWrite(U32 channel, U32 data)
{
unsigned char regvalue, last;
if(channel == 2)
{
regvalue = ReadAs3603(GPIO2CTRL_REG);
if((regvalue & 0x04) != 0)
{
#ifdef _DEBUG
printf("Pin GPIO2 is used as feedback-pin for Step Down DC/DC Converter");
#endif
return -1;
}
}
last = ReadAs3603(GPIOSIGNAL_REG);
regvalue = 0x01<<(channel-1);
regvalue = ~regvalue;
last &= regvalue;
regvalue = 0x01<<(channel-1);
if(data != 0)
regvalue += last;
WriteAs3603(GPIOSIGNAL_REG, regvalue);
return 1;
}
// Read interrupt status
U32 PM_ReadInterruptStatus(void)
{
return ReadAs3603(IRQSTATUS_REG);
}
//======================GPIO END=====================
//======================Current Sink BEGIN=====================
// Sets the current of current source CURR X.
// Unit is mA
/*****************************************
Fuction: Sets the current of current source CURR X.
Input: channel number
current [0.625~160]mA
Output: none
Return: 1 success
0 fail
Modify: 2006-11-20
qzsu
old:double f = current * 10.0;
new:double f = current * 1000.0;
old:int value = (int)f;
new:U32 value = (U32)f;
old:if (value<0 || value>1600 )
new:if (value<=0 || value>160000 )
old:value = value * 100 / 625;
new:value = value / 625;
*******************************************/
U32 PM_SetCurrent(U32 channel, double current)
{
unsigned char regvalue;
double f = current * 1000.0;
U32 value = (U32)f;
if (value<=0 || value>160000 )
{
#ifdef _DEBUG
printf("CURR%d channel current is between 0 and 160mA", channel);
#endif
return 0;
}
else if(channel<1 || channel>4)
{
#ifdef _DEBUG
printf("Error: channel number!");
#endif
return 0;
}
//00h Power Down
//01h 0.625mA
//... ...
//FFh 160mA
value = value / 625;
regvalue = (unsigned char) value;
WriteAs3603(CURR1VALUE_REG+channel-1, regvalue);// 76543210
// curr1_current
return 1;
}
/*****************************************
Fuction: Set CURR Control Register
Input: channel number
00 = Pin CURR is turned off.
01 = Pin CURR is active.
Output: none
Return: 1 success
0 fail
Modify:
*******************************************/
U32 PM_EnableCurrent(U32 channel, U32 on)
{
unsigned char last, regvalue;
if(channel<1 || channel>4)
{
#ifdef _DEBUG
printf("Error: channel number!");
#endif
return 0;
}
last = ReadAs3603(CURRCTRL_REG); // 76 54 32 10
// curr4_ctrl curr3_ctrl curr2_ctrl curr1_ctrl
regvalue = 0x03;
regvalue <<= (channel-1)*2;
regvalue = ~regvalue;
last &= regvalue;
if (on)
regvalue = 0x01;
else
regvalue = 0x00;
regvalue <<= (channel-1)*2;
regvalue += last;
WriteAs3603(CURRCTRL_REG, regvalue); // 76 54 32 10
// curr4_ctrl curr3_ctrl curr2_ctrl curr1_ctrl
return 1;
}
//======================Current Sink END=====================
/************************************************************************/
/* */
/************************************************************************/
U32 PM_PowerOnInitial(void)
{
return 1;
}
/************************************************************************/
//=============================Audio Amplifier START===========================
/*****************************************
Fuction: audio amplifier initial
Input: none
Output: none
Return: none
Modify:
*******************************************/
void PM_AudioInit(void)
{
WriteAs3603(AUDIOCTRL_REG, 0x01);//Amplifier on;<32;<8;Output off
WriteAs3603(AUDIOCTRL2_REG, 0x01);//Stereo;Normal;pulldown
}
/*****************************************
Fuction: audio amplifier open
Input: none
Output: none
Return: none
Modify:
*******************************************/
void PM_AudioOpen(void)
{
U8 value;
value = ReadAs3603(AUDIOCTRL_REG) | 0x01;
WriteAs3603(AUDIOCTRL_REG, value);
}
/*****************************************
Fuction: audio amplifier close
Input: none
Output: none
Return: none
Modify:
*******************************************/
void PM_AudioClose(void)
{
U8 value;
value = ReadAs3603(AUDIOCTRL_REG) & 0xfe;
WriteAs3603(AUDIOCTRL_REG, value);
}
/*****************************************
Fuction: audio amplifier silence
Input: none
Output: none
Return: none
Modify:
*******************************************/
void PM_AudioSilence(void)
{
U8 value;
value = ReadAs3603(AUDIOCTRL_REG);
value &= 0x0f;
WriteAs3603(AUDIOCTRL_REG, value);
}
/*****************************************
Fuction: set audio amplifier db
Input: int vol -- db value
Output: none
Return: true -- succeed
false -- fail
Modify:
*******************************************/
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);
return true;
}
//=============================Audio Amplifier END===========================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -