diff options
author | Olivier Grenie <olivier.grenie@dibcom.fr> | 2009-09-15 05:46:52 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-09-18 23:14:10 -0400 |
commit | ef80196490d6533e74a49509112804aa88a21c6f (patch) | |
tree | 00df425d84700d534d4bd1fe89f5140abe20fdcf | |
parent | 74b76f213640b4ebde9134d94a8013dbfecfcd93 (diff) |
V4L/DVB (12887): DIB7000P: SNR calcuation forr DiB7000P
Add the SNR monitoring for the dib7000p. The result is in dB.
Signed-off-by: Olivier Grenie <olivier.grenie@dibcom.fr>
Signed-off-by: Patrick Boettcher <patrick.boettcher@dibcom.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r-- | drivers/media/dvb/frontends/dib7000p.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/drivers/media/dvb/frontends/dib7000p.c b/drivers/media/dvb/frontends/dib7000p.c index fc96fbf03d6d..55ef6eeb0769 100644 --- a/drivers/media/dvb/frontends/dib7000p.c +++ b/drivers/media/dvb/frontends/dib7000p.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
11 | #include <linux/i2c.h> | 11 | #include <linux/i2c.h> |
12 | 12 | ||
13 | #include "dvb_math.h" | ||
13 | #include "dvb_frontend.h" | 14 | #include "dvb_frontend.h" |
14 | 15 | ||
15 | #include "dib7000p.h" | 16 | #include "dib7000p.h" |
@@ -1217,7 +1218,37 @@ static int dib7000p_read_signal_strength(struct dvb_frontend *fe, u16 *strength) | |||
1217 | 1218 | ||
1218 | static int dib7000p_read_snr(struct dvb_frontend* fe, u16 *snr) | 1219 | static int dib7000p_read_snr(struct dvb_frontend* fe, u16 *snr) |
1219 | { | 1220 | { |
1220 | *snr = 0x0000; | 1221 | struct dib7000p_state *state = fe->demodulator_priv; |
1222 | u16 val; | ||
1223 | s32 signal_mant, signal_exp, noise_mant, noise_exp; | ||
1224 | u32 result = 0; | ||
1225 | |||
1226 | val = dib7000p_read_word(state, 479); | ||
1227 | noise_mant = (val >> 4) & 0xff; | ||
1228 | noise_exp = ((val & 0xf) << 2); | ||
1229 | val = dib7000p_read_word(state, 480); | ||
1230 | noise_exp += ((val >> 14) & 0x3); | ||
1231 | if ((noise_exp & 0x20) != 0) | ||
1232 | noise_exp -= 0x40; | ||
1233 | |||
1234 | signal_mant = (val >> 6) & 0xFF; | ||
1235 | signal_exp = (val & 0x3F); | ||
1236 | if ((signal_exp & 0x20) != 0) | ||
1237 | signal_exp -= 0x40; | ||
1238 | |||
1239 | if (signal_mant != 0) | ||
1240 | result = intlog10(2) * 10 * signal_exp + 10 * | ||
1241 | intlog10(signal_mant); | ||
1242 | else | ||
1243 | result = intlog10(2) * 10 * signal_exp - 100; | ||
1244 | |||
1245 | if (noise_mant != 0) | ||
1246 | result -= intlog10(2) * 10 * noise_exp + 10 * | ||
1247 | intlog10(noise_mant); | ||
1248 | else | ||
1249 | result -= intlog10(2) * 10 * noise_exp - 100; | ||
1250 | |||
1251 | *snr = result / ((1 << 24) / 10); | ||
1221 | return 0; | 1252 | return 0; |
1222 | } | 1253 | } |
1223 | 1254 | ||