From 0df5d02476d56656be8fca457b56e7ced7e6da79 Mon Sep 17 00:00:00 2001 From: "caiyi.xu" Date: Thu, 3 Jul 2025 05:21:13 +0000 Subject: [PATCH] dtv_demod: calibrate dvbt/t2 strength (r842) (v3.7.5.1) [1/1] PD#TV-168004 Problem: dvbt/t2 strength is inaccurate Solution: calibrate dvbt/t2 strength Verify: BR30A4 Change-Id: I8ff0455037fa0f3eba474ececc7b3508a8215f88 Signed-off-by: caiyi.xu --- drivers/media/dtv_demod/amlfrontend.c | 10 ++++-- drivers/media/dtv_demod/dvbt/dvbt_frontend.c | 35 ++++++++++++++++--- drivers/media/dtv_demod/dvbt/dvbt_frontend.h | 1 + drivers/media/dtv_demod/include/amlfrontend.h | 5 +-- 4 files changed, 43 insertions(+), 8 deletions(-) diff --git a/drivers/media/dtv_demod/amlfrontend.c b/drivers/media/dtv_demod/amlfrontend.c index c17e3712a..b721b5fbf 100644 --- a/drivers/media/dtv_demod/amlfrontend.c +++ b/drivers/media/dtv_demod/amlfrontend.c @@ -2427,9 +2427,12 @@ static int aml_dtvdm_read_signal_strength(struct dvb_frontend *fe, #endif #ifdef AML_DEMOD_SUPPORT_DVBT case SYS_DVBT: - case SYS_DVBT2: ret = gxtv_demod_dvbt_read_signal_strength(fe, (s16 *)strength); break; + + case SYS_DVBT2: + ret = gxtv_demod_dvbt2_read_signal_strength(fe, (s16 *)strength); + break; #endif #ifdef AML_DEMOD_SUPPORT_ISDBT case SYS_ISDBT: @@ -3035,9 +3038,12 @@ static int aml_dtvdm_get_property(struct dvb_frontend *fe, #endif #ifdef AML_DEMOD_SUPPORT_DVBT case SYS_DVBT: - case SYS_DVBT2: gxtv_demod_dvbt_read_signal_strength(fe, &strength); break; + + case SYS_DVBT2: + gxtv_demod_dvbt2_read_signal_strength(fe, &strength); + break; #endif #ifdef AML_DEMOD_SUPPORT_ISDBT case SYS_ISDBT: diff --git a/drivers/media/dtv_demod/dvbt/dvbt_frontend.c b/drivers/media/dtv_demod/dvbt/dvbt_frontend.c index 2d5302ab1..ca477f463 100644 --- a/drivers/media/dtv_demod/dvbt/dvbt_frontend.c +++ b/drivers/media/dtv_demod/dvbt/dvbt_frontend.c @@ -495,7 +495,7 @@ static int dvbt2_read_status(struct dvb_frontend *fe, enum fe_status *status, in if (devp->tuner_strength_limit) strength_limit = devp->tuner_strength_limit; - gxtv_demod_dvbt_read_signal_strength(fe, &strength); + gxtv_demod_dvbt2_read_signal_strength(fe, &strength); if (!tuner_find_by_name(fe, "mxl661") || demod->last_status != 0x1F) { if (strength < strength_limit) { if (!(no_signal_cnt++ % 20)) @@ -764,10 +764,37 @@ int gxtv_demod_dvbt_read_signal_strength(struct dvb_frontend *fe, *strength = (s16)tuner_get_ch_power(fe); if (tuner_find_by_name(fe, "r842") || tuner_find_by_name(fe, "r836") || - tuner_find_by_name(fe, "r850")) - *strength += 7; - else if (tuner_find_by_name(fe, "mxl661")) + tuner_find_by_name(fe, "r850")) { + *strength -= 3; + if (fe->dtv_property_cache.frequency == 474000000) + *strength -= 1; + else if (fe->dtv_property_cache.frequency == 690000000) + *strength -= 3; + } else if (tuner_find_by_name(fe, "mxl661")) { *strength += 3; + } + + PR_DVBT("[id %d] strength %d dBm\n", demod->id, *strength); + + return 0; +} + +int gxtv_demod_dvbt2_read_signal_strength(struct dvb_frontend *fe, s16 *strength) +{ + struct aml_dtvdemod *demod = (struct aml_dtvdemod *)fe->demodulator_priv; + + *strength = (s16)tuner_get_ch_power(fe); + if (tuner_find_by_name(fe, "r842") || + tuner_find_by_name(fe, "r836") || + tuner_find_by_name(fe, "r850")) { + *strength += 6; + if (fe->dtv_property_cache.frequency == 474000000) + *strength += 2; + else if (fe->dtv_property_cache.frequency == 578000000) + *strength += 3; + } else if (tuner_find_by_name(fe, "mxl661")) { + *strength += 3; + } PR_DVBT("[id %d] strength %d dBm\n", demod->id, *strength); diff --git a/drivers/media/dtv_demod/dvbt/dvbt_frontend.h b/drivers/media/dtv_demod/dvbt/dvbt_frontend.h index 076102dfa..b925fd315 100644 --- a/drivers/media/dtv_demod/dvbt/dvbt_frontend.h +++ b/drivers/media/dtv_demod/dvbt/dvbt_frontend.h @@ -10,6 +10,7 @@ int dvbt_read_ber(struct dvb_frontend *fe, u32 *ber); int dvbt_read_snr(struct dvb_frontend *fe, u16 *snr); int dvbt2_read_snr(struct dvb_frontend *fe, u16 *snr); int gxtv_demod_dvbt_read_signal_strength(struct dvb_frontend *fe, s16 *strength); +int gxtv_demod_dvbt2_read_signal_strength(struct dvb_frontend *fe, s16 *strength); int dvbt_set_frontend(struct dvb_frontend *fe); int dvbt2_set_frontend(struct dvb_frontend *fe); int dvbt_tune(struct dvb_frontend *fe, bool re_tune, diff --git a/drivers/media/dtv_demod/include/amlfrontend.h b/drivers/media/dtv_demod/include/amlfrontend.h index 2e100fe35..837b9df37 100644 --- a/drivers/media/dtv_demod/include/amlfrontend.h +++ b/drivers/media/dtv_demod/include/amlfrontend.h @@ -205,6 +205,7 @@ /* V3.7.003 fix dvbc_auto_qam_process stack allocation */ /* V3.7.004 fix isdbt frontend(t6d) and ambus(t5m) */ /* V3.7.005 improve dvbs bindscan(2) and adapter tuner (rt710/rda5815m) */ +/* V3.7.005.1 calibrate dvbt/t2 strength (r842) */ /****************************************************/ /****************************************************************/ /* AMLDTVDEMOD_VER Description: */ @@ -221,8 +222,8 @@ /*->The last four digits indicate the release time */ /****************************************************************/ #define KERNEL_4_9_EN 1 -#define AMLDTVDEMOD_VER "V3.7.005" -#define DTVDEMOD_VER "2025/06/04 improve dvbs bindscan(2) and adapter tuner (rt710/rda5815m)" +#define AMLDTVDEMOD_VER "V3.7.5.1" +#define DTVDEMOD_VER "2025/07/03 calibrate dvbt/t2 strength (r842)" #define AMLDTVDEMOD_T2_FW_VER "v1059.20250521" #define DEMOD_DEVICE_NAME "dtvdemod"