Re: [PATCH 1/2] af9033: fix DVBv3 signal strength value not correct issue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello
I did some review and testing. Before that patch, IT9133 DVBv3 signal strength measurement was broken - it returned 0xffff all the time. After that is returns some realistic values between 0-0xffff.

Anyhow, AF9033 chip version it worked earlier too, just like old comment says hw returns 0-100, which was scaled to 0-0xffff.

AF9033 and IT9133 firmware differs on signal strength measurement. For AF9033 it provides both percentage and dBm reports, for IT9133 I know only dBm report.

AF9033:
0x800048 relative (0-100, percentage)
0x80004a decibel (-VAL dBm)

IT9133:
0x8000f7 decibel (VAL - 100 dBm)


Now you changed that AF9033 implementation from 0x800048 (percentage) to 0x80004a (dBm) and scale that to 0-0xffff, which results poorer result than old implementation calculated by firmware.

What I tested that implementation, it gives maximum value 0x6e14, which we could calc is 43dBm. I was using -18dBm RF level (which is very very strong), so I suspect that 43dBm is maximum what firmware even could report. Having maximum possible signal strength only 43% (out of 100%) is not nice.


So I ask you change AF9035 as it has been (percentage reported by FW). Change only non-working IT9135 what you like.

Also, add error checking just after register reads and jump out if fails.

regards
Antti


On 10/02/2014 08:32 AM, Bimow Chen wrote:
Register 0x800048 is not dB measure but relative scale. Fix it and conform to NorDig specifications.


0001-af9033-fix-DVBv3-signal-strength-value-not-correct-i.patch


From 02ee7de4600a43a322f75cf04d273effa04d3a42 Mon Sep 17 00:00:00 2001
From: Bimow Chen<Bimow.Chen@xxxxxxxxxx>
Date: Wed, 1 Oct 2014 18:28:54 +0800
Subject: [PATCH 1/2] af9033: fix DVBv3 signal strength value not correct issue

Register 0x800048 is not dB measure but relative scale. Fix it and conform to NorDig specifications.

Signed-off-by: Bimow Chen<Bimow.Chen@xxxxxxxxxx>
---
  drivers/media/dvb-frontends/af9033.c      |   43 +++++++++++++++++++++++-----
  drivers/media/dvb-frontends/af9033_priv.h |    6 ++++
  2 files changed, 41 insertions(+), 8 deletions(-)

diff --git a/drivers/media/dvb-frontends/af9033.c b/drivers/media/dvb-frontends/af9033.c
index 63a89c1..2b3d2f0 100644
--- a/drivers/media/dvb-frontends/af9033.c
+++ b/drivers/media/dvb-frontends/af9033.c
@@ -862,16 +862,43 @@ static int af9033_read_snr(struct dvb_frontend *fe, u16 *snr)
  static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
  {
  	struct af9033_dev *dev = fe->demodulator_priv;
-	int ret;
-	u8 strength2;
+	struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
+	int ret, tmp, power_real;
+	u8 u8tmp, gain_offset, buf[7];

-	/* read signal strength of 0-100 scale */
-	ret = af9033_rd_reg(dev, 0x800048, &strength2);
-	if (ret < 0)
-		goto err;
+	if (dev->is_af9035) {
+		ret = af9033_rd_reg(dev, 0x80004a, &u8tmp);
+		/* scale value to 0x0000-0xffff */
+		*strength = u8tmp * 0xffff / 100;
+	} else {
+		ret = af9033_rd_reg(dev, 0x8000f7, &u8tmp);
+		ret |= af9033_rd_regs(dev, 0x80f900, buf, 7);
+
+		if (c->frequency <= 300000000)
+			gain_offset = 7; /* VHF */
+		else
+			gain_offset = 4; /* UHF */
+
+		power_real = (u8tmp - 100 - gain_offset) -
+			power_reference[((buf[3] >> 0) & 3)][((buf[6] >> 0) & 7)];
+
+		if (power_real < -15)
+			tmp = 0;
+		else if ((power_real >= -15) && (power_real < 0))
+			tmp = (2 * (power_real + 15)) / 3;
+		else if ((power_real >= 0) && (power_real < 20))
+			tmp = 4 * power_real + 10;
+		else if ((power_real >= 20) && (power_real < 35))
+			tmp = (2 * (power_real - 20)) / 3 + 90;
+		else
+			tmp = 100;
+
+		/* scale value to 0x0000-0xffff */
+		*strength = tmp * 0xffff / 100;
+	}

-	/* scale value to 0x0000-0xffff */
-	*strength = strength2 * 0xffff / 100;
+	if (ret)
+		goto err;

  	return 0;

diff --git a/drivers/media/dvb-frontends/af9033_priv.h b/drivers/media/dvb-frontends/af9033_priv.h
index c12c92c..c9c8798 100644
--- a/drivers/media/dvb-frontends/af9033_priv.h
+++ b/drivers/media/dvb-frontends/af9033_priv.h
@@ -2051,4 +2051,10 @@ static const struct reg_val tuner_init_it9135_62[] = {
  	{ 0x80fd8b, 0x00 },
  };

+/* NorDig power reference table */
+static const int power_reference[][5] = {
+	{-93, -91, -90, -89, -88}, /* QPSK 1/2 ~ 7/8 */
+	{-87, -85, -84, -83, -82}, /* 16QAM 1/2 ~ 7/8 */
+	{-82, -80, -78, -77, -76}, /* 64QAM 1/2 ~ 7/8 */
+};
  #endif /* AF9033_PRIV_H */
-- 1.7.0.4


--
http://palosaari.fi/
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux