📄 tas5508.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 + -