Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b4600d70 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

[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: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
Acked-by: default avatarPatrick Boettcher <pboettcher@kernellabs.com>
parent 6ef06e78
Loading
Loading
Loading
Loading
+21 −2
Original line number Original line Diff line number Diff line
@@ -11,6 +11,7 @@
#include <linux/slab.h>
#include <linux/slab.h>
#include <linux/i2c.h>
#include <linux/i2c.h>
#include <linux/mutex.h>
#include <linux/mutex.h>
#include <asm/div64.h>


#include "dvb_math.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_error.len = 1;
	c->post_bit_count.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->strength.stat[0].uvalue = 0;


	c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
	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 dib8000_state *state = fe->demodulator_priv;
	struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
	struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
	int i, lock;
	int i, lock;
	u64 tmp;
	u32 snr, val;
	u32 snr, val;
	u16 strength;
	u16 strength;


	/* Get Signal strength */
	/* Get Signal strength */
	dib8000_read_signal_strength(fe, &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 */
	/* Check if 1 second was elapsed */
	if (!time_after(jiffies, state->get_stats_time))
	if (!time_after(jiffies, state->get_stats_time))