You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
2.0 KiB

BER/MER is converted in dB and scaled to the full range 0-65536 for output;
added a module parameter to select SNR/MER output in dBx10;
From: Gianluca Gennari <gennarone@gmail.com>
---
drivers/staging/media/as102/as102_drv.c | 4 ++++
drivers/staging/media/as102/as102_fe.c | 16 ++++++++++++++++
2 files changed, 20 insertions(+)
diff --git a/drivers/staging/media/as102/as102_drv.c b/drivers/staging/media/as102/as102_drv.c
index ac92eaf..a87107f 100644
--- a/drivers/staging/media/as102/as102_drv.c
+++ b/drivers/staging/media/as102/as102_drv.c
@@ -56,6 +56,10 @@ int elna_enable = 1;
module_param_named(elna_enable, elna_enable, int, 0644);
MODULE_PARM_DESC(elna_enable, "Activate eLNA (default: on)");
+int snr_db;
+module_param_named(snr_db, snr_db, int, 0644);
+MODULE_PARM_DESC(snr_db, "Output SNR/MER in dBx10 (default: no)");
+
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
static void as102_stop_stream(struct as102_dev_t *dev)
diff --git a/drivers/staging/media/as102/as102_fe.c b/drivers/staging/media/as102/as102_fe.c
index d188818..a4c5d89 100644
--- a/drivers/staging/media/as102/as102_fe.c
+++ b/drivers/staging/media/as102/as102_fe.c
@@ -20,6 +20,9 @@
#include "as102_drv.h"
#include "as10x_types.h"
#include "as10x_cmd.h"
+#include "dvb_math.h"
+
+extern int snr_db;
static void as10x_fe_copy_tps_parameters(struct dtv_frontend_properties *dst,
struct as10x_tps *src);
@@ -182,6 +185,7 @@ out:
static int as102_fe_read_snr(struct dvb_frontend *fe, u16 *snr)
{
struct as102_dev_t *dev;
+ u32 mer_db;
ENTER();
@@ -191,6 +195,18 @@ static int as102_fe_read_snr(struct dvb_frontend *fe, u16 *snr)
*snr = dev->demod_stats.mer;
+ /* convert in dBx10 */
+ if (*snr > 0) {
+ mer_db = 10 * intlog10(*snr);
+ *snr = mer_db / ((1 << 24) / 10);
+ }
+
+ dprintk(debug, "MER=%d dBx10\n", *snr);
+
+ /* scale the MER value to the full range 0-65536, capping MER at 29 dB */
+ if (!snr_db)
+ *snr = (*snr >= 290) ? 0xffff : (0xffff / 290) * *snr;
+
LEAVE();
return 0;
}
--
1.7.9.5