📄 audio_api1.c
字号:
/*===============================================================
* Variables and API functions about Audio process
*==============================================================*/
//#ifdef SGTV58xy_AUDIOPRO
#include "tvapi.h"
#include "audio_api.h"
#include "xI2c.h"
#define UserPrefFactory_ExternSyncDelay 0//zenghw add for temp P001 20061108
//#define UserPrefAudioEffect 1 //zenghw P001
#define ZHW_DEBUG_SGTV_MSG
#define SGTV_SUPPORT_SRS
#define SUPPORT_NICAM
//#define _OLD_CHIP_
#define Balance_Min 0
#define Balance_Mid 50
#define Balance_Max 100
#define Default_DAC1_Volume 0xffff
typedef struct
{
WORD wClkrstClock; // clkrst_clock register value
WORD wI2SSCtrl; // I2SS_Ctrl register value
WORD wI2SAInCtrl; // I2SAin control register value
WORD wI2SAOutCtrl; // I2SAOut control register value
WORD wAnaCtrlPower; // Analog Power Control
WORD wGEQ0; // Default GEQ settings
WORD wGEQ1;
WORD wGEQ2;
WORD wGEQ3;
WORD wGEQ4;
WORD wBassManagement; // Bass Management Settings
WORD wToneGeneratorVolume; // Tone Generator Volume
WORD wToneGeneratorFreq; // Tone Generator Frequency
WORD wWOWHDConfig;
// Prescalers - TODO
WORD wSyncDelay; //
WORD wDEMOD_AGC_GainValue;
WORD wDEMOD_Num_ASD_Iterations;
WORD wDEMOD_Supported_Stds;
WORD wDEMOD_AutomuteNoiseLevel;
} SSGTV58xxDeviceConfig;
// matt here - add initialization data
static SSGTV58xxDeviceConfig s_DeviceConfig =
{
// configuration default for device - set for validation board
// ClkrstClock
SGTV58XX_CLKRST_CLOCK__MCKDIR__OUTPUT_VALUE | // master clock going out
SGTV58XX_CLKRST_CLOCK__MCLKOUT_DISABLE__ENABLE_VALUE | // master clock enabled
SGTV58XX_CLKRST_CLOCK__MCLKFREQ__128FS_VALUE | // 128 FS
SGTV58XX_CLKRST_CLOCK__SAMPLE_RATE__48KHZ_VALUE, // 48 kHz
// I2SS_ctrl register value
SGTV58XX_I2SS_CTRL__DOUT1_LEN__24_BITS_VALUE | // all dout and din set to 24 bits
SGTV58XX_I2SS_CTRL__DOUT0_LEN__24_BITS_VALUE |
SGTV58XX_I2SS_CTRL__DIN1_LEN__24_BITS_VALUE |
SGTV58XX_I2SS_CTRL__DIN0_LEN__24_BITS_VALUE |
SGTV58XX_I2SS_CTRL__SCLKFREQ__64_FS_VALUE | // 64 FS
SGTV58XX_I2SS_CTRL__MS__MASTER_VALUE | // La Grange has master clock
SGTV58XX_I2SS_CTRL__LRALIGN__I2S_VALUE | // use I2S Format, instead of left-justified
SGTV58XX_I2SS_CTRL__LRPOL__LEFT_0_VALUE, // set polarity to 0=Left and 1=right
// I2SAInCtrl register value
SGTV58XX_I2SAIN_CTRL__DINLEN__24_BITS_VALUE | // Data length = 24bits
SGTV58XX_I2SAIN_CTRL__LRALIGN__I2S_VALUE |
SGTV58XX_I2SAIN_CTRL__LRPOL__LEFT_0_VALUE |
SGTV58XX_I2SAIN_CTRL__SYNC__ASYNC_VALUE, // Asynchronous mode used
// I2SAOutCtrl register value
SGTV58XX_I2SAOUT_CTRL__AVNTSCF__60_HZ_VALUE |
SGTV58XX_I2SAOUT_CTRL__AVF__AUTO_FREQ_VALUE |
SGTV58XX_I2SAOUT_CTRL__AVEN__ENABLE_VALUE |
SGTV58XX_I2SAOUT_CTRL__FS__48_KHZ_VALUE |
SGTV58XX_I2SAOUT_CTRL__DLEN__24_BIT_VALUE |
SGTV58XX_I2SAOUT_CTRL__SCLK_FREQ__64_FS_VALUE |
SGTV58XX_I2SAOUT_CTRL__MS__MASTER |
SGTV58XX_I2SAOUT_CTRL__LR_ALIGN__I2S_VALUE |
SGTV58XX_I2SAOUT_CTRL__LR_POL__LEFT_0_ |
SGTV58XX_I2SAOUT_CTRL__SYNC__ASYNC_MODE_VALUE,
// Analog Power Control
SGTV58XX_ANA_CTRL_PWD_CNTRL__PORTS_PWD__UP_VALUE | // All ports powered up
SGTV58XX_ANA_CTRL_PWD_CNTRL__AOUT2_PWD__ON_VALUE | // Analog out 2 - powered down - not using in this example
SGTV58XX_ANA_CTRL_PWD_CNTRL__AOUT1_PWD__ON_VALUE | // Analog out 1 - powered up
SGTV58XX_ANA_CTRL_PWD_CNTRL__AOUT0_PWD__ON_VALUE | // Analog out 0 - powered up
SGTV58XX_ANA_CTRL_PWD_CNTRL__D3_PWD__NORMAL_VALUE | // Analog in normal operation
SGTV58XX_ANA_CTRL_PWD_CNTRL__PLL_PWD__UP_VALUE | // PLL powered up
SGTV58XX_ANA_CTRL_PWD_CNTRL__DAC_ALL_PWD__UP_VALUE | // DAC - all powered up
SGTV58XX_ANA_CTRL_PWD_CNTRL__DAC_MONO_PWD__UP_VALUE | // DAC - mono powered up
SGTV58XX_ANA_CTRL_PWD_CNTRL__DAC1_PWD__UP_VALUE | // DAC 1 powered up
SGTV58XX_ANA_CTRL_PWD_CNTRL__DAC0_PWD__UP_VALUE | // DAC 2 powered up
SGTV58XX_ANA_CTRL_PWD_CNTRL__DAC_MAIN_PWD__UP_VALUE | // DAC - main powered up
SGTV58XX_ANA_CTRL_PWD_CNTRL__DAC_HP_PWD__UP_VALUE | // DAC - headphone powered up
SGTV58XX_ANA_CTRL_PWD_CNTRL__ADC_PWD__UP_VALUE | // ADC - powered up
SGTV58XX_ANA_CTRL_PWD_CNTRL__XTAL_PWD__NORMAL_VALUE, // XTAL Normal operation
// DAP settings - GEQ0
SGTV58XX_DAP_GEQ__0_DB_VALUE,
// DAP settings - GEQ1
SGTV58XX_DAP_GEQ__0_DB_VALUE,
// DAP settings - GEQ2
SGTV58XX_DAP_GEQ__0_DB_VALUE,
// DAP settings - GEQ3
SGTV58XX_DAP_GEQ__0_DB_VALUE,
// DAP settings - GEQ4
SGTV58XX_DAP_GEQ__0_DB_VALUE,
// Bass Management settings
SGTV58XX_DAP_DAC_BM__HPF_DISABLE__ENABLE_VALUE | // Enable HPF
SGTV58XX_DAP_DAC_BM__CUTOFF__100_HZ_VALUE | // 100 Hz Cutoff Value
SGTV58XX_DAP_DAC_BM__ENABLE__ENABLE, // Enable the Bass Management Block
// Tone Generator - Volume
SGTV58XX_TG_VOLUME__VOLUME__0_DB_VALUE, // 0 DB Volume level
// Tone Generator - Frequency
SGTV58XX_TG_FREQ__FREQUENCY__12000_HZ_VALUE, // 12000 Hz Value
// SRS WOWHD Config
SGTV58XX_DAP_WOWHD__SRS_HIGH_BIT_RATE__ON_VALUE | // Use the SRS High Bit Rate
SGTV58XX_DAP_WOWHD__SPEAKER_SIZE__60_HZ_VALUE | // speaker size is 60 Hz
SGTV58XX_DAP_WOWHD__LIMITER_EN__OFF_VALUE | // limiter is disabled
SGTV58XX_DAP_WOWHD__DEFINITION_EN__ON_VALUE | // definition is enabled
SGTV58XX_DAP_WOWHD__FOCUS_EN__ON_VALUE | // focus is enabled
SGTV58XX_DAP_WOWHD__TRUBASS_BC__ON_VALUE | // trubass is on
SGTV58XX_DAP_WOWHD__SAMPLE_RATE__48_KHZ_VALUE | // sample rate is 48 kHz
SGTV58XX_DAP_WOWHD__SPEAKER__SPEAKER_MODE_VALUE | // speaker mode
SGTV58XX_DAP_WOWHD__ENABLE__WOWHD_ON_VALUE, // turn on WOWHD
// Prescalers - TODO
// Sync Delay
SGTV58XX_SYNC_DELAY_CONTROL__DELAYS__0_MS_DELAY_VALUE, // 0 ms delay - change to suit system
// DEMOD AGC setup
0xF << SGTV58XX_DEMOD_AGC_CTRL__GAIN_VALUE__STARTBIT, // set AGC gain to mid level - this needs to be characterized for each setup
// DEMOD - Number of ASD Iterations
0x00, //0x03 zenghw 20070302
// DEMOD - Supported Standards
SGTV58XX_DEMOD_SUPPORTED_STDS__BTSC_PILOT_15_625__15_734_VALUE | // use BTSC Pilot of 15.734 kHz
SGTV58XX_DEMOD_SUPPORTED_STDS__A2_BG__AUTODETECT_VALUE | // turn on to autodetect all standards
SGTV58XX_DEMOD_SUPPORTED_STDS__A2_DK_674__AUTODETECT_VALUE |
SGTV58XX_DEMOD_SUPPORTED_STDS__A2_DK_625__AUTODETECT_VALUE |
SGTV58XX_DEMOD_SUPPORTED_STDS__A2_DK_574__AUTODETECT_VALUE |
SGTV58XX_DEMOD_SUPPORTED_STDS__A2_M__AUTODETECT_VALUE |
SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_BG__AUTODETECT_VALUE |
SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_I__AUTODETECT_VALUE |
SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_DK__AUTODETECT_VALUE |
SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_L__AUTODETECT_VALUE |
SGTV58XX_DEMOD_SUPPORTED_STDS__EIAJ__AUTODETECT_VALUE |
SGTV58XX_DEMOD_SUPPORTED_STDS__BTSC__AUTODETECT_VALUE,
// DEMOD Automute Noise Level
SGTV58XX_DEMOD_ASD_CTRL__AUTOMUTE_NOISE_LEVEL__12_DB_SNR, // Automute noise level for startup,zenghw changed
};
typedef struct
{
BYTE ucAVNTSCF; // 0 - 59.94Hz for NTSC color; 1 - 60Hz for NTSC monochrome
BYTE ucAVF; // 00 - 50Hz(PAL/SECAM); 01 - 59.94Hz(NTSC color); 10 - 60Hz(NTSC monochrome); 11 - Auto Freq Select
BYTE ucAVEN; // 0 - A/V sync is disabled; 1 - A/V sync is enabled
BYTE ucFS; // 00 - 48kHz; 01 - 44.1kHz; 10 - 32kHz; 11 - Reserved. (active in master mode)
BYTE ucDLEN; // 0 - 24bits(only valid when SCLKFREQ = 0); 1 - 16bits
BYTE ucSCLKFREQ; // 0 - 64Fs; 1 - 32Fs
BYTE ucMS; // 0 - Slave; 1 - Master
BYTE ucLRALIGN; // 0 - Data word starts 1 I2S_SCLK delay after I2S_LRCLK transition; 1 - No delay
BYTE ucLRPOL; // 0 - I2S_LRCLK = 0 - Left, 1 - Right
BYTE ucSYNC; // 0 - asynchronous mode(SRC is used); 1 - synchronous mode
}I2SAOutConfigData;
I2SAOutConfigData g_I2SAOutConfig;
typedef struct
{
BYTE ucDINLEN;
BYTE ucLRALIGN;
BYTE ucLRPOL;
BYTE ucSYNC;
}I2SAInConfigData;
I2SAInConfigData g_I2SAInConfig;
typedef struct
{
BYTE ucDOUT1LEN; // DOut1 data length: 0 - 24bits; 1 - 16bits
BYTE ucDOUT0LEN;
BYTE ucDIN1LEN; // DIn1 data length: 0 - 24bits; 1 - 16bits
BYTE ucDIN0LEN;
BYTE ucSCLKFREQ; // Set frequency of I2S_SCLK when in master mode: 0 - 64Fs; 1 - 32Fs
BYTE ucMS; // Configures master or slave of I2S_LRCLK and I2S_SCLK: 0 - slave; 1 - master
BYTE ucLRALIGN; // I2S_LRCLK alignment to data word
BYTE ucLRPOL; // I2S_LRCLK ploarity when data is presented
}I2SSConfigData;
I2SSConfigData g_I2SSConfig;
BYTE ucAudioOutputTable[][4] =
{// DualA, DualB, Stereo, Mono
{0x00, 0x00, 0x00, 0x01}, // MONO
{0x00, 0x00, 0x00, 0x01}, // Zweiton mono
{0x00, 0x00, 0x02, 0x00}, // Zweiton stereo
{0x03, 0x04, 0x00, 0x00}, // Zweiton dual
{0x00, 0x00, 0x05, 0x01}, // Nicam mono
{0x00, 0x00, 0x06, 0x01}, // Nicam stereo
{0x07, 0x08, 0x00, 0x01}, // Nicam dual
{0x00, 0x00, 0x00, 0x01}, // EIAJ/BTSC Mono
{0x00, 0x00, 0x09, 0x00}, // EIAJ/BTSC stereo
{0x0a, 0x0b, 0x00, 0x00}, // EIAJ dual
};
AudioInfoData g_AudioInfo;
FactoryAudioSetting g_FactoryAudioDatas;
extern BOOL AutoSearchFlag;
extern BOOL TunerSearchFlag ; // lsz 060712
//extern AUDIO_CHANNEL_ SpeakerType[2]; //GLoudSpeakerCh = 0,GHeadPhoneCh = 1;
///////////////////////////// I2C operation functions /////////////////////////////////
void SGTV58xx_I2C_Write(WORD wReg, WORD wValue)
{
BYTE ucBuf[4];
ucBuf[0] =(BYTE) (wReg >> 8);
ucBuf[1] =(BYTE) (wReg & 0xff);
ucBuf[2] =(BYTE) (wValue >> 8);
ucBuf[3] =(BYTE) (wValue & 0xff);
// gm_Write2WireBlock(0, SGTV58XX_DEVICE_ADDR, (BYTE *)ucBuf, 4, _TRUE_);
ucIicSlave = SGTV58XX_DEVICE_ADDR;
ucIicMode=0x04;
ucIicBuffer[0] = ucBuf[0] ;
ucIicBuffer[1]=ucBuf[1];
ucIicBuffer[2]=ucBuf[2];
ucIicBuffer[3]=ucBuf[3];
IicBusIo();
}
WORD SGTV58xx_I2C_Read(WORD wReg)
{
BYTE ucAddress[2];
// BYTE ucData[2];
WORD wValue = 0;
ucAddress[0] =(BYTE) (wReg >> 8);
ucAddress[1] =(BYTE) (wReg & 0xff);
// gm_Write2WireBlock(0, SGTV58XX_DEVICE_ADDR, (BYTE *)ucAddress, 2, _FALSE_);
// gm_Read2WireBlock(0, SGTV58XX_DEVICE_ADDR, (BYTE *)ucData, 2, _TRUE_);
// wValue = (WORD)(ucData[0] << 8) | ucData[1];
ucIicSlave = SGTV58XX_DEVICE_ADDR;
ucIicBuffer[0] = ucAddress[0] ;
ucIicBuffer[1] = ucAddress[1] ;
ucIicMode = 0x22;
IicBusIo();
wValue = (((WORD)(ucIicBuffer[2])) << 8) | ucIicBuffer[3];
return wValue;
}
void SGTV58xx_I2C_MaskWrite(WORD wReg, WORD wMask, WORD wValue)
{
WORD wTemp = SGTV58xx_I2C_Read(wReg);
wTemp &= (~wMask);
wTemp |= (wValue & wMask);
SGTV58xx_I2C_Write(wReg, wTemp);
}
////////////////////////////////// Software & Hardware reset /////////////////////////////////////////////////
void SGTV58xx_HardwareReset(void)
{
#if 0
gm_ClearRegBitsWord(GPOUTPUT0, BIT4); // lsz
gm_Delay1ms( 100);
gm_SetRegBitsWord(GPOUTPUT0, BIT4); // lsz
#endif
}
void SGTV58xx_SoftReset(void)
{
#ifdef ZHW_DEBUG_SGTV_MSG
tvDebugPrint("************* SGTV Software Reset *****************\n");
#endif
SGTV58xx_I2C_Write(SGTV58XX_REG__CLKRST_RESET, SGTV58XX_CLKRST_RESET__RESET);
}
////////////////////////////////// I2SA functions ////////////////////////////////////////////
void SGTV58xx_I2SS_Config(void)
{
WORD wValue = 0;
wValue = g_I2SSConfig.ucLRPOL |
(g_I2SSConfig.ucLRALIGN << 1) |
(g_I2SSConfig.ucMS << 2) |
(g_I2SSConfig.ucSCLKFREQ << 3) |
(g_I2SSConfig.ucDIN0LEN << 4) |
(g_I2SSConfig.ucDIN1LEN << 5) |
(g_I2SSConfig.ucDOUT0LEN << 6) |
(g_I2SSConfig.ucDOUT1LEN << 7);
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__I2SS_CTRL, 0x00ff, wValue);
}
BOOL SGTV58xx_I2SAIn_DPllLocked(void)
{
if(SGTV58xx_I2C_Read(SGTV58XX_REG__I2SAIN_CTRL) & SGTV58XX_I2SAIN_CTRL__DPLL_LOCKED__GETMASK)
return _TRUE_;
return _FALSE_;
}
void SGTV58xx_I2SAIn_DPllReset(void)
{
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__I2SAIN_CTRL,
SGTV58XX_I2SAIN_CTRL__DPLL_RESET__RESET,
SGTV58XX_I2SAIN_CTRL__DPLL_RESET__RESET);
}
void SGTV58xx_I2SAIn_Config(void)
{
WORD wValue = 0;
wValue = g_I2SAInConfig.ucSYNC |
(g_I2SAInConfig.ucLRPOL << 1) |
(g_I2SAInConfig.ucLRALIGN << 2) |
(g_I2SAInConfig.ucDINLEN << 3);
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__I2SAOUT_CTRL, 0x000f, wValue);
}
BOOL SGTV58xx_I2SAOut_DPllLocked(void)
{
if(SGTV58xx_I2C_Read(SGTV58XX_REG__I2SAOUT_CTRL) & SGTV58XX_I2SAOUT_CTRL__DPLL_LOCKED__GETMASK)
return _TRUE_;
return _FALSE_;
}
void SGTV58xx_I2SAOut_DPllReset(void)
{
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__I2SAOUT_CTRL,
SGTV58XX_I2SAOUT_CTRL__DPLL_RESET__RESET,
SGTV58XX_I2SAOUT_CTRL__DPLL_RESET__RESET);
}
void SGTV58xx_I2SAOut_Config(void)
{
WORD wValue = 0;
g_I2SAOutConfig.ucSYNC = 0;
g_I2SAOutConfig.ucLRPOL = 0;
g_I2SAOutConfig.ucLRALIGN = 0;
g_I2SAOutConfig.ucMS = 1;
g_I2SAOutConfig.ucSCLKFREQ = 0;
g_I2SAOutConfig.ucDLEN = 0;
g_I2SAOutConfig.ucFS = 0x00;
g_I2SAOutConfig.ucAVEN = 0;
g_I2SAOutConfig.ucAVF = 0x11;
g_I2SAOutConfig.ucAVNTSCF = 1;
wValue = g_I2SAOutConfig.ucSYNC |
(g_I2SAOutConfig.ucLRPOL << 1) |
(g_I2SAOutConfig.ucLRALIGN << 2) |
(g_I2SAOutConfig.ucMS << 3) |
(g_I2SAOutConfig.ucSCLKFREQ << 4) |
(g_I2SAOutConfig.ucDLEN << 5) |
(g_I2SAOutConfig.ucFS << 6) |
(((WORD)(g_I2SAOutConfig.ucAVEN)) << 8) |
(((WORD)(g_I2SAOutConfig.ucAVF)) << 9) |
(((WORD)(g_I2SAOutConfig.ucAVNTSCF)) << 11);
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__I2SAOUT_CTRL, 0x0fff, (wValue | SGTV58XX_I2SAOUT_CTRL__DPLL_RESET__RESET));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -