diff options
author | Patrick Boettcher <pboettcher@kernellabs.com> | 2009-09-15 11:46:52 +0200 |
---|---|---|
committer | Patrick Boettcher <pboettcher@kernellabs.com> | 2009-09-15 11:46:52 +0200 |
commit | 275f551d8e0c03884cd207fec2b627abf62da326 (patch) | |
tree | c0abb31462db087be0c361dd50ee163368d9bc31 /linux/drivers/media/dvb | |
parent | 0c4a5353777fc980ecca21e8e0dfb2559e94b651 (diff) | |
download | mediapointer-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.c | 33 |
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; } |