/** @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; }
/** @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; }
/** @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; }
// 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; }
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; }
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; }
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; }
/** @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; }
/** * @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; }
/** @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; }
/** @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; }
/** @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; }
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; }
/** @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; }
/** @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; }
/** @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; }
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; }
/** * @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; }
/** @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; }
/** @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; }