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

📄 tas5508.c

📁 关于收音功能代码,并且显示在OSD和VFD上
💻 C
字号:
/**************************************************************************************/
/***********************                    BBK CONFIDENTIAL                   ************************/
/***********************                                                                    ************************/
/***********************         Description : Digital Audio Process          ************************/
/***********************                                                                    ************************/
/*********************** Company: BBK AV ELECTRONICS CORP.,LTD ************************/
/***********************                                                                    ************************/
/***********************              Programmer : Terry Lee                  ******** ****************/
/**************************************************************************************/

#define TAS5508_PAR
#pragma NOAREGS
#include "general.h"
#include  "..\..\procdef.h"

#ifdef USE_TAS5508
/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
#if defined(USE_SW_FILTER)
static code BYTE butterworth_2LP_filter_table[LP_HZ_MAX][20]={
{
0x00,0x00,0x01,0xFF,
0x00,0x00,0x03,0xFF,
0x00,0x00,0x01,0xFF,
0x00,0xFD,0x28,0x1B,
0xFF,0x82,0xCF,0xE6
},//LP_120HZ
{
0x00,0x00,0x03,0x1D,
0x00,0x00,0x06,0x3A,
0x00,0x00,0x03,0x1D,
0x00,0xFC,0x72,0x27,
0xFF,0x83,0x81,0x63
},//LP_150HZ
{
0x00,0x00,0x04,0x79,
0x00,0x00,0x08,0xF2,
0x00,0x00,0x04,0x79,
0x00,0xFB,0xBC,0x37,
0xFF,0x84,0x31,0xE5
},//LP_180HZ
{
0x00,0x00,0x05,0x83,
0x00,0x00,0x0B,0x06,
0x00,0x00,0x05,0x83,
0x00,0xFB,0x42,0xEE,
0xFF,0x84,0xA7,0x05
},//LP_200HZ
{
0x00,0x00,0x06,0xA8,
0x00,0x00,0x0D,0x50,
0x00,0x00,0x06,0xA8,
0x00,0xFA,0xC9,0xA7,
0xFF,0x85,0x1B,0xB7
},//LP_220HZ
{
0x00,0x00,0x08,0x92,
0x00,0x00,0x11,0x25,
0x00,0x00,0x08,0x92,
0x00,0xFA,0x13,0xC1,
0xFF,0x85,0xC9,0xF3
},//LP_250HZ
{
0x00,0x00,0x0C,0x4A,
0x00,0x00,0x18,0x94,
0x00,0x00,0x0C,0x4A,
0x00,0xF8,0xE4,0xA4,
0xFF,0x86,0xEA,0x32
},//LP_300HZ
{
0x00,0x00,0x10,0xA7,
0x00,0x00,0x21,0x4E,
0x00,0x00,0x10,0xA7,
0x00,0xF7,0xB5,0x9A,
0xFF,0x88,0x07,0xCA
},//LP_350HZ
{
0x00,0x00,0x15,0xA7,
0x00,0x00,0x2B,0x4E,
0x00,0x00,0x15,0xA7,
0x00,0xF6,0x86,0xA4,
0xFF,0x89,0x22,0xC0
},//LP_400HZ
};
#endif

#if defined(USE_FLFR_FILTER) || defined(USE_SLSR_FILTER) ||defined(USE_CT_FILTER)
static code BYTE butterworth_2HP_filter_table[HP_HZ_MAX][20]={
{
0x00,0x7F,0x0E,0x41,
0xFF,0x01,0xE3,0x7E,
0x00,0x7F,0x0E,0x41,
0x00,0xFE,0x1A,0xBA,
0xFF,0x81,0xE1,0xB5
},//HP_80HZ
{
0x00,0x7E,0xD2,0x19,
0xFF,0x02,0x5B,0xCE,
0x00,0x7E,0xD2,0x19,
0x00,0xFD,0xA1,0x6A,
0xFF,0x82,0x59,0x06
},//HP_100HZ
{
0x00,0x7E,0xB4,0x0F,
0xFF,0x02,0x97,0xE1,
0x00,0x7E,0xB4,0x0F,
0x00,0xFD,0x64,0xC2,
0xFF,0x82,0x94,0x84
},//HP_110HZ
{
0x00,0x7E,0x96,0x0D,
0xFF,0x02,0xD3,0xE5,
0x00,0x7E,0x96,0x0D,
0x00,0xFD,0x28,0x1B,
0xFF,0x82,0xCF,0xE6
},//HP_120HZ
{
0x00,0x7E,0x3C,0x31,
0xFF,0x03,0x87,0x9E,
0x00,0x7E,0x3C,0x31,
0x00,0xFC,0x72,0x27,
0xFF,0x83,0x81,0x63
},//HP_150HZ
{
0x00,0x7D,0xE2,0x94,
0xFF,0x04,0x3A,0xD7,
0x00,0x7D,0xE2,0x94,
0x00,0xFB,0xBC,0x37,
0xFF,0x84,0x31,0xE5
},//HP_180HZ
};
#endif

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
void vSendToneVol(BYTE bTone,BYTE bChVol) large
{
	BYTE bTemp;
	BYTE bByte[4];

	if(bChVol>BBK_MAX_TONE_VOL_LEVEL) bChVol=BBK_MAX_TONE_VOL_LEVEL;
	
	if(bChVol>BBK_MAX_TONE_VOL_LEVEL/2)
	{
		bTemp=0x12-(bChVol-BBK_MAX_TONE_VOL_LEVEL/2);
	}
	else
	{
		bTemp=0x12+(BBK_MAX_TONE_VOL_LEVEL/2-bChVol);
	}
	
	bByte[3]=bTemp;																		//CHANNEL1_2_7
	bByte[2]=0;																			//CHANNEL3_4
	bByte[1]=0;																			//CHANNEL5_6
	bByte[0]=0;																			//CHANNEL8
	
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,bTone,4,bByte);
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
void vSendChannelVol(BYTE bChannel,BYTE bChVol,BYTE  bPlus) large
{
	BYTE bByte[4];
	BYTE bVol;
	WORD wVolume;

	if(bChVol>BBK_MAX_CH_VOL_LEVEL) bChVol=BBK_MAX_CH_VOL_LEVEL;
	
	bVol=_bMasterVol+bChVol;

	if((_bMasterVol==0) || (fgIsMute())) bVol=0;											//volume=0,mute
	else if(bVol<=BBK_MAX_CH_VOL_LEVEL/2) bVol=0;										//volume+speaker<=0,mute
	else if(bVol>(BBK_MAX_MAIN_VOL+BBK_MAX_CH_VOL_LEVEL/2)) bVol=BBK_MAX_MAIN_VOL;		//volume+speaker>maxvolume,maxvolume
	else bVol=bVol-BBK_MAX_CH_VOL_LEVEL/2;												//volume+speaker-BBK_MAX_CH_VOL_LEVEL/2

	if(bVol>BBK_MAX_MAIN_VOL) bVol=BBK_MAX_MAIN_VOL;
	
	if(bVol>20)
	{
		wVolume=0x128-(bVol-20)*4-160;													// 1dB per step
	}
	else if(bVol>0)
	{
		wVolume=0x128-bVol*8;															// 2dB per step
	}
	else
	{
		wVolume=0x245;
	}

	if(bChannel==CHANNELSW_VOLUME_REGISTER && bVol>0)
	{
		bVol = bEepromReadByte(AMP_BASS_BOOST_POS);
		
		switch(bVol)
		{
			case 1:
				wVolume=wVolume-BOOST_VOL_1;
			break;

			case 2:
				wVolume=wVolume-BOOST_VOL_2;
			break;

			case 3:
				wVolume=wVolume-BOOST_VOL_3;
			break;
			
			default:				
			break;
		}
	}
	#ifdef BBK_EARPHONE
	else if((bChannel==CHANNELFL_VOLUME_REGISTER || bChannel==CHANNELFR_VOLUME_REGISTER) && fgIsEarphoneIn() && bVol>0)
	{
		wVolume=wVolume+EARPHONE_OFFSET_VOL;
	}
	#endif

	if(bPlus & 0x80)																		//step down
	{
		wVolume=wVolume+(bPlus & 0x07f);
	}
	else																					//step up
	{
		wVolume=wVolume-(bPlus & 0x07f);
	}
	
	if(wVolume>0x245) wVolume=0x245;

	bByte[3]=(BYTE)(wVolume&0x00ff);
	bByte[2]=(BYTE)((wVolume&0xff00)>>8);
	bByte[1]=0;
	bByte[0]=0;
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,bChannel,4,bByte);	
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
void vSendBassBoostVol(void) large
{
	BYTE bByte;
	
	bByte = bEepromReadByte(AMP_SW_VOL_POS);
	vSendChannelVol(CHANNELSW_VOLUME_REGISTER,bByte,SW_PLUS);
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
void vSendMasterVol(WORD wVolume) large
{
	BYTE bByte[4];
	
	bByte[3]=(BYTE)(wVolume&0x00ff);
	bByte[2]=(BYTE)((wVolume&0xff00)>>8);
	bByte[1]=0;
	bByte[0]=0;
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,MASTER_VOLUME_REGISTER,4,bByte);
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
void vDapDefault(void) large
{
	_bMasterVol=BBK_DEFAULT_MAIN_VOL;
	
	fgEepromWriteByte(AMP_BASS_VOL_POS, BBK_MAX_TONE_VOL_LEVEL/2);
	fgEepromWriteByte(AMP_TREB_VOL_POS, BBK_MAX_TONE_VOL_LEVEL/2);
	
	fgEepromWriteByte(AMP_FL_VOL_POS, BBK_MAX_CH_VOL_LEVEL/2);	
	fgEepromWriteByte(AMP_FR_VOL_POS, BBK_MAX_CH_VOL_LEVEL/2);
	fgEepromWriteByte(AMP_SL_VOL_POS, BBK_MAX_CH_VOL_LEVEL/2);
	fgEepromWriteByte(AMP_SR_VOL_POS, BBK_MAX_CH_VOL_LEVEL/2);
	fgEepromWriteByte(AMP_CT_VOL_POS, BBK_MAX_CH_VOL_LEVEL/2);
	fgEepromWriteByte(AMP_SW_VOL_POS, BBK_MAX_CH_VOL_LEVEL/2);
	
	fgEepromWriteByte(AMP_BASS_BOOST_POS, BBK_DEFAULT_BASS_BOOST_VOL);

	vSendToneVol(BASS_FILTER_INDEX_ADDRESS,BBK_MAX_TONE_VOL_LEVEL/2);
	vSendToneVol(TREBLE_FILTER_INDEX_ADDRESS,BBK_MAX_TONE_VOL_LEVEL/2);

	vSendChannelVol(CHANNELFL_VOLUME_REGISTER,BBK_MAX_CH_VOL_LEVEL/2,FLFR_PLUS);
	vSendChannelVol(CHANNELFR_VOLUME_REGISTER,BBK_MAX_CH_VOL_LEVEL/2,FLFR_PLUS);
	vSendChannelVol(CHANNELSL_VOLUME_REGISTER,BBK_MAX_CH_VOL_LEVEL/2,SLSR_PLUS);
	vSendChannelVol(CHANNELSR_VOLUME_REGISTER,BBK_MAX_CH_VOL_LEVEL/2,SLSR_PLUS);
	vSendChannelVol(CHANNELCT_VOLUME_REGISTER,BBK_MAX_CH_VOL_LEVEL/2,CT_PLUS);
	vSendChannelVol(CHANNELSW_VOLUME_REGISTER,BBK_MAX_CH_VOL_LEVEL/2,SW_PLUS);
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
void vDapDvdInit(void) large
{
	BYTE i,bChVol;
	BYTE bByte[32];
#if 0//def  DVR003
SetDapReset();
	for(i=0;i<40;i++)
		{
		vI2CDelay2us(0xf0);
		vI2CDelay2us(0xf0);
		vI2CDelay2us(0xf0);
		vI2CDelay2us(0xf0);
		vI2CDelay2us(0xf0);

		vI2CDelay2us(0xf0);
		vI2CDelay2us(0xf0);
		vI2CDelay2us(0xf0);

		}

ClrDapReset()
	for(i=0;i<40;i++)
		{
		vI2CDelay2us(0xf0);
		vI2CDelay2us(0xf0);
		vI2CDelay2us(0xf0);
		vI2CDelay2us(0xf0);
		vI2CDelay2us(0xf0);
		}
#else
	//set FL/FR/SL/SR/CT/SW's filter
	#ifdef USE_FLFR_FILTER
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,CH1_BIQUAD_FILTERS7_ADDRESS,20,&butterworth_2HP_filter_table[FLFR_FILTER][0]);
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,CH2_BIQUAD_FILTERS7_ADDRESS,20,&butterworth_2HP_filter_table[FLFR_FILTER][0]);
	#endif
	#ifdef USE_SLSR_FILTER
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,CH3_BIQUAD_FILTERS7_ADDRESS,20,&butterworth_2HP_filter_table[SLSR_FILTER][0]);
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,CH4_BIQUAD_FILTERS7_ADDRESS,20,&butterworth_2HP_filter_table[SLSR_FILTER][0]);
	#endif
	#ifdef USE_CT_FILTER
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,CH7_BIQUAD_FILTERS7_ADDRESS,20,&butterworth_2HP_filter_table[CT_FILTER][0]);
	#endif
	#ifdef USE_SW_FILTER
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,CH8_BIQUAD_FILTERS7_ADDRESS,20,&butterworth_2LP_filter_table[SW_FILTER][0]);
	#endif

	
	//set PWM high pass enabled,be sure keep amp do not output direct current.
	bByte[0]=0x90;
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,DC_BLOCKING_ADDRESS,1,bByte);
	
	//set Serial Data Interface Control Register
	bByte[0]=DATA_INTERFACE;
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,DATA_INTERFACE_ADDRESS,1,bByte);
	
	//set audio control
	bByte[0]=0x70;   //BIT4:Unmute threshold equal to input threshold
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,SYSTEM_CONTROL_ADDRESS,1,bByte);
	
	//set audio system
	for(i=0;i<4;i++) bByte[i]=0;
	bByte[3]=AUDIO_SYSTEM;
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,AUDIO_SYSTEM_ADDRESS,4,bByte);

	#if (AUDIO_SYSTEM == CH6_NOT_PSVC)
	//set Channel Configuration Control Register
	bByte[0]=0x00;
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,CHANNEL_CONTROL_RL,1,bByte);					//LINEOUT RL
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,CHANNEL_CONTROL_RR,1,bByte);					//LINEOUT RR
	#endif

	//set line out mixer
	for(i=0;i<32;i++) bByte[i]=0;
	bByte[1]=LINEOUT_PERCENT;															//ch1-->ch5
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,INPUT_MIX5_ADDRESS,32,bByte);
	for(i=0;i<32;i++) bByte[i]=0;
	bByte[5]=LINEOUT_PERCENT;															//ch2-->ch6
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,INPUT_MIX6_ADDRESS,32,bByte);

	//bass manage 
	for(i=0;i<4;i++) bByte[i]=0;
	bByte[1]=0x40;
	//FL-->SW
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,INMIX_1_8CH,4,bByte);	 
	//FR-->SW
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,INMIX_2_8CH,4,bByte);

	//set tone bypass
	for(i=0;i<8;i++) bByte[i]=0;
	bByte[TONE_BYPASS_ON]=0x80;															//SWITCH ON INLINE AND SHUT OFF BYPASS.
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,CH1_TONE_BYPASS,8,bByte);
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,CH2_TONE_BYPASS,8,bByte);
	//fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,CH3_TONE_BYPASS,8,bByte);
	//fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,CH4_TONE_BYPASS,8,bByte);
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,CH7_TONE_BYPASS,8,bByte);
	//fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,CH8_TONE_BYPASS,8,bByte);	

	//set bass filter
	bByte[3]=FILTER_SET_2;																//CHANNEL1_2_7
	bByte[2]=FILTER_SET_2;																//CHANNEL3_4
	bByte[1]=FILTER_SET_0;																//CHANNEL5_6
	bByte[0]=FILTER_SET_2;																//CHANNEL8
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,BASS_FILTER_SET_ADDRESS,4,bByte);
	//set treble filter	
	bByte[3]=FILTER_SET_2;																//CHANNEL1_2_7
	bByte[2]=FILTER_SET_2;																//CHANNEL3_4
	bByte[1]=FILTER_SET_0;																//CHANNEL5_6
	bByte[0]=FILTER_SET_2;																//CHANNEL8
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,TREBLE_FILTER_SET_ADDRESS,4,bByte);	
	
	vSendToneVol(BASS_FILTER_INDEX_ADDRESS,bEepromReadByte(AMP_BASS_VOL_POS));
	vSendToneVol(TREBLE_FILTER_INDEX_ADDRESS,bEepromReadByte(AMP_TREB_VOL_POS));		
	vSendChannelVol(CHANNELFL_VOLUME_REGISTER,bEepromReadByte(AMP_FL_VOL_POS),FLFR_PLUS);
	vSendChannelVol(CHANNELFR_VOLUME_REGISTER,bEepromReadByte(AMP_FR_VOL_POS),FLFR_PLUS);
	vSendChannelVol(CHANNELSL_VOLUME_REGISTER,bEepromReadByte(AMP_SL_VOL_POS),SLSR_PLUS);
	vSendChannelVol(CHANNELSR_VOLUME_REGISTER,bEepromReadByte(AMP_SR_VOL_POS),SLSR_PLUS);
	vSendChannelVol(CHANNELCT_VOLUME_REGISTER,bEepromReadByte(AMP_CT_VOL_POS),CT_PLUS);
	vSendChannelVol(CHANNELSW_VOLUME_REGISTER,bEepromReadByte(AMP_SW_VOL_POS),SW_PLUS);

	vSendMasterVol(COMMON_VOLUME);
	#endif
}

