📄 rt5621.cpp
字号:
//-----------------------------------------------------------------
// INCLUDE FILES
//-----------------------------------------------------------------
#include <windows.h>
#include <types.h>
#include <memory.h>
#include <excpt.h>
#include <wavepdd.h>
#include <waveddsi.h>
#include "Rt5621.h"
#include "i2s_control.h"
BYTE CodecDevId=DEV_AUDIO;
//*************************************************************************************************************
//initize codec register
CodecRegister Set_Codec_Reg_Init[]=
{
{RT5621_SPK_OUT_VOL ,0x0000},//default speaker to 0DB
{RT5621_HP_OUT_VOL ,0x0808},//default HP to -12DB
{RT5621_ADC_REC_MIXER ,0x3F3F},//default Record is MicIn
{RT5621_STEREO_DAC_VOL ,0x0808},//default stereo DAC volume
{RT5621_MICROPHONE_CTRL ,0x0400},//set boost to +20DB
{RT5621_AUDIO_INTERFACE ,0x8000},//set I2S codec to slave mode
#if USE_CLASS_AB_SPEAKER
//default output mixer control,SPK output is LP and LN,CLASS AB,all output from HP mixer
{RT5621_OUTPUT_MIXER_CTRL ,0x8740},
#else
//default output mixer control,SPK output is LP and LN,CLASS D,all outptu from HP mixer
{RT5621_OUTPUT_MIXER_CTRL ,0xA740},
{RT5621_HID_CTRL_INDEX ,0x0046},//Index of Class D internal Register
{RT5621_HID_CTRL_DATA ,0xFFFF},//Power on all bit of Class D
#endif
#if 0//if you need use AVC function,please fill below initize value of AVC,below value only be refer
{RT5621_HID_CTRL_INDEX ,0x0021},//Auto Volume Control Register 1
{RT5621_HID_CTRL_DATA ,0x0500},//Maximum PCM absolute level
{RT5621_HID_CTRL_INDEX ,0x0022},//Auto Volume Control Register 2
{RT5621_HID_CTRL_DATA ,0x0400},//Mimimum PCM absolute level
{RT5621_HID_CTRL_INDEX ,0x0023},//Auto Volume Control Register 3
{RT5621_HID_CTRL_DATA ,0x0050},//Non-active PCM absolute level
{RT5621_HID_CTRL_INDEX ,0x0024},//Auto Volume Control Register 4
{RT5621_HID_CTRL_DATA ,0x01FF},//control the sensitivity to increase Gain
{RT5621_HID_CTRL_INDEX ,0x0025},//Auto Volume Control Register 5
{RT5621_HID_CTRL_DATA ,0x0200},//control the sensitivity to decrease Gain
#endif
};
#define SET_CODEC_REG_INIT_NUM (sizeof(Set_Codec_Reg_Init)/sizeof(CodecRegister))
//*************************************************************************************************************
//Hardware EQ
HW_EQ_PRESET *HwEq_Preset;
HW_EQ_PRESET HwEq_Preset_48k[]={
// 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0x62
{CLUB,{0x1F2C,0x13D1,0xC1CB,0x1E5D,0x0C73,0xCD47,0x188D,0x0C73,0xC3B5,0x1CD0,0x0C73,0x1DF8,0x2FB2},0x800E},
{DANCE,{0x1F2C,0x13D1,0xC070,0x1F95,0x0BCE,0xCA43,0x1A29,0xFA73,0xDEDF,0x0ED8,0xF8B1,0x1DF8,0x2FB2},0x800F},
{LIVE,{0x1E74,0xFA92,0xC249,0x1DF8,0x2298,0xC882,0x1C10,0x0D73,0xDA40,0x1561,0x0556,0x1DF8,0x2FB2},0x800F},
{POP,{0x1EB5,0xFCB5,0xC1D3,0x1E5D,0x1FC4,0xD9D7,0x15F6,0xFB53,0xFFFF,0x06D3,0xF804,0x1DF8,0x2FB2},0x800F},
{ROCK,{0x1EB5,0xFCB5,0xC070,0x1F95,0x0556,0xC3D8,0x1C56,0xF6E7,0x0C5D,0x0FC7,0x4030,0x1DF8,0x2FB2},0x800F},
};
HW_EQ_PRESET HwEq_Preset_44k[]={
// 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0x62
{CLUB ,{0x1DCC,0x13D1,0xC289,0x1E39,0x0C73,0xE1A2,0x17F8,0x0C73,0xC5E5,0x1C8B,0x0C73,0x1180,0x2FB2},0x800E},
{DANCE,{0x1DCC,0x13D1,0xC08E,0x1F8C,0x0BCE,0xCB7E,0x19B2,0xFA73,0x0655,0x0DBB,0xF8B1,0x1180,0x2FB2},0x800F},
{LIVE ,{0x1CB9,0xFA92,0xC36D,0x1DCC,0x2298,0xD8CA,0x1BBC,0x0D73,0x0748,0x1496,0x0556,0x1180,0x2FB2},0x800F},
{POP ,{0x1D40,0xFCB5,0xC2AE,0x1E39,0x1FC4,0x075E,0x1537,0xFB53,0x23D6,0x056C,0xF804,0x1180,0x2FB2},0x800F},
{ROCK ,{0x1D40,0xFCB5,0xC08E,0x1F8C,0x0556,0xC4D7,0x1C08,0xF6E7,0x2CAB,0x0EA5,0x4030,0x1180,0x2FB2},0x800F},
};
//*************************************************************************************************************
//store/restore register in the suspend/resume mode
BYTE RestoreRegIndex[]={
RT5621_SPK_OUT_VOL, //0x02
RT5621_HP_OUT_VOL, //0x04
RT5621_MONO_AUX_OUT_VOL, //0x06
RT5621_AUXIN_VOL, //0x08
RT5621_LINE_IN_VOL, //0x0A
RT5621_STEREO_DAC_VOL, //0x0C
RT5621_MIC_VOL, //0x0E
RT5621_MIC_ROUTING_CTRL, //0x10
RT5621_ADC_REC_GAIN, //0x12
RT5621_ADC_REC_MIXER, //0x14
RT5621_OUTPUT_MIXER_CTRL, //0x1C
RT5621_MICROPHONE_CTRL, //0x22
RT5621_AUDIO_INTERFACE, //0x34
RT5621_MISC_CTRL, //0X5E
};
#define RESTORE_REG_INDEX_NUM (sizeof(RestoreRegIndex)/sizeof(BYTE))
unsigned short int CodecShadowRegisters[RESTORE_REG_INDEX_NUM];
EXT_CODEC_INDEX RestoreExtRegIndex[]={
HW_EQ_LP0_A1, //0x00
HW_EQ_LP0_H0, //0x01
HW_EQ_BP1_A1, //0x02
HW_EQ_BP1_A2, //0x03
HW_EQ_BP1_H0, //0x04
HW_EQ_BP2_A1, //0x05
HW_EQ_BP2_A2, //0x06
HW_EQ_BP2_H0, //0x07
HW_EQ_BP3_A1, //0x08
HW_EQ_BP3_A2, //0x09
HW_EQ_BP3_H0, //0x0A
HW_EQ_BP4_A1, //0x0B
HW_EQ_HP4_H0, //0x0C
};
#define RESTORE_EXTREG_INDEX_NUM (sizeof(RestoreExtRegIndex)/sizeof(EXT_CODEC_INDEX))
unsigned short int ExtCodecShadowRegisters[RESTORE_EXTREG_INDEX_NUM];
//------------------------------------------------------------------------
// function implement
//------------------------------------------------------------------------
RT5621_Codec::RT5621_Codec(void)
{
}
RT5621_Codec::~RT5621_Codec(void)
{
}
BOOL RT5621_Codec::Init(HardwareContext *HwCxt)
{
m_pHWContext=HwCxt;
if(!m_pHWContext)
{
return FALSE;
}
m_WaveOutSampleRate=SAMPLERATE;
m_WaveInSampleRate=SAMPLERATE;
return TRUE;
}
void RT5621_Codec::DelayMSTime(unsigned int MilliSec)
{
if(m_pHWContext)
{
m_pHWContext->OSTDelayMilliSecTime(MilliSec);
}
}
//*****************************************************************************
//
//function:Initialize Register of Codec function
//
//*****************************************************************************
BOOL RT5621_Codec::InitRTCodecReg(void)
{
int i;
BOOL bRetVal=FALSE;
WriteCodecRegMask(RT5621_PWR_MANAG_ADD3,PWR_MAIN_BIAS |PWR_HP_R_OUT_VOL |PWR_HP_L_OUT_VOL //enable main bias and HP L/R AMP
,PWR_MAIN_BIAS |PWR_HP_R_OUT_VOL |PWR_HP_L_OUT_VOL);
WriteCodecRegMask(RT5621_PWR_MANAG_ADD2,PWR_VREF,PWR_VREF); //enable Vref
for(i=0;i<SET_CODEC_REG_INIT_NUM;i++)
{
bRetVal=ShadowWriteCodec( Set_Codec_Reg_Init[i].CodecIndex,Set_Codec_Reg_Init[i].wCodecValue);
if(!bRetVal)
break;
}
return bRetVal;
}
//*****************************************************************************
//
//function:Save codec register to shadow
//
//*****************************************************************************
void RT5621_Codec::SaveCodecRegToShadow()
{
int i;
for(i=0;i<RESTORE_REG_INDEX_NUM;i++)
{
if(!ShadowReadCodec(RestoreRegIndex[i],&CodecShadowRegisters[i]))
{
return;
}
}
}
//*****************************************************************************
//
//function:restore shadow register to codec
//
//*****************************************************************************
void RT5621_Codec::RestoreRegToCodec()
{
int i;
for(i=0;i<RESTORE_REG_INDEX_NUM;i++)
{
if(!ShadowWriteCodec(RestoreRegIndex[i],CodecShadowRegisters[i]))
{
return;
}
}
}
//*****************************************************************************
//
//function:Save codec extend register to shadow
//
//*****************************************************************************
void RT5621_Codec::SaveCodecExtRegToShadow()
{
int i;
for(i=0;i<RESTORE_EXTREG_INDEX_NUM;i++)
{
if(!ReadCodecAdvance(RestoreExtRegIndex[i],&ExtCodecShadowRegisters[i]))
{
return;
}
}
}
//*****************************************************************************
//
//function:restore shadow extend register to codec
//
//*****************************************************************************
void RT5621_Codec::ReStoreExtRegToCodec()
{
int i;
for(i=0;i<RESTORE_EXTREG_INDEX_NUM;i++)
{
if(!WriteCodecAdvance(RestoreExtRegIndex[i],ExtCodecShadowRegisters[i]))
{
return;
}
}
}
//*****************************************************************************
//
//function:shadow read register from codec or shadow memory
//
//*****************************************************************************
BOOL RT5621_Codec::ShadowReadCodec(BYTE Offset, unsigned short int *Data)
{
BOOL b_retVal;
if(!m_pHWContext)
{
return FALSE;
}
b_retVal=m_pHWContext->SafeReadCodec(Offset,Data,CodecDevId);
//if you use shadow method,please add code to this
return b_retVal;
}
//*****************************************************************************
//
//function:restore shadow write register to codec or shadow memory
//
//*****************************************************************************
BOOL RT5621_Codec::ShadowWriteCodec(BYTE Offset, unsigned short int Data)
{
BOOL b_retVal;
if(!m_pHWContext)
{
return FALSE;
}
//if you use shadow method,please add code to this and mark below line
b_retVal=m_pHWContext->SafeWriteCodec(Offset,Data ,CodecDevId);
return b_retVal;
}
//*****************************************************************************
//
//function:write codec register with mask
//
//*****************************************************************************
BOOL RT5621_Codec::WriteCodecRegMask(BYTE Offset, unsigned short int Data,unsigned short int Mask)
{
BOOL RetVal=FALSE;
unsigned short int CodecData;
if(!Mask)
return RetVal;
if(Mask!=ALL_FIELD)
{
if(ShadowReadCodec(Offset,&CodecData))
{
CodecData&=~Mask;
CodecData|=(Data&Mask);
RetVal=ShadowWriteCodec(Offset,CodecData);
}
}
else
{
RetVal=ShadowWriteCodec(Offset,Data);
}
return RetVal;
}
//*****************************************************************************
//
//function:Write advance register of codec
//
//*****************************************************************************
BOOL RT5621_Codec::WriteCodecAdvance(EXT_CODEC_INDEX Ext_Index,unsigned short int Ext_Data)
{
BOOL RetVal=FALSE;
RetVal=ShadowWriteCodec(RT5621_HID_CTRL_INDEX,Ext_Index); // write codec advance index
if(RetVal)
{
RetVal=ShadowWriteCodec(RT5621_HID_CTRL_DATA,Ext_Data);//write codec advance data
}
return RetVal;
}
//*****************************************************************************
//
//function:Read advance register of codec
//
//*****************************************************************************
BOOL RT5621_Codec::ReadCodecAdvance(EXT_CODEC_INDEX Ext_Index,unsigned short int *Data)
{
BOOL RetVal=FALSE;
RetVal=ShadowWriteCodec(RT5621_HID_CTRL_INDEX,Ext_Index); // write codec advance index
if(RetVal)
{
RetVal=ShadowReadCodec(RT5621_HID_CTRL_DATA,Data); // read codec advance data
}
return RetVal;
}
//*****************************************************************************
//
//function:Write advance register of codec compare with Mask bit
//
//*****************************************************************************
BOOL RT5621_Codec::WriteCodecAdvanceMask(EXT_CODEC_INDEX Ext_Index,unsigned short int Ext_Data,unsigned short int Ext_Data_Mask)
{
unsigned short int CodecAdvData;
BOOL RetVal=FALSE;
if(!Ext_Data_Mask)
return RetVal;
if(Ext_Data_Mask!=ALL_FIELD)
{
if(ReadCodecAdvance(Ext_Index,&CodecAdvData))
{
CodecAdvData&=~Ext_Data_Mask;
CodecAdvData|=(Ext_Data&Ext_Data_Mask);
RetVal=WriteCodecAdvance(Ext_Index,CodecAdvData);
}
}
else
{
RetVal=WriteCodecAdvance(Ext_Index,Ext_Data);
}
return RetVal;
}
//*****************************************************************************
//
//Function:Enable/Disable Main Spatial function
//
//*****************************************************************************
BOOL RT5621_Codec::Enable_Main_Spatial(BOOL Enable_Main_Spatial)
{
BOOL bRetVal=FALSE;
if(Enable_Main_Spatial)
{
//Enable Main Spatial
bRetVal=WriteCodecRegMask(RT5621_PSEDUEO_SPATIAL_CTRL,SPATIAL_CTRL_EN,SPATIAL_CTRL_EN);
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -