int demod_get_active_data_plp(struct cxd2837_state *state, sony_dvbt2_plp_t *plp_info) { sony_result_t ret; ret = sony_demod_dvbt2_monitor_ActivePLP(&(state->demod), SONY_DVBT2_PLP_DATA, plp_info); if (ret != SONY_RESULT_OK) { printk("Sony DVBT2 get active data plp failed, ret=0x%x\n", ret); return 1; } return 0; }
INT32 nim_cxd2837_get_FEC(struct nim_device *dev, UINT8* FEC) { sony_result_t result; sony_demod_t * pDemod = (sony_demod_t *)dev->priv; sony_demod_lock_result_t lock = SONY_DEMOD_LOCK_RESULT_NOTDETECT; sony_dvbt2_l1pre_t L1Pre; sony_dvbt2_plp_t plpInfo; sony_dvbt_tpsinfo_t tps; *FEC = 0; mutex_lock(&pDemod->demodMode_mutex_id); switch (pDemod->system) { case SONY_DTV_SYSTEM_DVBT2: result = sony_demod_dvbt2_CheckDemodLock(pDemod, &lock); break; case SONY_DTV_SYSTEM_DVBT: result = sony_demod_dvbt_CheckDemodLock (pDemod, &lock); break; case SONY_DTV_SYSTEM_DVBC: result = sony_demod_dvbc_CheckDemodLock (pDemod, &lock); break; case SONY_DTV_SYSTEM_UNKNOWN: default: result = SONY_RESULT_OK; } if (result != SONY_RESULT_OK || lock != SONY_DEMOD_LOCK_RESULT_LOCKED){ mutex_unlock(&pDemod->demodMode_mutex_id); return ERR_FAILUE; } if (pDemod->system == SONY_DTV_SYSTEM_DVBT2) { sony_demod_dvbt2_monitor_L1Pre(pDemod, &L1Pre);//sony_dvb_demod_monitorT2_L1Pre if (result != SONY_RESULT_OK){ mutex_unlock(&pDemod->demodMode_mutex_id); return ERR_FAILUE; } // Get Active PLP information. result = sony_demod_dvbt2_monitor_ActivePLP(pDemod, SONY_DVBT2_PLP_DATA, &plpInfo);//sony_dvb_demod_monitorT2_ActivePLP if (result != SONY_RESULT_OK){ mutex_unlock(&pDemod->demodMode_mutex_id); return ERR_FAILUE; } if (plpInfo.type == SONY_DVBT2_PLP_TYPE_DATA1 || plpInfo.type == SONY_DVBT2_PLP_TYPE_DATA2) { if (plpInfo.id != pDemod->plp_id) { PRINTK_INFO("%s(): plp_id=%d, plpInfo.id=%d, error PLP locked.\r\n", __FUNCTION__, pDemod->plp_id, plpInfo.id); mutex_unlock(&pDemod->demodMode_mutex_id); return ERR_FAILUE; } *FEC = cxd2837_FEC_map_to_ali_FEC(pDemod->system, plpInfo.plpCr); mutex_unlock(&pDemod->demodMode_mutex_id); return SUCCESS; } } else { result = sony_demod_dvbt_monitor_TPSInfo(pDemod, &tps);//sony_dvb_demod_monitorT_TPSInfo if (result != SONY_RESULT_OK || tps.constellation >= SONY_DVBT_CONSTELLATION_RESERVED_3 ){ mutex_unlock(&pDemod->demodMode_mutex_id); return ERR_FAILUE; } *FEC = cxd2837_FEC_map_to_ali_FEC(pDemod->system, tps.rateHP); } mutex_unlock(&pDemod->demodMode_mutex_id); return SUCCESS; }
INT32 try_to_lock_next_data_plp(struct nim_device *dev, BOOL NeedToInitSystem, BOOL NeedToConfigTuner) { INT32 result = ERR_FAILUE; sony_demod_t * param = (sony_demod_t *)dev->priv; sony_dvbt2_l1pre_t L1Pre; sony_dvbt2_plp_t plpInfo; UINT8 retry = 0; UINT8 plp_index = 0; for (plp_index = param->plp_index+1; plp_index < param->plp_num; ++plp_index ) { if (plp_index >= param->plp_num) return ERR_FAILUE; result = DVBT2_change_PLP(dev, param->all_plp_id[plp_index], FALSE, FALSE, 0); for ( retry=0; retry<30; ++retry ) { SONY_SLEEP (30); if (param->autoscan_stop_flag) return ERR_FAILUE; if (param->do_not_wait_t2_signal_locked) return ERR_FAILUE; result = sony_demod_dvbt2_monitor_L1Pre(param, &L1Pre);//sony_dvb_demod_monitorT2_L1Pre if (result != SONY_RESULT_OK) { PRINTK_INFO("%s(%d,%d)(plp_num=%d, all_plp_id[%d]=%d) error: sony_dvb_demod_monitorT2_L1Pre()=%d \r\n", __FUNCTION__,NeedToInitSystem,NeedToConfigTuner, param->plp_num, plp_index, param->all_plp_id[plp_index],result); continue; //return result; } // Get Active PLP information. result = sony_demod_dvbt2_monitor_ActivePLP(param, SONY_DVBT2_PLP_DATA, &plpInfo);//sony_dvb_demod_monitorT2_ActivePLP if (result != SONY_RESULT_OK) { PRINTK_INFO("%s(%d,%d)(plp_num=%d, all_plp_id[%d]=%d) error: sony_dvb_demod_monitorT2_ActivePLP()=%d \r\n", __FUNCTION__,NeedToInitSystem,NeedToConfigTuner, param->plp_num, plp_index, param->all_plp_id[plp_index],result); continue; //return result; } if (result == SONY_RESULT_OK) { if (plpInfo.type == SONY_DVBT2_PLP_TYPE_DATA1 || plpInfo.type == SONY_DVBT2_PLP_TYPE_DATA2) { if (plpInfo.id != param->all_plp_id[plp_index]) { PRINTK_INFO("%s(%d,%d)(plp_num=%d, all_plp_id[%d]=%d), plpInfo.id=%d, error PLP locked: retry %d times.\r\n", __FUNCTION__, NeedToInitSystem,NeedToConfigTuner, param->plp_num, plp_index, param->all_plp_id[plp_index], plpInfo.id, retry); continue; } else break; //correct PLP is locked. } } } if (result == SONY_RESULT_OK && (plpInfo.id == param->all_plp_id[plp_index]) ) { if (plpInfo.type == SONY_DVBT2_PLP_TYPE_DATA1 || plpInfo.type == SONY_DVBT2_PLP_TYPE_DATA2) { param->plp_id = plpInfo.id; param->t2_system_id = L1Pre.systemId; param->plp_index = plp_index; if (retry!=0) PRINTK_INFO("%s(%d,%d)(plp_num=%d, all_plp_id[%d]=%d), ok: retry %d times.\r\n", __FUNCTION__, NeedToInitSystem,NeedToConfigTuner, param->plp_num, plp_index, param->all_plp_id[plp_index], retry); return SONY_RESULT_OK; } else { PRINTK_INFO("%s(%d,%d)(plp_num=%d, all_plp_id[%d]=%d), ok: retry %d times. error: Not DataPLP: (type=%d, id=%d)\r\n", __FUNCTION__, NeedToInitSystem,NeedToConfigTuner, param->plp_num, plp_index, param->all_plp_id[plp_index], retry, plpInfo.type, plpInfo.id); } } else { PRINTK_INFO("%s(%d,%d)(plp_num=%d, all_plp_id[%d]=%d), error: fail to lock the PLP.\r\n", __FUNCTION__, NeedToInitSystem,NeedToConfigTuner, param->plp_num, plp_index, param->all_plp_id[plp_index], retry); } } return ERR_FAILUE; }