summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@s-opensource.com>2016-07-01 15:41:38 -0300
committerMauro Carvalho Chehab <mchehab@s-opensource.com>2016-07-16 06:56:28 -0300
commit313a7dfb239f9433e5892d5a640f97b165b3e452 (patch)
treee87613bf0bdaaecb2654a266d331a7b3bb8140f8
parentd12b791e3db757c42484342a015f26990642fdcb (diff)
[media] cxd2841er: fix signal strength scale for ISDB-T
The scale for ISDB-T was wrong too: it was inverted, and on a relative scale. Use a linear interpolation to make it look better. The formula was empirically determined, using 3 frequencies (175 MHz, 410 MHz and 800 MHz), measuring from -50dBm to -12dBm in steps of 0.5dB. Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
-rw-r--r--drivers/media/dvb-frontends/cxd2841er.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/media/dvb-frontends/cxd2841er.c b/drivers/media/dvb-frontends/cxd2841er.c
index 95d82c4445e2..2476d356069c 100644
--- a/drivers/media/dvb-frontends/cxd2841er.c
+++ b/drivers/media/dvb-frontends/cxd2841er.c
@@ -1746,7 +1746,7 @@ static void cxd2841er_read_signal_strength(struct dvb_frontend *fe)
{
struct dtv_frontend_properties *p = &fe->dtv_property_cache;
struct cxd2841er_priv *priv = fe->demodulator_priv;
- u32 strength;
+ s32 strength;
dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
switch (p->delivery_system) {
@@ -1763,7 +1763,7 @@ static void cxd2841er_read_signal_strength(struct dvb_frontend *fe)
p->delivery_system);
p->strength.stat[0].scale = FE_SCALE_DECIBEL;
/* Formula was empirically determinated @ 410 MHz */
- p->strength.stat[0].uvalue = ((s32)strength) * 366 / 100 - 89520;
+ p->strength.stat[0].uvalue = strength * 366 / 100 - 89520;
break; /* Code moved out of the function */
case SYS_DVBC_ANNEX_A:
strength = cxd2841er_read_agc_gain_t_t2(priv,
@@ -1774,13 +1774,16 @@ static void cxd2841er_read_signal_strength(struct dvb_frontend *fe)
* using frequencies: 175 MHz, 410 MHz and 800 MHz, and a
* stream modulated with QAM64
*/
- p->strength.stat[0].uvalue = ((s32)strength) * 4045 / 1000 - 85224;
+ p->strength.stat[0].uvalue = strength * 4045 / 1000 - 85224;
break;
case SYS_ISDBT:
- strength = 65535 - cxd2841er_read_agc_gain_i(
- priv, p->delivery_system);
- p->strength.stat[0].scale = FE_SCALE_RELATIVE;
- p->strength.stat[0].uvalue = strength;
+ strength = cxd2841er_read_agc_gain_i(priv, p->delivery_system);
+ p->strength.stat[0].scale = FE_SCALE_DECIBEL;
+ /*
+ * Formula was empirically determinated via linear regression,
+ * using frequencies: 175 MHz, 410 MHz and 800 MHz.
+ */
+ p->strength.stat[0].uvalue = strength * 3775 / 1000 - 90185;
break;
case SYS_DVBS:
case SYS_DVBS2: