mirror of
https://github.com/hardkernel/kernel_common_drivers.git
synced 2026-06-25 12:03:48 +09:00
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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user