mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-26 14:14:01 +08:00
[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>
This commit is contained in:
parent
6ef06e78c7
commit
b4600d70c0
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user