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

📄 stv0399drv.c

📁 QPSK Tuner details, for conexant chipset.
💻 C
📖 第 1 页 / 共 5 页
字号:
	{
		CSI2CReleaseBus_inner( bTunerIndex);
		return CSQPSK_FAILURE;
	}

	if(STV0399WriteOneRegister( bTunerIndex, STV0399REG_DIVCTRL, bDivider) != CSQPSK_SUCCESS)/* Set divider */
	{
		CSI2CReleaseBus_inner( bTunerIndex);
		return CSQPSK_FAILURE;
	}
	if(STV0399WriteOneRegister( bTunerIndex, STV0399REG_DIVOUT, bMode) != CSQPSK_SUCCESS)/* Reset divider */
	{
		CSI2CReleaseBus_inner( bTunerIndex);
		return CSQPSK_FAILURE;
	}
	if(STV0399WriteRegisterBits( bTunerIndex, STV0399REG_SYNTCTRL, N_BYP_MASK, N_BYP_MASK) != CSQPSK_SUCCESS)/* Synthesizer bypass */
	{
		CSI2CReleaseBus_inner( bTunerIndex);
		return CSQPSK_FAILURE;
	}
	
	CSI2CReleaseBus_inner( bTunerIndex);

	return CSQPSK_SUCCESS;
}
//#ifdef STV0399E_DRV

static BOOL STV0399Harmonic( CSHDITunerIndex bTunerIndex, DWORD dwMasterClock, DWORD dwRfFrequency, DWORD OFFSET)
{
	DWORD dwGAP;

	if(g_Tuner_Type[bTunerIndex] == STV0399_E){
		dwGAP = dwRfFrequency % (dwMasterClock / 1000);
		if((dwGAP <= OFFSET) || (dwGAP >= (dwMasterClock / 1000)-OFFSET))
			return TRUE;
		else
			return FALSE;
		}
	else{
		dwGAP = dwRfFrequency % (dwMasterClock / 1000);
		if((dwGAP <= MINIMUM_GAP) || (dwGAP >= (dwMasterClock / 1000) - MINIMUM_GAP))
			return TRUE;
		else
			return FALSE;
		}
}



static BOOL STV0399Triple(DWORD dwMasterClock, DWORD dwSymbolRate) 
{
	DWORD dwRatio;
	
	dwRatio = dwMasterClock / (dwSymbolRate/1000);
	
	if((dwRatio >= 2990) && (dwRatio <= 3010))
		return TRUE;
	else
		return FALSE;
}

static DWORD STV0399SelectOffset(DWORD dwSymbolRate)
{
	
	DWORD dwOffset;
	if(dwSymbolRate <= 10000000)
	{
		dwOffset = MINIMUM_GAP_low;
	}
	
	else
	{
		dwOffset =MINIMUM_GAP; 
	}
	
	return dwOffset;
}



//#ifdef STV0399E_DRV

static int STV0399SelectMclk ( CSHDITunerIndex bTunerIndex, DWORD dwRfFrequency, DWORD dwSymbolRate, int dwExtClk )
{
	BOOL bHarmonic, bTriple;
	DWORD dwPLLDiv;
	DWORD dwCOEFDiv = 6;
	int pnClock[2][2];
	int nIndex = 0;
	int nRatio;
	int dwClock[4][2] = {{108000000, 8},{86400000, 10},{96000000, 9},{123428571, 7}};
	
	if(g_Tuner_Type[bTunerIndex] == STV0399_E){
	dwPLLDiv = STV0399GetPLLMultCoeff( bTunerIndex);
	
	if((dwPLLDiv == 34)&&(dwSymbolRate <= 10000000))
	{
		dwCOEFDiv=12;
	}
	
	else if((dwPLLDiv == 34)&&(dwSymbolRate > 10000000)&&(dwSymbolRate <= 20000000))
	{
		dwCOEFDiv=9;
	}
	
	else if((dwPLLDiv == 34)&&(dwSymbolRate > 20000000))
	{
		dwCOEFDiv=6;
	}
	
	else if((dwPLLDiv == 32)&&(dwSymbolRate <= 10000000))
	{
		dwCOEFDiv=12;
	}
	
	else if((dwPLLDiv == 32)&&(dwSymbolRate > 10000000)&&(dwSymbolRate <=20000000))
	{
		dwCOEFDiv=9;
	}
	
	else if((dwPLLDiv == 32)&&(dwSymbolRate >20000000))
	{
		dwCOEFDiv=6;
	}
	
	
	
	pnClock[0][0]=dwPLLDiv*27000000/dwCOEFDiv;
	pnClock[0][1]=dwCOEFDiv; 
	pnClock[1][0]=dwPLLDiv*27000000/(dwCOEFDiv+1); 
	pnClock[1][1]=dwCOEFDiv+1; 
	
	nRatio = STV0399GetDivRatio( bTunerIndex);
	if((nRatio>=6) && (nRatio<=13))
	{
		do
		{
			
			
			//bHarmonic = FE_399_Harmonic(hChip,pnClock[nIndex][0],RfFrequency);
			bHarmonic = STV0399Harmonic( bTunerIndex, pnClock[nIndex][0],dwRfFrequency,STV0399SelectOffset(dwSymbolRate));
			bTriple = STV0399Triple(pnClock[nIndex][0],dwSymbolRate);
			nIndex++;
		}
		while((bHarmonic || bTriple) && (nIndex<2));
		
		if(bHarmonic || bTriple)
			STV0399SetDivRatio( bTunerIndex, dwCOEFDiv);
		else
			STV0399SetDivRatio( bTunerIndex, pnClock[nIndex-1][1]);
	}
	
	return STV0399GetMclkFreq( bTunerIndex, dwExtClk);
		}
	else{
		nRatio = STV0399GetDivRatio( bTunerIndex);
	//if (nRatio == FAILURE)
	//	return FAILURE;
	
	/* TK - testing 26june2003 */
	if ( ((dwRfFrequency >= 1144000) && (dwRfFrequency <= 1166000)) || 
		((dwRfFrequency >= 1249000) && (dwRfFrequency <= 1251000)) || 
		((dwRfFrequency >= 1599000) && (dwRfFrequency <= 1601000)) )
	{
		if (STV0399SetDivRatio( bTunerIndex, 10) != CSQPSK_SUCCESS)
			return -1;	/* org 13 leslie*/
	}	
	else
	{	
		/* TK - testing 26june2003 */
		if((nRatio>=7) && (nRatio<=10))
		{
			do
			{
				bHarmonic = STV0399Harmonic( bTunerIndex, dwClock[nIndex][0], dwRfFrequency,0);	
				bTriple = STV0399Triple(dwClock[nIndex][0], dwSymbolRate);
				nIndex++;
			}
			while((bHarmonic || bTriple) && (nIndex<4));
			
			if(bHarmonic || bTriple)
			{
				if (STV0399SetDivRatio( bTunerIndex, 8) != CSQPSK_SUCCESS)
					return -1;
			}
			else
			{
				if (STV0399SetDivRatio( bTunerIndex, dwClock[nIndex-1][1]) != CSQPSK_SUCCESS)
					return	-1;
			}
		}
	}
	return STV0399GetMclkFreq( bTunerIndex, dwExtClk);
		}
}



/*****************************************************
**FUNCTION	::	STV0399CalcAGC1Gain
**ACTION	::	Compute the AGC1 gain
**PARAMS IN	::  regvalue	==>	register value
**PARAMS OUT::	NONE
**RETURN	::	AGC1 gain multiplied by two
*****************************************************/
static int STV0399CalcAGC1Gain (BYTE bRegValue)
{
	int nGain = 0;

	nGain = (int)((bRegValue >> 2) & 0x1F);

	if(!(bRegValue & 0x80))
		nGain += 16;

	return nGain;
}

/*****************************************************
**FUNCTION	::	STV0399CalcAGC1Integrator
**ACTION	::	Compute the AGC1 gain
**PARAMS IN	::  gain	==>	gain multiplied by two
**PARAMS OUT::	NONE
**RETURN	::	AGC1 integrator value
*****************************************************/
static BYTE STV0399CalcAGC1Integrator(BYTE bGain)
{
	BYTE bIntegrator = 0x00;

	if(bGain > 31)
		bGain -= 16;
	else
		bIntegrator |= 0x80;

	bIntegrator |= (bGain & 0x1F) << 2;

	return bIntegrator;
}

