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);
230 /* ---------------------------------------------------------- */
234 extern unsigned int bttv_verbose;
235 extern unsigned int bttv_debug;
236 extern unsigned int bttv_gpio;
237 extern void bttv_gpio_tracking(struct bttv *btv, char *comment);
238 extern int init_bttv_i2c(struct bttv *btv);
239 extern int fini_bttv_i2c(struct bttv *btv);
240 extern int pvr_boot(struct bttv *btv);
242 extern int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg);
243 extern void bttv_reinit_bt848(struct bttv *btv);
244 extern void bttv_field_count(struct bttv *btv);
246 #define vprintk if (bttv_verbose) printk
247 #define dprintk if (bttv_debug >= 1) printk
248 #define d2printk if (bttv_debug >= 2) printk
252 extern unsigned int bttv_num;
253 extern struct bttv bttvs[BTTV_MAX];
255 #define BTTV_MAX_FBUF 0x208000
256 #define VBIBUF_SIZE (2048*VBI_MAXLINES*2)
257 #define BTTV_TIMEOUT (HZ/2) /* 0.5 seconds */
258 #define BTTV_FREE_IDLE (HZ) /* one second */
261 struct bttv_pll_info {
262 unsigned int pll_ifreq; /* PLL input frequency */
263 unsigned int pll_ofreq; /* PLL output frequency */
264 unsigned int pll_crystal; /* Crystal used for input */
265 unsigned int pll_current; /* Currently programmed ofreq */
268 /* for gpio-connected remote control */
270 struct input_dev dev;
271 struct ir_input_state ir;
278 struct bttv_suspend_state {
279 u32 pci_cfg[64 / sizeof(u32)];
283 struct bttv_buffer_set video;
284 struct bttv_buffer *vbi;
290 /* pci device config */
292 unsigned char revision;
293 unsigned char *bt848_mmio; /* pointer to mmio */
295 /* card configuration info */
296 unsigned int cardid; /* pci subsystem id (bt878 based ones) */
297 unsigned int tuner_type; /* tuner chip type */
298 unsigned int pinnacle_id;
300 struct bttv_pll_info pll;
305 /* old gpio interface */
306 wait_queue_head_t gpioq;
308 void (*audio_hook)(struct bttv *btv, struct video_audio *v, int set);
310 /* new gpio interface */
311 spinlock_t gpio_lock;
314 struct i2c_algo_bit_data i2c_algo;
315 struct i2c_client i2c_client;
316 int i2c_state, i2c_rc;
318 wait_queue_head_t i2c_queue;
320 /* video4linux (1) */
321 struct video_device *video_dev;
322 struct video_device *radio_dev;
323 struct video_device *vbi_dev;
325 /* infrared remote */
327 struct bttv_input *remote;
331 struct semaphore lock;
333 struct semaphore reslock;
334 #ifdef VIDIOC_G_PRIORITY
335 struct v4l2_prio_state prio;
342 int tvnorm,hue,contrast,bright,saturation;
343 struct v4l2_framebuffer fbuf;
344 unsigned int field_count;
346 /* various options */
353 int opt_whitecrush_upper;
354 int opt_whitecrush_lower;
356 /* radio data/state */
360 /* miro/pinnacle + Aimslab VHX
361 philips matchbox (tea5757 radio tuner) support */
369 /* ISA stuff (Terratec Active Radio Upgrade) */
374 /* risc memory management data
375 - must aquire s_lock before changing these
376 - only the irq handler is supported to touch top + bottom + vcurr */
377 struct btcx_riscmem main;
378 struct bttv_buffer *screen; /* overlay */
379 struct list_head capture; /* video capture queue */
380 struct list_head vcapture; /* vbi capture queue */
381 struct bttv_buffer_set curr; /* active buffers */
382 struct bttv_buffer *cvbi; /* active vbi buffer */
385 unsigned long cap_ctl;
386 unsigned long dma_on;
387 struct timer_list timeout;
388 struct bttv_suspend_state state;
392 unsigned int framedrop;
393 unsigned int irq_total;
401 #define BTTV_VERSION _IOR('v' , BASE_VIDIOCPRIVATE+6, int)
402 #define BTTV_VBISIZE _IOR('v' , BASE_VIDIOCPRIVATE+8, int)
406 #define btwrite(dat,adr) writel((dat), (char *) (btv->bt848_mmio+(adr)))
407 #define btread(adr) readl(btv->bt848_mmio+(adr))
409 #define btand(dat,adr) btwrite((dat) & btread(adr), adr)
410 #define btor(dat,adr) btwrite((dat) | btread(adr), adr)
411 #define btaor(dat,mask,adr) btwrite((dat) | ((mask) & btread(adr)), adr)
413 #endif /* _BTTVP_H_ */