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

📄 stv0399drv.c

📁 QPSK Tuner details, for conexant chipset.
💻 C
📖 第 1 页 / 共 5 页
字号:
	else if ((bSysCtrlReg & STV0399_VHIGH_MASK) == 1)	/* VCO is too high */
		nVCOState = VCO_TOO_HIGH;

	return nVCOState;
}

/*****************************************************
**FUNCTION	::	STV0399StartSynt
**ACTION	::	start STV0399 analog synthesizer
**PARAMS IN	::  hChip	==>	handle to the chip
**PARAMS OUT::	NONE
**RETURN	::	NONE
*****************************************************/
static CSQPSK_Error_t STV0399StartSynt (  CSHDITunerIndex bTunerIndex )
{
	if ( CSI2CRequestBus_inner( bTunerIndex, CSHDI_TIMEOUT_INFINITY) != CSI2C_SUCCESS )
	{
		return CSQPSK_FAILURE;
	}

	if (STV0399WriteRegisterBits ( bTunerIndex, STV0399REG_SYNTCTRL, STV0399_N_BYP_MASK, 0) != CSQPSK_SUCCESS)
	{
		CSI2CReleaseBus_inner( bTunerIndex);
		return CSQPSK_FAILURE;
	}
	if (STV0399WriteRegisterBits ( bTunerIndex, STV0399REG_SYNTCTRL, STV0399_A_DIS_MASK, STV0399_A_DIS_MASK) != CSQPSK_SUCCESS)
	{
		CSI2CReleaseBus_inner( bTunerIndex);
		return CSQPSK_FAILURE;
	}
	if (STV0399WriteRegisterBits ( bTunerIndex, STV0399REG_SYNTCTRL, STV0399_A_DIS_MASK, 0) != CSQPSK_SUCCESS)
	{
		CSI2CReleaseBus_inner( bTunerIndex);
		return CSQPSK_FAILURE;
	}
	if (STV0399WriteRegisterBits ( bTunerIndex, STV0399REG_SYNTCTRL, STV0399_N_BYP_MASK, STV0399_N_BYP_MASK) != CSQPSK_SUCCESS)
	{
		CSI2CReleaseBus_inner( bTunerIndex);
		return CSQPSK_FAILURE;
	}
	
	CSI2CReleaseBus_inner( bTunerIndex);
	return CSQPSK_SUCCESS;
}


/*****************************************************
**FUNCTION	::	STV0399CalcSyntFreqInt
**ACTION	::	compute the STV0399 digital synthetizer frequency (with integers)
**PARAMS IN	::  hChip	==>	handle to the chip
**				mdiv	==> mdiv divider value
**				ipe		==> ipe divider value
**PARAMS OUT::	NONE
**RETURN	::	Synthesizer frequency (Hz)
*****************************************************/
//#ifdef STV0399E_DRV
static DWORD STV0399CalcSyntFreqInt( CSHDITunerIndex bTunerIndex , int dwQuartz, int mdiv, int ipe, int pll_mc)
{
	DWORD dwFrequency = 0;
	
	if(g_Tuner_Type[bTunerIndex] == STV0399_E)
		dwFrequency = 1057 * (pll_mc) * (DWORD)(((32*dwQuartz)/4)/((((32767*(mdiv+33)-ipe))/31)));
	else
		dwFrequency = 33824 * (DWORD)(((32*dwQuartz)/4)/((((32767*(mdiv+33)-ipe))/31)));
//	printf("\n[STV0399CalcSyntFreqInt] dwFrequency = %d", dwFrequency);
	return dwFrequency;
}

/*****************************************************
**FUNCTION	::	STV0399CalcSyntFreqFloat
**ACTION	::	compute the STV0399 digital synthetizer frequency (with floats)
**PARAMS IN	::  hChip	==>	handle to the chip
**				mdiv	==> mdiv divider value
**				ipe		==> ipe divider value
**PARAMS OUT::	NONE
**RETURN	::	Synthesizer frequency (Hz)
*****************************************************/
static DWORD STV0399CalcSyntFreqFloat( CSHDITunerIndex bTunerIndex, DWORD dwQuartz, int mdiv, DWORD ipe, int pll_mc)
{
	DWORD dwFrequency = 0;

	if(g_Tuner_Type[bTunerIndex] == STV0399_E)
		dwFrequency = (DWORD)(32.0 * ((pll_mc*(double)dwQuartz/4.0)/(mdiv+33.0-(double)(ipe)/32767.0)));
	else
		dwFrequency = (DWORD)(32.0*((32.0*(double)dwQuartz/4.0)/(mdiv+33.0-(double)(ipe)/32767.0)));
//	printf("\n[STV0399CalcSyntFreqFloat] dwFrequency = %d", dwFrequency);

	return dwFrequency;
}

/*----------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
**FUNCTION	::	FE_399_SetSyntFreq
**ACTION	::	Set the STV0399 synthetizer frequency
**PARAMS IN	::  hChip	==>	handle to the chip
**				Quartz	==>	quartz frequency (Hz)
**				Target	==> target frequency (Hz)
**PARAMS OUT::	NONE
**RETURN	::	Synthesizer frequency (Hz)
------------------------------------------------------------------*/
/*****************************************************
**FUNCTION	::	STV0399SetSyntFreq
**ACTION	::	Set the STV0399 synthetizer frequency
**PARAMS IN	::  hChip	==>	handle to the chip
**				Quartz	==>	quartz frequency (Hz)
**				Target	==> target frequency (Hz)
**PARAMS OUT::	NONE
**RETURN	::	Synthesizer frequency (Hz)
*****************************************************/
static DWORD STV0399SetSyntFreq( CSHDITunerIndex bTunerIndex, DWORD Quartz, DWORD Target)
{
	BYTE pbRegValue[4];
	int ipe = 32767;
	int mdiv = 0;
	DWORD pll_mc = 32; /*cs 32.0*/

	if(g_Tuner_Type[bTunerIndex] == STV0399_E){
	pll_mc = STV0399GetPLLMultCoeff( bTunerIndex);
	if((Target >= 202000000) && (Target <= 450000000) && Quartz)
	{
		mdiv = (4*(((2*pll_mc)*Quartz)/(Target/10000)))/10000 - 32;
		ipe = (32767 * ((mdiv+33)*10000 - 4*(((2*pll_mc)*Quartz)/(Target/10000))))/10000;
		if ( ((ipe & 0x03ff) > 0x01ff) || (ipe < 0x03ff) )
			ipe |= 0x03ff;
		else
			ipe = (ipe & 0xfc00) - 1; 

		STV0399SetRegisterBits( bTunerIndex, STV0399REG_SYNTH1, STV0399_MD_MASK, (mdiv & 0x1F));
		pbRegValue[0] = (BYTE)((ipe >> 8) & 0xFF);
		pbRegValue[1] = (BYTE)(ipe & 0xFF);
		STV0399SetRegisters( bTunerIndex, STV0399REG_SYNTH2, pbRegValue, 2);
	}
	else
	{
		STV0399GetRegisters( bTunerIndex, STV0399REG_SYNTH1, pbRegValue, 3);
		mdiv = (int)(pbRegValue[0] & 0x1F); 
		if (mdiv & 0x10)
			mdiv -= 0x20;
		ipe = ((int)pbRegValue[1] << 8) + (int)pbRegValue[2];
	}

	return STV0399CalcSyntFreqInt( bTunerIndex, (int)Quartz,mdiv,ipe, pll_mc);
		}
	else{
		if((Target >= 216000000) && (Target <= 432000000) && Quartz)
	{
		mdiv = (4*((64*Quartz)/(Target/10000)))/10000 - 32;
		ipe = (32767 * ((mdiv+33)*10000 - 4*((64*Quartz)/(Target/10000))))/10000;
		/* round ipe divider */
//		printf("\nmdiv = %d, ipe = %d", mdiv, ipe);
		if ( ((ipe & 0x03ff) > 0x01ff) || (ipe < 0x03ff) )
			ipe |= 0x03ff;
		else
			ipe = (ipe & 0xfc00) - 1; 

		/* Set analog synthesizer	*/
		STV0399SetRegisterBits( bTunerIndex, STV0399REG_SYNTH1, STV0399_MD_MASK, (mdiv & 0x1F));
		pbRegValue[0] = (BYTE)((ipe >> 8) & 0xFF);
		pbRegValue[1] = (BYTE)(ipe & 0xFF);
		STV0399SetRegisters( bTunerIndex, STV0399REG_SYNTH2, pbRegValue, 2);
//		printf("\n(mdiv & 0x1F) = 0x%x", (mdiv & 0x1F));
//		ChipSetField(hChip,F399_MD,mdiv);
//		ChipSetField(hChip,F399_PE_MSB,MSB(ipe));
//		ChipSetField(hChip,F399_PE_LSB,LSB(ipe));
	}
	else
	{
		STV0399GetRegisters( bTunerIndex, STV0399REG_SYNTH1, pbRegValue, 3);
		mdiv = (int)(pbRegValue[0] & 0x1F); 
		if (mdiv & 0x10)
			mdiv -= 0x20;
		ipe = ((int)pbRegValue[1] << 8) + (int)pbRegValue[2];
//		ipe = MAKEWORD(ChipGetField(hChip,F399_PE_MSB),ChipGetField(hChip,F399_PE_LSB));
	}

	return STV0399CalcSyntFreqInt( bTunerIndex, (int)Quartz,mdiv,ipe,0);
		}
	
}

/*----------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
**FUNCTION	::	FE_399_Get_PLL_mult_coeff

------------------------------------------------------------------*/
DWORD STV0399GetPLLMultCoeff( CSHDITunerIndex bTunerIndex)
{
	DWORD dwPLLDiv;
	BYTE bRegValue;
	
	STV0399GetOneRegister ( bTunerIndex, STV0399REG_DIVOUT, &bRegValue);
	bRegValue &= 0x1f;
	switch(bRegValue)
	{
		default:
			dwPLLDiv = 32;	/*cs 32.0*/
		break;
		
		case 2: 
			dwPLLDiv = 30;	/*cs 30.0*/
		break;
		
		case 4:
			dwPLLDiv = 32;/*cs 32.0*/
		break;
		
		case 6:
			dwPLLDiv = 31;/*cs 32.0*/
		break;
		
		case 8:
			dwPLLDiv = 34;/*cs 34.0*/
		break;
		
		case 12:
			dwPLLDiv = 33;/*cs 33.0*/
		break;
	}
//	printf("\n[STV0399GetPLLMultCoeff ]dwPLLDiv = %d", dwPLLDiv);
	return dwPLLDiv;
}

DWORD STV0399PLLDIVSelect( DWORD dwStartFrequency, DWORD dwStopFrequency, DWORD dwPLLDiv, DWORD dwFrequency, DWORD dwOffset) 
{
	
	DWORD dwValue;
	int n;
	int i;
	
	DWORD pdwTable[6]= {0};

	if(dwFrequency <= 1200000000)
    {
		dwValue = dwFrequency/(4*1000000);
    }
    
	else
    {
		dwValue = dwFrequency/(5*1000000);
    }
    
	for(i=0;i<=5;i++)
    {
		if((dwPLLDiv*27*2-dwOffset<=dwFrequency/1000000+dwValue*(i-2))&&(dwFrequency/1000000+dwValue*(i-2)<= dwPLLDiv*27*2+dwOffset))
        {
			pdwTable[i] = 1;
        }
        
		else
        {
			pdwTable[i] = 0;
        }
		
    }
	
	n = pdwTable[0]|pdwTable[1]|pdwTable[2]|pdwTable[3]|pdwTable[4]|pdwTable[5];
	//}while(dwFrequency <= dwStopFrequency);
	//printf("\n[STV0399PLLDIVSelect]n=%d", n);
	return n;
}

/*----------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
**FUNCTION	::	FE_399_GetSyntFreq
**ACTION	::	Set the STV0399 digital synthetizer frequency
**PARAMS IN	::  hChip	==>	handle to the chip
**				Quartz	==>	quartz frequency (Hz)
**PARAMS OUT::	NONE
**RETURN	::	Synthesizer frequency (Hz)

------------------------------------------------------------------*/
static int STV0399GetSyntFreq( CSHDITunerIndex bTunerIndex, int dwQuartz)
{
	BYTE	pbRegValue[4];
	int		mdiv;
	int	ipe;
	int	Fout, pll_mc;

	if(g_Tuner_Type[bTunerIndex] == STV0399_E){
	if (STV0399GetRegisters ( bTunerIndex, STV0399REG_SYNTH1, pbRegValue, 3) != CSQPSK_SUCCESS)
		return -1;
	/*	analog synthesizer	*/
	mdiv = (int)pbRegValue[0] & 0x1F;
	
	if (mdiv & 0x10)
		mdiv -= 0x20;

	ipe = ((int)pbRegValue[1] << 8) + (int)pbRegValue[2];
	pll_mc = STV0399GetPLLMultCoeff( bTunerIndex);
	Fout = STV0399CalcSyntFreqFloat( bTunerIndex, dwQuartz,mdiv,ipe,pll_mc);
	
	return Fout;
		}
	else{
	if (STV0399GetRegisters ( bTunerIndex, STV0399REG_SYNTH1, pbRegValue, 3) != CSQPSK_SUCCESS)
		return -1;
	/*	analog synthesizer	*/
	mdiv = (int)pbRegValue[0] & 0x1F;
	if (mdiv & 0x10)
		mdiv -= 0x20;
	ipe = ((int)pbRegValue[1] << 8) + (int)pbRegValue[2];

	Fout = (int)(32.0*((32.0*(double)dwQuartz/4.0)/(mdiv+33.0-(double)(ipe)/32767.0)));

	return Fout;
		}
}

/*-----------------------------------------------------------
-------------------------------------------------------------
-------------------------------------------------------------
**FUNCTION	::	FE_399_GetMclkFreq
**ACTION	::	Set the STV0399 master clock frequency
**PARAMS IN	::  hChip		==>	handle to the chip
**				ExtClk		==>	External clock frequency (Hz)
**PARAMS OUT::	NONE
**RETURN	::	MasterClock frequency (Hz)
-------------------------------------------------------------*/
static int STV0399GetMclkFreq ( CSHDITunerIndex bTunerIndex, int dwExtClk)
{
	int		dwMClk = 0;
	BYTE	bDivValue;
	int		nRatio;
	DWORD	pll_mc;

	if(g_Tuner_Type[bTunerIndex] == STV0399_E){
	pll_mc = STV0399GetPLLMultCoeff( bTunerIndex);
	
	STV0399GetOneRegister ( bTunerIndex, STV0399REG_DIVOUT, &bDivValue);
	nRatio = STV0399GetDivRatio( bTunerIndex);
//	printf("\n[STV0399GetMclkFreq]bDivValue=%d, nRatio = %d, pll_mc=%d", bDivValue, nRatio, pll_mc);
	switch (bDivValue >> 5)
	{
		default:
			dwMClk = dwExtClk;	/* synthe bypass	*/
			break;
		case 1:
			dwMClk = (dwExtClk * pll_mc) / 2;	
			break;
			
		case 2:
			dwMClk = (dwExtClk * pll_mc) / STV0399GetDivRatio( bTunerIndex);	
			break;
			
		case 3:
			dwMClk = (dwExtClk * pll_mc) / (2 * STV0399GetDivRatio( bTunerIndex));
			break;
			
		case 4:
			dwMClk = (dwExtClk * pll_mc) / (4 * STV0399GetDivRatio( bTunerIndex));
			break;
	}
//	printf("\n[STV0399GetMclkFreq] MCLK = %d", dwMClk);
	return dwMClk;
		}
	else{
		STV0399GetOneRegister ( bTunerIndex, STV0399REG_DIVOUT, &bDivValue);
	nRatio = STV0399GetDivRatio( bTunerIndex);
	
	switch (bDivValue >> 5)
	{
		case 1:
			dwMClk = (dwExtClk * 16);	/* Divider bypass */
			break;
			
		case 2:
			dwMClk = (dwExtClk * 32) / nRatio;
			break;
			
		case 3:
			dwMClk = (dwExtClk * 16) / nRatio;
			break;
			
		case 4:
			dwMClk = (dwExtClk * 8) / nRatio;
			break;
		default:
			dwMClk = dwExtClk;	/* synthe bypass	*/
			break;
	}
	return dwMClk;
		}
}

/*****************************************************
**FUNCTION	::	STV0399SetTunerFreq
**ACTION	::	Set the STV0399 analog synthetizer frequency
**PARAMS IN	::  Quartz	==>	quartz frequency (Hz)
**				Frequency	==>	tuner frequency (KHz)
**PARAMS OUT::	NONE
**RETURN	::	tuner frequency (KHz)
*****************************************************/
static DWORD STV0399SetTunerFreq( CSHDITunerIndex bTunerIndex, DWORD Quartz, DWORD Frequency)
{
	DWORD result;
	int pllmult = 0;
	STV0399PLL_MULTIPLIER_t pll;
	STV0399VCO_t vco;
	BYTE bTemp;
	DWORD frequency;

   if(g_Tuner_Type[bTunerIndex] == STV0399_E){
    if(STV0399PLLDIVSelect(950000000,2150000000,34,Frequency,15) == 0)
    {
		STV0399SetRegisterBits( bTunerIndex, STV0399REG_DIVOUT, 0x1F, 8);
    }
    else if(STV0399PLLDIVSelect( 950000000,2150000000,32,Frequency,15) == 0)
    {
		STV0399SetRegisterBits( bTunerIndex, STV0399REG_DIVOUT, 0x1F, 0);
    }
    else
    {
		STV0399SetRegisterBits( bTunerIndex, STV0399REG_DIVOUT, 0x1F, 12);
    }
	
	pll = (Frequency >= 1200000000) ? PLL_X5: PLL_X4;
	if(pll)
		STV0399SetRegisterBits ( bTunerIndex, STV0399REG_SYNTCTRL2, STV0399_PLL_FACTOR_MASK, STV0399_PLL_FACTOR_MASK);
	else
		STV0399SetRegisterBits ( bTunerIndex, STV0399REG_SYNTCTRL2, STV0399_PLL_FACTOR_MASK, 0);

	pllmult = (pll == PLL_X4) ? 4:5;
	result = STV0399SetSyntFreq( bTunerIndex, Quartz,Frequency/pllmult) * pllmult;
	STV0399SetRegisterBits ( bTunerIndex, STV0399REG_SYSCTRL, STV0399_CMD_MASK, STV0399_CMD_MASK);
	STV0399SetRegisterBits ( bTunerIndex, STV0399REG_SYNTCTRL2, STV0399_RESET_SYNT_MASK, STV0399_RESET_SYNT_MASK);
	STV0399SetRegisterBits ( bTunerIndex, STV0399REG_SYNTCTRL2, STV0399_RESET_SYNT_MASK, 0);
	STV0399GetOneRegister( bTunerIndex, STV0399REG_SYSCTRL, &bTemp);
//	printf("\nREG SYSCTRL 1 = 0x%x", bTemp);
	if(((bTemp & 0x02) == 0) || ((bTemp & 0x20) == 0x20))
	{
		STV0399SetRegisterBits ( bTunerIndex, STV0399REG_SYSCTRL, STV0399_CMD_MASK, 0);
//	STV0399GetOneRegister(STV0399REG_SYSCTRL, &bTemp);
//	printf("\nREG SYSCTRL 2 = 0x%x", bTemp);
	}

	return result;
   	}
   else{
   	if(ABS(((int)(Frequency/1000) - 1728000)) > MINIMUM_GAP)
	{
		if(ABS(((int)(Frequency/1000) - 2160000)) > MINIMUM_GAP)
		frequency = Frequency;
	else
			frequency = 2160000000u;/*value given as unsigned*/
	}
	else
		frequency = 1728000000;

⌨️ 快捷键说明

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