📄 audio_api.c
字号:
/*===============================================================
* Variables and API functions about Audio process
*==============================================================*/
//#ifdef SGTV58xy_AUDIOPRO
#include "main/aGlobal.h"
#ifdef uI_NUCLEUS
#include "nucleus.h"
#include "Tc_defs.h"
#endif
#include "sd_defs.h"
#include "sd_extr.h"
#include "main/uItron/uI_types.h"
#include "main/uItron/uI_setm.h"
#include "main/uItron/uI_nplus.h"
#include "main/aInit.h"
#include "Driver.h"
#include "Driver/common/aDrvTsk.h"
#include "Driver/Uart/dUart.h"
#include "Driver/Uart/dUartA.h"
#include "Driver/Uart/dUartB.h"
#include "aLogTsk.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dsgtv58xy.h"
#include "Image/Detect/sPort.h"
#include "Image/Detect/sDetect.h"
#include "ssgtv58xy.h"
#include "audio_api.h"
#define UserPrefFactory_ExternSyncDelay 0//zenghw add for temp P001 20061108
//#define UserPrefAudioEffect 1 //zenghw P001
#define SGTV_SUPPORT_SRS
#define SUPPORT_NICAM
//#define _OLD_CHIP_
typedef struct
{
UWORD32 wClkrstClock; // clkrst_clock register value
UWORD32 wI2SSCtrl; // I2SS_Ctrl register value
UWORD32 wI2SAInCtrl; // I2SAin control register value
UWORD32 wI2SAOutCtrl; // I2SAOut control register value
UWORD32 wAnaCtrlPower; // Analog Power Control
UWORD32 wGEQ0; // Default GEQ settings
UWORD32 wGEQ1;
UWORD32 wGEQ2;
UWORD32 wGEQ3;
UWORD32 wGEQ4;
UWORD32 wBassManagement; // Bass Management Settings
UWORD32 wToneGeneratorVolume; // Tone Generator Volume
UWORD32 wToneGeneratorFreq; // Tone Generator Frequency
UWORD32 wWOWHDConfig;
// Prescalers - TODO
UWORD32 wSyncDelay; //
UWORD32 wDEMOD_AGC_GainValue;
UWORD32 wDEMOD_Num_ASD_Iterations;
UWORD32 wDEMOD_Supported_Stds;
UWORD32 wDEMOD_AutomuteNoiseLevel;
} SSGTV58xxDeviceConfig;
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 UWORD32 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 UWORD32
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(UWORD32 wReg, UWORD32 wValue)
{
byWriteSingleDatasgtv58xy(wReg, wValue);
}
UWORD32 SGTV58xx_I2C_Read(UWORD32 wReg)
{
UWORD32 wValue;
byReadSingleDatasgtv58xy(wReg, &wValue);
return wValue;
}
void SGTV58xx_I2C_MaskWrite(UWORD32 wReg, UWORD32 wMask, UWORD32 wValue)
{
UWORD32 wTemp = SGTV58xx_I2C_Read(wReg);
wTemp &= (~wMask);
wTemp |= (wValue & wMask);
SGTV58xx_I2C_Write(wReg, wTemp);
}
void SGTV58xx_SoftReset(void)
{
SGTV58xx_I2C_Write(SGTV58XX_REG__CLKRST_RESET, SGTV58XX_CLKRST_RESET__RESET);
}
////////////////////////////////// I2SA functions ////////////////////////////////////////////
void SGTV58xx_I2SS_Config(void)
{
UWORD32 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)
{
UWORD32 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)
{
UWORD32 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) |
(((UWORD32)(g_I2SAOutConfig.ucAVEN)) << 8) |
(((UWORD32)(g_I2SAOutConfig.ucAVF)) << 9) |
(((UWORD32)(g_I2SAOutConfig.ucAVNTSCF)) << 11);
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__I2SAOUT_CTRL, 0x0fff, (wValue | SGTV58XX_I2SAOUT_CTRL__DPLL_RESET__RESET));
SGTV58xx_I2SAIn_DPllReset();
}
////////////////////////////////// Initialize /////////////////////////////////////////////////
void SGTV58xx_Initialize(void)
{
UWORD32 wTemp;
PRINTF("************* SGTV start initialized *****************\n");
SGTV58xx_SoftReset();
// 1) Clock setup
SGTV58xx_I2C_Write(SGTV58XX_REG__CLKRST_CLOCK, 0xc1);//s_DeviceConfig.wClkrstClock//default value
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__I2SS_CTRL, SGTV58XX_I2SS_CTRL__MS__MASTER_VALUE, SGTV58XX_I2SS_CTRL__MS__MASTER_VALUE);
// 3a) Analog power
SGTV58xx_I2C_Write(SGTV58XX_REG__ANA_CTRL_PWD_CNTRL, 0x00);//all power up
// 3b) DEMOD power
SGTV58xx_I2C_Write(SGTV58XX_REG__DEMOD_ANA_CTRL_1, 0x00);//enable SIF0, and power up
}
////////////////////////////////// Demodulator /////////////////////////////////////////////
void SGTV58xx_AGC_Disable(BOOL bDisable)
{
UWORD32 wTemp;
if(bDisable)
{
wTemp = g_FactoryAudioDatas.ucGain4NicamL << 1; // set Gain value for AM signals(L)
wTemp |= SGTV58XX_DEMOD_AGC_CTRL__AGC_EN__USE_GAIN_VALUE;
}
else
{
wTemp = 0x22; // Set Gain value for FM signals(unused),AGC enabled
wTemp |= SGTV58XX_DEMOD_AGC_CTRL__AGC_EN__USE_AGC_VALUE;
}
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__DEMOD_AGC_CTRL,
(SGTV58XX_DEMOD_AGC_CTRL__AGC_EN__GETMASK | SGTV58XX_DEMOD_AGC_CTRL__GAIN_VALUE__GETMASK),
wTemp);
}
void SGTV58xx_L_DK_SelectL(BOOL bSelectNicamL)
{
UWORD32 wTemp = 0;
wTemp = SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_L_DK_SEL__NICAM_DK_VALUE
| SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_DK__AUTODETECT_VALUE
| SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_L__NO_AUTODETECT_VALUE;
if(bSelectNicamL)
wTemp = SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_L_DK_SEL__NICAM_L_VALUE
| SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_DK__NO_AUTODETECT_VALUE
| SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_L__AUTODETECT_VALUE;
SGTV58xx_I2C_MaskWrite( SGTV58XX_REG__DEMOD_SUPPORTED_STDS,
( SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_L_DK_SEL__GETMASK
| SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_DK__GETMASK
| SGTV58XX_DEMOD_SUPPORTED_STDS__NICAM_L__GETMASK),
wTemp);
}
void SGTV58xx_ASD_SupportSTD(UWORD32 wStandard)
{
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__DEMOD_DEMOD_CTRL, 0x0008, 0x0008); //zenghw add bit3
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__DEMOD_SUPPORTED_STDS, 0x0ffe,wStandard); //zenghw changed
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__DEMOD_DEMOD_CTRL, 0x0008, 0x0000); //zenghw add bit3
}
// M2k60712 with LSZ {
BOOL SGTV58xx_ASD_IS_SupportSTD(void) // lsz 060707
{
UWORD32 Temp;
Temp= SGTV58xx_I2C_Read(SGTV58XX_REG__DEMOD_SUPPORTED_STDS);
Temp&=SGTV58XX_DEMOD_SUPPORTED_STDS__UNSUPPORTED;
if(Temp)
{
return _FALSE_;
}
else
return _TRUE_ ;
}
// M2k60712 with LSZ }
void SGTV58xx_ASD_Enable(void)
{
UWORD32 wTemp = 0;
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__DEMOD_DEMOD_CTRL, 0x0008, 0x0008); //zenghw add bit3
wTemp = SGTV58XX_DEMOD_ASD_CTRL__ASD_DISABLE__ENABLE_VALUE
| SGTV58XX_DEMOD_ASD_CTRL__AUTOMUTE_NOISE_LEVEL__6_DB_SNR
| SGTV58XX_DEMOD_ASD_CTRL__DISABLE_AUTOMUTE__ENABLE_VALUE
| SGTV58XX_DEMOD_ASD_CTRL__CHANNEL_CHANGE__CHANGE_CHANNEL_VALUE
| SGTV58XX_DEMOD_ASD_CTRL__STANDARD__SEARCHING_FOR_STANDARD_VALUE;
SGTV58xx_I2C_Write(SGTV58XX_REG__DEMOD_ASD_CTRL, wTemp);
// //4Tenny at 2k70120 {: Disable continue ASD if not searching state
wTemp = 0;
//if(!g_Tuner1Data.ucTunerStep) //zenghw 20070402 //weifer debug
wTemp = SGTV58XX_DEMOD_DEMOD_CTRL__DISABLE_CONT_ASD;
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__DEMOD_DEMOD_CTRL,
SGTV58XX_DEMOD_DEMOD_CTRL__DISABLE_CONT_ASD,
wTemp);
// //4Tenny at 2k70120 }
}
void SGTV58xx_StandardForcedTo(ESGTV58xxStandard eStandard)
{
UWORD32 wTemp;
SGTV58xx_L_DK_SelectL(eStandard == Standard_NICAM_L);
SGTV58xx_AGC_Disable(eStandard == Standard_NICAM_L);
#if 0 //zenghw add for temp
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__DEMOD_DEMOD_CTRL, //zenghw add
SGTV58XX_DEMOD_DEMOD_CTRL__DISABLE_CONT_ASD,
SGTV58XX_DEMOD_DEMOD_CTRL__DISABLE_CONT_ASD);
#endif
// now force the standard
wTemp = SGTV58xx_I2C_Read(SGTV58XX_REG__DEMOD_ASD_CTRL);
// clear auto-detect and disable it
#if 0 //zenghw changed because we do not have auto detect in menu
wTemp &= SGTV58XX_DEMOD_ASD_CTRL__ASD_DISABLE__CLEARMASK;
// if(UserPrefSoundSystem !=0 ) //lsz 060704
if(g_AudioInfo.ucUserPreSelect!=0 ) //lsz 060704 zenghw change temp p001
wTemp |= SGTV58XX_DEMOD_ASD_CTRL__ASD_DISABLE__DISABLE_VALUE;
#else
wTemp |= SGTV58XX_DEMOD_ASD_CTRL__ASD_DISABLE__DISABLE_VALUE;
#endif
#if 1
// set channel change
wTemp |= SGTV58XX_DEMOD_ASD_CTRL__CHANNEL_CHANGE__CHANGE_CHANNEL_VALUE;
#endif
// clear and then set new standard
wTemp &= SGTV58XX_DEMOD_ASD_CTRL__SET_STD__CLEARMASK;
wTemp |= ((UWORD32)(eStandard)) << SGTV58XX_DEMOD_ASD_CTRL__SET_STD__STARTBIT;
SGTV58xx_I2C_Write(SGTV58XX_REG__DEMOD_ASD_CTRL, wTemp);
//4Tenny at 2k70120 {
#if 1 //zenghw changed
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__DEMOD_DEMOD_CTRL,
SGTV58XX_DEMOD_DEMOD_CTRL__DISABLE_CONT_ASD,
SGTV58XX_DEMOD_DEMOD_CTRL__DISABLE_CONT_ASD);
#else
SGTV58xx_I2C_MaskWrite(SGTV58XX_REG__DEMOD_DEMOD_CTRL,
SGTV58XX_DEMOD_DEMOD_CTRL__DISABLE_CONT_ASD,
0x0000);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -