Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/media/video/bt8xx/bttv-vbi.c
10785 views
1
/*
2
3
bttv - Bt848 frame grabber driver
4
vbi interface
5
6
(c) 2002 Gerd Knorr <[email protected]>
7
8
Copyright (C) 2005, 2006 Michael H. Schimek <[email protected]>
9
Sponsored by OPQ Systems AB
10
11
This program is free software; you can redistribute it and/or modify
12
it under the terms of the GNU General Public License as published by
13
the Free Software Foundation; either version 2 of the License, or
14
(at your option) any later version.
15
16
This program is distributed in the hope that it will be useful,
17
but WITHOUT ANY WARRANTY; without even the implied warranty of
18
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
GNU General Public License for more details.
20
21
You should have received a copy of the GNU General Public License
22
along with this program; if not, write to the Free Software
23
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24
*/
25
26
#include <linux/module.h>
27
#include <linux/errno.h>
28
#include <linux/fs.h>
29
#include <linux/kernel.h>
30
#include <linux/interrupt.h>
31
#include <linux/kdev_t.h>
32
#include <media/v4l2-ioctl.h>
33
#include <asm/io.h>
34
#include "bttvp.h"
35
36
/* Offset from line sync pulse leading edge (0H) to start of VBI capture,
37
in fCLKx2 pixels. According to the datasheet, VBI capture starts
38
VBI_HDELAY fCLKx1 pixels from the tailing edgeof /HRESET, and /HRESET
39
is 64 fCLKx1 pixels wide. VBI_HDELAY is set to 0, so this should be
40
(64 + 0) * 2 = 128 fCLKx2 pixels. But it's not! The datasheet is
41
Just Plain Wrong. The real value appears to be different for
42
different revisions of the bt8x8 chips, and to be affected by the
43
horizontal scaling factor. Experimentally, the value is measured
44
to be about 244. */
45
#define VBI_OFFSET 244
46
47
/* 2048 for compatibility with earlier driver versions. The driver
48
really stores 1024 + tvnorm->vbipack * 4 samples per line in the
49
buffer. Note tvnorm->vbipack is <= 0xFF (limit of VBIPACK_LO + HI
50
is 0x1FF DWORDs) and VBI read()s store a frame counter in the last
51
four bytes of the VBI image. */
52
#define VBI_BPL 2048
53
54
/* Compatibility. */
55
#define VBI_DEFLINES 16
56
57
static unsigned int vbibufs = 4;
58
static unsigned int vbi_debug;
59
60
module_param(vbibufs, int, 0444);
61
module_param(vbi_debug, int, 0644);
62
MODULE_PARM_DESC(vbibufs,"number of vbi buffers, range 2-32, default 4");
63
MODULE_PARM_DESC(vbi_debug,"vbi code debug messages, default is 0 (no)");
64
65
#ifdef dprintk
66
# undef dprintk
67
#endif
68
#define dprintk(fmt, arg...) if (vbi_debug) \
69
printk(KERN_DEBUG "bttv%d/vbi: " fmt, btv->c.nr , ## arg)
70
71
#define IMAGE_SIZE(fmt) \
72
(((fmt)->count[0] + (fmt)->count[1]) * (fmt)->samples_per_line)
73
74
/* ----------------------------------------------------------------------- */
75
/* vbi risc code + mm */
76
77
static int vbi_buffer_setup(struct videobuf_queue *q,
78
unsigned int *count, unsigned int *size)
79
{
80
struct bttv_fh *fh = q->priv_data;
81
struct bttv *btv = fh->btv;
82
83
if (0 == *count)
84
*count = vbibufs;
85
86
*size = IMAGE_SIZE(&fh->vbi_fmt.fmt);
87
88
dprintk("setup: samples=%u start=%d,%d count=%u,%u\n",
89
fh->vbi_fmt.fmt.samples_per_line,
90
fh->vbi_fmt.fmt.start[0],
91
fh->vbi_fmt.fmt.start[1],
92
fh->vbi_fmt.fmt.count[0],
93
fh->vbi_fmt.fmt.count[1]);
94
95
return 0;
96
}
97
98
static int vbi_buffer_prepare(struct videobuf_queue *q,
99
struct videobuf_buffer *vb,
100
enum v4l2_field field)
101
{
102
struct bttv_fh *fh = q->priv_data;
103
struct bttv *btv = fh->btv;
104
struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
105
const struct bttv_tvnorm *tvnorm;
106
unsigned int skip_lines0, skip_lines1, min_vdelay;
107
int redo_dma_risc;
108
int rc;
109
110
buf->vb.size = IMAGE_SIZE(&fh->vbi_fmt.fmt);
111
if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
112
return -EINVAL;
113
114
tvnorm = fh->vbi_fmt.tvnorm;
115
116
/* There's no VBI_VDELAY register, RISC must skip the lines
117
we don't want. With default parameters we skip zero lines
118
as earlier driver versions did. The driver permits video
119
standard changes while capturing, so we use vbi_fmt.tvnorm
120
instead of btv->tvnorm to skip zero lines after video
121
standard changes as well. */
122
123
skip_lines0 = 0;
124
skip_lines1 = 0;
125
126
if (fh->vbi_fmt.fmt.count[0] > 0)
127
skip_lines0 = max(0, (fh->vbi_fmt.fmt.start[0]
128
- tvnorm->vbistart[0]));
129
if (fh->vbi_fmt.fmt.count[1] > 0)
130
skip_lines1 = max(0, (fh->vbi_fmt.fmt.start[1]
131
- tvnorm->vbistart[1]));
132
133
redo_dma_risc = 0;
134
135
if (buf->vbi_skip[0] != skip_lines0 ||
136
buf->vbi_skip[1] != skip_lines1 ||
137
buf->vbi_count[0] != fh->vbi_fmt.fmt.count[0] ||
138
buf->vbi_count[1] != fh->vbi_fmt.fmt.count[1]) {
139
buf->vbi_skip[0] = skip_lines0;
140
buf->vbi_skip[1] = skip_lines1;
141
buf->vbi_count[0] = fh->vbi_fmt.fmt.count[0];
142
buf->vbi_count[1] = fh->vbi_fmt.fmt.count[1];
143
redo_dma_risc = 1;
144
}
145
146
if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
147
redo_dma_risc = 1;
148
if (0 != (rc = videobuf_iolock(q, &buf->vb, NULL)))
149
goto fail;
150
}
151
152
if (redo_dma_risc) {
153
unsigned int bpl, padding, offset;
154
struct videobuf_dmabuf *dma=videobuf_to_dma(&buf->vb);
155
156
bpl = 2044; /* max. vbipack */
157
padding = VBI_BPL - bpl;
158
159
if (fh->vbi_fmt.fmt.count[0] > 0) {
160
rc = bttv_risc_packed(btv, &buf->top,
161
dma->sglist,
162
/* offset */ 0, bpl,
163
padding, skip_lines0,
164
fh->vbi_fmt.fmt.count[0]);
165
if (0 != rc)
166
goto fail;
167
}
168
169
if (fh->vbi_fmt.fmt.count[1] > 0) {
170
offset = fh->vbi_fmt.fmt.count[0] * VBI_BPL;
171
172
rc = bttv_risc_packed(btv, &buf->bottom,
173
dma->sglist,
174
offset, bpl,
175
padding, skip_lines1,
176
fh->vbi_fmt.fmt.count[1]);
177
if (0 != rc)
178
goto fail;
179
}
180
}
181
182
/* VBI capturing ends at VDELAY, start of video capturing,
183
no matter where the RISC program ends. VDELAY minimum is 2,
184
bounds.top is the corresponding first field line number
185
times two. VDELAY counts half field lines. */
186
min_vdelay = MIN_VDELAY;
187
if (fh->vbi_fmt.end >= tvnorm->cropcap.bounds.top)
188
min_vdelay += fh->vbi_fmt.end - tvnorm->cropcap.bounds.top;
189
190
/* For bttv_buffer_activate_vbi(). */
191
buf->geo.vdelay = min_vdelay;
192
193
buf->vb.state = VIDEOBUF_PREPARED;
194
buf->vb.field = field;
195
dprintk("buf prepare %p: top=%p bottom=%p field=%s\n",
196
vb, &buf->top, &buf->bottom,
197
v4l2_field_names[buf->vb.field]);
198
return 0;
199
200
fail:
201
bttv_dma_free(q,btv,buf);
202
return rc;
203
}
204
205
static void
206
vbi_buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
207
{
208
struct bttv_fh *fh = q->priv_data;
209
struct bttv *btv = fh->btv;
210
struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
211
212
dprintk("queue %p\n",vb);
213
buf->vb.state = VIDEOBUF_QUEUED;
214
list_add_tail(&buf->vb.queue,&btv->vcapture);
215
if (NULL == btv->cvbi) {
216
fh->btv->loop_irq |= 4;
217
bttv_set_dma(btv,0x0c);
218
}
219
}
220
221
static void vbi_buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
222
{
223
struct bttv_fh *fh = q->priv_data;
224
struct bttv *btv = fh->btv;
225
struct bttv_buffer *buf = container_of(vb,struct bttv_buffer,vb);
226
227
dprintk("free %p\n",vb);
228
bttv_dma_free(q,fh->btv,buf);
229
}
230
231
struct videobuf_queue_ops bttv_vbi_qops = {
232
.buf_setup = vbi_buffer_setup,
233
.buf_prepare = vbi_buffer_prepare,
234
.buf_queue = vbi_buffer_queue,
235
.buf_release = vbi_buffer_release,
236
};
237
238
/* ----------------------------------------------------------------------- */
239
240
static int try_fmt(struct v4l2_vbi_format *f, const struct bttv_tvnorm *tvnorm,
241
__s32 crop_start)
242
{
243
__s32 min_start, max_start, max_end, f2_offset;
244
unsigned int i;
245
246
/* For compatibility with earlier driver versions we must pretend
247
the VBI and video capture window may overlap. In reality RISC
248
magic aborts VBI capturing at the first line of video capturing,
249
leaving the rest of the buffer unchanged, usually all zero.
250
VBI capturing must always start before video capturing. >> 1
251
because cropping counts field lines times two. */
252
min_start = tvnorm->vbistart[0];
253
max_start = (crop_start >> 1) - 1;
254
max_end = (tvnorm->cropcap.bounds.top
255
+ tvnorm->cropcap.bounds.height) >> 1;
256
257
if (min_start > max_start)
258
return -EBUSY;
259
260
BUG_ON(max_start >= max_end);
261
262
f->sampling_rate = tvnorm->Fsc;
263
f->samples_per_line = VBI_BPL;
264
f->sample_format = V4L2_PIX_FMT_GREY;
265
f->offset = VBI_OFFSET;
266
267
f2_offset = tvnorm->vbistart[1] - tvnorm->vbistart[0];
268
269
for (i = 0; i < 2; ++i) {
270
if (0 == f->count[i]) {
271
/* No data from this field. We leave f->start[i]
272
alone because VIDIOCSVBIFMT is w/o and EINVALs
273
when a driver does not support exactly the
274
requested parameters. */
275
} else {
276
s64 start, count;
277
278
start = clamp(f->start[i], min_start, max_start);
279
/* s64 to prevent overflow. */
280
count = (s64) f->start[i] + f->count[i] - start;
281
f->start[i] = start;
282
f->count[i] = clamp(count, (s64) 1,
283
max_end - start);
284
}
285
286
min_start += f2_offset;
287
max_start += f2_offset;
288
max_end += f2_offset;
289
}
290
291
if (0 == (f->count[0] | f->count[1])) {
292
/* As in earlier driver versions. */
293
f->start[0] = tvnorm->vbistart[0];
294
f->start[1] = tvnorm->vbistart[1];
295
f->count[0] = 1;
296
f->count[1] = 1;
297
}
298
299
f->flags = 0;
300
301
f->reserved[0] = 0;
302
f->reserved[1] = 0;
303
304
return 0;
305
}
306
307
int bttv_try_fmt_vbi_cap(struct file *file, void *f, struct v4l2_format *frt)
308
{
309
struct bttv_fh *fh = f;
310
struct bttv *btv = fh->btv;
311
const struct bttv_tvnorm *tvnorm;
312
__s32 crop_start;
313
314
mutex_lock(&btv->lock);
315
316
tvnorm = &bttv_tvnorms[btv->tvnorm];
317
crop_start = btv->crop_start;
318
319
mutex_unlock(&btv->lock);
320
321
return try_fmt(&frt->fmt.vbi, tvnorm, crop_start);
322
}
323
324
325
int bttv_s_fmt_vbi_cap(struct file *file, void *f, struct v4l2_format *frt)
326
{
327
struct bttv_fh *fh = f;
328
struct bttv *btv = fh->btv;
329
const struct bttv_tvnorm *tvnorm;
330
__s32 start1, end;
331
int rc;
332
333
mutex_lock(&btv->lock);
334
335
rc = -EBUSY;
336
if (fh->resources & RESOURCE_VBI)
337
goto fail;
338
339
tvnorm = &bttv_tvnorms[btv->tvnorm];
340
341
rc = try_fmt(&frt->fmt.vbi, tvnorm, btv->crop_start);
342
if (0 != rc)
343
goto fail;
344
345
start1 = frt->fmt.vbi.start[1] - tvnorm->vbistart[1] +
346
tvnorm->vbistart[0];
347
348
/* First possible line of video capturing. Should be
349
max(f->start[0] + f->count[0], start1 + f->count[1]) * 2
350
when capturing both fields. But for compatibility we must
351
pretend the VBI and video capture window may overlap,
352
so end = start + 1, the lowest possible value, times two
353
because vbi_fmt.end counts field lines times two. */
354
end = max(frt->fmt.vbi.start[0], start1) * 2 + 2;
355
356
mutex_lock(&fh->vbi.vb_lock);
357
358
fh->vbi_fmt.fmt = frt->fmt.vbi;
359
fh->vbi_fmt.tvnorm = tvnorm;
360
fh->vbi_fmt.end = end;
361
362
mutex_unlock(&fh->vbi.vb_lock);
363
364
rc = 0;
365
366
fail:
367
mutex_unlock(&btv->lock);
368
369
return rc;
370
}
371
372
373
int bttv_g_fmt_vbi_cap(struct file *file, void *f, struct v4l2_format *frt)
374
{
375
struct bttv_fh *fh = f;
376
const struct bttv_tvnorm *tvnorm;
377
378
frt->fmt.vbi = fh->vbi_fmt.fmt;
379
380
tvnorm = &bttv_tvnorms[fh->btv->tvnorm];
381
382
if (tvnorm != fh->vbi_fmt.tvnorm) {
383
__s32 max_end;
384
unsigned int i;
385
386
/* As in vbi_buffer_prepare() this imitates the
387
behaviour of earlier driver versions after video
388
standard changes, with default parameters anyway. */
389
390
max_end = (tvnorm->cropcap.bounds.top
391
+ tvnorm->cropcap.bounds.height) >> 1;
392
393
frt->fmt.vbi.sampling_rate = tvnorm->Fsc;
394
395
for (i = 0; i < 2; ++i) {
396
__s32 new_start;
397
398
new_start = frt->fmt.vbi.start[i]
399
+ tvnorm->vbistart[i]
400
- fh->vbi_fmt.tvnorm->vbistart[i];
401
402
frt->fmt.vbi.start[i] = min(new_start, max_end - 1);
403
frt->fmt.vbi.count[i] =
404
min((__s32) frt->fmt.vbi.count[i],
405
max_end - frt->fmt.vbi.start[i]);
406
407
max_end += tvnorm->vbistart[1]
408
- tvnorm->vbistart[0];
409
}
410
}
411
return 0;
412
}
413
414
void bttv_vbi_fmt_reset(struct bttv_vbi_fmt *f, unsigned int norm)
415
{
416
const struct bttv_tvnorm *tvnorm;
417
unsigned int real_samples_per_line;
418
unsigned int real_count;
419
420
tvnorm = &bttv_tvnorms[norm];
421
422
f->fmt.sampling_rate = tvnorm->Fsc;
423
f->fmt.samples_per_line = VBI_BPL;
424
f->fmt.sample_format = V4L2_PIX_FMT_GREY;
425
f->fmt.offset = VBI_OFFSET;
426
f->fmt.start[0] = tvnorm->vbistart[0];
427
f->fmt.start[1] = tvnorm->vbistart[1];
428
f->fmt.count[0] = VBI_DEFLINES;
429
f->fmt.count[1] = VBI_DEFLINES;
430
f->fmt.flags = 0;
431
f->fmt.reserved[0] = 0;
432
f->fmt.reserved[1] = 0;
433
434
/* For compatibility the buffer size must be 2 * VBI_DEFLINES *
435
VBI_BPL regardless of the current video standard. */
436
real_samples_per_line = 1024 + tvnorm->vbipack * 4;
437
real_count = ((tvnorm->cropcap.defrect.top >> 1)
438
- tvnorm->vbistart[0]);
439
440
BUG_ON(real_samples_per_line > VBI_BPL);
441
BUG_ON(real_count > VBI_DEFLINES);
442
443
f->tvnorm = tvnorm;
444
445
/* See bttv_vbi_fmt_set(). */
446
f->end = tvnorm->vbistart[0] * 2 + 2;
447
}
448
449
/* ----------------------------------------------------------------------- */
450
/*
451
* Local variables:
452
* c-basic-offset: 8
453
* End:
454
*/
455
456