[media] cxd2841er: fix signal strength scale for ISDB-T
authorMauro Carvalho Chehab <mchehab@s-opensource.com>
Fri, 1 Jul 2016 18:41:38 +0000 (15:41 -0300)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Sat, 16 Jul 2016 09:56:28 +0000 (06:56 -0300)
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>
drivers/media/dvb-frontends/cxd2841er.c

index 95d82c4445e2029a316c3d23f954da628888fa4e..2476d356069c7c480fe915276b67558d9167ef90 100644 (file)
@@ -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: