📄 amp.c
字号:
#if (AMP_VOLUME_SOURCE == DIGITAL_DDX8000)
extern BYTE __icVFDnow;
__icVFDnow=0x01; // Step 1: Disable PANEL_KEY_SCAN
__sbI2Csdat=1; // Step 2: Start condition
HAL1_ExtIOCtrl(EXT_WEN_HI);
__sbI2Csdat=0;
for(bDDXI2CByteCount=1;bDDXI2CByteCount<=_REG[0];bDDXI2CByteCount++) // Step 3: Send data
{
for(bDDXI2CBitCount=0;bDDXI2CBitCount<8;bDDXI2CBitCount++)
{
HAL1_ExtIOCtrl(EXT_WEN_LO);
__sbI2Csdat=(_REG[bDDXI2CByteCount] & 0x80)?1:0;
HAL1_ExtIOCtrl(EXT_WEN_HI);
_REG[bDDXI2CByteCount]<<=1;
}
HAL1_ExtIOCtrl(EXT_WEN_LO);
__sbI2Csdat=1;
HAL1_ExtIOCtrl(EXT_WEN_HI);
}
__sbI2Csdat=0; // Step 4: Stop condition
__sbI2Csdat=1;
HAL1_ExtIOCtrl(EXT_WEN_LO);
__icVFDnow=0x00;
#endif // #if (AMP_VOLUME_SOURCE == DIGITAL_DDX8000)
}
// wyc.278a-1, function to support I2C read function in DDX8000.
void _AMP_ReadReg(void)
{
#if (AMP_VOLUME_SOURCE == DIGITAL_DDX8000)
extern BYTE __icVFDnow;
_REG[3]=_REG[1] | 0x01;
__icVFDnow=0x01; // Step 1: Disable PANEL_KEY_SCAN
__sbI2Csdat=1; // Step 2: Start condition
HAL1_ExtIOCtrl(EXT_WEN_HI);
__sbI2Csdat=0;
for(bDDXI2CByteCount=1;bDDXI2CByteCount<=2;bDDXI2CByteCount++) // Step 3: Send data
{
for(bDDXI2CBitCount=0;bDDXI2CBitCount<8;bDDXI2CBitCount++)
{
HAL1_ExtIOCtrl(EXT_WEN_LO);
__sbI2Csdat=(_REG[bDDXI2CByteCount] & 0x80)?1:0;
HAL1_ExtIOCtrl(EXT_WEN_HI);
_REG[bDDXI2CByteCount]<<=1;
}
HAL1_ExtIOCtrl(EXT_WEN_LO);
__sbI2Csdat=1;
HAL1_ExtIOCtrl(EXT_WEN_HI);
}
HAL1_ExtIOCtrl(EXT_WEN_LO); // Step 4: Start condition
__sbI2Csdat=1;
HAL1_ExtIOCtrl(EXT_WEN_HI);
__sbI2Csdat=0;
for(bDDXI2CBitCount=0;bDDXI2CBitCount<8;bDDXI2CBitCount++)
{
HAL1_ExtIOCtrl(EXT_WEN_LO);
__sbI2Csdat=(_REG[3] & 0x80)?1:0;
HAL1_ExtIOCtrl(EXT_WEN_HI);
_REG[3]<<=1;
}
HAL1_ExtIOCtrl(EXT_WEN_LO);
__sbI2Csdat=1;
HAL1_ExtIOCtrl(EXT_WEN_HI);
for(bDDXI2CByteCount=1;bDDXI2CByteCount<=_REG[0];bDDXI2CByteCount++)
{
_REG[bDDXI2CByteCount]=0;
for(bDDXI2CBitCount=0;bDDXI2CBitCount<8;bDDXI2CBitCount++)
{
HAL1_ExtIOCtrl(EXT_WEN_LO);
__sbI2Csdat=1;
_REG[bDDXI2CByteCount]<<=1;
HAL1_ExtIOCtrl(EXT_WEN_HI);
if(__sbI2Csdat)
_REG[bDDXI2CByteCount] |= 0x01;
}
HAL1_ExtIOCtrl(EXT_WEN_LO);
__sbI2Csdat=0;
HAL1_ExtIOCtrl(EXT_WEN_HI);
}
__sbI2Csdat=0; // Stop condition
__sbI2Csdat=1;
HAL1_ExtIOCtrl(EXT_WEN_LO);
__icVFDnow=0x00;
#endif // #if (AMP_VOLUME_SOURCE == DIGITAL_DDX8000)
}
/**************************************************************
* All kinds of amplifiers mute function, include PCM1723 / WM8746 and DDX8000 dac mute
***************************************************************/
void AMP_mute(BYTE mode)
{
#if (AMP_VOLUME_SOURCE == DIGITAL_DDX8000)
extern BYTE __bPeripheralIN;
_REG[0]=1;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_CONFF_REG;
_AMP_ReadReg();
switch (mode)
{
case DAC_MUTE_OFF:
if(!(__bPeripheralIN & EARPHONE_ACTIVE)) // Added by KCHong, earphone mute, 278b-Mustek
{
if(!(_REG[1] & EAPD))
{
_REG[0]=3;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_CONFF_REG;
_REG[3]=EAPD + COD + SID;
_AMP_WriteReg();
}
}
_GetSampleFreq(HAL_DAC_PCM1723, _bSampleFreq);
_wBitResolution &= 0xFFFE;
PCM1723_Write(_wBitResolution);
break;
case DAC_MUTE_ON:
_GetSampleFreq(HAL_DAC_PCM1723, _bSampleFreq);
_wBitResolution |= 0x1;
PCM1723_Write(_wBitResolution);
case DAC_MUTE_AMPLIFIER:
if((_REG[1] & EAPD)) // Added by KCHong, earphone mute, 278b-Mustek
{
_REG[0]=3;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_CONFF_REG;
_REG[3]=COD + SID;
_AMP_WriteReg();
}
break;
}
#elif (AMP_VOLUME_SOURCE == DIGITAL_DDX8000) // AMP_VOLUME_SOURCE
switch (mode)
{
case DAC_MUTE_OFF:
if (__bHAL1_Deemphasis)
_wBitResolution = 0x0522 ;
else
_wBitResolution = 0x0520 ;
WM8746_Write(); // mute off the audio from DAC
break;
case DAC_MUTE_ON:
if (__bHAL1_Deemphasis)
_wBitResolution = 0x0523 ;
else
_wBitResolution = 0x0521 ;
WM8746_Write(); // mute on the audio from DAC
break;
}
#endif // #if (AMP_VOLUME_SOURCE == DIGITAL_DDX8000)
}
// LLY2.78b-2, base on HKC modification to do audio channel remapping action
// **************************************************************************
// Function : AMP_ChannelRemapping
// Description : Program relative register to do audio channel remapping
// Argument : bMode, specify the desired channel remapping mode
// CHANNEL_REMAPPING_NONE, normal mode
// CHANNEL_REMAPPING_2_TO_2_DOT_1, 2 -> 2.1 mode
// CHANNEL_REMAPPING_2_TO_5_DOT_1, 2 -> 5.1 mode
// Return : None
// Side Effect :
// **************************************************************************
void AMP_ChannelReMapping(BYTE bMode)
{
#if (AMP_VOLUME_SOURCE == DIGITAL_DDX8000)
switch(bMode)
{
case CHANNEL_REMAPPING_NONE:
case CHANNEL_REMAPPING_2_TO_2_DOT_1:
_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;
_REG[4]=(MAPPING_SURROUND_LEFT_IN << 4) + MAPPING_HEADPHONE_LEFT_IN;
_REG[5]=(MAPPING_SUBWOOFER_IN << 4) + MAPPING_RIGHT_IN;
_REG[6]=(MAPPING_HEADPHONE_RIGHT_IN << 4) + MAPPING_LEFT_IN;
#else
_REG[3]=(MAPPING_SURROUND_LEFT_IN << 4) + MAPPING_RIGHT_IN;
_REG[4]=(MAPPING_SURROUND_RIGHT_IN << 4) + MAPPING_LEFT_IN;
_REG[5]=(MAPPING_SUBWOOFER_IN << 4) + MAPPING_CENTER_IN;
_REG[6]=(MAPPING_HEADPHONE_RIGHT_IN << 4) + MAPPING_HEADPHONE_LEFT_IN;
#endif
#else
_REG[3]=(MAPPING_RIGHT_IN << 4) + MAPPING_LEFT_IN;
_REG[4]=(MAPPING_SURROUND_RIGHT_IN << 4) + MAPPING_SURROUND_LEFT_IN;
_REG[5]=(MAPPING_SUBWOOFER_IN << 4) + MAPPING_CENTER_IN;
_REG[6]=(MAPPING_HEADPHONE_RIGHT_IN << 4) + MAPPING_HEADPHONE_LEFT_IN;
#endif
_AMP_WriteReg();
break;
case CHANNEL_REMAPPING_2_TO_5_DOT_1:
_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;
_REG[4]=(MAPPING_SURROUND_LEFT_IN << 4) + MAPPING_HEADPHONE_LEFT_IN;
_REG[5]=(MAPPING_SUBWOOFER_IN << 4) + MAPPING_RIGHT_IN;
_REG[6]=(MAPPING_HEADPHONE_RIGHT_IN << 4) + MAPPING_LEFT_IN;
#else
_REG[3]=(MAPPING_LEFT_IN << 4) + MAPPING_RIGHT_IN;
_REG[4]=(MAPPING_RIGHT_IN << 4) + MAPPING_LEFT_IN;
_REG[5]=(MAPPING_SUBWOOFER_IN << 4) + MAPPING_RIGHT_IN;
_REG[6]=(MAPPING_HEADPHONE_RIGHT_IN << 4) + MAPPING_HEADPHONE_LEFT_IN;
#endif
#else
_REG[3]=(MAPPING_RIGHT_IN << 4) + MAPPING_LEFT_IN;
_REG[4]=(MAPPING_RIGHT_IN << 4) + MAPPING_LEFT_IN;
_REG[5]=(MAPPING_RIGHT_IN << 4) + MAPPING_LEFT_IN;
_REG[6]=(MAPPING_HEADPHONE_RIGHT_IN << 4) + MAPPING_HEADPHONE_LEFT_IN;
#endif
_AMP_WriteReg();
break;
}
switch(bMode)
{
case CHANNEL_REMAPPING_NONE:
_REG[0]=3;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_CONFA_REG;
#ifdef BINARY_OUTPUT_MODE
_REG[3]=MPC + IR_32K_44K1_48K + FS_256; // Value of conf. A(0x00)
#else
_REG[3]=MPC + HPE + IR_32K_44K1_48K + FS_256; // Value of conf. A(0x00)
#endif
_AMP_WriteReg();
break;
case CHANNEL_REMAPPING_2_TO_2_DOT_1:
case CHANNEL_REMAPPING_2_TO_5_DOT_1:
_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
_REG[3]=MPC + IR_32K_44K1_48K + FS_256 + BME; // Value of conf. A(0x00)
#else
_REG[3]=MPC + HPE + IR_32K_44K1_48K + FS_256 + BME; // Value of conf. A(0x00)
#endif
_AMP_WriteReg();
break;
}
if(bMode==CHANNEL_REMAPPING_NONE)
{
if(__bACHN==2)
HAL1_ExtIOCtrl(EXT_NPRN_LO);
else
HAL1_ExtIOCtrl(EXT_NPRN_HI);
}
else if(bMode==CHANNEL_REMAPPING_2_TO_2_DOT_1)
HAL1_ExtIOCtrl(EXT_NPRN_LO);
else
HAL1_ExtIOCtrl(EXT_NPRN_HI);
#endif // #if (AMP_VOLUME_SOURCE == DIGITAL_DDX8000)
}
// LLY.278-4, add to program "Equalizer" mode
// *****************************************************************************
// Function : AMP_SetEQMode
// Description : Used to program "Equalizer" mode
// Arguments : bMode, specify the desired "Equalizer" mode
// it will same as __bSoundEffect value define (chips.h)
// Return : None
// Side Effect :
// ******************************************************************************
#ifdef SUPPORT_EQUALIZER
void AMP_SetEQMode(BYTE bMode)
{
#if (AMP_VOLUME_SOURCE == DIGITAL_DDX8000)
// Step 1: Mute output. Totally sent 3 bytes
_REG[0]=3;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_MMUTE_REG;
_REG[3]=0x01;
_AMP_WriteReg();
// Step 2: Set Prescale factor. Totally sent 19 bytes
_REG[0]=19;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_CFADDR_REG;
_REG[3]=0xc8;
for(bEQCount=0;bEQCount<5;bEQCount++)
{
_REG[4+bEQCount*3]=aDDXPreScaleMap[bMode][0];
_REG[5+bEQCount*3]=aDDXPreScaleMap[bMode][1];
_REG[6+bEQCount*3]=aDDXPreScaleMap[bMode][2];
}
_REG[19]=0x02;
_AMP_WriteReg();
// Step 3: Set Biquad factor. Totally sent 456 bytes
for(bChannelCount=0;bChannelCount<6;bChannelCount++)
{
for(bEQCount=0;bEQCount<4;bEQCount++)
{
_REG[0]=19;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_CFADDR_REG;
_REG[3]=bChannelCount*25+bEQCount*5;
_REG[4]=aDDXBiquadMap[bMode][bEQCount*15];
_REG[5]=aDDXBiquadMap[bMode][bEQCount*15+1];
_REG[6]=aDDXBiquadMap[bMode][bEQCount*15+2];
_REG[7]=aDDXBiquadMap[bMode][bEQCount*15+3];
_REG[8]=aDDXBiquadMap[bMode][bEQCount*15+4];
_REG[9]=aDDXBiquadMap[bMode][bEQCount*15+5];
_REG[10]=aDDXBiquadMap[bMode][bEQCount*15+6];
_REG[11]=aDDXBiquadMap[bMode][bEQCount*15+7];
_REG[12]=aDDXBiquadMap[bMode][bEQCount*15+8];
_REG[13]=aDDXBiquadMap[bMode][bEQCount*15+9];
_REG[14]=aDDXBiquadMap[bMode][bEQCount*15+10];
_REG[15]=aDDXBiquadMap[bMode][bEQCount*15+11];
_REG[16]=aDDXBiquadMap[bMode][bEQCount*15+12];
_REG[17]=aDDXBiquadMap[bMode][bEQCount*15+13];
_REG[18]=aDDXBiquadMap[bMode][bEQCount*15+14];
_REG[19]=0x02;
_AMP_WriteReg();
}
}
// Step 4: Unmute output. Totally sent 3 bytes
_REG[0]=3;
_REG[1]=DDX8000_ADDR;
_REG[2]=DDX_MMUTE_REG;
_REG[3]=0x00;
_AMP_WriteReg();
#endif // #if (AMP_VOLUME_SOURCE == DIGITAL_DDX8000)
}
#endif // #ifdef SUPPORT_EQUALIZER
#endif // #ifdef SUPPORT_AV_SYSTEM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -