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

📄 tunshdrv.c

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

#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
            STTBX_Print(("%s terminated ok\n", identity));
#endif
            SEM_UNLOCK(Lock_InitTermOpenClose);
            return(Error);
        }
        else if(Instance->InstanceChainNext == NULL)
        {       /* error we should have found a matching name before the end of the list */
#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
                STTBX_Print(("\n%s fail no free handle before end of list\n", identity));
#endif
                SEM_UNLOCK(Lock_InitTermOpenClose);
                return(STTUNER_ERROR_INITSTATE);
        }
        else
        {
            Instance = Instance->InstanceChainNext;   /* next block */
#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
            STTBX_Print(("(%s)", Instance->DeviceName));
#endif
        }

    }


#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
    STTBX_Print(("%s FAIL! this point should NEVER be reached\n", identity));
#endif
    SEM_UNLOCK(Lock_InitTermOpenClose);
    return(Error);
} 

/* ----------------------------------------------------------------------------
Name: tuner_tunshdrv_Open()

Description:
    
Parameters:
    
Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t tuner_tunshdrv_Open (ST_DeviceName_t *DeviceName, TUNER_OpenParams_t *OpenParams, TUNER_Handle_t *Handle)
{
#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
   const char *identity = "STTUNER tunshdrv.c tuner_tunshdrv_Open()";
#endif
    ST_ErrorCode_t Error = ST_NO_ERROR;
    TUNSHDRV_InstanceData_t *Instance;

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

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

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

    /* find  handle from name */
    Instance = InstanceChainTop;
#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
    STTBX_Print(("%s looking (%s)", identity, Instance->DeviceName));
#endif
    while(strcmp((char *)Instance->DeviceName, (char *)DeviceName) != 0)
    {
        /* error, should have found matching DeviceName before end of list */
        if(Instance->InstanceChainNext == NULL)
        {
#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
            STTBX_Print(("\n%s fail no block named '%s' before end of list\n", identity, DeviceName));
#endif
            SEM_UNLOCK(Lock_InitTermOpenClose);
            return(STTUNER_ERROR_INITSTATE);
        }
        Instance = Instance->InstanceChainNext;   /* next block */
#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
        STTBX_Print(("(%s)", Instance->DeviceName));
#endif
    }
#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
    STTBX_Print((" found ok\n"));
#endif

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

    /* now got pointer to free (and valid) data block */
    Instance->TopLevelHandle = OpenParams->TopLevelHandle;
    *Handle = (U32)Instance;

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

    SEM_UNLOCK(Lock_InitTermOpenClose);
    return(Error);
}   
   



/* ----------------------------------------------------------------------------
Name: tuner_tunshdrv_Close()

Description:
    
Parameters:
    
Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t tuner_tunshdrv_Close(TUNER_Handle_t Handle, TUNER_CloseParams_t *CloseParams)
{
#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
   const char *identity = "STTUNER tunshdrv.c tuner_tunshdrv_Close()";
#endif

    ST_ErrorCode_t Error = ST_NO_ERROR;
    TUNSHDRV_InstanceData_t *Instance;

    Instance = TUNSHDRV_GetInstFromHandle(Handle);

    if(Installed == FALSE)
    {
#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
        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_SHARED_TUNSHDRV
        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_SHARED_TUNSHDRV
        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_SHARED_TUNSHDRV
    STTBX_Print(("%s closed\n", identity));
#endif

    SEM_UNLOCK(Lock_InitTermOpenClose);
    return(Error);
}   
   



/* ----------------------------------------------------------------------------
Name: tuner_tunshdrv_SetFrequency()

Description:
    
Parameters:
    
Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t tuner_tunshdrv_SetFrequency (TUNER_Handle_t Handle, U32 Frequency, U32 *NewFrequency)
{
#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
   const char *identity = "STTUNER tunshdrv.c tuner_tunshdrv_SetFrequency()";
#endif

    ST_ErrorCode_t Error = ST_NO_ERROR;
    TUNSHDRV_InstanceData_t *Instance;
    #ifdef STTUNER_DRV_SHARED_TUN_FQD1236 
     U32 P0_1_2,AL2,P4;
     #endif
    U32 frequency;
    U32 divider,value1,value2;
  

    Instance = TUNSHDRV_GetInstFromHandle(Handle);
    
  
   if(!Instance->Error)
      {
      	switch(Instance->TunerType)
		{
			#ifdef STTUNER_DRV_SHARED_TUN_TD1336
			case STTUNER_TUNER_TD1336:
			
				frequency = Frequency +(Instance->Status.IntermediateFrequency);
				divider = (frequency * 100) / (SharedTunerGetStepsize(Instance)  / 10);
			
				STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FTD1336_N_MSB,((divider >> 8) & 0x7F),Instance->TunerRegVal);
				STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FTD1336_N_LSB,((divider ) & 0xFF),Instance->TunerRegVal);
				
				
				if 	(Frequency <= 164000) 
					
					STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FTD1336_SP,0x01,Instance->TunerRegVal);
				
				else if (Frequency <= 458000)
					
					STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FTD1336_SP,0x02,Instance->TunerRegVal);
				else if (Frequency <= 865000)
					
					STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FTD1336_SP,0x04,Instance->TunerRegVal);
				
				Error = STTUNER_IOREG_SetContigousRegisters(&(Instance->DeviceMap),Instance->IOHandle,RTD1336_DIV1,Instance->TunerRegVal,4);
				if( Error != ST_NO_ERROR)
    				  {
				  #ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
        				STTBX_Print(("%s fail, error=%d\n", identity, Error));
				 #endif
        
        				return(Error);
    				  }
    				 divider =0;
    				 frequency =0;
    								 
				value1=STTUNER_IOREG_GetFieldVal(&(Instance->DeviceMap),FTD1336_N_MSB,Instance->TunerRegVal)<<8;
		 		value2=STTUNER_IOREG_GetFieldVal(&(Instance->DeviceMap),FTD1336_N_LSB,Instance->TunerRegVal);
		 
				 divider=value1+value2;
				           
				frequency = (divider*SharedTunerGetStepsize(Instance) )/1000 - Instance->Status.IntermediateFrequency;
				*NewFrequency = Instance->Status.Frequency = frequency;
			        break;
			       #endif
			       #ifdef STTUNER_DRV_SHARED_TUN_FQD1236 
			   case STTUNER_TUNER_FQD1236:
			   	frequency = Frequency +(Instance->Status.IntermediateFrequency);
				divider = (frequency * 100) / (SharedTunerGetStepsize(Instance)  / 10);
			
				
				STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FFQD1236_N_MSB,((divider >> 8) & 0x7F),Instance->TunerRegVal);
				STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FFQD1236_N_LSB,((divider ) & 0xFF),Instance->TunerRegVal);
				
				if 	(Frequency <= 55000) 
					
					STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FFQD1236_P0_1_2,0x01,Instance->TunerRegVal);
				
				else if (Frequency <= 442000)
					
					STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FFQD1236_P0_1_2,0x02,Instance->TunerRegVal);
				
				else if (Frequency <= 804000)
					
					STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FFQD1236_P0_1_2,0x04,Instance->TunerRegVal);
				
				
				/*Assuming this tuner to be digital tuner now*/
				AL2=0;
				P4=0;
				
				P0_1_2=STTUNER_IOREG_GetFieldVal(&(Instance->DeviceMap),FFQD1236_P0_1_2,Instance->TunerRegVal);
			
				
				
				STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FFQD1236_AL0_P4,P4,Instance->TunerRegVal);
				
				
				STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FFQD1236_AL1,0x0,Instance->TunerRegVal);
				
				
				STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FFQD1236_AL2,0x0,Instance->TunerRegVal);
				
				
				STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FFQD1236_ATC,0x0,Instance->TunerRegVal);
				
				
				STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FFQD1236_T,0x0,Instance->TunerRegVal);
				
				
				Error = STTUNER_IOREG_SetContigousRegisters(&(Instance->DeviceMap),Instance->IOHandle,RFQD1236_DIV1,Instance->TunerRegVal,4); 
				if( Error != ST_NO_ERROR)
    				  {
				  #ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
        				STTBX_Print(("%s fail, error=%d\n", identity, Error));
				 #endif
        
        				return(Error);
    				  }
				WAIT_N_MS_SHTUNER(10);
				
				
				STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FFQD1236_P0_1_2,0,Instance->TunerRegVal);
				STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FFQD1236_AL0_P4,0,Instance->TunerRegVal);
				STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FFQD1236_AL1,0x1,Instance->TunerRegVal);
				STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FFQD1236_AL2,AL2,Instance->TunerRegVal);
				STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FFQD1236_ATC,0x1,Instance->TunerRegVal);
				STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FFQD1236_T,0x3,Instance->TunerRegVal);
				
				
				
				
				
				Error = STTUNER_IOREG_SetContigousRegisters(&(Instance->DeviceMap),Instance->IOHandle,RFQD1236_DIV1,Instance->TunerRegVal,4);  
				
				if( Error != ST_NO_ERROR)
    				  {
				  #ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
        				STTBX_Print(("%s fail, error=%d\n", identity, Error));
				 #endif
        
        				return(Error);
    				  }
    				 divider =0;
    				 frequency =0;
    				  
				
				value1=STTUNER_IOREG_GetFieldVal(&(Instance->DeviceMap),FFQD1236_N_MSB,Instance->TunerRegVal)<<8;
		 		value2=STTUNER_IOREG_GetFieldVal(&(Instance->DeviceMap),FFQD1236_N_LSB,Instance->TunerRegVal);
		 
				 divider=value1+value2;
				            
				frequency = (divider*SharedTunerGetStepsize(Instance) )/1000 - Instance->Status.IntermediateFrequency;
				*NewFrequency = Instance->Status.Frequency = frequency;
			        break;
			        #endif
			      #ifdef STTUNER_DRV_SHARED_TUN_T2000  
			     case STTUNER_TUNER_T2000:
			   	frequency = Frequency +(Instance->Status.IntermediateFrequency);
				divider = (frequency * 100) / (SharedTunerGetStepsize(Instance)  / 10);
			
				
				STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FT2000_N_MSB,((divider >> 8) & 0x7F),Instance->TunerRegVal);
				STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FT2000_N_LSB,((divider ) & 0xFF),Instance->TunerRegVal);
				
				if (frequency <= 201000) /*Check is it Frequency or frequency*/
				{
					
					STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FT2000_BS,0,Instance->TunerRegVal);
					STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FT2000_P_3_2,0x03,Instance->TunerRegVal);
				
					if(frequency <=180000)
					{
						
						STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FT2000_C,0,Instance->TunerRegVal);
				
					}
					else if(frequency <= 195000)
					{
						
						STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FT2000_C,1,Instance->TunerRegVal);
				
					}
					else
					{
						
						STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FT2000_C,2,Instance->TunerRegVal);
				
					}
				}
				else if (frequency <= 472000)
				{
					
					STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FT2000_BS,1,Instance->TunerRegVal);
					STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FT2000_P_3_2,0x02,Instance->TunerRegVal);
				
					if(frequency <=345000)
					{
						
						STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FT2000_C,0,Instance->TunerRegVal);
				
					}
					else if(frequency <= 420000)
					{
						
						STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FT2000_C,1,Instance->TunerRegVal);
				
					}
					else if(frequency <= 460000)
					{
						
						STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FT2000_C,2,Instance->TunerRegVal);
				
					}
					else
					{
						
						STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FT2000_C,3,Instance->TunerRegVal);

⌨️ 快捷键说明

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