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

📄 powermanagement.c

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