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

📄 scrdrv.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
	   	 }
	   	 for(i=0; i<Instance->NbLnb; ++i)
	   	 {
	   		Capability->SCRLNB_LO_Frequencies[i] = Instance->SCRLNB_LO_Frequencies[i];
	   		
	   	 }
	 }
	 else if(Instance->SCR_Mode == STTUNER_UBCHANGE)
   	{
   		/* make scr off*/
   		scr_scrdrv_Off (OpenParams, DemodHandle, Instance->SCRBPF);
   		Capability->SCR_Mode      = STTUNER_UBCHANGE;
   		Capability->SCRBPF        = Instance->SCRBPF;
   		Capability->Scr_App_Type  = Instance->Scr_App_Type;
   		Capability->Number_of_SCR = Instance->NbScr;
   		Capability->Number_of_LNB = Instance->NbLnb;
   		Capability->LNBIndex      = Instance->LNBIndex;
   		for(i=0; i<Instance->NbScr; ++i)
	   	 {
	   		Capability->SCRBPFFrequencies[i] = Instance->SCRBPFFrequencies[i];
	   	 }
	   	 for(i=0; i<Instance->NbLnb; ++i)
	   	 {
	   		Capability->SCRLNB_LO_Frequencies[i] = Instance->SCRLNB_LO_Frequencies[i];
	   		
	   	 }
	 }
   }
   
    /* finally (as nor more errors to check for, allocate handle */
    Instance->TopLevelHandle = OpenParams->TopLevelHandle;
    *Handle = (U32)Instance;

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

    SEM_UNLOCK(Lock_InitTermOpenClose);
#endif
/******************************************MINIDRIVER*****************
************************************************************************
*************************************************************************/    
#ifdef STTUNER_MINIDRIVER
  
    /* now safe to lock semaphore */
    SEM_LOCK(Lock_InitTermOpenClose);
    /* check handle IS actually free */
    if(SCRInstance->TopLevelHandle != STTUNER_MAX_HANDLES)
    {
#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
        STTBX_Print(("%s fail driver instance already open\n", identity));
#endif
        SEM_UNLOCK(Lock_InitTermOpenClose);
        return(ST_ERROR_OPEN_HANDLE);
    }
     
   /* Check for free SCR, if not free return error*/
   	if(SCRInstance->SCR_Mode != STTUNER_SCR_MANUAL)
   	{ 
	   	 SEM_UNLOCK(Lock_InitTermOpenClose);
   		return ST_ERROR_FEATURE_NOT_SUPPORTED;
   	
   	}
        Capability->Number_of_SCR = SCRInstance->NbScr;
   	Capability->Number_of_LNB = SCRInstance->NbLnb;
   	for(i=0; i<SCRInstance->NbScr; ++i)
	{
		Capability->SCRBPFFrequencies[i] = SCRInstance->SCRBPFFrequencies[i];
	}
	for(i=0; i<SCRInstance->NbLnb; ++i)
	{
		Capability->SCRLNB_LO_Frequencies[i] = SCRInstance->SCRLNB_LO_Frequencies[i];
	}
  
    Capability->SCR_Mode      = STTUNER_SCR_MANUAL;
    Capability->LegacySupport = TRUE;
   
   /* make scr1 off*/
   scr_scrdrv_Off (OpenParams, DemodHandle, SCRInstance->SCRBPF);
   
    /* finally (as nor more errors to check for, allocate handle */
    SCRInstance->TopLevelHandle = OpenParams->TopLevelHandle;
    *Handle = (U32)SCRInstance;

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

    SEM_UNLOCK(Lock_InitTermOpenClose);
#endif
    return(Error);
}   



