Module Name: src Committed By: jmcneill Date: Fri Jul 15 20:28:38 UTC 2011
Modified Files: src/sys/dev/i2c: lg3303.c lg3303var.h Log Message: add lg3303_get_snr, lg3303_get_signal_strength, lg3303_get_ucblocks To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/dev/i2c/lg3303.c cvs rdiff -u -r1.2 -r1.3 src/sys/dev/i2c/lg3303var.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/i2c/lg3303.c diff -u src/sys/dev/i2c/lg3303.c:1.4 src/sys/dev/i2c/lg3303.c:1.5 --- src/sys/dev/i2c/lg3303.c:1.4 Fri Jul 15 10:10:35 2011 +++ src/sys/dev/i2c/lg3303.c Fri Jul 15 20:28:38 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: lg3303.c,v 1.4 2011/07/15 10:10:35 jmcneill Exp $ */ +/* $NetBSD: lg3303.c,v 1.5 2011/07/15 20:28:38 jmcneill Exp $ */ /*- * Copyright 2007 Jason Harmening @@ -28,11 +28,12 @@ */ #include <sys/param.h> -__KERNEL_RCSID(0, "$NetBSD: lg3303.c,v 1.4 2011/07/15 10:10:35 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lg3303.c,v 1.5 2011/07/15 20:28:38 jmcneill Exp $"); #include <sys/types.h> #include <sys/kmem.h> #include <sys/module.h> +#include <sys/bitops.h> #include <dev/i2c/i2cvar.h> #include <dev/i2c/lg3303var.h> @@ -288,65 +289,66 @@ return festatus; } -#if notyet -int lg3303::get_signal(dvb_signal &signal) +uint16_t +lg3303_get_snr(struct lg3303 *lg) { - int error = check_for_lock(signal.locked); - uint32_t noise, snr_const; - uint8_t buffer[5]; - uint8_t reg; - if (error || !signal.locked) - { - return error; - } - signal.ber = 0; - switch(m_modulation) - { - case DVB_MOD_VSB_8: - reg = REG_EQPH_ERR0; - if ((error = m_device.transact(®, sizeof(reg), buffer, sizeof(buffer)))) - { - LIBTUNERERR << "LG3303: Unable to retrieve 8-VSB noise value" << endl; - return error; - } - noise = ((buffer[0] & 7) << 16) | (buffer[3] << 8) | buffer[4]; - snr_const = 25600; - break; - case DVB_MOD_QAM_64: - case DVB_MOD_QAM_256: - reg = REG_CARRIER_MSEQAM1; - if ((error = m_device.transact(®, sizeof(reg), buffer, 2))) - { - LIBTUNERERR << "LG3303: Unable to retrieve QAM noise value" << endl; - return error; - } - noise = (buffer[0] << 8) | buffer[1]; - if (m_modulation == DVB_MOD_QAM_64) - { - snr_const = 688128; - } - else - { - snr_const = 696320; - } - break; - default: - LIBTUNERERR << "LG3303: Unsupported modulation type" << endl; - return EINVAL; - } - signal.snr = 10.0 * log10((double)snr_const / noise); - signal.strength = (signal.snr / 35) * 100; - reg = REG_PACKET_ERR_COUNTER1; - if ((error = m_device.transact(®, sizeof(reg), buffer, 2))) - { - LIBTUNERERR << "LG3303: Unable to retrieve packet error count" << endl; - return error; - } - signal.uncorrected_blocks = (buffer[0] << 8) | buffer[1]; - return 0; + int64_t noise, snr_const; + uint8_t buffer[5]; + int64_t snr; + int error; + + switch (lg->current_modulation) { + case VSB_8: + error = lg3303_read(lg, REG_EQPH_ERR0, buffer, sizeof(buffer)); + if (error) + return 0; + noise = ((buffer[0] & 7) << 16) | (buffer[3] << 8) | buffer[4]; + snr_const = 73957994; /* log10(2560) * pow(2,24) */ + break; + case QAM_64: + case QAM_256: + error = lg3303_read(lg, REG_CARRIER_MSEQAM1, buffer, 2); + if (error) + return 0; + noise = (buffer[0] << 8) | buffer[1]; + if (lg->current_modulation == QAM_64) + snr_const = 97939837; /* log10(688128) * pow(2,24) */ + else + snr_const = 98026066; /* log10(696320) * pow(2,24) */ + break; + default: + device_printf(lg->parent, + "lg3303: unsupported modulation type (%d)\n", + lg->current_modulation); + return 0; + } + + if (noise == 0) + return 0; + snr = dtv_intlog10(noise); + if (snr > snr_const) + return 0; + return (10 * (snr_const - snr)) >> 16; +} + +uint16_t +lg3303_get_signal_strength(struct lg3303 *lg) +{ + return ((uint32_t)lg3303_get_snr(lg) << 16) / 8960; } -#endif +uint32_t +lg3303_get_ucblocks(struct lg3303 *lg) +{ + uint8_t buffer[2]; + int error; + + error = lg3303_read(lg, REG_PACKET_ERR_COUNTER1, buffer, sizeof(buffer)); + if (error) + return 0; + + return (buffer[0] << 8) | buffer[1]; +} MODULE(MODULE_CLASS_DRIVER, lg3303, NULL); Index: src/sys/dev/i2c/lg3303var.h diff -u src/sys/dev/i2c/lg3303var.h:1.2 src/sys/dev/i2c/lg3303var.h:1.3 --- src/sys/dev/i2c/lg3303var.h:1.2 Thu Jul 14 23:46:52 2011 +++ src/sys/dev/i2c/lg3303var.h Fri Jul 15 20:28:38 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: lg3303var.h,v 1.2 2011/07/14 23:46:52 jmcneill Exp $ */ +/* $NetBSD: lg3303var.h,v 1.3 2011/07/15 20:28:38 jmcneill Exp $ */ /*- * Copyright (c) 2011 Jared D. McNeill <jmcne...@invisible.ca> @@ -48,5 +48,8 @@ void lg3303_close(struct lg3303 *); int lg3303_set_modulation(struct lg3303 *, fe_modulation_t); fe_status_t lg3303_get_dtv_status(struct lg3303 *); +uint16_t lg3303_get_snr(struct lg3303 *); +uint16_t lg3303_get_signal_strength(struct lg3303 *); +uint32_t lg3303_get_ucblocks(struct lg3303 *); #endif /* !_LG3303VAR_H */