示例#1
0
YW_ErrorType_T demod_d6158_Close(U8 Index)
{
	YW_ErrorType_T Error = YW_NO_ERROR;
	TUNER_ScanTaskParam_T *Inst;
	struct nim_device			*dev;
	TUNER_IOARCH_CloseParams_t CloseParams;

	Inst = TUNER_GetScanInfo(Index);

    dev = (struct nim_device *)Inst->userdata;

	TUNER_IOARCH_Close(dev->DemodIOHandle[2],&CloseParams);
	nim_panic6158_close(dev);
	if(YWTUNER_DELIVER_TER == Inst->Device)
	{
		Inst->DriverParam.Ter.DemodDriver.Demod_GetSignalInfo = NULL;
		Inst->DriverParam.Ter.DemodDriver.Demod_IsLocked = NULL;
		Inst->DriverParam.Ter.DemodDriver.Demod_repeat = NULL;
		Inst->DriverParam.Ter.DemodDriver.Demod_reset = NULL;
		Inst->DriverParam.Ter.DemodDriver.Demod_ScanFreq = NULL;

		Inst->DriverParam.Ter.Demod_DeviceMap.Error = YW_NO_ERROR;
	}
	else
	{
		Inst->DriverParam.Cab.DemodDriver.Demod_GetSignalInfo = NULL;
		Inst->DriverParam.Cab.DemodDriver.Demod_IsLocked = NULL;
		Inst->DriverParam.Cab.DemodDriver.Demod_repeat = NULL;
		Inst->DriverParam.Cab.DemodDriver.Demod_reset = NULL;
		Inst->DriverParam.Cab.DemodDriver.Demod_ScanFreq = NULL;

		Inst->DriverParam.Cab.Demod_DeviceMap.Error = YW_NO_ERROR;
	}
	return(Error);
}
示例#2
0
/***********************************************************************
	函数名称:	demod_d0367qam_IsLocked

	函数说明:	读取信号是否锁定

    修改记录:	日       期      作      者       修定
 				---------         ---------       -----
               	2010.11.11		  lwj			  创建
************************************************************************/
YW_ErrorType_T demod_d0367qam_IsLocked(U8 Handle, BOOL *IsLocked)
{

	YW_ErrorType_T          Error = YW_NO_ERROR;
	TUNER_ScanTaskParam_T   *Inst;
	IOARCH_Handle_t		    IOHandle;
	TUNER_IOREG_DeviceMap_t	*DeviceMap;

	Inst = TUNER_GetScanInfo(Handle);
	IOHandle = Inst->DriverParam.Cab.DemodIOHandle;
	DeviceMap = &Inst->DriverParam.Cab.Demod_DeviceMap;


	*IsLocked = FE_367qam_Status(DeviceMap, IOHandle);

	return(Error);
}
示例#3
0
/***********************************************************************
	函数名称:	demod_d0367qam_Close

	函数说明:	关闭0367qam

    修改记录:	日       期      作      者       修定
 				---------         ---------       -----
               	2010.11.16	       lwj			创建
************************************************************************/
YW_ErrorType_T demod_d0367qam_Close(U8 Handle)
{
	YW_ErrorType_T Error = YW_NO_ERROR;
	TUNER_ScanTaskParam_T *Inst = NULL;

	Inst = TUNER_GetScanInfo(Handle);
	Inst->DriverParam.Cab.DemodDriver.Demod_GetSignalInfo = NULL;
	Inst->DriverParam.Cab.DemodDriver.Demod_IsLocked = NULL;
	Inst->DriverParam.Cab.DemodDriver.Demod_repeat = NULL;
	Inst->DriverParam.Cab.DemodDriver.Demod_reset = NULL;
	Inst->DriverParam.Cab.DemodDriver.Demod_ScanFreq = NULL;
	//Error = TUNER_IOREG_Close(&Inst->DriverParam.Cab.Demod_DeviceMap);
	Error |= Inst->DriverParam.Cab.Demod_DeviceMap.Error;
	Inst->DriverParam.Cab.Demod_DeviceMap.Error = YW_NO_ERROR;

	return(Error);
}
示例#4
0
/***********************************************************************
	函数名称:	demod_d0367qam_Reset

	函数说明:	复位0367 寄存器

    修改记录:	日       期      作      者       修定
 				 ---------         ---------         -----
               	2010.12.28		lwj			创建
************************************************************************/
YW_ErrorType_T demod_d0367qam_Reset(U8 Index)
{
	YW_ErrorType_T Error = YW_NO_ERROR;
	TUNER_ScanTaskParam_T *Inst = NULL;
	IOARCH_Handle_t		IOHandle;
	TUNER_IOREG_DeviceMap_t		*DeviceMap;

	Inst = TUNER_GetScanInfo(Index);
	IOHandle = Inst->DriverParam.Cab.DemodIOHandle;
	DeviceMap = &Inst->DriverParam.Cab.Demod_DeviceMap;

	D0367qam_Init(DeviceMap, IOHandle, Inst->DriverParam.Cab.TunerType);
	//pParams->MasterClock_Hz = FE_367qam_GetMclkFreq(pParams->hDemod,pParams->Crystal_Hz);
	//pParams->AdcClock_Hz = FE_367qam_GetADCFreq(pParams->hDemod,pParams->Crystal_Hz); //question


	return(Error);
}
示例#5
0
/*****************************************************
--FUNCTION	::	FE_STV0367qam_SetStandby
--ACTION	::	Set demod STANDBY mode On/Off
--PARAMS IN	::	Handle	==>	Front End Handle

-PARAMS OUT::	NONE.
--RETURN	::	Error (if any)
--***************************************************/
YW_ErrorType_T demod_d0367qam_SetStandby(U8 Handle)
{
    FE_LLA_Error_t error = FE_LLA_NO_ERROR;
	TUNER_ScanTaskParam_T       *Inst = NULL;
    TUNER_IOREG_DeviceMap_t		*DeviceMap = NULL;
	IOARCH_Handle_t		         IOHandle;

    U8 StandbyOn = 1;
    Inst = TUNER_GetScanInfo(Handle);
	IOHandle = Inst->DriverParam.Cab.DemodIOHandle;
	DeviceMap = &Inst->DriverParam.Cab.Demod_DeviceMap;

    if(StandbyOn)
    {
        if(Inst->DriverParam.Cab.TunerType == TUNER_TUNER_STV4100)
        {
            if (Inst->DriverParam.Cab.TunerDriver.tuner_SetStandby != NULL)
            {
    			error = Inst->DriverParam.Cab.TunerDriver.tuner_SetStandby(Handle,StandbyOn);
            }

        }
		D0367qam_Sleep(DeviceMap,IOHandle);
    }
    else
    {
		D0367qam_Wake(DeviceMap,IOHandle);
        if(Inst->DriverParam.Cab.TunerType == TUNER_TUNER_STV4100)
        {
            if (Inst->DriverParam.Cab.TunerDriver.tuner_SetStandby != NULL)
            {
    			error = Inst->DriverParam.Cab.TunerDriver.tuner_SetStandby(Handle,StandbyOn);
            }

        }
     }

	return(error);
}
示例#6
0
/***********************************************************************
	函数名称:	demod_d6158_IsLocked

	函数说明:	读取信号是否锁定

************************************************************************/
YW_ErrorType_T demod_d6158_IsLocked(U8 Handle, BOOL *IsLocked)
{
    struct nim_device *dev = NULL;
	TUNER_ScanTaskParam_T   *Inst = NULL;
	UINT8 lock = 0;

    *IsLocked = FALSE;
	Inst = TUNER_GetScanInfo(Handle);
    if (Inst == NULL)
    {
        return 1;
    }
    dev = (struct nim_device *)Inst->userdata;
    if (dev == NULL)
    {
        return 1;
    }
	nim_panic6158_get_lock(dev,&lock);
	*IsLocked = (BOOL )lock;

	return YW_NO_ERROR;
}
示例#7
0
/***********************************************************************
	函数名称:	demod_d0367qam_Open

	函数说明:	打开0367qam,初始化寄存器

    修改记录:	日       期      作      者       修定
 				    ---------        ---------         -----
               		2010.12.28		lwj			创建
************************************************************************/
YW_ErrorType_T demod_d0367qam_Open(U8 Handle)
{
	YW_ErrorType_T              Error = YW_NO_ERROR;
	TUNER_ScanTaskParam_T       *Inst = NULL;
	IOARCH_Handle_t		        IOHandle;
	TUNER_IOREG_DeviceMap_t		*DeviceMap;

    //printk("demod_d0367qam_Open  ===== \n");
	Inst = TUNER_GetScanInfo(Handle);
	IOHandle = Inst->DriverParam.Cab.DemodIOHandle;
	DeviceMap = &Inst->DriverParam.Cab.Demod_DeviceMap;

	/*------------------驱动函数指针----------------*/
	Inst->DriverParam.Cab.DemodDriver.Demod_GetSignalInfo = demod_d0367qam_GetSignalInfo;
	Inst->DriverParam.Cab.DemodDriver.Demod_IsLocked      = demod_d0367qam_IsLocked;
	Inst->DriverParam.Cab.DemodDriver.Demod_repeat        = demod_d0367qam_Repeat;
	Inst->DriverParam.Cab.DemodDriver.Demod_reset         = demod_d0367qam_Reset;
	Inst->DriverParam.Cab.DemodDriver.Demod_ScanFreq      = demod_d0367qam_ScanFreq;
	Inst->DriverParam.Cab.DemodDriver.Demod_standy        = demod_d0367qam_SetStandby;
	/*-----------------寄存器结构分配--------------*/
	DeviceMap->Timeout   = IOREG_DEFAULT_TIMEOUT;
	DeviceMap->Registers = STV0367qam_NBREGS;
	DeviceMap->Fields    = STV0367qam_NBFIELDS;
	DeviceMap->Mode      = IOREG_MODE_SUBADR_16;
    DeviceMap->RegExtClk = Inst->ExternalClock; //Demod External Crystal_HZ

    //Error = TUNER_IOREG_Open(DeviceMap);
	DeviceMap->DefVal = NULL;
    DeviceMap->Error = 0;

	D0367qam_Init(DeviceMap, IOHandle, Inst->DriverParam.Cab.TunerType);

	//pParams->MasterClock_Hz = FE_367qam_GetMclkFreq(pParams->hDemod,pParams->Crystal_Hz);
	//pParams->AdcClock_Hz = FE_367qam_GetADCFreq(pParams->hDemod,pParams->Crystal_Hz); //question

	return(Error);

}
/*****************************************************
**FUNCTION	::	ChipSetRegisters_0367qam
**ACTION	::	Set values of consecutive's registers (values are taken in RegMap)
**PARAMS IN	::	hChip		==> Handle to the chip
**				FirstReg	==> Id of the first register
**				NbRegs		==> Number of register to write
**PARAMS OUT::	NONE
**RETURN	::	Error
*****************************************************/
YW_ErrorType_T  ChipSetRegisters_0367qam(TUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,int FirstRegAddr,int NbRegs)
{
	unsigned char data[100],nbdata = 0;
	int i;
	//unsigned int Size;
	//TUNER_ScanTaskParam_T 		*Inst = NULL;
	//TUNER_IOREG_DeviceMap_t		*RepeaterDeviceMap = NULL;
	//IOARCH_Handle_t				RepeaterIOHandle = 0xffff;
    S32 firstRegIndex = -1;
    DeviceMap->Error = 0;

    firstRegIndex = ChipGetRegisterIndex(DeviceMap,IOHandle, FirstRegAddr);
    if (((firstRegIndex >= 0) && ((firstRegIndex + NbRegs - 1) < DeviceMap->Registers))==FALSE )
    {
        //printk("ChipSetRegisters_0367ter############DeviceMap->Registers = %d,firstRegIndex= %d,NbRegs=%d\n",DeviceMap->Registers,
           // firstRegIndex,NbRegs);////
        DeviceMap->Error = YWHAL_ERROR_BAD_PARAMETER;
        return DeviceMap->Error;
    }

	#if 0
	if(IOARCH_Handle[IOHandle].IORoute == TUNER_IO_REPEATER)
	{
		for (i = 0; i < YWTUNERi_MAX_TUNER_NUM/*TUNER_1*/; i++)
		{
			Inst = TUNER_GetScanInfo(i);
			if (Inst->DriverParam.Cab.TunerIOHandle == IOHandle)
			{
				RepeaterDeviceMap = &Inst->DriverParam.Cab.Demod_DeviceMap;
				RepeaterIOHandle = Inst->DriverParam.Cab.DemodIOHandle;
				break;
			}
		}

		if (i == YWTUNERi_MAX_TUNER_NUM)
		{
            //printk("DeviceMap->Error YWHAL_ERROR_INVALID_HANDLE=====\n");////
			DeviceMap->Error = YWHAL_ERROR_INVALID_HANDLE;
			return DeviceMap->Error;
		}
	}
	#endif

	if(DeviceMap)
	{
		{
			if(NbRegs < 70)
			{

				switch(DeviceMap->Mode)
				{
					case IOREG_MODE_SUBADR_16:
						data[nbdata++]=MSB(FirstRegAddr);	/* 16 bits sub addresses */
					case IOREG_MODE_SUBADR_8:
						data[nbdata++]=LSB(FirstRegAddr);	/* 8 bits sub addresses */
					case IOREG_MODE_NOSUBADR:
						for(i=0;i<NbRegs;i++)
							data[nbdata++] = DeviceMap->RegMap[firstRegIndex+i].Value;;	/* fill data buffer */
						break;

					default:
                        //printk("Error %d\n", __LINE__);
						DeviceMap->Error = YWHAL_ERROR_INVALID_HANDLE;
						return YWHAL_ERROR_INVALID_HANDLE;
				}
                //lwj add for test
                //int j = 0;

                /*printk("FirsetRegister = 0x%x", FirstRegAddr);
	                    for (j= 0 ; j < nbdata; j++)
	                    {
	                        printk("data = 0x%x,", data[j]);
	                    }
	                    printk("\n");*/
                //lwj add for test end
				//if(IOARCH_Handle[IOHandle].IORoute == TUNER_IO_REPEATER)
				//{
         		//	ChipSetField_0367qam(RepeaterDeviceMap, RepeaterIOHandle,F367qam_I2CT_ON, 1);	/* Set repeater ON */
				//}
				#if 0
                DeviceMap->Error = YWI2C_WriteWithStop( I2C_HANDLE(&IOARCH_Handle[IOHandle].ExtDeviceHandle), data, nbdata, DeviceMap->Timeout, &Size);
				if (DeviceMap->Error == YWI2C_ERROR_WRITE_FAILURE)
                {
                    YWOS_TaskSleep(2);
                }
				#else

				D0367qam_write(DeviceMap, IOHandle, data, nbdata);

				#endif
				//if(IOARCH_Handle[IOHandle].IORoute == TUNER_IO_REPEATER)
				//{
         		//	ChipSetField_0367qam(RepeaterDeviceMap, RepeaterIOHandle,F367qam_I2CT_ON, 0);	/* Set repeater OFF */
				//}
				//#endif
			}
			else
				DeviceMap->Error = YWHAL_ERROR_FEATURE_NOT_SUPPORTED;
		}
	}
	else
		return YWHAL_ERROR_INVALID_HANDLE;
   
	if (DeviceMap->Error != 0)
	{
        printk("d0367ter DeviceMap->Error=%d,FirstRegAddr=%x\n",DeviceMap->Error,FirstRegAddr);//for test
        YWOSTRACE((YWOS_TRACE_ERROR, "d0367cab DeviceMap->Error=%d,FirstRegAddr=%x\n",DeviceMap->Error,FirstRegAddr));//for test
	}
	return DeviceMap->Error;
}
示例#9
0
/***********************************************************************
	函数名称:	demod_d0367qam_ScanFreq

	函数说明:	搜索频率

    修改记录:	日       期      作      者       修定
 				---------         ---------       -----
               	2010.11.11		  lwj			  创建
************************************************************************/
YW_ErrorType_T demod_d0367qam_ScanFreq(U8 Index)
{
	YW_ErrorType_T              Error = YW_NO_ERROR;
	TUNER_ScanTaskParam_T       *Inst;
	IOARCH_Handle_t		        IOHandle;
	TUNER_IOREG_DeviceMap_t		*DeviceMap;
    FE_367qam_InternalParams_t  pParams;
    U32 ZigzagScan = 0;
    S32 SearchRange_Hz_Tmp;

	Inst = TUNER_GetScanInfo(Index);
	IOHandle = Inst->DriverParam.Cab.DemodIOHandle;
	DeviceMap = &Inst->DriverParam.Cab.Demod_DeviceMap;

    FirstTimeBER[Index] = 1;

    YWLIB_Memset(&pParams, 0, sizeof(FE_367qam_InternalParams_t));
    pParams.State = FE_367qam_NOTUNER;
    /*
    --- Modulation type is set to
    */
    switch(Inst->DriverParam.Cab.Param.Modulation)////
    {
        case YWTUNER_MOD_QAM_16 :
            pParams.Modulation = FE_CAB_MOD_QAM16;
        break;

        case YWTUNER_MOD_QAM_32 :
            pParams.Modulation = FE_CAB_MOD_QAM32;
        break;

        case YWTUNER_MOD_QAM_64 :
            pParams.Modulation = FE_CAB_MOD_QAM64;
        break;

        case YWTUNER_MOD_QAM_128 :
            pParams.Modulation = FE_CAB_MOD_QAM128;
        break;

        case YWTUNER_MOD_QAM_256 :
            pParams.Modulation = FE_CAB_MOD_QAM256;
        break;

        default:
            pParams.Modulation = FE_CAB_MOD_QAM64;
            break;
    }
    pParams.Crystal_Hz = DeviceMap->RegExtClk; //30M 还是27M,由硬件决定
    pParams.SearchRange_Hz = 280000;/*280 kHz*/ //question
    pParams.SymbolRate_Bds = Inst->DriverParam.Cab.Param.SymbolRateB;////
    pParams.Frequency_kHz  = Inst->DriverParam.Cab.Param.FreqKHz;////
    pParams.AdcClock_Hz    = FE_367qam_GetADCFreq(DeviceMap,IOHandle,pParams.Crystal_Hz);
    pParams.MasterClock_Hz = FE_367qam_GetMclkFreq(DeviceMap,IOHandle,pParams.Crystal_Hz);
//    printk("demod_d0367qam_ScanFreq  Frequency === %d\n", pParams.Frequency_kHz);
//    printk("SymbolRate_Bds  =========== %d\n", pParams.SymbolRate_Bds);
//    printk("pParams.AdcClock_Hz  ====== %d\n",pParams.AdcClock_Hz);
//    printk("pParams.MasterClock_Hz ===== %d\n",pParams.MasterClock_Hz);

    if (Inst->DriverParam.Cab.TunerDriver.tuner_SetFreq != NULL)
    {
       Error = (Inst->DriverParam.Cab.TunerDriver.tuner_SetFreq)(Index, pParams.Frequency_kHz, NULL);
    }

	/* Sets the QAM size and all the related parameters */
	FE_367qam_SetQamSize(Inst,DeviceMap,IOHandle,pParams.Frequency_kHz,pParams.SymbolRate_Bds,pParams.Modulation);
	/* Sets the symbol and all the related parameters */
	FE_367qam_SetSymbolRate(DeviceMap,IOHandle,pParams.AdcClock_Hz,pParams.MasterClock_Hz,pParams.SymbolRate_Bds,pParams.Modulation);
	/* Zigzag Algorithm test */
	if(25*pParams.SearchRange_Hz > pParams.SymbolRate_Bds)
	{
		pParams.SearchRange_Hz = -(S32)(pParams.SymbolRate_Bds)/25;
		ZigzagScan = 1;
	}

	/* Search algorithm launch, [-1.1*RangeOffset, +1.1*RangeOffset] scan */
	pParams.State = FE_367qam_Algo(Index, &pParams);
    SearchRange_Hz_Tmp = pParams.SearchRange_Hz; //lwj add
	if(ZigzagScan&&(pParams.State!=FE_367qam_DATAOK))
	{
		do
		{
            #if 1 //lwj modify
			pParams.SearchRange_Hz = -pParams.SearchRange_Hz;

			if(pParams.SearchRange_Hz>0)
				pParams.DerotOffset_Hz = -pParams.DerotOffset_Hz + pParams.SearchRange_Hz;
			else
				pParams.DerotOffset_Hz = -pParams.DerotOffset_Hz;
            #endif
			/* Search algorithm launch, [-1.1*RangeOffset, +1.1*RangeOffset] scan */
			pParams.State = FE_367qam_Algo(Index,&pParams);
		}
		while(((pParams.DerotOffset_Hz+pParams.SearchRange_Hz)>=-(S32)SearchRange_Hz_Tmp)&&(pParams.State!=FE_367qam_DATAOK));
	}
	/* check results */
	if( (pParams.State == FE_367qam_DATAOK) && (!Error))
	{
		/* update results */
        //printk("TUNER_STATUS_LOCKED #######################\n");
	    Inst->Status = TUNER_INNER_STATUS_LOCKED;
		//pResult->Frequency_kHz = pIntParams->DemodResult.Frequency_kHz;
		//pResult->SymbolRate_Bds = pIntParams->DemodResult.SymbolRate_Bds;
		//pResult->SpectInv = pIntParams->DemodResult.SpectInv;
		//pResult->Modulation = pIntParams->DemodResult.Modulation;
	}
	else
	{
		Inst->Status = TUNER_INNER_STATUS_UNLOCKED;
	}


	return(Error);


}
示例#10
0
/*****************************************************
--FUNCTION	::	FE_367qam_Algo
--ACTION	::	Driver functio of the STV0367QAM chip
--PARAMS IN	::	*pIntParams	==>	Demod handle
--							Tuner handle
							Search frequency
							Symbolrate
							QAM Size
							DerotOffset
							SweepRate
							Search Range
							Master clock
							ADC clock
							Structure for result storage
--PARAMS OUT::	NONE
--RETURN	::	Handle to STV0367QAM
--***************************************************/
FE_367qam_SIGNALTYPE_t FE_367qam_Algo(YWTUNER_Handle_T Handle,FE_367qam_InternalParams_t *pIntParams)
{
	FE_367qam_SIGNALTYPE_t signalType=FE_367qam_NOAGC;	/* Signal search status initialization */
	U32 QAMFEC_Lock, QAM_Lock, u32_tmp ;
    BOOL TunerLock = FALSE;
	U32 LockTime, TRLTimeOut, AGCTimeOut, CRLSymbols, CRLTimeOut, EQLTimeOut, DemodTimeOut, FECTimeOut;
	U8 TrackAGCAccum;
	TUNER_ScanTaskParam_T       *Inst = NULL;
    TUNER_IOREG_DeviceMap_t		*DeviceMap = NULL;
	IOARCH_Handle_t		         IOHandle;
    U32 FreqResult = 0;

    Inst = TUNER_GetScanInfo(Handle);
	IOHandle = Inst->DriverParam.Cab.DemodIOHandle;
	DeviceMap = &Inst->DriverParam.Cab.Demod_DeviceMap;

    if(Inst->ForceSearchTerm)
    {
	    return(FE_LLA_INVALID_HANDLE);
    }

	/* Timeouts calculation */
	/* A max lock time of 25 ms is allowed for delayed AGC */
	AGCTimeOut = 25;
	/* 100000 symbols needed by the TRL as a maximum value */
	TRLTimeOut = 100000000/pIntParams->SymbolRate_Bds;
	/* CRLSymbols is the needed number of symbols to achieve a lock within [-4%, +4%] of the symbol rate.
	   CRL timeout is calculated for a lock within [-SearchRange_Hz, +SearchRange_Hz].
	   EQL timeout can be changed depending on the micro-reflections we want to handle.
	   A characterization must be performed with these echoes to get new timeout values.
	*/
	switch (pIntParams->Modulation)
	{
		case FE_CAB_MOD_QAM16:
			CRLSymbols = 150000;
			EQLTimeOut = 100;
		break;
		case FE_CAB_MOD_QAM32:
			CRLSymbols = 250000;
			EQLTimeOut = 100;
		break;
		case FE_CAB_MOD_QAM64:
			CRLSymbols = 200000;
			EQLTimeOut = 100;
		break;
		case FE_CAB_MOD_QAM128:
			CRLSymbols = 250000;
			EQLTimeOut = 100;
		break;
		case FE_CAB_MOD_QAM256:
			CRLSymbols = 250000;
			EQLTimeOut = 100;
		break;
		default:
			CRLSymbols = 200000;
			EQLTimeOut = 100;
		break;
	}
	if (pIntParams->SearchRange_Hz < 0)
	{
		CRLTimeOut = (25*CRLSymbols*(-pIntParams->SearchRange_Hz/1000))/(pIntParams->SymbolRate_Bds/1000);
	}
	else
	{
		CRLTimeOut = (25*CRLSymbols*(pIntParams->SearchRange_Hz/1000))/(pIntParams->SymbolRate_Bds/1000);
	}
	CRLTimeOut = (1000*CRLTimeOut)/pIntParams->SymbolRate_Bds;
	/* Timeouts below 50ms are coerced */
	if (CRLTimeOut <50)	CRLTimeOut = 50;
	/* A maximum of 100 TS packets is needed to get FEC lock even in case the spectrum inversion needs to be changed.
	   This is equal to 20 ms in case of the lowest symbol rate of 0.87Msps
	*/
	FECTimeOut = 20;
	DemodTimeOut = AGCTimeOut + TRLTimeOut + CRLTimeOut + EQLTimeOut;
	/* Reset the TRL to ensure nothing starts until the
	   AGC is stable which ensures a better lock time
	*/
	ChipSetOneRegister_0367qam(DeviceMap,IOHandle,R367qam_CTRL_1,0x04);
	/* Set AGC accumulation time to minimum and lock threshold to maximum in order to speed up the AGC lock */
	TrackAGCAccum = ChipGetField_0367qam(DeviceMap,IOHandle,F367qam_AGC_ACCUMRSTSEL);
	ChipSetField_0367qam(DeviceMap,IOHandle,F367qam_AGC_ACCUMRSTSEL,0x0);
	/* Modulus Mapper is disabled */
	ChipSetField_0367qam(DeviceMap,IOHandle,F367qam_MODULUSMAP_EN,0);
	/* Disable the sweep function */
	ChipSetField_0367qam(DeviceMap,IOHandle,F367qam_SWEEP_EN,0);
	/* The sweep function is never used, Sweep rate must be set to 0 */
	/* Set the derotator frequency in Hz */
	//FE_367qam_SetDerotFreq(DeviceMap,IOHandle,pIntParams->AdcClock_Hz,(1000*(S32)FE_TunerGetIF_Freq(pIntParams->hTuner)+pIntParams->DerotOffset_Hz));

    if ( Inst->DriverParam.Cab.TunerType == TUNER_TUNER_SHARP5469C)
	{
        FE_367qam_SetDerotFreq(DeviceMap,IOHandle,pIntParams->AdcClock_Hz,(1000*(36125000/1000)+pIntParams->DerotOffset_Hz)); //question if freq
    }
    /* Disable the Allpass Filter when the symbol rate is out of range */
	if((pIntParams->SymbolRate_Bds > 10800000)||(pIntParams->SymbolRate_Bds < 1800000))
	{
		ChipSetField_0367qam(DeviceMap,IOHandle,F367qam_ADJ_EN,0);
		ChipSetField_0367qam(DeviceMap,IOHandle,F367qam_ALLPASSFILT_EN,0);
	}
	/* Check if the tuner is locked */
    if (Inst->DriverParam.Cab.TunerDriver.tuner_IsLocked != NULL)
    {
	    Inst->DriverParam.Cab.TunerDriver.tuner_IsLocked(Handle, &TunerLock);
    }
    if (TunerLock == 0)
    {
        return FE_367qam_NOTUNER;
    }

	/* Relase the TRL to start demodulator acquisition */
	/* Wait for QAM lock */
	LockTime=0;
	ChipSetOneRegister_0367qam(DeviceMap,IOHandle,R367qam_CTRL_1,0x00);
	do
	{
		QAM_Lock = ChipGetField_0367qam(DeviceMap,IOHandle,F367qam_FSM_STATUS);
		if ((LockTime >= (DemodTimeOut - EQLTimeOut)) && (QAM_Lock == 0x04))
			/* We don't wait longer, the frequency/phase offset must be too big */
			LockTime = DemodTimeOut;
		else if ((LockTime >= (AGCTimeOut + TRLTimeOut))&&(QAM_Lock == 0x02))
			/* We don't wait longer, either there is no signal or it is not the right symbol rate or it is an analog carrier */
		{
			LockTime = DemodTimeOut;
			ChipGetRegisters_0367qam(DeviceMap,IOHandle,R367qam_AGC_PWR_RD_L,3);
			u32_tmp = 	ChipGetFieldImage_0367qam(DeviceMap,IOHandle,F367qam_AGC_PWR_WORD_LO)
						+(ChipGetFieldImage_0367qam(DeviceMap,IOHandle,F367qam_AGC_PWR_WORD_ME)<<8)
						+(ChipGetFieldImage_0367qam(DeviceMap,IOHandle,F367qam_AGC_PWR_WORD_HI)<<16);
			if (u32_tmp>=131072)
				u32_tmp = 262144 - u32_tmp;
			u32_tmp=u32_tmp/(PowOf2(11-ChipGetField_0367qam(DeviceMap,IOHandle,F367qam_AGC_IF_BWSEL)));

			if(u32_tmp<ChipGetField_0367qam(DeviceMap,IOHandle,F367qam_AGC_PWRREF_LO)+256*ChipGetField_0367qam(DeviceMap,IOHandle,F367qam_AGC_PWRREF_HI) - 10)
				QAM_Lock = 0x0f;
		}
		else
		{
			ChipWaitOrAbort_0367qam(Inst->ForceSearchTerm, 10);	/* wait 10 ms */
			LockTime +=10;
		}

	}
	while(((QAM_Lock != 0x0c)&&(QAM_Lock != 0x0b)) && (LockTime<DemodTimeOut));
	if ((QAM_Lock == 0x0c)||(QAM_Lock == 0x0b))
	{
		/* Wait for FEC lock */
		LockTime = 0;
		do
		{
			ChipWaitOrAbort_0367qam(Inst->ForceSearchTerm,5);/* wait 5 ms */
			LockTime +=5;
			QAMFEC_Lock = ChipGetField_0367qam(DeviceMap,IOHandle,F367qam_QAMFEC_LOCK);
		}
		while(!QAMFEC_Lock && (LockTime<FECTimeOut));
	}
	else
		QAMFEC_Lock = 0;


	if(QAMFEC_Lock)
	{
		signalType = FE_367qam_DATAOK;
		pIntParams->DemodResult.Modulation = pIntParams->Modulation;
		pIntParams->DemodResult.SpectInv = ChipGetField_0367qam(DeviceMap,IOHandle,F367qam_QUAD_INV);
        //lwj add begin
        if (Inst->DriverParam.Cab.TunerDriver.tuner_GetFreq != NULL) //lwj add
        {
    	    Inst->DriverParam.Cab.TunerDriver.tuner_GetFreq(Handle, &FreqResult);
        }

        //lwj add end
		//if (FE_TunerGetIF_Freq(pIntParams->hTuner) != 0)
		#if 0 //lwj remove
		if (0) //IF 为0
		{
			if(FE_TunerGetIF_Freq(pIntParams->hTuner)>pIntParams->AdcClock_Hz/1000)
			{
				pIntParams->DemodResult.Frequency_kHz = FreqResult - FE_367qam_GetDerotFreq(DeviceMap,IOHandle,pIntParams->AdcClock_Hz)- pIntParams->AdcClock_Hz/1000 + FE_TunerGetIF_Freq(pIntParams->hTuner);
			}
			else
			{

				pIntParams->DemodResult.Frequency_kHz = FreqResult - FE_367qam_GetDerotFreq(DeviceMap,IOHandle,pIntParams->AdcClock_Hz)+FE_TunerGetIF_Freq(pIntParams->hTuner);
			}
		}
		else
        #endif
		{
			pIntParams->DemodResult.Frequency_kHz = FreqResult + FE_367qam_GetDerotFreq(DeviceMap,IOHandle,pIntParams->AdcClock_Hz) - pIntParams->AdcClock_Hz/4000;
		}
		pIntParams->DemodResult.SymbolRate_Bds = FE_367qam_GetSymbolRate(DeviceMap,IOHandle,pIntParams->MasterClock_Hz);
		pIntParams->DemodResult.Locked = 1;

/*		ChipSetField(pIntParams->hDemod,F367qam_AGC_ACCUMRSTSEL,7);*/
	}
	else
	{
		switch(QAM_Lock)
		{
			case 1:
				signalType = FE_367qam_NOAGC;
				break;
			case 2:
				signalType = FE_367qam_NOTIMING;
				break;
			case 3:
				signalType = FE_367qam_TIMINGOK;
				break;
			case 4:
				signalType = FE_367qam_NOCARRIER;
				break;
			case 5:
				signalType = FE_367qam_CARRIEROK;
				break;
			case 7:
				signalType = FE_367qam_NOBLIND;
				break;
			case 8:
				signalType = FE_367qam_BLINDOK;
				break;
			case 10:
				signalType = FE_367qam_NODEMOD;
				break;
			case 11:
				signalType = FE_367qam_DEMODOK;
				break;
			case 12:
				signalType = FE_367qam_DEMODOK;
				break;
			case 13:
				signalType = FE_367qam_NODEMOD;
				break;
			case 14:
				signalType = FE_367qam_NOBLIND;
				break;
			case 15:
				signalType = FE_367qam_NOSIGNAL;
				break;
			default:
				break;
		}
	}

	/* Set the AGC control values to tracking values */
	ChipSetField_0367qam(DeviceMap,IOHandle,F367qam_AGC_ACCUMRSTSEL,TrackAGCAccum);
	return signalType;
}