Kezdőlap › Fórumok › UHU Linux › Általános UHU problémák, javaslatok › ManLi TV kártya
- This topic has 2 hozzászólás, 2 résztvevő, and was last updated 22 years, 5 months telt el by
admin.
-
SzerzőBejegyzés
-
2004-02-07-01:56 #1929219
Nem kéne ide bemásolni mindent, amit találsz!
Elég egy rövid lényegretörõ kérdés is.
Azt se írtad le, a tv kártyádnak milyen chip setje van…Ha saa7134, akkor a 6.X kernel alapból ismeri, a többinél le kell forgatni ezt
SziLaj
2004-02-08-17:40 #1929220haly
gcbttv is a Perl script with a nice GUI that helps you to find the correct module options for your TV card. It use Perl-GTK, and it writes the correct options to /etc/modules.conf and .xawtv.2009-12-04-19:55 #1872554Ezt találtam a neten..
http://www.spinics.net/lists/kernel/msg236766.html
Szóval most már ha benne lesz az UHUban a v4Lin akkor menni fog a TV kártyám????
[patch] v4l-09 saa7134 driver update
To: Andrew Morton , Kernel List
Subject: [patch] v4l-09 saa7134 driver update
From: Gerd Knorr
Date: Thu, 15 Jan 2004 13:00:11 +0100
Sender: [email protected]
User-agent: Mutt/1.5.3iHi,
This is a saa7134 driver update. Changes:
* add infrared remote support.
* add support for more TV cards.
* misc minor fixes.This patch depends on the ir-input patch.
Gerd
diff -u linux-2.6.1/drivers/media/video/saa7134/Makefile linux/drivers/media/video/saa7134/Makefile
— linux-2.6.1/drivers/media/video/saa7134/Makefile2004-01-14 15:07:00.000000000 +0100
+++ linux/drivers/media/video/saa7134/Makefile2004-01-14 15:09:36.000000000 +0100
@@ -1,7 +1,7 @@saa7134-objs :=saa7134-cards.o saa7134-core.o saa7134-i2c.o
saa7134-oss.o saa7134-ts.o saa7134-tvaudio.o
-saa7134-vbi.o saa7134-video.o
+saa7134-vbi.o saa7134-video.o saa7134-input.oobj-$(CONFIG_VIDEO_SAA7134) += saa7134.o
diff -u linux-2.6.1/drivers/media/video/saa7134/saa6752hs.c linux/drivers/media/video/saa7134/saa6752hs.c
— linux-2.6.1/drivers/media/video/saa7134/saa6752hs.c2004-01-14 15:06:51.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa6752hs.c2004-01-14 15:09:36.000000000 +0100
@@ -168,13 +168,13 @@
}// wait a bit
-current->state = TASK_INTERRUPTIBLE;
-schedule_timeout(1);
+set_current_state(TASK_INTERRUPTIBLE);
+schedule_timeout(HZ/100);
}// delay a bit to let encoder settle
-current->state = TASK_INTERRUPTIBLE;
-schedule_timeout(5);
+set_current_state(TASK_INTERRUPTIBLE);
+schedule_timeout(HZ/20);// done
return status;
@@ -230,6 +230,7 @@
static int saa6752hs_init(struct i2c_client* client, struct mpeg_params* params)
{
unsigned char buf[3];
+void *data;// check the bitrate parameters first
if (params != NULL) {
@@ -281,12 +282,13 @@
i2c_master_send(client,buf,3);// setup bitrate settings
+data = i2c_get_clientdata(client);
if (params) {
saa6752hs_set_bitrate(client, params);
-memcpy(client->data, params, sizeof(struct mpeg_params));
+memcpy(data, params, sizeof(struct mpeg_params));
} else {
// parameters were not supplied. use the previous set
– saa6752hs_set_bitrate(client, (struct mpeg_params*) client->data);
+ saa6752hs_set_bitrate(client, (struct mpeg_params*) data);
}// Send SI tables
@@ -324,7 +326,7 @@
if (NULL == (params = kmalloc(sizeof(struct mpeg_params), GFP_KERNEL)))
return -ENOMEM;
memcpy(params,&mpeg_params_template,sizeof(struct mpeg_params));
-client->data = params;
+i2c_set_clientdata(client, params);i2c_attach_client(client);
@@ -341,8 +343,11 @@
static int saa6752hs_detach(struct i2c_client *client)
{
+void *data;
+
+data = i2c_get_clientdata(client);
i2c_detach_client(client);
-kfree(client->data);
+kfree(data);
kfree(client);
return 0;
}
diff -u linux-2.6.1/drivers/media/video/saa7134/saa7134-cards.c linux/drivers/media/video/saa7134/saa7134-cards.c
— linux-2.6.1/drivers/media/video/saa7134/saa7134-cards.c2004-01-14 15:06:28.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa7134-cards.c2004-01-14 15:09:36.000000000 +0100
@@ -2,7 +2,7 @@
* device driver for philips saa7134 based TV cards
* card-specific stuff.
*
– * © 2001,02 Gerd Knorr [SuSE Labs]
+ * © 2001-03 Gerd Knorr [SuSE Labs]
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -70,6 +70,10 @@
.amux = LINE2,
.tv = 1,
}},
+.radio = {
+.name = name_radio,
+.amux = LINE2,
+},
},
[SAA7134_BOARD_FLYVIDEO3000] = {
/* „Marco d’Itri” */
@@ -235,7 +239,8 @@
},
},
[SAA7134_BOARD_TVSTATION_RDS] = {
-.name= „KNC One TV-Station RDS”,
+ /* Typhoon TV Tuner RDS: Art.Nr. 50694 */
+.name= „KNC One TV-Station RDS / Typhoon TV Tuner RDS”,
.audio_clock= 0x00200000,
.tuner_type= TUNER_PHILIPS_FM1216ME_MK3,
.need_tda9887 = 1,
@@ -245,18 +250,61 @@
.amux = TV,
.tv = 1,
},{
+.name = name_tv_mono,
+ .vmux = 1,
+ .amux = LINE2,
+ .tv = 1,
+ },{
+
+.name = name_svideo,
+.vmux = 8,
+.amux = LINE1,
+},{
.name = name_comp1,
-.vmux = 2,
+.vmux = 3,
.amux = LINE1,
},{
-.name = name_comp2,
+
+ .name = „CVid over SVid”,
+ .vmux = 0,
+ .amux = LINE1,
+ }},
+.radio = {
+.name = name_radio,
+.amux = LINE2,
+},
+},
+[SAA7134_BOARD_TVSTATION_DVR] = {
+.name= „KNC One TV-Station DVR”,
+.audio_clock= 0x00200000,
+.tuner_type= TUNER_PHILIPS_FM1216ME_MK3,
+.need_tda9887= 1,
+.gpiomask= 0x820000,
+.inputs= {{
+.name = name_tv,
+.vmux = 1,
+.amux = LINE2,
+.tv = 1,
+.gpio = 0x20000,
+},{
+.name = name_svideo,
+.vmux = 8,
+.amux = LINE1,
+.gpio = 0x20000,
+},{
+.name = name_comp1,
.vmux = 3,
.amux = LINE1,
+.gpio = 0x20000,
}},
-.radio = {
+.radio= {
.name = name_radio,
.amux = LINE2,
+.gpio = 0x20000,
},
+.i2s_rate= 48000,
+.has_ts= 1,
+.video_out= CCIR656,
},
[SAA7134_BOARD_CINERGY400] = {
.name = „Terratec Cinergy 400 TV”,
@@ -283,7 +331,7 @@
},
[SAA7134_BOARD_MD5044] = {
.name = „Medion 5044”,
-.audio_clock = 0x00200000,
+.audio_clock = 0x00187de7, // was: 0x00200000,
.tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
.need_tda9887 = 1,
.inputs = {{
@@ -393,11 +441,11 @@
},
},
[SAA7134_BOARD_TYPHOON_90031] = {
-/* Christian Rothl?nder */
+/* aka Typhoon „TV+Radio”, Art.Nr 90031 */
+/* Tom Zoerner */
.name = „Typhoon TV+Radio 90031”,
.audio_clock = 0x00200000,
-//.tuner_type = TUNER_PHILIPS_PAL,
-.tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
+.tuner_type = TUNER_PHILIPS_PAL,
.need_tda9887 = 1,
.inputs = {{
.name = name_tv,
@@ -450,6 +498,11 @@
.vmux = 8,
.amux = TV,
.tv = 1,
+},{
+.name = name_tv_mono,
+.vmux = 8,
+.amux = LINE2,
+.tv = 1,
}},
},
[SAA7134_BOARD_ASUSTeK_TVFM7134] = {
@@ -505,6 +558,45 @@
.tv = 1,
}},
},
+[SAA7134_BOARD_10MOONSTVMASTER] = {
+/* „lilicheng” */
+.name = „10MOONS PCI TV CAPTURE CARD”,
+.audio_clock = 0x00200000,
+.tuner_type = TUNER_LG_PAL_NEW_TAPC,
+.gpiomask = 0xe000,
+.inputs = {{
+.name = name_tv,
+.vmux = 1,
+.amux = LINE2,
+.gpio = 0x0000,
+.tv = 1,
+},{
+.name = name_comp1,
+.vmux = 0,
+.amux = LINE2,
+.gpio = 0x4000,
+},{
+.name = name_comp2,
+.vmux = 3,
+.amux = LINE2,
+.gpio = 0x4000,
+},{
+.name = name_svideo,
+.vmux = 8,
+.amux = LINE2,
+.gpio = 0x4000,
+}},
+ .radio = {
+ .name = name_radio,
+ .amux = LINE2,
+.gpio = 0x2000,
+ },
+.mute = {
+.name = name_mute,
+ .amux = LINE2,
+.gpio = 0x8000,
+},
+},
[SAA7134_BOARD_BMK_MPEX_NOTUNER] = {
/* „Andrew de Quincey” */
.name= „BMK MPEX No Tuner”,
@@ -555,13 +647,224 @@
}},
},
[SAA7134_BOARD_CRONOS_PLUS] = {
+/* gpio pins:
+ 0 .. 3 BASE_ID
+ 4 .. 7 PROTECT_ID
+ 8 .. 11 USER_OUT
+ 12 .. 13 USER_IN
+ 14 .. 15 VIDIN_SEL */
.name = „Matrox CronosPlus”,
.tuner_type = TUNER_ABSENT,
+.gpiomask = 0xcf00,
+ .inputs = {{
+ .name = name_comp1,
+ .vmux = 0,
+.gpio = 2 */
+.name = „BMK MPEX Tuner”,
+.audio_clock = 0x200000,
+.tuner_type = TUNER_PHILIPS_PAL,
+.inputs = {{
+.name = name_comp1,
+.vmux = 1,
+.amux = LINE1,
+},{
+.name = name_svideo,
+.vmux = 8,
+.amux = LINE1,
+},{
+.name = name_tv,
+.vmux = 3,
+.amux = LINE2,
+.tv = 1,
+}},
+.i2s_rate = 48000,
+.has_ts = 1,
+.video_out = CCIR656,
+ },
+ [SAA7134_BOARD_ASUSTEK_TVFM7133] = {
+ .name = „ASUS TV-FM 7133”,
+ .audio_clock = 0x00187de7,
+ .tuner_type = TUNER_PHILIPS_FM1236_MK3,
+ .need_tda9887 = 1,
+ .inputs = {{
+ .name = name_tv,
+ .vmux = 1,
+ .amux = TV,
+ .tv = 1,
+ }},
+ .radio = {
+ .name = name_radio,
+ .amux = LINE1,
+ },
+ },
+[SAA7134_BOARD_PINNACLE_PCTV_STEREO] = {
+ .name = „Pinnacle PCTV Stereo (saa7134)”,
+ .audio_clock = 0x00187de7,
+ .tuner_type = TUNER_MT2032,
+ .need_tda9887 = 1,
.inputs = {{
+ .name = name_tv,
+ .vmux = 3,
+ .amux = TV,
+ .tv = 1,
+ },{
.name = name_comp1,
.vmux = 0,
+ .amux = LINE2,
+ },{
+ .name = name_comp2,
+ .vmux = 1,
+ .amux = LINE2,
+ },{
+ .name = name_svideo,
+ .vmux = 8,
+ .amux = LINE2,
}},
},
+[SAA7134_BOARD_MANLI_MTV002] = {
+/* Ognjen Nastic */
+.name = „Manli MuchTV M-TV002”,
+.audio_clock = 0x00200000,
+.tuner_type = TUNER_PHILIPS_PAL,
+.inputs = {{
+.name = name_svideo,
+.vmux = 8,
+.amux = LINE1,
+},{
+.name = name_comp1,
+.vmux = 1,
+.amux = LINE1,
+},{
+.name = name_tv,
+.vmux = 3,
+.amux = LINE2,
+.tv = 1,
+}},
+.radio = {
+.name = name_radio,
+.amux = LINE2,
+},
+},
+[SAA7134_BOARD_MANLI_MTV001] = {
+/* Ognjen Nastic UNTESTED */
+.name = „Manli MuchTV M-TV001”,
+.audio_clock = 0x00200000,
+.tuner_type = TUNER_PHILIPS_PAL,
+.inputs = {{
+.name = name_svideo,
+.vmux = 8,
+.amux = LINE1,
+},{
+.name = name_comp1,
+.vmux = 1,
+.amux = LINE1,
+},{
+.name = name_tv,
+.vmux = 3,
+.amux = LINE2,
+.tv = 1,
+}},
+ },
+[SAA7134_BOARD_TG3000TV] = {
+/* TransGear 3000TV */
+.name = „Nagase Sangyo TransGear 3000TV”,
+.audio_clock = 0x00187de7,
+.tuner_type = TUNER_PHILIPS_NTSC_M,
+.inputs = {{
+.name = name_tv,
+.vmux = 1,
+.amux = LINE2,
+.tv = 1,
+},{
+.name = name_comp1,
+.vmux = 3,
+.amux = LINE2,
+},{
+.name = name_svideo,
+.vmux = 8,
+.amux = LINE2,
+}},
+},
+ [SAA7134_BOARD_ECS_TVP3XP] = {
+ .name = „Elitegroup ECS TVP3XP FM1216 Tuner Card”,
+ .audio_clock = 0x187de7, // xtal 32.1 MHz
+ .tuner_type = TUNER_PHILIPS_PAL,
+ .inputs = {{
+ .name = name_tv,
+ .vmux = 1,
+ .amux = TV,
+ .tv = 1,
+ },{
+ .name = name_tv_mono,
+ .vmux = 1,
+ .amux = LINE2,
+ .tv = 1,
+ },{
+ .name = name_comp1,
+ .vmux = 3,
+ .amux = LINE1,
+ },{
+ .name = name_svideo,
+ .vmux = 8,
+ .amux = LINE1,
+},{
+.name = „CVid over SVid”,
+.vmux = 0,
+.amux = LINE1,
+}},
+ .radio = {
+ .name = name_radio,
+ .amux = LINE2,
+ },
+ },
};
const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards);@@ -613,6 +916,12 @@
.driver_data = SAA7134_BOARD_FLYVIDEO3000,
},{
.vendor = PCI_VENDOR_ID_PHILIPS,
+ .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
+ .subvendor = 0x4e42,//”Typhoon PCI Capture TV Card” Art.No. 50673
+ .subdevice = 0x0138,
+ .driver_data = SAA7134_BOARD_FLYVIDEO3000,
+ },{
+.vendor = PCI_VENDOR_ID_PHILIPS,
.device = PCI_DEVICE_ID_PHILIPS_SAA7130,
.subvendor = 0x5168,
.subdevice = 0x0138,
@@ -648,11 +957,35 @@
.subdevice = 0x4830,
.driver_data = SAA7134_BOARD_ASUSTeK_TVFM7134,
},{
+ .vendor = PCI_VENDOR_ID_PHILIPS,
+ .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
+ .subvendor = PCI_VENDOR_ID_ASUSTEK,
+ .subdevice = 0x4843,
+ .driver_data = SAA7134_BOARD_ASUSTEK_TVFM7133,
+},{
+ .vendor = PCI_VENDOR_ID_PHILIPS,
+ .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
+ .subvendor = PCI_VENDOR_ID_ASUSTEK,
+ .subdevice = 0x4840,
+ .driver_data = SAA7134_BOARD_ASUSTeK_TVFM7134,
+ },{
.vendor = PCI_VENDOR_ID_PHILIPS,
.device = PCI_DEVICE_ID_PHILIPS_SAA7134,
.subvendor = PCI_VENDOR_ID_PHILIPS,
.subdevice = 0xfe01,
-.driver_data = SAA7134_BOARD_TYPHOON_90031,
+.driver_data = SAA7134_BOARD_TVSTATION_RDS,
+},{
+.vendor = PCI_VENDOR_ID_PHILIPS,
+.device = PCI_DEVICE_ID_PHILIPS_SAA7134,
+.subvendor = 0x1894,
+.subdevice = 0xfe01,
+.driver_data = SAA7134_BOARD_TVSTATION_RDS,
+},{
+.vendor = PCI_VENDOR_ID_PHILIPS,
+.device = PCI_DEVICE_ID_PHILIPS_SAA7134,
+.subvendor = 0x1894,
+.subdevice = 0xa006,
+.driver_data = SAA7134_BOARD_TVSTATION_DVR,
},{
.vendor = PCI_VENDOR_ID_PHILIPS,
.device = PCI_DEVICE_ID_PHILIPS_SAA7134,
@@ -661,6 +994,12 @@
.driver_data = SAA7134_BOARD_VA1000POWER,
},{
.vendor = PCI_VENDOR_ID_PHILIPS,
+.device = PCI_DEVICE_ID_PHILIPS_SAA7130,
+ .subvendor = PCI_VENDOR_ID_PHILIPS,
+ .subdevice = 0x2001,
+.driver_data = SAA7134_BOARD_10MOONSTVMASTER,
+ },{
+.vendor = PCI_VENDOR_ID_PHILIPS,
.device = PCI_DEVICE_ID_PHILIPS_SAA7133,
.subvendor = 0x185b,
.subdevice = 0xc100,
@@ -672,6 +1011,38 @@
.subdevice = 0x48d0,
.driver_data = SAA7134_BOARD_CRONOS_PLUS,
},{
+.vendor = PCI_VENDOR_ID_PHILIPS,
+.device = PCI_DEVICE_ID_PHILIPS_SAA7134,
+ .subvendor = 0x1461, /* Avermedia Technologies Inc */
+ .subdevice = 0xa70b,
+.driver_data = SAA7134_BOARD_MD2819,
+},{
+/* AverMedia Studio 305, using AverMedia M156 entry for now */
+.vendor = PCI_VENDOR_ID_PHILIPS,
+.device = PCI_DEVICE_ID_PHILIPS_SAA7134,
+ .subvendor = 0x1461, /* Avermedia Technologies Inc */
+ .subdevice = 0x2115,
+.driver_data = SAA7134_BOARD_MD2819,
+ },{
+/* TransGear 3000TV */
+.vendor = PCI_VENDOR_ID_PHILIPS,
+.device = PCI_DEVICE_ID_PHILIPS_SAA7130,
+ .subvendor = 0x1461, /* Avermedia Technologies Inc */
+ .subdevice = 0x050c,
+.driver_data = SAA7134_BOARD_TG3000TV,
+},{
+ .vendor = PCI_VENDOR_ID_PHILIPS,
+ .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
+ .subvendor = 0x11bd,
+ .subdevice = 0x002b,
+ .driver_data = SAA7134_BOARD_PINNACLE_PCTV_STEREO,
+ },{
+ .vendor = PCI_VENDOR_ID_PHILIPS,
+ .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
+ .subvendor = 0x1019,
+ .subdevice = 0x4cb4,
+ .driver_data = SAA7134_BOARD_ECS_TVP3XP,
+ },{/* — boards without eeprom + subsystem ID — */
.vendor = PCI_VENDOR_ID_PHILIPS,
@@ -777,6 +1148,7 @@
dev->has_remote = 1;
break;
case SAA7134_BOARD_CINERGY400:
+case SAA7134_BOARD_CINERGY600:
dev->has_remote = 1;
break;
}
diff -u linux-2.6.1/drivers/media/video/saa7134/saa7134-core.c linux/drivers/media/video/saa7134/saa7134-core.c
— linux-2.6.1/drivers/media/video/saa7134/saa7134-core.c2004-01-14 15:05:28.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa7134-core.c2004-01-14 15:09:36.000000000 +0100
@@ -599,12 +599,10 @@
if ((report & SAA7134_IRQ_REPORT_DONE_RA3))
saa7134_irq_oss_done(dev,status);-#ifdef CONFIG_VIDEO_IR
if ((report & (SAA7134_IRQ_REPORT_GPIO16 |
SAA7134_IRQ_REPORT_GPIO18)) &&
dev->remote)
saa7134_input_irq(dev);
-#endif};
if (10 == loop) {
@@ -636,9 +634,7 @@
saa7134_vbi_init1(dev);
if (card_has_ts(dev))
saa7134_ts_init1(dev);
-#ifdef CONFIG_VIDEO_IR
saa7134_input_init1(dev);
-#endifswitch (dev->pci->device) {
case PCI_DEVICE_ID_PHILIPS_SAA7134:
@@ -714,9 +710,7 @@
}
if (card_has_ts(dev))
saa7134_ts_fini(dev);
-#ifdef CONFIG_VIDEO_IR
saa7134_input_fini(dev);
-#endif
saa7134_vbi_fini(dev);
saa7134_video_fini(dev);
saa7134_tvaudio_fini(dev);
@@ -907,7 +901,7 @@
}/* wait a bit, register i2c bus */
-current->state = TASK_INTERRUPTIBLE;
+set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(HZ/10);
saa7134_i2c_register(dev);@@ -922,6 +916,10 @@
if (card_has_ts(dev))
request_module(„saa6752hs”);+#ifdef VIDIOC_G_PRIORITY
+v4l2_prio_init(&dev->prio);
+#endif
+
/* register v4l devices */
dev->video_dev = vdev_init(dev,&saa7134_video_template,”video”);
err = video_register_device(dev->video_dev,VFL_TYPE_GRABBER,
@@ -1041,18 +1039,7 @@
saa_writel(SAA7134_MAIN_CTRL,0);/* shutdown subsystems */
-switch (dev->pci->device) {
-case PCI_DEVICE_ID_PHILIPS_SAA7134:
-case PCI_DEVICE_ID_PHILIPS_SAA7133:
-case PCI_DEVICE_ID_PHILIPS_SAA7135:
-saa7134_oss_fini(dev);
-break;
-}
-if (card_has_ts(dev))
-saa7134_ts_fini(dev);
-saa7134_vbi_fini(dev);
-saa7134_video_fini(dev);
-saa7134_tvaudio_fini(dev);
+saa7134_hwfini(dev);/* unregister */
saa7134_i2c_unregister(dev);
@@ -1099,6 +1086,10 @@
(SAA7134_VERSION_CODE >> 16) & 0xff,
(SAA7134_VERSION_CODE >> 8) & 0xff,
SAA7134_VERSION_CODE & 0xff);
+#ifdef SNAPSHOT
+printk(KERN_INFO „saa7130/34: snapshot date %04d-%02d-%02dn”,
+ SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);
+#endif
return pci_module_init(&saa7134_pci_driver);
}diff -u linux-2.6.1/drivers/media/video/saa7134/saa7134-input.c linux/drivers/media/video/saa7134/saa7134-input.c
— linux-2.6.1/drivers/media/video/saa7134/saa7134-input.c2004-01-14 15:09:36.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa7134-input.c2004-01-14 15:09:36.000000000 +0100
@@ -0,0 +1,218 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Should you need to contact me, the author, you can do so either by
+ * e-mail – mail your message to , or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include „saa7134-reg.h”
+#include „saa7134.h”
+
+/*
*/
+
+static IR_KEYTAB_TYPE flyvideo_codes[IR_KEYTAB_SIZE] = {
+[ 15 ] = KEY_KP0,
+[ 3 ] = KEY_KP1,
+[ 4 ] = KEY_KP2,
+[ 5 ] = KEY_KP3,
+[ 7 ] = KEY_KP4,
+[ 8 ] = KEY_KP5,
+[ 9 ] = KEY_KP6,
+[ 11 ] = KEY_KP7,
+[ 12 ] = KEY_KP8,
+[ 13 ] = KEY_KP9,
+
+[ 14 ] = KEY_TUNER, // Air/Cable
+[ 17 ] = KEY_VIDEO, // Video
+[ 21 ] = KEY_AUDIO, // Audio
+[ 0 ] = KEY_POWER, // Pover
+[ 2 ] = KEY_ZOOM, // Fullscreen
+[ 27 ] = KEY_MUTE, // Mute
+[ 20 ] = KEY_VOLUMEUP,
+[ 23 ] = KEY_VOLUMEDOWN,
+[ 18 ] = KEY_CHANNELUP, // Channel +
+[ 19 ] = KEY_CHANNELDOWN, // Channel –
+[ 6 ] = KEY_AGAIN, // Recal
+[ 16 ] = KEY_KPENTER, // Enter
+
+#if 1 /* FIXME */
+[ 26 ] = KEY_F22, // Stereo
+[ 24 ] = KEY_EDIT, // AV Source
+#endif
+};
+
+static IR_KEYTAB_TYPE cinergy_codes[IR_KEYTAB_SIZE] = {
+[ 0 ] = KEY_KP0,
+[ 1 ] = KEY_KP1,
+[ 2 ] = KEY_KP2,
+[ 3 ] = KEY_KP3,
+[ 4 ] = KEY_KP4,
+[ 5 ] = KEY_KP5,
+[ 6 ] = KEY_KP6,
+[ 7 ] = KEY_KP7,
+[ 8 ] = KEY_KP8,
+[ 9 ] = KEY_KP9,
+
+[ 0x0a ] = KEY_POWER,
+[ 0x0b ] = KEY_PROG1, // app
+[ 0x0c ] = KEY_ZOOM, // zoom/fullscreen
+[ 0x0d ] = KEY_CHANNELUP, // channel
+[ 0x0e ] = KEY_CHANNELDOWN, // channel-
+[ 0x0f ] = KEY_VOLUMEUP,
+[ 0x10 ] = KEY_VOLUMEDOWN,
+[ 0x11 ] = KEY_TUNER, // AV
+[ 0x12 ] = KEY_NUMLOCK, // -/–
+[ 0x13 ] = KEY_AUDIO, // audio
+[ 0x14 ] = KEY_MUTE,
+[ 0x15 ] = KEY_UP,
+[ 0x16 ] = KEY_DOWN,
+[ 0x17 ] = KEY_LEFT,
+[ 0x18 ] = KEY_RIGHT,
+[ 0x19 ] = BTN_LEFT,
+[ 0x1a ] = BTN_RIGHT,
+[ 0x1b ] = KEY_WWW, // text
+[ 0x1c ] = KEY_REWIND,
+[ 0x1d ] = KEY_FORWARD,
+[ 0x1e ] = KEY_RECORD,
+[ 0x1f ] = KEY_PLAY,
+[ 0x20 ] = KEY_PREVIOUSSONG,
+[ 0x21 ] = KEY_NEXTSONG,
+[ 0x22 ] = KEY_PAUSE,
+[ 0x23 ] = KEY_STOP,
+};
+
+/*
*/
+
+static int build_key(struct saa7134_dev *dev)
+{
+struct saa7134_ir *ir = dev->remote;
+u32 gpio, data;
+
+/* rising SAA7134_GPIO_GPRESCAN reads the status */
+saa_clearb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);
+saa_setb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);
+gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
+data = ir_extract_bits(gpio, ir->mask_keycode);
+
+printk(„%s: build_key gpio=0x%x mask=0x%x data=%dn”,
+ dev->name, gpio, ir->mask_keycode, data);
+
+if ((ir->mask_keydown && (0 != (gpio & ir->mask_keydown))) ||
+ (ir->mask_keyup && (0 == (gpio & ir->mask_keyup)))) {
+ir_input_keydown(&ir->dev,&ir->ir,data,data);
+} else {
+ir_input_nokey(&ir->dev,&ir->ir);
+}
+return 0;
+}
+
+/*
*/
+
+void saa7134_input_irq(struct saa7134_dev *dev)
+{
+build_key(dev);
+}
+
+int saa7134_input_init1(struct saa7134_dev *dev)
+{
+struct saa7134_ir *ir;
+IR_KEYTAB_TYPE *ir_codes = NULL;
+u32 mask_keycode = 0;
+u32 mask_keydown = 0;
+u32 mask_keyup = 0;
+int ir_type = IR_TYPE_OTHER;
+
+/* detect & configure */
+if (!dev->has_remote)
+return -ENODEV;
+switch (dev->board) {
+case SAA7134_BOARD_FLYVIDEO2000:
+case SAA7134_BOARD_FLYVIDEO3000:
+ir_codes = flyvideo_codes;
+mask_keycode = 0xEC00000;
+mask_keydown = 0x0040000;
+break;
+case SAA7134_BOARD_CINERGY400:
+case SAA7134_BOARD_CINERGY600:
+ir_codes = cinergy_codes;
+mask_keycode = 0x00003f;
+mask_keyup = 0x040000;
+break;
+}
+if (NULL == ir_codes) {
+printk(„%s: Oops: IR config error [card=%d]n”,
+ dev->name, dev->board);
+return -ENODEV;
+}
+
+ir = kmalloc(sizeof(*ir),GFP_KERNEL);
+if (NULL == ir)
+return -ENOMEM;
+memset(ir,0,sizeof(*ir));
+
+/* init hardware-specific stuff */
+ir->mask_keycode = mask_keycode;
+ir->mask_keydown = mask_keydown;
+ir->mask_keyup = mask_keyup;
+
+/* init input device */
+snprintf(ir->name, sizeof(ir->name), „saa7134 IR (%s)”,
+ saa7134_boards[dev->board].name);
+snprintf(ir->phys, sizeof(ir->phys), „pci-%s/ir0”,
+ pci_name(dev->pci));
+
+ir_input_init(&ir->dev, &ir->ir, ir_type, ir_codes);
+ir->dev.name = ir->name;
+ir->dev.phys = ir->phys;
+ir->dev.id.bustype = BUS_PCI;
+ir->dev.id.version = 1;
+if (dev->pci->subsystem_vendor) {
+ir->dev.id.vendor = dev->pci->subsystem_vendor;
+ir->dev.id.product = dev->pci->subsystem_device;
+} else {
+ir->dev.id.vendor = dev->pci->vendor;
+ir->dev.id.product = dev->pci->device;
+}
+
+/* all done */
+dev->remote = ir;
+input_register_device(&dev->remote->dev);
+printk(„%s: registered input device for IRn”,dev->name);
+return 0;
+}
+
+void saa7134_input_fini(struct saa7134_dev *dev)
+{
+if (NULL == dev->remote)
+return;
+
+input_unregister_device(&dev->remote->dev);
+kfree(dev->remote);
+dev->remote = NULL;
+}
+
+/*
+ * Local variables:
+ * c-basic-offset: 8
+ * End:
+ */
diff -u linux-2.6.1/drivers/media/video/saa7134/saa7134-oss.c linux/drivers/media/video/saa7134/saa7134-oss.c
— linux-2.6.1/drivers/media/video/saa7134/saa7134-oss.c2004-01-14 15:05:43.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa7134-oss.c2004-01-14 15:09:36.000000000 +0100
@@ -40,7 +40,7 @@
MODULE_PARM_DESC(oss_rate,”sample rate (valid are: 32000,48000)”);#define dprintk(fmt, arg…)if (oss_debug)
-printk(KERN_DEBUG „%s/oss: ” fmt, dev->name, ## arg)
+printk(KERN_DEBUG „%s/oss: ” fmt, dev->name , ## arg)/*
*/@@ -295,8 +295,10 @@
break;
}
up(&dev->oss.lock);
-current->state = TASK_INTERRUPTIBLE;
-schedule();
+set_current_state(TASK_INTERRUPTIBLE);
+if (0 == dev->oss.read_count)
+schedule();
+set_current_state(TASK_RUNNING);
down(&dev->oss.lock);
if (signal_pending(current)) {
if (0 == ret)
@@ -328,7 +330,6 @@
}
up(&dev->oss.lock);
remove_wait_queue(&dev->oss.wq, &wait);
-current->state = TASK_RUNNING;
return ret;
}@@ -777,7 +778,7 @@
spin_lock(&dev->slock);
if (UNSET == dev->oss.dma_blk) {
-dprintk(„irq: recording stopped%sn”,””);
+dprintk(„irq: recording stoppedn”);
goto done;
}
if (0 != (status & 0x0f000000))
diff -u linux-2.6.1/drivers/media/video/saa7134/saa7134-ts.c linux/drivers/media/video/saa7134/saa7134-ts.c
— linux-2.6.1/drivers/media/video/saa7134/saa7134-ts.c2004-01-14 15:05:00.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa7134-ts.c2004-01-14 15:09:36.000000000 +0100
@@ -45,7 +45,7 @@
#define TS_NR_PACKETS 312#define dprintk(fmt, arg…)if (ts_debug)
-printk(KERN_DEBUG „%s/ts: ” fmt, dev->name, ## arg)
+printk(KERN_DEBUG „%s/ts: ” fmt, dev->name , ## arg)/*
*/@@ -173,7 +173,7 @@
saa_writeb(SAA7134_SPECIAL_MODE, 0x00);
mdelay(10);
saa_writeb(SAA7134_SPECIAL_MODE, 0x01);
– current->state = TASK_INTERRUPTIBLE;
+ set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(HZ/10);
}@@ -196,7 +196,7 @@
list_for_each(list,&saa7134_devlist) {
h = list_entry(list, struct saa7134_dev, devlist);
-if (h->ts_dev->minor == minor)
+if (h->ts_dev && h->ts_dev->minor == minor)
dev = h;
}
if (NULL == dev)
diff -u linux-2.6.1/drivers/media/video/saa7134/saa7134-tvaudio.c linux/drivers/media/video/saa7134/saa7134-tvaudio.c
— linux-2.6.1/drivers/media/video/saa7134/saa7134-tvaudio.c2004-01-14 15:04:59.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa7134-tvaudio.c2004-01-14 15:09:36.000000000 +0100
@@ -41,8 +41,16 @@
MODULE_PARM(audio_carrier,”i”);
MODULE_PARM_DESC(audio_carrier,”audio carrier location”);+static unsigned int audio_ddep = 0;
+MODULE_PARM(audio_ddep,”i”);
+MODULE_PARM_DESC(audio_ddep,”audio ddep overwrite”);
+
+static int audio_clock_tweak = 0;
+MODULE_PARM(audio_clock_tweak, „i”);
+MODULE_PARM_DESC(audio_clock_tweak, „Audio clock tick fine tuning for cards with audio crystal that’s slightly off (range [-1024 .. 1024])”);
+
#define dprintk(fmt, arg…)if (audio_debug)
-printk(KERN_DEBUG „%s/audio: ” fmt, dev->name, ## arg)
+printk(KERN_DEBUG „%s/audio: ” fmt, dev->name , ## arg)
#define d2printk(fmt, arg…)if (audio_debug > 1)
printk(KERN_DEBUG „%s/audio: ” fmt, dev->name, ## arg)@@ -50,7 +58,7 @@
dev->name,(SAA7134_##reg),(#reg),saa_readb((SAA7134_##reg)))#define SCAN_INITIAL_DELAY (HZ)
-#define SCAN_SAMPLE_DELAY (HZ/10)
+#define SCAN_SAMPLE_DELAY (HZ/5)/*
*/
/* saa7134 code */
@@ -186,8 +194,11 @@
in = &card(dev).mute;
}
if (dev->hw_mute == mute &&
– dev->hw_input == in)
+ dev->hw_input == in) {
+dprintk(„mute/input: nothing to do [mute=%d,input=%s]n”,
+mute,in->name);
return;
+}dprintk(„ctl_mute=%d automute=%d input=%s => mute=%d input=%sn”,
dev->ctl_mute,dev->automute,dev->input->name,mute,in->name);
@@ -221,21 +232,27 @@
struct saa7134_tvaudio *audio,
char *note)
{
-if (note)
-dprintk(„tvaudio_setmode: %s %s [%d.%03d/%d.%03d MHz]n”,
-note,audio->name,
-audio->carr1 / 1000, audio->carr1 % 1000,
-audio->carr2 / 1000, audio->carr2 % 1000);
+int acpf, tweak = 0;if (dev->tvnorm->id == V4L2_STD_NTSC) {
-saa_writeb(SAA7134_AUDIO_CLOCKS_PER_FIELD0, 0xde);
-saa_writeb(SAA7134_AUDIO_CLOCKS_PER_FIELD1, 0x15);
-saa_writeb(SAA7134_AUDIO_CLOCKS_PER_FIELD2, 0x02);
+acpf = 0x19066;
} else {
-saa_writeb(SAA7134_AUDIO_CLOCKS_PER_FIELD0, 0x00);
-saa_writeb(SAA7134_AUDIO_CLOCKS_PER_FIELD1, 0x80);
-saa_writeb(SAA7134_AUDIO_CLOCKS_PER_FIELD2, 0x02);
+acpf = 0x1e000;
}
+if (audio_clock_tweak > -1024 && audio_clock_tweak name,
+audio->carr1 / 1000, audio->carr1 % 1000,
+audio->carr2 / 1000, audio->carr2 % 1000,
+acpf, tweak);
+
+acpf += tweak;
+saa_writeb(SAA7134_AUDIO_CLOCKS_PER_FIELD0, (acpf & 0x0000ff) >> 0);
+saa_writeb(SAA7134_AUDIO_CLOCKS_PER_FIELD1, (acpf & 0x00ff00) >> 8);
+saa_writeb(SAA7134_AUDIO_CLOCKS_PER_FIELD2, (acpf & 0x030000) >> 16);
tvaudio_setcarrier(dev,audio->carr1,audio->carr2);switch (audio->mode) {
@@ -259,18 +276,19 @@
saa_writeb(SAA7134_DCXO_IDENT_CTRL, 0x00);
saa_writeb(SAA7134_FM_DEEMPHASIS, 0x44);
saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0xa1);
+saa_writeb(SAA7134_NICAM_CONFIG, 0x00);
break;
case TVAUDIO_NICAM_AM:
saa_writeb(SAA7134_DEMODULATOR, 0x12);
saa_writeb(SAA7134_DCXO_IDENT_CTRL, 0x00);
saa_writeb(SAA7134_FM_DEEMPHASIS, 0x44);
saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0xa1);
+saa_writeb(SAA7134_NICAM_CONFIG, 0x00);
break;
case TVAUDIO_FM_SAT_STEREO:
/* not implemented (yet) */
break;
}
-saa_writel(0x174 >> 2, 0x0001e000); /* FIXME */
}static int tvaudio_sleep(struct saa7134_dev *dev, int timeout)
@@ -278,7 +296,7 @@
DECLARE_WAITQUEUE(wait, current);add_wait_queue(&dev->thread.wq, &wait);
-current->state = TASK_INTERRUPTIBLE;
+set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(timeout);
remove_wait_queue(&dev->thread.wq, &wait);
return dev->thread.scan1 != dev->thread.scan2;
@@ -437,7 +455,7 @@
const int *carr_scan;
int carr_vals[4];
unsigned int i, audio;
-int max1,max2,carrier,rx,mode;
+int max1,max2,carrier,rx,mode,lastmode;lock_kernel();
daemonize(„%s”, dev->name);
@@ -535,7 +553,7 @@
if (UNSET == audio)
audio = i;
tvaudio_setmode(dev,&tvaudio,”trying”);
-if (tvaudio_sleep(dev,HZ))
+if (tvaudio_sleep(dev,HZ*2))
goto restart;
if (-1 != tvaudio_getstereo(dev,&tvaudio)) {
audio = i;
@@ -549,8 +567,9 @@
tvaudio_setstereo(dev,&tvaudio[audio],V4L2_TUNER_MODE_MONO);
dev->tvaudio = &tvaudio[audio];+lastmode = 42;
for (;;) {
-if (tvaudio_sleep(dev,3*HZ))
+if (tvaudio_sleep(dev,5*HZ))
goto restart;
if (dev->thread.exit || signal_pending(current))
break;
@@ -560,7 +579,10 @@
} else {
mode = dev->thread.mode;
}
-tvaudio_setstereo(dev,&tvaudio[audio],mode);
+if (lastmode != mode) {
+tvaudio_setstereo(dev,&tvaudio[audio],mode);
+lastmode = mode;
+}
}
}@@ -602,8 +624,8 @@
[0x1f] = „??? [in progress]”,
};-#define DSP_RETRY 30
-#define DSP_DELAY 10
+#define DSP_RETRY 32
+#define DSP_DELAY 16static inline int saa_dsp_wait_bit(struct saa7134_dev *dev, int bit)
{
@@ -721,15 +743,34 @@
dev->thread.scan1 = dev->thread.scan2;
dprintk(„tvaudio thread scan start [%d]n”,dev->thread.scan1);-norms = 0;
-if (dev->tvnorm->id & V4L2_STD_PAL)
-norms |= 0x2c; /* B/G + D/K + I */
-if (dev->tvnorm->id & V4L2_STD_NTSC)
-norms |= 0x40; /* M */
-if (dev->tvnorm->id & V4L2_STD_SECAM)
-norms |= 0x18; /* L + D/K */
-if (0 == norms)
-norms = 0x0000007c;
+if (audio_ddep >= 0x04 && audio_ddep tvnorm->id & V4L2_STD_PAL) {
+dprintk(„PAL scann”);
+norms |= 0x2c; /* B/G + D/K + I */
+}
+if (dev->tvnorm->id & V4L2_STD_NTSC) {
+dprintk(„NTSC scann”);
+norms |= 0x40; /* M */
+}
+if (dev->tvnorm->id & V4L2_STD_SECAM) {
+dprintk(„SECAM scann”);
+norms |= 0x18; /* L + D/K */
+}
+if (0 == norms)
+norms = 0x7c; /* all */
+dprintk(„scanning:%s%s%s%s%sn”,
+(norms & 0x04) ? ” B/G” : „”,
+(norms & 0x08) ? ” D/K” : „”,
+(norms & 0x10) ? ” L/L'” : „”,
+(norms & 0x20) ? ” I” : „”,
+(norms & 0x40) ? ” M” : „”);
+}/* quick & dirty — to be fixed up later … */
saa_dsp_writel(dev, 0x454 >> 2, 0);
@@ -856,17 +897,12 @@/* enable I2S audio output */
if (saa7134_boards[dev->board].i2s_rate) {
-int rate = (32000 == saa7134_boards[dev->board].i2s_rate)
-? 0x01 : 0x03;
+int i2sform = (32000 == saa7134_boards[dev->board].i2s_rate) ? 0x00 : 0x01;-/* set rate */
-saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, rate);
–
/* enable I2S output */
-saa_writeb(SAA7134_DSP_OUTPUT_SELECT, 0x80);
-saa_writeb(SAA7134_I2S_OUTPUT_SELECT, 0x80);
-saa_writeb(SAA7134_I2S_OUTPUT_FORMAT, 0x01);
-saa_writeb(SAA7134_I2S_OUTPUT_LEVEL, 0x00);
+saa_writeb(SAA7134_I2S_OUTPUT_SELECT, 0x80);
+saa_writeb(SAA7134_I2S_OUTPUT_FORMAT, i2sform);
+saa_writeb(SAA7134_I2S_OUTPUT_LEVEL, 0x0F);
saa_writeb(SAA7134_I2S_AUDIO_OUTPUT, 0x01);
}diff -u linux-2.6.1/drivers/media/video/saa7134/saa7134-vbi.c linux/drivers/media/video/saa7134/saa7134-vbi.c
— linux-2.6.1/drivers/media/video/saa7134/saa7134-vbi.c2004-01-14 15:06:47.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa7134-vbi.c2004-01-14 15:09:36.000000000 +0100
@@ -39,7 +39,7 @@
MODULE_PARM_DESC(vbibufs,”number of vbi buffers, range 2-32″);#define dprintk(fmt, arg…)if (vbi_debug)
-printk(KERN_DEBUG „%s/vbi: ” fmt, dev->name, ## arg)
+printk(KERN_DEBUG „%s/vbi: ” fmt, dev->name , ## arg)/*
*/diff -u linux-2.6.1/drivers/media/video/saa7134/saa7134-video.c linux/drivers/media/video/saa7134/saa7134-video.c
— linux-2.6.1/drivers/media/video/saa7134/saa7134-video.c2004-01-14 15:05:02.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa7134-video.c2004-01-14 15:09:36.000000000 +0100
@@ -40,7 +40,7 @@
MODULE_PARM_DESC(gbuffers,”number of capture buffers, range 2-32″);#define dprintk(fmt, arg…)if (video_debug)
-printk(KERN_DEBUG „%s/video: ” fmt, dev->name, ## arg)
+printk(KERN_DEBUG „%s/video: ” fmt, dev->name , ## arg)/*
*/
/* data structs for video */
@@ -83,6 +83,12 @@
.depth = 24,
.pm = 0x11,
},{
+.name = „24 bpp RGB, be”,
+.fourcc = V4L2_PIX_FMT_RGB24,
+.depth = 24,
+.pm = 0x11,
+.bswap = 1,
+},{
.name = „32 bpp RGB, le”,
.fourcc = V4L2_PIX_FMT_BGR32,
.depth = 32,
@@ -125,6 +131,16 @@
.planar = 1,
.hshift = 1,
.vshift = 1,
+},{
+.name = „4:2:0 planar, Y-Cb-Cr”,
+.fourcc = V4L2_PIX_FMT_YVU420,
+.depth = 12,
+.pm = 0x0a,
+.yuv = 1,
+.planar = 1,
+.uvswap = 1,
+.hshift = 1,
+.vshift = 1,
}
};
#define FORMATS ARRAY_SIZE(formats)
@@ -788,7 +804,7 @@
struct saa7134_buf *next)
{
unsigned long base,control,bpl;
-unsigned long bpl_uv,lines_uv,base2,base3; /* planar */
+unsigned long bpl_uv,lines_uv,base2,base3,tmp; /* planar */dprintk(„buffer_activate buf=%pn”,buf);
buf->vb.state = STATE_ACTIVE;
@@ -834,6 +850,8 @@
lines_uv = buf->vb.height >> buf->fmt->vshift;
base2 = base + bpl * buf->vb.height;
base3 = base2 + bpl_uv * lines_uv;
+if (buf->fmt->uvswap)
+tmp = base2, base2 = base3, base3 = tmp;
dprintk(„uv: bpl=%ld lines=%ld base2/3=%ld/%ldn”,
bpl_uv,lines_uv,base2,base3);
if (V4L2_FIELD_HAS_BOTH(buf->vb.field)) {
@@ -1160,6 +1178,9 @@
fh->fmt = format_by_fourcc(V4L2_PIX_FMT_BGR24);
fh->width = 768;
fh->height = 576;
+#ifdef VIDIOC_G_PRIORITY
+v4l2_prio_open(&dev->prio,&fh->prio);
+#endifvideobuf_queue_init(&fh->cap, &video_qops,
dev->pci, &dev->slock,
@@ -1268,7 +1289,7 @@/* stop video capture */
if (res_check(fh, RESOURCE_VIDEO)) {
-videobuf_queue_cancel(file,&fh->cap);
+videobuf_streamoff(file,&fh->cap);
res_free(dev,fh,RESOURCE_VIDEO);
}
if (fh->cap.read_buf) {
@@ -1287,7 +1308,10 @@saa7134_pgtable_free(dev->pci,&fh->pt_cap);
saa7134_pgtable_free(dev->pci,&fh->pt_vbi);
–
+
+#ifdef VIDIOC_G_PRIORITY
+v4l2_prio_close(&dev->prio,&fh->prio);
+#endif
file->private_data = NULL;
kfree(fh);
return 0;
@@ -1568,6 +1592,20 @@if (video_debug > 1)
saa7134_print_ioctl(dev->name,cmd);
+
+#ifdef VIDIOC_G_PRIORITY
+switch (cmd) {
+case VIDIOC_S_CTRL:
+case VIDIOC_S_STD:
+case VIDIOC_S_INPUT:
+case VIDIOC_S_TUNER:
+case VIDIOC_S_FREQUENCY:
+err = v4l2_prio_check(&dev->prio,&fh->prio);
+if (0 != err)
+return err;
+}
+#endif
+
switch (cmd) {
case VIDIOC_QUERYCAP:
{
@@ -1697,6 +1735,7 @@
down(&dev->lock);
dev->ctl_freq = f->frequency;
saa7134_i2c_call_clients(dev,VIDIOCSFREQ,&dev->ctl_freq);
+saa7134_tvaudio_do_scan(dev);
up(&dev->lock);
return 0;
}
@@ -1727,6 +1766,22 @@
return 0;
}+#ifdef VIDIOC_G_PRIORITY
+ case VIDIOC_G_PRIORITY:
+ {
+ enum v4l2_priority *p = arg;
+
+ *p = v4l2_prio_max(&dev->prio);
+ return 0;
+ }
+ case VIDIOC_S_PRIORITY:
+ {
+ enum v4l2_priority *prio = arg;
+
+ return v4l2_prio_change(&dev->prio, &fh->prio, *prio);
+ }
+#endif
+
/* — preview ioctls
*/
case VIDIOC_ENUM_FMT:
{
@@ -2148,8 +2203,8 @@spin_lock(&dev->slock);
if (dev->video_q.curr) {
+dev->video_fieldcount++;
field = dev->video_q.curr->vb.field;
–
if (V4L2_FIELD_HAS_BOTH(field)) {
/* make sure we have seen both fields */
if ((status & 0x10) == 0x00) {
@@ -2165,6 +2220,7 @@
if ((status & 0x10) != 0x00)
goto done;
}
+dev->video_q.curr->vb.field_count = dev->video_fieldcount;
saa7134_buffer_finish(dev,&dev->video_q,STATE_DONE);
}
saa7134_buffer_next(dev,&dev->video_q);
diff -u linux-2.6.1/drivers/media/video/saa7134/saa7134.h linux/drivers/media/video/saa7134/saa7134.h
— linux-2.6.1/drivers/media/video/saa7134/saa7134.h2004-01-14 15:06:18.000000000 +0100
+++ linux/drivers/media/video/saa7134/saa7134.h2004-01-14 15:09:36.000000000 +0100
@@ -29,14 +29,11 @@#include
-#ifdef CONFIG_VIDEO_IR
-#include „ir-common.h”
-#endif
–
#include
#include
#include
#include
+#include#ifndef TRUE
# define TRUE (1==1)
@@ -116,6 +113,7 @@
unsigned int wswap:1;
unsigned int yuv:1;
unsigned int planar:1;
+unsigned int uvswap:1;
};/*
*/
@@ -143,6 +141,16 @@
#define SAA7134_BOARD_BMK_MPEX_NOTUNER 18
#define SAA7134_BOARD_VIDEOMATE_TV 19
#define SAA7134_BOARD_CRONOS_PLUS 20
+#define SAA7134_BOARD_10MOONSTVMASTER 21
+#define SAA7134_BOARD_MD2819 22
+#define SAA7134_BOARD_BMK_MPEX_TUNER 23
+#define SAA7134_BOARD_TVSTATION_DVR 24
+#define SAA7134_BOARD_ASUSTEK_TVFM713325
+#define SAA7134_BOARD_PINNACLE_PCTV_STEREO 26
+#define SAA7134_BOARD_MANLI_MTV002 27
+#define SAA7134_BOARD_MANLI_MTV001 28
+#define SAA7134_BOARD_TG3000TV 29
+#define SAA7134_BOARD_ECS_TVP3XP 30#define SAA7134_INPUT_MAX 8
@@ -242,11 +250,15 @@
struct saa7134_dev *dev;
unsigned int radio;
enum v4l2_buf_type type;
+unsigned int resources;
+#ifdef VIDIOC_G_PRIORITY
+enum v4l2_priority prio;
+#endif+/* video overlay */
struct v4l2_window win;
struct v4l2_clip clips[8];
unsigned int nclips;
-unsigned int resources;/* video capture */
struct saa7134_format *fmt;
@@ -298,7 +310,6 @@
unsigned int read_count;
};-#ifdef CONFIG_VIDEO_IR
/* IR input */
struct saa7134_ir {
struct input_dev dev;
@@ -307,14 +318,17 @@
char phys[32];
u32 mask_keycode;
u32 mask_keydown;
+u32 mask_keyup;
};
-#endif/* global device status */
struct saa7134_dev {
struct list_head devlist;
struct semaphore lock;
spinlock_t slock;
+#ifdef VIDIOC_G_PRIORITY
+struct v4l2_prio_state prio;
+#endif/* various device info */
unsigned int resources;
@@ -327,9 +341,7 @@/* infrared remote */
int has_remote;
-#ifdef CONFIG_VIDEO_IR
struct saa7134_ir *remote;
-#endif/* pci i/o */
char name[32];
@@ -358,6 +370,7 @@
struct saa7134_dmaqueue video_q;
struct saa7134_dmaqueue ts_q;
struct saa7134_dmaqueue vbi_q;
+unsigned int video_fieldcount;
unsigned int vbi_fieldcount;/* various v4l controls */
@@ -403,9 +416,7 @@
#define saa_setb(reg,bit) saa_andorb((reg),(bit),(bit))
#define saa_clearb(reg,bit) saa_andorb((reg),(bit),0)-//#define saa_wait(d) { if (need_resched()) schedule(); else udelay(d);}
#define saa_wait(d) { udelay(d); }
-//#define saa_wait(d) { schedule_timeout(HZ*d/1000 ?:1); }/*
*/
/* saa7134-core.c */— 😀 😀 😀
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.