diff options
Diffstat (limited to 'v4l/lgdt3302.c')
-rw-r--r-- | v4l/lgdt3302.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/v4l/lgdt3302.c b/v4l/lgdt3302.c index 34d39efa6..5771d34ea 100644 --- a/v4l/lgdt3302.c +++ b/v4l/lgdt3302.c @@ -1,5 +1,5 @@ /* - * $Id: lgdt3302.c,v 1.4 2005/06/20 04:54:30 mkrufky Exp $ + * $Id: lgdt3302.c,v 1.5 2005/06/20 18:17:20 mkrufky Exp $ * * Support for LGDT3302 (DViCO FustionHDTV 3 Gold) - VSB/QAM * @@ -425,6 +425,7 @@ static int lgdt3302_read_signal_strength(struct dvb_frontend* fe, u16* strength) static int lgdt3302_read_snr(struct dvb_frontend* fe, u16* snr) { +#ifdef SNR_IN_DB /* * Spec sheet shows formula for SNR_EQ = 10 log10(25 * 24**2 / noise) * and SNR_PH = 10 log10(25 * 32**2 / noise) for equalizer and phase tracker @@ -511,6 +512,27 @@ static int lgdt3302_read_snr(struct dvb_frontend* fe, u16* snr) } } } +#else + /* Return the raw noise value */ + static u8 buf[5];/* read data buffer */ + static u32 noise; /* noise value */ + struct lgdt3302_state* state = (struct lgdt3302_state*) fe->demodulator_priv; + + /* read both equalizer and pase tracker noise data */ + i2c_selectreadbytes(state, EQPH_ERR0, buf, sizeof(buf)); + + if (state->current_modulation == VSB_8) { + /* Equalizer Mean-Square Error Register for VSB */ + noise = ((buf[0] & 7) << 16) | (buf[1] << 8) | buf[2]; + } else { + /* Phase Tracker Mean-Square Error Register for QAM */ + noise = ((buf[0] & 7<<3) << 13) | (buf[3] << 8) | buf[4]; + } + + /* Small values for noise mean signal is better so invert noise */ + /* Noise is 19 bit value so discard 3 LSB*/ + *snr = ~noise>>3; +#endif dprintk("%s: noise = 0x%05x, snr = %idb\n",__FUNCTION__, noise, *snr); |