/* ----------------------------------------------------------------------------
Name: scr_scrdrv_Close()

Description:
    
Parameters:
    
Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t scr_scrdrv_Close(SCR_Handle_t Handle, SCR_CloseParams_t *CloseParams)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
   const char *identity = "STTUNER scr scr_scrdrv_Close()";
#endif
    ST_ErrorCode_t Error = ST_NO_ERROR;
#ifndef STTUNER_MINIDRIVER
    SCR_InstanceData_t     *Instance;

    /* private driver instance data */
    Instance = SCR_GetInstFromHandle(Handle);

    if(Installed == FALSE)
    {
#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
        STTBX_Print(("%s fail driver not installed\n", identity));
#endif
        return(STTUNER_ERROR_INITSTATE);
    }

    SEM_LOCK(Lock_InitTermOpenClose);

    /* ---------- check that at least one init has taken place ---------- */
    if(InstanceChainTop == NULL)
    {
#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
        STTBX_Print(("%s fail nothing initalized\n", identity));
#endif
        SEM_UNLOCK(Lock_InitTermOpenClose);
        return(STTUNER_ERROR_INITSTATE);
    }

    if(Instance->TopLevelHandle == STTUNER_MAX_HANDLES)
    {
#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
        STTBX_Print(("%s fail driver instance not open\n", identity));
#endif
        SEM_UNLOCK(Lock_InitTermOpenClose);
        return(ST_ERROR_OPEN_HANDLE);
    }


    Instance->TopLevelHandle = STTUNER_MAX_HANDLES;

#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
    STTBX_Print(("%s closed\n", identity));
#endif

    SEM_UNLOCK(Lock_InitTermOpenClose);
#endif
#ifdef STTUNER_MINIDRIVER
SCRInstance->TopLevelHandle = STTUNER_MAX_HANDLES;
#endif

    return(Error);
}   

#ifndef STTUNER_MINIDRIVER 
ST_ErrorCode_t scr_tone_enable_x(SCR_OpenParams_t  *OpenParams, DEMOD_Handle_t DemodHandle, U32 ScrIndex,U32 ScrNb)
{
    ST_ErrorCode_t Error = ST_NO_ERROR;
    STTUNER_InstanceDbase_t  *Inst;
    U32 i=0;
    Inst = STTUNER_GetDrvInst();
    

	Error = scr_tone_enable(OpenParams, DemodHandle);
	for(i=0;i<ScrNb;i++)
	{
		if(i!=ScrIndex)
		{
			scr_scrdrv_Off (OpenParams, DemodHandle, i);
	  	}
        }

  return Error;
}
#endif
/* ----------------------------------------------------------------------------
Name: scr_scrdrv_IsLocked()

Description:
     Checks the LK register i.e., are we demodulating a digital carrier.
   
Parameters:
    IsLocked,   pointer to area to store result (bool):
                TRUE -- we are locked.
                FALSE -- no lock.
    
Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t scr_scrdrv_IsLocked(SCR_Handle_t  Handle, DEMOD_Handle_t DemodHandle, BOOL  *IsLocked)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
   const char *identity = "STTUNER scr scr_scrdrv_IsLocked()";
#endif
    ST_ErrorCode_t Error = ST_NO_ERROR;
    
   /* read ststus through DiSEqC command->presently not supported*/

#ifdef STTUNER_DEBUG_MODULE_SATDRV_SCR
    STTBX_Print(("%s IsLocked=%u\n", identity, *IsLocked));
#endif
    return(Error);
}   

#ifndef STTUNER_MINIDRIVER
/* ----------------------------------------------------------------------------
Name: SCR_GetInstFromHandle()

Description:
     Get SCR Instance from SCR Handle
   
Parameters:
         Handle -- SCR Handle
    
Return Value: Instance pointer
---------------------------------------------------------------------------- */
SCR_InstanceData_t *SCR_GetInstFromHandle(SCR_Handle_t Handle)
{

    SCR_InstanceData_t *Instance;

    Instance = (SCR_InstanceData_t *)Handle;


    return(Instance);
}
#endif

/* ----------------------------------------------------------------------------
Name: scr_scrdrv_Off()

Description:
     It's to put  the SCR in off mode. Because during power on there are a lot of noise bands at the output.
   
Parameters:
    			OpenParams - To get the TopLevelHandle
                DemodHandle -- Demod handle for DiSEqC operations.
                LNBIndex -- LNB index number.
                SCRBPF   -- Which SCR to switch off.
    
Return Value:Error
---------------------------------------------------------------------------- */

