diff options
-rw-r--r-- | v4l_experimental/cx88-ivtv.c | 248 | ||||
-rw-r--r-- | v4l_experimental/pvrusb2/Kbuild | 2 |
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: *** |