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 <caiyi.xu@amlogic.com>
This commit is contained in:
caiyi.xu
2023-10-25 08:57:19 +00:00
committed by Luan Yuan
parent 042faaa89a
commit ec77fa0ee9
2 changed files with 36 additions and 16 deletions
+32 -13
View File
@@ -40,6 +40,11 @@
#include "dvbt_func.h"
#include <linux/amlogic/aml_dtvdemod.h>
//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;
}
@@ -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)