2006-03-25 09:19:53 -03:00
/*
2005-04-16 15:20:36 -07:00
planb - PlanB frame grabber driver
PlanB is used in the 7 x00 / 8 x00 series of PowerMacintosh
Computers as video input DMA controller .
Copyright ( C ) 1998 Michel Lanners ( mlan @ cpu . lu )
Based largely on the bttv driver by Ralph Metzler ( rjkm @ thp . uni - koeln . de )
Additional debugging and coding by Takashi Oe ( toe @ unlserve . unl . edu )
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 0213 9 , USA .
*/
/* $Id: planb.h,v 1.13 1999/05/03 19:28:56 mlan Exp $ */
# ifndef _PLANB_H_
# define _PLANB_H_
# ifdef __KERNEL__
# include <asm/dbdma.h>
# include "saa7196.h"
# endif /* __KERNEL__ */
# define PLANB_DEVICE_NAME "Apple PlanB Video-In"
# define PLANB_REV "1.0"
# ifdef __KERNEL__
//#define PLANB_GSCANLINE /* use this if apps have the notion of */
/* grab buffer scanline */
/* This should be safe for both PAL and NTSC */
# define PLANB_MAXPIXELS 768
# define PLANB_MAXLINES 576
# define PLANB_NTSC_MAXLINES 480
/* Uncomment your preferred norm ;-) */
# define PLANB_DEF_NORM VIDEO_MODE_PAL
//#define PLANB_DEF_NORM VIDEO_MODE_NTSC
//#define PLANB_DEF_NORM VIDEO_MODE_SECAM
/* fields settings */
# define PLANB_GRAY 0x1 /* 8-bit mono? */
# define PLANB_COLOUR15 0x2 /* 16-bit mode */
# define PLANB_COLOUR32 0x4 /* 32-bit mode */
# define PLANB_CLIPMASK 0x8 /* hardware clipmasking */
/* misc. flags for PlanB DMA operation */
# define CH_SYNC 0x1 / * synchronize channels (set by ch1;
cleared by ch2 ) */
# define FIELD_SYNC 0x2 / * used for the start of each field
( 0 - > 1 - > 0 for ch1 ; 0 - > 1 for ch2 ) */
# define EVEN_FIELD 0x0 /* even field is detected if unset */
# define DMA_ABORT 0x2 /* error or just out of sync if set */
# define ODD_FIELD 0x4 /* odd field is detected if set */
/* for capture operations */
# define MAX_GBUFFERS 2
/* note PLANB_MAX_FBUF must be divisible by PAGE_SIZE */
# ifdef PLANB_GSCANLINE
# define PLANB_MAX_FBUF 0x240000 /* 576 * 1024 * 4 */
# define TAB_FACTOR (1)
# else
# define PLANB_MAX_FBUF 0x1b0000 /* 576 * 768 * 4 */
# define TAB_FACTOR (2)
# endif
# endif /* __KERNEL__ */
struct planb_saa_regs {
unsigned char addr ;
unsigned char val ;
} ;
struct planb_stat_regs {
unsigned int ch1_stat ;
unsigned int ch2_stat ;
unsigned char saa_stat0 ;
unsigned char saa_stat1 ;
} ;
struct planb_any_regs {
unsigned int offset ;
unsigned int bytes ;
unsigned char data [ 128 ] ;
} ;
/* planb private ioctls */
# define PLANBIOCGSAAREGS _IOWR('v', BASE_VIDIOCPRIVATE, struct planb_saa_regs) /* Read a saa7196 reg value */
# define PLANBIOCSSAAREGS _IOW('v', BASE_VIDIOCPRIVATE + 1, struct planb_saa_regs) /* Set a saa7196 reg value */
# define PLANBIOCGSTAT _IOR('v', BASE_VIDIOCPRIVATE + 2, struct planb_stat_regs) /* Read planb status */
# define PLANB_TV_MODE 1
# define PLANB_VTR_MODE 2
# define PLANBIOCGMODE _IOR('v', BASE_VIDIOCPRIVATE + 3, int) /* Get TV/VTR mode */
# define PLANBIOCSMODE _IOW('v', BASE_VIDIOCPRIVATE + 4, int) /* Set TV/VTR mode */
# ifdef PLANB_GSCANLINE
# define PLANBG_GRAB_BPL _IOR('v', BASE_VIDIOCPRIVATE + 5, int) /* # of bytes per scanline in grab buffer */
# endif
/* call wake_up_interruptible() with appropriate actions */
# define PLANB_INTR_DEBUG _IOW('v', BASE_VIDIOCPRIVATE + 20, int)
/* investigate which reg does what */
# define PLANB_INV_REGS _IOWR('v', BASE_VIDIOCPRIVATE + 21, struct planb_any_regs)
# ifdef __KERNEL__
/* Potentially useful macros */
# define PLANB_SET(x) ((x) << 16 | (x))
# define PLANB_CLR(x) ((x) << 16)
/* This represents the physical register layout */
struct planb_registers {
volatile struct dbdma_regs ch1 ; /* 0x00: video in */
volatile unsigned int even ; /* 0x40: even field setting */
volatile unsigned int odd ; /* 0x44; odd field setting */
unsigned int pad1 [ 14 ] ; /* empty? */
volatile struct dbdma_regs ch2 ; /* 0x80: clipmask out */
unsigned int pad2 [ 16 ] ; /* 0xc0: empty? */
volatile unsigned int reg3 ; /* 0x100: ???? */
volatile unsigned int intr_stat ; /* 0x104: irq status */
# define PLANB_CLR_IRQ 0x00 /* clear Plan B interrupt */
# define PLANB_GEN_IRQ 0x01 /* assert Plan B interrupt */
# define PLANB_FRM_IRQ 0x0100 /* end of frame */
unsigned int pad3 [ 1 ] ; /* empty? */
volatile unsigned int reg5 ; /* 0x10c: ??? */
unsigned int pad4 [ 60 ] ; /* empty? */
volatile unsigned char saa_addr ; /* 0x200: SAA subadr */
char pad5 [ 3 ] ;
volatile unsigned char saa_regval ; /* SAA7196 write reg. val */
char pad6 [ 3 ] ;
volatile unsigned char saa_status ; /* SAA7196 status byte */
/* There is more unused stuff here */
} ;
struct planb_window {
int x , y ;
ushort width , height ;
ushort bpp , bpl , depth , pad ;
ushort swidth , sheight ;
int norm ;
int interlace ;
u32 color_fmt ;
int chromakey ;
int mode ; /* used to switch between TV/VTR modes */
} ;
struct planb_suspend {
int overlay ;
int frame ;
struct dbdma_cmd cmd ;
} ;
struct planb {
struct video_device video_dev ;
struct video_picture picture ; /* Current picture params */
struct video_audio audio_dev ; /* Current audio params */
2006-03-25 09:19:53 -03:00
2005-04-16 15:20:36 -07:00
volatile struct planb_registers * planb_base ; /* virt base of planb */
struct planb_registers * planb_base_phys ; /* phys base of planb */
void * priv_space ; /* Org. alloc. mem for kfree */
int user ;
unsigned int tab_size ;
int maxlines ;
2006-02-07 06:49:14 -02:00
struct mutex lock ;
2005-04-16 15:20:36 -07:00
unsigned int irq ; /* interrupt number */
volatile unsigned int intr_mask ;
2007-04-23 17:57:22 -03:00
struct pci_dev * dev ; /* Our PCI device */
2005-04-16 15:20:36 -07:00
int overlay ; /* overlay running? */
struct planb_window win ;
unsigned long frame_buffer_phys ; /* We need phys for DMA */
int offset ; /* offset of pixel 1 */
volatile struct dbdma_cmd * ch1_cmd ; /* Video In DMA cmd buffer */
volatile struct dbdma_cmd * ch2_cmd ; /* Clip Out DMA cmd buffer */
volatile struct dbdma_cmd * overlay_last1 ;
volatile struct dbdma_cmd * overlay_last2 ;
unsigned long ch1_cmd_phys ;
volatile unsigned char * mask ; /* Clipmask buffer */
int suspend ;
wait_queue_head_t suspendq ;
struct planb_suspend suspended ;
int cmd_buff_inited ; /* cmd buffer inited? */
int grabbing ;
unsigned int gcount ;
wait_queue_head_t capq ;
int last_fr ;
int prev_last_fr ;
unsigned char * * rawbuf ;
int rawbuf_size ;
int gbuf_idx [ MAX_GBUFFERS ] ;
volatile struct dbdma_cmd * cap_cmd [ MAX_GBUFFERS ] ;
volatile struct dbdma_cmd * last_cmd [ MAX_GBUFFERS ] ;
volatile struct dbdma_cmd * pre_cmd [ MAX_GBUFFERS ] ;
int need_pre_capture [ MAX_GBUFFERS ] ;
# define PLANB_DUMMY 40 /* # of command buf's allocated for pre-capture seq. */
int gwidth [ MAX_GBUFFERS ] , gheight [ MAX_GBUFFERS ] ;
unsigned int gfmt [ MAX_GBUFFERS ] ;
int gnorm_switch [ MAX_GBUFFERS ] ;
2006-03-25 09:19:53 -03:00
volatile unsigned int * frame_stat ;
2005-04-16 15:20:36 -07:00
# define GBUFFER_UNUSED 0x00U
# define GBUFFER_GRABBING 0x01U
# define GBUFFER_DONE 0x02U
# ifdef PLANB_GSCANLINE
int gbytes_per_line ;
# else
# define MAX_LNUM 431 /* change this if PLANB_MAXLINES or */
/* PLANB_MAXPIXELS changes */
int l_fr_addr_idx [ MAX_GBUFFERS ] ;
unsigned char * l_to_addr [ MAX_GBUFFERS ] [ MAX_LNUM ] ;
int l_to_next_idx [ MAX_GBUFFERS ] [ MAX_LNUM ] ;
int l_to_next_size [ MAX_GBUFFERS ] [ MAX_LNUM ] ;
int lsize [ MAX_GBUFFERS ] , lnum [ MAX_GBUFFERS ] ;
# endif
} ;
# endif /* __KERNEL__ */
# endif /* _PLANB_H_ */