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,14)
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 struct bttv_buffer *vbi; /* vbi buffer */
131 unsigned int irqflags;
135 struct bttv_overlay {
138 enum v4l2_field field;
139 struct v4l2_clip *clips;
147 #ifdef VIDIOC_G_PRIORITY
148 enum v4l2_priority prio;
150 enum v4l2_buf_type type;
153 struct videobuf_queue cap;
154 const struct bttv_format *fmt;
158 /* current settings */
159 const struct bttv_format *ovfmt;
160 struct bttv_overlay ov;
163 struct videobuf_queue vbi;
167 /* ---------------------------------------------------------- */
170 /* risc code generators - capture */
171 int bttv_risc_packed(struct bttv *btv, struct btcx_riscmem *risc,
172 struct scatterlist *sglist,
173 unsigned int offset, unsigned int bpl,
174 unsigned int pitch, unsigned int lines);
175 int bttv_risc_planar(struct bttv *btv, struct btcx_riscmem *risc,
176 struct scatterlist *sglist,
177 unsigned int yoffset, unsigned int ybpl,
178 unsigned int ypadding, unsigned int ylines,
179 unsigned int uoffset, unsigned int voffset,
180 unsigned int hshift, unsigned int vshift,
181 unsigned int cpadding);
182 int bttv_risc_overlay(struct bttv *btv, struct btcx_riscmem *risc,
183 const struct bttv_format *fmt,
184 struct bttv_overlay *ov,
185 int skip_top, int skip_bottom);
187 /* calculate / apply geometry settings */
188 void bttv_calc_geo(struct bttv *btv, struct bttv_geometry *geo,
189 int width, int height, int interleaved, int norm);
190 void bttv_apply_geo(struct bttv *btv, struct bttv_geometry *geo, int top);
192 /* control dma register + risc main loop */
193 void bttv_set_dma(struct bttv *btv, int override, int irqflags);
194 int bttv_risc_init_main(struct bttv *btv);
195 int bttv_risc_hook(struct bttv *btv, int slot, struct btcx_riscmem *risc,
198 /* capture buffer handling */
199 int bttv_buffer_risc(struct bttv *btv, struct bttv_buffer *buf);
200 int bttv_buffer_set_activate(struct bttv *btv,
201 struct bttv_buffer_set *set);
202 void bttv_dma_free(struct bttv *btv, struct bttv_buffer *buf);
204 /* overlay handling */
205 int bttv_overlay_risc(struct bttv *btv, struct bttv_overlay *ov,
206 const struct bttv_format *fmt,
207 struct bttv_buffer *buf);
210 /* ---------------------------------------------------------- */
213 void bttv_vbi_try_fmt(struct bttv_fh *fh, struct v4l2_format *f);
214 void bttv_vbi_get_fmt(struct bttv_fh *fh, struct v4l2_format *f);
215 void bttv_vbi_setlines(struct bttv_fh *fh, struct bttv *btv, int lines);
217 extern struct videobuf_queue_ops bttv_vbi_qops;
219 /* ---------------------------------------------------------- */
223 extern struct bus_type bttv_sub_bus_type;
224 int bttv_sub_add_device(struct bttv_core *core, char *name);
225 int bttv_sub_del_devices(struct bttv_core *core);
226 void bttv_gpio_irq(struct bttv_core *core);
229 /* ---------------------------------------------------------- */
233 extern unsigned int bttv_verbose;
234 extern unsigned int bttv_debug;
235 extern unsigned int bttv_gpio;
236 extern void bttv_gpio_tracking(struct bttv *btv, char *comment);
237 extern int init_bttv_i2c(struct bttv *btv);
238 extern int fini_bttv_i2c(struct bttv *btv);
239 extern int pvr_boot(struct bttv *btv);
241 extern int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg);
242 extern void bttv_reinit_bt848(struct bttv *btv);
243 extern void bttv_field_count(struct bttv *btv);
245 #define vprintk if (bttv_verbose) printk
246 #define dprintk if (bttv_debug >= 1) printk
247 #define d2printk if (bttv_debug >= 2) printk
251 extern unsigned int bttv_num;
252 extern struct bttv bttvs[BTTV_MAX];
254 #define BTTV_MAX_FBUF 0x208000
255 #define VBIBUF_SIZE (2048*VBI_MAXLINES*2)
256 #define BTTV_TIMEOUT (HZ/2) /* 0.5 seconds */
257 #define BTTV_FREE_IDLE (HZ) /* one second */
260 struct bttv_pll_info {
261 unsigned int pll_ifreq; /* PLL input frequency */
262 unsigned int pll_ofreq; /* PLL output frequency */
263 unsigned int pll_crystal; /* Crystal used for input */
264 unsigned int pll_current; /* Currently programmed ofreq */
267 /* for gpio-connected remote control */
269 struct input_dev dev;
270 struct ir_input_state ir;
277 struct bttv_suspend_state {
278 u32 pci_cfg[64 / sizeof(u32)];
282 struct bttv_buffer_set set;
288 /* pci device config */
290 unsigned char revision;
291 unsigned char *bt848_mmio; /* pointer to mmio */
293 /* card configuration info */
294 unsigned int cardid; /* pci subsystem id (bt878 based ones) */
295 unsigned int tuner_type; /* tuner chip type */
296 unsigned int pinnacle_id;
298 struct bttv_pll_info pll;
303 /* old gpio interface */
304 wait_queue_head_t gpioq;
306 void (*audio_hook)(struct bttv *btv, struct video_audio *v, int set);
308 /* new gpio interface */
309 spinlock_t gpio_lock;
312 struct i2c_algo_bit_data i2c_algo;
313 struct i2c_client i2c_client;
314 int i2c_state, i2c_rc;
316 wait_queue_head_t i2c_queue;
318 /* video4linux (1) */
319 struct video_device *video_dev;
320 struct video_device *radio_dev;
321 struct video_device *vbi_dev;
323 /* infrared remote */
325 struct bttv_input *remote;
329 struct semaphore lock;
331 struct semaphore reslock;
332 #ifdef VIDIOC_G_PRIORITY
333 struct v4l2_prio_state prio;
340 int tvnorm,hue,contrast,bright,saturation;
341 struct v4l2_framebuffer fbuf;
342 unsigned int field_count;
344 /* various options */
351 int opt_whitecrush_upper;
352 int opt_whitecrush_lower;
354 /* radio data/state */
358 /* miro/pinnacle + Aimslab VHX
359 philips matchbox (tea5757 radio tuner) support */
367 /* ISA stuff (Terratec Active Radio Upgrade) */
372 /* risc memory management data
373 - must aquire s_lock before changing these
374 - only the irq handler is supported to touch top + bottom + vcurr */
375 struct btcx_riscmem main;
376 struct bttv_buffer *screen; /* overlay */
377 struct list_head capture; /* video capture queue */
378 struct list_head vcapture; /* vbi capture queue */
379 struct bttv_buffer_set curr; /* active buffers */
382 unsigned long cap_ctl;
383 unsigned long dma_on;
384 struct timer_list timeout;
385 struct bttv_suspend_state state;
389 unsigned int framedrop;
390 unsigned int irq_total;
398 #define BTTV_VERSION _IOR('v' , BASE_VIDIOCPRIVATE+6, int)
399 #define BTTV_VBISIZE _IOR('v' , BASE_VIDIOCPRIVATE+8, int)
403 #define btwrite(dat,adr) writel((dat), (char *) (btv->bt848_mmio+(adr)))
404 #define btread(adr) readl(btv->bt848_mmio+(adr))
406 #define btand(dat,adr) btwrite((dat) & btread(adr), adr)
407 #define btor(dat,adr) btwrite((dat) | btread(adr), adr)
408 #define btaor(dat,mask,adr) btwrite((dat) | ((mask) & btread(adr)), adr)
410 #endif /* _BTTVP_H_ */