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

📄 audio_api.c

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