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

📄 audio_api1.c

📁 The driver of audio processor SGTV5830 音频处理芯片SGTV5830驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
/*===============================================================
 * 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 + -