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