summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--v4l_experimental/cx88-ivtv.c248
-rw-r--r--v4l_experimental/pvrusb2/Kbuild2
2 files changed, 249 insertions, 1 deletions
diff --git a/v4l_experimental/cx88-ivtv.c b/v4l_experimental/cx88-ivtv.c
new file mode 100644
index 000000000..c28c1d413
--- /dev/null
+++ b/v4l_experimental/cx88-ivtv.c
@@ -0,0 +1,248 @@
+/*
+ * $Id: cx88-ivtv.c,v 1.1 2005/11/30 17:26:37 mchehab Exp $
+ *
+ * IVTV API emulation for the "blackbird" reference design.
+ *
+ * (c) 2005 Catalin Climov <catalin@climov.com>
+ *
+ * Includes parts from the ivtv driver( http://ivtv.sourceforge.net/),
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+
+#include "compat.h"
+#include "cx88.h"
+
+MODULE_DESCRIPTION("ivtv ioctl emulation module for blackbird TV cards");
+MODULE_AUTHOR("Catalin Climov <catalin@climov.com>");
+MODULE_LICENSE("GPL");
+
+static unsigned int debug = 0;
+module_param(debug,int,0644);
+MODULE_PARM_DESC(debug,"enable debug messages [blackbird]");
+
+#define dprintk(level,fmt, arg...) if (debug >= level) \
+ printk(KERN_DEBUG "%s/2-bb: " fmt, dev->core->name , ## arg)
+
+static int (*prev_ioctl_hook)(struct inode *inode, struct file *file,
+ unsigned int cmd, void *arg);
+static unsigned int (*prev_ioctl_translator)(unsigned int cmd);
+
+/* --- IVTV data structs -------------------------------------------- */
+
+struct ivtv_ioctl_codec {
+ uint32_t aspect;
+ uint32_t audio_bitmask;
+ uint32_t bframes;
+ uint32_t bitrate_mode;
+ uint32_t bitrate;
+ uint32_t bitrate_peak;
+ uint32_t dnr_mode;
+ uint32_t dnr_spatial;
+ uint32_t dnr_temporal;
+ uint32_t dnr_type;
+ uint32_t framerate; /* read only, ignored on write */
+ uint32_t framespergop; /* read only, ignored on write */
+ uint32_t gop_closure;
+ uint32_t pulldown;
+ uint32_t stream_type;
+};
+
+struct ivtv_sliced_vbi_format {
+ unsigned long service_set; /* one or more of the IVTV_SLICED_ defines */
+ unsigned long packet_size; /* the size in bytes of the ivtv_sliced_data packet */
+ unsigned long io_size; /* maximum number of bytes passed by one read() call */
+ unsigned long reserved;
+};
+
+#define IVTV_IOC_G_CODEC _IOR ('@', 48, struct ivtv_ioctl_codec)
+#define IVTV_IOC_S_CODEC _IOW ('@', 49, struct ivtv_ioctl_codec)
+#define IVTV_IOC_S_VBI_MODE _IOWR('@', 35, struct ivtv_sliced_vbi_format)
+#define IVTV_IOC_G_VBI_MODE _IOR ('@', 36, struct ivtv_sliced_vbi_format)
+#define IVTV_IOC_S_VBI_EMBED _IOW ('@', 54, int)
+
+/* ------------------------------------------------------------------ */
+
+static unsigned int ivtv_translate_ioctl(unsigned int cmd)
+{
+#if 0
+ printk( KERN_INFO "ivtv_translate_ioctl\n" );
+#endif
+ switch( cmd )
+ {
+ case 0xFFEE7703: cmd = IVTV_IOC_G_CODEC; break;
+ case 0xFFEE7704: cmd = IVTV_IOC_S_CODEC; break;
+ case 0xFFEE7781: /*cmd = IVTV_IOC_PLAY; break;*/
+ case 0xFFEE7782: /*cmd = IVTV_IOC_PAUSE; break;*/
+ case 0xFFEE7783: /*cmd = IVTV_IOC_FRAMESYNC; break;*/
+ case 0xFFEE7784: /*cmd = IVTV_IOC_GET_TIMING; break;*/
+ case 0xFFEE7785: /*cmd = IVTV_IOC_S_SLOW_FAST; break;*/
+ case 0xFFEE7786: /*cmd = IVTV_IOC_S_START_DECODE; break;*/
+ case 0xFFEE7787: /*cmd = IVTV_IOC_S_STOP_DECODE; break;*/
+ case 0xFFEE7789: /*cmd = IVTV_IOC_GET_FB; break;*/
+ printk( KERN_INFO "IVTV: 0x%x\n", cmd );
+ }
+ return prev_ioctl_translator( cmd );
+}
+
+static int ivtv_do_ioctl(struct inode *inode, struct file *file,
+ unsigned int cmd, void *arg)
+{
+ struct cx8802_fh *fh = file->private_data;
+ struct cx8802_dev *dev = fh->dev;
+ /* struct cx88_core *core = dev->core; */
+
+ /* int err; */
+
+ if (debug > 1)
+ cx88_print_ioctl(dev->core->name,cmd);
+#if 1
+ printk( KERN_INFO "IVTV IOCTL: 0x%x\n", cmd );
+ cx88_print_ioctl(dev->core->name,cmd);
+#endif
+ dprintk( 1, "IVTV IOCTL: 0x%x\n", cmd );
+
+ switch (cmd) {
+
+ /* --- IVTV emulation layer --------------------------- */
+ case IVTV_IOC_S_CODEC:
+ printk( KERN_INFO "IVTV_IOC_S_CODEC\n" );
+ case IVTV_IOC_G_CODEC:
+ {
+ struct ivtv_ioctl_codec *codec = arg;
+#if 1
+ printk( KERN_INFO "IVTV_IOC_G/S_CODEC\n" );
+ printk( KERN_INFO "CODEC: aspect: %d\n", codec->aspect );
+ printk( KERN_INFO "CODEC: audio : %d\n", codec->audio_bitmask );
+ printk( KERN_INFO "CODEC: bfrms : %d\n", codec->bframes );
+ printk( KERN_INFO "CODEC: br_mod: %d\n", codec->bitrate_mode );
+ printk( KERN_INFO "CODEC: btrate: %d\n", codec->bitrate );
+ printk( KERN_INFO "CODEC: btr_pk: %d\n", codec->bitrate_peak );
+ printk( KERN_INFO "CODEC: dnr_md: %d\n", codec->dnr_mode );
+ printk( KERN_INFO "CODEC: dnr_sp: %d\n", codec->dnr_spatial );
+ printk( KERN_INFO "CODEC: dnr_tp: %d\n", codec->dnr_temporal );
+ printk( KERN_INFO "CODEC: dnr_ty: %d\n", codec->dnr_type );
+ printk( KERN_INFO "CODEC: framer: %d\n", codec->framerate );
+ printk( KERN_INFO "CODEC: grmgop: %d\n", codec->framespergop );
+ printk( KERN_INFO "CODEC: gop_cl: %d\n", codec->gop_closure );
+ printk( KERN_INFO "CODEC: pulldn: %d\n", codec->pulldown );
+ printk( KERN_INFO "CODEC: strtyp: %d\n\n", codec->stream_type );
+#endif
+
+ codec->aspect = 2; /* 4:3 */
+ codec->audio_bitmask = (2 << 2) | (14 << 4); /* layer II | 384kbps */
+ codec->bframes = 2;
+ codec->bitrate_mode = 1; /* cbr */
+ codec->bitrate = 4500000; /* bps */
+ codec->bitrate_peak = 6000000; /* peak */
+ codec->dnr_mode = 0; /* spatial=manual | temporal=manual */
+ codec->dnr_spatial = 0;
+ codec->dnr_temporal = 0;
+ codec->dnr_type = 0; /* disabled */
+ codec->framerate = 1; /* 25fps */
+ codec->framespergop = 15;
+ codec->gop_closure = 0; /* open */
+ codec->pulldown = 0; /* enabled */
+ codec->stream_type = 0; /* program stream */
+#if 1
+ printk( KERN_INFO "CODEC: aspect: %d\n", codec->aspect );
+ printk( KERN_INFO "CODEC: audio : %d\n", codec->audio_bitmask );
+ printk( KERN_INFO "CODEC: bfrms : %d\n", codec->bframes );
+ printk( KERN_INFO "CODEC: br_mod: %d\n", codec->bitrate_mode );
+ printk( KERN_INFO "CODEC: btrate: %d\n", codec->bitrate );
+ printk( KERN_INFO "CODEC: btr_pk: %d\n", codec->bitrate_peak );
+ printk( KERN_INFO "CODEC: dnr_md: %d\n", codec->dnr_mode );
+ printk( KERN_INFO "CODEC: dnr_sp: %d\n", codec->dnr_spatial );
+ printk( KERN_INFO "CODEC: dnr_tp: %d\n", codec->dnr_temporal );
+ printk( KERN_INFO "CODEC: dnr_ty: %d\n", codec->dnr_type );
+ printk( KERN_INFO "CODEC: framer: %d\n", codec->framerate );
+ printk( KERN_INFO "CODEC: grmgop: %d\n", codec->framespergop );
+ printk( KERN_INFO "CODEC: gop_cl: %d\n", codec->gop_closure );
+ printk( KERN_INFO "CODEC: pulldn: %d\n", codec->pulldown );
+ printk( KERN_INFO "CODEC: strtyp: %d\n", codec->stream_type );
+#endif
+ return 0;
+ }
+ case IVTV_IOC_S_VBI_MODE:
+ {
+ struct ivtv_sliced_vbi_format *fmt = arg;
+ printk( KERN_INFO "IVTV_IOC_S_VBI_MODE: ss: %ld, ps: %ld, is: %ld\n",
+ fmt->service_set, fmt->packet_size, fmt->io_size );
+#if 0
+ fmt->service_set = 0; /* one or more of the IVTV_SLICED_ defines */
+ fmt->packet_size = 0; /* the size in bytes of the ivtv_sliced_data packet */
+ fmt->io_size = 0; /* maximum number of bytes passed by one read() call */
+#endif
+ return 0;
+ }
+ case IVTV_IOC_G_VBI_MODE:
+ {
+ struct ivtv_sliced_vbi_format *fmt = arg;
+
+ fmt->service_set = 1; /* one or more of the IVTV_SLICED_ defines */
+ fmt->packet_size = 0; /* the size in bytes of the ivtv_sliced_data packet */
+ fmt->io_size = 0; /* maximum number of bytes passed by one read() call */
+ return 0;
+ }
+ case IVTV_IOC_S_VBI_EMBED:
+ {
+ int *embed = arg;
+ printk( KERN_INFO "IVTV_IOC_S_VBI_EMBED: %d\n", *embed );
+ return 0;
+ }
+
+ default:
+ if( prev_ioctl_hook )
+ return prev_ioctl_hook( inode, file, cmd, arg );
+ else
+ return -EINVAL;
+ }
+ return 0;
+}
+
+static int __init cx88_ivtv_init(void)
+{
+ printk(KERN_INFO "ivtv emulation for blackbird version %d.%d.%d loaded\n",
+ (CX88_VERSION_CODE >> 16) & 0xff,
+ (CX88_VERSION_CODE >> 8) & 0xff,
+ CX88_VERSION_CODE & 0xff);
+#ifdef SNAPSHOT
+ printk(KERN_INFO "cx2388x: snapshot date %04d-%02d-%02d\n",
+ SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);
+#endif
+ request_module( "cx88-blackbird" );
+ prev_ioctl_translator = cx88_ioctl_translator;
+ cx88_ioctl_translator = ivtv_translate_ioctl;
+ prev_ioctl_hook = cx88_ioctl_hook;
+ cx88_ioctl_hook = ivtv_do_ioctl;
+ return 0;
+}
+
+static void __exit cx88_ivtv_fini(void)
+{
+ cx88_ioctl_hook = prev_ioctl_hook;
+ cx88_ioctl_translator = prev_ioctl_translator;
+}
+
+module_init(cx88_ivtv_init);
+module_exit(cx88_ivtv_fini);
+
+/*
+ * kate: eol "unix"; indent-width 3; remove-trailing-space on; replace-trailing-space-save on; tab-width 8; replace-tabs off; space-indent off; mixed-indent off
+ */
diff --git a/v4l_experimental/pvrusb2/Kbuild b/v4l_experimental/pvrusb2/Kbuild
index 2166db3e7..488633837 100644
--- a/v4l_experimental/pvrusb2/Kbuild
+++ b/v4l_experimental/pvrusb2/Kbuild
@@ -17,7 +17,7 @@ pvrusb2-objs := \
pvrusb2-debugifc.o \
$(END)
-obj-$(CONFIG_VIDEO_PVRUSB2) += pvrusb2.o
+obj-$(CONFIG_VIDEO_PVRUSB2) += pvrusb2.o tveeprom.o
# Stuff for Emacs to see, in order to encourage consistent editing style:
# *** Local Variables: ***