2 bttv - Bt848 frame grabber driver
4 bttv's *private* header file -- nobody other than bttv itself
5 should ever include this file.
7 (c) 2000-2002 Gerd Knorr <kraxel@bytesex.org>
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <linux/version.h>
28 #define BTTV_VERSION_CODE KERNEL_VERSION(0,9,15)
30 #include <linux/types.h>
31 #include <linux/wait.h>
32 #include <linux/i2c.h>
33 #include <linux/i2c-algo-bit.h>
34 #include <linux/videodev.h>
35 #include <linux/pci.h>
36 #include <linux/input.h>
37 #include <asm/scatterlist.h>
40 #include <linux/device.h>
41 #include <media/video-buf.h>
42 #include <media/audiochip.h>
43 #include <media/tuner.h>
44 #include <media/ir-common.h>
48 #include "btcx-risc.h"
52 #define FORMAT_FLAGS_DITHER 0x01
53 #define FORMAT_FLAGS_PACKED 0x02
54 #define FORMAT_FLAGS_PLANAR 0x04
55 #define FORMAT_FLAGS_RAW 0x08
56 #define FORMAT_FLAGS_CrCb 0x10
58 #define RISC_SLOT_O_VBI 4
59 #define RISC_SLOT_O_FIELD 6
60 #define RISC_SLOT_E_VBI 10
61 #define RISC_SLOT_E_FIELD 12
62 #define RISC_SLOT_LOOP 14
64 #define RESOURCE_OVERLAY 1
65 #define RESOURCE_VIDEO 2
66 #define RESOURCE_VBI 4
73 /* ---------------------------------------------------------- */
79 u16 swidth, sheight; /* scaled standard width, height */
81 u8 adelay, bdelay, iform;
83 u16 hdelayx1, hactivex1;
89 extern const struct bttv_tvnorm bttv_tvnorms[];
90 extern const unsigned int BTTV_TVNORMS;
94 int palette; /* video4linux 1 */
95 int fourcc; /* video4linux 2 */
96 int btformat; /* BT848_COLOR_FMT_* */
97 int btswap; /* BT848_COLOR_CTL_* */
98 int depth; /* bit/pixel */
100 int hshift,vshift; /* for planar modes */
102 extern const struct bttv_format bttv_formats[];
103 extern const unsigned int BTTV_FORMATS;
105 /* ---------------------------------------------------------- */
107 struct bttv_geometry {
109 u16 width,hscale,hdelay;
110 u16 sheight,vscale,vdelay,vtotal;
114 /* common v4l buffer stuff -- must be first */
115 struct videobuf_buffer vb;
118 const struct bttv_format *fmt;
122 struct bttv_geometry geo;
123 struct btcx_riscmem top;
124 struct btcx_riscmem bottom;
127 struct bttv_buffer_set {
128 struct bttv_buffer *top; /* top field buffer */
129 struct bttv_buffer *bottom; /* bottom field buffer */
130 unsigned int irqflags;
134 struct bttv_overlay {
137 enum v4l2_field field;
138 struct v4l2_clip *clips;
146 #ifdef VIDIOC_G_PRIORITY
147 enum v4l2_priority prio;
149 enum v4l2_buf_type type;
152 struct videobuf_queue cap;
153 const struct bttv_format *fmt;
157 /* current settings */
158 const struct bttv_format *ovfmt;
159 struct bttv_overlay ov;
162 struct videobuf_queue vbi;
166 /* ---------------------------------------------------------- */
169 /* risc code generators - capture */
170 int bttv_risc_packed(struct bttv *btv, struct btcx_riscmem *risc,
171 struct scatterlist *sglist,
172 unsigned int offset, unsigned int bpl,
173 unsigned int pitch, unsigned int lines);
174 int bttv_risc_planar(struct bttv *btv, struct btcx_riscmem *risc,
175 struct scatterlist *sglist,
176 unsigned int yoffset, unsigned int ybpl,
177 unsigned int ypadding, unsigned int ylines,
178 unsigned int uoffset, unsigned int voffset,
179 unsigned int hshift, unsigned int vshift,
180 unsigned int cpadding);
181 int bttv_risc_overlay(struct bttv *btv, struct btcx_riscmem *risc,
182 const struct bttv_format *fmt,
183 struct bttv_overlay *ov,
184 int skip_top, int skip_bottom);
186 /* calculate / apply geometry settings */
187 void bttv_calc_geo(struct bttv *btv, struct bttv_geometry *geo,
188 int width, int height, int interleaved, int norm);
189 void bttv_apply_geo(struct bttv *btv, struct bttv_geometry *geo, int top);
191 /* control dma register + risc main loop */
192 void bttv_set_dma(struct bttv *btv, int override, int irqflags);
193 int bttv_risc_init_main(struct bttv *btv);
194 int bttv_risc_hook(struct bttv *btv, int slot, struct btcx_riscmem *risc,
197 /* capture buffer handling */
198 int bttv_buffer_risc(struct bttv *btv, struct bttv_buffer *buf);
199 int bttv_buffer_activate_video(struct bttv *btv,
200 struct bttv_buffer_set *set);
201 int bttv_buffer_activate_vbi(struct bttv *btv,
202 struct bttv_buffer *vbi);
203 void bttv_dma_free(struct bttv *btv, struct bttv_buffer *buf);
205 /* overlay handling */
206 int bttv_overlay_risc(struct bttv *btv, struct bttv_overlay *ov,
207 const struct bttv_format *fmt,
208 struct bttv_buffer *buf);
211 /* ---------------------------------------------------------- */
214 void bttv_vbi_try_fmt(struct bttv_fh *fh, struct v4l2_format *f);
215 void bttv_vbi_get_fmt(struct bttv_fh *fh, struct v4l2_format *f);
216 void bttv_vbi_setlines(struct bttv_fh *fh, struct bttv *btv, int lines);
218 extern struct videobuf_queue_ops bttv_vbi_qops;
220 /* ---------------------------------------------------------- */
224 extern struct bus_type bttv_sub_bus_type;
225 int bttv_sub_add_device(struct bttv_core *core, char *name);
226 int bttv_sub_del_devices(struct bttv_core *core);
227 void bttv_gpio_irq(struct bttv_core *core);
228 void bttv_i2c_info(struct bttv_core *core, struct i2c_client *client, int attach);
231 /* ---------------------------------------------------------- */
235 extern unsigned int bttv_verbose;
236 extern unsigned int bttv_debug;
237 extern unsigned int bttv_gpio;
238 extern void bttv_gpio_tracking(struct bttv *btv, char *comment);
239 extern int init_bttv_i2c(struct bttv *btv);
240 extern int fini_bttv_i2c(struct bttv *btv);
241 extern int pvr_boot(struct bttv *btv);
243 extern int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg);
244 extern void bttv_reinit_bt848(struct bttv *btv);
245 extern void bttv_field_count(struct bttv *btv);
247 #define vprintk if (bttv_verbose) printk
248 #define dprintk if (bttv_debug >= 1) printk
249 #define d2printk if (bttv_debug >= 2) printk
253 extern unsigned int bttv_num;
254 extern struct bttv bttvs[BTTV_MAX];
256 #define BTTV_MAX_FBUF 0x208000
257 #define VBIBUF_SIZE (2048*VBI_MAXLINES*2)
258 #define BTTV_TIMEOUT (HZ/2) /* 0.5 seconds */
259 #define BTTV_FREE_IDLE (HZ) /* one second */
262 struct bttv_pll_info {
263 unsigned int pll_ifreq; /* PLL input frequency */
264 unsigned int pll_ofreq; /* PLL output frequency */
265 unsigned int pll_crystal; /* Crystal used for input */
266 unsigned int pll_current; /* Currently programmed ofreq */
269 /* for gpio-connected remote control */
271 struct input_dev dev;
272 struct ir_input_state ir;
279 struct bttv_suspend_state {
280 u32 pci_cfg[64 / sizeof(u32)];
284 struct bttv_buffer_set video;
285 struct bttv_buffer *vbi;
291 /* pci device config */
293 unsigned char revision;
294 unsigned char *bt848_mmio; /* pointer to mmio */
296 /* card configuration info */
297 unsigned int cardid; /* pci subsystem id (bt878 based ones) */
298 unsigned int tuner_type; /* tuner chip type */
299 unsigned int pinnacle_id;
301 struct bttv_pll_info pll;
306 /* old gpio interface */
307 wait_queue_head_t gpioq;
309 void (*audio_hook)(struct bttv *btv, struct video_audio *v, int set);
311 /* new gpio interface */
312 spinlock_t gpio_lock;
315 struct i2c_algo_bit_data i2c_algo;
316 struct i2c_client i2c_client;
317 int i2c_state, i2c_rc;
319 wait_queue_head_t i2c_queue;
321 /* video4linux (1) */
322 struct video_device *video_dev;
323 struct video_device *radio_dev;
324 struct video_device *vbi_dev;
326 /* infrared remote */
328 struct bttv_input *remote;
332 struct semaphore lock;
334 struct semaphore reslock;
335 #ifdef VIDIOC_G_PRIORITY
336 struct v4l2_prio_state prio;
343 int tvnorm,hue,contrast,bright,saturation;
344 struct v4l2_framebuffer fbuf;
345 unsigned int field_count;
347 /* various options */
354 int opt_whitecrush_upper;
355 int opt_whitecrush_lower;
357 /* radio data/state */
361 /* miro/pinnacle + Aimslab VHX
362 philips matchbox (tea5757 radio tuner) support */
370 /* ISA stuff (Terratec Active Radio Upgrade) */
375 /* risc memory management data
376 - must aquire s_lock before changing these
377 - only the irq handler is supported to touch top + bottom + vcurr */
378 struct btcx_riscmem main;
379 struct bttv_buffer *screen; /* overlay */
380 struct list_head capture; /* video capture queue */
381 struct list_head vcapture; /* vbi capture queue */
382 struct bttv_buffer_set curr; /* active buffers */
383 struct bttv_buffer *cvbi; /* active vbi buffer */
386 unsigned long cap_ctl;
387 unsigned long dma_on;
388 struct timer_list timeout;
389 struct bttv_suspend_state state;
393 unsigned int framedrop;
394 unsigned int irq_total;
402 #define BTTV_VERSION _IOR('v' , BASE_VIDIOCPRIVATE+6, int)
403 #define BTTV_VBISIZE _IOR('v' , BASE_VIDIOCPRIVATE+8, int)
407 #define btwrite(dat,adr) writel((dat), (char *) (btv->bt848_mmio+(adr)))
408 #define btread(adr) readl(btv->bt848_mmio+(adr))
410 #define btand(dat,adr) btwrite((dat) & btread(adr), adr)
411 #define btor(dat,adr) btwrite((dat) | btread(adr), adr)
412 #define btaor(dat,mask,adr) btwrite((dat) | ((mask) & btread(adr)), adr)
414 #endif /* _BTTVP_H_ */