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

📄 drv399e.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
		gain-= 16;
	else
		integrator |= 0x80;
		
	integrator |= (U8)(gain & 0x1F) << 2;
	
	return integrator;
}

/*****************************************************
**FUNCTION	::	FE_399_CalcAGC0Gain
**ACTION	::	Compute the AGC0 gain
**PARAMS IN	::  regvalue	==>	register value
**PARAMS OUT::	NONE
**RETURN	::	AGC0 gain
*****************************************************/
S32 FE_399_CalcAGC0Gain(U8 regvalue) 
{
	S32 gain = 0;
	
	if((regvalue>0)&&(regvalue<10))
	{
		gain = (S32)((regvalue - 1)%4) * 6; 
	
		if(regvalue < 5) 
			gain -= 20; 
		else if(regvalue == 9)
			gain += 24;
	}
		
	return gain;
}
#ifndef STTUNER_MINIDRIVER

/*****************************************************
**FUNCTION	::	FE_399_GetVcoState
**ACTION	::	return the status of the VCO 
**PARAMS IN	::  hChip	==>	handle to the chip
**PARAMS OUT::	NONE
**RETURN	::	the current state of the VCO
*****************************************************/
FE_399_VCO_STATE_t FE_399_GetVcoState(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{
	FE_399_VCO_STATE_t vcostate = VCO_LOCKED;
	
	if(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_VLOW) == 0)	/* VCO is too low */ 
		vcostate = VCO_TOO_LOW;	
	else if(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_VHIGH) == 1)	/* VCO is too high */
		vcostate = VCO_TOO_HIGH;
	
	return vcostate;
}
#endif
#ifdef STTUNER_MINIDRIVER
FE_399_VCO_STATE_t FE_399_GetVcoState( )
{
	U8 Data1, Data2;
	FE_399_VCO_STATE_t vcostate = VCO_LOCKED;
	
	STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R399_SYSCTRL, F399_VLOW, F399_VLOW_L, &Data1, 1, FALSE);
	STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R399_SYSCTRL, F399_VHIGH, F399_VHIGH_L, &Data2, 1, FALSE);	
	if(Data1 == 0)	/* VCO is too low */ 
	vcostate = VCO_TOO_LOW;	
	else if(Data2 == 1)	/* VCO is too high */
	vcostate = VCO_TOO_HIGH;
	
	return vcostate;
}
#endif
/*****************************************************
**FUNCTION	::	FE_399_StartSynt
**ACTION	::	start STV0399 analog synthesizer
**PARAMS IN	::  hChip	==>	handle to the chip
**PARAMS OUT::	NONE
**RETURN	::	NONE
*****************************************************/
#ifndef STTUNER_MINIDRIVER
void FE_399_StartSynt(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{
	
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_BYP,0);
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_DIS,1);
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_DIS,0);
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_BYP,1);
}
#endif
#ifdef STTUNER_MINIDRIVER
void FE_399_StartSynt( )
{
	U8 Data;
	
	Data = 0;
	STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_SYNTCTRL, F399_BYP, F399_BYP_L, &Data, 1, FALSE);
	
	Data = 1;
	STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_SYNTCTRL, F399_DIS, F399_DIS_L, &Data, 1, FALSE);
	
	Data = 0;
	STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_SYNTCTRL, F399_DIS, F399_DIS_L, &Data, 1, FALSE);
	
	Data = 1;
	STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_SYNTCTRL, F399_BYP, F399_BYP_L, &Data, 1, FALSE);
}
#endif
#ifdef STTUNER_MINIDRIVER
void FE_399_Synt( )
{
	U8 Data;
	Data = 1;
	STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_SYNTCTRL2, F399_RESET_FILT, F399_RESET_FILT_L, &Data, 1, FALSE);
	
	Data = 1;
	STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_SYNTCTRL2, F399_RESET_FILT, F399_RESET_FILT_L, &Data, 1, FALSE);
}
#endif

#ifndef STTUNER_MINIDRIVER
void FE_399_Synt(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle )
{
	
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_RESET_FILT,1);
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_RESET_FILT,0);  
}
#endif
/*--------------------------------------------------------------------------
  --------------------------------------------------------------------------
  --------------------------------------------------------------------------
**FUNCTION	::	FE_399_CalcSyntFreqInt
**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)
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------*/

U32 FE_399_CalcSyntFreqInt(S32 quartz,S32 mdiv,U32 ipe,U32 pll_mc)
{
	U32 frequency = 0;
	
	/*frequency = 1057*(pll_mc)*(((32*quartz)/4)/((((32767*(mdiv+33)-ipe))/31)));*//*original line*/
	frequency = 1057*(pll_mc)*((8*quartz)/((((32767*(mdiv+33)-ipe))/31)));
	return frequency;
}

/*--------------------------------------------------------------------------
  --------------------------------------------------------------------------
  --------------------------------------------------------------------------
**FUNCTION	::	FE_399_CalcSyntFreqFloat
**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)
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------*/
/*
U32 FE_399_CalcSyntFreqFloat(S32 quartz,S32 mdiv,U32 ipe,U32 pll_mc)
{
	U32 frequency;
*/	
	/*frequency = (U32)((32.0)*((pll_mc*(double)quartz/4.0)/(mdiv+33.0-(double)(ipe)/32767.0)));*/  /*original line */
/*	frequency = (U32)((32)*((pll_mc*quartz/4)/(mdiv+33-(ipe)/32767)));
	return frequency;
}
*/
/*----------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
**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)
------------------------------------------------------------------*/
#ifndef STTUNER_MINIDRIVER
U32 FE_399_SetSyntFreq(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,U32 Quartz, U32 Target)
{
	U32 ipe = 32767;
	S32 mdiv = 0;
	U32 pll_mc = 32;
	
	
	pll_mc = FE_399_Get_PLL_mult_coeff(DeviceMap,IOHandle);
	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;
		
		/* round ipe divider */
		if ( ((ipe & 0x03ff) > 0x01ff) || (ipe < 0x03ff) )
			ipe |= 0x03ff;
		else
			ipe = (ipe & 0xfc00) - 1;		
		/* Set analog synthesizer	*/
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_MD,mdiv);
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_PE_MSB,MSB(ipe));
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_PE_LSB,LSB(ipe));
	}
	else
	{
		mdiv = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_MD);
		ipe = MAKEWORD(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_PE_MSB),STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_PE_LSB));
		
	}
	
	return FE_399_CalcSyntFreqInt(Quartz,mdiv,ipe,pll_mc);
}
#endif

#ifdef STTUNER_MINIDRIVER
U32 FE_399_SetSyntFreq(U32 Quartz, U32 Target)
{
	U8 Data, nsbuffer[2];
	U32 ipe = 32767;
	S32 mdiv = 0, temp = 0;
	U32 pll_mc = 32;
	
	pll_mc = FE_399_Get_PLL_mult_coeff( );
	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;
		
		/* round ipe divider */
		if ( ((ipe & 0x03ff) > 0x01ff) || (ipe < 0x03ff) )
			ipe |= 0x03ff;
		else
			ipe = (ipe & 0xfc00) - 1;		
		/* Set analog synthesizer */
		temp = (mdiv > 0 ) ? mdiv : mdiv + (1 << 5);
		Data = (U8)temp;
		STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_ACOARSE, F399_MD, F399_MD_L, &Data, 1, FALSE);
		
		nsbuffer[0] = ((ipe) & 0xff00)>>8;
		nsbuffer[1] = ((ipe) & 0x00ff);
		STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_AFINEMSB, 0, 0, nsbuffer, 2, FALSE);
		
	}
	else
	{
		
		STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R399_ACOARSE, F399_MD, F399_MD_L, &Data, 1, FALSE);
		mdiv = (S32)(Data - (1 << 5));
		/*mdiv = Data;*/ 
		STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R399_AFINEMSB, 0, 0, nsbuffer, 2, FALSE);
		ipe = MAKEWORD(nsbuffer[0],nsbuffer[1]);
	}
	
	return FE_399_CalcSyntFreqInt(Quartz,mdiv,ipe,pll_mc);
}
#endif
/*----------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
**FUNCTION	::	FE_399_Get_PLL_mult_coeff

------------------------------------------------------------------*/
#ifndef STTUNER_MINIDRIVER
U32 FE_399_Get_PLL_mult_coeff(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{
	U32 pll_div;
	
	
	switch(STTUNER_IOREG_GetField(DeviceMap, IOHandle,F399_PLL_DIV))
	{
		default:
			pll_div = 32;	
		break;
		
		case 2: 
			pll_div = 30;	
		break;
		
		case 4:
			pll_div = 32;
		break;
		
		case 6:
			pll_div = 31;
		break;
		
		case 8:
			pll_div = 34;
		break;
		
		case 12:
			pll_div = 33;
		break;
	}
	
	return pll_div;
}
#endif
#ifdef STTUNER_MINIDRIVER
U32 FE_399_Get_PLL_mult_coeff( )
{
	U32 pll_div;
	U8 Data;
	
	STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R399_DCLK1, F399_PLL_DIV, F399_PLL_DIV_L, &Data, 1, FALSE);
	switch(Data)
	{
		default:
			pll_div = 32;	
		break;
		
		case 2: 
			pll_div = 30;	
		break;
		
		case 4:
			pll_div = 32;
		break;
		
		case 6:
			pll_div = 31;
		break;
		
		case 8:
			pll_div = 34;
		break;
		
		case 12:
			pll_div = 33;
		break;
	}
	
	return pll_div;
}
#endif
/*----------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
**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)

------------------------------------------------------------------*/
#ifndef STTUNER_MINIDRIVER
U32 FE_399_GetSyntFreq(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,U32 Quartz)
{
	S8 mdiv;
	U32 ipe,Fout,pll_mc;
		
	/*	analog synthesizer	*/
	mdiv = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_MD);
	ipe = MAKEWORD(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_PE_MSB),STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_PE_LSB));
	pll_mc = FE_399_Get_PLL_mult_coeff(DeviceMap,IOHandle);
	
	/*Fout = FE_399_CalcSyntFreqFloat(Quartz,mdiv,ipe,pll_mc);*/
	Fout = FE_399_CalcSyntFreqInt(Quartz,mdiv,ipe,pll_mc);
	
	return Fout;
}
#endif
#ifdef STTUNER_MINIDRIVER
U32 FE_399_GetSyntFreq(U32 Quartz)
{
	U8 Data, nsbuffer[2];
	S32 mdiv;
	U32 ipe,
		Fout,pll_mc;
		
	/*	analog synthesizer	*/
	STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R399_ACOARSE, F399_MD, F399_MD_L, &Data, 1, FALSE);
	mdiv = Data; 
	STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R399_AFINEMSB, 0, 0, nsbuffer, 2, FALSE);
	
	ipe = MAKEWORD(nsbuffer[0],nsbuffer[1]);
	
	pll_mc = FE_399_Get_PLL_mult_coeff( );
	
	Fout = FE_399_CalcSyntFreqInt(Quartz,mdiv,ipe,pll_mc);
	
	return Fout;
}
#endif
/*****************************************************
**FUNCTION	::	FE_399_SetDivRatio
**ACTION	::	Set the STV0399 synthesizer first divider ratio
**PARAMS IN	::  hChip		==>	handle to the chip
**				Ratio		==> Divider Ratio (1..15)
**PARAMS OUT::	NONE
**RETURN	::	NONE
*****************************************************/
#ifndef STTUNER_MINIDRIVER
void FE_399_SetDivRatio(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, U8 Ratio)
{
	U8	byte = 0x01;
	U32 mode;
	
		
	if((Ratio & 0x01) == 0x01)
		byte = 0x03;
	
	byte <<= ((Ratio/2)-1);
	
	mode = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F399_CMD_DIV_DIG);
	
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_BYP,0);					/* Synthesizer bypass */
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_CMD_DIV_DIG,0);			/* Divider bypass */
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_CMD_DIV,0); 			/* Reset divider */
	
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_CMD_DIV,byte);   		/* Set divider */
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_CMD_DIV_DIG,mode); 		/* Enable divider */
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F399_BYP,1);					/* Enable synthesizer*/  
}
#endif
#ifdef STTUNER_MINIDRIVER
void FE_399_SetDivRatio(U8 Ratio)
{
	U8	byte = 0x01, Data;
	U32 mode;
		
	if((Ratio & 0x01) == 0x01)
		byte = 0x03;
	
	byte <<= ((Ratio/2)-1);
	
	STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R399_DCLK1, F399_CMD_DIV_DIG, F399_CMD_DIV_DIG_L, &Data, 1, FALSE);
	mode = Data;
	
	Data = 0;
	STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_SYNTCTRL, F399_BYP, F399_BYP_L, &Data, 1, FALSE);
	Data = 0;
	STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_DCLK1, F399_CMD_DIV_DIG, F399_CMD_DIV_DIG_L, &Data, 1, FALSE);
	Data = 0;
	STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_DCLK2, F399_CMD_DIV, F399_CMD_DIV_L, &Data, 1, FALSE);
	
	Data = byte;
	STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_DCLK2, F399_CMD_DIV, F399_CMD_DIV_L, &Data, 1, FALSE);
	
	Data = mode;
	STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_DCLK1, F399_CMD_DIV_DIG, F399_CMD_DIV_DIG_L, &Data, 1, FALSE);
	
	Data = 1;

⌨️ 快捷键说明

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