Message ID | 201205121111.36181.hfvogt@gmx.net (mailing list archive) |
---|---|
State | Accepted, archived |
Headers |
Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from <linux-media-owner@vger.kernel.org>) id 1ST8NB-0005Lr-BQ for patchwork@linuxtv.org; Sat, 12 May 2012 11:12:21 +0200 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.75/mailfrontend-4) with esmtp for <patchwork@linuxtv.org> id 1ST8NA-0007dc-Bp; Sat, 12 May 2012 11:12:21 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752503Ab2ELJLo (ORCPT <rfc822;patchwork@linuxtv.org>); Sat, 12 May 2012 05:11:44 -0400 Received: from mailout-de.gmx.net ([213.165.64.23]:59969 "HELO mailout-de.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1752203Ab2ELJLn (ORCPT <rfc822;linux-media@vger.kernel.org>); Sat, 12 May 2012 05:11:43 -0400 Received: (qmail invoked by alias); 12 May 2012 09:11:41 -0000 Received: from p4FC08C81.dip0.t-ipconnect.de (EHLO maximilian.localnet) [79.192.140.129] by mail.gmx.net (mp071) with SMTP; 12 May 2012 11:11:41 +0200 X-Authenticated: #24390674 X-Provags-ID: V01U2FsdGVkX18Udr9EUOcUjpKyJeOof/SBfhKftVBjOnQSDtK4Sp taH/hfICqKcriU From: "Hans-Frieder Vogt" <hfvogt@gmx.net> To: linux-media@vger.kernel.org, Thomas Mair <thomas.mair86@googlemail.com>, Antti Palosaari <crope@iki.fi> Subject: [PATCH] fc0012 ver. 0.6: introduction of get_rf_strength function Date: Sat, 12 May 2012 11:11:36 +0200 User-Agent: KMail/1.13.7 (Linux/3.3.4-a64; KDE/4.7.4; x86_64; ; ) MIME-Version: 1.0 Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Message-Id: <201205121111.36181.hfvogt@gmx.net> X-Y-GMX-Trusted: 0 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: <linux-media.vger.kernel.org> X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 5.6.1.2065439, Antispam-Engine: 2.7.2.376379, Antispam-Data: 2012.5.12.90317 X-PMX-Spam: Gauge=IIIIIIII, Probability=8%, Report=' HTML_00_01 0.05, HTML_00_10 0.05, BODY_SIZE_3000_3999 0, BODY_SIZE_5000_LESS 0, BODY_SIZE_7000_LESS 0, URI_ENDS_IN_HTML 0, __ANY_URI 0, __CP_URI_IN_BODY 0, __CT 0, __CTE 0, __CT_TEXT_PLAIN 0, __HAS_MSGID 0, __HAS_X_MAILING_LIST 0, __MIME_TEXT_ONLY 0, __MIME_VERSION 0, __SANE_MSGID 0, __STOCK_PHRASE_7 0, __SUBJ_ALPHA_END 0, __TO_MALFORMED_2 0, __TO_NO_NAME 0, __URI_NO_WWW 0, __URI_NS , __USER_AGENT 0' |
Commit Message
Hans-Frieder Vogt
May 12, 2012, 9:11 a.m. UTC
Changes compared to version 0.5 of driver (sent 6 May):
- Initial implementation of get_rf_strength function.
Signed-off-by: Hans-Frieder Vogt <hfvogt@gmx.net>
fc0012.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 71 insertions(+), 1 deletion(-)
Hans-Frieder Vogt e-mail: hfvogt <at> gmx .dot. net
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Comments
On 12.05.2012 11:11, Hans-Frieder Vogt wrote: > Changes compared to version 0.5 of driver (sent 6 May): > - Initial implementation of get_rf_strength function. > > Signed-off-by: Hans-Frieder Vogt <hfvogt@gmx.net> > > fc0012.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 71 insertions(+), 1 deletion(-) > > diff -up --new-file --recursive a/drivers/media/common/tuners/fc0012.c b/drivers/media/common/tuners/fc0012.c > --- a/drivers/media/common/tuners/fc0012.c 2012-05-12 10:53:55.330058209 +0200 > +++ b/drivers/media/common/tuners/fc0012.c 2012-05-09 23:27:37.781193720 +0200 > @@ -343,6 +343,74 @@ static int fc0012_get_bandwidth(struct d > return 0; > } > > +#define INPUT_ADC_LEVEL -8 > + > +static int fc0012_get_rf_strength(struct dvb_frontend *fe, u16 *strength) > +{ > + struct fc0012_priv *priv = fe->tuner_priv; > + int ret; > + unsigned char tmp; > + int int_temp, lna_gain, int_lna, tot_agc_gain, power; > + const int fc0012_lna_gain_table[] = { > + /* low gain */ > + -63, -58, -99, -73, > + -63, -65, -54, -60, > + /* middle gain */ > + 71, 70, 68, 67, > + 65, 63, 61, 58, > + /* high gain */ > + 197, 191, 188, 186, > + 184, 182, 181, 179, > + }; > + > + if (fe->ops.i2c_gate_ctrl) > + fe->ops.i2c_gate_ctrl(fe, 1); /* open I2C-gate */ > + > + ret = fc0012_writereg(priv, 0x12, 0x00); > + if (ret) > + goto err; > + > + ret = fc0012_readreg(priv, 0x12, &tmp); > + if (ret) > + goto err; > + int_temp = tmp; > + > + ret = fc0012_readreg(priv, 0x13, &tmp); > + if (ret) > + goto err; > + lna_gain = tmp & 0x1f; > + > + if (fe->ops.i2c_gate_ctrl) > + fe->ops.i2c_gate_ctrl(fe, 0); /* close I2C-gate */ > + > + if (lna_gain < ARRAY_SIZE(fc0012_lna_gain_table)) { > + int_lna = fc0012_lna_gain_table[lna_gain]; > + tot_agc_gain = (abs((int_temp >> 5) - 7) - 2 + > + (int_temp & 0x1f)) * 2; > + power = INPUT_ADC_LEVEL - tot_agc_gain - int_lna / 10; > + > + if (power >= 45) > + *strength = 255; /* 100% */ > + else if (power < -95) > + *strength = 0; > + else > + *strength = (power + 95) * 255 / 140; > + > + *strength |= *strength << 8; > + } else { > + ret = -1; > + } > + > + goto exit; > + > +err: > + if (fe->ops.i2c_gate_ctrl) > + fe->ops.i2c_gate_ctrl(fe, 0); /* close I2C-gate */ > +exit: > + if (ret) > + warn("%s: failed: %d", __func__, ret); > + return ret; > +} > > static const struct dvb_tuner_ops fc0012_tuner_ops = { > .info = { > @@ -363,6 +431,8 @@ static const struct dvb_tuner_ops fc0012 > .get_frequency = fc0012_get_frequency, > .get_if_frequency = fc0012_get_if_frequency, > .get_bandwidth = fc0012_get_bandwidth, > + > + .get_rf_strength = fc0012_get_rf_strength, > }; > > struct dvb_frontend *fc0012_attach(struct dvb_frontend *fe, > @@ -394,4 +464,4 @@ EXPORT_SYMBOL(fc0012_attach); > MODULE_DESCRIPTION("Fitipower FC0012 silicon tuner driver"); > MODULE_AUTHOR("Hans-Frieder Vogt <hfvogt@gmx.net>"); > MODULE_LICENSE("GPL"); > -MODULE_VERSION("0.5"); > +MODULE_VERSION("0.6"); > > Hans-Frieder Vogt e-mail: hfvogt <at> gmx .dot. net Thanks! I was just doing the same to get it to work with the rtl2832 demod. I will test the fc0012 driver with the rtl2832 driver today. -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 05/12/2012 11:11 AM, Hans-Frieder Vogt wrote: > Changes compared to version 0.5 of driver (sent 6 May): > - Initial implementation of get_rf_strength function. > > Signed-off-by: Hans-Frieder Vogt <hfvogt@gmx.net> > > fc0012.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 71 insertions(+), 1 deletion(-) > > diff -up --new-file --recursive a/drivers/media/common/tuners/fc0012.c b/drivers/media/common/tuners/fc0012.c > --- a/drivers/media/common/tuners/fc0012.c 2012-05-12 10:53:55.330058209 +0200 > +++ b/drivers/media/common/tuners/fc0012.c 2012-05-09 23:27:37.781193720 +0200 > @@ -343,6 +343,74 @@ static int fc0012_get_bandwidth(struct d > return 0; > } > > +#define INPUT_ADC_LEVEL -8 > + > +static int fc0012_get_rf_strength(struct dvb_frontend *fe, u16 *strength) > +{ > + struct fc0012_priv *priv = fe->tuner_priv; > + int ret; > + unsigned char tmp; > + int int_temp, lna_gain, int_lna, tot_agc_gain, power; > + const int fc0012_lna_gain_table[] = { > + /* low gain */ > + -63, -58, -99, -73, > + -63, -65, -54, -60, > + /* middle gain */ > + 71, 70, 68, 67, > + 65, 63, 61, 58, > + /* high gain */ > + 197, 191, 188, 186, > + 184, 182, 181, 179, > + }; > + > + if (fe->ops.i2c_gate_ctrl) > + fe->ops.i2c_gate_ctrl(fe, 1); /* open I2C-gate */ > + > + ret = fc0012_writereg(priv, 0x12, 0x00); > + if (ret) > + goto err; > + > + ret = fc0012_readreg(priv, 0x12, &tmp); > + if (ret) > + goto err; > + int_temp = tmp; > + > + ret = fc0012_readreg(priv, 0x13, &tmp); > + if (ret) > + goto err; > + lna_gain = tmp & 0x1f; > + > + if (fe->ops.i2c_gate_ctrl) > + fe->ops.i2c_gate_ctrl(fe, 0); /* close I2C-gate */ > + > + if (lna_gain < ARRAY_SIZE(fc0012_lna_gain_table)) { > + int_lna = fc0012_lna_gain_table[lna_gain]; > + tot_agc_gain = (abs((int_temp >> 5) - 7) - 2 + > + (int_temp & 0x1f)) * 2; > + power = INPUT_ADC_LEVEL - tot_agc_gain - int_lna / 10; > + > + if (power >= 45) > + *strength = 255; /* 100% */ > + else if (power < -95) > + *strength = 0; > + else > + *strength = (power + 95) * 255 / 140; > + > + *strength |= *strength << 8; > + } else { > + ret = -1; > + } > + > + goto exit; > + > +err: > + if (fe->ops.i2c_gate_ctrl) > + fe->ops.i2c_gate_ctrl(fe, 0); /* close I2C-gate */ > +exit: > + if (ret) > + warn("%s: failed: %d", __func__, ret); > + return ret; > +} > > static const struct dvb_tuner_ops fc0012_tuner_ops = { > .info = { > @@ -363,6 +431,8 @@ static const struct dvb_tuner_ops fc0012 > .get_frequency = fc0012_get_frequency, > .get_if_frequency = fc0012_get_if_frequency, > .get_bandwidth = fc0012_get_bandwidth, > + > + .get_rf_strength = fc0012_get_rf_strength, > }; > > struct dvb_frontend *fc0012_attach(struct dvb_frontend *fe, > @@ -394,4 +464,4 @@ EXPORT_SYMBOL(fc0012_attach); > MODULE_DESCRIPTION("Fitipower FC0012 silicon tuner driver"); > MODULE_AUTHOR("Hans-Frieder Vogt <hfvogt@gmx.net>"); > MODULE_LICENSE("GPL"); > -MODULE_VERSION("0.5"); > +MODULE_VERSION("0.6"); > rtl2832/fc0012: femon -H -a 2 -c 10: FE: Realtek RTL2832 (DVB-T) (DVBT) status SCVYL | signal 23% | snr 79% | ber 0 | unc 100 | FE_HAS_LOCK status SCVYL | signal 23% | snr 79% | ber 0 | unc 100 | FE_HAS_LOCK status SCVYL | signal 23% | snr 79% | ber 0 | unc 100 | FE_HAS_LOCK status SCVYL | signal 23% | snr 79% | ber 0 | unc 100 | FE_HAS_LOCK status SCVYL | signal 23% | snr 82% | ber 0 | unc 100 | FE_HAS_LOCK // without tzap/lock: Problem retrieving frontend information: Remote I/O error status | signal 23% | snr 82% | ber 0 | unc 100 | Problem retrieving frontend information: Remote I/O error status | signal 23% | snr 82% | ber 0 | unc 100 | Problem retrieving frontend information: Remote I/O error status | signal 23% | snr 82% | ber 0 | unc 100 | Problem retrieving frontend information: Remote I/O error status | signal 23% | snr 82% | ber 0 | unc 100 | Problem retrieving frontend information: Remote I/O error status | signal 23% | snr 82% | ber 0 | unc 100 | dmesg: […] // without tzap/lock: rtl2832: i2c rd failed=-32 reg=4e len=2 rtl2832: rtl2832_read_ber: failed=-121 rtl2832: i2c rd failed=-32 reg=01 len=1 fc0012: I2C write reg failed, reg: 12, val: 00 fc0012: fc0012_get_rf_strength: failed: -121 rtl2832: i2c rd failed=-32 reg=51 len=1 rtl2832: rtl2832_read_snr: failed=-121 rtl2832: i2c rd failed=-32 reg=51 len=1 rtl2832: rtl2832_read_ucblocks: failed=-121 Comparable readings - af9013/mxl5007t: femon -H -a 1 -c 10 FE: Afatech AF9013 (DVBT) status SCVYL | signal 55% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK status SCVYL | signal 55% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK status SCVYL | signal 55% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK status SCVYL | signal 55% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK status SCVYL | signal 55% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK // without tzap/lock: status SCV | signal 55% | snr 0% | ber 0 | unc 0 | status SCV | signal 55% | snr 0% | ber 0 | unc 0 | status SCV | signal 55% | snr 0% | ber 0 | unc 0 | status SCV | signal 55% | snr 0% | ber 0 | unc 0 | status SCV | signal 55% | snr 0% | ber 0 | unc 0 | dmesg: […] // without tzap/lock: 'NONE' Is it necessary to populate a log buffer while frontend not locking? regards, poma ps. Thanks for fc0012! -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 13.05.2012 11:16, poma wrote: > On 05/12/2012 11:11 AM, Hans-Frieder Vogt wrote: >> Changes compared to version 0.5 of driver (sent 6 May): >> - Initial implementation of get_rf_strength function. >> >> Signed-off-by: Hans-Frieder Vogt<hfvogt@gmx.net> >> >> fc0012.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- >> 1 file changed, 71 insertions(+), 1 deletion(-) >> >> diff -up --new-file --recursive a/drivers/media/common/tuners/fc0012.c b/drivers/media/common/tuners/fc0012.c >> --- a/drivers/media/common/tuners/fc0012.c 2012-05-12 10:53:55.330058209 +0200 >> +++ b/drivers/media/common/tuners/fc0012.c 2012-05-09 23:27:37.781193720 +0200 >> @@ -343,6 +343,74 @@ static int fc0012_get_bandwidth(struct d >> return 0; >> } >> >> +#define INPUT_ADC_LEVEL -8 >> + >> +static int fc0012_get_rf_strength(struct dvb_frontend *fe, u16 *strength) >> +{ >> + struct fc0012_priv *priv = fe->tuner_priv; >> + int ret; >> + unsigned char tmp; >> + int int_temp, lna_gain, int_lna, tot_agc_gain, power; >> + const int fc0012_lna_gain_table[] = { >> + /* low gain */ >> + -63, -58, -99, -73, >> + -63, -65, -54, -60, >> + /* middle gain */ >> + 71, 70, 68, 67, >> + 65, 63, 61, 58, >> + /* high gain */ >> + 197, 191, 188, 186, >> + 184, 182, 181, 179, >> + }; >> + >> + if (fe->ops.i2c_gate_ctrl) >> + fe->ops.i2c_gate_ctrl(fe, 1); /* open I2C-gate */ >> + >> + ret = fc0012_writereg(priv, 0x12, 0x00); >> + if (ret) >> + goto err; >> + >> + ret = fc0012_readreg(priv, 0x12,&tmp); >> + if (ret) >> + goto err; >> + int_temp = tmp; >> + >> + ret = fc0012_readreg(priv, 0x13,&tmp); >> + if (ret) >> + goto err; >> + lna_gain = tmp& 0x1f; >> + >> + if (fe->ops.i2c_gate_ctrl) >> + fe->ops.i2c_gate_ctrl(fe, 0); /* close I2C-gate */ >> + >> + if (lna_gain< ARRAY_SIZE(fc0012_lna_gain_table)) { >> + int_lna = fc0012_lna_gain_table[lna_gain]; >> + tot_agc_gain = (abs((int_temp>> 5) - 7) - 2 + >> + (int_temp& 0x1f)) * 2; >> + power = INPUT_ADC_LEVEL - tot_agc_gain - int_lna / 10; >> + >> + if (power>= 45) >> + *strength = 255; /* 100% */ >> + else if (power< -95) >> + *strength = 0; >> + else >> + *strength = (power + 95) * 255 / 140; >> + >> + *strength |= *strength<< 8; >> + } else { >> + ret = -1; >> + } >> + >> + goto exit; >> + >> +err: >> + if (fe->ops.i2c_gate_ctrl) >> + fe->ops.i2c_gate_ctrl(fe, 0); /* close I2C-gate */ >> +exit: >> + if (ret) >> + warn("%s: failed: %d", __func__, ret); >> + return ret; >> +} >> >> static const struct dvb_tuner_ops fc0012_tuner_ops = { >> .info = { >> @@ -363,6 +431,8 @@ static const struct dvb_tuner_ops fc0012 >> .get_frequency = fc0012_get_frequency, >> .get_if_frequency = fc0012_get_if_frequency, >> .get_bandwidth = fc0012_get_bandwidth, >> + >> + .get_rf_strength = fc0012_get_rf_strength, >> }; >> >> struct dvb_frontend *fc0012_attach(struct dvb_frontend *fe, >> @@ -394,4 +464,4 @@ EXPORT_SYMBOL(fc0012_attach); >> MODULE_DESCRIPTION("Fitipower FC0012 silicon tuner driver"); >> MODULE_AUTHOR("Hans-Frieder Vogt<hfvogt@gmx.net>"); >> MODULE_LICENSE("GPL"); >> -MODULE_VERSION("0.5"); >> +MODULE_VERSION("0.6"); >> > > rtl2832/fc0012: > > femon -H -a 2 -c 10: > FE: Realtek RTL2832 (DVB-T) (DVBT) > status SCVYL | signal 23% | snr 79% | ber 0 | unc 100 | FE_HAS_LOCK > status SCVYL | signal 23% | snr 79% | ber 0 | unc 100 | FE_HAS_LOCK > status SCVYL | signal 23% | snr 79% | ber 0 | unc 100 | FE_HAS_LOCK > status SCVYL | signal 23% | snr 79% | ber 0 | unc 100 | FE_HAS_LOCK > status SCVYL | signal 23% | snr 82% | ber 0 | unc 100 | FE_HAS_LOCK > // without tzap/lock: > Problem retrieving frontend information: Remote I/O error > status | signal 23% | snr 82% | ber 0 | unc 100 | > Problem retrieving frontend information: Remote I/O error > status | signal 23% | snr 82% | ber 0 | unc 100 | > Problem retrieving frontend information: Remote I/O error > status | signal 23% | snr 82% | ber 0 | unc 100 | > Problem retrieving frontend information: Remote I/O error > status | signal 23% | snr 82% | ber 0 | unc 100 | > Problem retrieving frontend information: Remote I/O error > status | signal 23% | snr 82% | ber 0 | unc 100 | > > dmesg: > […] > // without tzap/lock: > rtl2832: i2c rd failed=-32 reg=4e len=2 > rtl2832: rtl2832_read_ber: failed=-121 > rtl2832: i2c rd failed=-32 reg=01 len=1 > fc0012: I2C write reg failed, reg: 12, val: 00 > fc0012: fc0012_get_rf_strength: failed: -121 > rtl2832: i2c rd failed=-32 reg=51 len=1 > rtl2832: rtl2832_read_snr: failed=-121 > rtl2832: i2c rd failed=-32 reg=51 len=1 > rtl2832: rtl2832_read_ucblocks: failed=-121 > > > Comparable readings - af9013/mxl5007t: > > femon -H -a 1 -c 10 > FE: Afatech AF9013 (DVBT) > status SCVYL | signal 55% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK > status SCVYL | signal 55% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK > status SCVYL | signal 55% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK > status SCVYL | signal 55% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK > status SCVYL | signal 55% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK > // without tzap/lock: > status SCV | signal 55% | snr 0% | ber 0 | unc 0 | > status SCV | signal 55% | snr 0% | ber 0 | unc 0 | > status SCV | signal 55% | snr 0% | ber 0 | unc 0 | > status SCV | signal 55% | snr 0% | ber 0 | unc 0 | > status SCV | signal 55% | snr 0% | ber 0 | unc 0 | > > dmesg: > […] > // without tzap/lock: > 'NONE' > > > Is it necessary to populate a log buffer while frontend not locking? It is not nice and should not happen. But let me explain issues behind it. It fails since device is put sleep in that case those chips even does not respond to control messages. RTL2830 has similar problem - I resolved it just adding some clue to demod driver not access to the hw when when it is sleeping. IMHO whole issues is DVB CORE issue as it should not pass any calls to the individual chip drivers when device is clearly in the state those calls are invalid. For example when we are sleeping only legal call is .init() in order to wake it up. Also BER and UCB are invalid until LOCK is gained. I have already listed those issues as a my GSoC DVB CORE enhancements - so I think it is not worth to make any chip driver hacks in that case. regards Antti
On 05/13/2012 12:59 PM, Antti Palosaari wrote: > On 13.05.2012 11:16, poma wrote: >> On 05/12/2012 11:11 AM, Hans-Frieder Vogt wrote: >>> Changes compared to version 0.5 of driver (sent 6 May): >>> - Initial implementation of get_rf_strength function. >>> >>> Signed-off-by: Hans-Frieder Vogt<hfvogt@gmx.net> >>> >>> fc0012.c | 72 >>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- >>> 1 file changed, 71 insertions(+), 1 deletion(-) >>> >>> diff -up --new-file --recursive >>> a/drivers/media/common/tuners/fc0012.c >>> b/drivers/media/common/tuners/fc0012.c >>> --- a/drivers/media/common/tuners/fc0012.c 2012-05-12 >>> 10:53:55.330058209 +0200 >>> +++ b/drivers/media/common/tuners/fc0012.c 2012-05-09 >>> 23:27:37.781193720 +0200 >>> @@ -343,6 +343,74 @@ static int fc0012_get_bandwidth(struct d >>> return 0; >>> } >>> >>> +#define INPUT_ADC_LEVEL -8 >>> + >>> +static int fc0012_get_rf_strength(struct dvb_frontend *fe, u16 >>> *strength) >>> +{ >>> + struct fc0012_priv *priv = fe->tuner_priv; >>> + int ret; >>> + unsigned char tmp; >>> + int int_temp, lna_gain, int_lna, tot_agc_gain, power; >>> + const int fc0012_lna_gain_table[] = { >>> + /* low gain */ >>> + -63, -58, -99, -73, >>> + -63, -65, -54, -60, >>> + /* middle gain */ >>> + 71, 70, 68, 67, >>> + 65, 63, 61, 58, >>> + /* high gain */ >>> + 197, 191, 188, 186, >>> + 184, 182, 181, 179, >>> + }; >>> + >>> + if (fe->ops.i2c_gate_ctrl) >>> + fe->ops.i2c_gate_ctrl(fe, 1); /* open I2C-gate */ >>> + >>> + ret = fc0012_writereg(priv, 0x12, 0x00); >>> + if (ret) >>> + goto err; >>> + >>> + ret = fc0012_readreg(priv, 0x12,&tmp); >>> + if (ret) >>> + goto err; >>> + int_temp = tmp; >>> + >>> + ret = fc0012_readreg(priv, 0x13,&tmp); >>> + if (ret) >>> + goto err; >>> + lna_gain = tmp& 0x1f; >>> + >>> + if (fe->ops.i2c_gate_ctrl) >>> + fe->ops.i2c_gate_ctrl(fe, 0); /* close I2C-gate */ >>> + >>> + if (lna_gain< ARRAY_SIZE(fc0012_lna_gain_table)) { >>> + int_lna = fc0012_lna_gain_table[lna_gain]; >>> + tot_agc_gain = (abs((int_temp>> 5) - 7) - 2 + >>> + (int_temp& 0x1f)) * 2; >>> + power = INPUT_ADC_LEVEL - tot_agc_gain - int_lna / 10; >>> + >>> + if (power>= 45) >>> + *strength = 255; /* 100% */ >>> + else if (power< -95) >>> + *strength = 0; >>> + else >>> + *strength = (power + 95) * 255 / 140; >>> + >>> + *strength |= *strength<< 8; >>> + } else { >>> + ret = -1; >>> + } >>> + >>> + goto exit; >>> + >>> +err: >>> + if (fe->ops.i2c_gate_ctrl) >>> + fe->ops.i2c_gate_ctrl(fe, 0); /* close I2C-gate */ >>> +exit: >>> + if (ret) >>> + warn("%s: failed: %d", __func__, ret); >>> + return ret; >>> +} >>> >>> static const struct dvb_tuner_ops fc0012_tuner_ops = { >>> .info = { >>> @@ -363,6 +431,8 @@ static const struct dvb_tuner_ops fc0012 >>> .get_frequency = fc0012_get_frequency, >>> .get_if_frequency = fc0012_get_if_frequency, >>> .get_bandwidth = fc0012_get_bandwidth, >>> + >>> + .get_rf_strength = fc0012_get_rf_strength, >>> }; >>> >>> struct dvb_frontend *fc0012_attach(struct dvb_frontend *fe, >>> @@ -394,4 +464,4 @@ EXPORT_SYMBOL(fc0012_attach); >>> MODULE_DESCRIPTION("Fitipower FC0012 silicon tuner driver"); >>> MODULE_AUTHOR("Hans-Frieder Vogt<hfvogt@gmx.net>"); >>> MODULE_LICENSE("GPL"); >>> -MODULE_VERSION("0.5"); >>> +MODULE_VERSION("0.6"); >>> >> >> rtl2832/fc0012: >> >> femon -H -a 2 -c 10: >> FE: Realtek RTL2832 (DVB-T) (DVBT) >> status SCVYL | signal 23% | snr 79% | ber 0 | unc 100 | FE_HAS_LOCK >> status SCVYL | signal 23% | snr 79% | ber 0 | unc 100 | FE_HAS_LOCK >> status SCVYL | signal 23% | snr 79% | ber 0 | unc 100 | FE_HAS_LOCK >> status SCVYL | signal 23% | snr 79% | ber 0 | unc 100 | FE_HAS_LOCK >> status SCVYL | signal 23% | snr 82% | ber 0 | unc 100 | FE_HAS_LOCK >> // without tzap/lock: >> Problem retrieving frontend information: Remote I/O error >> status | signal 23% | snr 82% | ber 0 | unc 100 | >> Problem retrieving frontend information: Remote I/O error >> status | signal 23% | snr 82% | ber 0 | unc 100 | >> Problem retrieving frontend information: Remote I/O error >> status | signal 23% | snr 82% | ber 0 | unc 100 | >> Problem retrieving frontend information: Remote I/O error >> status | signal 23% | snr 82% | ber 0 | unc 100 | >> Problem retrieving frontend information: Remote I/O error >> status | signal 23% | snr 82% | ber 0 | unc 100 | >> >> dmesg: >> […] >> // without tzap/lock: >> rtl2832: i2c rd failed=-32 reg=4e len=2 >> rtl2832: rtl2832_read_ber: failed=-121 >> rtl2832: i2c rd failed=-32 reg=01 len=1 >> fc0012: I2C write reg failed, reg: 12, val: 00 >> fc0012: fc0012_get_rf_strength: failed: -121 >> rtl2832: i2c rd failed=-32 reg=51 len=1 >> rtl2832: rtl2832_read_snr: failed=-121 >> rtl2832: i2c rd failed=-32 reg=51 len=1 >> rtl2832: rtl2832_read_ucblocks: failed=-121 >> >> >> Comparable readings - af9013/mxl5007t: >> >> femon -H -a 1 -c 10 >> FE: Afatech AF9013 (DVBT) >> status SCVYL | signal 55% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK >> status SCVYL | signal 55% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK >> status SCVYL | signal 55% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK >> status SCVYL | signal 55% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK >> status SCVYL | signal 55% | snr 0% | ber 0 | unc 0 | FE_HAS_LOCK >> // without tzap/lock: >> status SCV | signal 55% | snr 0% | ber 0 | unc 0 | >> status SCV | signal 55% | snr 0% | ber 0 | unc 0 | >> status SCV | signal 55% | snr 0% | ber 0 | unc 0 | >> status SCV | signal 55% | snr 0% | ber 0 | unc 0 | >> status SCV | signal 55% | snr 0% | ber 0 | unc 0 | >> >> dmesg: >> […] >> // without tzap/lock: >> 'NONE' >> >> >> Is it necessary to populate a log buffer while frontend not locking? > > It is not nice and should not happen. > But let me explain issues behind it. It fails since device is put sleep > in that case those chips even does not respond to control messages. > RTL2830 has similar problem - I resolved it just adding some clue to > demod driver not access to the hw when when it is sleeping. > > IMHO whole issues is DVB CORE issue as it should not pass any calls to > the individual chip drivers when device is clearly in the state those > calls are invalid. > > For example when we are sleeping only legal call is .init() in order to > wake it up. Also BER and UCB are invalid until LOCK is gained. > > I have already listed those issues as a my GSoC DVB CORE enhancements - > so I think it is not worth to make any chip driver hacks in that case. > > regards > Antti Fair enough. May the Force be with you, poma -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff -up --new-file --recursive a/drivers/media/common/tuners/fc0012.c b/drivers/media/common/tuners/fc0012.c --- a/drivers/media/common/tuners/fc0012.c 2012-05-12 10:53:55.330058209 +0200 +++ b/drivers/media/common/tuners/fc0012.c 2012-05-09 23:27:37.781193720 +0200 @@ -343,6 +343,74 @@ static int fc0012_get_bandwidth(struct d return 0; } +#define INPUT_ADC_LEVEL -8 + +static int fc0012_get_rf_strength(struct dvb_frontend *fe, u16 *strength) +{ + struct fc0012_priv *priv = fe->tuner_priv; + int ret; + unsigned char tmp; + int int_temp, lna_gain, int_lna, tot_agc_gain, power; + const int fc0012_lna_gain_table[] = { + /* low gain */ + -63, -58, -99, -73, + -63, -65, -54, -60, + /* middle gain */ + 71, 70, 68, 67, + 65, 63, 61, 58, + /* high gain */ + 197, 191, 188, 186, + 184, 182, 181, 179, + }; + + if (fe->ops.i2c_gate_ctrl) + fe->ops.i2c_gate_ctrl(fe, 1); /* open I2C-gate */ + + ret = fc0012_writereg(priv, 0x12, 0x00); + if (ret) + goto err; + + ret = fc0012_readreg(priv, 0x12, &tmp); + if (ret) + goto err; + int_temp = tmp; + + ret = fc0012_readreg(priv, 0x13, &tmp); + if (ret) + goto err; + lna_gain = tmp & 0x1f; + + if (fe->ops.i2c_gate_ctrl) + fe->ops.i2c_gate_ctrl(fe, 0); /* close I2C-gate */ + + if (lna_gain < ARRAY_SIZE(fc0012_lna_gain_table)) { + int_lna = fc0012_lna_gain_table[lna_gain]; + tot_agc_gain = (abs((int_temp >> 5) - 7) - 2 + + (int_temp & 0x1f)) * 2; + power = INPUT_ADC_LEVEL - tot_agc_gain - int_lna / 10; + + if (power >= 45) + *strength = 255; /* 100% */ + else if (power < -95) + *strength = 0; + else + *strength = (power + 95) * 255 / 140; + + *strength |= *strength << 8; + } else { + ret = -1; + } + + goto exit; + +err: + if (fe->ops.i2c_gate_ctrl) + fe->ops.i2c_gate_ctrl(fe, 0); /* close I2C-gate */ +exit: + if (ret) + warn("%s: failed: %d", __func__, ret); + return ret; +} static const struct dvb_tuner_ops fc0012_tuner_ops = { .info = { @@ -363,6 +431,8 @@ static const struct dvb_tuner_ops fc0012 .get_frequency = fc0012_get_frequency, .get_if_frequency = fc0012_get_if_frequency, .get_bandwidth = fc0012_get_bandwidth, + + .get_rf_strength = fc0012_get_rf_strength, }; struct dvb_frontend *fc0012_attach(struct dvb_frontend *fe, @@ -394,4 +464,4 @@ EXPORT_SYMBOL(fc0012_attach); MODULE_DESCRIPTION("Fitipower FC0012 silicon tuner driver"); MODULE_AUTHOR("Hans-Frieder Vogt <hfvogt@gmx.net>"); MODULE_LICENSE("GPL"); -MODULE_VERSION("0.5"); +MODULE_VERSION("0.6");