📄 amp.c
字号:
#if (AMP_VOLUME_SOURCE == DIGITAL_DDX8000)
// wyc.278a, initial the volume of PCM1723.
PCM1723_Write(0x0100 | aVolumeMapDAC[__bAMPVol]); // Added by KCHong
PCM1723_Write(0x0300 | aVolumeMapDAC[__bAMPVol]);
_REG[0]=1;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_CONFF_REG;
_AMP_ReadReg();
if(_REG[1] & EAPD)
{
_REG[0]=3;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_CONFF_REG;
_REG[3]=COD + SID;
_AMP_WriteReg();
}
_REG[0]=7;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_CONFA_REG;
#ifdef BINARY_OUTPUT_MODE
#ifdef USING_256_MODE_ACLK_FREQ
_REG[3]=MPC + IR_32K_44K1_48K + FS_256; // Value of Reg. A(0x00)
#else
_REG[3]=MPC + IR_32K_44K1_48K + FS_384; // Value of Reg. A(0x00)
#endif
#else
#ifdef USING_256_MODE_ACLK_FREQ
_REG[3]=MPC + HPE + IR_32K_44K1_48K + FS_256; // Value of Reg. A(0x00)
#else
_REG[3]=MPC + HPE + IR_32K_44K1_48K + FS_384; // Value of Reg. A(0x00)
#endif
#endif
_REG[4]=ZCE + SAIFB_MSB + DVD_I2S_FORMAT + ZDE; // Value of Reg. B(0x01)
_REG[5]=0x7c; // Value of Reg. C(0x02)
#ifdef BINARY_OUTPUT_MODE
_REG[6]=CLKO_98304_48KHZ + C12BO + C34BO + C56BO + C78BO; // Value of Reg. D(0x03)
#else
_REG[6]=CLKO_98304_48KHZ; // Value of Reg. D(0x03)
#endif
_REG[7]=SAOFB_MSB + SAO_I2S + VOLEN; // Value of Reg. E(0x04)
_AMP_WriteReg();
_REG[0]=6;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_C12IM_REG;
#ifdef BINARY_OUTPUT_MODE
#ifdef DDX8228_BOARD_V10
_REG[3]=(MAPPING_SURROUND_RIGHT_IN << 4) + MAPPING_CENTER_IN; // Value of Reg. C12IM(0x11)
_REG[4]=(MAPPING_SURROUND_LEFT_IN << 4) + MAPPING_HEADPHONE_LEFT_IN; // Value of Reg. C34IM(0x12)
_REG[5]=(MAPPING_SUBWOOFER_IN << 4) + MAPPING_RIGHT_IN; // Value of Reg. C56IM(0x13)
_REG[6]=(MAPPING_HEADPHONE_RIGHT_IN << 4) + MAPPING_LEFT_IN; // Value of Reg. C78IM(0x14)
#else
_REG[3]=(MAPPING_SURROUND_LEFT_IN << 4) + MAPPING_RIGHT_IN; // Value of Reg. C34IM(0x12)
_REG[4]=(MAPPING_SURROUND_RIGHT_IN << 4) + MAPPING_LEFT_IN; // Value of Reg. C12IM(0x11)
_REG[5]=(MAPPING_SUBWOOFER_IN << 4) + MAPPING_CENTER_IN; // Value of Reg. C56IM(0x13)
_REG[6]=(MAPPING_HEADPHONE_RIGHT_IN << 4) + MAPPING_HEADPHONE_LEFT_IN; // Value of Reg. C78IM(0x14)
#endif
#else
_REG[3]=(MAPPING_RIGHT_IN << 4) + MAPPING_LEFT_IN; // Value of Reg. C12IM(0x11)
_REG[4]=(MAPPING_SURROUND_RIGHT_IN << 4) + MAPPING_SURROUND_LEFT_IN; // Value of Reg. C34IM(0x12)
_REG[5]=(MAPPING_SUBWOOFER_IN << 4) + MAPPING_CENTER_IN; // Value of Reg. C56IM(0x13)
_REG[6]=(MAPPING_HEADPHONE_RIGHT_IN << 4) + MAPPING_HEADPHONE_LEFT_IN; // Value of Reg. C78IM(0x14)
#endif
_AMP_WriteReg();
_REG[0]=3;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_MMUTE_REG;
_REG[3]=0;
_AMP_WriteReg();
_REG[0]=3;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_CMUTE_REG;
_REG[3]=0;
_AMP_WriteReg();
// HAL1_DDXSetVolume();
for(_bAMPTemp1=0;_bAMPTemp1<=8;_bAMPTemp1++) // KCHong, 20030115
AMP_SetChannelVolume(_bAMPTemp1,TRUE);
AMP_SetEQMode(SOUND_EFFECT_STANDARD);
for(bChannelCount=0;bChannelCount<6;bChannelCount++) // Write Biquad 5 of each channel
{
_REG[0]=19;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_CFADDR_REG;
_REG[3]=0x14+0x19*bChannelCount;
for(bEQCount=0;bEQCount<15;bEQCount++)
_REG[bEQCount+4]=aDDXBiquad5Map[bChannelCount][bEQCount];
_REG[19]=0x02;
_AMP_WriteReg();
}
#ifdef BASS_REDIRECTION
_REG[0]=19;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_CFADDR_REG;
_REG[3]=0xd0;
for(bEQCount=0;bEQCount<5;bEQCount++)
{
_REG[4+3*bEQCount]=0xe6;
_REG[5+3*bEQCount]=0x75;
_REG[6+3*bEQCount]=0xed;
}
_REG[19]=0x02;
_AMP_WriteReg();
_REG[0]=6;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_CFADDR_REG;
_REG[3]=0xd5;
_REG[4]=0xaf;
_REG[5]=0x3c;
_REG[6]=0xcb;
_AMP_WriteReg();
_REG[0]=3;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_CFUD_REG;
_REG[3]=0x01;
_AMP_WriteReg();
_REG[0]=3;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_CONFA_REG;
#ifdef BINARY_OUTPUT_MODE
#ifdef USING_256_MODE_ACLK_FREQ
_REG[3]=MPC + IR_32K_44K1_48K + FS_256 + BME; // Value of conf. A(0x00)
#else
_REG[3]=MPC + IR_32K_44K1_48K + FS_384 + BME; // Value of conf. A(0x00)
#endif
#else
#ifdef USING_256_MODE_ACLK_FREQ
_REG[3]=MPC + HPE + IR_32K_44K1_48K + FS_256 + BME; // Value of conf. A(0x00)
#else
_REG[3]=MPC + HPE + IR_32K_44K1_48K + FS_384 + BME; // Value of conf. A(0x00)
#endif
#endif
_AMP_WriteReg();
#endif
__bInitialStatus |= AMP_INITIAL_OK;
return ;
#endif // if (AMP_VOLUME_SOURCE == DIGITAL_DDX8000)
}
// wyc.277a-2, function to transfer volume degree to value that set to WM8746 DAC.
BYTE _AMP_GetVolumeDegree(BYTE bVolume)
{
#if (AMP_VOLUME_SOURCE == ANALOG_WM8746)
if (bVolume >= 15)
__bTemp = bVolume + 222;
else
__bTemp = aVolumeMap[bVolume];
return __bTemp;
#else
return NULL;
#endif //
}
// *********************************************************************
// Function : _AMP_CombineMainPerVol
// Description : Use to compute the absolute value from per-channel volume array.
// Arguments : The computed per-channel audio channel.
// Return : The absolute value of the per-chanel volume.
// Change :
// Side Effect :
// *********************************************************************
BYTE _AMP_CombineMainPerVol(BYTE bAudioChannel)
{
#if (AMP_VOLUME_SOURCE == ANALOG_WM8746)
_bAMPTemp = __bAMPVol + __bPerVol[bAudioChannel];
if ( _bAMPTemp <= DEFAULT_OTHER_CHANNEL_DEGREE )
return NULL;
_bAMPTemp -= DEFAULT_OTHER_CHANNEL_DEGREE;
if (_bAMPTemp >= MAX_ALL_CHANNEL_VOLUME)
return MAX_ALL_CHANNEL_VOLUME;
else
return _bAMPTemp;
return FALSE;
#else
return NULL;
#endif //
}
//#######################################################################
// Function : AMP_SetChannelVolume
// Description : Program the per-channel volume degree setting.
// Parameters : bChannel: The adjusted audio channel.
// Return : None
//#######################################################################
void AMP_SetChannelVolume(BYTE bChannel, BYTE bSet) // 20030115
{
#if AMP_VOLUME_SOURCE == ANALOG_WM8746
// wyc.277a-2, add the per-channel volume control in analog AMP.
switch (bChannel)
{
// wyc.278, modified the flow to make AV system can adjust per-channel volume individually.
case AUDIO_CHANNEL_ALL:
case AUDIO_CHANNEL_FRONT_L:
__bTemp = _AMP_CombineMainPerVol(AUDIO_CHANNEL_FRONT_L);
_bAMPTemp = _AMP_GetVolumeDegree(__bTemp);
_wBitResolution = 0x0100 | _bAMPTemp; //0000000
WM8746_Write();
if (bChannel == AUDIO_CHANNEL_FRONT_L) break;
case AUDIO_CHANNEL_FRONT_R:
__bTemp = _AMP_CombineMainPerVol(AUDIO_CHANNEL_FRONT_R);
_bAMPTemp = _AMP_GetVolumeDegree(__bTemp);
_wBitResolution = 0x0300 | _bAMPTemp; //0000001
WM8746_Write();
if (bChannel == AUDIO_CHANNEL_FRONT_R) break;
case AUDIO_CHANNEL_REAR_L:
__bTemp = _AMP_CombineMainPerVol(AUDIO_CHANNEL_REAR_L);
_bAMPTemp = _AMP_GetVolumeDegree(__bTemp);
_wBitResolution = 0x0900 | _bAMPTemp; //0000100
WM8746_Write();
if (bChannel == AUDIO_CHANNEL_REAR_L) break;
case AUDIO_CHANNEL_REAR_R:
__bTemp = _AMP_CombineMainPerVol(AUDIO_CHANNEL_REAR_R);
_bAMPTemp = _AMP_GetVolumeDegree(__bTemp);
_wBitResolution = 0x0b00 | _bAMPTemp; //0000101
WM8746_Write();
if (bChannel == AUDIO_CHANNEL_REAR_R) break;
case AUDIO_CHANNEL_CENTER:
__bTemp = _AMP_CombineMainPerVol(AUDIO_CHANNEL_CENTER);
_bAMPTemp = _AMP_GetVolumeDegree(__bTemp);
_wBitResolution = 0x0d00 | _bAMPTemp; //0000110
WM8746_Write();
if (bChannel == AUDIO_CHANNEL_CENTER) break;
case AUDIO_CHANNEL_SW:
__bTemp = _AMP_CombineMainPerVol(AUDIO_CHANNEL_SW);
_bAMPTemp = _AMP_GetVolumeDegree(__bTemp);
_wBitResolution = 0x0f00 | _bAMPTemp; //0000111
WM8746_Write();
break;
}
#elif (AMP_VOLUME_SOURCE == DIGITAL_DDX8000)
// wyc.278-3, integrate code here.
switch(bChannel)
{
case AUDIO_CHANNEL_ALL:
_bAMPTemp = DDX_MVOL_REG;
break;
case AUDIO_CHANNEL_FRONT_L:
_bAMPTemp = DDX_LEFT_VOLUME_REG;
break;
case AUDIO_CHANNEL_FRONT_R:
_bAMPTemp = DDX_RIGHT_VOLUME_REG;
break;
case AUDIO_CHANNEL_REAR_L:
_bAMPTemp = DDX_SUR_LEFT_VOLUME_REG;
break;
case AUDIO_CHANNEL_REAR_R:
_bAMPTemp = DDX_SUR_RIGHT_VOLUME_REG;
break;
case AUDIO_CHANNEL_CENTER:
_bAMPTemp = DDX_CENTER_VOLUME_REG;
break;
case AUDIO_CHANNEL_SW:
_bAMPTemp = DDX_SUBWOOFER_VOLUME_REG;
break;
case AUDIO_CHANNEL_BASS:
case AUDIO_CHANNEL_TREBLE:
_bAMPTemp = DDX_TONE_REG;
break;
}
if (bChannel == AUDIO_CHANNEL_ALL)
{
if(bSet==TRUE)
{
if(__bAMPVol==0) // Added condition, shut down DDX when volume 0, 278b-Mustek
AMP_mute(DAC_MUTE_ON);
else
{
if(__bAMPVol==1)
AMP_mute(DAC_MUTE_OFF);
// wyc.278a, adjust the PCM1723 volume.
PCM1723_Write(0x0100 | aVolumeMapDAC[__bAMPVol]); // Added by KCHong
PCM1723_Write(0x0300 | aVolumeMapDAC[__bAMPVol]);
_REG[0]=3;
_REG[1]=DDX8000_ADDR; // Modified by KCHong, 20021206
_REG[2]=_bAMPTemp;
_REG[3]=aVolumeMap[__bAMPVol];
_AMP_WriteReg();
}
}
else
{
PCM1723_Write(0x0100 | aVolumeMapDAC[16]); // Added by KCHong
PCM1723_Write(0x0300 | aVolumeMapDAC[16]);
_REG[0]=3;
_REG[1]=DDX8000_ADDR; // Modified by KCHong, 20021206
_REG[2]=_bAMPTemp;
_REG[3]=aVolumeMap[16];
_AMP_WriteReg();
}
}
else if ( (bChannel == AUDIO_CHANNEL_BASS) || (bChannel == AUDIO_CHANNEL_TREBLE) )
{
_REG[0]=3; // Update by KCHong, re-cal. treble/bass, 278b-Mustek
_REG[1]=DDX8000_ADDR;
_REG[2]=_bAMPTemp;
_REG[3]=(bSet==TRUE)?((__bPerVol[AUDIO_CHANNEL_TREBLE]+1)<<4) | (__bPerVol[AUDIO_CHANNEL_BASS]+1):0x66;
_AMP_WriteReg();
}
else if (bChannel == AUDIO_CHANNEL_SW)
{
_REG[0]=3;
_REG[1]=DDX8000_ADDR; // Modified by KCHong, 20021206
_REG[2]=_bAMPTemp;
_REG[3]=aLFEVolume[(bSet==TRUE)?__bPerVol[bChannel]:6];
_AMP_WriteReg();
}
else
{
_REG[0]=3;
_REG[1]=DDX8000_ADDR; // Modified by KCHong, 20021206
_REG[2]=_bAMPTemp;
_REG[3]=aPerVolume[(bSet==TRUE)?__bPerVol[bChannel]:6];
_AMP_WriteReg();
}
#endif // AMP_VOLUME_SOURCE
}
// wyc.277a-2-Modify this function.
//#######################################################################
// Function : AMP_ProgramAUXChannel
// Description : Program the AUX channel setting and selection.
// Parameters : bAUXChannel: The active AUX channel
// Return : None
//#######################################################################
void AMP_ProgramAUXChannel (BYTE bAUXChannel)
{
switch(bAUXChannel)
{
case AUX_CHANNEL_DVD:
HAL1_ExtIOCtrl(EXT_FS1_LO);
HAL1_ExtIOCtrl(EXT_FS2_LO);
break;
case AUX_CHANNEL_TUNER:
HAL1_ExtIOCtrl(EXT_FS1_HI);
HAL1_ExtIOCtrl(EXT_FS2_HI);
__wW99AVPCRLow &= 0xfffd;
W99AV_WriteRegDW (PCR, __wW99AVPCRLow, __wW99AVPCRHigh );
break;
case AUX_CHANNEL_AV1:
HAL1_ExtIOCtrl(EXT_FS1_HI);
HAL1_ExtIOCtrl(EXT_FS2_LO);
__wW99AVPCRLow |= 0x0002;
W99AV_WriteRegDW (PCR, __wW99AVPCRLow, __wW99AVPCRHigh );
break;
case AUX_CHANNEL_AV2:
HAL1_ExtIOCtrl(EXT_FS1_LO);
HAL1_ExtIOCtrl(EXT_FS2_HI);
break;
}
}
void _AMP_WriteReg(void)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -