📄 audcodec.c
字号:
#include <comsub.h>
#include "audio.h"
#include "m3323reg.h"
/* 30121-18ho : Add ConfigACLKGEN() */
#include "audcodec.h"
#include "aprc25c.h"
#include <gpio.h>
#include <xgpio.h>
#include <platform.h>
//#include "m6311drv.h"
#define _USE_INTERNAL_PLL_
#define _I2S_MODE_DAC_
#undef DRV_PRINTF_ENA
//Total-Disable PRINTF
#ifndef DRV_PRINTF_ENA
#define PRINTF(...)
#endif
#define EDPRINTF(...)
tEndCondition ConfigACLKGEN(tSampFreq fs);
tEndCondition ConfigIECOutput(void);
tSampFreq LastSampFreq = C_INVALID_FS;
/* 30121-18ho : Add ConfigACLKGEN() */
extern BOOL IEC96KEN;
extern BOOL CSSDisk;
BOOL HighDec = FALSE;
/* 30609-00Michael : Add for DVD-Audio 192K */
BOOL DVDA192KEN = FALSE;
//31204-hope : Add For DAC Programming Flag to avoid double-config DAC
BOOL DAC192OK = FALSE;
BOOL DAC96OK = FALSE;
BOOL DAC48OK = FALSE;
/* 30121-19ho : Add initaudiodac() */
void initaudiodac(void);
/* iectable[DVDA192KEN][IEC96KEN][HighDec] */
WORD iectable[2][2][2] = { {{1,1},{1,2}},
{{1,1},{1,2}}};
static BYTE CDDADeemphasis = 0;
void SetCDDADeemphasis(BYTE deemphasis);
/*----------------------------------------------------------------------
* Function_Name: Set_GPIO_Mute
*
* Description: Short audio amplifier output to ground
*
* Arguments:
* BOOL fGPIOMute : TRUE Mute;
* FLASE disable Mute
*
* Return Value: void
*----------------------------------------------------------------------*/
void Set_GPIO_Mute(BOOL fGPIOMute)
{
#if 1 //for NO-LATCH-GPIO
SET_GPIO_W(AUDIO_MUTE);
if (fGPIOMute)/* mute */
{
SET_GPIO_HI(AUDIO_MUTE);
}
else
{
SET_GPIO_LOW(AUDIO_MUTE);
}
#else
SET_GPIO_W(AUDIO_MUTE);
if (fGPIOMute)/* mute */
#if (_OP_MUTE_ACTIVE_LEVEL == _GPIO_MUTE_HI_ACTIVE_)
{
SET_GPIO_HI(AUDIO_MUTE);
}
else
{
SET_GPIO_LOW(AUDIO_MUTE);
}
#else
{
#if (_MODEL != LG_BASIC)
SET_GPIO_LOW(AUDIO_MUTE);
#else
//20031106 Hope Add For LG_BASIC Model Low Mute.
SET_GPIO_LOW(AUDIO_MUTE);
#endif
}
else
{
SET_GPIO_HI(AUDIO_MUTE);
}
#endif
#endif
}
/* 30121-19ho : Add initaudiodac() */
/*------------------------------------------------------------------------
* Func. Name : initaudiodac()
* Description : Initialize audio dac parameter
* Arguments : none
* Return Value : none
*------------------------------------------------------------------------*/
void initaudiodac(void)
{
//You could program audio dac parameter here
//WriteExternalDAC(0x09, 0x00, SCI_ML0);
}
/* 30121-20ho : (BEGIN) Add 256fs Support */
/*------------------------------------------------------------------------
* Func. Name : ConfigAudioPLL()
* Description : config hardware according to the Setup Menu
* Arguments : none
* Return Value : none
*------------------------------------------------------------------------*/
BOOL ConfigAudioPLL(tSampFreq fs)
{
#ifdef _USE_INTERNAL_PLL_
BOOL ret_val;
WORD M, N, K;
WORD param1;
BYTE param2;
BYTE param3, L;
//40106-hope :: add for avoid redudant programming of 0x08 reg
BYTE REG08;
BYTE WaitFlag = FALSE;//040331-01tom_yang ForWaitingTime config
#ifdef _DEBUG_PRINTF_
//PRINTF("AUDIO: ConfigAudioPLL() Begin.\n");
#endif
ret_val = TRUE;
//40106-hope :: add for avoid redudant programming of 0x08 reg
REG08 = GetM3323BYTE(0x08);
REG08 = REG08 & 0xfe;
/* This function would be customized for individual customer */
/* 30331-01ho : (BEGIN) Improve Audio PLL Setting to get a more accurate Fs */
switch (fs)
{
case C_8K:
case C_16K:
case C_32K:
case C_64K:
case C_128K:
if (_AudioDAC_MCLK == AudioDAC_MCLK_384fs )
{
M = 142; /* 64kHz * 384 */
N = 253;
K = 22;
L = 0;
}
else
{ //AudioDAC_MCLK_256fs
M = 142;
N = 253;
K = 25;
L = 0;
}
/* 30130-31ho : Add APRC dm(Fs) Initialization depends on Fs of AP */
if (M3323AudioMemWrite(APRC_DSP, DMX, APRC_Fs_Adr, 0x0000) == TimeOut)
return (TimeOut);
break;
case C_11K:
case C_22K:
case C_44K:
case C_88K:
case C_176K:
if (_AudioDAC_MCLK == AudioDAC_MCLK_384fs )
{
M = 25; /* 88.2kHz * 384 */
N = 190;
K = 4;
L = 1;
}
else
{ //AudioDAC_MCLK_256fs
M = 25;
N = 190;
K = 6;
L = 1;
}
/* 30130-31ho : Add APRC dm(Fs) Initialization depends on Fs of AP */
if (M3323AudioMemWrite(APRC_DSP, DMX, APRC_Fs_Adr, 0x0001) == TimeOut)
return (TimeOut);
break;
case C_12K:
case C_24K:
case C_48K:
case C_96K:
case C_192K:
if (_AudioDAC_MCLK == AudioDAC_MCLK_384fs )
{
M = 142; /* 96kHz * 384 */
N = 253;
K = 20;
L = 0;
}
else
{ //AudioDAC_MCLK_256fs
M = 142;
N = 253;
K = 22;
L = 0;
}
/* 30130-31ho : Add APRC dm(Fs) Initialization depends on Fs of AP */
if (M3323AudioMemWrite(APRC_DSP, DMX, APRC_Fs_Adr, 0x0002) == TimeOut)
return (TimeOut);
break;
default:
/* 30218-60ho : Add Default Audio PLL Setting For the default mode */
if (_AudioDAC_MCLK == AudioDAC_MCLK_384fs )
{
M = 142; /* 96kHz * 384 */
N = 253;
K = 20;
L = 0;
}
else
{ //AudioDAC_MCLK_256fs
M = 142;
N = 253;
K = 22;
L = 0;
}
#ifdef _DEBUG_PRINTF_
//PRINTF("AUDIO: Invalid Sampling Frequency for PLL Setting.\n");
#endif
ret_val = FALSE;
}
/* 30331-01ho : (END) Improve Audio PLL Setting to get a more accurate Fs */
param1 = (N << 8) + M;
param2 = K;
//40106-hope :: add for avoid redudant programming of 0x08 reg
param3 = REG08 | L;
SetM3323WORD(0x1E4, param1); /* Config PLL */
SetM3323BYTE(0x1E6, param2);
SetM3323BYTE(0x008, param3);
/* 30121-18ho : Add ConfigACLKGEN() */
//31218-hope : Add this Part to avoid redudant Config ACLKGEN will cause pop-noise.
if ( LastSampFreq != fs )
{
ConfigACLKGEN(fs);
LastSampFreq = fs;
WaitFlag = TRUE;//040331-01tom_yang ForWaitingTime config
}
// 31218-hope : Move From ConfigACLKGEN() to make sure IEC48K and IEC96K
ConfigIECOutput();
#if Aud_SampFreq_CHG_WaitTime_OPTION == Aud_SampFreq_CHG_WaitTime_ENABLE
if((WaitFlag == TRUE))//040331-01tom_yang ForWaitingTime config
{
EPRINTF("AUDIO samp freq diff,start\n");
dly_tsk(WaitingTime * 500);//040331-01tom_yang ForWaitingTime config
EPRINTF("AUDIO samp freq diff,end\n");
WaitFlag = FALSE;
}
#endif
#ifdef _DEBUG_PRINTF_
//PRINTF("AUDIO: ConfigAudioPLL() End.\n");
#endif
#endif
return (ret_val);
}
/* 30121-20ho : (END) Add 256fs Support */
/* 30121-18ho : (BEGIN) Add ConfigACLKGEN() */
/*------------------------------------------------------------------------
* Func. Name : ConfigACLKGEN()
* Description : config hardware according to the Setup Menu
* Arguments : none
* Return Value : none
*------------------------------------------------------------------------*/
tEndCondition ConfigACLKGEN(tSampFreq fs)
{
WORD param1, param2;
WORD xclksel, dacmclksel, dacdspll, dacstsel;
/* 30316-04ho : Separate IEC Setting From ADC and DAC Setting */
// WORD iecdspll;
WORD adcdspll, adcextsel, adcintfsel;
WORD daclrclk, dacbclk, daclradv;
WORD firbit = 0;
BYTE iecfs;
#ifdef _DEBUG_PRINTF_
//PRINTF("AUDIO: ConfigACLKGEN() Begin.\n");
#endif
if (_AudioDAC_MCLK == AudioDAC_MCLK_384fs )
{
xclksel = 1;
}
else
{
xclksel = 0;
}
dacmclksel = 0;
if( _AudioDAC_TimeSlot == AudioDAC_32bit )
{
dacstsel = 2;
if(_AudioDAC_Protocol == AudioDAC_Right_Justified)
{
firbit = 8;
}
}
else if(_AudioDAC_TimeSlot == AudioDAC_16bit)
{
dacstsel = 0;
}
else //AudioDAC_24bit
{
dacstsel = 1;
}
/* 32 slot
dacstsel = 2;
*/
if(_AudioDAC_Protocol == AudioDAC_I2S )
{
daclrclk = 0;
dacbclk = 0;
daclradv = 0;
}
else if(_AudioDAC_Protocol == AudioDAC_Right_Justified)
{
daclrclk = 1;
dacbclk = 0;
daclradv = 1;
}
else //AudioDAC_Left_Justified
{
daclrclk = 1;
dacbclk = 0;
daclradv = 1;
}
iecfs = GetM3323BYTE(0x1EF);
iecfs = iecfs & 0xf0;
// iecdspll = 1;
switch (fs)
{
/* /2 */
case C_8K:
M3323AudioMemWrite(APRC_DSP, DMX, APRC_PlayTime_Adr , 4000);
M3323AudioMemWrite(APRC_DSP, DMX, APRC_Fs_Adr , 0x0000);
dacdspll = 3;
HighDec = FALSE;
DVDA192KEN = FALSE;
iecfs = iecfs | 0x0C;
break;
case C_11K:
M3323AudioMemWrite(APRC_DSP, DMX, APRC_PlayTime_Adr , 5513);
M3323AudioMemWrite(APRC_DSP, DMX, APRC_Fs_Adr , 0x0001);
dacdspll = 3;
HighDec = FALSE;
DVDA192KEN = FALSE;
iecfs = iecfs | 0x00;
break;
case C_12K:
M3323AudioMemWrite(APRC_DSP, DMX, APRC_PlayTime_Adr , 6000);
M3323AudioMemWrite(APRC_DSP, DMX, APRC_Fs_Adr , 0x0002);
dacdspll = 3;
HighDec = FALSE;
DVDA192KEN = FALSE;
iecfs = iecfs | 0x04;
break;
/* /2 */
case C_16K:
M3323AudioMemWrite(APRC_DSP, DMX, APRC_PlayTime_Adr , 8000);
M3323AudioMemWrite(APRC_DSP, DMX, APRC_Fs_Adr , 0x0000);
dacdspll = 2;
HighDec = FALSE;
DVDA192KEN = FALSE;
iecfs = iecfs | 0x0C;
break;
case C_22K:
M3323AudioMemWrite(APRC_DSP, DMX, APRC_PlayTime_Adr , 11025);
M3323AudioMemWrite(APRC_DSP, DMX, APRC_Fs_Adr , 0x0001);
dacdspll = 2;
HighDec = FALSE;
DVDA192KEN = FALSE;
iecfs = iecfs | 0x02;
break;
case C_24K:
M3323AudioMemWrite(APRC_DSP, DMX, APRC_PlayTime_Adr , 12000);
M3323AudioMemWrite(APRC_DSP, DMX, APRC_Fs_Adr , 0x0002);
dacdspll = 2;
HighDec = FALSE;
DVDA192KEN = FALSE;
iecfs = iecfs | 0x06;
break;
/* /2 */
case C_32K:
M3323AudioMemWrite(APRC_DSP, DMX, APRC_PlayTime_Adr , 16000);
M3323AudioMemWrite(APRC_DSP, DMX, APRC_Fs_Adr , 0x0000);
dacdspll = 1;
HighDec = FALSE;
DVDA192KEN = FALSE;
iecfs = iecfs | 0x0C;
break;
case C_44K:
M3323AudioMemWrite(APRC_DSP, DMX, APRC_PlayTime_Adr , 22050);
M3323AudioMemWrite(APRC_DSP, DMX, APRC_Fs_Adr , 0x0001);
dacdspll = 1;
HighDec = FALSE;
DVDA192KEN = FALSE;
iecfs = iecfs | 0x00;
break;
case C_48K:
M3323AudioMemWrite(APRC_DSP, DMX, APRC_PlayTime_Adr , 24000);
M3323AudioMemWrite(APRC_DSP, DMX, APRC_Fs_Adr , 0x0002);
dacdspll = 1;
HighDec = FALSE;
DVDA192KEN = FALSE;
iecfs = iecfs | 0x04;
break;
/* /4 */
case C_64K:
M3323AudioMemWrite(APRC_DSP, DMX, APRC_PlayTime_Adr , 16000);
M3323AudioMemWrite(APRC_DSP, DMX, APRC_Fs_Adr , 0x0000);
dacdspll = 0;
HighDec = TRUE;
DVDA192KEN = FALSE;
iecfs = iecfs | 0x0C;
break;
case C_88K:
M3323AudioMemWrite(APRC_DSP, DMX, APRC_PlayTime_Adr , 22050);
M3323AudioMemWrite(APRC_DSP, DMX, APRC_Fs_Adr , 0x0001);
dacdspll = 0;
HighDec = TRUE;
DVDA192KEN = FALSE;
iecfs = iecfs | 0x01;
break;
case C_96K:
M3323AudioMemWrite(APRC_DSP, DMX, APRC_PlayTime_Adr , 24000);
M3323AudioMemWrite(APRC_DSP, DMX, APRC_Fs_Adr , 0x0002);
dacdspll = 0;
HighDec = TRUE;
DVDA192KEN = FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -