📄 planb.h
字号:
/* planb - v4l-compatible frame grabber driver for the PlanB hardware PlanB is used in the 7x00/8x00 series of PowerMacintosh Computers as video input DMA controller. Copyright (C) 1998 - 2002 Michel Lanners <mailto:mlan@cpu.lu> Based largely on the old bttv driver by Ralph Metzler Additional debugging and coding by Takashi Oe <mailto:toe@unlserve.unl.edu> For more information, see <http://www.cpu.lu/~mlan/planb.html> 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.*//* $Id: planb.h,v 2.9 2002/04/03 15:57:57 mlan Exp mlan $ */#ifndef _PLANB_H_#define _PLANB_H_#define PLANB_DEVICE_NAME "Apple PlanB Video-In"#define PLANB_VBI_NAME "Apple PlanB VBI"#define PLANB_REV "2.11"#define APPLE_VENDOR_ID 0x106b#define PLANB_DEV_ID 0x0004#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/* Max VBI data buffer size */#define VBI_LINESIZE 1024 /* on SAA7196, a line can be max. 1024 pixels */#define VBI_START 7 /* VBI starts at line 7 */#define VBI_MAXLINES 16 /* 16 lines per field *//* We have 2 of these, but return them one at a time */#define VBIBUF_SIZE (VBI_LINESIZE * VBI_MAXLINES)#define LINE_OFFSET 1 /* between line 1 and SAA's first valid line *//* 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_SIZE8 0x1 /* 8-bit mono? */#define PLANB_SIZE16 0x2 /* 16-bit mode */#define PLANB_SIZE32 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 *//* format info and correspondance */struct fmts { int bpp; /* bytes per pixel */ int pb_fmt; /* planb format (DMA engine sub 0x40/0x44 ) */ int saa_fmt; /* saa format: bit SAA7196 sub 0x20: bits FS0 0 FS1 1 sub 0x30: bit MCT 4 LLV 5 */};/* This is supposed to match the VIDEO_PALETTE_* defines in * struct video_picture in videodev.h */static struct fmts palette2fmt[] = { { 0, 0, 0 }, { 1, PLANB_SIZE8, 0x33 }, /* VIDEO_PALETTE_GREY */ { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 4, PLANB_SIZE32, 2 }, /* VIDEO_PALETTE_RGB32 */ { 2, PLANB_SIZE16, 0 }, /* VIDEO_PALETTE_RGB555 */ { 2, PLANB_SIZE16, 0x21 }, /* VIDEO_PALETTE_YUV422 */ { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 },};#define PLANB_PALETTE_MAX (sizeof palette2fmt / sizeof (struct fmts))/* 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 long ch1_cmdbase; unsigned long ch2_cmdbase; unsigned int ch1_cmdptr; unsigned int ch2_cmdptr; unsigned char saa_stat0; unsigned char saa_stat1;};struct planb_any_regs { unsigned int offset; unsigned int bytes; unsigned char data[128];};struct planb_buf_regs { unsigned int start; unsigned int end;};/* planb private ioctls *//* Read a saa7196 reg value */#define PLANBIOCGSAAREGS _IOWR('v', BASE_VIDIOCPRIVATE, struct planb_saa_regs)/* Set a saa7196 reg value */#define PLANBIOCSSAAREGS _IOW('v', BASE_VIDIOCPRIVATE + 1, struct planb_saa_regs)/* Read planb status */#define PLANBIOCGSTAT _IOR('v', BASE_VIDIOCPRIVATE + 2, struct planb_stat_regs)/* Get TV/VTR mode */#define PLANB_TV_MODE 1#define PLANB_VTR_MODE 2#define PLANBIOCGMODE _IOR('v', BASE_VIDIOCPRIVATE + 3, int)/* Set TV/VTR mode */#define PLANBIOCSMODE _IOW('v', BASE_VIDIOCPRIVATE + 4, int)#ifdef PLANB_GSCANLINE/* # of bytes per scanline in grab buffer */#define PLANBG_GRAB_BPL _IOR('v', BASE_VIDIOCPRIVATE + 5, int)#endif/* This doesn't really belong here, but until someone cleans up (or defines in the first place ;-) the VBI API, it helps alevt... */#define BTTV_VBISIZE _IOR('v', BASE_VIDIOCPRIVATE + 8, int)/* Various debugging IOCTLs */#ifdef DEBUG/* 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)/* Dump DBDMA command buffer from (int) to (int) */#define PLANBIOCGDBDMABUF _IOW('v', BASE_VIDIOCPRIVATE + 22, struct planb_buf_regs)#endif /* DEBUG */#ifdef __KERNEL__/* Potentially useful macros */#define PLANB_SET(x) ((x) << 16 | (x))#define PLANB_CLR(x) ((x) << 16)typedef volatile struct dbdma_cmd dbdma_cmd_t;typedef volatile struct dbdma_cmd *dbdma_cmd_ptr;typedef volatile struct dbdma_regs dbdma_regs_t;typedef volatile struct dbdma_regs *dbdma_regs_ptr;typedef struct gbuffer gbuf_t;typedef struct gbuffer *gbuf_ptr;/* grab buffer status */#define GBUFFER_UNUSED 0x00U#define GBUFFER_GRABBING 0x01U#define GBUFFER_DONE 0x02U/* planb interrupt status values (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 */#define PLANB_DUMMY 40 /* # of command buf's allocated for pre-capture seq. *//* This represents the physical register layout */struct planb_registers { dbdma_regs_t ch1; /* 0x00: video in */ volatile u32 even; /* 0x40: even field setting */ volatile u32 odd; /* 0x44; odd field setting */ u32 pad1[14]; /* empty? */ dbdma_regs_t ch2; /* 0x80: clipmask out */ u32 pad2[16]; /* 0xc0: empty? */ volatile u32 reg3; /* 0x100: ???? */ volatile u32 intr_stat; /* 0x104: irq status */ u32 pad3[1]; /* empty? */ volatile u32 reg5; /* 0x10c: ??? */ u32 pad4[60]; /* empty? */ volatile u8 saa_addr; /* 0x200: SAA subadr */ u8 pad5[3]; volatile u8 saa_regval; /* SAA7196 write reg. val */ u8 pad6[3]; volatile u8 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;};/* Framebuffer info */struct planb_fb { unsigned long phys; /* Framebuffer phys. base address */ int offset; /* offset of pixel 1 */};/* DBDMA command buffer descriptor */struct dbdma_cmd_buf { dbdma_cmd_ptr start; dbdma_cmd_ptr jumpaddr; /* where are we called from? */ unsigned int size; unsigned long bus; /* start address as seen from the bus */};/* grab buffer descriptor */struct gbuffer { dbdma_cmd_ptr cap_cmd; dbdma_cmd_ptr last_cmd; dbdma_cmd_ptr pre_cmd; int idx; int need_pre_capture; int width; int height; unsigned int fmt; int norm_switch;#ifndef PLANB_GSCANLINE int l_fr_addr_idx; int lsize; int lnum;#endif volatile unsigned int *status; /* ptr to status value */};struct planb {/* the video device: */ struct video_device video_dev; struct video_picture picture; /* Current picture params */ int vid_user; /* Users on video device */ void *vid_raw; /* Org. alloc. mem for kfree */ struct dbdma_cmd_buf vid_cbo; /* odd video dbdma cmd buf */ struct dbdma_cmd_buf vid_cbe; /* even */ void *clip_raw; struct dbdma_cmd_buf clip_cbo; /* odd clip dbdma cmd buf */ struct dbdma_cmd_buf clip_cbe; /* even */ dbdma_cmd_ptr overlay_last1; dbdma_cmd_ptr overlay_last2; /* the hardware: */ volatile struct planb_registers *planb_base; /* virt base of planb */ struct planb_registers *planb_base_bus; /* phys base of planb */ unsigned int tab_size; int maxlines; unsigned int irq; /* interrupt number */ volatile unsigned int intr_mask; struct planb_fb fb; /* Framebuffer info *//* generic stuff: */ void *jump_raw; /* jump buffer raw space */ dbdma_cmd_ptr jumpbuf; /* same, DBDMA_ALIGN'ed */ struct semaphore lock; int overlay; /* overlay running? */ struct planb_window win; volatile unsigned char *mask; /* Clipmask buffer */ int suspend; wait_queue_head_t suspendq; struct planb_suspend suspended; int cmd_buff_inited; /* cmd buffer inited? *//* grabbing stuff: */ int grabbing; unsigned int gcount; wait_queue_head_t capq; int last_fr; int prev_last_fr; unsigned char **rawbuf; int rawbuf_nchunks; struct gbuffer gbuf[MAX_GBUFFERS];#ifdef PLANB_GSCANLINE int gbytes_per_line;#else#define MAX_LNUM 576 /* change this if PLANB_MAXLINES or */ /* PLANB_MAXPIXELS changes */ 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];#endif /* PLANB_GSCANLINE *//* VBI stuff: */ struct video_device vbi_dev; /* VBI data device */ int vbi_user; /* Users on vbi device */ void *vbi_raw; struct dbdma_cmd_buf vbi_cbo; /* odd VBI dbdma cmd buf */ struct dbdma_cmd_buf vbi_cbe; /* even */ int vbirunning; int vbip; /* pointer into VBI buffer */ unsigned char *vbibuf; /* buffer for VBI data */ wait_queue_head_t vbiq;};#endif /* __KERNEL__ */#endif /* _PLANB_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -