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

📄 drv0899.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
/* -------------------------------------------------------------------------
File Name: drv0899.c

History:
Description: STb0899 driver LLA	V1.0.8 17/01/2005

Date 18/04/05
Comments: LLA2.0.0 integration
author: SD

Date 22/06/05
Comments: LLA V3.0.3 integration
author: SD

Date 29/03/06
Comments: LLA V3.6.0 integration
author: SD

---------------------------------------------------------------------------- */


/* includes ---------------------------------------------------------------- */
#ifdef ST_OSLINUX
   #include "stos.h"
#else
#include "string.h"
#include "stdlib.h"
#endif
	
	/*	STB0899 includes	*/
#include "drv0899.h"
#include "d0899_util.h"
#include "d0899_dvbs2util.h"
#include "dbtypes.h"
#include "sysdbase.h"
#include "d0899.h"
#include "mtuner.h"
#include "tunsdrv.h"
extern TUNSDRV_InstanceData_t *TUNSDRV_GetInstFromHandle(TUNER_Handle_t Handle);

#define MULT32X32(a,b) (((((long)((a)>>16))*((long)((b)>>16)))<<1) +((((long)((a)>>16))*((long)(b&0x0000ffff)))>>15) + ((((long)((b)>>16))*((long)((a)&0x0000ffff)))>>15))
#define angle_threshold 1042
#define LPDPC_MAX_ITER	70
static FE_STB0899_LOOKUP_t FE_STB0899_CN_LookUp =	{
								22,
								{   0,	10780,
									1,	10420,
									15,	10030,
									20,	9815,
									30,	9320,
									40,	8760,
									50,	8150,
									60,	7500,
									70,	6850,
									80,	6215,
									90,	5625,
									100,5080,
									110,4580,
									120,4140,
									130,3740,
									140,3390,
									150,3080,
									160,2800,
									170,2550,
									180,2330,
									190,2160,
									200,1995
								}
							};
											
static FE_STB0899_LOOKUP_t	FE_STB0899_RF_LookUp = 	{
							20,
								{
								-5, 79,
								-10, 73,
								-15, 67,
								-20, 62,
								-25, 56,
								-30, 49,
								-33, 44,
								-35, 40,
								-37, 36,
								-38, 33,
								-40, 27,
								-45, 4,
								-47, -11,
								-48, -19,
								-50, -29,
								-55, -43,
								-60, -52,
								-65, -61,
								-67, -65,
								-70, -128,
								}
							};
							
static FE_STB0899_LOOKUP_t	FE_STB0899_DVBS2RF_LookUp = 	{
							
								15,
									{
									-5, 2899,
									-10, 3330,
									-15, 3123,
									-20, 3577,
									-25, 4004,
									-30, 4417,
									-35, 4841,
									-40, 5300,
									-45, 5822,
									-50, 6491,
									-55, 7516,
									-60, 9235,
									-65, 11374,
									-70, 12364,
									-75, 13063,
									}
									};



static const ST_Revision_t RevisionSTB0899  = " STB0899-LLA_REL_3.6.0 ";
ST_Revision_t DrvSTB0899_GetLLARevision(void)
{
	return (RevisionSTB0899);
}
/*****************************************************
--FUNCTION	::	FE_STB0899_WaitTuner
--ACTION	::	Wait for tuner locked
--PARAMS IN	::	TimeOut	->	Maximum waiting time (in ms) 
--PARAMS OUT::	NONE
--RETURN	::	NONE
--***************************************************/
ST_ErrorCode_t FE_STB0899_WaitTuner(STTUNER_tuner_instance_t *TunerInstance, int TimeOut)
{
    int Time = 0;
    BOOL TunerLocked = FALSE;
    ST_ErrorCode_t Error;

    while(!TunerLocked && (Time < TimeOut))
    {
        WAIT_N_MS_899(1);
        Error = (TunerInstance->Driver->tuner_IsTunerLocked)(TunerInstance->DrvHandle, &TunerLocked);
        if(Error != ST_NO_ERROR)
        return Error;
        Time++;
    }
    Time--;
    
    return Error;
}

/*****************************************************
**FUNCTION	::	FE_STB0899_F22Freq
**ACTION	::	Compute F22 frequency 
**PARAMS IN	::	DigFreq	==> Frequency of the digital synthetizer (Hz)
**				F22		==> Content of the F22 register
**PARAMS OUT::	NONE
**RETURN	::	F22 frequency
*****************************************************/
U32 FE_STB0899_F22Freq(U32 DigFreq,U32 F22)
{
	return (F22!=0) ? (DigFreq/(32*F22)) : 0; 
}

/*****************************************************
--FUNCTION	::	FE_STB0899_CheckTiming
--ACTION	::	Check for timing locked
--PARAMS IN	::	Params->Ttiming	=>	Time to wait for timing loop locked
--PARAMS OUT::	Params->State		=>	result of the check
--RETURN	::	NOTIMING_899 if timing not locked, TIMINGOK otherwise
--***************************************************/
FE_STB0899_SIGNALTYPE_t FE_STB0899_CheckTiming(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_STB0899_InternalParams_t *Params)
{
	int locked,
		timing;
			
	WAIT_N_MS_899(Params->Ttiming);     
	STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_TIMING_LOOP_FREQ,FSTB0899_TIMING_LOOP_FREQ_INFO, 0xf2);
	locked=STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_TMG_LOCK_IND, FSTB0899_TMG_LOCK_IND_INFO);
	timing=abs(STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_TIMING_LOOP_FREQ, FSTB0899_TIMING_LOOP_FREQ_INFO));
	
	if(locked >= 42)
	{
		if((locked > 48) && (timing >= 110))
			Params->State = ANALOGCARRIER_899; 
		else 
			Params->State = TIMINGOK_899;   
	}
	else									  
		Params->State = NOTIMING_899; 	

	return Params->State;
}


/*****************************************************
--FUNCTION	::	FE_STB0899_CheckCarrier
--ACTION	::	Check for carrier founded
--PARAMS IN	::	Params		=>	Pointer to FE_STB0899_InternalParams_t structure
--PARAMS OUT::	Params->State	=> Result of the check
--RETURN	::	NOCARRIER carrier not founded, CARRIEROK_899 otherwise
--***************************************************/
FE_STB0899_SIGNALTYPE_t FE_STB0899_CheckCarrier(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_STB0899_InternalParams_t *Params)
{
	WAIT_N_MS_899(Params->Tderot);						/*	wait for derotator ok	*/    
	STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_CFD_ON, FSTB0899_CFD_ON_INFO,0);
	
	if (STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_CARRIER_FOUND,FSTB0899_CARRIER_FOUND_INFO))
		Params->State = CARRIEROK_899;
	else
		Params->State = NOCARRIER_899;
		
	return Params->State;
}

U32 FE_STB0899_GetErrorCount(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle ,ERRORCOUNTER Counter)
{
	U32 lsb,msb;
	
	/*Do not modified the read order (lsb first)*/
	switch(Counter)
	{
		case COUNTER1_899:
			lsb = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_ERROR_COUNT_LSB,FSTB0899_ERROR_COUNT_LSB_INFO);
			msb = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_ERROR_COUNT_MSB,FSTB0899_ERROR_COUNT_MSB_INFO);
		break;
	
		case COUNTER2_899:
			lsb = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle ,FSTB0899_ERROR_COUNT2_LSB,FSTB0899_ERROR_COUNT2_LSB_INFO);
			msb = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle ,FSTB0899_ERROR_COUNT2_MSB,FSTB0899_ERROR_COUNT2_MSB_INFO);	
		break;
		
		case COUNTER3_899:
			lsb = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle ,FSTB0899_ERROR_COUNT3_LSB,FSTB0899_ERROR_COUNT3_LSB_INFO);
			msb = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle ,FSTB0899_ERROR_COUNT3_MSB,FSTB0899_ERROR_COUNT3_MSB_INFO);
		break;
	}
	
	return (MAKEWORD(msb,lsb));
}


/*****************************************************
--FUNCTION	::	FE_STB0899_CheckData
--ACTION	::	Check for data founded
--PARAMS IN	::	Params		=>	Pointer to FE_STB0899_InternalParams_t structure    
--PARAMS OUT::	Params->State	=> Result of the check
--RETURN	::	NODATA data not founded, DATAOK_899 otherwise
--***************************************************/
FE_STB0899_SIGNALTYPE_t FE_STB0899_CheckData(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_STB0899_InternalParams_t *Params)
{
	int lock = 0,loopcount = 0,
	    index=0,
	    dataTime=500;
		
	Params->State = NODATA_899;   
	
	/* reset du FEC */
	STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_FRESACS,FSTB0899_FRESACS_INFO, 1);
	WAIT_N_MS_899(1);
	STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_FRESACS,FSTB0899_FRESACS_INFO, 0);  
	if(Params->SymbolRate <= 2000000)
		dataTime=2000;
	else if(Params->SymbolRate <= 5000000)
		dataTime=1500;
	else if(Params->SymbolRate <= 15000000)
		dataTime=1000;
	else
		dataTime=500;
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle, RSTB0899_DSTATUS2,0x00);	/* force search loop */
	
	 index = dataTime/10; 
	 do
	 {
	 	WAIT_N_MS_899(1);
     	++loopcount;
		
	 }
	 while(	!(STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_LOCKEDVIT,FSTB0899_LOCKEDVIT_INFO)) &&	/* warning : vit locked has to be tested before end_loop */ 
			!STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_END_LOOPVIT,FSTB0899_END_LOOPVIT_INFO) && 
			loopcount<index);
			
		/* wait for viterbi end loop */
	
	lock = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_LOCKEDVIT,FSTB0899_LOCKEDVIT_INFO);
	
	if (lock)									/*	Test DATA LOCK indicator	*/
	Params->State = DATAOK_899;
		
	return Params->State;
}

/*****************************************************
--FUNCTION	::	FE_STB0899_TimingTimeConstant
--ACTION	::	Compute the amount of time needed by the timing loop to lock
--PARAMS IN	::	SymbolRate	->	symbol rate value
--PARAMS OUT::	NONE
--RETURN	::	Timing loop time constant (ms)
--***************************************************/
long FE_STB0899_TimingTimeConstant(long SymbolRate)
{
	if(SymbolRate > 0)
		return (100000/(SymbolRate/1000));
	else
		return 0;
}

/*****************************************************
--FUNCTION	::	FE_STB0899_DerotTimeConstant
--ACTION	::	Compute the amount of time needed by the Derotator to lock
--PARAMS IN	::	SymbolRate	->	symbol rate value
--PARAMS OUT::	NONE
--RETURN	::	Derotator time constant (ms)
--***************************************************/
long FE_STB0899_DerotTimeConstant(long SymbolRate)
{
	if(SymbolRate > 0)  
		return (100000/(SymbolRate/1000)); 
	else
		return 0;
}

/*****************************************************
--FUNCTION	::	FE_STB0899_DataTimeConstant
--ACTION	::	Compute the amount of time needed to capture data 
--PARAMS IN	::	Er		->	Viterbi rror rate	
--				Sn		->  viterbi averaging period
--				To		->  viterbi time out
--				Hy		->	viterbi hysteresis
--				SymbolRate	->	symbol rate value
--PARAMS OUT::	NONE
--RETURN	::	Data time constant
--***************************************************/
long FE_STB0899_DataTimeConstant(int Er, int Sn,int To,int Hy,long SymbolRate)
{
	long	Tviterbi = 0,
			TimeOut	=0,
			THysteresis	= 0,
			PhaseNumber[6] = {2,6,4,6,14,8},
		 	averaging[4] = {1024L,4096L,16384L,65536L},
		 	InnerCode = 1000,
		 	HigherRate = 1000;
		 	
	int 	i;
		 	
	/*	=======================================================================
	-- Data capture time (in ms)
    -- -------------------------
	-- This time is due to the Viterbi synchronisation.
	--
	--	For each authorized inner code, the Viterbi search time is calculated,
	--	and the results are cumulated in ViterbiSearch.	*/
	for(i=0;i<6;i++)
	{
		if (((Er >> i)& 0x01) == 0x01)
		{
			switch(i)
			{
				case 0:					/*	inner code 1/2	*/	
					InnerCode = 2000;	/* 2.0 */
				break;
				
				case 1:					/*	inner code 2/3	*/ 
					InnerCode = 1500; 	/* 1.5 */
				break;
				
				case 2:					/*	inner code 3/4  */ 
					InnerCode = 1333;	/* 1.333 */
				break;
				

⌨️ 快捷键说明

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