⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ivtv-driver.h

📁 linux内核源码
💻 H
📖 第 1 页 / 共 2 页
字号:
/*    ivtv driver internal defines and structures    Copyright (C) 2003-2004  Kevin Thayer <nufan_wfk at yahoo.com>    Copyright (C) 2004  Chris Kennedy <c@groovy.org>    Copyright (C) 2005-2007  Hans Verkuil <hverkuil@xs4all.nl>    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 */#ifndef IVTV_DRIVER_H#define IVTV_DRIVER_H/* Internal header for ivtv project: * Driver for the cx23415/6 chip. * Author: Kevin Thayer (nufan_wfk at yahoo.com) * License: GPL * http://www.ivtvdriver.org * * ----- * MPG600/MPG160 support by  T.Adachi <tadachi@tadachi-net.com> *                      and Takeru KOMORIYA<komoriya@paken.org> * * AVerMedia M179 GPIO info by Chris Pinkham <cpinkham@bc2va.org> *                using information provided by Jiun-Kuei Jung @ AVerMedia. */#include <linux/version.h>#include <linux/module.h>#include <linux/init.h>#include <linux/delay.h>#include <linux/sched.h>#include <linux/fs.h>#include <linux/pci.h>#include <linux/interrupt.h>#include <linux/spinlock.h>#include <linux/i2c.h>#include <linux/i2c-algo-bit.h>#include <linux/list.h>#include <linux/unistd.h>#include <linux/byteorder/swab.h>#include <linux/pagemap.h>#include <linux/scatterlist.h>#include <linux/workqueue.h>#include <linux/mutex.h>#include <asm/uaccess.h>#include <asm/system.h>#include <linux/dvb/video.h>#include <linux/dvb/audio.h>#include <media/v4l2-common.h>#include <media/tuner.h>#include <media/cx2341x.h>#include <linux/ivtv.h>/* Memory layout */#define IVTV_ENCODER_OFFSET	0x00000000#define IVTV_ENCODER_SIZE	0x00800000	/* Total size is 0x01000000, but only first half is used */#define IVTV_DECODER_OFFSET	0x01000000#define IVTV_DECODER_SIZE	0x00800000	/* Total size is 0x01000000, but only first half is used */#define IVTV_REG_OFFSET 	0x02000000#define IVTV_REG_SIZE		0x00010000/* Maximum ivtv driver instances. Some people have a huge number of   capture cards, so set this to a high value. */#define IVTV_MAX_CARDS 32#define IVTV_ENC_STREAM_TYPE_MPG  0#define IVTV_ENC_STREAM_TYPE_YUV  1#define IVTV_ENC_STREAM_TYPE_VBI  2#define IVTV_ENC_STREAM_TYPE_PCM  3#define IVTV_ENC_STREAM_TYPE_RAD  4#define IVTV_DEC_STREAM_TYPE_MPG  5#define IVTV_DEC_STREAM_TYPE_VBI  6#define IVTV_DEC_STREAM_TYPE_VOUT 7#define IVTV_DEC_STREAM_TYPE_YUV  8#define IVTV_MAX_STREAMS	  9#define IVTV_DMA_SG_OSD_ENT	(2883584/PAGE_SIZE)	/* sg entities *//* DMA Registers */#define IVTV_REG_DMAXFER 	(0x0000)#define IVTV_REG_DMASTATUS 	(0x0004)#define IVTV_REG_DECDMAADDR 	(0x0008)#define IVTV_REG_ENCDMAADDR 	(0x000c)#define IVTV_REG_DMACONTROL 	(0x0010)#define IVTV_REG_IRQSTATUS 	(0x0040)#define IVTV_REG_IRQMASK 	(0x0048)/* Setup Registers */#define IVTV_REG_ENC_SDRAM_REFRESH 	(0x07F8)#define IVTV_REG_ENC_SDRAM_PRECHARGE 	(0x07FC)#define IVTV_REG_DEC_SDRAM_REFRESH 	(0x08F8)#define IVTV_REG_DEC_SDRAM_PRECHARGE 	(0x08FC)#define IVTV_REG_VDM 			(0x2800)#define IVTV_REG_AO 			(0x2D00)#define IVTV_REG_BYTEFLUSH 		(0x2D24)#define IVTV_REG_SPU 			(0x9050)#define IVTV_REG_HW_BLOCKS 		(0x9054)#define IVTV_REG_VPU 			(0x9058)#define IVTV_REG_APU 			(0xA064)/* i2c stuff */#define I2C_CLIENTS_MAX 16/* debugging */extern int ivtv_debug;#define IVTV_DBGFLG_WARN    (1 << 0)#define IVTV_DBGFLG_INFO    (1 << 1)#define IVTV_DBGFLG_MB      (1 << 2)#define IVTV_DBGFLG_IOCTL   (1 << 3)#define IVTV_DBGFLG_FILE    (1 << 4)#define IVTV_DBGFLG_DMA     (1 << 5)#define IVTV_DBGFLG_IRQ     (1 << 6)#define IVTV_DBGFLG_DEC     (1 << 7)#define IVTV_DBGFLG_YUV     (1 << 8)#define IVTV_DBGFLG_I2C     (1 << 9)/* Flag to turn on high volume debugging */#define IVTV_DBGFLG_HIGHVOL (1 << 10)/* NOTE: extra space before comma in 'itv->num , ## args' is required for   gcc-2.95, otherwise it won't compile. */#define IVTV_DEBUG(x, type, fmt, args...) \	do { \		if ((x) & ivtv_debug) \			printk(KERN_INFO "ivtv%d " type ": " fmt, itv->num , ## args); \	} while (0)#define IVTV_DEBUG_WARN(fmt, args...)  IVTV_DEBUG(IVTV_DBGFLG_WARN,  "warn",  fmt , ## args)#define IVTV_DEBUG_INFO(fmt, args...)  IVTV_DEBUG(IVTV_DBGFLG_INFO,  "info",  fmt , ## args)#define IVTV_DEBUG_MB(fmt, args...)    IVTV_DEBUG(IVTV_DBGFLG_MB,    "mb",    fmt , ## args)#define IVTV_DEBUG_DMA(fmt, args...)   IVTV_DEBUG(IVTV_DBGFLG_DMA,   "dma",   fmt , ## args)#define IVTV_DEBUG_IOCTL(fmt, args...) IVTV_DEBUG(IVTV_DBGFLG_IOCTL, "ioctl", fmt , ## args)#define IVTV_DEBUG_FILE(fmt, args...)  IVTV_DEBUG(IVTV_DBGFLG_FILE,  "file",  fmt , ## args)#define IVTV_DEBUG_I2C(fmt, args...)   IVTV_DEBUG(IVTV_DBGFLG_I2C,   "i2c",   fmt , ## args)#define IVTV_DEBUG_IRQ(fmt, args...)   IVTV_DEBUG(IVTV_DBGFLG_IRQ,   "irq",   fmt , ## args)#define IVTV_DEBUG_DEC(fmt, args...)   IVTV_DEBUG(IVTV_DBGFLG_DEC,   "dec",   fmt , ## args)#define IVTV_DEBUG_YUV(fmt, args...)   IVTV_DEBUG(IVTV_DBGFLG_YUV,   "yuv",   fmt , ## args)#define IVTV_DEBUG_HIGH_VOL(x, type, fmt, args...) \	do { \		if (((x) & ivtv_debug) && (ivtv_debug & IVTV_DBGFLG_HIGHVOL)) \			printk(KERN_INFO "ivtv%d " type ": " fmt, itv->num , ## args); \	} while (0)#define IVTV_DEBUG_HI_WARN(fmt, args...)  IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_WARN,  "warn",  fmt , ## args)#define IVTV_DEBUG_HI_INFO(fmt, args...)  IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_INFO,  "info",  fmt , ## args)#define IVTV_DEBUG_HI_MB(fmt, args...)    IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_MB,    "mb",    fmt , ## args)#define IVTV_DEBUG_HI_DMA(fmt, args...)   IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_DMA,   "dma",   fmt , ## args)#define IVTV_DEBUG_HI_IOCTL(fmt, args...) IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_IOCTL, "ioctl", fmt , ## args)#define IVTV_DEBUG_HI_FILE(fmt, args...)  IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_FILE,  "file",  fmt , ## args)#define IVTV_DEBUG_HI_I2C(fmt, args...)   IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_I2C,   "i2c",   fmt , ## args)#define IVTV_DEBUG_HI_IRQ(fmt, args...)   IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_IRQ,   "irq",   fmt , ## args)#define IVTV_DEBUG_HI_DEC(fmt, args...)   IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_DEC,   "dec",   fmt , ## args)#define IVTV_DEBUG_HI_YUV(fmt, args...)   IVTV_DEBUG_HIGH_VOL(IVTV_DBGFLG_YUV,   "yuv",   fmt , ## args)/* Standard kernel messages */#define IVTV_ERR(fmt, args...)      printk(KERN_ERR  "ivtv%d: " fmt, itv->num , ## args)#define IVTV_WARN(fmt, args...)     printk(KERN_WARNING "ivtv%d: " fmt, itv->num , ## args)#define IVTV_INFO(fmt, args...)     printk(KERN_INFO "ivtv%d: " fmt, itv->num , ## args)/* output modes (cx23415 only) */#define OUT_NONE        0#define OUT_MPG         1#define OUT_YUV         2#define OUT_UDMA_YUV    3#define OUT_PASSTHROUGH 4#define IVTV_MAX_PGM_INDEX (400)struct ivtv_options {	int kilobytes[IVTV_MAX_STREAMS];        /* size in kilobytes of each stream */	int cardtype;				/* force card type on load */	int tuner;				/* set tuner on load */	int radio;				/* enable/disable radio */	int newi2c;				/* new I2C algorithm */};/* ivtv-specific mailbox template */struct ivtv_mailbox {	u32 flags;	u32 cmd;	u32 retval;	u32 timeout;	u32 data[CX2341X_MBOX_MAX_DATA];};struct ivtv_api_cache {	unsigned long last_jiffies;		/* when last command was issued */	u32 data[CX2341X_MBOX_MAX_DATA];	/* last sent api data */};struct ivtv_mailbox_data {	volatile struct ivtv_mailbox __iomem *mbox;	/* Bits 0-2 are for the encoder mailboxes, 0-1 are for the decoder mailboxes.	   If the bit is set, then the corresponding mailbox is in use by the driver. */	unsigned long busy;	u8 max_mbox;};/* per-buffer bit flags */#define IVTV_F_B_NEED_BUF_SWAP  (1 << 0)	/* this buffer should be byte swapped *//* per-stream, s_flags */#define IVTV_F_S_DMA_PENDING	0	/* this stream has pending DMA */#define IVTV_F_S_DMA_HAS_VBI	1       /* the current DMA request also requests VBI data */#define IVTV_F_S_NEEDS_DATA	2 	/* this decoding stream needs more data */#define IVTV_F_S_CLAIMED 	3	/* this stream is claimed */#define IVTV_F_S_STREAMING      4	/* the fw is decoding/encoding this stream */#define IVTV_F_S_INTERNAL_USE	5	/* this stream is used internally (sliced VBI processing) */#define IVTV_F_S_PASSTHROUGH	6	/* this stream is in passthrough mode */#define IVTV_F_S_STREAMOFF	7	/* signal end of stream EOS */#define IVTV_F_S_APPL_IO        8	/* this stream is used read/written by an application */#define IVTV_F_S_PIO_PENDING	9	/* this stream has pending PIO */#define IVTV_F_S_PIO_HAS_VBI	1       /* the current PIO request also requests VBI data *//* per-ivtv, i_flags */#define IVTV_F_I_DMA		   0 	/* DMA in progress */#define IVTV_F_I_UDMA		   1 	/* UDMA in progress */#define IVTV_F_I_UDMA_PENDING	   2 	/* UDMA pending */#define IVTV_F_I_SPEED_CHANGE	   3 	/* a speed change is in progress */#define IVTV_F_I_EOS		   4 	/* end of encoder stream reached */#define IVTV_F_I_RADIO_USER	   5 	/* the radio tuner is selected */#define IVTV_F_I_DIG_RST	   6 	/* reset digitizer */#define IVTV_F_I_DEC_YUV	   7 	/* YUV instead of MPG is being decoded */#define IVTV_F_I_UPDATE_CC	   9  	/* CC should be updated */#define IVTV_F_I_UPDATE_WSS	   10 	/* WSS should be updated */#define IVTV_F_I_UPDATE_VPS	   11 	/* VPS should be updated */#define IVTV_F_I_DECODING_YUV	   12 	/* this stream is YUV frame decoding */#define IVTV_F_I_ENC_PAUSED	   13 	/* the encoder is paused */#define IVTV_F_I_VALID_DEC_TIMINGS 14 	/* last_dec_timing is valid */#define IVTV_F_I_HAVE_WORK  	   15	/* used in the interrupt handler: there is work to be done */#define IVTV_F_I_WORK_HANDLER_VBI  16	/* there is work to be done for VBI */#define IVTV_F_I_WORK_HANDLER_YUV  17	/* there is work to be done for YUV */#define IVTV_F_I_WORK_HANDLER_PIO  18	/* there is work to be done for PIO */#define IVTV_F_I_PIO		   19	/* PIO in progress */#define IVTV_F_I_DEC_PAUSED	   20 	/* the decoder is paused */#define IVTV_F_I_INITED		   21 	/* set after first open */#define IVTV_F_I_FAILED		   22 	/* set if first open failed *//* Event notifications */#define IVTV_F_I_EV_DEC_STOPPED	   28	/* decoder stopped event */#define IVTV_F_I_EV_VSYNC	   29 	/* VSYNC event */#define IVTV_F_I_EV_VSYNC_FIELD    30 	/* VSYNC event field (0 = first, 1 = second field) */#define IVTV_F_I_EV_VSYNC_ENABLED  31 	/* VSYNC event enabled *//* Scatter-Gather array element, used in DMA transfers */struct ivtv_sg_element {	u32 src;	u32 dst;	u32 size;};struct ivtv_user_dma {	struct mutex lock;	int page_count;	struct page *map[IVTV_DMA_SG_OSD_ENT];	/* Needed when dealing with highmem userspace buffers */	struct page *bouncemap[IVTV_DMA_SG_OSD_ENT];	/* Base Dev SG Array for cx23415/6 */	struct ivtv_sg_element SGarray[IVTV_DMA_SG_OSD_ENT];	dma_addr_t SG_handle;	int SG_length;	/* SG List of Buffers */	struct scatterlist SGlist[IVTV_DMA_SG_OSD_ENT];};struct ivtv_dma_page_info {	unsigned long uaddr;	unsigned long first;	unsigned long last;	unsigned int offset;	unsigned int tail;	int page_count;};struct ivtv_buffer {	struct list_head list;	dma_addr_t dma_handle;	unsigned short b_flags;	unsigned short dma_xfer_cnt;	char *buf;	u32 bytesused;	u32 readpos;};struct ivtv_queue {	struct list_head list;          /* the list of buffers in this queue */	u32 buffers;                    /* number of buffers in this queue */	u32 length;                     /* total number of bytes of available buffer space */	u32 bytesused;                  /* total number of bytes used in this queue */};struct ivtv;				/* forward reference */struct ivtv_stream {	/* These first four fields are always set, even if the stream	   is not actually created. */	struct video_device *v4l2dev;	/* NULL when stream not created */	struct ivtv *itv; 		/* for ease of use */	const char *name;		/* name of the stream */	int type;			/* stream type */	u32 id;	spinlock_t qlock; 		/* locks access to the queues */	unsigned long s_flags;		/* status flags, see above */	int dma;			/* can be PCI_DMA_TODEVICE, PCI_DMA_FROMDEVICE or PCI_DMA_NONE */	u32 pending_offset;	u32 pending_backup;	u64 pending_pts;	u32 dma_offset;	u32 dma_backup;	u64 dma_pts;	int subtype;	wait_queue_head_t waitq;	u32 dma_last_offset;	/* Buffer Stats */	u32 buffers;	u32 buf_size;	u32 buffers_stolen;	/* Buffer Queues */	struct ivtv_queue q_free;	/* free buffers */	struct ivtv_queue q_full;	/* full buffers */	struct ivtv_queue q_io;		/* waiting for I/O */	struct ivtv_queue q_dma;	/* waiting for DMA */	struct ivtv_queue q_predma;	/* waiting for DMA */	/* DMA xfer counter, buffers belonging to the same DMA	   xfer will have the same dma_xfer_cnt. */	u16 dma_xfer_cnt;	/* Base Dev SG Array for cx23415/6 */	struct ivtv_sg_element *sg_pending;	struct ivtv_sg_element *sg_processing;	struct ivtv_sg_element *sg_dma;	dma_addr_t sg_handle;	int sg_pending_size;	int sg_processing_size;	int sg_processed;	/* SG List of Buffers */	struct scatterlist *SGlist;};struct ivtv_open_id {	u32 open_id;                    /* unique ID for this file descriptor */	int type;                       /* stream type */	int yuv_frames;                 /* 1: started OUT_UDMA_YUV output mode */	enum v4l2_priority prio;        /* priority */	struct ivtv *itv;};struct yuv_frame_info{	u32 update;	s32 src_x;	s32 src_y;	u32 src_w;	u32 src_h;	s32 dst_x;	s32 dst_y;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -