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.

93 lines
2.6 KiB

From 0d3b277d19137c4a0fdadfd1381f1c66515d1b0c Mon Sep 17 00:00:00 2001
From: Athanasios Oikonomou <athoik@gmail.com>
Date: Mon, 8 Feb 2016 22:14:31 +0200
Subject: [PATCH] STV: Add SNR/Signal report parameters
diff --git a/drivers/media/dvb-frontends/stv090x.c b/drivers/media/dvb-frontends/stv090x.c
index 264c4b8..12fd3d0 100644
--- a/drivers/media/dvb-frontends/stv090x.c
+++ b/drivers/media/dvb-frontends/stv090x.c
@@ -41,6 +41,18 @@
static unsigned int verbose;
module_param(verbose, int, 0644);
+/* define how SNR measurement is reported */
+static int esno;
+module_param(esno, int, 0644);
+MODULE_PARM_DESC(esno, "SNR is reported in 0:Percentage, "\
+ "1:(EsNo dB)*10 (default:0)");
+
+/* define how signal measurement is reported */
+static int dbm;
+module_param(dbm, int, 0644);
+MODULE_PARM_DESC(dbm, "Signal is reported in 0:Percentage, "\
+ "1:-1*dBm (default:0)");
+
/* internal params node */
struct stv090x_dev {
/* pointer for internal params, one for each pair of demods */
@@ -3687,7 +3699,10 @@ static int stv090x_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
str = 0;
else if (agc < stv090x_rf_tab[ARRAY_SIZE(stv090x_rf_tab) - 1].read)
str = -100;
- *strength = (str + 100) * 0xFFFF / 100;
+ if (dbm)
+ *strength = -str;
+ else
+ *strength = (str + 100) * 0xFFFF / 100;
return 0;
}
@@ -3698,8 +3713,7 @@ static int stv090x_read_cnr(struct dvb_frontend *fe, u16 *cnr)
u32 reg_0, reg_1, reg, i;
s32 val_0, val_1, val = 0;
u8 lock_f;
- s32 div;
- u32 last;
+ s32 snr;
switch (state->delsys) {
case STV090x_DVBS2:
@@ -3716,10 +3730,14 @@ static int stv090x_read_cnr(struct dvb_frontend *fe, u16 *cnr)
msleep(1);
}
val /= 16;
- last = ARRAY_SIZE(stv090x_s2cn_tab) - 1;
- div = stv090x_s2cn_tab[0].read -
- stv090x_s2cn_tab[last].read;
- *cnr = 0xFFFF - ((val * 0xFFFF) / div);
+ snr = stv090x_table_lookup(stv090x_s2cn_tab,
+ ARRAY_SIZE(stv090x_s2cn_tab) - 1, val);
+ if (snr < 0) snr = 0;
+ if (snr > 200) snr = 200;
+ if (esno)
+ *cnr = snr;
+ else
+ *cnr = snr * 0xFFFF / 200;
}
break;
@@ -3738,10 +3756,14 @@ static int stv090x_read_cnr(struct dvb_frontend *fe, u16 *cnr)
msleep(1);
}
val /= 16;
- last = ARRAY_SIZE(stv090x_s1cn_tab) - 1;
- div = stv090x_s1cn_tab[0].read -
- stv090x_s1cn_tab[last].read;
- *cnr = 0xFFFF - ((val * 0xFFFF) / div);
+ snr = stv090x_table_lookup(stv090x_s1cn_tab,
+ ARRAY_SIZE(stv090x_s1cn_tab) - 1, val);
+ if (snr < 0) snr = 0;
+ if (snr > 200) snr = 200;
+ if (esno)
+ *cnr = snr;
+ else
+ *cnr = snr * 0xFFFF / 200;
}
break;
default:
--
2.1.4