Beispiel #1
0
/**

@see   DVBT_NIM_FP_GET_PARAMETERS

*/
s32
dvbt_nim_default_GetParameters(
	DVBT_NIM_MODULE *pNim,
	u64 *pRfFreqHz,
	s32 *pBandwidthMode
	)
{
	TUNER_MODULE *pTuner;
	DVBT_DEMOD_MODULE *pDemod;


	// Get tuner module and demod module.
	pTuner = pNim->pTuner;
	pDemod = pNim->pDemod;


	// Get tuner RF frequency in Hz.
	if(pTuner->GetRfFreqHz(pTuner, pRfFreqHz) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Get demod bandwidth mode.
	if(pDemod->GetBandwidthMode(pDemod, pBandwidthMode) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	return FUNCTION_SUCCESS;


error_status_execute_function:
	return FUNCTION_ERROR;
}
Beispiel #2
0
/**

@see   DVBT_NIM_FP_GET_RF_POWER_LEVEL_DBM

*/
s32 rtl2832_tda18272_GetRfPowerLevelDbm(DVBT_NIM_MODULE *pNim, s64 *pRfPowerLevelDbm)
{
	DVBT_DEMOD_MODULE *pDemod;

	u64 FsmStage;
	s64 IfAgc;

	// Get demod module.
	pDemod = pNim->pDemod;

	// Get FSM stage and IF AGC value.
	if(pDemod->GetRegBitsWithPage(pDemod, DVBT_FSM_STAGE, &FsmStage) != FUNCTION_SUCCESS)
		goto error_status_get_registers;

	if(pDemod->GetIfAgc(pDemod, &IfAgc) != FUNCTION_SUCCESS)
		goto error_status_get_registers;

	//  Determine signal strength according to FSM stage and IF AGC value.
	if(FsmStage < 10)
		*pRfPowerLevelDbm = -120;
	else
	{
		if(IfAgc > -1250)
			*pRfPowerLevelDbm = -71 - (IfAgc / 165);
		else
			*pRfPowerLevelDbm = -60;
	}

	return FUNCTION_SUCCESS;

error_status_get_registers:
	return FUNCTION_ERROR;
}
Beispiel #3
0
/**

@see   DVBT_NIM_FP_GET_BER

*/
s32
dvbt_nim_default_GetBer(
	DVBT_NIM_MODULE *pNim,
	u64 *pBerNum,
	u64 *pBerDen
	)
{
	DVBT_DEMOD_MODULE *pDemod;


	// Get demod module.
	pDemod = pNim->pDemod;


	// Get BER from demod.
	if(pDemod->GetBer(pDemod, pBerNum, pBerDen) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	return FUNCTION_SUCCESS;


error_status_execute_function:
	return FUNCTION_ERROR;
}
Beispiel #4
0
// Additional definition for mt_control.c
UData_t
demod_get_pd(
	handle_t demod_handle,
	uint16_t *pd_value
	)
{
	DVBT_DEMOD_MODULE *pDemod;
	unsigned long RssiR;


	// Get demod module.
	pDemod = (DVBT_DEMOD_MODULE *)demod_handle;

	// Get RSSI_R value.
	if(pDemod->GetRegBitsWithPage(pDemod, DVBT_RSSI_R, &RssiR) != FUNCTION_SUCCESS)
		goto error_status_get_registers;

	// Set pd_value according to RSSI_R.
	*pd_value = (uint16_t)RssiR;


	return MT_OK;


error_status_get_registers:
	return MT_COMM_ERR;
}
Beispiel #5
0
UData_t demod_pdcontrol_reset(handle_t demod_handle, handle_t tuner_handle, uint8_t *agc_current_state) {

	DVBT_DEMOD_MODULE *pDemod;
	unsigned long BinaryValue;


	// Get demod module.
	pDemod = (DVBT_DEMOD_MODULE *)demod_handle;

	// Reset AGC current state.
	*agc_current_state = AGC_STATE_START;

	// Calculate RTL2832_MT2266_IF_AGC_MIN_INT_MIN binary value.
	BinaryValue = SignedIntToBin(RTL2832_MT2266_IF_AGC_MIN_INT_MIN, RTL2832_MT2266_IF_AGC_MIN_BIT_NUM);

	// Set IF_AGC_MIN with binary value.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IF_AGC_MIN, BinaryValue) != FUNCTION_SUCCESS)
		goto error_status_set_registers;

	// Set tuner bandwidth with normal setting.
	if(MT_IS_ERROR(tuner_set_bw_normal(tuner_handle, demod_handle)))
		goto error_status_set_tuner_bandwidth;


	return MT_OK;


error_status_set_tuner_bandwidth:
error_status_set_registers:
	return MT_COMM_ERR;
}
int
get_rtl2832_ioctrl_8bit_demodbytes(
    struct dvb_frontend 		*fe,
    unsigned char 			page,
    unsigned char 			reg_addr,
    unsigned char*			data,
    unsigned short			bytelength)
{

    int ret = -1;
    int i=0;

    struct rtl2832_state*	p_state = fe->demodulator_priv;
    unsigned char data_temp[128];

    DVBT_NIM_MODULE 	*pNim;
    DVBT_DEMOD_MODULE 	*pDemod;

    deb_info("+%s: page= %d reg_addr=0x%x bytelength=%d \n", __FUNCTION__,page, reg_addr,bytelength);

    if (bytelength > 128 ) {
        deb_info("ERROR::bytelength > 128\n");
        return -1;
    }

    if (p_state->demod_type != RTL2832) {
        deb_info("ERROR::demod type not rtl2832u...\n");
        return -1;
    }
    pNim = p_state->pNim;
    if (pNim == NULL) {
        return -1;
    }
    if( mutex_lock_interruptible(&p_state->i2c_repeater_mutex) ) {
        return -1;
    }
    pDemod=pNim->pDemod;

    if(pDemod->SetRegPage(pDemod, page) != FUNCTION_SUCCESS) {
        ret=-1;
        goto error;
    }
    if(pDemod->GetRegBytes(pDemod, reg_addr, data_temp, bytelength) != FUNCTION_SUCCESS)	{
        ret=-1;
        goto error;
    }
    deb_info("->%s: data[%d,%x]= \n", __FUNCTION__,page, reg_addr);
    for (i=0; i<bytelength; i++) {
        data[i]=data_temp[i];
        deb_info("%x(%x),",data[i],data_temp[i]);
    }

    deb_info("\n");
    ret=0;
error:
    mutex_unlock(&p_state->i2c_repeater_mutex);
    deb_info("-%s: page=%d reg_addr=0x%x bytelength=%d \n", __FUNCTION__,page, reg_addr,bytelength);
    return ret;

}
Beispiel #7
0
UData_t
demod_set_bbagclim(
	handle_t demod_handle,
	int on_off_status
	)
{
	DVBT_DEMOD_MODULE *pDemod;
	unsigned long IfAgcMinBinary;
	long IfAgcMinInt;


	// Get demod module.
	pDemod = (DVBT_DEMOD_MODULE *)demod_handle;

	// Get IF_AGC_MIN binary value.
	if(pDemod->GetRegBitsWithPage(pDemod, DVBT_IF_AGC_MIN, &IfAgcMinBinary) != FUNCTION_SUCCESS)
		goto error_status_get_registers;

	// Convert IF_AGC_MIN binary value to integer.
	IfAgcMinInt = BinToSignedInt(IfAgcMinBinary, RTL2832_MT2266_IF_AGC_MIN_BIT_NUM);

	// Modify IF_AGC_MIN integer according to on_off_status.
	switch(on_off_status)
	{
		case 1:

			IfAgcMinInt += RTL2832_MT2266_IF_AGC_MIN_INT_STEP;

			if(IfAgcMinInt > RTL2832_MT2266_IF_AGC_MIN_INT_MAX)
				IfAgcMinInt = RTL2832_MT2266_IF_AGC_MIN_INT_MAX;

			break;

		default:
		case 0:

			IfAgcMinInt -= RTL2832_MT2266_IF_AGC_MIN_INT_STEP;

			if(IfAgcMinInt < RTL2832_MT2266_IF_AGC_MIN_INT_MIN)
				IfAgcMinInt = RTL2832_MT2266_IF_AGC_MIN_INT_MIN;

			break;
	}

	// Convert modified IF_AGC_MIN integer to binary value.
	IfAgcMinBinary = SignedIntToBin(IfAgcMinInt, RTL2832_MT2266_IF_AGC_MIN_BIT_NUM);

	// Set IF_AGC_MIN with modified binary value.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IF_AGC_MIN, IfAgcMinBinary) != FUNCTION_SUCCESS)
		goto error_status_set_registers;


	return MT_OK;


error_status_set_registers:
error_status_get_registers:
	return MT_COMM_ERR;
}
/**

@brief   Get tuner RSSI value when calibration is on.

One can use rtl2832_fc0013_GetTunerRssiCalOn() to get tuner calibration-on RSSI value.


@param [in]   pNim   The NIM module pointer


@retval   FUNCTION_SUCCESS   Get tuner calibration-on RSSI value successfully.
@retval   FUNCTION_ERROR     Get tuner calibration-on RSSI value unsuccessfully.

*/
int
rtl2832_fc0013_GetTunerRssiCalOn(
	DVBT_NIM_MODULE *pNim
	)
{
	TUNER_MODULE *pTuner;
	DVBT_DEMOD_MODULE *pDemod;
	FC0013_EXTRA_MODULE *pTunerExtra;
	RTL2832_FC0013_EXTRA_MODULE *pNimExtra;
	BASE_INTERFACE_MODULE *pBaseInterface;



	// Get tuner module and demod module.
	pTuner = pNim->pTuner;
	pDemod = pNim->pDemod;

	// Get tuner extra module.
	pTunerExtra = &(pTuner->Extra.Fc0013);

	// Get NIM extra module.
	pNimExtra = &(pNim->Extra.Rtl2832Fc0013);

	// Get NIM base interface.
	pBaseInterface = pNim->pBaseInterface;


	// Set tuner EN_CAL_RSSI to 0x1.
	if(fc0013_SetRegMaskBits(pTuner, 0x9, 4, 4, 0x1) != FC0013_I2C_SUCCESS)
		goto error_status_set_registers;

	// Set tuner LNA_POWER_DOWN to 0x1.
	if(fc0013_SetRegMaskBits(pTuner, 0x6, 0, 0, 0x1) != FC0013_I2C_SUCCESS)
		goto error_status_set_registers;

	// Wait 100 ms.
	pBaseInterface->WaitMs(pBaseInterface, 100);

	// Get demod RSSI_R when tuner RSSI calibration is on.
	if(pDemod->GetRegBitsWithPage(pDemod, DVBT_RSSI_R, &(pNimExtra->RssiRCalOn)) != FUNCTION_SUCCESS)
		goto error_status_get_registers;


	// Set tuner EN_CAL_RSSI to 0x0.
	if(fc0013_SetRegMaskBits(pTuner, 0x9, 4, 4, 0x0) != FC0013_I2C_SUCCESS)
		goto error_status_set_registers;

	// Set tuner LNA_POWER_DOWN to 0x0.
	if(fc0013_SetRegMaskBits(pTuner, 0x6, 0, 0, 0x0) != FC0013_I2C_SUCCESS)
		goto error_status_set_registers;


	return FUNCTION_SUCCESS;


error_status_get_registers:
error_status_set_registers:
	return FUNCTION_ERROR;
}
/**

@see   DVBT_NIM_FP_UPDATE_FUNCTION

*/
int
rtl2832_fc0013_UpdateFunction(
	DVBT_NIM_MODULE *pNim
	)
{
	DVBT_DEMOD_MODULE *pDemod;
	RTL2832_FC0013_EXTRA_MODULE *pNimExtra;


	// Get demod module.
	pDemod = pNim->pDemod;

	// Get NIM extra module.
	pNimExtra = &(pNim->Extra.Rtl2832Fc0013);


	// Update demod particular registers.
	if(pDemod->UpdateFunction(pDemod) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	// Increase tuner LNA_GAIN update waiting time.
	pNimExtra->LnaUpdateWaitTime += 1;


	// Check if need to update tuner LNA_GAIN according to update waiting time.
	if(pNimExtra->LnaUpdateWaitTime == pNimExtra->LnaUpdateWaitTimeMax)
	{
		// Reset update waiting time.
		pNimExtra->LnaUpdateWaitTime = 0;

		// Enable demod DVBT_IIC_REPEAT.
		if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x1) != FUNCTION_SUCCESS)
			goto error_status_set_registers;

		// Update tuner LNA gain with RSSI.
		if(rtl2832_fc0013_UpdateTunerLnaGainWithRssi(pNim) != FUNCTION_SUCCESS)
			goto error_status_execute_function;

		// Disable demod DVBT_IIC_REPEAT.
		if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x0) != FUNCTION_SUCCESS)
			goto error_status_set_registers;
	}


	return FUNCTION_SUCCESS;


error_status_set_registers:
error_status_execute_function:
	return FUNCTION_ERROR;
}
Beispiel #10
0
UData_t
tuner_set_bw_normal(
	handle_t tuner_handle,
	handle_t demod_handle
	)
{
	DVBT_DEMOD_MODULE *pDemod;

	int DemodBandwidthMode;
	unsigned int TunerBandwidthHz;
	unsigned int TargetTunerBandwidthHz;


	// Get demod module.
	pDemod = (DVBT_DEMOD_MODULE *)demod_handle;

	// Get demod bandwidth mode.
	if(pDemod->GetBandwidthMode(pDemod, &DemodBandwidthMode) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Determine tuner target bandwidth.
	switch(DemodBandwidthMode)
	{
		case DVBT_BANDWIDTH_6MHZ:	TargetTunerBandwidthHz = MT2266_BANDWIDTH_6MHZ;		break;
		case DVBT_BANDWIDTH_7MHZ:	TargetTunerBandwidthHz = MT2266_BANDWIDTH_7MHZ;		break;
		default:
		case DVBT_BANDWIDTH_8MHZ:	TargetTunerBandwidthHz = MT2266_BANDWIDTH_8MHZ;		break;
	}

	// Get tuner bandwidth.
	if(MT_IS_ERROR(MT2266_GetParam(tuner_handle, MT2266_OUTPUT_BW, &TunerBandwidthHz)))
		goto error_status_get_tuner_bandwidth;

	// Set tuner bandwidth with normal setting according to demod bandwidth mode.
	if(TunerBandwidthHz != TargetTunerBandwidthHz)
	{
		if(MT_IS_ERROR(MT2266_SetParam(tuner_handle, MT2266_OUTPUT_BW, TargetTunerBandwidthHz)))
			goto error_status_set_tuner_bandwidth;
	}


	return MT_OK;


error_status_set_tuner_bandwidth:
error_status_get_tuner_bandwidth:
error_status_execute_function:
	return MT_COMM_ERR;
}
Beispiel #11
0
/**

@see   DVBT_NIM_FP_GET_SIGNAL_STRENGTH

*/
s32 dvbt_nim_default_GetSignalStrength(DVBT_NIM_MODULE *pNim, u64 *pSignalStrength)
{
	DVBT_DEMOD_MODULE *pDemod;

	// Get demod module.
	pDemod = pNim->pDemod;

	// Get signal strength from demod.
	if(pDemod->GetSignalStrength(pDemod, pSignalStrength) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	return FUNCTION_SUCCESS;

error_status_execute_function:
	return FUNCTION_ERROR;
}
Beispiel #12
0
/**
 * @see   DVBT_NIM_FP_GET_SNR_DB
 */
s32 dvbt_nim_default_GetSnrDb(DVBT_NIM_MODULE *pNim, s64 *pSnrDbNum, s64 *pSnrDbDen)
{
	DVBT_DEMOD_MODULE *pDemod;

	// Get demod module.
	pDemod = pNim->pDemod;

	// Get SNR in dB from demod.
	if(pDemod->GetSnrDb(pDemod, pSnrDbNum, pSnrDbDen) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	return FUNCTION_SUCCESS;

error_status_execute_function:
	return FUNCTION_ERROR;
}
Beispiel #13
0
/**

@see   DVBT_NIM_FP_SET_PARAMETERS

*/
s32
dvbt_nim_default_SetParameters(
	DVBT_NIM_MODULE *pNim,
	u64 RfFreqHz,
	s32 BandwidthMode
	)
{
	TUNER_MODULE *pTuner;
	DVBT_DEMOD_MODULE *pDemod;


	// Get tuner module and demod module.
	pTuner = pNim->pTuner;
	pDemod = pNim->pDemod;


	// Set tuner RF frequency in Hz.
	if(pTuner->SetRfFreqHz(pTuner, RfFreqHz) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Set demod bandwidth mode.
	if(pDemod->SetBandwidthMode(pDemod, BandwidthMode) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Reset demod particular registers.
	if(pDemod->ResetFunction(pDemod) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Reset demod by software reset.
	if(pDemod->SoftwareReset(pDemod) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	return FUNCTION_SUCCESS;


error_status_execute_function:
	return FUNCTION_ERROR;
}
Beispiel #14
0
/**

@see   DVBT_NIM_FP_IS_SIGNAL_LOCKED

*/
s32
dvbt_nim_default_IsSignalLocked(
	DVBT_NIM_MODULE *pNim,
	s32 *pAnswer
	)
{
	BASE_INTERFACE_MODULE *pBaseInterface;
	DVBT_DEMOD_MODULE *pDemod;
	s32 i;


	// Get base interface and demod module.
	pBaseInterface = pNim->pBaseInterface;
	pDemod         = pNim->pDemod;


	// Wait for signal lock check.
	for(i = 0; i < DVBT_NIM_SINGAL_LOCK_CHECK_TIMES_MAX_DEFAULT; i++)
	{
		// Wait 20 ms.
		pBaseInterface->WaitMs(pBaseInterface, 20);

		// Check signal lock status on demod.
		// Note: If signal is locked, stop signal lock check.
		if(pDemod->IsSignalLocked(pDemod, pAnswer) != FUNCTION_SUCCESS)
			goto error_status_execute_function;

		if(*pAnswer == YES)
			break;
	}


	return FUNCTION_SUCCESS;


error_status_execute_function:
	return FUNCTION_ERROR;
}
Beispiel #15
0
/**

@see   DVBT_NIM_FP_UPDATE_FUNCTION

*/
s32
dvbt_nim_default_UpdateFunction(
	DVBT_NIM_MODULE *pNim
	)
{
	DVBT_DEMOD_MODULE *pDemod;


	// Get demod module.
	pDemod = pNim->pDemod;


	// Update demod particular registers.
	if(pDemod->UpdateFunction(pDemod) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	return FUNCTION_SUCCESS;


error_status_execute_function:
	return FUNCTION_ERROR;
}
Beispiel #16
0
UData_t
demod_get_agc(
	handle_t demod_handle,
	uint16_t *rf_level,
	uint16_t *bb_level
	)
{
	DVBT_DEMOD_MODULE *pDemod;
	int RfAgc;
	int IfAgc;


	// Get demod module.
	pDemod = (DVBT_DEMOD_MODULE *)demod_handle;

	// Get RF and IF AGC value.
	if(pDemod->GetRfAgc(pDemod, &RfAgc) != FUNCTION_SUCCESS)
		goto error_status_get_registers;

	if(pDemod->GetIfAgc(pDemod, &IfAgc) != FUNCTION_SUCCESS)
		goto error_status_get_registers;

	// Convert RF and IF AGC value to proper format.
	*rf_level = (uint16_t)((RfAgc + (1 << (RTL2832_RF_AGC_REG_BIT_NUM - 1))) *
		(1 << (MT2266_DEMOD_ASSUMED_AGC_REG_BIT_NUM - RTL2832_RF_AGC_REG_BIT_NUM)));

	*bb_level = (uint16_t)((IfAgc + (1 << (RTL2832_IF_AGC_REG_BIT_NUM - 1))) *
		(1 << (MT2266_DEMOD_ASSUMED_AGC_REG_BIT_NUM - RTL2832_IF_AGC_REG_BIT_NUM)));


	return MT_OK;


error_status_get_registers:
	return MT_COMM_ERR;
}
Beispiel #17
0
/**

@see   DVBT_NIM_FP_GET_CR_OFFSET_HZ

*/
s32
dvbt_nim_default_GetCrOffsetHz(
	DVBT_NIM_MODULE *pNim,
	s64 *pCrOffsetHz
	)
{
	DVBT_DEMOD_MODULE *pDemod;


	// Get demod module.
	pDemod = pNim->pDemod;


	// Get CR offset in Hz from demod.
	if(pDemod->GetCrOffsetHz(pDemod, pCrOffsetHz) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	return FUNCTION_SUCCESS;


error_status_execute_function:
	return FUNCTION_ERROR;
}
Beispiel #18
0
/**

@see   DVBT_NIM_FP_GET_TPS_INFO

*/
s32
dvbt_nim_default_GetTpsInfo(
	DVBT_NIM_MODULE *pNim,
	s32 *pConstellation,
	s32 *pHierarchy,
	s32 *pCodeRateLp,
	s32 *pCodeRateHp,
	s32 *pGuardInterval,
	s32 *pFftMode
	)
{
	DVBT_DEMOD_MODULE *pDemod;


	// Get demod module.
	pDemod = pNim->pDemod;


	// Get TPS constellation information from demod.
	if(pDemod->GetConstellation(pDemod, pConstellation) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Get TPS hierarchy information from demod.
	if(pDemod->GetHierarchy(pDemod, pHierarchy) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Get TPS low-priority code rate information from demod.
	if(pDemod->GetCodeRateLp(pDemod, pCodeRateLp) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Get TPS high-priority code rate information from demod.
	if(pDemod->GetCodeRateHp(pDemod, pCodeRateHp) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Get TPS guard interval information from demod.
	if(pDemod->GetGuardInterval(pDemod, pGuardInterval) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Get TPS FFT mode information from demod.
	if(pDemod->GetFftMode(pDemod, pFftMode) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	return FUNCTION_SUCCESS;


error_status_execute_function:
	return FUNCTION_ERROR;
}
Beispiel #19
0
/**

@see   DVBT_NIM_FP_SET_PARAMETERS

*/
s32
rtl2832_tda18272_SetParameters(
	DVBT_NIM_MODULE *pNim,
	u64 RfFreqHz,
	s32 BandwidthMode
	)
{
	TUNER_MODULE *pTuner;
	DVBT_DEMOD_MODULE *pDemod;

	TDA18272_EXTRA_MODULE *pTunerExtra;
	s32 TunerStandardBandwidthMode;
	u64 IfFreqHz;



	// Get tuner module and demod module.
	pTuner = pNim->pTuner;
	pDemod = pNim->pDemod;

	// Get tuner extra module.
	pTunerExtra = &(pTuner->Extra.Tda18272);


	// Enable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x1) != FUNCTION_SUCCESS)
		goto error_status_set_registers;

	// Determine TunerBandwidthMode according to bandwidth mode.
	switch(BandwidthMode)
	{
		default:
		case DVBT_BANDWIDTH_6MHZ:	TunerStandardBandwidthMode = TDA18272_STANDARD_BANDWIDTH_DVBT_6MHZ;		break;
		case DVBT_BANDWIDTH_7MHZ:	TunerStandardBandwidthMode = TDA18272_STANDARD_BANDWIDTH_DVBT_7MHZ;		break;
		case DVBT_BANDWIDTH_8MHZ:	TunerStandardBandwidthMode = TDA18272_STANDARD_BANDWIDTH_DVBT_8MHZ;		break;
	}

	// Set tuner standard and bandwidth mode with TunerStandardBandwidthMode.
	if(pTunerExtra->SetStandardBandwidthMode(pTuner, TunerStandardBandwidthMode) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Set tuner RF frequency in Hz.
	// Note: Must run SetRfFreqHz() after SetStandardBandwidthMode(), because SetRfFreqHz() needs some
	//       SetStandardBandwidthMode() information.
	if(pTuner->SetRfFreqHz(pTuner, RfFreqHz) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Get tuner IF frequency in Hz.
	// Note: 1. Must run GetIfFreqHz() after SetRfFreqHz(), because GetIfFreqHz() needs some SetRfFreqHz() information.
	//       2. TDA18272 tuner uses dynamic IF frequency.
	if(pTunerExtra->GetIfFreqHz(pTuner, &IfFreqHz) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Disable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x0) != FUNCTION_SUCCESS)
		goto error_status_set_registers;


	// Set demod IF frequency according to IfFreqHz.
	// Note: TDA18272 tuner uses dynamic IF frequency.
	if(pDemod->SetIfFreqHz(pDemod, IfFreqHz) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Set demod bandwidth mode.
	if(pDemod->SetBandwidthMode(pDemod, BandwidthMode) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Reset demod particular registers.
	if(pDemod->ResetFunction(pDemod) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	// Reset demod by software reset.
	if(pDemod->SoftwareReset(pDemod) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	return FUNCTION_SUCCESS;


error_status_execute_function:
error_status_set_registers:
	return FUNCTION_ERROR;
}
static int fe_demod_info_ioctrl(struct dvb_frontend *fe, void *parg)
{

    struct rtl2832u_ioctl_info_struct*  info_ctrl = (struct rtl2832u_ioctl_info_struct*)parg;
    int ret =-1;
    struct rtl2832_state*	p_state = fe->demodulator_priv;
    DVBT_NIM_MODULE 	*pNim;
    DVBT_DEMOD_MODULE 	*pDemod;
    u16			strength=0;
    u32			quality=0;
    int 			answer=0;
    unsigned long 		BerNum=0,BerDen=1;
    long 			SnrDbNum=0, SnrDbDen=1;
    long 			tr_ppm=0,cr_hz=0;
    unsigned long 		data_length=info_ctrl->data_length;
    int 			info_cmd = info_ctrl->cmd_num;
    deb_info("+%s : ioctl -demod info cmd = %d ,data length= %d (must > %d )\n", __FUNCTION__,info_cmd,(int)data_length,INFO_DEMOD_DATA_LEN);
    if (p_state->demod_type != RTL2832) {
        deb_info("ERROR::demod type not rtl2832u...\n");
        return -1;
    }
    if (data_length < INFO_DEMOD_DATA_LEN) {
        deb_info("ERROR::data length is too short...,must be greater than %d \n",INFO_DEMOD_DATA_LEN);
        return -1;
    }
    pNim = p_state->pNim;
    if (pNim == NULL) {
        deb_info("ERROR::nim is null...\n");
        return -1;
    }

    pDemod=pNim->pDemod;


    if ((info_cmd != FE_GET_SIGN_STRENGTH) && (info_cmd != FE_GET_SIGN_QUALITY))
    {
        if( mutex_lock_interruptible(&p_state->i2c_repeater_mutex) )	{
            return -10;
        }
    }
    info_ctrl->data[INFO_DATA_VALUE]=0x00000000;
    info_ctrl->data[INFO_DATA_DEN]=1;
    switch(info_cmd)
    {
    case FE_GET_SIGN_STRENGTH:
        if (rtl2832_read_signal_strength(fe,&strength) != 0)
        {
            ret=-10;
        }
        else
        {
            ret=10;
            info_ctrl->data[INFO_DATA_VALUE]=(unsigned long)strength;
            info_ctrl->data[INFO_DATA_DEN]=1;
//				deb_info("rtl2832u ioctl (FE_GET_SIGN_STRENGTH)- strength = %x (%x). \n",strength,info_ctrl->data[INFO_DATA_VALUE] );

        }


        break;
    case FE_GET_SIGN_QUALITY:
        if (rtl2832_read_signal_quality(fe,&quality) != 0)
        {
            ret=-10;
        }
        else
        {
            ret=10;
            info_ctrl->data[INFO_DATA_VALUE]=(unsigned long)quality;
            info_ctrl->data[INFO_DATA_DEN]=1;
//				deb_info("rtl2832u ioctl (FE_GET_SIGN_QUALITY)- quality = %x (%x). \n",quality,info_ctrl->data[INFO_DATA_VALUE] );
        }

        break;
    case FE_GET_SIGN_LOCK:

        answer=NO;
        if (pDemod->IsSignalLocked(pDemod, &answer) != FUNCTION_SUCCESS)
        {
            ret=-10;
        }
        else
        {
            if (answer == YES) {
                info_ctrl->data[INFO_DATA_VALUE]=1;
            }
            else	info_ctrl->data[INFO_DATA_VALUE]=0;

            info_ctrl->data[INFO_DATA_DEN]=1;
            ret=10;
        }


        break;
    case FE_GET_DEMOD_BER:

        if(pDemod->GetBer(pDemod, &BerNum, &BerDen) != FUNCTION_SUCCESS)
        {
            ret=-10;
            info_ctrl->data[INFO_DATA_VALUE]=19616;
            info_ctrl->data[INFO_DATA_DEN]=1;
        }
        else
        {
            ret=10;
            info_ctrl->data[INFO_DATA_VALUE]=BerNum;
            info_ctrl->data[INFO_DATA_DEN]=BerDen;
        }

        break;
    case FE_GET_DEMOD_SNR_DB:
        if(pDemod->GetSnrDb(pDemod, &SnrDbNum, &SnrDbDen) != FUNCTION_SUCCESS)
        {
            ret=-10;
            info_ctrl->data[INFO_DATA_VALUE]=0;
            info_ctrl->data[INFO_DATA_DEN]=1;
        }
        else
        {
            ret=10;
            info_ctrl->data[INFO_DATA_VALUE]=SnrDbNum;
            info_ctrl->data[INFO_DATA_DEN]=SnrDbDen;
        }
        break;
    case FE_GET_DEMOD_TR_PPM:
        if(pDemod->GetTrOffsetPpm(pDemod, &tr_ppm) != FUNCTION_SUCCESS)
        {
            ret=-10;
            info_ctrl->data[INFO_DATA_VALUE]=0;
            info_ctrl->data[INFO_DATA_DEN]=1;
        }
        else
        {
            ret=10;
            info_ctrl->data[INFO_DATA_VALUE]=tr_ppm;
            info_ctrl->data[INFO_DATA_DEN]=1;
        }
        break;
    case FE_GET_DEMOD_CR_HZ:
        if(pDemod->GetCrOffsetHz(pDemod, &cr_hz) != FUNCTION_SUCCESS)
        {
            ret=-10;
            info_ctrl->data[INFO_DATA_VALUE]=0;
            info_ctrl->data[INFO_DATA_DEN]=1;
        }
        else
        {
            ret=10;
            info_ctrl->data[INFO_DATA_VALUE]=cr_hz;
            info_ctrl->data[INFO_DATA_DEN]=1;
        }
        break;
    default:
        deb_info("ERROR::rtl2832u ioctl - std info cmd ret= unknow info commond. \n" );
        ret=-1;
        break;
    }


    if ((info_cmd != FE_GET_SIGN_STRENGTH) && (info_cmd != FE_GET_SIGN_QUALITY)) {
        mutex_unlock(&p_state->i2c_repeater_mutex);
    }

//	deb_info("-%s :ioctl - std info cmd ret= %x,data=%x,den=%x\n", __FUNCTION__,ret,(int)info_ctrl->data[INFO_DATA_VALUE],info_ctrl->data[INFO_DATA_DEN]);

    return ret;

}
/**

@brief   Update tuner LNA_GAIN with RSSI.

One can use rtl2832_fc0013_UpdateTunerLnaGainWithRssi() to update tuner LNA_GAIN with RSSI.


@param [in]   pNim   The NIM module pointer


@retval   FUNCTION_SUCCESS   Update tuner LNA_GAIN with RSSI successfully.
@retval   FUNCTION_ERROR     Update tuner LNA_GAIN with RSSI unsuccessfully.

*/
int
rtl2832_fc0013_UpdateTunerLnaGainWithRssi(
	DVBT_NIM_MODULE *pNim
	)
{
	TUNER_MODULE *pTuner;
	DVBT_DEMOD_MODULE *pDemod;
	FC0013_EXTRA_MODULE *pTunerExtra;
	RTL2832_FC0013_EXTRA_MODULE *pNimExtra;

	unsigned long RssiRCalOff;
	long RssiRDiff;
	unsigned char LnaGain;
	unsigned char ReadValue;

	// added from Fitipower, 2011-2-23, v0.8
	int boolVhfFlag;      // 0:false,  1:true
	int boolEnInChgFlag;  // 0:false,  1:true
	int intGainShift;



	// Get tuner module and demod module.
	pTuner = pNim->pTuner;
	pDemod = pNim->pDemod;

	// Get tuner extra module.
	pTunerExtra = &(pTuner->Extra.Fc0013);

	// Get NIM extra module.
	pNimExtra = &(pNim->Extra.Rtl2832Fc0013);


	// Get demod RSSI_R when tuner RSSI calibration in off.
	// Note: Tuner EN_CAL_RSSI and LNA_POWER_DOWN are set to 0x0 after rtl2832_fc0013_GetTunerRssiCalOn() executing.
	if(pDemod->GetRegBitsWithPage(pDemod, DVBT_RSSI_R, &RssiRCalOff) != FUNCTION_SUCCESS)
		goto error_status_get_registers;

	// To avoid the wrong rssi calibration value in the environment with strong RF pulse signal.
	if(RssiRCalOff < pNimExtra->RssiRCalOn)
		pNimExtra->RssiRCalOn = RssiRCalOff;


	// Calculate RSSI_R difference.
	RssiRDiff = RssiRCalOff - pNimExtra->RssiRCalOn;

	// Get tuner LNA_GAIN.
	if(fc0013_GetRegMaskBits(pTuner, 0x14, 4, 0, &LnaGain) != FC0013_I2C_SUCCESS)
		goto error_status_get_registers;


	// Determine next LNA_GAIN according to RSSI_R difference and current LNA_GAIN.
	switch(LnaGain)
	{
		default:

			boolVhfFlag = 0;		
			boolEnInChgFlag = 1;
			intGainShift = 10;
			LnaGain = FC0013_LNA_GAIN_HIGH_19;

			// Set tuner LNA_GAIN.
			if(fc0013_SetRegMaskBits(pTuner, 0x14, 4, 0, LnaGain) != FC0013_I2C_SUCCESS)
				goto error_status_set_registers;

			break;


		case FC0013_LNA_GAIN_HIGH_19:

			if(RssiRDiff >= 10)
			{
				boolVhfFlag = 1;		
				boolEnInChgFlag = 0;
				intGainShift = 10;
				LnaGain = FC0013_LNA_GAIN_HIGH_17;

				// Set tuner LNA_GAIN.
				if(fc0013_SetRegMaskBits(pTuner, 0x14, 4, 0, LnaGain) != FC0013_I2C_SUCCESS)
					goto error_status_set_registers;

				break;
			}
			else
			{
				goto success_status_Lna_Gain_No_Change;
			}


		case FC0013_LNA_GAIN_HIGH_17:
			
			if(RssiRDiff <= 2)
			{
				boolVhfFlag = 0;	
				boolEnInChgFlag = 1;
				intGainShift = 10;
				LnaGain = FC0013_LNA_GAIN_HIGH_19;

				// Set tuner LNA_GAIN.
				if(fc0013_SetRegMaskBits(pTuner, 0x14, 4, 0, LnaGain) != FC0013_I2C_SUCCESS)
					goto error_status_set_registers;

				break;
			}

			else if(RssiRDiff >= 24)
			{
				boolVhfFlag = 0;	
				boolEnInChgFlag = 0;
				intGainShift = 7;
				LnaGain = FC0013_LNA_GAIN_MIDDLE;

				// Set tuner LNA_GAIN.
				if(fc0013_SetRegMaskBits(pTuner, 0x14, 4, 0, LnaGain) != FC0013_I2C_SUCCESS)
					goto error_status_set_registers;

				break;
			}

			else
			{
				goto success_status_Lna_Gain_No_Change;
			}


		case FC0013_LNA_GAIN_MIDDLE:

			if(RssiRDiff >= 38)
			{
				boolVhfFlag = 0;	
				boolEnInChgFlag = 0;
				intGainShift = 7;
				LnaGain = FC0013_LNA_GAIN_LOW;

				// Set tuner LNA_GAIN.
				if(fc0013_SetRegMaskBits(pTuner, 0x14, 4, 0, LnaGain) != FC0013_I2C_SUCCESS)
					goto error_status_set_registers;

				break;
			}

			else if(RssiRDiff <= 5)
			{
				boolVhfFlag = 1;
				boolEnInChgFlag = 0;
				intGainShift = 10;
				LnaGain = FC0013_LNA_GAIN_HIGH_17;

				// Set tuner LNA_GAIN.
				if(fc0013_SetRegMaskBits(pTuner, 0x14, 4, 0, LnaGain) != FC0013_I2C_SUCCESS)
					goto error_status_set_registers;

				break;
			}

			else
			{
				goto success_status_Lna_Gain_No_Change;
			}

		
		case FC0013_LNA_GAIN_LOW:

			if(RssiRDiff <= 2)
			{
				boolVhfFlag = 0;
				boolEnInChgFlag = 0;
				intGainShift = 7;
				LnaGain = FC0013_LNA_GAIN_MIDDLE;

				// Set tuner LNA_GAIN.
				if(fc0013_SetRegMaskBits(pTuner, 0x14, 4, 0, LnaGain) != FC0013_I2C_SUCCESS)
					goto error_status_set_registers;

				break;
			}

			else
			{
				goto success_status_Lna_Gain_No_Change;
			}
	}


	if(fc0013_GetRegMaskBits(pTuner, 0x14, 7, 0, &ReadValue) != FC0013_I2C_SUCCESS)
		goto error_status_get_registers;

	if( (ReadValue & 0x60) == 0 )   // disable UHF & GPS ==> lock VHF frequency
	{
		boolVhfFlag = 1;
	}


	if( boolVhfFlag == 1 )
	{
		//FC0013_Write(0x07, (FC0013_Read(0x07) | 0x10));				// VHF = 1
		if(fc0013_GetRegMaskBits(pTuner, 0x07, 7, 0, &ReadValue) != FC0013_I2C_SUCCESS)
			goto error_status_get_registers;

		if(fc0013_SetRegMaskBits(pTuner, 0x07, 7, 0, ReadValue | 0x10) != FC0013_I2C_SUCCESS)
			goto error_status_set_registers;
	}
	else
	{
		//FC0013_Write(0x07, (FC0013_Read(0x07) & 0xEF));				// VHF = 0
		if(fc0013_GetRegMaskBits(pTuner, 0x07, 7, 0, &ReadValue) != FC0013_I2C_SUCCESS)
			goto error_status_get_registers;

		if(fc0013_SetRegMaskBits(pTuner, 0x07, 7, 0, ReadValue & 0xEF) != FC0013_I2C_SUCCESS)
			goto error_status_set_registers;
	}
		

	if( boolEnInChgFlag == 1 )
	{
		//FC0013_Write(0x0A, (FC0013_Read(0x0A) | 0x20));				// EN_IN_CHG = 1
		if(fc0013_GetRegMaskBits(pTuner, 0x0A, 7, 0, &ReadValue) != FC0013_I2C_SUCCESS)
			goto error_status_get_registers;

		if(fc0013_SetRegMaskBits(pTuner, 0x0A, 7, 0, ReadValue | 0x20) != FC0013_I2C_SUCCESS)
			goto error_status_set_registers;
	}
	else
	{
		//FC0013_Write(0x0A, (FC0013_Read(0x0A) & 0xDF));				// EN_IN_CHG = 0
		if(fc0013_GetRegMaskBits(pTuner, 0x0A, 7, 0, &ReadValue) != FC0013_I2C_SUCCESS)
			goto error_status_get_registers;

		if(fc0013_SetRegMaskBits(pTuner, 0x0A, 7, 0, ReadValue & 0xDF) != FC0013_I2C_SUCCESS)
			goto error_status_set_registers;
	}


	if( intGainShift == 10 )
	{
		//FC0013_Write(0x07, (FC0013_Read(0x07) & 0xF0) | 0x0A);		// GS = 10
		if(fc0013_GetRegMaskBits(pTuner, 0x07, 7, 0, &ReadValue) != FC0013_I2C_SUCCESS)
			goto error_status_get_registers;

		if(fc0013_SetRegMaskBits(pTuner, 0x07, 7, 0, (ReadValue & 0xF0) | 0x0A) != FC0013_I2C_SUCCESS)
			goto error_status_set_registers;
	}
	else
	{
		//FC0013_Write(0x07, (FC0013_Read(0x07) & 0xF0) | 0x07);		// GS = 7
		if(fc0013_GetRegMaskBits(pTuner, 0x07, 7, 0, &ReadValue) != FC0013_I2C_SUCCESS)
			goto error_status_get_registers;

		if(fc0013_SetRegMaskBits(pTuner, 0x07, 7, 0, (ReadValue & 0xF0) | 0x07) != FC0013_I2C_SUCCESS)
			goto error_status_set_registers;
	}


success_status_Lna_Gain_No_Change:
	return FUNCTION_SUCCESS;


error_status_get_registers:
error_status_set_registers:
	return FUNCTION_ERROR;
}
Beispiel #22
0
UData_t
tuner_set_bw_narrow(
	handle_t tuner_handle,
	handle_t demod_handle
	)
{
	DVBT_DEMOD_MODULE *pDemod;

	int DemodBandwidthMode;
	unsigned long AciDetInd;
	unsigned int TunerBandwidthHz;
	unsigned int TargetTunerBandwidthHz;


	// Get demod module.
	pDemod = (DVBT_DEMOD_MODULE *)demod_handle;

	// Get demod bandwidth mode.
	if(pDemod->GetBandwidthMode(pDemod, &DemodBandwidthMode) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Get demod ACI_DET_IND.
	if(pDemod->GetRegBitsWithPage(pDemod, DVBT_ACI_DET_IND, &AciDetInd) != FUNCTION_SUCCESS)
		goto error_status_get_registers;

	// Determine tuner target bandwidth according to ACI_DET_IND.
	if(AciDetInd == 0x1)
	{
		// Choose narrow target bandwidth.
		switch(DemodBandwidthMode)
		{
			case DVBT_BANDWIDTH_6MHZ:	TargetTunerBandwidthHz = MT2266_BANDWIDTH_5MHZ;		break;
			case DVBT_BANDWIDTH_7MHZ:	TargetTunerBandwidthHz = MT2266_BANDWIDTH_6MHZ;		break;
			default:
			case DVBT_BANDWIDTH_8MHZ:	TargetTunerBandwidthHz = MT2266_BANDWIDTH_7MHZ;		break;
		}
	}
	else
	{
		// Choose normal target bandwidth.
		switch(DemodBandwidthMode)
		{
			case DVBT_BANDWIDTH_6MHZ:	TargetTunerBandwidthHz = MT2266_BANDWIDTH_6MHZ;		break;
			case DVBT_BANDWIDTH_7MHZ:	TargetTunerBandwidthHz = MT2266_BANDWIDTH_7MHZ;		break;
			default:
			case DVBT_BANDWIDTH_8MHZ:	TargetTunerBandwidthHz = MT2266_BANDWIDTH_8MHZ;		break;
		}
	}

	// Get tuner bandwidth.
	if(MT_IS_ERROR(MT2266_GetParam(tuner_handle, MT2266_OUTPUT_BW, &TunerBandwidthHz)))
		goto error_status_get_tuner_bandwidth;

	// Set tuner bandwidth with normal setting according to demod bandwidth mode.
	if(TunerBandwidthHz != TargetTunerBandwidthHz)
	{
		if(MT_IS_ERROR(MT2266_SetParam(tuner_handle, MT2266_OUTPUT_BW, TargetTunerBandwidthHz)))
			goto error_status_set_tuner_bandwidth;
	}


	return MT_OK;


error_status_set_tuner_bandwidth:
error_status_get_tuner_bandwidth:
error_status_get_registers:
error_status_execute_function:
	return MT_COMM_ERR;
}
/**

@see   DVBT_NIM_FP_INITIALIZE

*/
int
rtl2832_fc0013_Initialize(
	DVBT_NIM_MODULE *pNim
	)
{
	typedef struct
	{
		int RegBitName;
		unsigned long Value;
	}
	REG_VALUE_ENTRY;


	static const REG_VALUE_ENTRY AdditionalInitRegValueTable[RTL2832_FC0013_ADDITIONAL_INIT_REG_TABLE_LEN] =
	{
		// RegBitName,				Value
		{DVBT_DAGC_TRG_VAL,			0x5a	},
		{DVBT_AGC_TARG_VAL_0,		0x0		},
		{DVBT_AGC_TARG_VAL_8_1,		0x5a	},
		{DVBT_AAGC_LOOP_GAIN,		0x16    },
		{DVBT_LOOP_GAIN2_3_0,		0x6		},
		{DVBT_LOOP_GAIN2_4,			0x1		},
		{DVBT_LOOP_GAIN3,			0x16	},
		{DVBT_VTOP1,				0x35	},
		{DVBT_VTOP2,				0x21	},
		{DVBT_VTOP3,				0x21	},
		{DVBT_KRF1,					0x0		},
		{DVBT_KRF2,					0x40	},
		{DVBT_KRF3,					0x10	},
		{DVBT_KRF4,					0x10	},
		{DVBT_IF_AGC_MIN,			0x80	},
		{DVBT_IF_AGC_MAX,			0x7f	},
		{DVBT_RF_AGC_MIN,			0x80	},
		{DVBT_RF_AGC_MAX,			0x7f	},
		{DVBT_POLAR_RF_AGC,			0x0		},
		{DVBT_POLAR_IF_AGC,			0x0		},
		{DVBT_AD7_SETTING,			0xe9bf	},
		{DVBT_EN_GI_PGA,			0x0		},
		{DVBT_THD_LOCK_UP,			0x0		},
		{DVBT_THD_LOCK_DW,			0x0		},
		{DVBT_THD_UP1,				0x11	},
		{DVBT_THD_DW1,				0xef	},
		{DVBT_INTER_CNT_LEN,		0xc		},
		{DVBT_GI_PGA_STATE,			0x0		},
		{DVBT_EN_AGC_PGA,			0x1		},
//		{DVBT_REG_GPE,				0x1		},
//		{DVBT_REG_GPO,				0x0		},
//		{DVBT_REG_MONSEL,			0x0		},
//		{DVBT_REG_MON,				0x3		},
//		{DVBT_REG_4MSEL,			0x0		},
	};


	TUNER_MODULE *pTuner;
	DVBT_DEMOD_MODULE *pDemod;

	int i;

	int RegBitName;
	unsigned long Value;



	// Get tuner module and demod module.
	pTuner = pNim->pTuner;
	pDemod = pNim->pDemod;


	// Enable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x1) != FUNCTION_SUCCESS)
		goto error_status_set_registers;

	// Initialize tuner.
	if(pTuner->Initialize(pTuner) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Set FC0013 up-dowm AGC.
	//(0xFE for master of dual).
	//(0xFC for slave of dual, and for 2832 mini dongle).
	if(fc0013_SetRegMaskBits(pTuner, 0x0c, 7, 0, 0xFC) != FC0013_I2C_SUCCESS)
		goto error_status_set_tuner_registers;

	// Disable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x0) != FUNCTION_SUCCESS)
		goto error_status_set_registers;


	// Initialize demod.
	if(pDemod->Initialize(pDemod) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Set demod IF frequency with 0 Hz.
	if(pDemod->SetIfFreqHz(pDemod, IF_FREQ_0HZ) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Set demod spectrum mode with SPECTRUM_NORMAL.
	if(pDemod->SetSpectrumMode(pDemod, SPECTRUM_NORMAL) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	// Set demod registers.
	for(i = 0; i < RTL2832_FC0013_ADDITIONAL_INIT_REG_TABLE_LEN; i++)
	{
		// Get register bit name and its value.
		RegBitName = AdditionalInitRegValueTable[i].RegBitName;
		Value      = AdditionalInitRegValueTable[i].Value;

		// Set demod registers
		if(pDemod->SetRegBitsWithPage(pDemod, RegBitName, Value) != FUNCTION_SUCCESS)
			goto error_status_set_registers;
	}

	// Reset demod by software reset.
	if(pDemod->SoftwareReset(pDemod) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	// Enable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x1) != FUNCTION_SUCCESS)
		goto error_status_set_registers;

	// Get tuner RSSI value when calibration is on.
	// Note: Need to execute rtl2832_fc0013_GetTunerRssiCalOn() after demod AD7 is on.
	if(rtl2832_fc0013_GetTunerRssiCalOn(pNim) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Disable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x0) != FUNCTION_SUCCESS)
		goto error_status_set_registers;


	return FUNCTION_SUCCESS;


error_status_execute_function:
error_status_set_registers:
error_status_set_tuner_registers:
	return FUNCTION_ERROR;
}
/**

@see   DVBT_NIM_FP_INITIALIZE

*/
int
rtl2832_max3543_Initialize(
	DVBT_NIM_MODULE *pNim
	)
{
	typedef struct
	{
		int RegBitName;
		unsigned long Value;
	}
	REG_VALUE_ENTRY;


	static const REG_VALUE_ENTRY AdditionalInitRegValueTable[RTL2832_MAX3543_ADDITIONAL_INIT_REG_TABLE_LEN] =
	{
		// RegBitName,				Value
		{DVBT_DAGC_TRG_VAL,			0x39	},
		{DVBT_AGC_TARG_VAL_0,		0x0		},
		{DVBT_AGC_TARG_VAL_8_1,		0x4b	},
		{DVBT_AAGC_LOOP_GAIN,		0x16    },
		{DVBT_LOOP_GAIN2_3_0,		0x6		},
		{DVBT_LOOP_GAIN2_4,			0x1		},
		{DVBT_LOOP_GAIN3,			0x16	},
		{DVBT_VTOP1,				0x35	},
		{DVBT_VTOP2,				0x21	},
		{DVBT_VTOP3,				0x21	},
		{DVBT_KRF1,					0x0		},
		{DVBT_KRF2,					0x40	},
		{DVBT_KRF3,					0x10	},
		{DVBT_KRF4,					0x10	},
		{DVBT_IF_AGC_MIN,			0x80	},
		{DVBT_IF_AGC_MAX,			0x7f	},
		{DVBT_RF_AGC_MIN,			0x80	},
		{DVBT_RF_AGC_MAX,			0x7f	},
		{DVBT_POLAR_RF_AGC,			0x0		},
		{DVBT_POLAR_IF_AGC,			0x0		},
		{DVBT_AD7_SETTING,			0xe9d4	},
		{DVBT_AD_EN_REG1,			0x0		},
		{DVBT_CKOUT_PWR_PID,		0x0		},
	};


	TUNER_MODULE *pTuner;
	DVBT_DEMOD_MODULE *pDemod;

	int i;

	int RegBitName;
	unsigned long Value;



	// Get tuner module and demod module.
	pTuner = pNim->pTuner;
	pDemod = pNim->pDemod;


	// Enable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x1) != FUNCTION_SUCCESS)
		goto error_status_set_registers;

	// Initialize tuner.
	if(pTuner->Initialize(pTuner) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Disable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x0) != FUNCTION_SUCCESS)
		goto error_status_set_registers;


	// Initialize demod.
	if(pDemod->Initialize(pDemod) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Set demod IF frequency with NIM default.
	if(pDemod->SetIfFreqHz(pDemod, RTL2832_MAX3543_IF_FREQ_HZ_DEFAULT) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Set demod spectrum mode with NIM default.
	if(pDemod->SetSpectrumMode(pDemod, RTL2832_MAX3543_SPECTRUM_MODE_DEFAULT) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	// Set demod registers.
	for(i = 0; i < RTL2832_MAX3543_ADDITIONAL_INIT_REG_TABLE_LEN; i++)
	{
		// Get register bit name and its value.
		RegBitName = AdditionalInitRegValueTable[i].RegBitName;
		Value      = AdditionalInitRegValueTable[i].Value;

		// Set demod registers
		if(pDemod->SetRegBitsWithPage(pDemod, RegBitName, Value) != FUNCTION_SUCCESS)
			goto error_status_set_registers;
	}


	return FUNCTION_SUCCESS;


error_status_execute_function:
error_status_set_registers:
	return FUNCTION_ERROR;
}
Beispiel #25
0
/**
 * @see   DVBT_NIM_FP_INITIALIZE
 */
s32 rtl2832_tda18272_Initialize(DVBT_NIM_MODULE *pNim)
{
	typedef struct
	{
		s32 RegBitName;
		u64 Value;
	}
	REG_VALUE_ENTRY;


	static const REG_VALUE_ENTRY AdditionalInitRegValueTable[RTL2832_TDA18272_ADDITIONAL_INIT_REG_TABLE_LEN] =
	{
		// RegBitName,				Value
		{DVBT_DAGC_TRG_VAL,			0x39	},
		{DVBT_AGC_TARG_VAL_0,		0x0		},
		{DVBT_AGC_TARG_VAL_8_1,		0x40	},
		{DVBT_AAGC_LOOP_GAIN,		0x16    },
		{DVBT_LOOP_GAIN2_3_0,		0x8		},
		{DVBT_LOOP_GAIN2_4,			0x1		},
		{DVBT_LOOP_GAIN3,			0x18	},
		{DVBT_VTOP1,				0x35	},
		{DVBT_VTOP2,				0x21	},
		{DVBT_VTOP3,				0x21	},
		{DVBT_KRF1,					0x0		},
		{DVBT_KRF2,					0x40	},
		{DVBT_KRF3,					0x10	},
		{DVBT_KRF4,					0x10	},
		{DVBT_IF_AGC_MIN,			0x80	},
		{DVBT_IF_AGC_MAX,			0x7f	},
		{DVBT_RF_AGC_MIN,			0x80	},
		{DVBT_RF_AGC_MAX,			0x7f	},
		{DVBT_POLAR_RF_AGC,			0x0		},
		{DVBT_POLAR_IF_AGC,			0x0		},
		{DVBT_AD7_SETTING,			0xe9f4	},
	};


	TUNER_MODULE *pTuner;
	DVBT_DEMOD_MODULE *pDemod;

	s32 i;

	s32 RegBitName;
	u64 Value;



	// Get tuner module and demod module.
	pTuner = pNim->pTuner;
	pDemod = pNim->pDemod;


	// Enable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x1) != FUNCTION_SUCCESS)
		goto error_status_set_registers;

	// Initialize tuner.
	if(pTuner->Initialize(pTuner) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Disable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x0) != FUNCTION_SUCCESS)
		goto error_status_set_registers;


	// Initialize demod.
	// Note: TDA18272 tuner uses dynamic IF frequency, so we will set demod IF frequency in SetParameters().
	if(pDemod->Initialize(pDemod) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Set demod spectrum mode with SPECTRUM_INVERSE.
	if(pDemod->SetSpectrumMode(pDemod, SPECTRUM_INVERSE) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	// Set demod registers.
	for(i = 0; i < RTL2832_TDA18272_ADDITIONAL_INIT_REG_TABLE_LEN; i++)
	{
		// Get register bit name and its value.
		RegBitName = AdditionalInitRegValueTable[i].RegBitName;
		Value      = AdditionalInitRegValueTable[i].Value;

		// Set demod registers
		if(pDemod->SetRegBitsWithPage(pDemod, RegBitName, Value) != FUNCTION_SUCCESS)
			goto error_status_set_registers;
	}


	return FUNCTION_SUCCESS;


error_status_execute_function:
error_status_set_registers:
	return FUNCTION_ERROR;
}
/**

@see   DVBT_NIM_FP_INITIALIZE

*/
int
rtl2832_fc2580_Initialize(
	DVBT_NIM_MODULE *pNim
	)
{
	typedef struct
	{
		int RegBitName;
		unsigned long Value;
	}
	REG_VALUE_ENTRY;


	static const REG_VALUE_ENTRY AdditionalInitRegValueTable[RTL2832_FC2580_ADDITIONAL_INIT_REG_TABLE_LEN] =
	{
		// RegBitName,				Value
		{DVBT_DAGC_TRG_VAL,			0x39	},
		{DVBT_AGC_TARG_VAL_0,		0x0		},
		{DVBT_AGC_TARG_VAL_8_1,		0x5a	},
		{DVBT_AAGC_LOOP_GAIN,		0x16    },
		{DVBT_LOOP_GAIN2_3_0,		0x6		},
		{DVBT_LOOP_GAIN2_4,			0x1		},
		{DVBT_LOOP_GAIN3,			0x16	},
		{DVBT_VTOP1,				0x35	},
		{DVBT_VTOP2,				0x21	},
		{DVBT_VTOP3,				0x21	},
		{DVBT_KRF1,					0x0		},
		{DVBT_KRF2,					0x40	},
		{DVBT_KRF3,					0x10	},
		{DVBT_KRF4,					0x10	},
		{DVBT_IF_AGC_MIN,			0x80	},
		{DVBT_IF_AGC_MAX,			0x7f	},
		{DVBT_RF_AGC_MIN,			0x9c	},
		{DVBT_RF_AGC_MAX,			0x7f	},
		{DVBT_POLAR_RF_AGC,			0x0		},
		{DVBT_POLAR_IF_AGC,			0x0		},
		{DVBT_AD7_SETTING,			0xe9f4	},
	};


	TUNER_MODULE *pTuner;
	DVBT_DEMOD_MODULE *pDemod;

	int i;

	int RegBitName;
	unsigned long Value;



	// Get tuner module and demod module.
	pTuner = pNim->pTuner;
	pDemod = pNim->pDemod;


	// Enable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x1) != FUNCTION_SUCCESS)
		goto error_status_set_registers;

	// Initialize tuner.
	if(pTuner->Initialize(pTuner) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Disable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x0) != FUNCTION_SUCCESS)
		goto error_status_set_registers;


	// Initialize demod.
	if(pDemod->Initialize(pDemod) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Set demod IF frequency with 0 Hz.
	if(pDemod->SetIfFreqHz(pDemod, IF_FREQ_0HZ) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Set demod spectrum mode with SPECTRUM_NORMAL.
	if(pDemod->SetSpectrumMode(pDemod, SPECTRUM_NORMAL) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	// Set demod registers.
	for(i = 0; i < RTL2832_FC2580_ADDITIONAL_INIT_REG_TABLE_LEN; i++)
	{
		// Get register bit name and its value.
		RegBitName = AdditionalInitRegValueTable[i].RegBitName;
		Value      = AdditionalInitRegValueTable[i].Value;

		// Set demod registers
		if(pDemod->SetRegBitsWithPage(pDemod, RegBitName, Value) != FUNCTION_SUCCESS)
			goto error_status_set_registers;
	}


	// Set TS interface according to TS interface mode.
	switch(pNim->DemodTsInterfaceMode)
	{
		case TS_INTERFACE_PARALLEL:

			// Set demod TS interface with parallel mode.
			if(pDemod->SetRegBitsWithPage(pDemod, DVBT_SERIAL,   0) != FUNCTION_SUCCESS)
				goto error_status_set_registers;

			if(pDemod->SetRegBitsWithPage(pDemod, DVBT_CDIV_PH0, 9) != FUNCTION_SUCCESS)
				goto error_status_set_registers;

			if(pDemod->SetRegBitsWithPage(pDemod, DVBT_CDIV_PH1, 9) != FUNCTION_SUCCESS)
				goto error_status_set_registers;

			break;


		default:
		case TS_INTERFACE_SERIAL:

			// Set demod TS interface with serial mode.
			if(pDemod->SetRegBitsWithPage(pDemod, DVBT_SERIAL,   1) != FUNCTION_SUCCESS)
				goto error_status_set_registers;

			if(pDemod->SetRegBitsWithPage(pDemod, DVBT_CDIV_PH0, 2) != FUNCTION_SUCCESS)
				goto error_status_set_registers;

			if(pDemod->SetRegBitsWithPage(pDemod, DVBT_CDIV_PH1, 2) != FUNCTION_SUCCESS)
				goto error_status_set_registers;

			break;
	}


	return FUNCTION_SUCCESS;


error_status_execute_function:
error_status_set_registers:
	return FUNCTION_ERROR;
}
Beispiel #27
0
/**

@see   DVBT_NIM_FP_SET_PARAMETERS

*/
int
rtl2832_mt2266_SetParameters(
	DVBT_NIM_MODULE *pNim,
	unsigned long RfFreqHz,
	int BandwidthMode
	)
{
	TUNER_MODULE *pTuner;
	DVBT_DEMOD_MODULE *pDemod;

	MT2266_EXTRA_MODULE *pMt2266Extra;
	Handle_t Mt2266Handle;
	unsigned long BandwidthHz;

	RTL2832_MT2266_EXTRA_MODULE *pRtl2832Mt2266Extra;

	UData_t Status;



	// Get tuner module and demod module.
	pTuner = pNim->pTuner;
	pDemod = pNim->pDemod;

	// Get tuner extra module.
	pMt2266Extra = (MT2266_EXTRA_MODULE *)pTuner->pExtra;

	// Get tuner handle.
	Mt2266Handle = pMt2266Extra->DeviceHandle;

	// Get NIM extra module.
	pRtl2832Mt2266Extra = (RTL2832_MT2266_EXTRA_MODULE *)pNim->pExtra;


	// Enable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x1) != FUNCTION_SUCCESS)
		goto error_status_set_registers;

	// Set tuner RF frequency in Hz.
	if(pTuner->SetRfFreqHz(pTuner, RfFreqHz) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Determine BandwidthHz according to bandwidth mode.
	switch(BandwidthMode)
	{
		default:
		case DVBT_BANDWIDTH_6MHZ:		BandwidthHz = MT2266_BANDWIDTH_6MHZ;		break;
		case DVBT_BANDWIDTH_7MHZ:		BandwidthHz = MT2266_BANDWIDTH_7MHZ;		break;
		case DVBT_BANDWIDTH_8MHZ:		BandwidthHz = MT2266_BANDWIDTH_8MHZ;		break;
	}

	// Set tuner bandwidth in Hz with BandwidthHz.
	if(pMt2266Extra->SetBandwidthHz(pTuner, BandwidthHz) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Disable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x0) != FUNCTION_SUCCESS)
		goto error_status_set_registers;


	// Set demod bandwidth mode.
	if(pDemod->SetBandwidthMode(pDemod, BandwidthMode) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Reset demod particular registers.
	if(pDemod->ResetFunction(pDemod) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	// Reset demod by software reset.
	if(pDemod->SoftwareReset(pDemod) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Enable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x1) != FUNCTION_SUCCESS)
		goto error_status_set_registers;

	// Reset MT2266 update procedure.
	Status = demod_pdcontrol_reset(pDemod, Mt2266Handle, &pRtl2832Mt2266Extra->AgcCurrentState);

	if(MT_IS_ERROR(Status))
		goto error_status_execute_function;

	// Disable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x0) != FUNCTION_SUCCESS)
		goto error_status_set_registers;


	return FUNCTION_SUCCESS;


error_status_execute_function:
error_status_set_registers:
	return FUNCTION_ERROR;
}
Beispiel #28
0
/**

@see   DVBT_NIM_FP_UPDATE_FUNCTION

*/
int
rtl2832_mt2266_UpdateFunction(
	DVBT_NIM_MODULE *pNim
	)
{
	TUNER_MODULE *pTuner;
	DVBT_DEMOD_MODULE *pDemod;
	MT2266_EXTRA_MODULE *pMt2266Extra;
	RTL2832_MT2266_EXTRA_MODULE *pRtl2832Mt2266Extra;

	Handle_t Mt2266Handle;
	UData_t Status;



	// Get tuner module and demod module.
	pTuner = pNim->pTuner;
	pDemod = pNim->pDemod;

	// Get tuner extra module and tuner handle.
	pMt2266Extra = (MT2266_EXTRA_MODULE *)pTuner->pExtra;
	pMt2266Extra->GetHandle(pTuner, &Mt2266Handle);

	// Get NIM extra module.
	pRtl2832Mt2266Extra = (RTL2832_MT2266_EXTRA_MODULE *)pNim->pExtra;


	// Update demod particular registers.
	if(pDemod->UpdateFunction(pDemod) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	// Enable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x1) != FUNCTION_SUCCESS)
		goto error_status_set_registers;

	// Update demod and tuner register setting.
	Status = demod_pdcontrol(
		pDemod,
		Mt2266Handle,
		&pRtl2832Mt2266Extra->LnaConfig,
		&pRtl2832Mt2266Extra->UhfSens,
		&pRtl2832Mt2266Extra->AgcCurrentState,
		(uint32_t *)&pRtl2832Mt2266Extra->LnaGainOld
		);

	if(MT_IS_ERROR(Status))
		goto error_status_execute_function;

	// Disable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x0) != FUNCTION_SUCCESS)
		goto error_status_set_registers;


	return FUNCTION_SUCCESS;


error_status_execute_function:
error_status_set_registers:
	return FUNCTION_ERROR;
}
/**

@see   DVBT_NIM_FP_SET_PARAMETERS

*/
int
rtl2832_fc2580_SetParameters(
	DVBT_NIM_MODULE *pNim,
	unsigned long RfFreqHz,
	int BandwidthMode
	)
{
	TUNER_MODULE *pTuner;
	DVBT_DEMOD_MODULE *pDemod;

	FC2580_EXTRA_MODULE *pTunerExtra;
	int TunerBandwidthMode;



	// Get tuner module and demod module.
	pTuner = pNim->pTuner;
	pDemod = pNim->pDemod;

	// Get tuner extra module.
	pTunerExtra = (FC2580_EXTRA_MODULE *)pTuner->pExtra;


	// Enable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x1) != FUNCTION_SUCCESS)
		goto error_status_set_registers;

	// Set tuner RF frequency in Hz.
	if(pTuner->SetRfFreqHz(pTuner, RfFreqHz) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Determine TunerBandwidthMode according to bandwidth mode.
	switch(BandwidthMode)
	{
		default:
		case DVBT_BANDWIDTH_6MHZ:		TunerBandwidthMode = FC2580_BANDWIDTH_6000000HZ;		break;
		case DVBT_BANDWIDTH_7MHZ:		TunerBandwidthMode = FC2580_BANDWIDTH_7000000HZ;		break;
		case DVBT_BANDWIDTH_8MHZ:		TunerBandwidthMode = FC2580_BANDWIDTH_8000000HZ;		break;
	}

	// Set tuner bandwidth mode with TunerBandwidthMode.
	if(pTunerExtra->SetBandwidthMode(pTuner, TunerBandwidthMode) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Disable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x0) != FUNCTION_SUCCESS)
		goto error_status_set_registers;


	// Set demod bandwidth mode.
	if(pDemod->SetBandwidthMode(pDemod, BandwidthMode) != FUNCTION_SUCCESS)
		goto error_status_execute_function;

	// Reset demod particular registers.
	if(pDemod->ResetFunction(pDemod) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	// Reset demod by software reset.
	if(pDemod->SoftwareReset(pDemod) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	return FUNCTION_SUCCESS;


error_status_execute_function:
error_status_set_registers:
	return FUNCTION_ERROR;
}
/**

@see   DVBT_NIM_FP_UPDATE_FUNCTION

*/
int
rtl2832_mt2266_UpdateFunction(
	DVBT_NIM_MODULE *pNim
	)
{
	TUNER_MODULE *pTuner;
	DVBT_DEMOD_MODULE *pDemod;
	MT2266_EXTRA_MODULE *pTunerExtra;
	RTL2832_MT2266_EXTRA_MODULE *pNimExtra;

	Handle_t Mt2266Handle;
	UData_t Status;
	


	// Get tuner module and demod module.
	pTuner = pNim->pTuner;
	pDemod = pNim->pDemod;

	// Get tuner extra module and tuner handle.
	pTunerExtra = &(pTuner->Extra.Mt2266);
	pTunerExtra->GetHandle(pTuner, &Mt2266Handle);

	// Get NIM extra module.
	pNimExtra = &(pNim->Extra.Rtl2832Mt2266);


	// Update demod particular registers.
	if(pDemod->UpdateFunction(pDemod) != FUNCTION_SUCCESS)
		goto error_status_execute_function;


	// Enable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x1) != FUNCTION_SUCCESS)
		goto error_status_set_registers;

	// Update demod and tuner register setting.
	Status = demod_pdcontrol(
		pDemod,
		Mt2266Handle,
		&pNimExtra->LnaConfig,
		&pNimExtra->UhfSens,
		&pNimExtra->AgcCurrentState,
		&pNimExtra->LnaGainOld
		);

/*
	handle_t demod_handle,
	handle_t tuner_handle,
	unsigned char* lna_config,
	unsigned char* uhf_sens,
	unsigned char *agc_current_state,
	unsigned long *lna_gain_old
	
	unsigned char LnaConfig;
	unsigned char UhfSens;
	unsigned char AgcCurrentState;
	unsigned long LnaGainOld;	
	
*/

	if(MT_IS_ERROR(Status))
		goto error_status_execute_function;

	// Disable demod DVBT_IIC_REPEAT.
	if(pDemod->SetRegBitsWithPage(pDemod, DVBT_IIC_REPEAT, 0x0) != FUNCTION_SUCCESS)
		goto error_status_set_registers;


	return FUNCTION_SUCCESS;


error_status_execute_function:
error_status_set_registers:
	return FUNCTION_ERROR;
}