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

📄 drv0299.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
            Drv0299_CheckData(Params);
        break;
        
        case STTUNER_IQ_MODE_INVERTED:

            Drv0299_IQSet(1);     /* Set to Inverted */

            Drv0299_CheckData(Params);
            
        break;
        case STTUNER_IQ_MODE_AUTO:
            
            if (Drv0299_CheckData(Params) == E299_NODATA) /* Check for data */
            {
                Drv0299_IQInvertion();       /* Invert I and Q */
                
                if(Drv0299_CheckData(Params) == E299_NODATA)    /* Check for data */
                {
                    Drv0299_IQInvertion();   /* Invert I and Q */
                }
            }
            
        break;
        default:
            #ifdef STTUNER_DEBUG_MODULE_SATDRV_DRV0299
                STTBX_Print(("%s Drv0299 SearchData inavlid IQ Mode\n"));
            #endif
        break;

    }
   
    return(Params->State);
}

D0299_SignalType_t Drv0299_SearchData(D0299_SearchParams_t *Params)
{
    short int DerotFreq;
    short int DerotStep;
    short int DerotLimit;
    short int NextLoop = 2;
    int  index = 0;
    U8 nsbuffer[2];
    long CurrentFreq;
    U8 Data;
    DerotStep  = (short int)( (Params->SymbolRate/4L) / Params->Mclk); /* cast to eliminate compiler warning --SFS */
    DerotLimit = (short int)( (Params->SubRange/2L)   / Params->Mclk); /* cast to eliminate compiler warning --SFS */
    DerotFreq  = Params->DerotFreq;
    CurrentFreq = Params->Frequency + ( ((long)(DerotFreq)) * Params->Mclk)/1000;
    do
    {
        if((Params->State != E299_CARRIEROK)||(Drv0299_Searchlock(Params)!=E299_DATAOK))
        {
        	index++;
        	DerotFreq   = DerotFreq + ((int)Params->TunerIQSense * index * Params->Direction * DerotStep);   /* Compute the next derotator position for the zig zag */
	        
            if(MAC0299_ABS(DerotFreq) > DerotLimit) NextLoop--;
            
            if(NextLoop)
            {
                Data = 1;
                STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R0299_CFD, F0299_CFD_ALGO, F0299_CFD_ALGO_L, &Data, 1, FALSE);
                nsbuffer[1] = MAC0299_LSB(DerotFreq);
    	        nsbuffer[0] = MAC0299_MSB(DerotFreq);
    	        STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R0299_CFRM, 0, 0, nsbuffer, 2, FALSE);
    	        SystemWaitFor(5);
    	        Drv0299_CheckCarrier(Params);
            }
	}
        Params->Direction = -Params->Direction; /* Change the zigzag direction */
    }
    while((Params->State != E299_DATAOK) && NextLoop);


    if(Params->State == E299_DATAOK)
    {
       STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R0299_CFRM, 0, 0, nsbuffer, 2, FALSE);
        /* Multiply DerotFreq with IQ wiring sense of tuner & Demod */
        Params->DerotFreq = (short int)Params->TunerIQSense * (short int)MAC0299_MAKEWORD( nsbuffer[0],nsbuffer[1] );
    }
    
    return(Params->State);
    
}


D0299_SignalType_t Drv0299_CheckRange(D0299_SearchParams_t *Params)
{
	int	RangeOffset;
	int	TransponderFrequency;

	
    RangeOffset =          (int)(Params->SearchRange / 2000);  /* cast to eliminate compiler warning --SFS */
    TransponderFrequency = (int)(Params->Frequency + (Params->DerotFreq * Params->Mclk)/1000); /* cast to eliminate compiler warning --SFS */

	if( (TransponderFrequency >= Params->Frequency - RangeOffset) &&
        (TransponderFrequency <= Params->Frequency + RangeOffset) )
        Params->State = E299_RANGEOK;
    else
        Params->State = E299_OUTOFRANGE;

	return(Params->State);
}

#endif

#ifndef STTUNER_MINIDRIVER
/*----------------------------------------------------
 FUNCTION        CheckRange
 ACTION        Check if the founded frequency is in the correct range
 PARAMS IN        Params->BaseFreq =>
 PARAMS OUT    Params->State    =>    Result of the check
 RETURN        E299_RANGEOK if check success, E299_OUTOFRANGE otherwise
------------------------------------------------------*/
D0299_SignalType_t Drv0299_CheckRange(D0299_SearchParams_t *Params, D0299_Searchresult_t *Result)
{
	int	RangeOffset;
	int	TransponderFrequency;

	
    RangeOffset =          (int)(Params->SearchRange / 2000);  /* cast to eliminate compiler warning --SFS */
    TransponderFrequency = (int)(Params->Frequency + (((long)(Params->DerotFreq)) * Params->Mclk)/1000); /* cast to eliminate compiler warning --SFS */

	if( (TransponderFrequency >= Params->BaseFreq - RangeOffset) &&
        (TransponderFrequency <= Params->BaseFreq + RangeOffset) )
        Params->State = E299_RANGEOK;
    else
        Params->State = E299_OUTOFRANGE;

	return(Params->State);
}

/*----------------------------------------------------
 FUNCTION      CarrierNotCentered
 ACTION        Check if the carrier is correctly centered
 PARAMS IN 
 PARAMS OUT
 RETURN        1 if not centered, 0 otherwise
------------------------------------------------------*/
int Drv0299_CarrierNotCentered(STTUNER_IOREG_DeviceMap_t *DeviceMap, D0299_SearchParams_t *Params, int AllowedOffset)
{
    int Fs;
    int DerotFreq;
    int NotCentered = 0;

    Fs = (int)(Drv0299_CarrierWidth(Params->SymbolRate, Params->RollOff));  /* cast to eliminate compiler warning --SFS */

    DerotFreq = MAC0299_ABS( (int)Params->DerotFreq * (int)Params->Mclk );  /* cast with macro to eliminate compiler warning --SFS */

    if( (Params->TunerIF == 0) && (Fs < 4000000) )
        NotCentered = (int)( (Params->TunerBW - Fs) / 4);   /* cast to eliminate compiler warning --SFS */

    else
        NotCentered = (( (int)Params->TunerBW/2 - DerotFreq - Fs/2) < AllowedOffset) &&
                         (DerotFreq > Params->TunerStep);  /* cast to eliminate compiler warning --SFS */

    return(NotCentered);
}



/*----------------------------------------------------
 FUNCTION      TunerCentering
 ACTION        Optimisation of the tuner position to allow frequency variations
 PARAMS IN     Params
 PARAMS OUT    Result
 RETURN        E299_DATAOK if success
------------------------------------------------------*/
D0299_SignalType_t Drv0299_TunerCentering(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, D0299_SearchParams_t *Params, D0299_Searchresult_t *Result, int AllowedOffset,STTUNER_Handle_t TopLevelHandle )
{
    int	DerotFreq, MinOffset/*, MaxOffset*/;
    int	CentringFrequency;
    int	TransponderFrequency;
    int	Fs, sign;
    U8 Derottemp[2];
    ST_ErrorCode_t Error;
    STTUNER_InstanceDbase_t *Inst;
    STTUNER_tuner_instance_t *TunerInstance;
    

    /* top level public instance data */ 
    Inst = STTUNER_GetDrvInst();

    /* get the tuner instance for this driver from the top level handle */
    TunerInstance = &Inst[TopLevelHandle].Sat.Tuner;    
    
    Fs = (int)Drv0299_CarrierWidth(Params->SymbolRate, Params->RollOff);    /* cast to eliminate compiler warning --SFS */
    DerotFreq = MAC0299_ABS( (int)Params->DerotFreq * (int)Params->Mclk );  /* cast to eliminate compiler warning --SFS */

    if((Params->TunerIF == 0) && (Params->SymbolRate <= 6000000))
		MinOffset = CARRIEROFFSET;
	else
		MinOffset = 0;
	
	/*MaxOffset = MAC0299_MAX( (int)(Params->TunerBW)/2 - Fs/2- AllowedOffset , MinOffset + (int)(Params->TunerStep) );*/   /* casts to eliminate compiler warning --SFS */

	/* Do tuner retuning if derotator frequency offset is more than 1MHz */
	if( ((DerotFreq >= 1000000) && (Params->SymbolRate > 6000000))  /*|| (Drv0299_CheckData(DeviceMap, IOHandle, Params) != E299_DATAOK)*/ )
	{
		sign = (Params->DerotFreq > 0) ? 1: -1; 
		TransponderFrequency = (int)(Params->Frequency + (Params->DerotFreq * Params->Mclk)/1000);  /* cast to eliminate compiler warning --SFS */
		CentringFrequency    = TransponderFrequency + MinOffset;
		
        Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, CentringFrequency, (U32 *)&CentringFrequency);
 
        Drv0299_WaitTuner(TunerInstance, 100); /*	Is tuner Locked	? (wait 100 ms maxi) */

		/* Reset Derotator	*/
		Params->DerotFreq = (short int)Params->TunerIQSense * (short int)(((TransponderFrequency - CentringFrequency)*1000)/(int)Params->Mclk); /* casts to eliminate compiler warning --SFS */
		Params->Frequency = CentringFrequency;
		Params->Direction = 1;

		Derottemp[0]= MAC0299_MSB(Params->DerotFreq);
	        Derottemp[1]= MAC0299_LSB(Params->DerotFreq);
	        STTUNER_IOREG_SetContigousRegisters(DeviceMap,IOHandle, R0299_CFRM,Derottemp, 2); 
			
        /* Wait for agc1,agc2 and timing loop */ 
        SystemWaitFor(Params->Tagc1 + Params->Tagc2 + Params->Ttiming);

        /* Search for carrier */  
	if ( Drv0299_SearchCarrier(DeviceMap, IOHandle, Params, Result, TopLevelHandle) == E299_CARRIEROK )
        {
            Drv0299_SearchData(DeviceMap, IOHandle, Params, Result, TopLevelHandle); /* Search for data */ 
        }
	}

	return(Params->State);
}



/*----------------------------------------------------
 FUNCTION      FirstSubRange
 ACTION        Compute the first SubRange of the search
 PARAMS IN     Params->SearchRange
 PARAMS OUT    Params->SubRange
 RETURN        NONE
------------------------------------------------------*/
D0299_SignalType_t Drv0299_FirstSubRange(D0299_SearchParams_t *Params)
{
        Params->SubRange    = MAC0299_MIN(Params->SearchRange,9000000);/* fix to 9MHz to ensure signal not to get out from tuner BW*/
	Params->Frequency   = Params->BaseFreq;
	Params->TunerOffset = 0L;
	Params->SubDir      = 1; 

	if( Params->TunerBW > Drv0299_CarrierWidth(Params->SymbolRate, Params->RollOff)/2 )/* to give support for 30Msym/sec symbol rate and solve bug GNBvd17144*/
	Params->State = E299_BWOK;
        else
        Params->State = E299_BWTOONARROW;

        return(Params->State);
}


 #endif
/*----------------------------------------------------
 FUNCTION      NextSubRange
 ACTION        Compute the next SubRange of the search
 PARAMS IN     Frequency    ->    Start frequency
                 Params->SearchRange
 PARAMS OUT    Params->SubRange
 RETURN        NONE
------------------------------------------------------*/
void Drv0299_NextSubRange(D0299_SearchParams_t *Params)
{
    long OldSubRange;

    if(Params->SubDir > 0)
    {
        OldSubRange = Params->SubRange;
        Params->SubRange = MAC0299_MIN( (Params->SearchRange/2) - (Params->TunerOffset + Params->SubRange/2)  ,  Params->SubRange);
        Params->TunerOffset = Params->TunerOffset + ( (OldSubRange + Params->SubRange)/2 );
     }

    Params->Frequency =  Params->BaseFreq + (Params->SubDir * Params->TunerOffset)/1000;
    Params->SubDir    = -Params->SubDir;
}
#ifndef STTUNER_MINIDRIVER
/* This define is to remain commented out as it is used as an internal test */
/* #define STTUNER_TEST_SEARCH_MODULE_SATDRV_DRV0299 1 */

/*----------------------------------------------------
 FUNCTION      AutoSearchAlgo
 ACTION        Search for Signal, Timing, Carrier and then data at a given Frequency,
                 in a given range
 PARAMS IN     NONE
 PARAMS OUT    NONE
 RETURN        Type of the founded signal (if any)
 
 Note: Drv0299_CheckAgc( ) removed, no need because different tuners have different sensitivity
------------------------------------------------------*/
D0299_SignalType_t Drv0299_AutoSearchAlgo(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, D0299_StateBlock_t *StateBlock, STTUNER_Handle_t TopLevelHandle)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_DRV0299
   const char *identity = "STTUNER drv0299.c Drv0299_AutoSearchAlgo()";
#endif
    int errorrate, sn, to, hy;
    D0299_SearchParams_t *Params;
    D0299_Searchresult_t *Result;
    ST_ErrorCode_t Error;
#ifdef STTUNER_DEBUG_MODULE_SATDRV_DRV0299
    U32 Fold;
#endif
    STTUNER_InstanceDbase_t *Inst;
    STTUNER_tuner_instance_t *TunerInstance; 
    TUNSDRV_InstanceData_t *Instance;  
    long TransponderFreq;
    U8 Derottemp[2];
    U8 PRCopy , VsearchCopy;
    
    /* top level public instance data */ 
    Inst = STTUNER_GetDrvInst();

    /* get the tuner instance for this driver from the top level handle */
    TunerInstance = &Inst[TopLevelHandle].Sat.Tuner;
    Instance = TUNSDRV_GetInstFromHandle(TunerInstance->DrvHandle);
    
    Params = &StateBlock->Params;
    Result = &StateBlock->Result;
    Instance->SymbolRate = (U32)Params->SymbolRate;
    Params->BaseFreq = Params->Frequency;
   
   
     /*The following setting is dependent on Symbol Rate*/
   
    /* Values are freezed after tests done in SKY Italia Lab */
     if((Params->SymbolRate>=5000000) && (Params->SymbolRate<=45000000))
     {
	    STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R0299_ACLC, 0x99);
	    STTUNER_IOREG_SetField(DeviceMap, IOHandle, F0299_BETA_CAR, 0x17); 
	 }
     else if((Params->SymbolRate>=1000000) && (Params->SymbolRate<=5000000))
     {
	    STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R0299_ACLC, 0x9B);
	    STTUNER_IOREG_SetField(DeviceMap, IOHandle, F0299_BETA_CAR, 0x13);
	 }
	 
	 
     if(Params->SymbolRate < 2000000)
     STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0299_AGC1_REF, 0x10);
     else
     STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0299_AGC1_REF, 0x14);
	            
    /*PRCopy = STTUNER_IOREG_GetRegister(DeviceMap, IOHandle, R0299_PR);*/
    VsearchCopy = STTUNER_IOREG_GetRegister(DeviceMap, IOHandle, R0299_VSEARCH);

    /*    Get fields value    */
    sn        = STTUNER_IOREG_FieldExtractVal(VsearchCopy, F0299_SN);
    to        = STTUNER_IOREG_FieldExtractVal(VsearchCopy, F0299_TO);
    hy        = STTUNER_IOREG_FieldExtractVal(VsearchCopy, F0299_H);
    errorrate = STTUNER_IOREG_GetRegister(DeviceMap, IOHandle, R0299_PR);


    Params->DerotStep = (short int)(Params->DerotPercent * (Params->SymbolRate/1000L) / Params->Mclk);                  /* sa

⌨️ 快捷键说明

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