diff options
author | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2013-12-16 20:00:34 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2013-12-19 08:17:45 -0200 |
commit | b4600d70c0927a9f61b26093c0f01db69f607a6f (patch) | |
tree | a0443f2b68a8b33d99170747ab02828e1882be0a /drivers/media/dvb-frontends/dib8000.c | |
parent | 6ef06e78c74cc4b2f45ea2e9adbe6d52cd246a6b (diff) |
[media] dib8000: estimate strength in dBm
Better to have Signal strength in dB.
This takes a very rough estimation for the signal strength,
that was calibrated using a Dektec DTA-2111 Gold RF generator
and a Pixelview dib8076 stick.
It estimates the signal strength using a linear equation where:
- the max is -22.5 dBm, with returns 55953
- the min is -35.0 dBm, with returns 50110
With -22dBm, the signal strengh is returned as 65535.
Unfortunately, the min strength generated with DTA-2111 is
-35dBm.
It should be noticed that approximating it by a linear equation
is not right. I should probably be splitting it into 0.5 dB
linear segments, in order to get a higher precision, just like
it is done on mb86a20s, but that would force me to add some
attenuators, in order to get dB levels below -35dBm, which is,
btw, strong enough to get signal lock.
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Acked-by: Patrick Boettcher <pboettcher@kernellabs.com>
Diffstat (limited to 'drivers/media/dvb-frontends/dib8000.c')
-rw-r--r-- | drivers/media/dvb-frontends/dib8000.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/media/dvb-frontends/dib8000.c b/drivers/media/dvb-frontends/dib8000.c index 2dbf89365a97..faf469d1d437 100644 --- a/drivers/media/dvb-frontends/dib8000.c +++ b/drivers/media/dvb-frontends/dib8000.c @@ -11,6 +11,7 @@ #include <linux/slab.h> #include <linux/i2c.h> #include <linux/mutex.h> +#include <asm/div64.h> #include "dvb_math.h" @@ -1002,7 +1003,7 @@ static void dib8000_reset_stats(struct dvb_frontend *fe) c->post_bit_error.len = 1; c->post_bit_count.len = 1; - c->strength.stat[0].scale = FE_SCALE_RELATIVE; + c->strength.stat[0].scale = FE_SCALE_DECIBEL; c->strength.stat[0].uvalue = 0; c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; @@ -3847,12 +3848,30 @@ static int dib8000_get_stats(struct dvb_frontend *fe, fe_status_t stat) struct dib8000_state *state = fe->demodulator_priv; struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache; int i, lock; + u64 tmp; u32 snr, val; u16 strength; /* Get Signal strength */ dib8000_read_signal_strength(fe, &strength); - c->strength.stat[0].uvalue = strength; + + /* + * Estimate it in dBm + * This calculus was empirically determinated by measuring the signal + * strength generated by a DTA-2111 RF generator directly connected into + * a dib8076 device. The real value can actually be different on other + * devices, depending if LNA is enabled or not, if diversity is enabled, + * etc. + */ + if (strength == 65535) { + c->strength.stat[0].svalue = -22000; + } else { + tmp = strength * 25000L; + do_div(tmp, 11646); + c->strength.stat[0].svalue = tmp - 142569; + if (c->strength.stat[0].svalue > -22000) + c->strength.stat[0].svalue = -22000; + } /* Check if 1 second was elapsed */ if (!time_after(jiffies, state->get_stats_time)) |