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

📄 d0288.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
    /* private driver instance data */
    Instance = D0288_GetInstFromHandle(Handle);
    /*
    ** uData1 - FEC Mode Register
    ** 0 - DVB QPSK, 1 - DVB BPSK, 4 = DSS
    */
    uData1 = STTUNER_IOREG_GetField(&Instance->DeviceMap, Instance->IOHandle,F288_FECMODE);

    /*
    ** For each STTUNER FEC rates (see sttuner.h)
    ** Set specific bit of enable puncture rate register
    ** Bit 0 - 1/2, 1 - 2/3, 2 - 3/4, 3 - 5/6, 4 - 7/8(DVB) or 6/7(DSS)
    */
    if (FECRates & STTUNER_FEC_1_2) Data |= 1;
    if (FECRates & STTUNER_FEC_2_3) Data |= 2;
    if (FECRates & STTUNER_FEC_3_4) Data |= 4;
    if (FECRates & STTUNER_FEC_5_6) Data |= 8;
    if (FECRates & STTUNER_FEC_6_7) Data |= 16;
    if (FECRates & STTUNER_FEC_7_8) Data |= 32;
    
    Error = STTUNER_IOREG_SetRegister(&Instance->DeviceMap, Instance->IOHandle, R288_PR, Data);

    #ifdef STTUNER_DEBUG_MODULE_SATDRV_D0288
    STTBX_Print(("%s Field F0288_RATE = 0x%02x\n", identity, Data));
    #endif
    Error |= Instance->DeviceMap.Error;
    Instance->DeviceMap.Error = ST_NO_ERROR;
    
    return(Error);
}   
/* ----------------------------------------------------------------------------
Name: demod_d0288_Tracking()

Description:
    This routine checks the carrier against a certain threshold value and will
    perform derotator centering, if necessary -- using the ForceTracking
    option ensures that derotator centering is always performed when
    this routine is called.

    This routine should be periodically called once a lock has been
    established in order to maintain the lock.
    
Parameters:
    ForceTracking, boolean to control whether to always perform
                   derotator centering, regardless of the carrier.

    NewFrequency,  pointer to area where to store the new frequency
                   value -- it may be changed when trying to optimize
                   the derotator.

    SignalFound,   indicates that whether or not we're still locked
    
Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t demod_d0288_Tracking(DEMOD_Handle_t Handle, BOOL ForceTracking,    U32  *NewFrequency,  BOOL *SignalFound)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0288
   const char *identity = "STTUNER d0288.c demod_d0288_Tracking()";
#endif
    ST_ErrorCode_t Error = ST_NO_ERROR;

    STTUNER_tuner_instance_t *TunerInstance;    /* don't really need all these variables, done for clarity */
    STTUNER_InstanceDbase_t  *Inst;             /* pointer to instance database */
    STTUNER_Handle_t          TopHandle;        /* instance that contains the demos, tuner and lnb driver set */
    D0288_InstanceData_t     *Instance;
    TUNER_Status_t  TunerStatus; 
    U32  MasterClock, Mclk;
    FE_288_SignalInfo_t	pInfo;
    /* private driver instance data */
    Instance = D0288_GetInstFromHandle(Handle);
    /* top level public instance data */ 
    Inst = STTUNER_GetDrvInst();

    /* this driver knows what to level instance it belongs to */
    TopHandle = Instance->TopLevelHandle;

    /* get the tuner instance for this driver from the top level handle */
    TunerInstance = &Inst[TopHandle].Sat.Tuner;

    /*Drv0288_CarrierTracking(&Instance->DeviceMap, Instance->IOHandle, &Instance->StateBlock, TopHandle);*/

    Error  =  demod_d0288_IsLocked(Handle, SignalFound);
    /**NewFrequency = (U32)Instance->StateBlock.Result.Frequency;*/
    if((Error == ST_NO_ERROR) && (*SignalFound == TRUE))
    {
	    Error = (TunerInstance->Driver->tuner_GetStatus)(TunerInstance->DrvHandle, &TunerStatus);
	   
	    MasterClock = FE_288_GetMclkFreq(&Instance->DeviceMap, Instance->IOHandle,Instance->ExternalClock);
	   
	    Mclk = (U32)(MasterClock/65536L); 
	    Inst[TopHandle].CurrentTunerInfo.ScanInfo.SymbolRate = FE_288_GetSymbolRate(&Instance->DeviceMap, Instance->IOHandle, MasterClock);
	    FE_288_GetSignalInfo(&Instance->DeviceMap, Instance->IOHandle, &pInfo);
	    *NewFrequency = TunerInstance->realfrequency;
	    Inst[TopHandle].CurrentTunerInfo.BitErrorRate = pInfo.BER;
	    Inst[TopHandle].CurrentTunerInfo.SignalQuality = pInfo.CN_dBx10;
	    Inst[TopHandle].CurrentTunerInfo.ScanInfo.AGC = pInfo.Power_dBm;
	    Inst[TopHandle].CurrentTunerInfo.ScanInfo.FECRates = pInfo.Rate;
	    Inst[Instance->TopLevelHandle].CurrentTunerInfo.ScanInfo.IQMode=pInfo.SpectralInv;
	    Inst[TopHandle].CurrentTunerInfo.ScanInfo.Modulation = STTUNER_MOD_QPSK;
	    if(Instance->SET_TSCLOCK == TRUE)
	    {
	    	Instance->SET_TSCLOCK = FALSE;
            }
    }
   
     #ifdef STTUNER_DRV_SAT_SCR
        if((Inst[Instance->TopLevelHandle].Capability.SCREnable) && (Inst[Instance->TopLevelHandle].CurrentTunerInfo.ScanInfo.LNB_SignalRouting == STTUNER_VIA_SCRENABLED_LNB))
        {
        	*NewFrequency = Inst[Instance->TopLevelHandle].Sat.ScanInfo.Scan->ScrParams.SCRVCOFrequency - TunerInstance->realfrequency;
        }
       
     #endif
    
    if(Inst[TopHandle].Sat.Ioctl.SignalNoise == TRUE)
#ifndef ST_OSLINUX
    {
        {
            static BOOL SRand = TRUE;
            U32 r;

            if (SRand)
            {
                srand((unsigned int)time_now());
                SRand = FALSE;
            }

            /* Calculate percentage fluctuation from current position */
            r = rand() % 100;               /* Percent change */

            Inst[TopHandle].CurrentTunerInfo.SignalQuality -= (
                (((Inst[TopHandle].CurrentTunerInfo.SignalQuality << 7) * r) / 100) >> 7 );
	   /* Estimate ber from signal quality based on a linear relationship */
            Inst[TopHandle].CurrentTunerInfo.BitErrorRate = ( MAX_BER - (
                (Inst[TopHandle].CurrentTunerInfo.SignalQuality * MAX_BER) / 100 ));
        }
    }
      
#endif
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0288
    STTBX_Print(("%s SignalFound=%u NewFrequency=%u\n", identity, *SignalFound, *NewFrequency));
#endif
    
    /* GNBvd17801-> Error Handling for any error returned during I2C operation inside the driver */
    Error |= Instance->DeviceMap.Error;
    Instance->DeviceMap.Error = ST_NO_ERROR;
    return(Error);
}   
/* ----------------------------------------------------------------------------
Name: demod_d0288_ScanFrequency()

Description:
    This routine will attempt to scan and find a QPSK signal based on the
    passed in parameters.
    
Parameters:
    InitialFrequency, IF value to commence scan (in kHz).
    SymbolRate,       required symbol bit rate (in Hz).
    MaxLNBOffset,     maximum allowed LNB offset (in Hz).
    TunerStep,        Tuner's step value -- enables override of
                      TNR device's internal setting.
    DerotatorStep,    derotator step (usually 6).
    ScanSuccess,      boolean that indicates QPSK search success.
    NewFrequency,     pointer to area to store locked frequency.
    
Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t demod_d0288_ScanFrequency(DEMOD_Handle_t Handle, U32  InitialFrequency, U32   SymbolRate,    U32   MaxOffset, 
                                                                U32  TunerStep,        U8    DerotatorStep, BOOL *ScanSuccess,
                                                                U32 *NewFrequency,     U32   Mode,          U32   Guard,
                                                                U32  Force,            U32   Hierarchy,     U32   Spectrum,
                                                                U32  FreqOff,          U32   ChannelBW,     S32   EchoPos)
 
{
    #ifdef STTUNER_DEBUG_MODULE_SATDRV_D0288
    const char *identity = "STTUNER d0288.c demod_d0288_ScanFrequency()";
    #endif
    ST_ErrorCode_t Error = ST_NO_ERROR;
    FE_288_SearchParams_t Params;
    FE_288_SearchResult_t Result;
    STTUNER_InstanceDbase_t  *Inst;
    #ifdef STTUNER_DRV_SAT_SCR
    	U32 SCRVCOFrequency, TunerFrequency;
    #endif
 
    D0288_InstanceData_t *Instance;
    STTUNER_tuner_instance_t *TunerInstance; 
    /* private driver instance data */
    Instance = D0288_GetInstFromHandle(Handle);
    /* top level public instance data */ 
    Inst = STTUNER_GetDrvInst();
    /* get the tuner instance for this driver from the top level handle */
    TunerInstance = &Inst[Instance->TopLevelHandle].Sat.Tuner;
    Params.ExternalClock = Instance->ExternalClock;
    Params.Frequency   = InitialFrequency;              /* demodulator (output from LNB) frequency (in KHz) */
    Params.Symbolrate  = SymbolRate;                    /* transponder symbol rate  (in bds) */
    if (Inst[Instance->TopLevelHandle].Sat.BlindScan)
    Params.SearchRange = 4000000;
    else
    Params.SearchRange = MaxOffset*2;
   
    Params.Modulation  = FE_288_MOD_QPSK;
    
    Params.DemodIQMode=(STTUNER_IQMode_t) Spectrum;
  
    
    /* Set SCR frequency here -> Now SCR Index starts from "0" v0.3 ST7 firmware*/
    #ifdef STTUNER_DRV_SAT_SCR

    if((Inst[Instance->TopLevelHandle].Capability.SCREnable) && (Inst[Instance->TopLevelHandle].CurrentTunerInfo.ScanInfo.LNB_SignalRouting == STTUNER_VIA_SCRENABLED_LNB))
    {
	    if(!Inst[Instance->TopLevelHandle].Sat.BlindScan)
	    {
	    	Error = scr_scrdrv_SetFrequency(Instance->TopLevelHandle, Handle, Instance->DeviceName, InitialFrequency/1000, Inst[Instance->TopLevelHandle].Sat.ScanInfo.Scan->ScrParams.LNBIndex,Inst[Instance->TopLevelHandle].Sat.ScanInfo.Scan->ScrParams.SCRBPF );
	    	TunerFrequency = (Inst[Instance->TopLevelHandle].Capability.SCRBPFFrequencies[Inst[Instance->TopLevelHandle].Sat.ScanInfo.Scan->ScrParams.SCRBPF])*1000;
	    	Inst[Instance->TopLevelHandle].Sat.ScanInfo.Scan->ScrParams.BPFFrequency = TunerFrequency;
	    	SCRVCOFrequency = TunerFrequency + InitialFrequency;
	        Params.Frequency = TunerFrequency;
	        Inst[Instance->TopLevelHandle].Sat.ScanInfo.Scan->ScrParams.SCRVCOFrequency = SCRVCOFrequency;
	    }
	    else
	    {
	    	Error = scr_scrdrv_SetFrequency(Instance->TopLevelHandle, Handle, Instance->DeviceName, InitialFrequency/1000, Inst[Instance->TopLevelHandle].Sat.BlindScanInfo.ScrParams.LNBIndex,Inst[Instance->TopLevelHandle].Sat.BlindScanInfo.ScrParams.SCRBPF );
	    	TunerFrequency = (Inst[Instance->TopLevelHandle].Capability.SCRBPFFrequencies[Inst[Instance->TopLevelHandle].Sat.BlindScanInfo.ScrParams.SCRBPF])*1000;
	    	Inst[Instance->TopLevelHandle].Sat.BlindScanInfo.ScrParams.BPFFrequency = TunerFrequency;
	    	SCRVCOFrequency = TunerFrequency + InitialFrequency;
	        Params.Frequency = TunerFrequency;
	        Inst[Instance->TopLevelHandle].Sat.BlindScanInfo.ScrParams.SCRVCOFrequency = SCRVCOFrequency;
	    }
	    
	    
	   
	   
    }
    #endif
    
    Error |= FE_288_Search( &(Instance->DeviceMap),Instance->IOHandle, &Params, &Result, Instance->TopLevelHandle );

    if (Error == FE_288_BAD_PARAMETER)  /* element(s) of Params bad */
    {
        #ifdef STTUNER_DEBUG_MODULE_SATDRV_D0399
        STTBX_Print(("%s fail, scan not done: bad parameter(s) to FE_399_Search() == FE_899_BAD_PARAMETER\n", identity ));
	#endif
        return(ST_ERROR_BAD_PARAMETER);
    }
    else if (Error == FE_288_SEARCH_FAILED)  /* found no signal within limits */
    {
	#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0288
        STTBX_Print(("%s FE_399_Search() == FE_288_SEARCH_FAILED\n", identity ));
	#endif
        return(ST_NO_ERROR);    /* no error so try next F or stop if band limits reached */
    }
    *ScanSuccess = Result.Locked;

    if (Result.Locked == TRUE)
    {
        
        Instance->Symbolrate = Result.Symbolrate;
        Instance->SET_TSCLOCK = TRUE;
        #ifdef STTUNER_DRV_SAT_SCR
        if((Inst[Instance->TopLevelHandle].Capability.SCREnable)&& (Inst[Instance->TopLevelHandle].CurrentTunerInfo.ScanInfo.LNB_SignalRouting == STTUNER_VIA_SCRENABLED_LNB))
        {
        	*NewFrequency = (SCRVCOFrequency - TunerFrequency) + (TunerFrequency - Result.Frequency);
        }
        else
        {
        	*NewFrequency = Result.Frequency;
        }
        #else
        *NewFrequency = Result.Frequency;
        #endif
      }

    /* GNBvd17801-> Error Handling for any error returned during I2C operation inside the driver */
    Error |= Instance->DeviceMap.Error;
    Instance->DeviceMap.Error = ST_NO_ERROR;

   return(Error); 
}   

ST_ErrorCode_t demod_0288_GetSymbolrate(DEMOD_Handle_t Handle,   U32  *SymbolRate)
{
	ST_ErrorCode_t Error = ST_NO_ERROR;
	D0288_InstanceData_t *Instance;
	Instance = D0288_GetInstFromHandle(Handle);
	*SymbolRate = Instance->Symbolrate;
	return Error;
}


/* ----------------------------------------------------------------------------
Name: demod_d0288_DiseqcInit
Description:
    Selects the DiSEqC F22RX for maximum hits. THis function should be called when DiSEqC 2.0 Rx 
    Envelop mode is not used.
  Parameters:
    Handle,					Demod Handle
  Return Value:
    ST_NO_ERROR,                the operation was carried out without error.
  ---------------------------------------------------------------------------- */
ST_ErrorCode_t demod_d0288_DiseqcInit(DEMOD_Handle_t Handle)
{
	ST_ErrorCode_t Error = ST_NO_ERROR;      
	U8 f22Tx, f22Rx, sendData[3]={0xE2,0x00,0x00},/*diseqC command to send */
		         ReceveData[8]={0};
	STTUNER_DiSEqCSendPacket_t pDiSEqCSendPacket;
	STTUNER_DiSEqCResponsePacket_t pDiSEqCResponsePacket;
	D0288_InstanceData_t *Instance;
	U32 mclk, txFreq=22000, RxFreq,
     	    recevedok=0,
    	    i,
    	    trial = 0,	/*try number maximum = 2 (try 20khz and 17.5 khz)*/
    	    sucess1=0,  /*20 Khz sucess */
    	    sucess2=0;  /*17.5 Khz sucess */
    	    
        Instance = D0288_GetInstFromHandle(Handle);
        pDiSEqCSendPacket.DiSEqCCommandType = STTUNER_DiSEqC_COMMAND;
        pDiSEqCSendPacket.pFrmAddCmdData = &sendData[0];
	pDiSEqCSendPacket.uc_TotalNoOfBytes = 3;
	pDiSEqCResponsePacket.ReceivedFrmAddData = ReceveData;
	
	Error = STTUNER_IOREG_SetField(&Instance->DeviceMap, Instance->IOHandle, F288_ONECHIP_TRX,0); /*Disable Tx spy off */
	Error |= STTUNER_IOREG_SetField(&Instance->DeviceMap, Instance->IOHandle, F288_DIS_RESET,1);
	Error |= STTUNER_IOREG_SetField(&Instance->DeviceMap, Instance->IOHandle, F288_DIS_RESET,0);
	
	mclk = FE_288_GetMclkFreq(&Instance->DeviceMap, Instance->IOHandle,Instance->ExternalClock); /* For 5188 */
	
	f22Tx= mclk /(txFreq*32);
	Error |= STTUNER_IOREG_SetRegister(&Instance->DeviceMap, Instance->IOHandle, F288_FFR_REG, f22Tx);/*Set DiseqC Tx freq */
	
	RxFreq=20000;
	f22Rx= mclk /((RxFreq)*32);
	if(Error == ST_NO_ERROR)	
	{
		
		while ((recevedok <5) && (trial <2))
		{
			Instance->DiSEqC_RxFreq = RxFreq;
			STTUNER_IOREG_SetRegister(&Instance->DeviceMap, Instance->IOHandle, F288_FRX_REG, f22Rx);	/*Set Rx freq 2 possible value 20khz or 17.5 khz*/
			
			for(i=0;i<5;i++)
			{
				pDiSEqCResponsePacket.uc_TotalBytesReceived = 0;
				Error = demod_d0288_DiSEqC(Handle, &pDiSEqCSendPacket, &pDiSEqCResponsePacket);
				if(

⌨️ 快捷键说明

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