af9033: fix DVBv3 signal strength value not correct issue
Subsystems (2)
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.
Quoted 1 line
From
02ee7de4600a43a322f75cf04d273effa04d3a42Mon Sep 17 00:00:00 2001
From: Bimow Chen <[email protected]>
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.
--- drivers/media/dvb-frontends/af9033.c | 43 +++++++++++++++++++++++----- drivers/media/dvb-frontends/af9033_priv.h | 6 ++++ 2 files changed, 41 insertions(+), 8 deletions(-)
drivers/media/dvb-frontends/af9033.c +35 -8
@@ -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 ;
drivers/media/dvb-frontends/af9033_priv.h +6 -0
@@ -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 */
Signature · 1 line
1.7.0.4
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
Quoted 92 lines · Bimow Chen
Register
0x800048is not dB measure but relative scale. Fix it and conform to NorDig specifications.0001-af9033-fix-DVBv3-signal-strength-value-not-correct-i.patch
Quoted 1 line
From
02ee7de4600a43a322f75cf04d273effa04d3a42Mon Sep 17 00:00:00 2001From: Bimow Chen<[email protected]>
Date: Wed, 1 Oct 2014 18:28:54 +0800
Subject: [PATCH 1/2] af9033: fix DVBv3 signal strength value not correct issueRegister
0x800048is not dB measure but relative scale. Fix it and conform to NorDig specifications.Signed-off-by Bimow Chen<[email protected]>--- drivers/media/dvb-frontends/af9033.c | 43 +++++++++++++++++++++++----- drivers/media/dvb-frontends/af9033_priv.h | 6 ++++ 2 files changed, 41 insertions(+), 8 deletions(-)drivers/media/dvb-frontends/af9033.c +35
-8@@ -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 ;drivers/media/dvb-frontends/af9033_priv.h +6
-1@@ -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
Signature · 1 line
http://palosaari.fi/