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
usb
tm6000
tm6000.h
Go to the documentation of this file.
1
/*
2
* tm6000.h - driver for TM5600/TM6000/TM6010 USB video capture devices
3
*
4
* Copyright (C) 2006-2007 Mauro Carvalho Chehab <
[email protected]
>
5
*
6
* Copyright (C) 2007 Michel Ludwig <
[email protected]
>
7
* - DVB-T support
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 version 2
12
*
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU General Public License for more details.
17
*
18
* You should have received a copy of the GNU General Public License
19
* along with this program; if not, write to the Free Software
20
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21
*/
22
23
#include <linux/videodev2.h>
24
#include <
media/v4l2-common.h
>
25
#include <
media/videobuf-vmalloc.h
>
26
#include "
tm6000-usb-isoc.h
"
27
#include <linux/i2c.h>
28
#include <
linux/mutex.h
>
29
#include <
media/v4l2-device.h
>
30
31
#include <
linux/dvb/frontend.h
>
32
#include "
dvb_demux.h
"
33
#include "
dvb_frontend.h
"
34
#include "
dmxdev.h
"
35
36
/* Inputs */
37
enum
tm6000_itype
{
38
TM6000_INPUT_TV
= 1,
39
TM6000_INPUT_COMPOSITE1
,
40
TM6000_INPUT_COMPOSITE2
,
41
TM6000_INPUT_SVIDEO
,
42
TM6000_INPUT_DVB
,
43
TM6000_INPUT_RADIO
,
44
};
45
46
enum
tm6000_mux
{
47
TM6000_VMUX_VIDEO_A
= 1,
48
TM6000_VMUX_VIDEO_B
,
49
TM6000_VMUX_VIDEO_AB
,
50
TM6000_AMUX_ADC1
,
51
TM6000_AMUX_ADC2
,
52
TM6000_AMUX_SIF1
,
53
TM6000_AMUX_SIF2
,
54
TM6000_AMUX_I2S
,
55
};
56
57
enum
tm6000_devtype
{
58
TM6000
= 0,
59
TM5600
,
60
TM6010
,
61
};
62
63
struct
tm6000_input
{
64
enum
tm6000_itype
type
;
65
enum
tm6000_mux
vmux
;
66
enum
tm6000_mux
amux
;
67
unsigned
int
v_gpio
;
68
unsigned
int
a_gpio
;
69
};
70
71
/* ------------------------------------------------------------------
72
* Basic structures
73
* ------------------------------------------------------------------
74
*/
75
76
struct
tm6000_fmt
{
77
char
*
name
;
78
u32
fourcc
;
/* v4l2 format id */
79
int
depth
;
80
};
81
82
/* buffer for one video frame */
83
struct
tm6000_buffer
{
84
/* common v4l buffer stuff -- must be first */
85
struct
videobuf_buffer
vb
;
86
87
struct
tm6000_fmt
*
fmt
;
88
};
89
90
struct
tm6000_dmaqueue
{
91
struct
list_head
active
;
92
struct
list_head
queued
;
93
94
/* thread for generating video stream*/
95
struct
task_struct
*
kthread
;
96
wait_queue_head_t
wq
;
97
/* Counters to control fps rate */
98
int
frame
;
99
int
ini_jiffies
;
100
};
101
102
/* device states */
103
enum
tm6000_core_state
{
104
DEV_INITIALIZED
= 0x01,
105
DEV_DISCONNECTED
= 0x02,
106
DEV_MISCONFIGURED
= 0x04,
107
};
108
109
/* io methods */
110
enum
tm6000_io_method
{
111
IO_NONE
,
112
IO_READ
,
113
IO_MMAP
,
114
};
115
116
enum
tm6000_mode
{
117
TM6000_MODE_UNKNOWN
= 0,
118
TM6000_MODE_ANALOG
,
119
TM6000_MODE_DIGITAL
,
120
};
121
122
struct
tm6000_gpio
{
123
int
tuner_reset
;
124
int
tuner_on
;
125
int
demod_reset
;
126
int
demod_on
;
127
int
power_led
;
128
int
dvb_led
;
129
int
ir
;
130
};
131
132
struct
tm6000_capabilities
{
133
unsigned
int
has_tuner
:1;
134
unsigned
int
has_tda9874
:1;
135
unsigned
int
has_dvb
:1;
136
unsigned
int
has_zl10353
:1;
137
unsigned
int
has_eeprom
:1;
138
unsigned
int
has_remote
:1;
139
unsigned
int
has_radio
:1;
140
};
141
142
struct
tm6000_dvb
{
143
struct
dvb_adapter
adapter
;
144
struct
dvb_demux
demux
;
145
struct
dvb_frontend
*
frontend
;
146
struct
dmxdev
dmxdev
;
147
unsigned
int
streams
;
148
struct
urb
*
bulk_urb
;
149
struct
mutex
mutex
;
150
};
151
152
struct
snd_tm6000_card
{
153
struct
snd_card
*
card
;
154
spinlock_t
reg_lock
;
155
struct
tm6000_core
*
core
;
156
struct
snd_pcm_substream
*
substream
;
157
158
/* temporary data for buffer fill processing */
159
unsigned
buf_pos
;
160
unsigned
period_pos
;
161
};
162
163
struct
tm6000_endpoint
{
164
struct
usb_host_endpoint *
endp
;
165
__u8
bInterfaceNumber
;
166
__u8
bAlternateSetting
;
167
unsigned
maxsize
;
168
};
169
170
#define TM6000_QUIRK_NO_USB_DELAY (1 << 0)
171
172
struct
tm6000_core
{
173
/* generic device properties */
174
char
name
[30];
/* name (including minor) of the device */
175
int
model
;
/* index in the device_data struct */
176
int
devno
;
/* marks the number of this device */
177
enum
tm6000_devtype
dev_type
;
/* type of device */
178
unsigned
char
eedata
[256];
/* Eeprom data */
179
unsigned
eedata_size
;
/* Size of the eeprom info */
180
181
v4l2_std_id
norm
;
/* Current norm */
182
int
width
,
height
;
/* Selected resolution */
183
184
enum
tm6000_core_state
state
;
185
186
/* Device Capabilities*/
187
struct
tm6000_capabilities
caps
;
188
189
/* Used to load alsa/dvb */
190
struct
work_struct
request_module_wk
;
191
192
/* Tuner configuration */
193
int
tuner_type
;
/* type of the tuner */
194
int
tuner_addr
;
/* tuner address */
195
196
struct
tm6000_gpio
gpio
;
197
198
char
*
ir_codes
;
199
200
__u8
radio
;
201
202
/* Demodulator configuration */
203
int
demod_addr
;
/* demodulator address */
204
205
int
audio_bitrate
;
206
/* i2c i/o */
207
struct
i2c_adapter
i2c_adap
;
208
struct
i2c_client
i2c_client
;
209
210
211
/* extension */
212
struct
list_head
devlist
;
213
214
/* video for linux */
215
int
users
;
216
217
/* various device info */
218
struct
tm6000_fh
*
resources
;
/* Points to fh that is streaming */
219
bool
is_res_read
;
220
221
struct
video_device
*
vfd
;
222
struct
video_device
*
radio_dev
;
223
struct
tm6000_dmaqueue
vidq
;
224
struct
v4l2_device
v4l2_dev
;
225
226
int
input
;
227
struct
tm6000_input
vinput
[3];
/* video input */
228
struct
tm6000_input
rinput
;
/* radio input */
229
230
int
freq
;
231
unsigned
int
fourcc
;
232
233
enum
tm6000_mode
mode
;
234
235
int
ctl_mute
;
/* audio */
236
int
ctl_volume
;
237
int
amode
;
238
239
/* DVB-T support */
240
struct
tm6000_dvb
*
dvb
;
241
242
/* audio support */
243
struct
snd_tm6000_card
*
adev
;
244
struct
work_struct
wq_trigger
;
/* Trigger to start/stop audio for alsa module */
245
atomic_t
stream_started
;
/* stream should be running if true */
246
247
struct
tm6000_IR
*
ir
;
248
249
/* locks */
250
struct
mutex
lock
;
251
struct
mutex
usb_lock
;
252
253
/* usb transfer */
254
struct
usb_device *
udev
;
/* the usb device */
255
256
struct
tm6000_endpoint
bulk_in, bulk_out, isoc_in,
isoc_out
;
257
struct
tm6000_endpoint
int_in,
int_out
;
258
259
/* scaler!=0 if scaler is active*/
260
int
scaler
;
261
262
/* Isoc control struct */
263
struct
usb_isoc_ctl
isoc_ctl
;
264
265
spinlock_t
slock
;
266
267
unsigned
long
quirks
;
268
};
269
270
enum
tm6000_ops_type
{
271
TM6000_AUDIO
= 0x10,
272
TM6000_DVB
= 0x20,
273
};
274
275
struct
tm6000_ops
{
276
struct
list_head
next
;
277
char
*
name
;
278
enum
tm6000_ops_type
type
;
279
int
(*
init
)(
struct
tm6000_core
*);
280
int
(*
fini
)(
struct
tm6000_core
*);
281
int
(*
fillbuf
)(
struct
tm6000_core
*,
char
*
buf
,
int
size
);
282
};
283
284
struct
tm6000_fh
{
285
struct
tm6000_core
*
dev
;
286
unsigned
int
radio
;
287
288
/* video capture */
289
struct
tm6000_fmt
*
fmt
;
290
unsigned
int
width
,
height
;
291
struct
videobuf_queue
vb_vidq
;
292
293
enum
v4l2_buf_type
type
;
294
};
295
296
#define TM6000_STD (V4L2_STD_PAL|V4L2_STD_PAL_N|V4L2_STD_PAL_Nc| \
297
V4L2_STD_PAL_M|V4L2_STD_PAL_60|V4L2_STD_NTSC_M| \
298
V4L2_STD_NTSC_M_JP|V4L2_STD_SECAM)
299
300
/* In tm6000-cards.c */
301
302
int
tm6000_tuner_callback
(
void
*
ptr
,
int
component
,
int
command
,
int
arg
);
303
int
tm6000_xc5000_callback
(
void
*
ptr
,
int
component
,
int
command
,
int
arg
);
304
int
tm6000_cards_setup
(
struct
tm6000_core
*
dev
);
305
void
tm6000_flash_led
(
struct
tm6000_core
*
dev
,
u8
state
);
306
307
/* In tm6000-core.c */
308
309
int
tm6000_read_write_usb
(
struct
tm6000_core
*
dev
,
u8
reqtype,
u8
req
,
310
u16
value
,
u16
index
,
u8
*
buf
,
u16
len);
311
int
tm6000_get_reg
(
struct
tm6000_core
*
dev
,
u8
req
,
u16
value
,
u16
index
);
312
int
tm6000_get_reg16
(
struct
tm6000_core
*
dev
,
u8
req
,
u16
value
,
u16
index
);
313
int
tm6000_get_reg32
(
struct
tm6000_core
*
dev
,
u8
req
,
u16
value
,
u16
index
);
314
int
tm6000_set_reg
(
struct
tm6000_core
*
dev
,
u8
req
,
u16
value
,
u16
index
);
315
int
tm6000_set_reg_mask
(
struct
tm6000_core
*
dev
,
u8
req
,
u16
value
,
316
u16
index
,
u16
mask
);
317
int
tm6000_i2c_reset
(
struct
tm6000_core
*
dev
,
u16
tsleep);
318
int
tm6000_init
(
struct
tm6000_core
*
dev
);
319
int
tm6000_reset
(
struct
tm6000_core
*
dev
);
320
321
int
tm6000_init_analog_mode
(
struct
tm6000_core
*
dev
);
322
int
tm6000_init_digital_mode
(
struct
tm6000_core
*
dev
);
323
int
tm6000_set_audio_bitrate
(
struct
tm6000_core
*
dev
,
int
bitrate
);
324
int
tm6000_set_audio_rinput
(
struct
tm6000_core
*
dev
);
325
int
tm6000_tvaudio_set_mute
(
struct
tm6000_core
*
dev
,
u8
mute
);
326
void
tm6000_set_volume
(
struct
tm6000_core
*
dev
,
int
vol
);
327
328
int
tm6000_v4l2_register
(
struct
tm6000_core
*
dev
);
329
int
tm6000_v4l2_unregister
(
struct
tm6000_core
*
dev
);
330
int
tm6000_v4l2_exit
(
void
);
331
void
tm6000_set_fourcc_format
(
struct
tm6000_core
*
dev
);
332
333
void
tm6000_remove_from_devlist
(
struct
tm6000_core
*
dev
);
334
void
tm6000_add_into_devlist
(
struct
tm6000_core
*
dev
);
335
int
tm6000_register_extension
(
struct
tm6000_ops
*
ops
);
336
void
tm6000_unregister_extension
(
struct
tm6000_ops
*
ops
);
337
void
tm6000_init_extension
(
struct
tm6000_core
*
dev
);
338
void
tm6000_close_extension
(
struct
tm6000_core
*
dev
);
339
int
tm6000_call_fillbuf
(
struct
tm6000_core
*
dev
,
enum
tm6000_ops_type
type
,
340
char
*
buf
,
int
size
);
341
342
343
/* In tm6000-stds.c */
344
void
tm6000_get_std_res
(
struct
tm6000_core
*
dev
);
345
int
tm6000_set_standard
(
struct
tm6000_core
*
dev
);
346
347
/* In tm6000-i2c.c */
348
int
tm6000_i2c_register
(
struct
tm6000_core
*
dev
);
349
int
tm6000_i2c_unregister
(
struct
tm6000_core
*
dev
);
350
351
/* In tm6000-queue.c */
352
353
int
tm6000_v4l2_mmap
(
struct
file
*filp,
struct
vm_area_struct
*vma);
354
355
int
tm6000_vidioc_streamon
(
struct
file
*
file
,
void
*
priv
,
356
enum
v4l2_buf_type
i
);
357
int
tm6000_vidioc_streamoff
(
struct
file
*
file
,
void
*
priv
,
358
enum
v4l2_buf_type
i
);
359
int
tm6000_vidioc_reqbufs
(
struct
file
*
file
,
void
*
priv
,
360
struct
v4l2_requestbuffers
*
rb
);
361
int
tm6000_vidioc_querybuf
(
struct
file
*
file
,
void
*
priv
,
362
struct
v4l2_buffer
*
b
);
363
int
tm6000_vidioc_qbuf
(
struct
file
*
file
,
void
*
priv
,
struct
v4l2_buffer
*
b
);
364
int
tm6000_vidioc_dqbuf
(
struct
file
*
file
,
void
*
priv
,
struct
v4l2_buffer
*
b
);
365
ssize_t
tm6000_v4l2_read
(
struct
file
*filp,
char
__user *
buf
,
size_t
count
,
366
loff_t *f_pos);
367
unsigned
int
tm6000_v4l2_poll
(
struct
file
*
file
,
368
struct
poll_table_struct
*
wait
);
369
int
tm6000_queue_init
(
struct
tm6000_core
*
dev
);
370
371
/* In tm6000-alsa.c */
372
/*int tm6000_audio_init(struct tm6000_core *dev, int idx);*/
373
374
/* In tm6000-input.c */
375
int
tm6000_ir_init
(
struct
tm6000_core
*
dev
);
376
int
tm6000_ir_fini
(
struct
tm6000_core
*
dev
);
377
void
tm6000_ir_wait
(
struct
tm6000_core
*
dev
,
u8
state
);
378
int
tm6000_ir_int_start
(
struct
tm6000_core
*
dev
);
379
void
tm6000_ir_int_stop
(
struct
tm6000_core
*
dev
);
380
381
/* Debug stuff */
382
383
extern
int
tm6000_debug
;
384
385
#define dprintk(dev, level, fmt, arg...) do {\
386
if (tm6000_debug & level) \
387
printk(KERN_INFO "(%lu) %s %s :"fmt, jiffies, \
388
dev->name, __func__ , ##arg); } while (0)
389
390
#define V4L2_DEBUG_REG 0x0004
391
#define V4L2_DEBUG_I2C 0x0008
392
#define V4L2_DEBUG_QUEUE 0x0010
393
#define V4L2_DEBUG_ISOC 0x0020
394
#define V4L2_DEBUG_RES_LOCK 0x0040
/* Resource locking */
395
#define V4L2_DEBUG_OPEN 0x0080
/* video open/close debug */
396
397
#define tm6000_err(fmt, arg...) do {\
398
printk(KERN_ERR "tm6000 %s :"fmt, \
399
__func__ , ##arg); } while (0)
Generated on Thu Jan 10 2013 13:52:32 for Linux Kernel by
1.8.2