📄 ivtv-driver.h
字号:
/* 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 + -