📄 tunshdrv.c
字号:
#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 + -