ST_ErrorCode_t scr_scrdrv_Off (SCR_OpenParams_t  *OpenParams, DEMOD_Handle_t DemodHandle, U8 SCRBPF)
{
    STTUNER_DiSEqCSendPacket_t pDiSEqCSendPacket;
    STTUNER_DiSEqCResponsePacket_t pDiSEqCResponsePacket;
    LNB_Config_t      LnbConfig;
    ST_ErrorCode_t Error = ST_NO_ERROR;
    unsigned char command_array[] = {0xE0, 0x10, 0x5A, 0x00, 0x00};     
#ifndef STTUNER_MINIDRIVER
    STTUNER_InstanceDbase_t  *Inst;
     
    Inst = STTUNER_GetDrvInst();
       
	pDiSEqCSendPacket.DiSEqCCommandType = STTUNER_DiSEqC_COMMAND;
	pDiSEqCSendPacket.uc_TotalNoOfBytes = 5;
	
	command_array[3] |= (SCRBPF<<5);
	
	pDiSEqCSendPacket.pFrmAddCmdData = &command_array[0];
	
	pDiSEqCSendPacket.uc_msecBeforeNextCommand = 50;
      
	LnbConfig.TopLevelHandle = OpenParams->TopLevelHandle;
	LnbConfig.Status         = LNB_STATUS_ON;              /* Set the Satellite Dish LNB power to ON */
	LnbConfig.Polarization   = STTUNER_PLR_VERTICAL;       /* Setup the Satellite Dish LNB Polarization */
	LnbConfig.ToneState      = STTUNER_LNB_TONE_OFF;       /* Setup the require tone state */
	
	/* Use semaphore not to distrub the SCR setting during DiSEqC- ST Commands  */
	SEM_LOCK(DiSEqC_Semaphore);
	/* Invoke new configuration 13V*/
	Error = (Inst[OpenParams->TopLevelHandle].Sat.Lnb.Driver->lnb_SetConfig)(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);
	
	/*18V*/
	LnbConfig.Polarization = STTUNER_PLR_HORIZONTAL;
	Error = (Inst[OpenParams->TopLevelHandle].Sat.Lnb.Driver->lnb_SetConfig)(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);

	task_delay(25 * (ST_GetClocksPerSecond() / 1000));
	Error = (Inst[OpenParams->TopLevelHandle].Sat.Demod.Driver->demod_DiSEqC)(DemodHandle, &pDiSEqCSendPacket, &pDiSEqCResponsePacket );

	task_delay(10 * (ST_GetClocksPerSecond() / 1000));
      
	/*come back on 13V*/
	LnbConfig.Polarization = STTUNER_PLR_VERTICAL;
	Error = (Inst[OpenParams->TopLevelHandle].Sat.Lnb.Driver->lnb_SetConfig)(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);
	
	SEM_UNLOCK(DiSEqC_Semaphore);
#endif
/*****************************MINIDRIVER********************
*************************************************************
**************************************************************/
#ifdef STTUNER_MINIDRIVER
    STTUNER_InstanceDbase_t  *Inst;
     
    Inst = STTUNER_GetDrvInst();
       
	pDiSEqCSendPacket.DiSEqCCommandType = STTUNER_DiSEqC_COMMAND;
	pDiSEqCSendPacket.uc_TotalNoOfBytes = 5;
	
	command_array[3] = SCRBPF<<5;
	
	pDiSEqCSendPacket.pFrmAddCmdData = &command_array[0];
	
	pDiSEqCSendPacket.uc_msecBeforeNextCommand = 25;
      
	LnbConfig.TopLevelHandle = OpenParams->TopLevelHandle;
	LnbConfig.Status         = LNB_STATUS_ON;              /* Set the Satellite Dish LNB power to ON */
	LnbConfig.Polarization   = STTUNER_PLR_VERTICAL;       /* Setup the Satellite Dish LNB Polarization */
	LnbConfig.ToneState      = STTUNER_LNB_TONE_OFF;       /* Setup the require tone state */
	
	/* Use semaphore not to distrub the SCR setting during DiSEqC- ST Commands  */
	SEM_LOCK(DiSEqC_Semaphore);
	
      #ifdef STTUNER_DRV_SAT_STV0299
	/* Invoke new configuration 13V*/
	#ifdef STTUNER_DRV_SAT_LNB21
		Error = lnb_lnb21_SetConfig(&LnbConfig);
	#elif defined STTUNER_DRV_SAT_LNBH21
		Error = lnb_lnbh21_SetConfig(&LnbConfig);
	#else
		Error = lnb_l0299_SetConfig(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);
	#endif
	/*18V*/
	LnbConfig.Polarization = STTUNER_PLR_HORIZONTAL;
	#ifdef STTUNER_DRV_SAT_LNB21
		Error = lnb_lnb21_SetConfig(&LnbConfig);
	#elif defined STTUNER_DRV_SAT_LNBH21
		Error = lnb_lnbh21_SetConfig(&LnbConfig);
	#else
		lnb_l0299_SetConfig(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);
	#endif
		task_delay(10 * (ST_GetClocksPerSecond() / 1000));
		Error = demod_d0299_DiSEqC(DemodHandle, &pDiSEqCSendPacket, &pDiSEqCResponsePacket );
		task_delay(2 * (ST_GetClocksPerSecond() / 1000));
      
	/*come back on 13V*/
	LnbConfig.Polarization = STTUNER_PLR_VERTICAL;
	#ifdef STTUNER_DRV_SAT_LNB21
	Error = lnb_lnb21_SetConfig(&LnbConfig);
	#elif defined STTUNER_DRV_SAT_LNBH21
	Error = lnb_lnbh21_SetConfig(&LnbConfig);
	#else
	Error = lnb_l0299_SetConfig(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);
	#endif
    #endif
    #if defined(STTUNER_DRV_SAT_STV0399) || defined(STTUNER_DRV_SAT_STV0399E)
	/* Invoke new configuration 13V*/
	#ifdef STTUNER_DRV_SAT_LNB21
		Error = lnb_lnb21_SetConfig(&LnbConfig);
	#elif defined STTUNER_DRV_SAT_LNBH21
		Error = lnb_lnbh21_SetConfig(&LnbConfig);
	#else
		Error = lnb_l0399_SetConfig(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);
	#endif
	/*18V*/
	LnbConfig.Polarization = STTUNER_PLR_HORIZONTAL;
	#ifdef STTUNER_DRV_SAT_LNB21
		Error = lnb_lnb21_SetConfig(&LnbConfig);
	#elif defined STTUNER_DRV_SAT_LNBH21
		Error = lnb_lnbh21_SetConfig(&LnbConfig);
	#else
		lnb_l0399_SetConfig(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);
	#endif
		task_delay(10 * (ST_GetClocksPerSecond() / 1000));
		Error = demod_d0399_DiSEqC(DemodHandle, &pDiSEqCSendPacket, &pDiSEqCResponsePacket );
		task_delay(2 * (ST_GetClocksPerSecond() / 1000));
      
	/*come back on 13V*/
	LnbConfig.Polarization = STTUNER_PLR_VERTICAL;
	#ifdef STTUNER_DRV_SAT_LNB21
		Error = lnb_lnb21_SetConfig(&LnbConfig);
	#elif defined STTUNER_DRV_SAT_LNBH21
		Error = lnb_lnbh21_SetConfig(&LnbConfig);
	#else
		Error = lnb_l0399_SetConfig(Inst[OpenParams->TopLevelHandle].Sat.Lnb.DrvHandle, &LnbConfig);
	#endif
    #endif
	
	SEM_UNLOCK(DiSEqC_Semaphore); 
#endif 
   return(Error);
   
}
#ifndef STTUNER_MINIDRIVER
ST_ErrorCode_t scr_tone_enable(SCR_OpenParams_t  *OpenParams, DEMOD_Handle_t DemodHandle)
{
    STTUNER_DiSEqCSendPacket_t pDiSEqCSendPacket;
    STTUNER_DiSEqCResponsePacket_t pDiSEqCResponsePacket;
    LNB_Config_t      LnbConfig;
    ST_ErrorCode_t Error = ST_NO_ERROR;
    unsigned char command_array [5] = {0xE0, 0x10, 0x5B, 0x00, 0x00};/* E0(Framing)  10/11(address)   5A/5B(command)  data1(Sub_func = 0)   data2 = 00*/
    STTUNER_InstanceDbase_t  *Inst;
    Inst = STTUNER_GetDrvInst();

	pDiSEqCSendPacket.DiSEqCCommandType = STTUNER_DiSEqC_COMMAND;
	pDiSEqCSendPacket.uc_TotalNoOfBytes = 5;
	
	
	LnbConfig.TopLevelHandle                    = OpenParams->TopLevelHandle;
	LnbConfig.Status                            = LNB_STATUS_ON;              /* Set the Satellite Dish LNB power to ON */
	LnbConfig.Polarization                      = STTUNER_PLR_VERTICAL;       /* Setup the Satellite Dish LNB Polarization */
	LnbConfig.ToneState                         = STTUNER_LNB_TONE_OFF;       /* Setup the require tone state */
	pDiSEqCSendPacket.uc_msecBeforeNextCommand  = 50;
	pDiSEqCSendPacket.pFrmAddCmdData            = &command_array[0];
	

⌨️ 快捷键说明

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