From ec77fa0ee91e422bb6bfc411c7b17bd35e7a2adf Mon Sep 17 00:00:00 2001 From: "caiyi.xu" Date: Wed, 25 Oct 2023 08:57:19 +0000 Subject: [PATCH] dtv_demod: fix dvbt lock failed in weak signal (v3.5.19) [1/1] PD#SWPL-143553 Problem: insufficient locking time during demod reset Solution: increase the reset cycle Verify: AT301 Change-Id: I1e56a7e7d362c94ea2fa6360e2d01dc6a92ef251 Signed-off-by: caiyi.xu --- drivers/media/dtv_demod/dvbt/dvbt_frontend.c | 45 +++++++++++++------ drivers/media/dtv_demod/include/amlfrontend.h | 7 +-- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/drivers/media/dtv_demod/dvbt/dvbt_frontend.c b/drivers/media/dtv_demod/dvbt/dvbt_frontend.c index 75bd07190..b47bd46a3 100644 --- a/drivers/media/dtv_demod/dvbt/dvbt_frontend.c +++ b/drivers/media/dtv_demod/dvbt/dvbt_frontend.c @@ -40,6 +40,11 @@ #include "dvbt_func.h" #include +//dvb-t +MODULE_PARM_DESC(dvbt_reset_per_times, "\n\t\t dvbt reset cycle cnt"); +static unsigned int dvbt_reset_per_times = 40; +module_param(dvbt_reset_per_times, int, 0644); + int dvbt_read_status(struct dvb_frontend *fe, enum fe_status *status) { int ilock = 0; @@ -601,8 +606,10 @@ int dvbt_tune(struct dvb_frontend *fe, bool re_tune, { struct aml_dtvdemod *demod = (struct aml_dtvdemod *)fe->demodulator_priv; unsigned int fsm = 0; + unsigned int reset_per_times = dvbt_reset_per_times; + static int tps_lock_times; - *delay = HZ / 5; + *delay = HZ / 20; if (re_tune) { PR_INFO("%s [id %d]: re_tune.\n", __func__, demod->id); @@ -611,7 +618,8 @@ int dvbt_tune(struct dvb_frontend *fe, bool re_tune, dvbt_set_frontend(fe); timer_begain(demod, D_TIMER_DETECT); dvbt_read_status(fe, status); - demod->t_cnt = 1; + demod->t_cnt = 0; + tps_lock_times = 0; return 0; } @@ -637,22 +645,33 @@ int dvbt_tune(struct dvb_frontend *fe, bool re_tune, (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC)) { dvbt_t2_wr_byte_bits(0x2906, 2, 3, 4); dvbt_t2_wrb(0x2815, 0x02); + demod->t_cnt = 0; + tps_lock_times = 0; } else { dvbt_t2_wr_byte_bits(0x2906, 0, 3, 4); dvbt_t2_wrb(0x2815, 0x03); + + if (reset_per_times) { + fsm = dvbt_t2_rdb(DVBT_STATUS); + if ((fsm & 0xf) == 9 && (fsm >> 6 & 1)) { + tps_lock_times++; + } else { + tps_lock_times = 0; + demod->t_cnt++; + } + + if (tps_lock_times > reset_per_times || + (tps_lock_times == 0 && demod->t_cnt > reset_per_times)) { + dvbt_rst_demod(demod, fe); + PR_INFO("[id %d] rst, tps(%d) or ts unlock(%d)\n", + demod->id, tps_lock_times, demod->t_cnt); + demod->t_cnt = 0; + tps_lock_times = 0; + } + } + } - fsm = dvbt_t2_rdb(DVBT_STATUS); - - if (((demod->t_cnt % 5) == 2 && (fsm & 0xf) < 9) || - (demod->t_cnt >= 5 && (fsm & 0xf) == 9 && (fsm >> 6 & 1) && (*status != 0x1f))) { - dvbt_rst_demod(demod, fe); - demod->t_cnt = 0; - PR_INFO("[id %d] rst, tps or ts unlock\n", demod->id); - } - - demod->t_cnt++; - return 0; } diff --git a/drivers/media/dtv_demod/include/amlfrontend.h b/drivers/media/dtv_demod/include/amlfrontend.h index 852cf8071..724a1ffcb 100644 --- a/drivers/media/dtv_demod/include/amlfrontend.h +++ b/drivers/media/dtv_demod/include/amlfrontend.h @@ -143,6 +143,7 @@ /* V3.5.016 optimize dvbs rssi for rt720 */ /* V3.5.017 increase the speed of dvbc blind scanning */ /* V3.5.018 optimize dvbs blind scan progress */ +/* V3.5.019 fix dvbt lock failed in weak signal */ /****************************************************/ /****************************************************************/ /* AMLDTVDEMOD_VER Description: */ @@ -159,9 +160,9 @@ /*->The last four digits indicate the release time */ /****************************************************************/ #define KERNEL_4_9_EN 1 -#define AMLDTVDEMOD_VER "V3.5.18" -#define DTVDEMOD_VER "2023/11/1: optimize dvbs blind scan progress" -#define AMLDTVDEMOD_T2_FW_VER "V1558.20230628" +#define AMLDTVDEMOD_VER "V3.5.19" +#define DTVDEMOD_VER "2023/11/09: fix dvbt lock failed in weak signal" +#define AMLDTVDEMOD_T2_FW_VER "20231019_141000" #define DEMOD_DEVICE_NAME "dtvdemod" #define THRD_TUNER_STRENGTH_ATSC (-87)