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

📄 362_drv.c

📁 STV0299 Minituner driver, for ST chipset
💻 C
📖 第 1 页 / 共 3 页
字号:
			pParams->hTuner = TunerInit(pInit->Tuner362Init); 
		#endif
		if(pInit->Clock == FE_SERIAL_CLOCK)
			ChipSetField(pParams->hDemod,OUTRS_SP,1);	/*Else, PARALLEL (by default register setting)*/
		/**** DRIVER modification for 362 *******/
		/*  FilterCoeffInit(pParams->hDemod); */
		/*****************************************/
		if(pParams->hDemod != NULL)
		{
					
			pParams->I2Cspeed = SpeedInit(pParams->hDemod);  
			pParams->prev_lock_status = NO_LOCK;
			pParams->first_lock=0;
		}
		else
		{
		
			#ifdef HOST_PC
				free(pParams);
			#endif

			#ifdef CHIP_STAPI
				memory_deallocate(pInit->hDemod->Chip->MemoryPartition, pParams);
			#endif

			pParams = NULL;
		}
	}
	
	return (FE_362_Handle_t) pParams;
}



/*****************************************************
--FUNCTION	::	FE_362_Search
--ACTION	::	Search for a valid channel
--PARAMS IN	::	Handle	==>	Front End Handle
				pSearch ==> Search parameters
				pResult ==> Result of the search
--PARAMS OUT::	NONE
--RETURN	::	Error (if any)
--***************************************************/
FE_362_Error_t	FE_362_Search(FE_362_Handle_t	Handle, FE_362_SearchParams_t	*pSearch, FE_362_SearchResult_t *pResult)//,STTUNER_tuner_instance_t *TunerInstance)

{

        
    int offset=0;
    int offsetvar=0;
    char signvalue=0;
    
    
    
	U8 constell,counter;
	S8 step;
	
	S32 timing_offset;
	U32 trl_nomrate;
	
    
        
	FE_362_Error_t error = FE_NO_ERROR;
	FE_362_InternalParams_t *pParams;
	
	if ((void*) Handle != NULL)  
	{
		pParams = (FE_362_InternalParams_t *) Handle; 
		/*FE_362_SetInternalError(FE_IERR_NO,FE_LOC_NOWHERE,&pParams->Error);*/ /* To be added next time */  
		
			
		/* Fill pParams structure with search parameters */
		pParams->Frequency=pSearch->Frequency;
		pParams->Mode = pSearch->Mode;
		pParams->Guard = pSearch->Guard;
		//pParams->Inv= pSearch->Inv;
		pParams->Force=pSearch->Force + ChipGetField(pParams->hDemod,FORCE)*2;
		pParams->ChannelBW = pSearch->ChannelBW; 
		pParams->IF_IQ_Mode= pSearch->IF_IQ_Mode;
		
		switch(pParams->IF_IQ_Mode)
		{
			
			case 0:  /* Normal IF mode */ 
				ChipSetField(pParams->hDemod,TUNER_BB,0);  
				ChipSetField(pParams->hDemod,LONGPATH_IF,0); 
				ChipSetField(pParams->hDemod,INV_SPECTR,1);
			break;
			
			case 1:  /* Long IF mode */ 
				ChipSetField(pParams->hDemod,TUNER_BB,0);
				ChipSetField(pParams->hDemod,LONGPATH_IF,1); 
				ChipSetField(pParams->hDemod,INV_SPECTR,0);
			break;
			
			case 2:  /* IQ mode */
				ChipSetField(pParams->hDemod,TUNER_BB,1);
				ChipSetField(pParams->hDemod,PMC2_SWAP,1);
			break;
		
		}
		
	
			if(pParams->IF_IQ_Mode!=0)
		{
			 FE_362_AGC_IIR_LOCK_DETECTOR_SET(pParams->hDemod);
			
			 FE_362_IIR_FILTER_INIT(pParams->hDemod,pParams->ChannelBW);  
			 
			 FE_362_AGC_IIR_RESET(pParams->hDemod); 
			 
			 
		}
		
	
		
		//#ifndef HOST_PC
		if (pParams->ChannelBW == STTUNER_CHAN_BW_6M) 
		{
			ChipSetFieldImage(pParams->hDemod,GAIN_SRC_HI,M6_F_GAIN_SRC_HI); 
			ChipSetFieldImage(pParams->hDemod,GAIN_SRC_LO,M6_F_GAIN_SRC_LO); 
			ChipSetRegisters(pParams->hDemod,R_GAIN_SRC1,2); 
			ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_LSB,M6_F_TRL_NOMRATE0);
			ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_LO,M6_F_TRL_NOMRATE8_1); 
			ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_HI,M6_F_TRL_NOMRATE16_9); 
			ChipSetRegisters(pParams->hDemod,R_TRL_CTL,3);
		}
		else if (pParams->ChannelBW == STTUNER_CHAN_BW_7M) 
		{
		
		
			ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_LSB,M7_F_TRL_NOMRATE0);
			ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_LO,M7_F_TRL_NOMRATE8_1); 
			ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_HI,M7_F_TRL_NOMRATE16_9); 
			ChipSetRegisters(pParams->hDemod,R_TRL_CTL,3);
			if (pParams->IF_IQ_Mode==0)
			{
				ChipSetFieldImage(pParams->hDemod,GAIN_SRC_HI,M7_GAIN_SRC_HI); 
				ChipSetFieldImage(pParams->hDemod,GAIN_SRC_LO,M7_GAIN_SRC_LO); 
				ChipSetRegisters(pParams->hDemod,R_GAIN_SRC1,2); 
			}
			else
			{
			  	ChipSetFieldImage(pParams->hDemod,GAIN_SRC_HI,M7_E_GAIN_SRC_HI); 
				ChipSetFieldImage(pParams->hDemod,GAIN_SRC_LO,M7_E_GAIN_SRC_LO); 
				ChipSetRegisters(pParams->hDemod,R_GAIN_SRC1,2); 
			}
		}
		else /* Channel Bandwidth = 8M) */
		{
			
				ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_LSB,M8_F_TRL_NOMRATE0);
				ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_LO,M8_F_TRL_NOMRATE8_1); 
				ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_HI,M8_F_TRL_NOMRATE16_9); 
				ChipSetRegisters(pParams->hDemod,R_TRL_CTL,3);
			if (pParams->IF_IQ_Mode==0)
			{
				ChipSetFieldImage(pParams->hDemod,GAIN_SRC_HI,M8_GAIN_SRC_HI); 
				ChipSetFieldImage(pParams->hDemod,GAIN_SRC_LO,M8_GAIN_SRC_LO); 
				ChipSetRegisters(pParams->hDemod,R_GAIN_SRC1,2); 
			}
			else
			{
				ChipSetFieldImage(pParams->hDemod,GAIN_SRC_HI,M8_E_GAIN_SRC_HI); 
				ChipSetFieldImage(pParams->hDemod,GAIN_SRC_LO,M8_E_GAIN_SRC_LO); 
				ChipSetRegisters(pParams->hDemod,R_GAIN_SRC1,2); 
			}
		}
	
			
		pParams->EchoPos   = pSearch->EchoPos;
		ChipSetField(pParams->hDemod,LONG_ECHO,pParams->EchoPos);
	
	
		TunerSetFrequency(pParams->hTuner,pParams->Frequency);
		pParams->Frequency = TunerGetFrequency(pParams->hTuner); 
	
	
		ChipSetField(pParams->hDemod,VTH0,0x1E);
		ChipSetField(pParams->hDemod,VTH1,0x14);
		ChipSetField(pParams->hDemod,VTH2,0xF);
		ChipSetField(pParams->hDemod,VTH3,0x9);
		ChipSetField(pParams->hDemod,VTH4,0x0);
		ChipSetField(pParams->hDemod,VTH5,0x5);

		ChipSetOneRegister(pParams->hDemod,R_PR,0xAF);
		ChipSetOneRegister(pParams->hDemod,R_VSEARCH,0x30);
		ChipSetField(pParams->hDemod,FORCE,(pParams->Force & 1) );
		ChipSetField(pParams->hDemod,FRAPTCR,1);
	
		#if 0
		if  (pParams->Inv == STTUNER_INVERSION_NONE)
	
					ChipSetField(pParams->hDemod,INV_SPECTR,1);					
	
		else if  (pParams->Inv == STTUNER_INVERSION) 									
	
						ChipSetField(pParams->hDemod,INV_SPECTR,0);					
				
		else if (pParams->Inv == STTUNER_INVERSION_AUTO) 									
				{
				
					if (pParams->Sense==1) ChipSetField(pParams->hDemod,INV_SPECTR,0);
					else ChipSetField(pParams->hDemod,INV_SPECTR,1); 
				}
		else if ( (pParams->Inv == STTUNER_INVERSION_UNK) && (!pParams->first_lock))
				{
					if (pParams->Sense==1) ChipSetField(pParams->hDemod,INV_SPECTR,0);
					else ChipSetField(pParams->hDemod,INV_SPECTR,1); 					
				}
	
		#endif
	   /*********************************/
		if(FE_362_Algo(pParams) == LOCKOK)
		{
			pResult->Locked = TRUE;
			
			/* update results */
						
			
			/***********  dans search term auparavant **********/
			ChipGetRegisters(pParams->hDemod,R_TPS_RCVD2,3);
			ChipGetRegisters(pParams->hDemod,R_SYR_STAT,1);				
			pResult->Mode=ChipGetFieldImage(pParams->hDemod,SYR_MODE);
			pResult->Guard=ChipGetFieldImage(pParams->hDemod,SYR_GUARD);
			constell = ChipGetFieldImage(pParams->hDemod,TPS_CONST);
			if (constell == 0) pResult->Modulation = STTUNER_MOD_QPSK;
			else if (constell==1) pResult->Modulation= STTUNER_MOD_16QAM;
			else pResult->Modulation= STTUNER_MOD_64QAM;
		
			pResult->hier  =ChipGetFieldImage(pParams->hDemod,TPS_HIERMODE);
			pResult->HPRate=ChipGetFieldImage(pParams->hDemod,TPS_HPCODE);
			pResult->LPRate=ChipGetFieldImage(pParams->hDemod,TPS_LPCODE);
			constell = ChipGetField(pParams->hDemod,PR);
			if (constell==5)	constell = 4;
			pResult->pr = (FE_362_Rate_t) constell;

			pResult->Sense=ChipGetField(pParams->hDemod,INV_SPECTR);
		
			/* dcdc modifs per Gilles*/
			pResult->hTuner=pParams->hTuner;
			pParams->first_lock=1;
			/* modifs Tuner */
		
			ChipGetRegisters(pParams->hDemod,R_AGC2MAX,6);
			pResult->Agc_val=	(ChipGetFieldImage(pParams->hDemod,AGC1_VAL_LO)<<16) 	+  
								(ChipGetFieldImage(pParams->hDemod,AGC1_VAL_HI)<<24) +
								ChipGetFieldImage(pParams->hDemod,AGC2_VAL_LO) +  
								(ChipGetFieldImage(pParams->hDemod,AGC2_VAL_HI)<<8);
			//signvalue=ChipGetField(pParams->hDemod,SEXT);
			
			/***** MODIF for 362 ***************/
			signvalue=ChipGetField(pParams->hDemod,ChipGetOneRegister(pParams->hDemod,R_CRL_FREQ3)&0x80); 
			/*********END OF MODIF*******************************/
            offset=ChipGetOneRegister(pParams->hDemod,R_CRL_FREQ3);
            offset <<=16;
            offsetvar=ChipGetOneRegister(pParams->hDemod,R_CRL_FREQ2);
            offsetvar <<=8;
            offset = offset | offsetvar;
            offsetvar=0;
            offsetvar=ChipGetOneRegister(pParams->hDemod,R_CRL_FREQ1);
            offset =offset | offsetvar ;
            if(signvalue==1)
            {
               offset |=0xff000000;
            }
            offset =offset /16384;
            if(pResult->Mode==0)
            {
               /*******it is 2k mode***************/
               offset=offset*4464/1000/*4.464*/;/*** 1 FFT BIN=4.464khz***/
             
               if(((offset>=140) && (offset<=180)) ||((offset<=-140) && (offset>=-180)))
               {
                  pParams->Frequency+=offset;
                         
               }
                  
               pResult->Frequency=pParams->Frequency;
                      
             }
             else
             {
             
                offset=offset*11/10/*1.1*/;/*** 1 FFT BIN=1.1khz***/
       
                if(((offset>=140) && (offset<=180)) ||((offset<=-140) && (offset>=-180)))
                {
                    pParams->Frequency+=offset;
                         
                 }
                 pResult->Frequency=pParams->Frequency;	
              }
                    
			pResult->Echo_pos=ChipGetField(pParams->hDemod,LONG_ECHO);
	
			/* fine tuning of timing offset if required */
			ChipGetRegisters(pParams->hDemod,R_TRL_CTL,5);
			timing_offset=ChipGetFieldImage(pParams->hDemod,TRL_TOFFSET_LO) + 256*ChipGetFieldImage(pParams->hDemod,TRL_TOFFSET_HI);
			if (timing_offset>=32768) timing_offset-=65536;
		/*	timing_offset=(timing_offset+10)/20; */ /* rounding */
			trl_nomrate=  (512*ChipGetFieldImage(pParams->hDemod,TRL_NOMRATE_HI)+ChipGetFieldImage(pParams->hDemod,TRL_NOMRATE_LO)*2 + ChipGetFieldImage(pParams->hDemod,TRL_NOMRATE_LSB));

			timing_offset=((signed)(1000000/trl_nomrate)*timing_offset)/2048;
	
			if (timing_offset<=0) 
				{
				timing_offset=(timing_offset-11)/22;
				step=-1;
				}
			else
				{
				timing_offset=(timing_offset+11)/22;
				step=1;
				}
			for (counter=0;counter<abs(timing_offset);counter++)
				{
					trl_nomrate+=step;
					ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_LSB,trl_nomrate%2);
					ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_LO,trl_nomrate/2);
					ChipSetRegisters(pParams->hDemod,R_TRL_CTL,2);
					WAIT_N_MS(1);
				}
#if (0)
			/* to be removed*/
			ChipSetField(DEMOD,CORE_ACTIVE,0);
			Delay(0.002);
			ChipSetField(DEMOD,CORE_ACTIVE,1);
#endif					
					
					
			}
			else
			{
				pResult->Locked = FALSE;
				error = FE_SEARCH_FAILED;
			}
				
		}
		else
			error = FE_BAD_PARAMETER;
	
	
	return error;
}


/*****************************************************
--FUNCTION	::	FE_362_Term
--ACTION	::	Terminate STV0362 chip connection
--PARAMS IN	::	Handle	==>	Front End Handle
--PARAMS OUT::	NONE
--RETURN	::	Error (if any)
--***************************************************/
FE_362_Error_t	FE_362_Term(FE_362_Handle_t	Handle)
{
	
	
FE_362_Error_t error = FE_NO_ERROR;
FE_362_InternalParams_t *pParams = NULL;

	#ifdef CHIP_STAPI                   /* pass other STAPI specific parameters to this driver */
	ST_Partition_t     *MemoryPartition;  /* memory for dynamic allocation */
	pParams = (FE_362_InternalParams_t *) Handle;

	if(pParams != NULL)
	{

	
    /* pass other STAPI specific parameters to this driver */
	MemoryPartition = pParams->hDemod->MemoryPartition;  /* GJP */
	if(ChipClose(pParams->hDemod) == CHIPERR_NO_ERROR) 
	{
	memory_deallocate(MemoryPartition, pParams);
	}
	else
	{
	error = FE_TERM_FAILED;
	}

	}
	else
	error = FE_INVALID_HANDLE;
	#else
	free(pParams);
	#endif

return error;

	
}

#ifdef HOST_PC
void FE_362_Core_Switch(STCHIP_Handle_t hChip)
{
ChipSetField(hChip,CORE_ACTIVE,0);
ChipSetField(hChip,CORE_ACTIVE,1);
WAIT_N_MS(350);
return;
}
#endif


/*----------------------------------------------------
FUNCTION      GetNoiseEstimator (18Oct01) 
ACTION
PARAMS IN
PARAMS OUT
RETURN
------------------------------------------------------*/
void FE_362_GetNoiseEstimator(STCHIP_Handle_t hChip, U32 *pNoise, U32 *pBer)
{
short unsigned int  source,prf;
U32                 quoz,error;
U32 snr=0;

error  = ChipGetField(hChip,ERROR_COUNT1_LO);
error += ChipGetField(hChip,ERROR_COUNT1_HI) * 256; 
error  = error*100;

quoz=1;
if (!ChipGetField(hChip,ERRMODE1))
{
source=ChipGetField(hChip,ERR_SOURCE1); 
quoz=PowOf2(12+2*(ChipGetField(hChip,NUM_EVENT1)));

switch (source)
{
case 0:
quoz=quoz*8;
prf=ChipGetField(hChip,PR);

switch(prf)
{
case 0:
error=(U32)(error*(1.0/2.0)); /*gbgbcast*/ 
break;

case 1:
error=(U32)(error*(2.0/3.0)); /*gbgbcast*/ 
break;

case 2:
error=(U32)(error*(3.0/4.0)); /*gbgbcast*/ 
break;

case 3:
error=(U32)(error*(5.0/6.0)); /*gbgbcast*/ 
break;

case 4:
error=(U32)(error*(6.0/7.0)); /*gbgbcast*/
break;

case 5:
error=(U32)(error*(7.0/8.0)); /*gbgbcast*/ 
break;

default:
error=error;
break;

}
break;

case 1:
quoz=quoz*8;
break;

case 2:
break;

case 3:
error=error*188;
break;

default:
error=error;
break;
}
}

snr=ChipGetField(hChip,CHC_SNR);
/*snr = ChipGetFieldImage(hChip,CHC_SNR);*/

/**pNoise = (snr*10) >> 3;*/
/**  fix done here for the bug GNBvd20972 where pNoise is calculated in right percentage **/
*pNoise=((snr/8)*100)/32;
*pBer   = error*(100000000/quoz);

return;
}



				
/*****************************************************
**FUNCTION	::	FE_299_SetInternalError
**ACTION	::	Set the internal error value and location 
**PARAMS IN	::	Type		==> Type of the error
**				Location	==> Location of the error
**PARAMS OUT::	pError
**RETURN	::	NONE
*****************************************************/

STCHIP_Error_t STV362_RepeaterFn(STCHIP_Handle_t hChip,BOOL State)
{
	STCHIP_Error_t error = CHIPERR_NO_ERROR;
	
	if(hChip != NULL)
	{
		if(State == TRUE)
			{
			ChipSetField(hChip,STOP_ENABLE,1);
			ChipSetField(hChip,I2CT_ON,1);
			}
	}
	
	return error;
}

FE_362_SignalStatus_t FE_362_CheckData2(FE_362_Handle_t	Handle)
{    
	int lock;
	FE_362_InternalParams_t	*pParams = NULL;  
	pParams = (FE_362_InternalParams_t	*) Handle;	
	pParams->State = NOLOCK;

	if(pParams != NULL)
	{
		lock = ChipGetField(pParams->hDemod,LK);							/*	Read DATA LOCK indicator	*/

		if(lock)											/*	Test DATA LOCK indicator	*/
			pParams->State = LOCKOK;
	}	
	return pParams->State;
}

⌨️ 快捷键说明

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