📄 362_drv.c
字号:
pParams->hTuner = TunerInit(pInit->Tuner362Init);
#endif
if(pInit->Clock == FE_SERIAL_CLOCK)
ChipSetField(pParams->hDemod,OUTRS_SP,1); /*Else, PARALLEL (by default register setting)*/
/**** DRIVER modification for 362 *******/
/* FilterCoeffInit(pParams->hDemod); */
/*****************************************/
if(pParams->hDemod != NULL)
{
pParams->I2Cspeed = SpeedInit(pParams->hDemod);
pParams->prev_lock_status = NO_LOCK;
pParams->first_lock=0;
}
else
{
#ifdef HOST_PC
free(pParams);
#endif
#ifdef CHIP_STAPI
memory_deallocate(pInit->hDemod->Chip->MemoryPartition, pParams);
#endif
pParams = NULL;
}
}
return (FE_362_Handle_t) pParams;
}
/*****************************************************
--FUNCTION :: FE_362_Search
--ACTION :: Search for a valid channel
--PARAMS IN :: Handle ==> Front End Handle
pSearch ==> Search parameters
pResult ==> Result of the search
--PARAMS OUT:: NONE
--RETURN :: Error (if any)
--***************************************************/
FE_362_Error_t FE_362_Search(FE_362_Handle_t Handle, FE_362_SearchParams_t *pSearch, FE_362_SearchResult_t *pResult)//,STTUNER_tuner_instance_t *TunerInstance)
{
int offset=0;
int offsetvar=0;
char signvalue=0;
U8 constell,counter;
S8 step;
S32 timing_offset;
U32 trl_nomrate;
FE_362_Error_t error = FE_NO_ERROR;
FE_362_InternalParams_t *pParams;
if ((void*) Handle != NULL)
{
pParams = (FE_362_InternalParams_t *) Handle;
/*FE_362_SetInternalError(FE_IERR_NO,FE_LOC_NOWHERE,&pParams->Error);*/ /* To be added next time */
/* Fill pParams structure with search parameters */
pParams->Frequency=pSearch->Frequency;
pParams->Mode = pSearch->Mode;
pParams->Guard = pSearch->Guard;
//pParams->Inv= pSearch->Inv;
pParams->Force=pSearch->Force + ChipGetField(pParams->hDemod,FORCE)*2;
pParams->ChannelBW = pSearch->ChannelBW;
pParams->IF_IQ_Mode= pSearch->IF_IQ_Mode;
switch(pParams->IF_IQ_Mode)
{
case 0: /* Normal IF mode */
ChipSetField(pParams->hDemod,TUNER_BB,0);
ChipSetField(pParams->hDemod,LONGPATH_IF,0);
ChipSetField(pParams->hDemod,INV_SPECTR,1);
break;
case 1: /* Long IF mode */
ChipSetField(pParams->hDemod,TUNER_BB,0);
ChipSetField(pParams->hDemod,LONGPATH_IF,1);
ChipSetField(pParams->hDemod,INV_SPECTR,0);
break;
case 2: /* IQ mode */
ChipSetField(pParams->hDemod,TUNER_BB,1);
ChipSetField(pParams->hDemod,PMC2_SWAP,1);
break;
}
if(pParams->IF_IQ_Mode!=0)
{
FE_362_AGC_IIR_LOCK_DETECTOR_SET(pParams->hDemod);
FE_362_IIR_FILTER_INIT(pParams->hDemod,pParams->ChannelBW);
FE_362_AGC_IIR_RESET(pParams->hDemod);
}
//#ifndef HOST_PC
if (pParams->ChannelBW == STTUNER_CHAN_BW_6M)
{
ChipSetFieldImage(pParams->hDemod,GAIN_SRC_HI,M6_F_GAIN_SRC_HI);
ChipSetFieldImage(pParams->hDemod,GAIN_SRC_LO,M6_F_GAIN_SRC_LO);
ChipSetRegisters(pParams->hDemod,R_GAIN_SRC1,2);
ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_LSB,M6_F_TRL_NOMRATE0);
ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_LO,M6_F_TRL_NOMRATE8_1);
ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_HI,M6_F_TRL_NOMRATE16_9);
ChipSetRegisters(pParams->hDemod,R_TRL_CTL,3);
}
else if (pParams->ChannelBW == STTUNER_CHAN_BW_7M)
{
ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_LSB,M7_F_TRL_NOMRATE0);
ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_LO,M7_F_TRL_NOMRATE8_1);
ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_HI,M7_F_TRL_NOMRATE16_9);
ChipSetRegisters(pParams->hDemod,R_TRL_CTL,3);
if (pParams->IF_IQ_Mode==0)
{
ChipSetFieldImage(pParams->hDemod,GAIN_SRC_HI,M7_GAIN_SRC_HI);
ChipSetFieldImage(pParams->hDemod,GAIN_SRC_LO,M7_GAIN_SRC_LO);
ChipSetRegisters(pParams->hDemod,R_GAIN_SRC1,2);
}
else
{
ChipSetFieldImage(pParams->hDemod,GAIN_SRC_HI,M7_E_GAIN_SRC_HI);
ChipSetFieldImage(pParams->hDemod,GAIN_SRC_LO,M7_E_GAIN_SRC_LO);
ChipSetRegisters(pParams->hDemod,R_GAIN_SRC1,2);
}
}
else /* Channel Bandwidth = 8M) */
{
ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_LSB,M8_F_TRL_NOMRATE0);
ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_LO,M8_F_TRL_NOMRATE8_1);
ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_HI,M8_F_TRL_NOMRATE16_9);
ChipSetRegisters(pParams->hDemod,R_TRL_CTL,3);
if (pParams->IF_IQ_Mode==0)
{
ChipSetFieldImage(pParams->hDemod,GAIN_SRC_HI,M8_GAIN_SRC_HI);
ChipSetFieldImage(pParams->hDemod,GAIN_SRC_LO,M8_GAIN_SRC_LO);
ChipSetRegisters(pParams->hDemod,R_GAIN_SRC1,2);
}
else
{
ChipSetFieldImage(pParams->hDemod,GAIN_SRC_HI,M8_E_GAIN_SRC_HI);
ChipSetFieldImage(pParams->hDemod,GAIN_SRC_LO,M8_E_GAIN_SRC_LO);
ChipSetRegisters(pParams->hDemod,R_GAIN_SRC1,2);
}
}
pParams->EchoPos = pSearch->EchoPos;
ChipSetField(pParams->hDemod,LONG_ECHO,pParams->EchoPos);
TunerSetFrequency(pParams->hTuner,pParams->Frequency);
pParams->Frequency = TunerGetFrequency(pParams->hTuner);
ChipSetField(pParams->hDemod,VTH0,0x1E);
ChipSetField(pParams->hDemod,VTH1,0x14);
ChipSetField(pParams->hDemod,VTH2,0xF);
ChipSetField(pParams->hDemod,VTH3,0x9);
ChipSetField(pParams->hDemod,VTH4,0x0);
ChipSetField(pParams->hDemod,VTH5,0x5);
ChipSetOneRegister(pParams->hDemod,R_PR,0xAF);
ChipSetOneRegister(pParams->hDemod,R_VSEARCH,0x30);
ChipSetField(pParams->hDemod,FORCE,(pParams->Force & 1) );
ChipSetField(pParams->hDemod,FRAPTCR,1);
#if 0
if (pParams->Inv == STTUNER_INVERSION_NONE)
ChipSetField(pParams->hDemod,INV_SPECTR,1);
else if (pParams->Inv == STTUNER_INVERSION)
ChipSetField(pParams->hDemod,INV_SPECTR,0);
else if (pParams->Inv == STTUNER_INVERSION_AUTO)
{
if (pParams->Sense==1) ChipSetField(pParams->hDemod,INV_SPECTR,0);
else ChipSetField(pParams->hDemod,INV_SPECTR,1);
}
else if ( (pParams->Inv == STTUNER_INVERSION_UNK) && (!pParams->first_lock))
{
if (pParams->Sense==1) ChipSetField(pParams->hDemod,INV_SPECTR,0);
else ChipSetField(pParams->hDemod,INV_SPECTR,1);
}
#endif
/*********************************/
if(FE_362_Algo(pParams) == LOCKOK)
{
pResult->Locked = TRUE;
/* update results */
/*********** dans search term auparavant **********/
ChipGetRegisters(pParams->hDemod,R_TPS_RCVD2,3);
ChipGetRegisters(pParams->hDemod,R_SYR_STAT,1);
pResult->Mode=ChipGetFieldImage(pParams->hDemod,SYR_MODE);
pResult->Guard=ChipGetFieldImage(pParams->hDemod,SYR_GUARD);
constell = ChipGetFieldImage(pParams->hDemod,TPS_CONST);
if (constell == 0) pResult->Modulation = STTUNER_MOD_QPSK;
else if (constell==1) pResult->Modulation= STTUNER_MOD_16QAM;
else pResult->Modulation= STTUNER_MOD_64QAM;
pResult->hier =ChipGetFieldImage(pParams->hDemod,TPS_HIERMODE);
pResult->HPRate=ChipGetFieldImage(pParams->hDemod,TPS_HPCODE);
pResult->LPRate=ChipGetFieldImage(pParams->hDemod,TPS_LPCODE);
constell = ChipGetField(pParams->hDemod,PR);
if (constell==5) constell = 4;
pResult->pr = (FE_362_Rate_t) constell;
pResult->Sense=ChipGetField(pParams->hDemod,INV_SPECTR);
/* dcdc modifs per Gilles*/
pResult->hTuner=pParams->hTuner;
pParams->first_lock=1;
/* modifs Tuner */
ChipGetRegisters(pParams->hDemod,R_AGC2MAX,6);
pResult->Agc_val= (ChipGetFieldImage(pParams->hDemod,AGC1_VAL_LO)<<16) +
(ChipGetFieldImage(pParams->hDemod,AGC1_VAL_HI)<<24) +
ChipGetFieldImage(pParams->hDemod,AGC2_VAL_LO) +
(ChipGetFieldImage(pParams->hDemod,AGC2_VAL_HI)<<8);
//signvalue=ChipGetField(pParams->hDemod,SEXT);
/***** MODIF for 362 ***************/
signvalue=ChipGetField(pParams->hDemod,ChipGetOneRegister(pParams->hDemod,R_CRL_FREQ3)&0x80);
/*********END OF MODIF*******************************/
offset=ChipGetOneRegister(pParams->hDemod,R_CRL_FREQ3);
offset <<=16;
offsetvar=ChipGetOneRegister(pParams->hDemod,R_CRL_FREQ2);
offsetvar <<=8;
offset = offset | offsetvar;
offsetvar=0;
offsetvar=ChipGetOneRegister(pParams->hDemod,R_CRL_FREQ1);
offset =offset | offsetvar ;
if(signvalue==1)
{
offset |=0xff000000;
}
offset =offset /16384;
if(pResult->Mode==0)
{
/*******it is 2k mode***************/
offset=offset*4464/1000/*4.464*/;/*** 1 FFT BIN=4.464khz***/
if(((offset>=140) && (offset<=180)) ||((offset<=-140) && (offset>=-180)))
{
pParams->Frequency+=offset;
}
pResult->Frequency=pParams->Frequency;
}
else
{
offset=offset*11/10/*1.1*/;/*** 1 FFT BIN=1.1khz***/
if(((offset>=140) && (offset<=180)) ||((offset<=-140) && (offset>=-180)))
{
pParams->Frequency+=offset;
}
pResult->Frequency=pParams->Frequency;
}
pResult->Echo_pos=ChipGetField(pParams->hDemod,LONG_ECHO);
/* fine tuning of timing offset if required */
ChipGetRegisters(pParams->hDemod,R_TRL_CTL,5);
timing_offset=ChipGetFieldImage(pParams->hDemod,TRL_TOFFSET_LO) + 256*ChipGetFieldImage(pParams->hDemod,TRL_TOFFSET_HI);
if (timing_offset>=32768) timing_offset-=65536;
/* timing_offset=(timing_offset+10)/20; */ /* rounding */
trl_nomrate= (512*ChipGetFieldImage(pParams->hDemod,TRL_NOMRATE_HI)+ChipGetFieldImage(pParams->hDemod,TRL_NOMRATE_LO)*2 + ChipGetFieldImage(pParams->hDemod,TRL_NOMRATE_LSB));
timing_offset=((signed)(1000000/trl_nomrate)*timing_offset)/2048;
if (timing_offset<=0)
{
timing_offset=(timing_offset-11)/22;
step=-1;
}
else
{
timing_offset=(timing_offset+11)/22;
step=1;
}
for (counter=0;counter<abs(timing_offset);counter++)
{
trl_nomrate+=step;
ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_LSB,trl_nomrate%2);
ChipSetFieldImage(pParams->hDemod,TRL_NOMRATE_LO,trl_nomrate/2);
ChipSetRegisters(pParams->hDemod,R_TRL_CTL,2);
WAIT_N_MS(1);
}
#if (0)
/* to be removed*/
ChipSetField(DEMOD,CORE_ACTIVE,0);
Delay(0.002);
ChipSetField(DEMOD,CORE_ACTIVE,1);
#endif
}
else
{
pResult->Locked = FALSE;
error = FE_SEARCH_FAILED;
}
}
else
error = FE_BAD_PARAMETER;
return error;
}
/*****************************************************
--FUNCTION :: FE_362_Term
--ACTION :: Terminate STV0362 chip connection
--PARAMS IN :: Handle ==> Front End Handle
--PARAMS OUT:: NONE
--RETURN :: Error (if any)
--***************************************************/
FE_362_Error_t FE_362_Term(FE_362_Handle_t Handle)
{
FE_362_Error_t error = FE_NO_ERROR;
FE_362_InternalParams_t *pParams = NULL;
#ifdef CHIP_STAPI /* pass other STAPI specific parameters to this driver */
ST_Partition_t *MemoryPartition; /* memory for dynamic allocation */
pParams = (FE_362_InternalParams_t *) Handle;
if(pParams != NULL)
{
/* pass other STAPI specific parameters to this driver */
MemoryPartition = pParams->hDemod->MemoryPartition; /* GJP */
if(ChipClose(pParams->hDemod) == CHIPERR_NO_ERROR)
{
memory_deallocate(MemoryPartition, pParams);
}
else
{
error = FE_TERM_FAILED;
}
}
else
error = FE_INVALID_HANDLE;
#else
free(pParams);
#endif
return error;
}
#ifdef HOST_PC
void FE_362_Core_Switch(STCHIP_Handle_t hChip)
{
ChipSetField(hChip,CORE_ACTIVE,0);
ChipSetField(hChip,CORE_ACTIVE,1);
WAIT_N_MS(350);
return;
}
#endif
/*----------------------------------------------------
FUNCTION GetNoiseEstimator (18Oct01)
ACTION
PARAMS IN
PARAMS OUT
RETURN
------------------------------------------------------*/
void FE_362_GetNoiseEstimator(STCHIP_Handle_t hChip, U32 *pNoise, U32 *pBer)
{
short unsigned int source,prf;
U32 quoz,error;
U32 snr=0;
error = ChipGetField(hChip,ERROR_COUNT1_LO);
error += ChipGetField(hChip,ERROR_COUNT1_HI) * 256;
error = error*100;
quoz=1;
if (!ChipGetField(hChip,ERRMODE1))
{
source=ChipGetField(hChip,ERR_SOURCE1);
quoz=PowOf2(12+2*(ChipGetField(hChip,NUM_EVENT1)));
switch (source)
{
case 0:
quoz=quoz*8;
prf=ChipGetField(hChip,PR);
switch(prf)
{
case 0:
error=(U32)(error*(1.0/2.0)); /*gbgbcast*/
break;
case 1:
error=(U32)(error*(2.0/3.0)); /*gbgbcast*/
break;
case 2:
error=(U32)(error*(3.0/4.0)); /*gbgbcast*/
break;
case 3:
error=(U32)(error*(5.0/6.0)); /*gbgbcast*/
break;
case 4:
error=(U32)(error*(6.0/7.0)); /*gbgbcast*/
break;
case 5:
error=(U32)(error*(7.0/8.0)); /*gbgbcast*/
break;
default:
error=error;
break;
}
break;
case 1:
quoz=quoz*8;
break;
case 2:
break;
case 3:
error=error*188;
break;
default:
error=error;
break;
}
}
snr=ChipGetField(hChip,CHC_SNR);
/*snr = ChipGetFieldImage(hChip,CHC_SNR);*/
/**pNoise = (snr*10) >> 3;*/
/** fix done here for the bug GNBvd20972 where pNoise is calculated in right percentage **/
*pNoise=((snr/8)*100)/32;
*pBer = error*(100000000/quoz);
return;
}
/*****************************************************
**FUNCTION :: FE_299_SetInternalError
**ACTION :: Set the internal error value and location
**PARAMS IN :: Type ==> Type of the error
** Location ==> Location of the error
**PARAMS OUT:: pError
**RETURN :: NONE
*****************************************************/
STCHIP_Error_t STV362_RepeaterFn(STCHIP_Handle_t hChip,BOOL State)
{
STCHIP_Error_t error = CHIPERR_NO_ERROR;
if(hChip != NULL)
{
if(State == TRUE)
{
ChipSetField(hChip,STOP_ENABLE,1);
ChipSetField(hChip,I2CT_ON,1);
}
}
return error;
}
FE_362_SignalStatus_t FE_362_CheckData2(FE_362_Handle_t Handle)
{
int lock;
FE_362_InternalParams_t *pParams = NULL;
pParams = (FE_362_InternalParams_t *) Handle;
pParams->State = NOLOCK;
if(pParams != NULL)
{
lock = ChipGetField(pParams->hDemod,LK); /* Read DATA LOCK indicator */
if(lock) /* Test DATA LOCK indicator */
pParams->State = LOCKOK;
}
return pParams->State;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -