www.pudn.com > 8202S.rar > ddx8000_binary.c, change:2005-02-26,size:34470b
/***********************************
Creater: xiongyuyue
Date : 2003/8/14
Description: Amplifier function using
Reference:DDX8000 Datasheet(APOGEE CO.)
***********************************/
#include "user_init.h"
//#include "config.h"
//#include "regmap.h"
#include "global.h"
#include "ircode.h"
#include "osd.h"
//#include "gpio.h"
//#include "iop.h"
#include "audctrl.h"
#include "ddx8000.h"
#include "cchar.h"
#define NOP delay_1us(10000)
#define AMP_I2CADDR_START 512
#define BASS_GAIN_ADDR AMP_I2CADDR_START+sizeof(amp_userSet)+1
#define TREBLE_GAIN_ADDR BASS_GAIN_ADDR+1
#define DDX_EQ_TYPE_ADDR TREBLE_GAIN_ADDR+1
#define DDX_REVB_TYPE_ADDR DDX_EQ_TYPE_ADDR+1
int ddx_amp_mode = 0;
extern BYTE * lev_list[7];
BYTE channel_addr[6] =
{
0x0f,//front left
0x0d,//front right
0x0c,//surround left
0x0a,//surround right
0x09,//center
0x0e//subwoofer
};
//Reset DDX8000
void ddx_reset_all(void)
{
BYTE data;
//Reset Configuration Register A
data = 0x83;
WriteToI2c(DDX8K_ADDR,CONFIGREG_A,&data,1);
//Reset Configuration Register B
data = 0x42;
WriteToI2c(DDX8K_ADDR,CONFIGREG_B,&data,1);
//Reset Configuration Register C
data = 0x7c;
WriteToI2c(DDX8K_ADDR,CONFIGREG_C,&data,1);
//Reset Configuration Register D
data=0x2f; //xulf
WriteToI2c(DDX8K_ADDR,CONFIGREG_D,&data,1);
//Reset Configuration Register E
data = 0x02;
WriteToI2c(DDX8K_ADDR,CONFIGREG_E,&data,1);
//Reset Configuration Register F
data = 0x00;
WriteToI2c(DDX8K_ADDR,CONFIGREG_F,&data,1);
//Master Mute
data = 0x00;
WriteToI2c(DDX8K_ADDR,MASTER_MUTE_REG,&data,1);
//Master Volume
data = 0xff;
WriteToI2c(DDX8K_ADDR,MASTER_VOL_REG,&data,1);
//Channel 1,2,3,4,5,6,7,8 mute
data = 0x00;
WriteToI2c(DDX8K_ADDR,CHANEL_MUTE_REG,&data,1);
//Channel 1,2,3,4,5,6,7,8 Volume
data = 0x30;
WriteToI2c(DDX8K_ADDR,C1V_REG,&data,8);
//Channel Input Mapping
data = 0x10;
WriteToI2c(DDX8K_ADDR,C12MAP_REG,&data,1);
data = 0x32;
WriteToI2c(DDX8K_ADDR,C34MAP_REG,&data,1);
data = 0x54;
WriteToI2c(DDX8K_ADDR,C56MAP_REG,&data,1);
data = 0x76;
WriteToI2c(DDX8K_ADDR,C78MAP_REG,&data,1);
//Limiter Selection
data = 0x00;
WriteToI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,2);
//Limiter 1 & 2 Rates and Thresholds
data = 0xa6;
WriteToI2c(DDX8K_ADDR,L1RATE_REG,&data,1);
data = 0x67;
WriteToI2c(DDX8K_ADDR,L1THRESHOLDS_REG,&data,1);
data = 0xa6;
WriteToI2c(DDX8K_ADDR,L2RATE_REG,&data,1);
data = 0x67;
WriteToI2c(DDX8K_ADDR,L2THRESHOLDS_REG,&data,1);
//Tone control
data = 0x77;
WriteToI2c(DDX8K_ADDR,TONE_CTRL_REG,&data,1);
}
void write_reg_bit(int addr,BYTE bit,BYTE val)
{
BYTE tmp = 0;
int res;
res = ReadFromI2c(DDX8K_ADDR,addr,&tmp,1);
NOP;
// printf("11-----------------tmp = :%x,res :%d**********\n",tmp,res);
if(val)
tmp |= 0x01<<bit;
else
tmp &= ~(0x01<<bit);
NOP;
res = WriteToI2c(DDX8K_ADDR,addr,&tmp,1);
printf("1addr :%x,tmp = :%x,res :%d\n",addr,tmp,res);
NOP;
res = ReadFromI2c(DDX8K_ADDR,addr,&tmp,1);
printf("2addr :%x,tmp = :%x,res :%d\n",addr,tmp,res);
}
//Enable or Disable External Amplifier Power Down
void ddx_enableEPAD(void)
{
write_reg_bit(CONFIGREG_F,7,1);
}
void ddx_disableEPAD(void)
{
write_reg_bit(CONFIGREG_F,7,0);
}
/*///////////////////////////////////////////////////////////////
sample_rate ctrl input data format
32fs กม010 MSB First Right/Left-Justified 16-bit data
48fs 0001 MSB First Left-Justified Data
1001 LSB First Left-Justified Data
กม010 Right-Justified 16-bit Data
กม011 Right-Justified 18-bit Data
กม100 Right-Justified 20-bit Data
กม101 Right-Justified 24-bit Data
64fs 0000 I2S 16 to 24-bit Data default input data format
0001 MSB First Left-Justified Data
1001 LSB First Left-Justified Data
กม010 Right-Justified 16-bit Data
กม011 Right-Justified 18-bit Data
กม100 Right-Justified 20-bit Data
กม101 Right-Justified 24-bit Data
*////////////////////////////////////////////////////////////////
void set_inputData_format(BYTE ctrl)
{
UINT16 romSum=0;
BYTE *p = (BYTE *)(&romSum);
ReadFromI2c(DDX8K_ADDR,CONFIGREG_B,p,1);
*p = (ctrl<<2) | (*p & 0xc3);
WriteToI2c(DDX8K_ADDR,CONFIGREG_B,p,1);
}
//channel mapping
//par: pch---processing channel number; ich---input channel number
void ddx_channel_map(BYTE pch,BYTE ich)
{
UINT16 romSum=0;
BYTE *p = (BYTE *)(&romSum);
switch(pch)
{
case 1:
*p = (*p & 0xf8) | (ich-1);
WriteToI2c(DDX8K_ADDR,C12MAP_REG,p,1);
break;
case 2:
*p = (*p & 0x8f) | ((ich-1)<<4);
WriteToI2c(DDX8K_ADDR,C12MAP_REG,p,1);
break;
case 3:
*p = (*p & 0xf8) | (ich-1);
WriteToI2c(DDX8K_ADDR,C34MAP_REG,p,1);
break;
case 4:
*p = (*p & 0x8f) | ((ich-1)<<4);
WriteToI2c(DDX8K_ADDR,C34MAP_REG,p,1);
break;
case 5:
*p = (*p & 0xf8) | (ich-1);
WriteToI2c(DDX8K_ADDR,C56MAP_REG,p,1);
break;
case 6:
*p = (*p & 0x8f) | ((ich-1)<<4);
WriteToI2c(DDX8K_ADDR,C56MAP_REG,p,1);
break;
case 7:
*p = (*p & 0xf8) | (ich-1);
WriteToI2c(DDX8K_ADDR,C78MAP_REG,p,1);
break;
case 8:
*p = (*p & 0x8f) | ((ich-1)<<4);
WriteToI2c(DDX8K_ADDR,C78MAP_REG,p,1);
break;
}
}
//////////////////////////////////////////////////////////////////
//Configuration Register A
/*
sample rate(kHz) | IR(D4~D3) | MCS(D2~D0)
-----------------------------------------------------------------------
| | 1กมกม | 011 | 010 | 001 | 000
-----------------------------------------------------------------------
32, 44.1, 48 | 00 | 128fs | 256fs | 384fs | 512fs | 768fs
88.2, 96 | 01 | 64fs | 128fs | 192fs | 256fs | 384fs
176.4, 192 | 10 | 64fs | 128fs | 192fs | 256fs | 384fs
Reserved | NA | NA | NA | NA | NA | NA
-----------------------------------------------------------------------
*/
///////////////////////////////////////////////////////////////////
void set_inputClock(BYTE IR,BYTE MCS)
{
UINT16 romSum=0;
BYTE *p = (BYTE *)(&romSum);
*p = (*p & 0xe0) | ((IR<<3) | MCS);
WriteToI2c(DDX8K_ADDR,CONFIGREG_A,p,1);
}
//Bass Management
//set Configuration Register A bit 5 will enable or disable bass management
void ddx_enable_BassManagement(void)
{
write_reg_bit(CONFIGREG_A,5,1);
}
void ddx_disable_BassManagement(void)
{
write_reg_bit(CONFIGREG_A,5,0);
}
//Reading a Coefficient Value From RAM
UINT32 ddx_readCoefVal(BYTE regAddr)
{
UINT32 tmp;
UINT16 romSum=0;
BYTE *p = (BYTE *)(&romSum);
// printf("**********************************************\n");
//write 8-bit address to I2C register 1Ch
*p = regAddr;
WriteToI2c(DDX8K_ADDR,0x1c,p,1);
*p = 0;
ReadFromI2c(DDX8K_ADDR,0x1c,p,1);
// printf("the val of register 0x1c is:%x\n",*p);
//read top 8-bits of coefficient in I2C address 1Dh
*p = 0;
ReadFromI2c(DDX8K_ADDR,0x1d,p,1);
// printf("the val of register 0x1d is:%x\n",*p);
tmp = (*p << 16) & 0xff0000;
//read middle 8-bits of coefficient in I2C address 1Fh
*p = 0;
ReadFromI2c(DDX8K_ADDR,0x1e,p,1);
// printf("the val of register 0x1e is:%x\n",*p);
tmp = tmp | ((*p << 8) & 0xff00);
//read bottom 8-bits of coefficient in I2C address 1Fh
*p=0;
ReadFromI2c(DDX8K_ADDR,0x1f,p,1);
// printf("the val of register 0x1f is:%x\n",*p);
tmp = tmp | *p;
return tmp;
}
//Writing a single Coefficient Value to RAM
void ddx_writeCoefVal(BYTE regAddr,UINT32 coefVal)
{
UINT16 romSum=0;
BYTE *p = (BYTE *)(&romSum);
//write 8-bit address to I2C register 1Ch
*p = regAddr;
WriteToI2c(DDX8K_ADDR,0x1c,p,1);
//write top 8-bits of coefficient in I2C address 1Dh
*p = (coefVal & 0xff0000) >> 16;
WriteToI2c(DDX8K_ADDR,0x1d,p,1);
//write middle 8-bits of coefficient in I2C address 1Eh
*p = (coefVal & 0x00ff00) >> 8;
WriteToI2c(DDX8K_ADDR,0x1e,p,1);
//write bottom 8-bits of coefficient in I2C address 1Fh
*p = (coefVal & 0x0000ff);
WriteToI2c(DDX8K_ADDR,0x1f,p,1);
//write control
write_reg_bit(0x2c,0,1);
}
//Writing a set of Coefficient Values to RAM
void ddx_writeCoefValSets(BYTE startAddr,coef_factor factor)
{
UINT16 romSum=0;
BYTE *p = (BYTE *)(&romSum);
//write 8-bit address to I2C register 1Ch
*p = startAddr;
WriteToI2c(DDX8K_ADDR,0x1c,p,1);
//write factor b2
*p = (factor.b2 & 0xff0000) >> 16;
WriteToI2c(DDX8K_ADDR,0x1d,p,1);
*p = (factor.b2 & 0x00ff00) >> 8;
WriteToI2c(DDX8K_ADDR,0x1e,p,1);
*p = (factor.b2 & 0x0000ff);
WriteToI2c(DDX8K_ADDR,0x1f,p,1);
//write factor b0
*p = (factor.b0 & 0xff0000) >> 16;
WriteToI2c(DDX8K_ADDR,0x20,p,1);
*p = (factor.b0 & 0x00ff00) >> 8;
WriteToI2c(DDX8K_ADDR,0x21,p,1);
*p = (factor.b0 & 0x0000ff);
WriteToI2c(DDX8K_ADDR,0x22,p,1);
//write factor a2
*p = (factor.a2 & 0xff0000) >> 16;
WriteToI2c(DDX8K_ADDR,0x23,p,1);
*p = (factor.a2 & 0x00ff00) >> 8;
WriteToI2c(DDX8K_ADDR,0x24,p,1);
*p = (factor.a2 & 0x0000ff);
WriteToI2c(DDX8K_ADDR,0x25,p,1);
//write factor a1
*p = (factor.a1 & 0xff0000) >> 16;
WriteToI2c(DDX8K_ADDR,0x26,p,1);
*p = (factor.a1 & 0x00ff00) >> 8;
WriteToI2c(DDX8K_ADDR,0x27,p,1);
*p = (factor.a1 & 0x0000ff);
WriteToI2c(DDX8K_ADDR,0x28,p,1);
//write factor b1
*p = (factor.b1 & 0xff0000) >> 16;
WriteToI2c(DDX8K_ADDR,0x29,p,1);
*p = (factor.b1 & 0x00ff00) >> 8;
WriteToI2c(DDX8K_ADDR,0x2a,p,1);
*p = (factor.b1 & 0x0000ff);
WriteToI2c(DDX8K_ADDR,0x2b,p,1);
//write control
write_reg_bit(0x2c,1,1);
}
//HPB register i.e. Configuation Register C-02h,Bit 7
//1: disable this feature
//0: enable this feature
//input:1---disable,0---enable
//enable High Pass Filter
void enable_hpf(void)
{
write_reg_bit(CONFIGREG_C,7,0);
}
void disable_hpf(void)
{
write_reg_bit(CONFIGREG_C,7,1);
}
//tone control: include treble control and bass control
//input:
//updown: 1---boost tone -1---cut tone
BYTE ddx_trebleCtrl(int updown) //xulf modified 2004-01-13
{
BYTE romSum=0;
BYTE *p = (BYTE *)(&romSum);
ReadFromI2c(DDX8K_ADDR,TONE_CTRL_REG,p,1);
if(updown==1)
{
if(amp_userSet.ddx_Treble_lev < 0x0d)
amp_userSet.ddx_Treble_lev++;
}
else if(updown==-1)
{
if(amp_userSet.ddx_Treble_lev > 0x1)
amp_userSet.ddx_Treble_lev--;
}
*p = (amp_userSet.ddx_Treble_lev<<4) | (*p & 0x0f);
WriteToI2c(DDX8K_ADDR,TONE_CTRL_REG,p,1);
WriteToI2c(0xa0, TREBLE_GAIN_ADDR, &_userSet.ddx_Treble_lev, 1);
}
BYTE ddx_bassCtrl(int updown) //xulf modified 2004-01-13
{
BYTE romSum=0;
BYTE *p = (BYTE *)(&romSum);
ReadFromI2c(DDX8K_ADDR,TONE_CTRL_REG,p,1);
if(updown==1)
{
if(amp_userSet.ddx_Bass_lev < 0x0d)
amp_userSet.ddx_Bass_lev++;
}
else if(updown==-1)
{
if(amp_userSet.ddx_Bass_lev > 0x1)
amp_userSet.ddx_Bass_lev--;
}
*p = amp_userSet.ddx_Bass_lev | (*p & 0xf0);
WriteToI2c(DDX8K_ADDR,TONE_CTRL_REG,p,1);
WriteToI2c(0xa0, BASS_GAIN_ADDR, &_userSet.ddx_Bass_lev, 1);
}
//volume control: include master volume control and channel volume control
//input:
/*
updown: 1---boost, -1---cut
mute: 1---Hard Master Mute, 0---not mute,adjust volume
*/
void ddx_master_volume_adjust(int updown,BYTE mute)
{
BYTE tmp_var;
if(mute)
{
amp_userSet.mainvol = 0xff;
WriteToI2c(DDX8K_ADDR,MASTER_VOL_REG,&_userSet.mainvol,1);
return;
}
else
{
// ddx_masterMute(1);
ReadFromI2c(DDX8K_ADDR,MASTER_VOL_REG,&_userSet.mainvol,1);
tmp_var = amp_userSet.mainvol;
if(updown==1)
{
if(tmp_var>0x00)
tmp_var--;
}
else if(updown==-1)
tmp_var++;
if(*lev_list[0]==1)
tmp_var = 0x31;
else if(*lev_list[0]==0)
tmp_var = 0xff;
amp_userSet.mainvol = tmp_var;
WriteToI2c(DDX8K_ADDR,MASTER_VOL_REG,&_userSet.mainvol,1);
WriteToI2c(0xa0,AMP_I2CADDR_START+(2*y_index),lev_list[y_index],1);
WriteToI2c(0xa0,AMP_I2CADDR_START+(2*y_index + 1),&_userSet.mainvol,1);
// ddx_masterMute(0);
}
}
//Set Master Volume Gain
void ddx_setMVG(BYTE chAddr,BYTE ctrl)
{
WriteToI2c(DDX8K_ADDR,chAddr,&ctrl,1);
}
//input:
/*
chAddr: channel volume regsiter address
updown: 1---boost, -1---cut
*/
void ddx_channel_volume_adjust(BYTE chAddr,int updown)
{
// UINT16 romSum=0;
BYTE *p = (BYTE *)(&_userSet);
BYTE tmp_var;
// ddx_masterMute(1);
ReadFromI2c(DDX8K_ADDR,chAddr,p,1);
tmp_var = *(p+(2*y_index+1));
if(updown==1)
{
if(tmp_var>0x00)
tmp_var -=1;
}
else if(updown==-1)
{
if(tmp_var<0xfe)
tmp_var +=1;
}
*(p+(2*y_index+1)) = tmp_var;
WriteToI2c(DDX8K_ADDR,chAddr,(p+(2*y_index+1)),1);
WriteToI2c(0xa0,AMP_I2CADDR_START+(2*y_index),lev_list[y_index],1);
WriteToI2c(0xa0,AMP_I2CADDR_START+(2*y_index + 1),(p+(2*y_index+1)),1);
// ddx_masterMute(0);
}
//Set Channel Volume Gain
void ddx_setCVG(BYTE chAddr,BYTE ctrl)
{
WriteToI2c(DDX8K_ADDR,chAddr,&ctrl,1);
}
//all changes in volume take place at digital zero-crossing
//will create the smoothest possible volume transition
void ddx_enZeroCross(void)
{
write_reg_bit(CONFIGREG_B,6,1);
}
void ddx_disZeroCross(void)
{//volume updates immediately
write_reg_bit(CONFIGREG_B,6,0);
}
//Master Volume Mute
//mute all channels simultaneously
//mute 1: mute 0: demute
void ddx_masterMute(BYTE mute)
{
if(mute)
write_reg_bit(MASTER_MUTE_REG,0,1);
else
write_reg_bit(MASTER_MUTE_REG,0,0);
}
//channel mute individually
//mute 1: mute 0: demute
void ddx_channelMute(BYTE chNum,BYTE mute)
{
if(mute)
write_reg_bit(CHANEL_MUTE_REG,chNum,1);
else
write_reg_bit(CHANEL_MUTE_REG,chNum,0);
}
//Channel Limiter Selection
/*
CxLS(1,0) Channel Limiter Mapping
-------------------------------------------
00 Channel has limiting disabled
01 Channel is mapped to limiter #1
10 Channel is mapped to limiter #2
11 Reserved.Don't use this setting
--------------------------------------------
*/
void ddx_ch1_limiterSel(BYTE selCtrl)
{
BYTE data;
ReadFromI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,1);
data = selCtrl | (data & 0xfc);
if(selCtrl<0x03)
WriteToI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,1);
}
void ddx_ch2_limiterSel(BYTE selCtrl)
{
BYTE data;
ReadFromI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,1);
data = (selCtrl << 2) | (data & 0xf3);
if(selCtrl<0x03)
WriteToI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,1);
}
void ddx_ch3_limiterSel(BYTE selCtrl)
{
BYTE data;
ReadFromI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,1);
data = (selCtrl << 4) | (data & 0xcf);
if(selCtrl<0x03)
WriteToI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,1);
}
void ddx_ch4_limiterSel(BYTE selCtrl)
{
BYTE data;
ReadFromI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,1);
data = (selCtrl << 6) | (data & 0x3f);
if(selCtrl<0x03)
WriteToI2c(DDX8K_ADDR,CLIMITER_SEL0,&data,1);
}
void ddx_ch5_limiterSel(BYTE selCtrl)
{
BYTE data;
ReadFromI2c(DDX8K_ADDR,CLIMITER_SEL1,&data,1);
data = selCtrl | (data & 0xfc);
if(selCtrl<0x03)
WriteToI2c(DDX8K_ADDR,CLIMITER_SEL1,&data,1);
}
void ddx_ch6_limiterSel(BYTE selCtrl)
{
BYTE data;
ReadFromI2c(DDX8K_ADDR,CLIMITER_SEL1,&data,1);
data = (selCtrl << 2) | (data & 0xf3);
if(selCtrl<0x03)
WriteToI2c(DDX8K_ADDR,CLIMITER_SEL1,&data,1);
}
void ddx_ch7_limiterSel(BYTE selCtrl)
{
BYTE data;
ReadFromI2c(DDX8K_ADDR,CLIMITER_SEL1,&data,1);
data = (selCtrl << 4) | (data & 0xcf);
if(selCtrl<0x03)
WriteToI2c(DDX8K_ADDR,CLIMITER_SEL1,&data,1);
}
void ddx_ch8_limiterSel(BYTE selCtrl)
{
BYTE data;
ReadFromI2c(DDX8K_ADDR,CLIMITER_SEL1,&data,1);
data = (selCtrl << 6) | (data & 0x3f);
if(selCtrl<0x03)
WriteToI2c(DDX8K_ADDR,CLIMITER_SEL1,&data,1);
}
//Set Compression and Release Rates of Limiter
void ddx_setL1CRrates(BYTE ctrl)
{
WriteToI2c(DDX8K_ADDR,L1RATE_REG,&ctrl,1);
}
void ddx_setL2CRrates(BYTE ctrl)
{
WriteToI2c(DDX8K_ADDR,L2RATE_REG,&ctrl,1);
}
//Set Compression and Release Threshold of Limiter
void ddx_setL1CRthreshold(BYTE ctrl)
{
WriteToI2c(DDX8K_ADDR,L1THRESHOLDS_REG,&ctrl,1);
}
void ddx_setL2CRthreshold(BYTE ctrl)
{
WriteToI2c(DDX8K_ADDR,L2THRESHOLDS_REG,&ctrl,1);
}
//Set Dynamic Range Compression mode
//drc: 1----Dynamic Range Compression mode
// 0----Anti-Clipping Mode(default)
void ddx_setDRCmode(BYTE drc)
{
write_reg_bit(CONFIGREG_B,7,drc);
}
//Set Max Power Correction
void ddx_setMPC(void)
{
write_reg_bit(CONFIGREG_A,7,1);
}
//Head Phone Enable or Disable
void ddx_enHeadPhone(void)
{
write_reg_bit(CONFIGREG_A,6,1);
}
void ddx_disHeadPhone(void)
{
write_reg_bit(CONFIGREG_A,6,0);
}
//AM Mode Enable or Disable
void ddx_enableAM_mode(void)
{
write_reg_bit(CONFIGREG_F,3,1);
}
void ddx_disableAM_mode(void)
{
write_reg_bit(CONFIGREG_F,3,0);
}
void ddx_set_BassManagement(void)
{
coef_factor bass_coef;
//set channel 7,5,4,2,1 pre-scale factor
ddx_writeCoefVal(0xd6,FL_SCALE_FACTOR); //xulf 2003-12-15
ddx_writeCoefVal(0xd4,FR_SCALE_FACTOR);
ddx_writeCoefVal(0xd3,SL_SCALE_FACTOR);
ddx_writeCoefVal(0xd1,SR_SCALE_FACTOR);
ddx_writeCoefVal(0xd0,CE_SCALE_FACTOR);
ddx_writeCoefVal(0xd5,LFE_SCALE_FACTOR);
//set channel 7,5,4,2,1 filter coefficient
bass_coef.b2 = HPF_COEF_B2;
bass_coef.b0 = HPF_COEF_B0;
bass_coef.a2 = HPF_COEF_A2;
bass_coef.a1 = HPF_COEF_A1;
bass_coef.b1 = HPF_COEF_B1;
ddx_writeCoefValSets(0x96,bass_coef); //channel 7 xulf 2003-12-15
ddx_writeCoefValSets(0x64,bass_coef); //channel 5
ddx_writeCoefValSets(0x4b,bass_coef); //channel 4
ddx_writeCoefValSets(0x19,bass_coef); //channel 2
ddx_writeCoefValSets(0x00,bass_coef); //channel 1
//set channel 6 filter coefficient
bass_coef.b2 = LPF_COEF_B2;
bass_coef.b0 = LPF_COEF_B0;
bass_coef.a2 = LPF_COEF_A2;
bass_coef.a1 = LPF_COEF_A1;
bass_coef.b1 = LPF_COEF_B1;
ddx_writeCoefValSets(0x7d,bass_coef);
}
//Initialize volume gain
void ddx_init_volumeGain(void)
{
//set volume gain
ddx_setMVG(MASTER_VOL_REG,0x6c/*-54dB*/);
ddx_setCVG(C7V_REG,0x18);//12dB
ddx_setCVG(C5V_REG,0x18);//12dB
ddx_setCVG(C4V_REG,0x18);//12dB
ddx_setCVG(C2V_REG,0x18);//12dB
ddx_setCVG(C1V_REG,0x18);//12dB
ddx_setCVG(C6V_REG,0x10);//16dB
ddx_setCVG(C3V_REG,0xff); //xulf 2003-12-15
ddx_setCVG(C8V_REG,0xff);
}
//Initialization
void ddx_initialization(void)
{
BYTE data;
/* //disable external amplifier
ddx_disableEPAD();
//mute all channels
ddx_masterMute(1);
*/
enable_hpf();
NOP;
set_inputClock(0x00,0x03);//256Fs
NOP;
//set input data format
//set input data format :DVD,VCD,MP3,CD,
#if defined(WM8746)//Right-Justified 24-bit Data
set_inputData_format(0x05);
#elif defined(WM8746I2S24)//I2S 24-bit Data
set_inputData_format(0x00);
#endif
// BYTE data = 0x27;
// WriteToI2c(DDX8K_ADDR,0x03,&data,1);
//enable bass management
//ddx_enable_BassManagement();
//Enable Zero Crossing
//ddx_enZeroCross();
//set Anti-clipping Mode for 5.1 Channels
//ddx_setDRCmode(0);
//initialize volume gain
//ddx_init_volumeGain();
//set bass management
//ddx_set_BassManagement();
//limiter selection: channel 7,5,4,2,1 select limiter 1
//channel 6 select limiter 2
/*ddx_ch7_limiterSel(0x01);
ddx_ch5_limiterSel(0x01);
ddx_ch4_limiterSel(0x01);
ddx_ch2_limiterSel(0x01);
ddx_ch1_limiterSel(0x01);
ddx_ch6_limiterSel(0x02);*/
//set limiter 1,2 Attack Rate and Release Rate
//ddx_setL1CRrates(0xa4);
//ddx_setL2CRrates(0xf7);
//set limiter 1,2 Attack Threshold and Release Threshold
//ddx_setL1CRthreshold(0x65);
//ddx_setL1CRthreshold(0x75);
data=0x2f; //xulf 2003-12-17
WriteToI2c(DDX8K_ADDR,CONFIGREG_D,&data,1);
//channel mapping via I2C
//output: 7 5 4 2 1 6=====input: 1 2 3 4 5 6
data = 0x34;
WriteToI2c(DDX8K_ADDR,C12MAP_REG,&data,1);
data = 0x20;
WriteToI2c(DDX8K_ADDR,C34MAP_REG,&data,1);
data = 0x51;
WriteToI2c(DDX8K_ADDR,C56MAP_REG,&data,1);
data = 0x00;
WriteToI2c(DDX8K_ADDR,C78MAP_REG,&data,1);
// write_reg_bit(0x30,
// BYTE data = 0x00;
// WriteToI2c(DDX8K_ADDR,0x03,&data,1);
//unmute all channels
// ddx_enableAM_mode();
/* NOP;
ddx_masterMute(0);
NOP;
ddx_enableEPAD();
*/
}
void ddx_ampvol_func_left(void);
void ddx_ampvol_func_right(void);
void ddx_ampvol_func_up(void);
void ddx_ampvol_func_down(void);
void ddx_volume_adjust(UINT32 key)
{
switch(key)
{
case IRC_UP:
ddx_ampvol_func_up();
break;
case IRC_DOWN:
ddx_ampvol_func_down();
break;
case IRC_LEFT:
ddx_ampvol_func_left();
break;
case IRC_RIGHT:
ddx_ampvol_func_right();
break;
}
}
void load_amp_setup(void)//xyy 2004-1-13 10:20
{
int iRts,i;
BYTE tmp = 0;
BYTE *p = (BYTE *)(&tmp);
printf("-----*********------load_amp_setup()-----***********-------\n");
iRts=ReadFromI2c(0xa0, AMP_I2CADDR_START, &_userSet, sizeof(amp_userSet));
ReadFromI2c(0xa0, BASS_GAIN_ADDR, &_userSet.ddx_Bass_lev, 1);
ReadFromI2c(0xa0, TREBLE_GAIN_ADDR, &_userSet.ddx_Treble_lev, 1);
ReadFromI2c(0xa0, DDX_EQ_TYPE_ADDR, &_userSet.ddx_EQ_sel, 1);
ReadFromI2c(0xa0, DDX_REVB_TYPE_ADDR, &_userSet.ddx_Revb_sel, 1);
printf("===iRts : %d====\n",iRts);
if(iRts<0)
{
set_ampsetup_default();
WriteToI2c(0xa0,AMP_I2CADDR_START,&_userSet,sizeof(amp_userSet));
}
/* printf("1=========channel mv volume is: %x========\n",amp_userSet.mainvol);
printf("1=========channel 1 volume is: %x========\n",amp_userSet.lfrontvol);
printf("1=========channel 2 volume is: %x========\n",amp_userSet.rfrontvol);
printf("1=========channel 3 volume is: %x========\n",amp_userSet.lrearvol);
printf("1=========channel 4 volume is: %x========\n",amp_userSet.rrearvol);
printf("1=========channel 5 volume is: %x========\n",amp_userSet.centervol);
printf("1=========channel 6 volume is: %x========\n",amp_userSet.woofervol);
*/
WriteToI2c(DDX8K_ADDR,MASTER_VOL_REG,&_userSet.mainvol,1);
WriteToI2c(DDX8K_ADDR,C1V_REG,&_userSet.lfrontvol,1);
WriteToI2c(DDX8K_ADDR,C2V_REG,&_userSet.rfrontvol,1);
WriteToI2c(DDX8K_ADDR,C3V_REG,&_userSet.lrearvol,1);
WriteToI2c(DDX8K_ADDR,C4V_REG,&_userSet.rrearvol,1);
WriteToI2c(DDX8K_ADDR,C5V_REG,&_userSet.centervol,1);
WriteToI2c(DDX8K_ADDR,C6V_REG,&_userSet.woofervol,1);
ddx_Set_EQ(amp_userSet.ddx_EQ_sel);
*p = (amp_userSet.ddx_Treble_lev<<4)|amp_userSet.ddx_Bass_lev;
WriteToI2c(DDX8K_ADDR,TONE_CTRL_REG,p,1);
}
/*****************************************
/Function: ddx_Set_EQ()
/Description: Set coefficient values of biquads for preset EQ settings.
/Creator: xulf
/Date: 2003-12-27
/*****************************************/
void ddx_Set_EQ(BYTE EQtype)
{
coef_factor biquad_coef;
ddx_disableEPAD(); //EAPD
ddx_masterMute(1); //mute all channels
switch(EQtype)
{
case NONE:
//set the channel pre-scale.
ddx_writeCoefVal(0xc8,0xe36809); //channel 1
biquad_coef.b2 = 0x000000;
biquad_coef.b0 = 0x3fffff;
biquad_coef.a2 = 0x000000;
biquad_coef.a1 = 0x000000;
biquad_coef.b1 = 0x000000;
ddx_writeCoefValSets(0x05,biquad_coef); //channel 1 biquad2
ddx_writeCoefValSets(0x0a,biquad_coef); //channel 1 biquad3
ddx_writeCoefValSets(0x0f,biquad_coef); //channel 1 biquad4
ddx_writeCoefValSets(0x14,biquad_coef); //channel 1 biquad5
//each channel uses channel 1 coefficient values.
write_reg_bit(CONFIGREG_D,7,1);
break;
case ROCK:
ddx_writeCoefVal(0xc8,0xaf3cc5); //channel 1
biquad_coef.b2 = 0x7fcf05;
biquad_coef.b0 = 0x40058a;
biquad_coef.a2 = 0x8025e6;
biquad_coef.a1 = 0x7fed02;
biquad_coef.b1 = 0x8012fe;
ddx_writeCoefValSets(0x05,biquad_coef); //channel 1 biquad2
biquad_coef.b2 = 0x7fd80a;
biquad_coef.b0 = 0x4006a3;
biquad_coef.a2 = 0x801aaf;
biquad_coef.a1 = 0x7ff28c;
biquad_coef.b1 = 0x800d74;
ddx_writeCoefValSets(0x0a,biquad_coef); //channel 1 biquad3
biquad_coef.b2 = 0x7ead9f;
biquad_coef.b0 = 0x3fc7c8;
biquad_coef.a2 = 0x81c2d0;
biquad_coef.a1 = 0x7f1d06;
biquad_coef.b1 = 0x80e2fa;
ddx_writeCoefValSets(0x0f,biquad_coef); //channel 1 biquad4
biquad_coef.b2 = 0x5d3dab;
biquad_coef.b0 = 0x46a5ae;
biquad_coef.a2 = 0x9576f8;
biquad_coef.a1 = 0x714597;
biquad_coef.b1 = 0x8eba69;
ddx_writeCoefValSets(0x14,biquad_coef); //channel 1 biquad5
//each channel uses channel 1 coefficient values.
write_reg_bit(CONFIGREG_D,7,1);
break;
case POP:
ddx_writeCoefVal(0xc8,0xdb759b); //channel 1
biquad_coef.b2 = 0x7fe781;
biquad_coef.b0 = 0x3ffd3a;
biquad_coef.a2 = 0x801e09;
biquad_coef.a1 = 0x7ff0f8;
biquad_coef.b1 = 0x800f08;
ddx_writeCoefValSets(0x05,biquad_coef); //channel 1 biquad2
biquad_coef.b2 = 0x7cc19b;
biquad_coef.b0 = 0x40e89e;
biquad_coef.a2 = 0x816d29;
biquad_coef.a1 = 0x7f40df;
biquad_coef.b1 = 0x80bf21;
ddx_writeCoefValSets(0x0a,biquad_coef); //channel 1 biquad3
biquad_coef.b2 = 0x640c0d;
biquad_coef.b0 = 0x3cd666;
biquad_coef.a2 = 0xa24727;
biquad_coef.a1 = 0x6cbb1a;
biquad_coef.b1 = 0x9344e6;
ddx_writeCoefValSets(0x0f,biquad_coef); //channel 1 biquad4
biquad_coef.b2 = 0x4274ad;
biquad_coef.b0 = 0x37613b;
biquad_coef.a2 = 0xcec8dd;
biquad_coef.a1 = 0x4cbc8c;
biquad_coef.b1 = 0xb34374;
ddx_writeCoefValSets(0x14,biquad_coef); //channel 1 biquad5
//each channel uses channel 1 coefficient values.
write_reg_bit(CONFIGREG_D,7,1);
break;
case PARTY:
ddx_writeCoefVal(0xc8,0xe4a917); //channel 1
biquad_coef.b2 = 0x7fc83b;
biquad_coef.b0 = 0x400e7c;
biquad_coef.a2 = 0x801acd;
biquad_coef.a1 = 0x7ff297;
biquad_coef.b1 = 0x800d69;
ddx_writeCoefValSets(0x05,biquad_coef); //channel 1 biquad2
biquad_coef.b2 = 0x7f4db3;
biquad_coef.b0 = 0x402e50;
biquad_coef.a2 = 0x8055ad;
biquad_coef.a1 = 0x7fd50c;
biquad_coef.b1 = 0x802af4;
ddx_writeCoefValSets(0x0a,biquad_coef); //channel 1 biquad3
biquad_coef.b2 = 0x7908a0;
biquad_coef.b0 = 0x412849;
biquad_coef.a2 = 0x84a6cc;
biquad_coef.a1 = 0x7d8082;
biquad_coef.b1 = 0x827f7e;
ddx_writeCoefValSets(0x0f,biquad_coef); //channel 1 biquad4
biquad_coef.b2 = 0x2688b9;
biquad_coef.b0 = 0x4edd22;
biquad_coef.a2 = 0xbbbd01;
biquad_coef.a1 = 0x4dda39;
biquad_coef.b1 = 0xb225c7;
ddx_writeCoefValSets(0x14,biquad_coef); //channel 1 biquad5
//each channel uses channel 1 coefficient values.
write_reg_bit(CONFIGREG_D,7,1);
break;
case DANCE:
ddx_writeCoefVal(0xc8,0xddef46); //channel 1
biquad_coef.b2 = 0x7fd0f2;
biquad_coef.b0 = 0x400a20;
biquad_coef.a2 = 0x801acd;
biquad_coef.a1 = 0x7ff297;
biquad_coef.b1 = 0x800d69;
ddx_writeCoefValSets(0x05,biquad_coef); //channel 1 biquad2
biquad_coef.b2 = 0x7f2132;
biquad_coef.b0 = 0x4039df;
biquad_coef.a2 = 0x806b0f;
biquad_coef.a1 = 0x7fca4b;
biquad_coef.b1 = 0x8035b5;
ddx_writeCoefValSets(0x0a,biquad_coef); //channel 1 biquad3
biquad_coef.b2 = 0x7a469f;
biquad_coef.b0 = 0x40cd3f;
biquad_coef.a2 = 0x841ee2;
biquad_coef.a1 = 0x7ddf4c;
biquad_coef.b1 = 0x8220b4;
ddx_writeCoefValSets(0x0f,biquad_coef); //channel 1 biquad4
biquad_coef.b2 = 0x2ca6df;
biquad_coef.b0 = 0x4dd8f0;
biquad_coef.a2 = 0xb7a741;
biquad_coef.a1 = 0x534a84;
biquad_coef.b1 = 0xacb57c;
ddx_writeCoefValSets(0x14,biquad_coef); //channel 1 biquad5
//each channel uses channel 1 coefficient values.
write_reg_bit(CONFIGREG_D,7,1);
break;
case HARD:
ddx_writeCoefVal(0xc8,0xdfd91e); //channel 1
biquad_coef.b2 = 0x7fdeb7;
biquad_coef.b0 = 0x400729;
biquad_coef.a2 = 0x8012f5;
biquad_coef.a1 = 0x7ff683;
biquad_coef.b1 = 0x80097d;
ddx_writeCoefValSets(0x05,biquad_coef); //channel 1 biquad2
biquad_coef.b2 = 0x7fbd74;
biquad_coef.b0 = 0x400e52;
biquad_coef.a2 = 0x8025e6;
biquad_coef.a1 = 0x7fed02;
biquad_coef.b1 = 0x8012fe;
ddx_writeCoefValSets(0x0a,biquad_coef); //channel 1 biquad3
biquad_coef.b2 = 0x007c0c;
biquad_coef.b0 = 0x662860;
biquad_coef.a2 = 0xb33334;
biquad_coef.a1 = 0x58ae56;
biquad_coef.b1 = 0xa751aa;
ddx_writeCoefValSets(0x0f,biquad_coef); //channel 1 biquad4
biquad_coef.b2 = 0x000000;
biquad_coef.b0 = 0x3fffff;
biquad_coef.a2 = 0x000000;
biquad_coef.a1 = 0x000000;
biquad_coef.b1 = 0x000000;
ddx_writeCoefValSets(0x14,biquad_coef); //channel 1 biquad5
//each channel uses channel 1 coefficient values.
write_reg_bit(CONFIGREG_D,7,1);
break;
case CLASSIC:
ddx_writeCoefVal(0xc8,0xaf3cc5); //channel 1
biquad_coef.b2 = 0x7f4977;
biquad_coef.b0 = 0x400f9b;
biquad_coef.a2 = 0x809753;
biquad_coef.a1 = 0x7fb3a3;
biquad_coef.b1 = 0x804c5d;
ddx_writeCoefValSets(0x05,biquad_coef); //channel 1 biquad2
biquad_coef.b2 = 0x7b9d6f;
biquad_coef.b0 = 0x40ba80;
biquad_coef.a2 = 0x82ed90;
biquad_coef.a1 = 0x7e77e0;
biquad_coef.b1 = 0x818820;
ddx_writeCoefValSets(0x0a,biquad_coef); //channel 1 biquad3
biquad_coef.b2 = 0x4e4a5f;
biquad_coef.b0 = 0x459fbc;
biquad_coef.a2 = 0xa67628;
biquad_coef.a1 = 0x5e3269;
biquad_coef.b1 = 0xa1cd97;
ddx_writeCoefValSets(0x0f,biquad_coef); //channel 1 biquad4
biquad_coef.b2 = 0x000000;
biquad_coef.b0 = 0x3fffff;
biquad_coef.a2 = 0x000000;
biquad_coef.a1 = 0x000000;
biquad_coef.b1 = 0x000000;
ddx_writeCoefValSets(0x14,biquad_coef); //channel 1 biquad5
//each channel uses channel 1 coefficient values.
write_reg_bit(CONFIGREG_D,7,1);
break;
case SOFT:
ddx_writeCoefVal(0xc8,0xd77b6); //channel 1
biquad_coef.b2 = 0x7fdd5d;
biquad_coef.b0 = 0x4003eb;
biquad_coef.a2 = 0x801acd;
biquad_coef.a1 = 0x7ff297;
biquad_coef.b1 = 0x800d69;
ddx_writeCoefValSets(0x05,biquad_coef); //channel 1 biquad2
biquad_coef.b2 = 0x7fa8c6;
biquad_coef.b0 = 0x4009de;
biquad_coef.a2 = 0x80437d;
biquad_coef.a1 = 0x7fde2f;
biquad_coef.b1 = 0x8021d1;
ddx_writeCoefValSets(0x0a,biquad_coef); //channel 1 biquad3
biquad_coef.b2 = 0x7d21e7;
biquad_coef.b0 = 0x3f992d;
biquad_coef.a2 = 0x83abbd;
biquad_coef.a1 = 0x7e25ce;
biquad_coef.b1 = 0x81da32;
ddx_writeCoefValSets(0x0f,biquad_coef); //channel 1 biquad4
biquad_coef.b2 = 0x157218;
biquad_coef.b0 = 0x5bad59;
biquad_coef.a2 = 0xb33334;
biquad_coef.a1 = 0x58ae56;
biquad_coef.b1 = 0xa751aa;
ddx_writeCoefValSets(0x14,biquad_coef); //channel 1 biquad5
//each channel uses channel 1 coefficient values.
write_reg_bit(CONFIGREG_D,7,1);
break;
default:
}
ddx_enableEPAD(); //unEAPD
ddx_masterMute(0); //demute all channels
}
/******************************************
/Function: ddx_TunerOutput_VSS()
/description: Specific stereo to "virtual 5.1 effect"
setting for tuner input mode
/creator: xulf
/date: 2003-12-24
/******************************************/
void ddx_TunerOutput_VSS(void)
{
BYTE data;
coef_factor bass_coef;
ddx_disableEPAD(); //EAPD
ddx_masterMute(1); //mute all channels
//disable bass management mode
ddx_disable_BassManagement();
//enable adjacent channel-mixing mode
write_reg_bit(CONFIGREG_E,0,1);
//SDI_12-->LT/RT; SDI_34-->0; SDI_56-->0; SDI_78-->0
//7 5 4 2 1 6-->FL FR VirtualCE VirtualSL VirtualSR VirtualSW
data = 0x01;
WriteToI2c(DDX8K_ADDR,C12MAP_REG,&data,1);
data = 0x01;
WriteToI2c(DDX8K_ADDR,C34MAP_REG,&data,1);
data = 0x01;
WriteToI2c(DDX8K_ADDR,C56MAP_REG,&data,1);
data = 0x00;
WriteToI2c(DDX8K_ADDR,C78MAP_REG,&data,1);
//set pre-scale factor
ddx_writeCoefVal(0xd0,0x000000); //X-Full attenuation
ddx_writeCoefVal(0xd1,0x7FFFFF); //0dB
ddx_writeCoefVal(0xd2,0x400000); //-6dB
ddx_writeCoefVal(0xd3,0x400000);
ddx_writeCoefVal(0xd4,0x400000);
ddx_writeCoefVal(0xd5,0x400000);
ddx_writeCoefVal(0xd6,0x000000);
//set channel 7,5,4,2,1 filter coefficient
bass_coef.b2 = HPF_COEF_B2;
bass_coef.b0 = HPF_COEF_B0;
bass_coef.a2 = HPF_COEF_A2;
bass_coef.a1 = HPF_COEF_A1;
bass_coef.b1 = HPF_COEF_B1;
ddx_writeCoefValSets(0x96,bass_coef); //channel 7 xulf 2003-12-15
ddx_writeCoefValSets(0x64,bass_coef); //channel 5
ddx_writeCoefValSets(0x4b,bass_coef); //channel 4
ddx_writeCoefValSets(0x19,bass_coef); //channel 2
ddx_writeCoefValSets(0x00,bass_coef); //channel 1
//set channel 6 filter coefficient
bass_coef.b2 = LPF_COEF_B2;
bass_coef.b0 = LPF_COEF_B0;
bass_coef.a2 = LPF_COEF_A2;
bass_coef.a1 = LPF_COEF_A1;
bass_coef.b1 = LPF_COEF_B1;
ddx_writeCoefValSets(0x7d,bass_coef);
ddx_enableEPAD(); //unEAPD
ddx_masterMute(0); //demute all channels
}