📄 d0360minidrv.c
字号:
u_var=ChipDemodGetField(PRF);
tempo=4<<(2*mode);
while ( (!u_var) && (wd>=0.0))
{
SystemWaitFor(tempo);
wd-=(tempo);
u_var=ChipDemodGetField(PRF);
}
if(!u_var)
{
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n NO PRF FOUND \n"));
#endif
return NOPRFOUND;
}
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n PRF FOUND \n"));
#endif
u_var=ChipDemodGetField(LK);
wd=75<<(2*mode);/* a revoir */
tempo=4<<(2*mode) ;
while ((!u_var) && (wd>=0))
{
SystemWaitFor( tempo);
wd-=tempo;
u_var=ChipDemodGetField(LK);
}
if(!u_var)
{
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n LK NOT LOCKED \n"));
#endif
return NOPRFOUND;
}
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n LK LOCKED \n"));
#endif
/* lock/secure the FEC for HP*/
u_var=ChipDemodGetField(TPS_HPCODE);
if (u_var==4 ) u_var=5;
switch(u_var)
{
case 0:
seuil=ChipDemodGetField(VTH0);
if (seuil <60) ChipDemodSetField(VTH0,45);
break;
case 1:
seuil=ChipDemodGetField(VTH1);
if (seuil < 40) ChipDemodSetField(VTH1,30);
break;
case 2:
seuil=ChipDemodGetField(VTH2);
if (seuil < 30) ChipDemodSetField(VTH2,23);
break;
case 3:
seuil=ChipDemodGetField(VTH3);
if (seuil < 18) ChipDemodSetField(VTH3,14);
break;
case 5:
seuil=ChipDemodGetField(VTH5);
if (seuil < 10) ChipDemodSetField(VTH5,8);
break;
default:
break;
}
/* lock/secure the FEC for LP (if needed)*/
if (ChipDemodGetField(TPS_HIERMODE)!=0)
{
u_var=ChipDemodGetField(TPS_LPCODE);
if (u_var==4 ) u_var=5;
switch(u_var)
{
case 0:
seuil=ChipDemodGetField(VTH0);
if (seuil <60) ChipDemodSetField(VTH0,45);
break;
case 1:
seuil=ChipDemodGetField(VTH1);
if (seuil < 40) ChipDemodSetField(VTH1,30);
break;
case 2:
seuil=ChipDemodGetField(VTH2);
if (seuil < 30) ChipDemodSetField(VTH2,23);
break;
case 3:
seuil=ChipDemodGetField(VTH3);
if (seuil < 18) ChipDemodSetField(VTH3,14);
break;
case 5:
seuil=ChipDemodGetField(VTH5);
if (seuil < 10) ChipDemodSetField(VTH5,8);
break;
default:
break;
}
}
if (ChipDemodGetField(TPS_HIERMODE)==0)
{
u_var=ChipDemodGetField(TPS_HPCODE);
if (u_var==4 ) u_var=5;
u_var= (1<<u_var);
ChipDemodSetField(R_PR,u_var);
/*ChipSetFieldImage(PR_AUTO,1);
ChipSetFieldImage(PR_FREEZE,0);
ChipSetRegisters(hChip,R_VSEARCH,1);*/
ChipDemodSetField (PR_AUTO_N_PR_FREEZE, 0x10);
}
pParams->TrlNormRateTunning =TRUE;
return LOCK_OK;
}
/*****************************************************
--FUNCTION :: FE_360_SearchTerm
--ACTION ::
--PARAMS IN ::
--PARAMS OUT:: NONE
--RETURN :: NONE
--***************************************************/
FE_360_Error_t FE_360_SearchTerm(FE_360_InternalParams_t *pParams,FE_360_SearchResult_t *pResult)
{
FE_360_Error_t error = FE_NO_ERROR;
U8 constell,counter;
S8 step;
U8 nsbuffer[6],bfr;
S32 timing_offset;
U32 trl_nomrate, Error;
int offset=0;
int offsetvar=0;
char signvalue=0;
if(pParams != NULL)
{
if(pResult != NULL)
{
/* if ((pParams->State==LOCK_OK)|| (pParams->State==NOPRFOUND)) */
if ((pParams->State==LOCK_OK))
{
/*ChipGetRegisters(hChip,R_TPS_RCVD2,3);
ChipGetRegisters(hChip,R_SYR_STAT,1);
pResult->Mode=ChipGetFieldImage(hChip,SYR_MODE);
pResult->Guard=ChipGetFieldImage(hChip,SYR_GUARD);
constell = ChipGetFieldImage(hChip,TPS_CONST);*/
Error=STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R_TPS_RCVD2, 0,0, nsbuffer, 3, FALSE);
bfr= ChipDemodGetField(R_SYR_STAT) ;
pResult->Mode=bfr & 0x04; /*SYR_MODE)*/
pResult->Guard=bfr & 0x03; /*SYR_GUARD*/
constell = nsbuffer[0]&0x03 ; /*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 = nsbuffer[0]&0x70; /*HIERMODE*/
pResult->Hprate= nsbuffer[1]&0x07 ; /*TPS_HPCODE*/
pResult->Lprate= nsbuffer[1]&0x70; /*TPS_LPCODE*/
constell = ChipDemodGetField(PR);
if (constell==5) constell = 4;
pResult->pr = (FE_360_Rate_t) constell;
pResult->Sense=ChipDemodGetField(INV_SPECTR);
/* dcdc modifs per Gilles*/
pResult->Tuner=pParams->Tuner;
pParams->first_lock=1;
/* modifs Tuner */
/* ChipGetRegisters(hChip,R_AGC2MAX,6);*/
Error=STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R_AGC2MAX, 0,0, nsbuffer, 6, FALSE);/* checknab*/
/*pResult->Agc_val= (ChipGetFieldImage(hChip,AGC1_VAL_LO)<<16) +
(ChipGetFieldImage(hChip,AGC1_VAL_HI)<<24) +
ChipGetFieldImage(hChip,AGC2_VAL_LO) +
(ChipGetFieldImage(hChip,AGC2_VAL_HI)<<8);*/
pResult->Agc_val= (ChipDemodGetField(AGC1_VAL_LO)<<16) +
(ChipDemodGetField(AGC1_VAL_HI)<<24) +
ChipDemodGetField(AGC2_VAL_LO) +
(ChipDemodGetField(AGC2_VAL_HI)<<8);
/************To get exact frequency offset******************/
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***/
if(pResult->Mode==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***/
}
/****This block of code ensures the frequency to be corrected only when***
*** the offset is in range between 140khz to 180khz both positive and negative***
****direction . This takes care of 166khz offset which sometimes needed******
****to get far away from some interfering analog carrier in some European countries.*****/
/* if(((offset>=140) && (offset<=180)) ||((offset<=-140) && (offset>=-180)))
{
pParams->Frequency-=offset;
}*/
/*** Here +/-166 khz offset taken into consideration and the excess
offset lying between +/- 140 to 180 khz will be returned to
user for fine tunning ****/
if((offset>=140) && (offset<=180))
{
if(pResult->Sense==0)
{
pParams->Frequency +=166;
}
else
{
pParams->Frequency -=166;
}
}
else if((offset<=-140) && (offset>=-180))
{
if(pResult->Sense==0)
{
pParams->Frequency -=166;
}
else
{
pParams->Frequency +=166;
}
}
/***pResult data structure retains the recent data after tuner locks***/
pResult->Frequency=pParams->Frequency;
/************************************************************************/
pResult->Echo_pos=ChipDemodGetField(LONG_ECHO);
if(pParams->TrlNormRateFineTunning == FALSE)
{
/* fine tuning of timing offset if required
ChipGetRegisters(hChip,R_TRL_CTL,5);*/
Error=STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R_TRL_CTL, 0,0, nsbuffer, 5, FALSE);
timing_offset=nsbuffer[3] /*TRL_TOFFSET_LO*/ + 256*nsbuffer[4];/*TRL_TOFFSET_HI*/
if (timing_offset>=32768) timing_offset-=65536;
/* timing_offset=(timing_offset+10)/20; */ /* rounding */
/*trl_nomrate= (512*ChipGetFieldImage(hChip,TRL_NOMRATE_HI)+ChipGetFieldImage(hChip,TRL_NOMRATE_LO)*2 + ChipGetFieldImage(hChip,TRL_NOMRATE_LSB));*/
trl_nomrate= (512*nsbuffer[2]/*TRL_NOMRATE_HI*/+nsbuffer[1]*2/*TRL_NOMRATE_LO*/ + (nsbuffer[0] &0x80)/*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(hChip,TRL_NOMRATE_LSB,trl_nomrate%2);
ChipSetFieldImage(hChip,TRL_NOMRATE_LO,trl_nomrate/2);
ChipSetRegisters(hChip,R_TRL_CTL,2);*/
ChipDemodSetField(TRL_NOMRATE_LSB,trl_nomrate%2);
ChipDemodSetField(TRL_NOMRATE_LO,trl_nomrate/2);
SystemWaitFor(1);
}
pParams->TrlNormRateFineTunning =TRUE;
if(pParams->ChannelBWStatus == STTUNER_CHAN_BW_6M)
{
pParams->Channel_6M_Trl_Done = TRUE;
pParams->Channel_6M_Trl[0] = ChipDemodGetField(TRL_NOMRATE_LSB);
pParams->Channel_6M_Trl[1] = ChipDemodGetField(TRL_NOMRATE_LO);
pParams->Channel_6M_Trl[2] = ChipDemodGetField(TRL_NOMRATE_HI);
}
if(pParams->ChannelBWStatus == STTUNER_CHAN_BW_7M)
{
pParams->Channel_7M_Trl_Done = TRUE;
pParams->Channel_7M_Trl[0] = ChipDemodGetField(TRL_NOMRATE_LSB);
pParams->Channel_7M_Trl[1] = ChipDemodGetField(TRL_NOMRATE_LO);
pParams->Channel_7M_Trl[2] = ChipDemodGetField(TRL_NOMRATE_HI);
}
if(pParams->ChannelBWStatus == STTUNER_CHAN_BW_8M)
{
pParams->Channel_8M_Trl_Done = TRUE;
pParams->Channel_8M_Trl[0] = ChipDemodGetField(TRL_NOMRATE_LSB);
pParams->Channel_8M_Trl[1] = ChipDemodGetField(TRL_NOMRATE_LO);
pParams->Channel_8M_Trl[2] = ChipDemodGetField(TRL_NOMRATE_HI);
}
}/*** End of if(pParams->TrlNormRateTunning == FALSE) ***/
/* end of fine tuning */
}
else
error = FE_SEARCH_FAILED;
}
else
error = FE_BAD_PARAMETER;
}
else
error = FE_INVALID_HANDLE;
pResult->SignalStatus = pParams->State;
pResult->State = ChipDemodGetField(CORE_STATE_STAT);
ChipDemodSetField(FORCE, (pParams->Force & 2)>>1);
return error;
}
/*****************************************************
--FUNCTION :: FE_360_Init
--ACTION :: Initialisation of the STV0360 chip
--PARAMS IN :: pInit ==> pointer to FE_360_InitParams_t structure
--PARAMS OUT:: NONE
--RETURN :: Handle to STV0360
--***************************************************/
FE_360_Handle_t FE_360_Init(void)
{
Params = memory_allocate_clear(DEMODInstance->MemoryPartition, 1, sizeof( FE_360_InternalParams_t ));
/* pParams->Echo = EchoParams;*/ /* POUR STAPI passer un multiinstance */
if(Params != NULL)
{
/* Chip initialisation */
/* in internal struct chip is stored */
/* pParams->hChip = STV0360_Init(pInit->hDemod);*/
/*if(pParams->hChip != NULL)
{*/
/*pParams->Tuner = (STTUNER_TunerType_t)pInit->Tuner;*/
Params->I2Cspeed = SpeedInit();
Params->prev_lock_status = NO_LOCK;
Params->first_lock=0;
/****Initialize TRLNORMRATE TUNNING FLAG*****/
Params->TrlNormRateTunning = FALSE ;
Params->TrlNormRateFineTunning = FALSE ;
/***Initialize channel bandwidth value with a common value as the particular channel
bandwidth still not known*****/
Params->ChannelBWStatus = STTUNER_CHAN_BW_NONE ;
/****Initialize the trl done parameter with false *****/
Params->Channel_6M_Trl_Done = FALSE;
Params->Channel_7M_Trl_Done = FALSE;
Params->Channel_8M_Trl_Done = FALSE;
/****Initial normrate setting for 6 Mhz bandwidth***/
Params->Channel_6M_Trl[0]=M6_F_TRL_NOMRATE0;
Params->Channel_6M_Trl[1]=M6_F_TRL_NOMRATE8_1;
Params->Channel_6M_Trl[2]=M6_F_TRL_NOMRATE16_9;
/****Initial normrate setting for 7 Mhz bandwidth***/
Params->Channel_7M_Trl[0]=M7_F_TRL_NOMRATE0;
Params->Channel_7M_Trl[1]=M7_F_TRL_NOMRATE8_1;
Params->Channel_7M_Trl[2]=M7_F_TRL_NOMRATE16_9;
/****Initial normrate setting for 8 Mhz bandwidth***/
Params->Channel_8M_Trl[0]=M8_F_TRL_NOMRATE0;
Params->Channel_8M_Trl[1]=M8_F_TRL_NOMRATE8_1;
Params->Channel_8M_Trl[2]=M8_F_TRL_NOMRATE16_9;
/*}
else
{
#ifdef CHIP_STAPI
memory_deallocate(pInit->hDemod->Chip->MemoryPartition, pParams);
#endif
pParams = NULL;
}*/
}
return (FE_360_Handle_t) Params;
}
/*****************************************************
--FUNCTION :: FE_360_SearchInit
--ACTION :: Set Params fields that are used by the search algorithm
--PARAMS IN :: Frequency => Frequency used to start search
--PARAMS OUT:: NONE
--RETURN :: NONE
--***************************************************/
FE_360_Error_t FE_360_SearchInit(FE_360_InternalParams_t *pParams,FE_360_SearchParams_t *pSearch,STTUNER_tuner_instance_t *TunerInstance )
{
FE_360_Error_t error = FE_NO_ERROR;
U8 temp_image[3];
/*
do initialization of the chip, for instance put core in std_by and so on ...
*/
if (pParams==NULL)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -