I have one of these. Are you sure there are TDA9874H chips? I have one
on the daughter card. Where is the other one?
Anyway, you need something to initialise the TAD9874. I hacked on the
TDA9875 driver, removing most of it. All I have is an init function
which sets the chip up into NICAM B/G for me. You probably need to
alter this for your needs. Get the data sheet from the Philips site
here:
http://www-us6.semiconductors.com/acrobat/datasheets/TDA9874H_2.pdf
Most of the setup should be right, just look at the ESP register setting
and page 42 of the datasheet.
I'll put the code down the bottom.
I load the following modules:
modprobe i2c-core
modprobe tuner
modprobe tda9874
modprobe bttv
in the bttv-cards.c file I have:
name: "FlyVideo 2000S",
video_inputs: 3,
audio_inputs: 1,
tuner: 0,
svhs: 2,
gpiomask: 0x18e0,
muxsel: {2, 3, 0, 1},
audiomux: { 0x1000, 0x080, 0, 0, 0, 0 },
pll: PLL_28,
tuner_type: TUNER_PHILIPS_PAL,
I haven't actually had time to really test this (had the parameters in
the modules.conf file and transferred them to here).
This still needs a lot more work. tda9874.c needs to have parameters
for video standard etc.
Let me know whether this works for you.
Alistair
> Gyalókay Szabolcs wrote:
>
> Hi there,
>
> I have one of these awful Flyvideo 2000s cards, and I try to get it
> going under Linux. I ended up with this:
>
> /* DeeJay <[EMAIL PROTECTED] */
> name: "Lifeview FlyVideo 2000S",
> video_inputs: 3,
> audio_inputs: 3,
> tuner: 0,
> svhs: 2,
> gpiomask: 0x18e0,
> muxsel: { 2, 3, 0, 1},
> audiomux: { 0x000000,0x0018e0,0x001000,0x001000,0x001080,0x001080 },
> needs_tvaudio: 1,
> pll: PLL_28,
> tuner_type: 5,
>
> This is working with mono sound and with vertical bars in some of the
> channels. Stereo sound and recording with xawtv isn't working. Radio
> is working, but sounds disgusting. I tried out this btInspector
> program, which gave this results:
>
> Data1: "Flyvideo 2000s",
> Data2: 0x0000007b, {2, 3, 0, 1}, 2, 0x00000002, 0x00000000,
> Data3: 0x0018e0, 0x000000, 0x001000, 0x000000, 0x001000, 0x000800,
> 0x001080, 0x001080
> Info1: 878,11, b0 c2
> Info2: [Studio - Video]
> My question is, how can I make stereo and recording to work with the
> help of this data? And can those vertical bars be avoided? On this
> card there are LG tuners which work like the ones of Philipps, but
> there are less channels with bars under Windows. There are two
> TDA9874h chips on the board, I think those are in charge for stereo.
>
> Thanks.
> Bye
>
> DeeJay
-------------------drivers/media/video/tda9874.c-----------------
/*
* For the TDA9874 chip
* This driver will not complain if used with any
* other i2c device with the same address.
*
* Copyright (c) 2001 Alistair Lambie ([EMAIL PROTECTED])
* This code is placed under the terms of the GNU General Public License
* Based on tda9875.c by Guillaume Delvit, Gerd Knorr and Eric Sandeen
* Which was based on tda9855.c by Steve VanDeBogart
([EMAIL PROTECTED])
* Which was based on tda8425.c by Greg Alexander (c) 1998
*
* OPTIONS:
* debug - set to 1 if you'd like to see debug messages
*
* Revision: 0.1 - original version
*/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/string.h>
#include <linux/timer.h>
#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/malloc.h>
#include <linux/videodev.h>
#include <linux/i2c.h>
#include <linux/i2c-algo-bit.h>
#include "bttv.h"
#include "audiochip.h"
#include "id.h"
MODULE_PARM(debug,"i");
static int debug = 0; /* insmod parameter */
/* Addresses to scan */
static unsigned short normal_i2c[] = {
I2C_TDA9874 >> 1,
I2C_CLIENT_END};
static unsigned short normal_i2c_range[] = {I2C_CLIENT_END};
static unsigned short probe[2] = { I2C_CLIENT_END, I2C_CLIENT_END
};
static unsigned short probe_range[2] = { I2C_CLIENT_END, I2C_CLIENT_END
};
static unsigned short ignore[2] = { I2C_CLIENT_END, I2C_CLIENT_END
};
static unsigned short ignore_range[2] = { I2C_CLIENT_END, I2C_CLIENT_END
};
static unsigned short force[2] = { I2C_CLIENT_END, I2C_CLIENT_END
};
static struct i2c_client_address_data addr_data = {
normal_i2c, normal_i2c_range,
probe, probe_range,
ignore, ignore_range,
force
};
/* This is a superset of the TDA9874 */
struct tda9874 {
int mode;
int rvol, lvol;
int bass, treble;
struct i2c_client c;
};
static struct i2c_driver driver;
static struct i2c_client client_template;
#define dprintk if (debug) printk
/* The TDA9874 is made by Philips Semiconductor
* http://www.semiconductors.philips.com
* TDA9874: I2C-bus controlled DSP audio processor, FM demodulator
*
*/
/* subaddresses for TDA9874 */
#define TDA9874_AGCGR 0x00
#define TDA9874_GCONR 0x01
#define TDA9874_MSR 0x02
#define TDA9874_C1FRA 0x03
#define TDA9874_C1FRB 0x04
#define TDA9874_C1FRC 0x05
#define TDA9874_C2FRA 0x06
#define TDA9874_C2FRB 0x07
#define TDA9874_C2FRC 0x08
#define TDA9874_DCR 0x09
#define TDA9874_FMER 0x0a
#define TDA9874_FMMR 0x0b
#define TDA9874_C1OLAR 0x0c
#define TDA9874_C2OLAR 0x0d
#define TDA9874_NCONR 0x0e
#define TDA9874_NOLAR 0x0f
#define TDA9874_NLELR 0x10
#define TDA9874_NUELR 0x11
#define TDA9874_AMCONR 0x12
#define TDA9874_SDACOSR 0x13
#define TDA9874_AOSR 0x14
#define TDA9874_DAICONR 0x15
#define TDA9874_I2SOSR 0x16
#define TDA9874_I2SOLAR 0x17
#define TDA9874_MDACOSR 0x18
#define TDA9874_ESP 0xFF
/* values */
#define TDA9874_MUTE_ON 0xff /* general mute */
#define TDA9874_MUTE_OFF 0xf9 /* general no mute */
/* Begin code */
static int tda9874_write(struct i2c_client *client, int subaddr,
unsigned char val)
{
unsigned char buffer[2];
dprintk("In tda9874_write\n");
dprintk("Writing %d 0x%x\n", subaddr, val);
buffer[0] = subaddr;
buffer[1] = val;
if (2 != i2c_master_send(client,buffer,2)) {
printk(KERN_WARNING "tda9874: I/O error, trying (write %d 0x%x)\n",
subaddr, val);
return -1;
}
return 0;
}
#if 0
static int tda9874_read(struct i2c_client *client)
{
unsigned char buffer;
dprintk("In tda9874_read\n");
if (1 != i2c_master_recv(client,&buffer,1)) {
printk(KERN_WARNING "tda9874: I/O error, trying (read)\n");
return -1;
}
dprintk("Read 0x%02x\n", buffer);
return buffer;
}
#endif
static void do_tda9874_init(struct i2c_client *client)
{
struct tda9874 *t = client->data;
dprintk("In tda9874_init\n");
tda9874_write(client, TDA9874_AGCGR, 0x00 );
tda9874_write(client, TDA9874_GCONR, 0xc1 );
tda9874_write(client, TDA9874_MSR, 0x00 );
tda9874_write(client, TDA9874_FMMR, 0x80 );
tda9874_write(client, TDA9874_NCONR, 0x04 );
tda9874_write(client, TDA9874_AMCONR, 0xf9 );
tda9874_write(client, TDA9874_SDACOSR, 0x81 );
tda9874_write(client, TDA9874_AOSR, 0x80 );
tda9874_write(client, TDA9874_MDACOSR, 0x82 );
tda9874_write(client, TDA9874_ESP, 0x06 );
}
/* *********************** *
* i2c interface functions *
* *********************** */
static int tda9874_attach(struct i2c_adapter *adap, int addr,
unsigned short flags, int kind)
{
struct tda9874 *t;
struct i2c_client *client;
dprintk("In tda9874_attach\n");
t = kmalloc(sizeof *t,GFP_KERNEL);
if (!t)
return -ENOMEM;
memset(t,0,sizeof *t);
client = &t->c;
memcpy(client,&client_template,sizeof(struct i2c_client));
client->adapter = adap;
client->addr = addr;
client->data = t;
do_tda9874_init(client);
MOD_INC_USE_COUNT;
strcpy(client->name,"TDA9874");
printk(KERN_INFO "tda9874: init\n");
i2c_attach_client(client);
return 0;
}
static int tda9874_probe(struct i2c_adapter *adap)
{
if (adap->id == (I2C_ALGO_BIT | I2C_HW_B_BT848))
return i2c_probe(adap, &addr_data, tda9874_attach);
return 0;
}
static int tda9874_detach(struct i2c_client *client)
{
struct tda9874 *t = client->data;
do_tda9874_init(client);
i2c_detach_client(client);
kfree(t);
MOD_DEC_USE_COUNT;
return 0;
}
static int tda9874_command(struct i2c_client *client,
unsigned int cmd, void *arg)
{
struct tda9874 *t = client->data;
dprintk("In tda9874_command...\n");
return 0;
}
static struct i2c_driver driver = {
"i2c tda9874 driver",
I2C_DRIVERID_TDA9874, /* Get new one for TDA9874 */
I2C_DF_NOTIFY,
tda9874_probe,
tda9874_detach,
tda9874_command,
};
static struct i2c_client client_template =
{
"(unset)", /* name */
-1,
0,
0,
NULL,
&driver
};
#ifdef MODULE
int init_module(void)
#else
int tda9874_init(void)
#endif
{
i2c_add_driver(&driver);
return 0;
}
#ifdef MODULE
void cleanup_module(void)
{
i2c_del_driver(&driver);
}
#endif
/*
* Local variables:
* c-basic-offset: 8
* End:
*/
_______________________________________________
Video4linux-list mailing list
[EMAIL PROTECTED]
https://listman.redhat.com/mailman/listinfo/video4linux-list