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

📄 powermanagement.c

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