⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 powermanagement.c

📁 此压缩包为杰得开发得z228的BSP的源代码,可以实现很多功能,尤其是视频解码有很好的效果.
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************
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 + -