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

📄 amp.c

📁 车载电子影音系统dvd播放系统原程序代码
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -