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

📄 d0mini360.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 4 页
字号:

        case STTUNER_TS_MODE_SERIAL:
            switch(DEMODInstance->SerialClockSource) /* Set serial clock source */
            {
                case STTUNER_SCLK_VCODIV6:
                    DEMODInstance->FE_360_InitParams.Clock = FE_SERIAL_VCODIV6_CLOCK;
                    break;

                default:
                case STTUNER_SCLK_DEFAULT:
                case STTUNER_SCLK_MASTER:
                    DEMODInstance->FE_360_InitParams.Clock = FE_SERIAL_MASTER_CLOCK;
                    break;
            }

    }

#ifdef STTUNER_DEBUG_MODULE_TERDRV_D0360
    STTBX_Print(("%s allocated & initalized block named '%s' at 0x%08x (%d bytes)\n", identity, InstanceNew->DeviceName, (U32)InstanceNew, sizeof( D0360_InstanceData_t ) ));
#endif
    SEM_UNLOCK(Lock_InitTermOpenClose);
    return(Error);
}



/* ----------------------------------------------------------------------------
Name: demod_d0360_Term()

Description:

Parameters:

Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t demod_d0360_Term(ST_DeviceName_t *DeviceName, DEMOD_TermParams_t *TermParams)
{
#ifdef STTUNER_DEBUG_MODULE_TERDRV_D0360
   const char *identity = "STTUNER d0360.c demod_d0360_Term()";
#endif
    ST_ErrorCode_t Error = ST_NO_ERROR;
       /* now safe to lock semaphore */
    SEM_LOCK(Lock_InitTermOpenClose);

    memory_deallocate(DEMODInstance->MemoryPartition, DEMODInstance);

    SEM_UNLOCK(Lock_InitTermOpenClose);
	    #ifdef ST_OS21
	    semaphore_delete(Lock_InitTermOpenClose);
	    #else
	    semaphore_delete(&Lock_InitTermOpenClose);
	    #endif 
        return(Error);
}



/* ----------------------------------------------------------------------------
Name: demod_d0360_Open()

Description:

Parameters:

Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t demod_d0360_Open(ST_DeviceName_t *DeviceName, DEMOD_OpenParams_t  *OpenParams, DEMOD_Capability_t *Capability, DEMOD_Handle_t *Handle)
{
#ifdef STTUNER_DEBUG_MODULE_TERDRV_D0360
   const char *identity = "STTUNER d0360.c demod_d0360_Open()";
#endif
    ST_ErrorCode_t Error = ST_NO_ERROR;
 /*   D0360_InstanceData_t     *Instance;*/
      U32  ChipID; 
    U8 RegWriteindex=0;
    U8 * Def360ValTemp ;

    /* now safe to lock semaphore */
    SEM_LOCK(Lock_InitTermOpenClose);


    
    /* check handle IS actually free */
    if(DEMODInstance->TopLevelHandle != STTUNER_MAX_HANDLES)
    {
		SEM_UNLOCK(Lock_InitTermOpenClose);
        return(ST_ERROR_OPEN_HANDLE);
    }
    /* else now got pointer to free (and valid) data block */
     Def360ValTemp= (U8*)Def360Val;
     for(RegWriteindex=0 ; RegWriteindex < 13 ; RegWriteindex++)
     {
     
      STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, SubAddrIndex[RegWriteindex], 0, 0, Def360ValTemp , SizeIndex[RegWriteindex], FALSE);  
      Def360ValTemp +=  SizeIndex[RegWriteindex];
        
     }
     DEMODInstance->FE_360_Handle = FE_360_Init();
	
	 ChipID = ChipDemodGetField(  R_ID );
    if ( (ChipID & 0x30) ==  0x00)   /* Accept cuts 1 & 2 (0x10 or 0x20) */
    {
        SEM_UNLOCK(Lock_InitTermOpenClose);
        return(ST_ERROR_UNKNOWN_DEVICE);
    }
    else
    {
#ifdef STTUNER_DEBUG_MODULE_TERDRV_D0360
        STTBX_Print(("%s device found, release/revision=%u\n", identity, ChipID & 0x0F));
#endif
    }

    /* Set serial/parallel data mode */
    if (DEMODInstance->TSOutputMode == STTUNER_TS_MODE_SERIAL)
    {
        ChipDemodSetField( OUTRS_SP, 1);
    }
    else
    {
        ChipDemodSetField( OUTRS_SP, 0);
    }
    
    /*set data clock polarity mode (rising/falling)*/
    switch(DEMODInstance->ClockPolarity)
    {
       case STTUNER_DATA_CLOCK_POLARITY_RISING:
    	 ChipDemodSetField( CLK_POL, 1);
    	 break;
       case STTUNER_DATA_CLOCK_POLARITY_FALLING:
    	 ChipDemodSetField( CLK_POL, 0);
    	 break;
       case STTUNER_DATA_CLOCK_POLARITY_DEFAULT:
    	 ChipDemodSetField( CLK_POL, 1);
         break;
    	default:
    	break;
    }
   
    /* Set capabilties */
    Capability->FECAvail        = STTUNER_FEC_ALL;  /* direct mapping to STTUNER_FECRate_t    */
    Capability->ModulationAvail = STTUNER_MOD_ALL;  /* direct mapping to STTUNER_Modulation_t */
    Capability->AGCControl      = FALSE;
    Capability->SymbolMin       =  1000000; /*   1 MegaSymbols/sec */
    Capability->SymbolMax       = 50000000; /*  50 MegaSymbols/sec */

    Capability->BerMax           = MAX_BER;
    Capability->SignalQualityMax = MAX_SIGNAL_QUALITY;
    Capability->AgcMax           = MAX_AGC;


    /* finally (as nor more errors to check for, allocate handle */
    DEMODInstance->TopLevelHandle = OpenParams->TopLevelHandle;
    *Handle = (U32)DEMODInstance;

#ifdef STTUNER_DEBUG_MODULE_TERDRV_D0360
    STTBX_Print(("%s opened ok\n", identity));
#endif

    SEM_UNLOCK(Lock_InitTermOpenClose);
   
    return(Error);
}



/* ----------------------------------------------------------------------------
Name: demod_d0360_Close()

Description:

Parameters:

Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t demod_d0360_Close(DEMOD_Handle_t Handle, DEMOD_CloseParams_t *CloseParams)
{
#ifdef STTUNER_DEBUG_MODULE_TERDRV_D0360
   const char *identity = "STTUNER d0360.c demod_d0360_Close()";
#endif
   
	DEMODInstance->TopLevelHandle = STTUNER_MAX_HANDLES;
	FE_360_Term();
	return(ST_NO_ERROR);
}


/* ----------------------------------------------------------------------------
Name: demod_d0360_GetTunerInfo()

Description:

Parameters:

Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t demod_d0360_GetTunerInfo(DEMOD_Handle_t Handle, STTUNER_TunerInfo_t *TunerInfo_p)
{
#ifdef STTUNER_DEBUG_MODULE_TERDRV_D0360
   const char *identity = "STTUNER d0360.c demod_d0360_GetTunerInfo()";
#endif
    ST_ErrorCode_t       Error = ST_NO_ERROR;
    ST_ErrorCode_t       TunerError ;
   /* D0360_InstanceData_t *Instance;*/
    STTUNER_InstanceDbase_t     *Inst;
    U8                   Data;
    U32                  CurFrequency, CurSignalQuality, CurBitErrorRate;
    STTUNER_Modulation_t CurModulation;
    STTUNER_Mode_t       CurMode;
    STTUNER_FECRate_t    CurFECRates;
    STTUNER_Guard_t      CurGuard;
    STTUNER_Spectrum_t   CurSpectrum;
    STTUNER_Hierarchy_t  CurHierMode;
    S32                  CurEchoPos;
    int offset=0;
    int offsetvar=0;
    char signvalue=0;
    int offset_type=0;
    /* private driver instance data 
    Instance = D0360_GetInstFromHandle(Handle);*/
    
    /* top level public instance data */
    Inst = STTUNER_GetDrvInst(); 

    /* Read noise estimations for C/N and BER */
    FE_360_GetNoiseEstimator( &CurSignalQuality, &CurBitErrorRate); /* checknab temp*/
  
  /******The Error field of TunerInfo in Instaneous database is updated ******/
    
    TunerError= ST_NO_ERROR; 
       
    /*************************************************************************/
    /* Get the modulation type */
    STTUNER_task_lock();
    #ifdef PROCESSOR_C1 /***For C1 core this delay needed otherwise STTUNER_task_lock(); not working fine ****/ 
    task_delay(5);
    #endif
    Data=ChipDemodGetField( TPS_CONST);
    STTUNER_task_unlock();
   /* Data = ChipGetFieldImage(FE2CHIP(Instance->FE_360_Handle), TPS_CONST);*/
    switch (Data)
    {
        case 0:  CurModulation = STTUNER_MOD_QPSK;  break;
        case 1:  CurModulation = STTUNER_MOD_16QAM; break;
        case 2:  CurModulation = STTUNER_MOD_64QAM; break;
        default: 
        /*CurModulation = STTUNER_MOD_ALL;*/
        CurModulation = Data ;
        task_delay(5);
        Data=ChipDemodGetField( TPS_CONST);
        switch (Data)
        {
        case 0:  CurModulation = STTUNER_MOD_QPSK;  break;
        case 1:  CurModulation = STTUNER_MOD_16QAM; break;
        case 2:  CurModulation = STTUNER_MOD_64QAM; break;
        default:
        CurModulation = Data ;
        TunerError=ST_ERROR_BAD_PARAMETER;
        }
        break;
    }

    /* Get the mode */
    STTUNER_task_lock();
    #ifdef PROCESSOR_C1 /***For C1 core this delay needed otherwise STTUNER_task_lock(); not working fine ****/ 
    task_delay(5);
    #endif
    Data=ChipDemodGetField( TPS_MODE);
    STTUNER_task_unlock();
    /*Data = ChipGetFieldImage(FE2CHIP(Instance->FE_360_Handle), TPS_MODE);*/
    switch (Data)
    {
        case 0:  CurMode = STTUNER_MODE_2K; break;
        case 1:  CurMode = STTUNER_MODE_8K; break;
        default: 
        CurMode =Data;
        task_delay(5);
        Data=ChipDemodGetField( TPS_MODE);
        switch (Data)
        {
        case 0:  CurMode = STTUNER_MODE_2K; break;
        case 1:  CurMode = STTUNER_MODE_8K; break;
        default:
        CurMode =Data;
        TunerError=ST_ERROR_BAD_PARAMETER;
        }
        break; /* error */
    }

    /* Get the Hierarchical Mode */
    STTUNER_task_lock();
    #ifdef PROCESSOR_C1 /***For C1 core this delay needed otherwise STTUNER_task_lock(); not working fine ****/ 
    task_delay(5);
    #endif
    Data=ChipDemodGetField ( TPS_HIERMODE);
   STTUNER_task_unlock();
    switch(Data)
    {
    	case 0 : CurHierMode=STTUNER_HIER_NONE; break;
    	case 1 : CurHierMode=STTUNER_HIER_1; break;
    	case 2 : CurHierMode=STTUNER_HIER_2; break;
    	case 3 : CurHierMode=STTUNER_HIER_4; break;
    	default :
    	CurHierMode=Data;
    	TunerError=ST_ERROR_BAD_PARAMETER;
        break; /* error */
    }
    
     /* Get the FEC Rate */
    /*Data = ChipGetFieldImage(FE2CHIP(Instance->FE_360_Handle), TPS_HPCODE);*/
    STTUNER_task_lock();
    #ifdef PROCESSOR_C1 /***For C1 core this delay needed otherwise STTUNER_task_lock(); not working fine ****/ 
    task_delay(5);
    #endif
    Data=ChipDemodGetField( TPS_HPCODE);
    STTUNER_task_unlock();
    switch (Data)
    {
        case 0:  CurFECRates = STTUNER_FEC_1_2; break;
        case 1:  CurFECRates = STTUNER_FEC_2_3; break;
        case 2:  CurFECRates = STTUNER_FEC_3_4; break;
        case 3:  CurFECRates = STTUNER_FEC_5_6; break;
        case 4:  CurFECRates = STTUNER_FEC_7_8; break;
        default: 
        CurFECRates = Data;
        TunerError=ST_ERROR_BAD_PARAMETER;
        break; /* error */
    }

    /* Get the Guard time */
    STTUNER_task_lock();
    #ifdef PROCESSOR_C1 /***For C1 core this delay needed otherwise STTUNER_task_lock(); not working fine ****/ 
    task_delay(5);
    #endif
    Data = ChipDemodGetField( TPS_GUARD);
    STTUNER_task_unlock();
    switch (Data)
    {
        case 0:  CurGuard = STTUNER_GUARD_1_32; break;
        case 1:  CurGuard = STTUNER_GUARD_1_16; break;
        case 2:  CurGuard = STTUNER_GUARD_1_8;  break;
        case 3:  CurGuard = STTUNER_GUARD_1_4;  break;
        default: 
        CurGuard = Data;
        TunerError=ST_ERROR_BAD_PARAMETER;
        break; /* error */
    }

    /* Get the spectrum sense */
    Data = ChipDemodGetField( INV_SPECTR);
    switch (Data)
    {
        case 0:  CurSpectrum = STTUNER_INVERSION;      break;
        default: CurSpectrum = STTUNER_INVERSION_NONE; break;
    }

    /* Get the correct frequency */
    CurFrequency = TunerInfo_p->Frequency;
    
    /********Frequency offset calculation done here*******************/
    signvalue=ChipDemodGetField(SEXT);
    offset=ChipDemodGetField(R_CRL_FREQ3);
    offset <<=16;
    offsetvar=ChipDemodGetField(R_CRL_FREQ2);
    offsetvar <<=8;
    offset = offset | offsetvar;
    offsetvar=0;
    offsetvar=ChipDemodGetField(R_CRL_FREQ1);
    offset =offset | offsetvar ;
    if(signvalue==1)
    {
       offset |=0xff000000;/*** Here sign extension made for the negative number**/
    }
       offset =offset /16384;/***offset calculation done according to data sheet of STV0360***/
      /* Data = ChipFieldImage(FE2CHIP(Instance->FE_360_Handle), TPS_MODE);*/
		Data = ChipDemodGetField(TPS_MODE);
       if(Data==0)
       {
          /*******it is 2k mode***************/
          offset=((offset*4464)/1000);/*** 1 FFT BIN=4.464khz***/
       }
       else
       {
          /*******it is 8k mode***************/
          offset=((offset*11)/10);/*** 1 FFT BIN=1.1khz***/
       }
       /*********** Spectrum Inversion Taken Care**************/
       Data = ChipDemodGetField(INV_SPECTR);
       if((offset>=140) && (offset<=180))
       {
       	 offset -=166;
       	 if(Data ==0)
       	 {
       	    offset_type =STTUNER_OFFSET_POSITIVE;   
       	 }
       	 else
       	 {
              offset_type =STTUNER_OFFSET_NEGATIVE;
          }   
       }
       else if((offset<=-140) && (offset>=-180))
       {
       	 offset +=166;
       	 if(Data==0)
       	 {
             offset_type =STTUNER_OFFSET_NEGATIVE;
          }
          else
          {
             offset_type =STTUNER_OFFSET_POSITIVE;
          }
       }
       else
       {
       	 offset_type=STTUNER_OFFSET_NONE;
       }
       
       /*** After fine tunning with +/- 166 khz , a small offset in relation to +/-166khz
            is returned to user which it has to add with returned frequency to get the exact
            carrier frequency****/
       TunerInfo_p->ScanInfo.FreqOff = offset_type;
       if(Data==0)
       {
          TunerInfo_p->ScanInfo.ResidualOffset = offset;
       }
       else
       {
           TunerInfo_p->ScanInfo.ResidualOffset = offset*(-1);
       }
      
    /************************************************/

    /* Get the echo position */
    CurEchoPos=ChipDemodGetField( LONG_ECHO);

    STTUNER_task_lock();
    #ifdef PROCESSOR_C1 /***For C1 core this delay needed otherwise STTUNER_task_lock(); not working fine ****/ 
    task_delay(5);
    #endif
    TunerInfo_p->FrequencyFound      = CurFrequency;
    TunerInfo_p->SignalQuality       = CurSignalQuality;
    TunerInfo_p->BitErrorRate        = CurBitErrorRate;
    TunerInfo_p->ScanInfo.Modulation = CurModulation;
    TunerInfo_p->ScanInfo.Mode       = CurMode;
    TunerInfo_p->ScanInfo.FECRates   = CurFECRates;
    TunerInfo_p->ScanInfo.Guard      = CurGuard;
    TunerInfo_p->ScanInfo.Spectrum   = CurSpectrum;
    TunerInfo_p->ScanInfo.EchoPos    = CurEchoPos;
    TunerInfo_p->ScanInfo.Hierarchy  = CurHierMode;
    Inst[DEMODInstance->TopLevelHandle].TunerInfoError = TunerError;
    STTUNER_task_unlock();
  
 #ifdef STTUNER_DEBUG_MODULE_TERDRV_D0360
    STTBX_Print(("F=%d SQ=%u BER=%u Modul=%u Mode=%u FR=%u G=%u Sp=%u\n",CurFrequency,CurSignalQuality,CurBitErrorRate,CurModulation,CurMode,CurFECRates,CurGuard,CurSpectrum));
 #endif
   
    return(Error);
}



/* ----------------------------------------------------------------------------
Name: demod_d0360_GetSignalQuality()

Description:

Parameters:

Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t demod_d0360_GetSignalQuality(DEMOD_Handle_t Handle, U32  *SignalQuality_p, U32 *Ber)
{
#ifdef STTUNER_DEBUG_MODULE_TERDRV_D0360
   const char *identity = "STTUNER d0360.c demod_d0360_GetSignalQuality()";
#endif
    ST_ErrorCode_t Error = ST_NO_ERROR;
    
    /* private driver instance data */
    /* Read noise estimations for C/N and BER */
    FE_360_GetNoiseEstimator( SignalQuality_p, Ber);

#ifdef STTUNER_DEBUG_MODULE_TERDRV_D0360
    STTBX_Print(("%s SignalQuality=%u Ber=%u\n", identity, *SignalQuality_p, *Ber));
#endif
    return(Error);
}



/* ----------------------------------------------------------------------------
Name: demod_d0360_GetModulation()

⌨️ 快捷键说明

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