/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
void vDapAuxInit(BOOL fgState) large
{
	BYTE i,bChVol;
	BYTE bByte[32];

	for(i=0;i<32;i++) bByte[i]=0;
	if(fgState)
	{
		bByte[17]=0x80;																		//ch5-->ch1
	}
	else
	{
		bByte[1]=0x80;																		//ch1-->ch1
	}
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,INPUT_MIX1_ADDRESS,32,bByte);
	
	for(i=0;i<32;i++) bByte[i]=0;
	if(fgState)
	{
		bByte[21]=0x80;																		//ch6-->ch2
	}
	else
	{
		bByte[5]=0x80;																		//ch2-->ch2
	}
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,INPUT_MIX2_ADDRESS,32,bByte);
}
/***************************************************************************************
    Function : 
    Description : 
    Parameter : 
    Return    : 
***************************************************************************************/
void vAmModeSet(BYTE bammode,WORD wAmFreq) large
{
	BYTE tmpdata[4];
	tmpdata[3]=(BYTE)(wAmFreq&0x00ff);
	tmpdata[2]=(BYTE)((wAmFreq&0xff00)>>8);
	tmpdata[1]=bammode;
	tmpdata[0]=0;
	fgI2CDataWrite(TAS5508_SLAVE_ADDRESS,AM_MODE_SET_ADDRESS,4,tmpdata);
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -