Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
media
pci
cx18
cx18-driver.h
Go to the documentation of this file.
1
/*
2
* cx18 driver internal defines and structures
3
*
4
* Derived from ivtv-driver.h
5
*
6
* Copyright (C) 2007 Hans Verkuil <
[email protected]
>
7
* Copyright (C) 2008 Andy Walls <
[email protected]
>
8
*
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.
13
*
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.
18
*
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., 59 Temple Place, Suite 330, Boston, MA
22
* 02111-1307 USA
23
*/
24
25
#ifndef CX18_DRIVER_H
26
#define CX18_DRIVER_H
27
28
#include <linux/module.h>
29
#include <
linux/moduleparam.h
>
30
#include <
linux/init.h
>
31
#include <
linux/delay.h
>
32
#include <linux/sched.h>
33
#include <linux/fs.h>
34
#include <linux/pci.h>
35
#include <
linux/interrupt.h
>
36
#include <
linux/spinlock.h
>
37
#include <linux/i2c.h>
38
#include <
linux/i2c-algo-bit.h
>
39
#include <linux/list.h>
40
#include <
linux/unistd.h
>
41
#include <
linux/pagemap.h
>
42
#include <
linux/workqueue.h
>
43
#include <
linux/mutex.h
>
44
#include <linux/slab.h>
45
#include <asm/byteorder.h>
46
47
#include <
media/v4l2-common.h
>
48
#include <
media/v4l2-ioctl.h
>
49
#include <
media/v4l2-device.h
>
50
#include <
media/v4l2-fh.h
>
51
#include <
media/tuner.h
>
52
#include <
media/ir-kbd-i2c.h
>
53
#include "
cx18-mailbox.h
"
54
#include "
cx18-av-core.h
"
55
#include "
cx23418.h
"
56
57
/* DVB */
58
#include "
demux.h
"
59
#include "
dmxdev.h
"
60
#include "
dvb_demux.h
"
61
#include "
dvb_frontend.h
"
62
#include "
dvb_net.h
"
63
#include "
dvbdev.h
"
64
65
/* Videobuf / YUV support */
66
#include <
media/videobuf-core.h
>
67
#include <
media/videobuf-vmalloc.h
>
68
69
#ifndef CONFIG_PCI
70
# error "This driver requires kernel PCI support."
71
#endif
72
73
#define CX18_MEM_OFFSET 0x00000000
74
#define CX18_MEM_SIZE 0x04000000
75
#define CX18_REG_OFFSET 0x02000000
76
77
/* Maximum cx18 driver instances. */
78
#define CX18_MAX_CARDS 32
79
80
/* Supported cards */
81
#define CX18_CARD_HVR_1600_ESMT 0
/* Hauppauge HVR 1600 (ESMT memory) */
82
#define CX18_CARD_HVR_1600_SAMSUNG 1
/* Hauppauge HVR 1600 (Samsung memory) */
83
#define CX18_CARD_COMPRO_H900 2
/* Compro VideoMate H900 */
84
#define CX18_CARD_YUAN_MPC718 3
/* Yuan MPC718 */
85
#define CX18_CARD_CNXT_RAPTOR_PAL 4
/* Conexant Raptor PAL */
86
#define CX18_CARD_TOSHIBA_QOSMIO_DVBT 5
/* Toshiba Qosmio Interal DVB-T/Analog*/
87
#define CX18_CARD_LEADTEK_PVR2100 6
/* Leadtek WinFast PVR2100 */
88
#define CX18_CARD_LEADTEK_DVR3100H 7
/* Leadtek WinFast DVR3100 H */
89
#define CX18_CARD_GOTVIEW_PCI_DVD3 8
/* GoTView PCI DVD3 Hybrid */
90
#define CX18_CARD_HVR_1600_S5H1411 9
/* Hauppauge HVR 1600 s5h1411/tda18271*/
91
#define CX18_CARD_LAST 9
92
93
#define CX18_ENC_STREAM_TYPE_MPG 0
94
#define CX18_ENC_STREAM_TYPE_TS 1
95
#define CX18_ENC_STREAM_TYPE_YUV 2
96
#define CX18_ENC_STREAM_TYPE_VBI 3
97
#define CX18_ENC_STREAM_TYPE_PCM 4
98
#define CX18_ENC_STREAM_TYPE_IDX 5
99
#define CX18_ENC_STREAM_TYPE_RAD 6
100
#define CX18_MAX_STREAMS 7
101
102
/* system vendor and device IDs */
103
#define PCI_VENDOR_ID_CX 0x14f1
104
#define PCI_DEVICE_ID_CX23418 0x5b7a
105
106
/* subsystem vendor ID */
107
#define CX18_PCI_ID_HAUPPAUGE 0x0070
108
#define CX18_PCI_ID_COMPRO 0x185b
109
#define CX18_PCI_ID_YUAN 0x12ab
110
#define CX18_PCI_ID_CONEXANT 0x14f1
111
#define CX18_PCI_ID_TOSHIBA 0x1179
112
#define CX18_PCI_ID_LEADTEK 0x107D
113
#define CX18_PCI_ID_GOTVIEW 0x5854
114
115
/* ======================================================================== */
116
/* ========================== START USER SETTABLE DMA VARIABLES =========== */
117
/* ======================================================================== */
118
119
/* DMA Buffers, Default size in MB allocated */
120
#define CX18_DEFAULT_ENC_TS_BUFFERS 1
121
#define CX18_DEFAULT_ENC_MPG_BUFFERS 2
122
#define CX18_DEFAULT_ENC_IDX_BUFFERS 1
123
#define CX18_DEFAULT_ENC_YUV_BUFFERS 2
124
#define CX18_DEFAULT_ENC_VBI_BUFFERS 1
125
#define CX18_DEFAULT_ENC_PCM_BUFFERS 1
126
127
/* Maximum firmware DMA buffers per stream */
128
#define CX18_MAX_FW_MDLS_PER_STREAM 63
129
130
/* YUV buffer sizes in bytes to ensure integer # of frames per buffer */
131
#define CX18_UNIT_ENC_YUV_BUFSIZE (720 * 32 * 3 / 2)
/* bytes */
132
#define CX18_625_LINE_ENC_YUV_BUFSIZE (CX18_UNIT_ENC_YUV_BUFSIZE * 576/32)
133
#define CX18_525_LINE_ENC_YUV_BUFSIZE (CX18_UNIT_ENC_YUV_BUFSIZE * 480/32)
134
135
/* IDX buffer size should be a multiple of the index entry size from the chip */
136
struct
cx18_enc_idx_entry
{
137
__le32
length
;
138
__le32
offset_low
;
139
__le32
offset_high
;
140
__le32
flags
;
141
__le32
pts_low
;
142
__le32
pts_high
;
143
}
__attribute__
((packed));
144
#define CX18_UNIT_ENC_IDX_BUFSIZE \
145
(sizeof(struct cx18_enc_idx_entry) * V4L2_ENC_IDX_ENTRIES)
146
147
/* DMA buffer, default size in kB allocated */
148
#define CX18_DEFAULT_ENC_TS_BUFSIZE 32
149
#define CX18_DEFAULT_ENC_MPG_BUFSIZE 32
150
#define CX18_DEFAULT_ENC_IDX_BUFSIZE (CX18_UNIT_ENC_IDX_BUFSIZE * 1 / 1024 + 1)
151
#define CX18_DEFAULT_ENC_YUV_BUFSIZE (CX18_UNIT_ENC_YUV_BUFSIZE * 3 / 1024 + 1)
152
#define CX18_DEFAULT_ENC_PCM_BUFSIZE 4
153
154
/* i2c stuff */
155
#define I2C_CLIENTS_MAX 16
156
157
/* debugging */
158
159
/* Flag to turn on high volume debugging */
160
#define CX18_DBGFLG_WARN (1 << 0)
161
#define CX18_DBGFLG_INFO (1 << 1)
162
#define CX18_DBGFLG_API (1 << 2)
163
#define CX18_DBGFLG_DMA (1 << 3)
164
#define CX18_DBGFLG_IOCTL (1 << 4)
165
#define CX18_DBGFLG_FILE (1 << 5)
166
#define CX18_DBGFLG_I2C (1 << 6)
167
#define CX18_DBGFLG_IRQ (1 << 7)
168
/* Flag to turn on high volume debugging */
169
#define CX18_DBGFLG_HIGHVOL (1 << 8)
170
171
/* NOTE: extra space before comma in 'fmt , ## args' is required for
172
gcc-2.95, otherwise it won't compile. */
173
#define CX18_DEBUG(x, type, fmt, args...) \
174
do { \
175
if ((x) & cx18_debug) \
176
v4l2_info(&cx->v4l2_dev, " " type ": " fmt , ## args); \
177
} while (0)
178
#define CX18_DEBUG_WARN(fmt, args...) CX18_DEBUG(CX18_DBGFLG_WARN, "warning", fmt , ## args)
179
#define CX18_DEBUG_INFO(fmt, args...) CX18_DEBUG(CX18_DBGFLG_INFO, "info", fmt , ## args)
180
#define CX18_DEBUG_API(fmt, args...) CX18_DEBUG(CX18_DBGFLG_API, "api", fmt , ## args)
181
#define CX18_DEBUG_DMA(fmt, args...) CX18_DEBUG(CX18_DBGFLG_DMA, "dma", fmt , ## args)
182
#define CX18_DEBUG_IOCTL(fmt, args...) CX18_DEBUG(CX18_DBGFLG_IOCTL, "ioctl", fmt , ## args)
183
#define CX18_DEBUG_FILE(fmt, args...) CX18_DEBUG(CX18_DBGFLG_FILE, "file", fmt , ## args)
184
#define CX18_DEBUG_I2C(fmt, args...) CX18_DEBUG(CX18_DBGFLG_I2C, "i2c", fmt , ## args)
185
#define CX18_DEBUG_IRQ(fmt, args...) CX18_DEBUG(CX18_DBGFLG_IRQ, "irq", fmt , ## args)
186
187
#define CX18_DEBUG_HIGH_VOL(x, type, fmt, args...) \
188
do { \
189
if (((x) & cx18_debug) && (cx18_debug & CX18_DBGFLG_HIGHVOL)) \
190
v4l2_info(&cx->v4l2_dev, " " type ": " fmt , ## args); \
191
} while (0)
192
#define CX18_DEBUG_HI_WARN(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_WARN, "warning", fmt , ## args)
193
#define CX18_DEBUG_HI_INFO(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_INFO, "info", fmt , ## args)
194
#define CX18_DEBUG_HI_API(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_API, "api", fmt , ## args)
195
#define CX18_DEBUG_HI_DMA(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_DMA, "dma", fmt , ## args)
196
#define CX18_DEBUG_HI_IOCTL(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_IOCTL, "ioctl", fmt , ## args)
197
#define CX18_DEBUG_HI_FILE(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_FILE, "file", fmt , ## args)
198
#define CX18_DEBUG_HI_I2C(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_I2C, "i2c", fmt , ## args)
199
#define CX18_DEBUG_HI_IRQ(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_IRQ, "irq", fmt , ## args)
200
201
/* Standard kernel messages */
202
#define CX18_ERR(fmt, args...) v4l2_err(&cx->v4l2_dev, fmt , ## args)
203
#define CX18_WARN(fmt, args...) v4l2_warn(&cx->v4l2_dev, fmt , ## args)
204
#define CX18_INFO(fmt, args...) v4l2_info(&cx->v4l2_dev, fmt , ## args)
205
206
/* Messages for internal subdevs to use */
207
#define CX18_DEBUG_DEV(x, dev, type, fmt, args...) \
208
do { \
209
if ((x) & cx18_debug) \
210
v4l2_info(dev, " " type ": " fmt , ## args); \
211
} while (0)
212
#define CX18_DEBUG_WARN_DEV(dev, fmt, args...) \
213
CX18_DEBUG_DEV(CX18_DBGFLG_WARN, dev, "warning", fmt , ## args)
214
#define CX18_DEBUG_INFO_DEV(dev, fmt, args...) \
215
CX18_DEBUG_DEV(CX18_DBGFLG_INFO, dev, "info", fmt , ## args)
216
#define CX18_DEBUG_API_DEV(dev, fmt, args...) \
217
CX18_DEBUG_DEV(CX18_DBGFLG_API, dev, "api", fmt , ## args)
218
#define CX18_DEBUG_DMA_DEV(dev, fmt, args...) \
219
CX18_DEBUG_DEV(CX18_DBGFLG_DMA, dev, "dma", fmt , ## args)
220
#define CX18_DEBUG_IOCTL_DEV(dev, fmt, args...) \
221
CX18_DEBUG_DEV(CX18_DBGFLG_IOCTL, dev, "ioctl", fmt , ## args)
222
#define CX18_DEBUG_FILE_DEV(dev, fmt, args...) \
223
CX18_DEBUG_DEV(CX18_DBGFLG_FILE, dev, "file", fmt , ## args)
224
#define CX18_DEBUG_I2C_DEV(dev, fmt, args...) \
225
CX18_DEBUG_DEV(CX18_DBGFLG_I2C, dev, "i2c", fmt , ## args)
226
#define CX18_DEBUG_IRQ_DEV(dev, fmt, args...) \
227
CX18_DEBUG_DEV(CX18_DBGFLG_IRQ, dev, "irq", fmt , ## args)
228
229
#define CX18_DEBUG_HIGH_VOL_DEV(x, dev, type, fmt, args...) \
230
do { \
231
if (((x) & cx18_debug) && (cx18_debug & CX18_DBGFLG_HIGHVOL)) \
232
v4l2_info(dev, " " type ": " fmt , ## args); \
233
} while (0)
234
#define CX18_DEBUG_HI_WARN_DEV(dev, fmt, args...) \
235
CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_WARN, dev, "warning", fmt , ## args)
236
#define CX18_DEBUG_HI_INFO_DEV(dev, fmt, args...) \
237
CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_INFO, dev, "info", fmt , ## args)
238
#define CX18_DEBUG_HI_API_DEV(dev, fmt, args...) \
239
CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_API, dev, "api", fmt , ## args)
240
#define CX18_DEBUG_HI_DMA_DEV(dev, fmt, args...) \
241
CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_DMA, dev, "dma", fmt , ## args)
242
#define CX18_DEBUG_HI_IOCTL_DEV(dev, fmt, args...) \
243
CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_IOCTL, dev, "ioctl", fmt , ## args)
244
#define CX18_DEBUG_HI_FILE_DEV(dev, fmt, args...) \
245
CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_FILE, dev, "file", fmt , ## args)
246
#define CX18_DEBUG_HI_I2C_DEV(dev, fmt, args...) \
247
CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_I2C, dev, "i2c", fmt , ## args)
248
#define CX18_DEBUG_HI_IRQ_DEV(dev, fmt, args...) \
249
CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_IRQ, dev, "irq", fmt , ## args)
250
251
#define CX18_ERR_DEV(dev, fmt, args...) v4l2_err(dev, fmt , ## args)
252
#define CX18_WARN_DEV(dev, fmt, args...) v4l2_warn(dev, fmt , ## args)
253
#define CX18_INFO_DEV(dev, fmt, args...) v4l2_info(dev, fmt , ## args)
254
255
extern
int
cx18_debug
;
256
257
struct
cx18_options
{
258
int
megabytes
[
CX18_MAX_STREAMS
];
/* Size in megabytes of each stream */
259
int
cardtype
;
/* force card type on load */
260
int
tuner
;
/* set tuner on load */
261
int
radio
;
/* enable/disable radio */
262
};
263
264
/* per-mdl bit flags */
265
#define CX18_F_M_NEED_SWAP 0
/* mdl buffer data must be endianess swapped */
266
267
/* per-stream, s_flags */
268
#define CX18_F_S_CLAIMED 3
/* this stream is claimed */
269
#define CX18_F_S_STREAMING 4
/* the fw is decoding/encoding this stream */
270
#define CX18_F_S_INTERNAL_USE 5
/* this stream is used internally (sliced VBI processing) */
271
#define CX18_F_S_STREAMOFF 7
/* signal end of stream EOS */
272
#define CX18_F_S_APPL_IO 8
/* this stream is used read/written by an application */
273
#define CX18_F_S_STOPPING 9
/* telling the fw to stop capturing */
274
275
/* per-cx18, i_flags */
276
#define CX18_F_I_LOADED_FW 0
/* Loaded firmware 1st time */
277
#define CX18_F_I_EOS 4
/* End of encoder stream */
278
#define CX18_F_I_RADIO_USER 5
/* radio tuner is selected */
279
#define CX18_F_I_ENC_PAUSED 13
/* the encoder is paused */
280
#define CX18_F_I_INITED 21
/* set after first open */
281
#define CX18_F_I_FAILED 22
/* set if first open failed */
282
283
/* These are the VBI types as they appear in the embedded VBI private packets. */
284
#define CX18_SLICED_TYPE_TELETEXT_B (1)
285
#define CX18_SLICED_TYPE_CAPTION_525 (4)
286
#define CX18_SLICED_TYPE_WSS_625 (5)
287
#define CX18_SLICED_TYPE_VPS (7)
288
298
#define list_entry_is_past_end(pos, head, member) \
299
(&pos->member == (head))
300
301
struct
cx18_buffer
{
302
struct
list_head
list
;
303
dma_addr_t
dma_handle
;
304
char
*
buf
;
305
306
u32
bytesused
;
307
u32
readpos
;
308
};
309
310
struct
cx18_mdl
{
311
struct
list_head
list
;
312
u32
id
;
/* index into cx->scb->cpu_mdl[] of 1st cx18_mdl_ent */
313
314
unsigned
int
skipped
;
315
unsigned
long
m_flags
;
316
317
struct
list_head
buf_list
;
318
struct
cx18_buffer
*
curr_buf
;
/* current buffer in list for reading */
319
320
u32
bytesused
;
321
u32
readpos
;
322
};
323
324
struct
cx18_queue
{
325
struct
list_head
list
;
326
atomic_t
depth
;
327
u32
bytesused
;
328
spinlock_t
lock
;
329
};
330
331
struct
cx18_stream
;
/* forward reference */
332
333
struct
cx18_dvb
{
334
struct
cx18_stream
*
stream
;
335
struct
dmx_frontend
hw_frontend
;
336
struct
dmx_frontend
mem_frontend
;
337
struct
dmxdev
dmxdev
;
338
struct
dvb_adapter
dvb_adapter
;
339
struct
dvb_demux
demux
;
340
struct
dvb_frontend
*
fe
;
341
struct
dvb_net
dvbnet
;
342
int
enabled
;
343
int
feeding
;
344
struct
mutex
feedlock
;
345
};
346
347
struct
cx18
;
/* forward reference */
348
struct
cx18_scb
;
/* forward reference */
349
350
351
#define CX18_MAX_MDL_ACKS 2
352
#define CX18_MAX_IN_WORK_ORDERS (CX18_MAX_FW_MDLS_PER_STREAM + 7)
353
/* CPU_DE_RELEASE_MDL can burst CX18_MAX_FW_MDLS_PER_STREAM orders in a group */
354
355
#define CX18_F_EWO_MB_STALE_UPON_RECEIPT 0x1
356
#define CX18_F_EWO_MB_STALE_WHILE_PROC 0x2
357
#define CX18_F_EWO_MB_STALE \
358
(CX18_F_EWO_MB_STALE_UPON_RECEIPT | CX18_F_EWO_MB_STALE_WHILE_PROC)
359
360
struct
cx18_in_work_order
{
361
struct
work_struct
work
;
362
atomic_t
pending
;
363
struct
cx18
*
cx
;
364
unsigned
long
flags
;
365
int
rpu
;
366
struct
cx18_mailbox
mb
;
367
struct
cx18_mdl_ack
mdl_ack
[
CX18_MAX_MDL_ACKS
];
368
char
*
str
;
369
};
370
371
#define CX18_INVALID_TASK_HANDLE 0xffffffff
372
373
struct
cx18_stream
{
374
/* These first five fields are always set, even if the stream
375
is not actually created. */
376
struct
video_device
*
video_dev
;
/* NULL when stream not created */
377
struct
cx18_dvb
*
dvb
;
/* DVB / Digital Transport */
378
struct
cx18
*
cx
;
/* for ease of use */
379
const
char
*
name
;
/* name of the stream */
380
int
type
;
/* stream type */
381
u32
handle
;
/* task handle */
382
unsigned
int
mdl_base_idx
;
383
384
u32
id
;
385
unsigned
long
s_flags
;
/* status flags, see above */
386
int
dma
;
/* can be PCI_DMA_TODEVICE,
387
PCI_DMA_FROMDEVICE or
388
PCI_DMA_NONE */
389
wait_queue_head_t
waitq
;
390
391
/* Buffers */
392
struct
list_head
buf_pool
;
/* buffers not attached to an MDL */
393
u32
buffers
;
/* total buffers owned by this stream */
394
u32
buf_size
;
/* size in bytes of a single buffer */
395
396
/* MDL sizes - all stream MDLs are the same size */
397
u32
bufs_per_mdl
;
398
u32
mdl_size
;
/* total bytes in all buffers in a mdl */
399
400
/* MDL Queues */
401
struct
cx18_queue
q_free
;
/* free - in rotation, not committed */
402
struct
cx18_queue
q_busy
;
/* busy - in use by firmware */
403
struct
cx18_queue
q_full
;
/* full - data for user apps */
404
struct
cx18_queue
q_idle
;
/* idle - not in rotation */
405
406
struct
work_struct
out_work_order
;
407
408
/* Videobuf for YUV video */
409
u32
pixelformat
;
410
u32
vb_bytes_per_frame
;
411
struct
list_head
vb_capture
;
/* video capture queue */
412
spinlock_t
vb_lock
;
413
struct
timer_list
vb_timeout
;
414
415
struct
videobuf_queue
vbuf_q
;
416
spinlock_t
vbuf_q_lock
;
/* Protect vbuf_q */
417
enum
v4l2_buf_type
vb_type
;
418
};
419
420
struct
cx18_videobuf_buffer
{
421
/* Common video buffer sub-system struct */
422
struct
videobuf_buffer
vb
;
423
v4l2_std_id
tvnorm
;
/* selected tv norm */
424
u32
bytes_used
;
425
};
426
427
struct
cx18_open_id
{
428
struct
v4l2_fh
fh
;
429
u32
open_id
;
430
int
type
;
431
struct
cx18
*
cx
;
432
};
433
434
static
inline
struct
cx18_open_id
*fh2id(
struct
v4l2_fh
*
fh
)
435
{
436
return
container_of
(fh,
struct
cx18_open_id
, fh);
437
}
438
439
static
inline
struct
cx18_open_id
*file2id(
struct
file
*
file
)
440
{
441
return
fh2id(file->
private_data
);
442
}
443
444
/* forward declaration of struct defined in cx18-cards.h */
445
struct
cx18_card
;
446
447
/*
448
* A note about "sliced" VBI data as implemented in this driver:
449
*
450
* Currently we collect the sliced VBI in the form of Ancillary Data
451
* packets, inserted by the AV core decoder/digitizer/slicer in the
452
* horizontal blanking region of the VBI lines, in "raw" mode as far as
453
* the Encoder is concerned. We don't ever tell the Encoder itself
454
* to provide sliced VBI. (AV Core: sliced mode - Encoder: raw mode)
455
*
456
* We then process the ancillary data ourselves to send the sliced data
457
* to the user application directly or build up MPEG-2 private stream 1
458
* packets to splice into (only!) MPEG-2 PS streams for the user app.
459
*
460
* (That's how ivtv essentially does it.)
461
*
462
* The Encoder should be able to extract certain sliced VBI data for
463
* us and provide it in a separate stream or splice it into any type of
464
* MPEG PS or TS stream, but this isn't implemented yet.
465
*/
466
467
/*
468
* Number of "raw" VBI samples per horizontal line we tell the Encoder to
469
* grab from the decoder/digitizer/slicer output for raw or sliced VBI.
470
* It depends on the pixel clock and the horiz rate:
471
*
472
* (1/Fh)*(2*Fp) = Samples/line
473
* = 4 bytes EAV + Anc data in hblank + 4 bytes SAV + active samples
474
*
475
* Sliced VBI data is sent as ancillary data during horizontal blanking
476
* Raw VBI is sent as active video samples during vertcal blanking
477
*
478
* We use a BT.656 pxiel clock of 13.5 MHz and a BT.656 active line
479
* length of 720 pixels @ 4:2:2 sampling. Thus...
480
*
481
* For systems that use a 15.734 kHz horizontal rate, such as
482
* NTSC-M, PAL-M, PAL-60, and other 60 Hz/525 line systems, we have:
483
*
484
* (1/15.734 kHz) * 2 * 13.5 MHz = 1716 samples/line =
485
* 4 bytes SAV + 268 bytes anc data + 4 bytes SAV + 1440 active samples
486
*
487
* For systems that use a 15.625 kHz horizontal rate, such as
488
* PAL-B/G/H, PAL-I, SECAM-L and other 50 Hz/625 line systems, we have:
489
*
490
* (1/15.625 kHz) * 2 * 13.5 MHz = 1728 samples/line =
491
* 4 bytes SAV + 280 bytes anc data + 4 bytes SAV + 1440 active samples
492
*/
493
static
const
u32
vbi_active_samples = 1444;
/* 4 byte SAV + 720 Y + 720 U/V */
494
static
const
u32
vbi_hblank_samples_60Hz = 272;
/* 4 byte EAV + 268 anc/fill */
495
static
const
u32
vbi_hblank_samples_50Hz = 284;
/* 4 byte EAV + 280 anc/fill */
496
497
#define CX18_VBI_FRAMES 32
498
499
struct
vbi_info
{
500
/* Current state of v4l2 VBI settings for this device */
501
struct
v4l2_format
in
;
502
struct
v4l2_sliced_vbi_format
*
sliced_in
;
/* pointer to in.fmt.sliced */
503
u32
count
;
/* Count of VBI data lines: 60 Hz: 12 or 50 Hz: 18 */
504
u32
start
[2];
/* First VBI data line per field: 10 & 273 or 6 & 318 */
505
506
u32
frame
;
/* Count of VBI buffers/frames received from Encoder */
507
508
/*
509
* Vars for creation and insertion of MPEG Private Stream 1 packets
510
* of sliced VBI data into an MPEG PS
511
*/
512
513
/* Boolean: create and insert Private Stream 1 packets into the PS */
514
int
insert_mpeg
;
515
516
/*
517
* Buffer for the maximum of 2 * 18 * packet_size sliced VBI lines.
518
* Used in cx18-vbi.c only for collecting sliced data, and as a source
519
* during conversion of sliced VBI data into MPEG Priv Stream 1 packets.
520
* We don't need to save state here, but the array may have been a bit
521
* too big (2304 bytes) to alloc from the stack.
522
*/
523
struct
v4l2_sliced_vbi_data
sliced_data
[36];
524
525
/*
526
* A ring buffer of driver-generated MPEG-2 PS
527
* Program Pack/Private Stream 1 packets for sliced VBI data insertion
528
* into the MPEG PS stream.
529
*
530
* In each sliced_mpeg_data[] buffer is:
531
* 16 byte MPEG-2 PS Program Pack Header
532
* 16 byte MPEG-2 Private Stream 1 PES Header
533
* 4 byte magic number: "itv0" or "ITV0"
534
* 4 byte first field line mask, if "itv0"
535
* 4 byte second field line mask, if "itv0"
536
* 36 lines, if "ITV0"; or <36 lines, if "itv0"; of sliced VBI data
537
*
538
* Each line in the payload is
539
* 1 byte line header derived from the SDID (WSS, CC, VPS, etc.)
540
* 42 bytes of line data
541
*
542
* That's a maximum 1552 bytes of payload in the Private Stream 1 packet
543
* which is the payload size a PVR-350 (CX23415) MPEG decoder will
544
* accept for VBI data. So, including the headers, it's a maximum 1584
545
* bytes total.
546
*/
547
#define CX18_SLICED_MPEG_DATA_MAXSZ 1584
548
/* copy_vbi_buf() needs 8 temp bytes on the end for the worst case */
549
#define CX18_SLICED_MPEG_DATA_BUFSZ (CX18_SLICED_MPEG_DATA_MAXSZ+8)
550
u8
*
sliced_mpeg_data
[
CX18_VBI_FRAMES
];
551
u32
sliced_mpeg_size
[
CX18_VBI_FRAMES
];
552
553
/* Count of Program Pack/Program Stream 1 packets inserted into PS */
554
u32
inserted_frame
;
555
556
/*
557
* A dummy driver stream transfer mdl & buffer with a copy of the next
558
* sliced_mpeg_data[] buffer for output to userland apps.
559
* Only used in cx18-fileops.c, but its state needs to persist at times.
560
*/
561
struct
cx18_mdl
sliced_mpeg_mdl
;
562
struct
cx18_buffer
sliced_mpeg_buf
;
563
};
564
565
/* Per cx23418, per I2C bus private algo callback data */
566
struct
cx18_i2c_algo_callback_data
{
567
struct
cx18
*
cx
;
568
int
bus_index
;
/* 0 or 1 for the cx23418's 1st or 2nd I2C bus */
569
};
570
571
#define CX18_MAX_MMIO_WR_RETRIES 10
572
573
/* Struct to hold info about cx18 cards */
574
struct
cx18
{
575
int
instance
;
576
struct
pci_dev
*
pci_dev
;
577
struct
v4l2_device
v4l2_dev
;
578
struct
v4l2_subdev
*
sd_av
;
/* A/V decoder/digitizer sub-device */
579
struct
v4l2_subdev
*
sd_extmux
;
/* External multiplexer sub-dev */
580
581
const
struct
cx18_card
*
card
;
/* card information */
582
const
char
*
card_name
;
/* full name of the card */
583
const
struct
cx18_card_tuner_i2c
*
card_i2c
;
/* i2c addresses to probe for tuner */
584
u8
is_50hz
;
585
u8
is_60hz
;
586
u8
nof_inputs
;
/* number of video inputs */
587
u8
nof_audio_inputs
;
/* number of audio inputs */
588
u32
v4l2_cap
;
/* V4L2 capabilities of card */
589
u32
hw_flags
;
/* Hardware description of the board */
590
unsigned
int
free_mdl_idx
;
591
struct
cx18_scb
__iomem
*
scb
;
/* pointer to SCB */
592
struct
mutex
epu2apu_mb_lock
;
/* protect driver to chip mailbox in SCB*/
593
struct
mutex
epu2cpu_mb_lock
;
/* protect driver to chip mailbox in SCB*/
594
595
struct
cx18_av_state
av_state
;
596
597
/* codec settings */
598
struct
cx2341x_handler
cxhdl
;
599
u32
filter_mode
;
600
u32
temporal_strength
;
601
u32
spatial_strength
;
602
603
/* dualwatch */
604
unsigned
long
dualwatch_jiffies
;
605
u32
dualwatch_stereo_mode
;
606
607
struct
mutex
serialize_lock
;
/* mutex used to serialize open/close/start/stop/ioctl operations */
608
struct
cx18_options
options
;
/* User options */
609
int
stream_buffers
[
CX18_MAX_STREAMS
];
/* # of buffers for each stream */
610
int
stream_buf_size
[
CX18_MAX_STREAMS
];
/* Stream buffer size */
611
struct
cx18_stream
streams
[
CX18_MAX_STREAMS
];
/* Stream data */
612
struct
snd_cx18_card
*
alsa
;
/* ALSA interface for PCM capture stream */
613
void
(*
pcm_announce_callback
)(
struct
snd_cx18_card
*
card
,
u8
*pcm_data,
614
size_t
num_bytes
);
615
616
unsigned
long
i_flags
;
/* global cx18 flags */
617
atomic_t
ana_capturing
;
/* count number of active analog capture streams */
618
atomic_t
tot_capturing
;
/* total count number of active capture streams */
619
int
search_pack_header
;
620
621
int
open_id
;
/* incremented each time an open occurs, used as
622
unique ID. Starts at 1, so 0 can be used as
623
uninitialized value in the stream->id. */
624
625
resource_size_t
base_addr
;
626
627
u8
card_rev
;
628
void
__iomem
*
enc_mem
, *
reg_mem
;
629
630
struct
vbi_info
vbi
;
631
632
u64
mpg_data_received
;
633
u64
vbi_data_inserted
;
634
635
wait_queue_head_t
mb_apu_waitq
;
636
wait_queue_head_t
mb_cpu_waitq
;
637
wait_queue_head_t
cap_w
;
638
/* when the current DMA is finished this queue is woken up */
639
wait_queue_head_t
dma_waitq
;
640
641
u32
sw1_irq_mask
;
642
u32
sw2_irq_mask
;
643
u32
hw2_irq_mask
;
644
645
struct
workqueue_struct
*
in_work_queue
;
646
char
in_workq_name
[11];
/* "cx18-NN-in" */
647
struct
cx18_in_work_order
in_work_order
[
CX18_MAX_IN_WORK_ORDERS
];
648
char
epu_debug_str
[256];
/* CX18_EPU_DEBUG is rare: use shared space */
649
650
/* i2c */
651
struct
i2c_adapter
i2c_adap
[2];
652
struct
i2c_algo_bit_data
i2c_algo
[2];
653
struct
cx18_i2c_algo_callback_data
i2c_algo_cb_data
[2];
654
655
struct
IR_i2c_init_data
ir_i2c_init_data
;
656
657
/* gpio */
658
u32
gpio_dir
;
659
u32
gpio_val
;
660
struct
mutex
gpio_lock
;
661
struct
v4l2_subdev
sd_gpiomux
;
662
struct
v4l2_subdev
sd_resetctrl
;
663
664
/* v4l2 and User settings */
665
666
/* codec settings */
667
u32
audio_input
;
668
u32
active_input
;
669
v4l2_std_id
std
;
670
v4l2_std_id
tuner_std
;
/* The norm of the tuner (fixed) */
671
672
/* Used for cx18-alsa module loading */
673
struct
work_struct
request_module_wk
;
674
};
675
676
static
inline
struct
cx18
*to_cx18(
struct
v4l2_device
*
v4l2_dev
)
677
{
678
return
container_of
(v4l2_dev,
struct
cx18
, v4l2_dev);
679
}
680
681
/* cx18 extensions to be loaded */
682
extern
int
(*
cx18_ext_init
)(
struct
cx18
*);
683
684
/* Globals */
685
extern
int
cx18_first_minor
;
686
687
/*==============Prototypes==================*/
688
689
/* Return non-zero if a signal is pending */
690
int
cx18_msleep_timeout
(
unsigned
int
msecs,
int
intr
);
691
692
/* Read Hauppauge eeprom */
693
struct
tveeprom
;
/* forward reference */
694
void
cx18_read_eeprom
(
struct
cx18
*cx,
struct
tveeprom
*tv);
695
696
/* First-open initialization: load firmware, etc. */
697
int
cx18_init_on_first_open
(
struct
cx18
*cx);
698
699
/* Test if the current VBI mode is raw (1) or sliced (0) */
700
static
inline
int
cx18_raw_vbi(
const
struct
cx18
*cx)
701
{
702
return
cx->
vbi
.in.type ==
V4L2_BUF_TYPE_VBI_CAPTURE
;
703
}
704
705
/* Call the specified callback for all subdevs with a grp_id bit matching the
706
* mask in hw (if 0, then match them all). Ignore any errors. */
707
#define cx18_call_hw(cx, hw, o, f, args...) \
708
do { \
709
struct v4l2_subdev *__sd; \
710
__v4l2_device_call_subdevs_p(&(cx)->v4l2_dev, __sd, \
711
!(hw) || (__sd->grp_id & (hw)), o, f , ##args); \
712
} while (0)
713
714
#define cx18_call_all(cx, o, f, args...) cx18_call_hw(cx, 0, o, f , ##args)
715
716
/* Call the specified callback for all subdevs with a grp_id bit matching the
717
* mask in hw (if 0, then match them all). If the callback returns an error
718
* other than 0 or -ENOIOCTLCMD, then return with that error code. */
719
#define cx18_call_hw_err(cx, hw, o, f, args...) \
720
({ \
721
struct v4l2_subdev *__sd; \
722
__v4l2_device_call_subdevs_until_err_p(&(cx)->v4l2_dev, \
723
__sd, !(hw) || (__sd->grp_id & (hw)), o, f, \
724
##args); \
725
})
726
727
#define cx18_call_all_err(cx, o, f, args...) \
728
cx18_call_hw_err(cx, 0, o, f , ##args)
729
730
#endif
/* CX18_DRIVER_H */
Generated on Thu Jan 10 2013 13:47:32 for Linux Kernel by
1.8.2