/*============================================================================*/
tmErrorCode_t
tmbslTDA18250SetLoFreq
(
    tmUnitSelect_t  tUnit,      /* I: Unit number      */
    UInt32          uRF         /* I: Frequency in Hz  */
)
{
    ptmTDA18250Object_t pObj = Null;
    tmErrorCode_t       err = TM_OK;
    UInt32              uLO = 0;

    /* Get a driver instance */
    err = TDA18250GetInstance(tUnit, &pObj);
    tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "TDA18250GetInstance(0x%08X) failed.", tUnit));

    if (err == TM_OK)
    {
        /* Try to acquire driver mutex */
        err = TDA18250MutexAcquire(pObj, TDA18250_MUTEX_TIMEOUT);
    }

    if (err == TM_OK)
    {
        uLO = uRF + pObj->Std_Array[pObj->StandardMode].IF;
        err = tmddTDA18250SetLOFreq(tUnit, uLO);
        tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "tmddTDA18250SetLOFreq(0x%08X) failed.", tUnit));
        
        /* Release driver mutex */
        (void)TDA18250MutexRelease(pObj);
    }

    return err;
}
MT_FE_RET mt_fe_tn_init_TDA18250(void *dev_handle)
{
	tmErrorCode_t err = TM_OK;
	tmbslFrontEndDependency_t sSrvTunerFunc;

	tda_handle = (MT_FE_DC2800_Device_Handle)dev_handle;

	/* Low layer struct set-up to link with user written functions */
	sSrvTunerFunc.sIo.Write				 = UserWrittenI2CWrite;
	sSrvTunerFunc.sIo.Read				 = UserWrittenI2CRead;
	sSrvTunerFunc.sTime.Get				 = Null;
	sSrvTunerFunc.sTime.Wait			 = UserWrittenWait;
	sSrvTunerFunc.sDebug.Print			 = NULL;
	sSrvTunerFunc.sMutex.Init			 = NULL;
	sSrvTunerFunc.sMutex.DeInit			 = NULL;
	sSrvTunerFunc.sMutex.Acquire		 = NULL;
	sSrvTunerFunc.sMutex.Release		 = NULL;
	sSrvTunerFunc.dwAdditionalDataSize	 = 0;
	sSrvTunerFunc.pAdditionalData		 = Null;

	/* Initialize low level driver setup environment */
	//err = tmddTDA18250Init(tUnit, &sSrvTunerFunc);
	err = tmbslTDA18250Init(0, &sSrvTunerFunc);
	/* TDA18250 Master Hardware initialization */
	//err = tmddTDA18250Reset(0);

	err = TDA18250Reset(0);  /* I: Unit number */

	if(err != TM_OK)
		return MtFeErr_Fail;

	/* TDA18250 Master Hardware power state */
	err = tmbslTDA18250SetPowerState(0, tmTDA18250_PowerNormalMode);
	///* TDA18250 Master Hardware power state */
	//err = tmddTDA18250SetPowerState(0, tmTDA18250_PowerNormalMode);

	err = TDA18250SetStandardMode(0, tmTDA18250_DIG_9MHz);
	if(err != TM_OK)
		return MtFeErr_Fail;

	#if 0
	/* TDA18250 Master RF frequency */
	err = tmddTDA18250SetLOFreq(0, uRFMaster);
	if(err != TM_OK)
		return err;

	/* Get TDA18250 Master PLL Lock status */
	err = tmddTDA18250GetLockStatus(0, &PLLLockMaster);
	if(err != TM_OK)
		return err;

	/* Get TDA18250 Master IF */
	err = tmddTDA18250GetIF(0, &uIFMaster);
	if(err != TM_OK)
		return err;
	#endif

	return MtFeErr_Ok;
}
/*============================================================================*/
tmErrorCode_t
tmbslTDA18250DigitalMasterReset
(
    tmUnitSelect_t  tUnit   /* I: Unit number */
)
{
    ptmTDA18250Object_t pObj = Null;
    tmErrorCode_t       err = TM_OK;


    /* Get a driver instance */
    err = TDA18250GetInstance(tUnit, &pObj);
    tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "TDA18250GetInstance(0x%08X) failed.", tUnit));

    if (err == TM_OK)
    {
        /* Try to acquire driver mutex */
        err = TDA18250MutexAcquire(pObj, TDA18250_MUTEX_TIMEOUT);
    }

    if (err == TM_OK)
    {
        /* Slave Type not supported */
        if ( pObj->deviceType > tmTDA18250_DeviceTypeMasterWithoutXTout )
        {
            err = TDA18250_ERR_NOT_SUPPORTED;
        }
    }
        
    if (err == TM_OK)
    {
        /* Switch smooth time constant setting to ensure smooth opening */
        err = tmddTDA18250_SetRFSW_T_CST(tUnit, pObj->Switch_TimeCst);
        tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "tmddTDA18250_SetRFSW_T_CST(0x%08X) failed.", tUnit));

        if (err == TM_OK)
        {
            err = TDA18250SetSwitchOpen(tUnit);
            tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "TDA18250SetSwitchOpen(0x%08X) failed.", tUnit));
        }
        if (err == TM_OK)
        {
            /***** Write all initialization bytes except AGC registers *****/
            err = tmddTDA18250Reset(tUnit, pObj->clock_mode_auto, tmddTDA18250_WithoutResetAGC);
        }
        if (err == TM_OK)
        {
            err = tmddTDA18250ResetXtoutMTO(tUnit, (tmddTDA18250DeviceType_t)pObj->deviceType);
            tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "tmddTDA18250ResetXtoutMTO(0x%08X) failed.", tUnit));
        }
        if (err == TM_OK)
        {
            err = tmddTDA18250SetResetMSM(tUnit);
            tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "tmddTDA18250SetResetMSM(0x%08X) failed.", tUnit));
        }
        if (err == TM_OK)
        {
            err = tmddTDA18250SetLaunchMSM(tUnit);
            tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "tmddTDA18250SetLaunchMSM(0x%08X) failed.", tUnit));
        }

        /***** Image Rejection Calibration *****/
        if (err == TM_OK)
        {
            /* stop AGC1 loop */
            err = TDA18250SetAGC1_loop_off(tUnit, tmTDA18250_ON);
            tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "TDA18250SetAGC1_loop_off(0x%08X) failed.", tUnit));
        }
        if (err == TM_OK)
        {
            err = TDA18250IRCALDigitalMaster_InitRestore(tUnit, tmTDA18250_INIT);
            tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "TDA18250IRCAL_Init(0x%08X) failed.", tUnit));
        }
        if (err == TM_OK)
        {
            err = TDA18250IRCalibration(tUnit);
            tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "TDA18250IRCalibration(0x%08X) failed.", tUnit));
        }
        if (err == TM_OK)
        {
            err = TDA18250IRCALDigitalMaster_InitRestore(tUnit, tmTDA18250_RESTORE);
            tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "TDA18250IRCAL_Init(0x%08X) failed.", tUnit));
        }
        if (err == TM_OK)
        {
            /* stop AGC1 loop */
            err = TDA18250SetAGC1_loop_off(tUnit, tmTDA18250_OFF);
            tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "TDA18250SetAGC1_loop_off(0x%08X) failed.", tUnit));
        }
        
        /***** Write default LO *****/
        if (err == TM_OK)
        {
            tmddTDA18250SetLOFreq(tUnit, TMBSL_TDA18250_DEFAULT_LO);
            tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "tmddTDA18250SetLOFreq(0x%08X) failed.", tUnit));
            pObj->uRF = TMBSL_TDA18250_DEFAULT_LO - pObj->Std_Array[pObj->StandardMode].IF ;
        }
        
        /***** Write default smooth offset between RF and Loop throught *****/
        if (err == TM_OK)
        {
            tmddTDA18250SetLT_smooth_offset(tUnit, 0);
            tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "tmddTDA18250SetLT_smooth_offset(0x%08X) failed.", tUnit));
        }

        /* Switch smooth time constant setting because in direct mode in register initialization */
        if (err == TM_OK)
        {
            err = tmddTDA18250_SetRFSW_T_CST(tUnit, pObj->Switch_TimeCst);
            tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "tmddTDA18250_SetRFSW_T_CST(0x%08X) failed.", tUnit));
        }

        if (err == TM_OK)
        {
            err = TDA18250SetSwitchClose(tUnit, tmTDA18250_IND_ANLG_Band_7);
            tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "TDA18250SetSwitchClose(0x%08X) failed.", tUnit));
        }
        
        /* default band is ANALOG 7MHz */
        if (err == TM_OK)
        {
            pObj->BandIndex = tmTDA18250_IND_ANLG_Band_7;
        }

        if (err == TM_OK)
        {
            err= tmddTDA18250SetHP_MTO_T_CST(tUnit, pObj->MTO_TimeCst);
            tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "tmddTDA18250SetHP_MTO_T_CST(0x%08X) failed.", tUnit));
        }

        if (err == TM_OK)
        {
            err= tmddTDA18250Setnotch_select(tUnit, 01);
            tmASSERTExT(err, TM_OK, (DEBUGLVL_ERROR, "tmddTDA18250Setnotch_select(0x%08X) failed.", tUnit));
        }
        
        /* Release driver mutex */
        (void)TDA18250MutexRelease(pObj);
    }

    return err;
}