saa7134: Add AverMedia Satelllite Hybrid+FM A706 (and FM radio problems)
RFC PATCH 1/1 saa7134: Add AverMedia Satelllite Hybrid+FM A706 (and FM radio problems)
Hello,
this patch adds support for AverMedia Satelllite Hybrid+FM A706 cards to saa7134 driver.
This card needs i2c gate in tda8290 to be disabled (as all I2C devices are connected to single bus) so this patch also includes tda8290 driver modification to allow this (will be posted separately in final version).
Working: analog video inputs (composite, s-vhs, analog TV), analog sound inputs (cinch, TV), analog TV tuner, remote control
Untested: DVB-S
Partially working: FM radio
Radio seems to be a long-standing problem with saa7134 cards using silicon tuners (according to various mailing lists).
On this card, GPIO11 controls 74HC4052 MUX. It switches two things:
something at TDA18271 V_IFAGC pin and something that goes to SAA7131E. GPIO11 is enabled for radio and disabled for TV in Windows. I did the same thing in this patch.
Windows INF file says:
; Setting FM radio of the Silicon tuner via SIF (GPIO 21 in use/ 5.5MHz) HKR, "Audio", "FM Radio IF", 0x00010001, 0xDEEAAB
But that seems not to be true. GPIO21 does nothing and RegSpy (from DScaler, modified to include 0x42c register) says that the register is 0x80729555. That matches the value present in saa7134-tvaudio.c (except the first 0x80).
With this value, the radio stations are off by about 4.2-4.3 MHz, e.g.:
station at 97.90 MHz is tuned as 102.20 MHz
station at 101.80 MHz is tuned as 106.0 MHz
I also tried 0xDEEAAB. With this, the offset is different, about 0.4 MHz:
station at 101.80 MHz is tuned as 102.2 MHz
And what's worst, connecting analog TV antenna (cable TV) affects the radio tuner! E.g. the radio is tuned to 106.0 MHz (real 101.80 MHz) with nice clean sound. Connecting TV antenna adds strong noise to the sound, tuning does not help. This problem is not present in Windows.
drivers/media/i2c/ir-kbd-i2c.c +12 -1
@@ -230,7 +230,7 @@ static int get_key_avermedia_cardbus(struct IR_i2c *ir,return 0 ;dprintk (1 ,"read key 0x%02x/0x%02x\n" , key, keygroup); -if (keygroup <2 || keygroup >3 ) { +if (keygroup <2 || keygroup >4 ) {/* Only a warning */ dprintk (1 ,"warning: invalid key group 0x%02x for key 0x%02x\n" , keygroup, key);
@@ -239,6 +239,10 @@ static int get_key_avermedia_cardbus(struct IR_i2c *ir, *ir_key = key; *ir_raw = key; +if (!strcmp (ir->ir_codes,RC_MAP_AVERMEDIA_M733A_RM_K6 )) { + *ir_key |= keygroup <<8 ; + *ir_raw |= keygroup <<8 ; + }return 1 ; }
@@ -332,6 +336,13 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id) rc_type =RC_BIT_OTHER ; ir_codes =RC_MAP_AVERMEDIA_CARDBUS ;break ; +case 0x41 : + name ="AVerMedia EM78P153" ; + ir->get_key = get_key_avermedia_cardbus; + rc_type =RC_BIT_OTHER ; +/* RM-KV remote, seems to be same as RM-K6 */ + ir_codes =RC_MAP_AVERMEDIA_M733A_RM_K6 ; +break ;case 0x71 : name ="Hauppauge/Zilog Z8" ; ir->get_key = get_key_haup_xvr;
drivers/media/pci/saa7134/saa7134-cards.c +45 -0
69 lines not on this page · raw message
drivers/media/pci/saa7134/saa7134-core.c +2 -2
@@ -947,9 +947,9 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,if ((unsigned )card[dev->nr] < saa7134_bcount) dev->board = card[dev->nr];if (SAA7134_BOARD_UNKNOWN == dev->board) -must_configure_manually (0 ); -else if (SAA7134_BOARD_NOAUTO == dev->board) {must_configure_manually (1 ); +else if (SAA7134_BOARD_NOAUTO == dev->board) { +must_configure_manually (0 ); dev->board =SAA7134_BOARD_UNKNOWN ; } dev->autodetected = card[dev->nr] != dev->board;
drivers/media/pci/saa7134/saa7134-dvb.c +22 -0
@@ -1070,6 +1070,10 @@ static struct mt312_config zl10313_compro_s350_config = { .demod_address = 0x0e, }; +static struct mt312_config zl10313_avermedia_a706_config = { + .demod_address =0x0e , +}; +static struct lgdt3305_config hcw_lgdt3305_config = { .i2c_addr =0x0e , .mpeg_mode =LGDT3305_MPEG_SERIAL ,
@@ -1817,6 +1821,24 @@ static int dvb_init(struct saa7134_dev *dev) &prohdtv_pro2_tda18271_config); }break ; +case SAA7134_BOARD_AVERMEDIA_A706 : +/* Enable all DVB-S devices now */ +/* CE5039 DVB-S tuner SLEEP pin low */ +saa7134_set_gpio (dev,23 ,0 ); +/* CE6313 DVB-S demod SLEEP pin low */ +saa7134_set_gpio (dev,9 ,0 ); +/* CE6313 DVB-S demod RESET# pin high */ +saa7134_set_gpio (dev,25 ,1 ); + fe0->dvb.frontend =dvb_attach (mt312_attach, + &zl10313_avermedia_a706_config, &dev->i2c_adap); +if (fe0->dvb.frontend) { + fe0->dvb.frontend->ops.i2c_gate_ctrl =NULL ; +if (dvb_attach (zl10039_attach, fe0->dvb.frontend, +0x60 , &dev->i2c_adap) ==NULL ) +wprintk ("%s: No zl10039 found!\n" , + __func__); + } +break ;default :wprintk ("Huh? unknown DVB card?\n" );break ;
drivers/media/pci/saa7134/saa7134-i2c.c +1 -1
@@ -255,7 +255,7 @@ static int saa7134_i2c_xfer(struct i2c_adapter *i2c_adap,if (msgs[i].flags &I2C_M_RD ) addr |=1 ;if (i >0 && msgs[i].flags & -I2C_M_RD && msgs[i].addr !=0x40 && +I2C_M_RD && msgs[i].addr !=0x40 && msgs[i].addr !=0x41 && msgs[i].addr !=0x19 ) {/* workaround for a saa7134 i2c bug * needed to talk to the mt352 demux
drivers/media/pci/saa7134/saa7134-input.c +3 -0
@@ -997,6 +997,9 @@ void saa7134_probe_i2c_ir(struct saa7134_dev *dev)case SAA7134_BOARD_AVERMEDIA_CARDBUS_506 : info.addr =0x40 ;break ; +case SAA7134_BOARD_AVERMEDIA_A706 : + info.addr =0x41 ; +break ;case SAA7134_BOARD_FLYDVB_TRIO : dev->init_data.name ="FlyDVB Trio" ; dev->init_data.get_key = get_key_flydvb_trio;
drivers/media/pci/saa7134/saa7134.h +1 -0
@@ -332,6 +332,7 @@ struct saa7134_card_ir {#define SAA7134_BOARD_SENSORAY811_911 188#define SAA7134_BOARD_KWORLD_PC150U 189#define SAA7134_BOARD_ASUSTeK_PS3_100 190 +#define SAA7134_BOARD_AVERMEDIA_A706 191#define SAA7134_MAXBOARDS 32#define SAA7134_INPUT_MAX 8
drivers/media/tuners/tda8290.c +13 -2
@@ -54,6 +54,7 @@ struct tda8290_priv {#define TDA18271 16struct tda827x_config cfg; +bool no_i2c_gate; };/*---------------------------------------------------------------------*/
@@ -66,6 +67,9 @@ static int tda8290_i2c_bridge(struct dvb_frontend *fe, int close)unsigned char disable[2 ] = {0x21 ,0x00 };unsigned char *msg; +if (priv->no_i2c_gate) +return 0 ; +if (close) { msg = enable;tuner_i2c_xfer_send (&priv->i2c_props, msg,2 );
@@ -88,6 +92,9 @@ static int tda8295_i2c_bridge(struct dvb_frontend *fe, int close)unsigned char buf[3 ] = {0x45 ,0x01 ,0x00 };unsigned char *msg; +if (priv->no_i2c_gate) +return 0 ; +if (close) { msg = enable;tuner_i2c_xfer_send (&priv->i2c_props, msg,2 );
@@ -740,8 +747,12 @@ struct dvb_frontend *tda829x_attach(struct dvb_frontend *fe, priv->i2c_props.addr = i2c_addr; priv->i2c_props.adap = i2c_adap; priv->i2c_props.name ="tda829x" ; -if (cfg) - priv->cfg.config = cfg->lna_cfg; +if (cfg) { +if (cfg->lna_cfg &TDA829X_NO_I2C_GATE ) + priv->no_i2c_gate = true; + priv->cfg.config = cfg->lna_cfg &TDA829X_CFG_MASK ; +printk ("cfg.config=%d\n" , priv->cfg.config); + }if (tda8290_probe (&priv->i2c_props) ==0 ) { priv->ver =TDA8290 ;
drivers/media/tuners/tda8290.h +3 -0
@@ -20,6 +20,9 @@#include <linux/i2c.h> #include "dvb_frontend.h" +#define TDA829X_NO_I2C_GATE (1 << 7) +#define TDA829X_CFG_MASK (~TDA829X_NO_I2C_GATE) +struct tda829x_config {unsigned int lna_cfg;
Signature · 1 line
Ondrej Zary
Quoted 18 lines · On Saturday 12 January 2013 21:24:50 Ondrej Zary wrote:
Partially working: FM radio
Radio seems to be a long-standing problem with saa7134 cards using silicon tuners (according to various mailing lists).On this card, GPIO11 controls 74HC4052 MUX. It switches two things:
something at TDA18271V_IFAGCpin and something that goes to SAA7131E. GPIO11 is enabled for radio and disabled for TV in Windows. I did the same thing in this patch.Windows INF file says:
; Setting FM radio of the Silicon tuner via SIF (GPIO 21 in use/ 5.5MHz) HKR, "Audio", "FM Radio IF",0x00010001,0xDEEAABBut that seems not to be true. GPIO21 does nothing and RegSpy (from DScaler, modified to include
0x42cregister) says that the register is0x80729555. That matches the value present insaa7134-tvaudio.c(except the first0x80).
Quoted 6 lines
With this value, the radio stations are off by about 4.2-4.3 MHz, e.g.:
station at 97.90 MHz is tuned as 102.20 MHz
station at 101.80 MHz is tuned as 106.0 MHzI also tried
0xDEEAAB. With this, the offset is different, about 0.4 MHz:
station at 101.80 MHz is tuned as 102.2 MHz
The offset seems bogus, maybe affected by my TV antenna (cable).
For debugging, tried another card with similar chips: Pinnacle PCTV 40i/50i/110i. It has SAA7131E chip too, but different tuner - TDA8275A. And the radio problem is the same as found first on the A706 - the tuned station sound starts but then turns into noise. So it seems that the problem is not in tda18271 but in tda8290 or saa7134.
With tda8290.debug=1, I see this:
tda829x 2-004b: tda8290 not locked, no signal?
tda829x 2-004b: tda8290 not locked, no signal?
tda829x 2-004b: tda8290 not locked, no signal?
tda829x 2-004b: adjust gain, step 1. Agc: 193, ADC stat: 255, lock: 0 tda829x 2-004b: adjust gain, step 2. Agc: 255, lock: 0 tda829x 2-004b: adjust gain, step 3. Agc: 173
During that, the sound is good. Then it turns into noise.
When I increased the number of lock detections in tda8290_set_params() from 3 to (e.g.) 10, it works longer. And when I'm quick enough to stop the console output using scroll lock, the radio remains working.
Quoted 4 lines
And what's worst, connecting analog TV antenna (cable TV) affects the radio tuner! E.g. the radio is tuned to 106.0 MHz (real 101.80 MHz) with nice clean sound. Connecting TV antenna adds strong noise to the sound, tuning does not help. This problem is not present in Windows.
I've found a tiny chip marked S79 near the analog tuner. It's Skyworks AS179-92LF antenna switch that switches either the TV or FM antenna to the TDA18271 FM_IN pin! That's why TV antenna affected the radio. The switch is probably controlled by some other GPIO pin (haven't tested this yet). What's the best way to expose this switch to userspace?
Signature · 1 line
Ondrej Zary
Quoted 42 lines · On Monday 14 January 2013 22:29:58 Ondrej Zary wrote:
Quoted 18 lines · On Saturday 12 January 2013 21:24:50 Ondrej Zary wrote:
Partially working: FM radio
Radio seems to be a long-standing problem with saa7134 cards using silicon tuners (according to various mailing lists).On this card, GPIO11 controls 74HC4052 MUX. It switches two things:
something at TDA18271V_IFAGCpin and something that goes to SAA7131E. GPIO11 is enabled for radio and disabled for TV in Windows. I did the same thing in this patch.Windows INF file says:
; Setting FM radio of the Silicon tuner via SIF (GPIO 21 in use/ 5.5MHz) HKR, "Audio", "FM Radio IF",0x00010001,0xDEEAABBut that seems not to be true. GPIO21 does nothing and RegSpy (from DScaler, modified to include
0x42cregister) says that the register is0x80729555. That matches the value present insaa7134-tvaudio.c(except the first0x80).Quoted 6 lines
With this value, the radio stations are off by about 4.2-4.3 MHz, e.g.:
station at 97.90 MHz is tuned as 102.20 MHz
station at 101.80 MHz is tuned as 106.0 MHzI also tried
0xDEEAAB. With this, the offset is different, about 0.4 MHz:
station at 101.80 MHz is tuned as 102.2 MHzThe offset seems bogus, maybe affected by my TV antenna (cable).
For debugging, tried another card with similar chips: Pinnacle PCTV 40i/50i/110i. It has SAA7131E chip too, but different tuner - TDA8275A. And the radio problem is the same as found first on the A706 - the tuned station sound starts but then turns into noise. So it seems that the problem is not in tda18271 but in tda8290 or saa7134.
With tda8290.debug=1, I see this:
tda829x 2-004b: tda8290 not locked, no signal?
tda829x 2-004b: tda8290 not locked, no signal?
tda829x 2-004b: tda8290 not locked, no signal?
tda829x 2-004b: adjust gain, step 1. Agc: 193, ADC stat: 255, lock: 0 tda829x 2-004b: adjust gain, step 2. Agc: 255, lock: 0 tda829x 2-004b: adjust gain, step 3. Agc: 173
Quoted 4 lines
During that, the sound is good. Then it turns into noise.
When I increased the number of lock detections intda8290_set_params()from 3 to (e.g.) 10, it works longer. And when I'm quick enough to stop the console output using scroll lock, the radio remains working.
Pinnacle radio problems turned out to be a different bug - the driver turns off tuners when the radio device is closed - and I was testing using v4l2-ctl. Fixing that allows Pinnacle to work fine.
But it's not enough for A706 to work. When I disable gain adjust in tda8290 (by putting a return before), strong stations work somehow (with noise).
Quoted 10 lines
Quoted 4 lines
And what's worst, connecting analog TV antenna (cable TV) affects the radio tuner! E.g. the radio is tuned to 106.0 MHz (real 101.80 MHz) with nice clean sound. Connecting TV antenna adds strong noise to the sound, tuning does not help. This problem is not present in Windows.
I've found a tiny chip marked S79 near the analog tuner. It's Skyworks AS179-92LF antenna switch that switches either the TV or FM antenna to the TDA18271
FM_INpin! That's why TV antenna affected the radio. The switch is probably controlled by some other GPIO pin (haven't tested this yet). What's the best way to expose this switch to userspace?
This switch is controlled by GPIO12 (use TV antenna for radio) and GPIO13 (use FM antenna for radio). However, both these pins are tri-stated in Windows - voltage is about 2.2V then, enabling both antennas.
Signature · 1 line
Ondrej Zary
Quoted 48 lines · On Tuesday 15 January 2013 22:57:06 Ondrej Zary wrote:
Quoted 42 lines · On Monday 14 January 2013 22:29:58 Ondrej Zary wrote:
Quoted 18 lines · On Saturday 12 January 2013 21:24:50 Ondrej Zary wrote:
Partially working: FM radio
Radio seems to be a long-standing problem with saa7134 cards using silicon tuners (according to various mailing lists).On this card, GPIO11 controls 74HC4052 MUX. It switches two things:
something at TDA18271V_IFAGCpin and something that goes to SAA7131E. GPIO11 is enabled for radio and disabled for TV in Windows. I did the same thing in this patch.Windows INF file says:
; Setting FM radio of the Silicon tuner via SIF (GPIO 21 in use/ 5.5MHz) HKR, "Audio", "FM Radio IF",0x00010001,0xDEEAABBut that seems not to be true. GPIO21 does nothing and RegSpy (from DScaler, modified to include
0x42cregister) says that the register is0x80729555. That matches the value present insaa7134-tvaudio.c(except the first0x80).Quoted 6 lines
With this value, the radio stations are off by about 4.2-4.3 MHz, e.g.:
station at 97.90 MHz is tuned as 102.20 MHz
station at 101.80 MHz is tuned as 106.0 MHzI also tried
0xDEEAAB. With this, the offset is different, about 0.4
MHz: station at 101.80 MHz is tuned as 102.2 MHzThe offset seems bogus, maybe affected by my TV antenna (cable).
For debugging, tried another card with similar chips: Pinnacle PCTV 40i/50i/110i. It has SAA7131E chip too, but different tuner - TDA8275A. And the radio problem is the same as found first on the A706 - the tuned station sound starts but then turns into noise. So it seems that the problem is not in tda18271 but in tda8290 or saa7134.
With tda8290.debug=1, I see this:
tda829x 2-004b: tda8290 not locked, no signal?
tda829x 2-004b: tda8290 not locked, no signal?
tda829x 2-004b: tda8290 not locked, no signal?
tda829x 2-004b: adjust gain, step 1. Agc: 193, ADC stat: 255, lock: 0 tda829x 2-004b: adjust gain, step 2. Agc: 255, lock: 0 tda829x 2-004b: adjust gain, step 3. Agc: 173Quoted 4 lines
During that, the sound is good. Then it turns into noise. When I increased the number of lock detections in
tda8290_set_params()from 3 to (e.g.) 10, it works longer. And when I'm quick enough to stop the console output using scroll lock, the radio remains working.
Quoted 6 lines
Pinnacle radio problems turned out to be a different bug - the driver turns off tuners when the radio device is closed - and I was testing using v4l2-ctl. Fixing that allows Pinnacle to work fine.
But it's not enough for A706 to work. When I disable gain adjust in tda8290 (by putting a return before), strong stations work somehow (with noise).
Changing IF frequency from 1.25MHz (1250) to 5.5MHz (5500) in tda18271-maps.c allows the radio to work without disabling gain adjust. Seems that IF mismatch between tda18271 and saa7134 is causing problems. However, only strong stations work.
Signature · 1 line
Ondrej Zary
Quoted 53 lines · On Tuesday 15 January 2013 23:37:58 Ondrej Zary wrote:
Quoted 52 lines · On Tuesday 15 January 2013 22:57:06 Ondrej Zary wrote:
Quoted 42 lines · On Monday 14 January 2013 22:29:58 Ondrej Zary wrote:
Quoted 18 lines · On Saturday 12 January 2013 21:24:50 Ondrej Zary wrote:
Partially working: FM radio
Radio seems to be a long-standing problem with saa7134 cards using silicon tuners (according to various mailing lists).On this card, GPIO11 controls 74HC4052 MUX. It switches two things:
something at TDA18271V_IFAGCpin and something that goes to SAA7131E. GPIO11 is enabled for radio and disabled for TV in Windows. I did the same thing in this patch.Windows INF file says:
; Setting FM radio of the Silicon tuner via SIF (GPIO 21 in use/ 5.5MHz) HKR, "Audio", "FM Radio IF",0x00010001,0xDEEAABBut that seems not to be true. GPIO21 does nothing and RegSpy (from DScaler, modified to include
0x42cregister) says that the register is0x80729555. That matches the value present insaa7134-tvaudio.c(except the first0x80).Quoted 6 lines
With this value, the radio stations are off by about 4.2-4.3 MHz, e.g.: station at 97.90 MHz is tuned as 102.20 MHz station at 101.80 MHz is tuned as 106.0 MHz
I also tried
0xDEEAAB. With this, the offset is different, about 0.4
MHz: station at 101.80 MHz is tuned as 102.2 MHzThe offset seems bogus, maybe affected by my TV antenna (cable).
For debugging, tried another card with similar chips: Pinnacle PCTV 40i/50i/110i. It has SAA7131E chip too, but different tuner - TDA8275A. And the radio problem is the same as found first on the A706 - the tuned station sound starts but then turns into noise. So it seems that the problem is not in tda18271 but in tda8290 or saa7134.
With tda8290.debug=1, I see this:
tda829x 2-004b: tda8290 not locked, no signal?
tda829x 2-004b: tda8290 not locked, no signal?
tda829x 2-004b: tda8290 not locked, no signal?
tda829x 2-004b: adjust gain, step 1. Agc: 193, ADC stat: 255, lock: 0 tda829x 2-004b: adjust gain, step 2. Agc: 255, lock: 0 tda829x 2-004b: adjust gain, step 3. Agc: 173Quoted 4 lines
During that, the sound is good. Then it turns into noise. When I increased the number of lock detections in
tda8290_set_params()from 3 to (e.g.) 10, it works longer. And when I'm quick enough to stop the console output using scroll lock, the radio remains working.Pinnacle radio problems turned out to be a different bug - the driver turns off tuners when the radio device is closed - and I was testing using v4l2-ctl. Fixing that allows Pinnacle to work fine.
Quoted 8 lines
Quoted 3 lines
But it's not enough for A706 to work. When I disable gain adjust in tda8290 (by putting a return before), strong stations work somehow (with noise).
Changing IF frequency from 1.25MHz (1250) to 5.5MHz (5500) in
tda18271-maps.callows the radio to work without disabling gain adjust. Seems that IF mismatch between tda18271 and saa7134 is causing problems. However, only strong stations work.
Got it finally! With .if_freq=5500 and .fm_rfn=0, the radio works perfectly. Now only to find a way how to set a custom std_map...
Signature · 1 line
Ondrej Zary