/*****************************************************
**FUNCTION	::	STV0399CalcAGC0Gain
**ACTION	::	Compute the AGC0 gain
**PARAMS IN	::  regvalue	==>	register value
**PARAMS OUT::	NONE
**RETURN	::	AGC0 gain
*****************************************************/
static int STV0399CalcAGC0Gain(BYTE bRegValue)
{
	int nGain = 0;

	if((bRegValue>0) && (bRegValue<10))
	{
		nGain = (int)((bRegValue - 1) % 4) * 6;

		if(bRegValue < 5)
			nGain -= 20;
		else if(bRegValue == 9)
			nGain += 24;
	}

	return nGain;
}


static CSQPSK_Error_t STV0399Synt( CSHDITunerIndex bTunerIndex)
{
	if(STV0399SetRegisterBits( bTunerIndex, STV0399REG_SYNTCTRL2, 0x04, 0x04) != CSQPSK_SUCCESS)/* Synthesizer bypass */
		return CSQPSK_FAILURE;
	if(STV0399SetRegisterBits( bTunerIndex, STV0399REG_SYNTCTRL2, 0x04, 0x00) != CSQPSK_SUCCESS)/* Synthesizer bypass */
		return CSQPSK_FAILURE;
	return CSQPSK_SUCCESS;
}

/*****************************************************
--FUNCTION	::	STV0399CarrierTracking
--ACTION	::	Optimize STV0399 parameters according to signal changes 
--PARAMS IN	::	NONE
--PARAMS OUT::	NONE
--RETURN	::	Error (if any)
--***************************************************/
static CSQPSK_Error_t STV0399CarrierTracking ( CSHDITunerIndex bTunerIndex)
{
	BYTE	pbRegValue[4];
	BYTE	bAGC0Int;
	int		nAGC1Gain;

//	print("\nS");
	if (STV0399GetOneRegister ( bTunerIndex, STV0399REG_AGC0I, &bAGC0Int) != CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;

	bAGC0Int &= 0x0F;

	if(g_Tuner_Type[bTunerIndex] == STV0399_E)
	{
		if (STV0399GetRegisters ( bTunerIndex, STV0399REG_AGC1S, pbRegValue, 2) != CSQPSK_SUCCESS)
			return CSQPSK_FAILURE;

		nAGC1Gain = STV0399CalcAGC1Gain ( pbRegValue[1]) / 2; 
		
		if((nAGC1Gain < 1) && (bAGC0Int != 0))
		{
			bAGC0Int = MAX(0, bAGC0Int - 1);
//			print("\nAGC %d", bAGC0Int);
			if (STV0399SetOneRegister ( bTunerIndex, STV0399REG_AGC0I, bAGC0Int) != CSQPSK_SUCCESS)/* Write AGC0 integrator	*/
				return CSQPSK_FAILURE;
				pbRegValue[0] = 0x4b;
				pbRegValue[1] = 0x4b;
				
			if (STV0399SetRegisters ( bTunerIndex, STV0399REG_AGC1S, pbRegValue, 2) != CSQPSK_SUCCESS)/* Write into AGC1 registers to force update	*/ 
				return CSQPSK_FAILURE;
		}
		else if((nAGC1Gain > 22) && (bAGC0Int != 12))
		{
			bAGC0Int = MIN(12, bAGC0Int + 1);  
//			print("\nAGC %d", bAGC0Int);
			if (STV0399SetOneRegister ( bTunerIndex, STV0399REG_AGC0I, bAGC0Int) != CSQPSK_SUCCESS)/* Write AGC0 integrator	*/
				return CSQPSK_FAILURE;
				pbRegValue[0] = 0x4b;
				pbRegValue[1] = 0x4b;

			if (STV0399SetRegisters ( bTunerIndex, STV0399REG_AGC1S, pbRegValue, 2) != CSQPSK_SUCCESS)/* Write into AGC1 registers to force update	*/ 
				return CSQPSK_FAILURE;
		}
	}
	else
	
	{
		if (STV0399GetRegisters ( bTunerIndex, STV0399REG_AGC1S, pbRegValue, 2) != CSQPSK_SUCCESS)
			return CSQPSK_FAILURE;

		nAGC1Gain = STV0399CalcAGC1Gain (pbRegValue[1]) / 2; 
		
		if((nAGC1Gain < 11) && (bAGC0Int != 1))
		{
			bAGC0Int = MAX(1, bAGC0Int - 1);
//			print("\nAGC %d", bAGC0Int);
			if (STV0399SetOneRegister ( bTunerIndex, STV0399REG_AGC0I, bAGC0Int) != CSQPSK_SUCCESS)/* Write AGC0 integrator	*/
				return CSQPSK_FAILURE;
				pbRegValue[0] = 0xc3;
				pbRegValue[1] = 0xbf;
				
			if (STV0399SetRegisters ( bTunerIndex, STV0399REG_AGC1S, pbRegValue, 2) != CSQPSK_SUCCESS)/* Write into AGC1 registers to force update	*/ 
				return CSQPSK_FAILURE;
		}
		else if((nAGC1Gain > 19) && (bAGC0Int != 9))
		{
			bAGC0Int = MIN(9, bAGC0Int + 1);  
//			print("\nAGC %d", bAGC0Int);
			if (STV0399SetOneRegister ( bTunerIndex, STV0399REG_AGC0I, bAGC0Int) != CSQPSK_SUCCESS)/* Write AGC0 integrator	*/
				return CSQPSK_FAILURE;
				pbRegValue[0] = 0xc3;
				pbRegValue[1] = 0xbf;

			if (STV0399SetRegisters ( bTunerIndex, STV0399REG_AGC1S, pbRegValue, 2) != CSQPSK_SUCCESS)/* Write into AGC1 registers to force update	*/ 
				return CSQPSK_FAILURE;
		}
		
	}
	
	return CSQPSK_SUCCESS;
}






CSQPSK_Error_t STV0399GetLockStatus ( CSHDITunerIndex bTunerIndex, int *status)
{
	BYTE bRegValue;
	int i;


	for(i=0; i<20; i++)
	{
		STV0399GetOneRegister( bTunerIndex, STV0399REG_VSTATUS, &bRegValue);
		if (bRegValue & STV0399_LK_MASK)
		{
			*status = TRUE;
			return CSQPSK_SUCCESS;
		}
		CSSleep(1);			
	}
	*status = FALSE;
	return CSQPSK_SUCCESS;

}

void STV0399GetSignalPowerAndQuality ( CSHDITunerIndex bTunerIndex, int *nPower, int *nQuality)
{
	int i;
	STV0399SignalInfo_t pT_Info;
	*nPower = 50;
	*nQuality = 100;

	STV0399GetSignalInfo( bTunerIndex, &pT_Info, &g_pT_Params[bTunerIndex]);

	if(g_Tuner_Type[bTunerIndex] == STV0399_E){
   		 for(i=0; i<20; ++i)
   		 {
			    if(STV0399ESignalQuality_LookUp[i][0] >= pT_Info.C_N)
			    {
				    *nQuality = STV0399ESignalQuality_LookUp[i][1];
				    break;
			    }
		    }	
		}
	else{
		 for(i=0; i<20; ++i)
   		 {
			    if(STV0399SignalQuality_LookUp[i][0] >= pT_Info.C_N)
			    {
				    *nQuality = STV0399SignalQuality_LookUp[i][1];
				    break;
			    }
		    }	
		}
	*nPower = (pT_Info.Power + 1060) / 10;  
	if(*nPower > 100)
		*nPower = 100;

}		

static int STV0399GetCFStatus ( CSHDITunerIndex bTunerIndex)
{
	BYTE bRegValue;
	
	if (STV0399GetOneRegister( bTunerIndex, STV0399REG_VSTATUS, &bRegValue) != CSQPSK_SUCCESS)
		return -1;

	if (bRegValue & STV0399_CF_MASK)
		return CSQPSK_CF;
	else
		return CSQPSK_NO_CARRIER;
}


static int STV0399GetRFLevel( CSHDITunerIndex bTunerIndex, STV0399LookUp_t *lookup)
{
	int agcGain = 0;
		
	BYTE	pbRegValue[4];
		
	int Imin,
		Imax,
		i,
		rfLevel = 0;
	
	if((lookup != NULL) && lookup->nSize)
	{
		if (STV0399GetOneRegister( bTunerIndex, STV0399REG_AGC0I, pbRegValue) != CSQPSK_SUCCESS)
			return -1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -