summaryrefslogtreecommitdiff
path: root/linux/drivers/media/dvb
diff options
context:
space:
mode:
authorPatrick Boettcher <pboettcher@kernellabs.com>2009-09-15 11:46:52 +0200
committerPatrick Boettcher <pboettcher@kernellabs.com>2009-09-15 11:46:52 +0200
commit275f551d8e0c03884cd207fec2b627abf62da326 (patch)
treec0abb31462db087be0c361dd50ee163368d9bc31 /linux/drivers/media/dvb
parent0c4a5353777fc980ecca21e8e0dfb2559e94b651 (diff)
downloadmediapointer-dvb-s2-275f551d8e0c03884cd207fec2b627abf62da326.tar.gz
mediapointer-dvb-s2-275f551d8e0c03884cd207fec2b627abf62da326.tar.bz2
DIB7000P: SNR calcuation forr DiB7000P
From: Olivier Grenie <olivier.grenie@dibcom.fr> Add the SNR monitoring for the dib7000p. The result is in dB. Priority: normal Signed-off-by: Olivier Grenie <olivier.grenie@dibcom.fr> Signed-off-by: Patrick Boettcher <patrick.boettcher@dibcom.fr>
Diffstat (limited to 'linux/drivers/media/dvb')
-rw-r--r--linux/drivers/media/dvb/frontends/dib7000p.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/linux/drivers/media/dvb/frontends/dib7000p.c b/linux/drivers/media/dvb/frontends/dib7000p.c
index d56de75db..57bee771c 100644
--- a/linux/drivers/media/dvb/frontends/dib7000p.c
+++ b/linux/drivers/media/dvb/frontends/dib7000p.c
@@ -11,6 +11,7 @@
#include <linux/i2c.h>
#include "compat.h"
+#include "dvb_math.h"
#include "dvb_frontend.h"
#include "dib7000p.h"
@@ -1243,7 +1244,37 @@ static int dib7000p_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
static int dib7000p_read_snr(struct dvb_frontend* fe, u16 *snr)
{
- *snr = 0x0000;
+ struct dib7000p_state *state = fe->demodulator_priv;
+ u16 val;
+ s32 signal_mant, signal_exp, noise_mant, noise_exp;
+ u32 result = 0;
+
+ val = dib7000p_read_word(state, 479);
+ noise_mant = (val >> 4) & 0xff;
+ noise_exp = ((val & 0xf) << 2);
+ val = dib7000p_read_word(state, 480);
+ noise_exp += ((val >> 14) & 0x3);
+ if ((noise_exp & 0x20) != 0)
+ noise_exp -= 0x40;
+
+ signal_mant = (val >> 6) & 0xFF;
+ signal_exp = (val & 0x3F);
+ if ((signal_exp & 0x20) != 0)
+ signal_exp -= 0x40;
+
+ if (signal_mant != 0)
+ result = intlog10(2) * 10 * signal_exp + 10 *
+ intlog10(signal_mant);
+ else
+ result = intlog10(2) * 10 * signal_exp - 100;
+
+ if (noise_mant != 0)
+ result -= intlog10(2) * 10 * noise_exp + 10 *
+ intlog10(noise_mant);
+ else
+ result -= intlog10(2) * 10 * noise_exp - 100;
+
+ *snr = result / ((1 << 24) / 10);
return 0;
}