From 5c75e501d34b4cfe7d345105b1b48d7c526f0e97 Mon Sep 17 00:00:00 2001 From: Athanasios Oikonomou 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 416b749..9639500 100644 --- a/drivers/media/dvb-frontends/stv090x.c +++ b/drivers/media/dvb-frontends/stv090x.c @@ -38,6 +38,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 */ @@ -3670,7 +3682,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; } @@ -3681,8 +3696,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: @@ -3699,10 +3713,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; @@ -3721,10 +3739,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