blob: a007e7442be87d9a2d3b9bcff31726aae17b109f [file] [log] [blame]
R.M. Thomas702422b2010-06-18 12:29:49 -07001/*****************************************************************************
2* *
3* easycap.h *
4* *
5*****************************************************************************/
6/*
7 *
8 * Copyright (C) 2010 R.M. Thomas <rmthomas@sciolus.org>
9 *
10 *
11 * This 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 * The software 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 software; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 *
25*/
26/*****************************************************************************/
27/*---------------------------------------------------------------------------*/
28/*
29 * THE FOLLOWING PARAMETERS ARE UNDEFINED:
30 *
31 * EASYCAP_DEBUG
R.M. Thomas702422b2010-06-18 12:29:49 -070032 *
33 * IF REQUIRED THEY MUST BE EXTERNALLY DEFINED, FOR EXAMPLE AS COMPILER
34 * OPTIONS.
35 */
36/*---------------------------------------------------------------------------*/
37
Tomas Winkler3dbab732011-01-23 01:13:55 +020038#ifndef __EASYCAP_H__
39#define __EASYCAP_H__
R.M. Thomas702422b2010-06-18 12:29:49 -070040
R.M. Thomas702422b2010-06-18 12:29:49 -070041/*---------------------------------------------------------------------------*/
42/*
Mike Thomasf36bc372010-11-07 20:00:35 +000043 * THESE ARE NORMALLY DEFINED
44 */
45/*---------------------------------------------------------------------------*/
46#define PATIENCE 500
Mike Thomasf36bc372010-11-07 20:00:35 +000047#define PERSEVERE
48/*---------------------------------------------------------------------------*/
49/*
R.M. Thomas702422b2010-06-18 12:29:49 -070050 * THESE ARE FOR MAINTENANCE ONLY - NORMALLY UNDEFINED:
51 */
52/*---------------------------------------------------------------------------*/
R.M. Thomas702422b2010-06-18 12:29:49 -070053#undef EASYCAP_TESTCARD
R.M. Thomas702422b2010-06-18 12:29:49 -070054/*---------------------------------------------------------------------------*/
R.M. Thomas702422b2010-06-18 12:29:49 -070055#include <linux/kernel.h>
56#include <linux/errno.h>
57#include <linux/init.h>
58#include <linux/slab.h>
59#include <linux/module.h>
60#include <linux/kref.h>
R.M. Thomas702422b2010-06-18 12:29:49 -070061#include <linux/usb.h>
62#include <linux/uaccess.h>
63
64#include <linux/i2c.h>
R.M. Thomas702422b2010-06-18 12:29:49 -070065#include <linux/workqueue.h>
66#include <linux/poll.h>
67#include <linux/mm.h>
68#include <linux/fs.h>
69#include <linux/delay.h>
70#include <linux/types.h>
71
Mike Thomasa9855912011-01-10 18:41:11 +000072#include <linux/vmalloc.h>
73#include <linux/sound.h>
74#include <sound/core.h>
75#include <sound/pcm.h>
76#include <sound/pcm_params.h>
77#include <sound/info.h>
78#include <sound/initval.h>
79#include <sound/control.h>
R.M. Thomas702422b2010-06-18 12:29:49 -070080#include <media/v4l2-dev.h>
R.M. Thomas702422b2010-06-18 12:29:49 -070081#include <media/v4l2-device.h>
R.M. Thomas702422b2010-06-18 12:29:49 -070082#include <linux/videodev2.h>
R.M. Thomas702422b2010-06-18 12:29:49 -070083#include <linux/soundcard.h>
R.M. Thomas702422b2010-06-18 12:29:49 -070084
R.M. Thomas702422b2010-06-18 12:29:49 -070085/*---------------------------------------------------------------------------*/
86/* VENDOR, PRODUCT: Syntek Semiconductor Co., Ltd
87 *
88 * EITHER EasyCAP USB 2.0 Video Adapter with Audio, Model No. DC60
89 * with input cabling: AUDIO(L), AUDIO(R), CVBS, S-VIDEO.
90 *
91 * OR EasyCAP 4CHANNEL USB 2.0 DVR, Model No. EasyCAP002
92 * with input cabling: MICROPHONE, CVBS1, CVBS2, CVBS3, CVBS4.
93 */
94/*---------------------------------------------------------------------------*/
95#define USB_EASYCAP_VENDOR_ID 0x05e1
96#define USB_EASYCAP_PRODUCT_ID 0x0408
97
Mike Thomasa9855912011-01-10 18:41:11 +000098#define EASYCAP_DRIVER_VERSION "0.9.01"
R.M. Thomas702422b2010-06-18 12:29:49 -070099#define EASYCAP_DRIVER_DESCRIPTION "easycapdc60"
100
Mike Thomase68703c2010-11-07 19:58:55 +0000101#define DONGLE_MANY 8
Mike Thomasf36bc372010-11-07 20:00:35 +0000102#define INPUT_MANY 6
R.M. Thomas702422b2010-06-18 12:29:49 -0700103/*---------------------------------------------------------------------------*/
104/*
105 * DEFAULT LUMINANCE, CONTRAST, SATURATION AND HUE
106 */
107/*---------------------------------------------------------------------------*/
108#define SAA_0A_DEFAULT 0x7F
109#define SAA_0B_DEFAULT 0x3F
110#define SAA_0C_DEFAULT 0x2F
111#define SAA_0D_DEFAULT 0x00
112/*---------------------------------------------------------------------------*/
113/*
114 * VIDEO STREAMING PARAMETERS:
115 * USB 2.0 PROVIDES FOR HIGH-BANDWIDTH ENDPOINTS WITH AN UPPER LIMIT
116 * OF 3072 BYTES PER MICROFRAME for wMaxPacketSize.
117 */
118/*---------------------------------------------------------------------------*/
119#define VIDEO_ISOC_BUFFER_MANY 16
120#define VIDEO_ISOC_ORDER 3
121#define VIDEO_ISOC_FRAMESPERDESC ((unsigned int) 1 << VIDEO_ISOC_ORDER)
122#define USB_2_0_MAXPACKETSIZE 3072
123#if (USB_2_0_MAXPACKETSIZE > PAGE_SIZE)
124#error video_isoc_buffer[.] will not be big enough
125#endif
Mike Thomasf36bc372010-11-07 20:00:35 +0000126#define VIDEO_JUNK_TOLERATE VIDEO_ISOC_BUFFER_MANY
Mike Thomas849322a2010-11-07 20:03:50 +0000127#define VIDEO_LOST_TOLERATE 50
R.M. Thomas702422b2010-06-18 12:29:49 -0700128/*---------------------------------------------------------------------------*/
129/*
130 * VIDEO BUFFERS
131 */
132/*---------------------------------------------------------------------------*/
133#define FIELD_BUFFER_SIZE (203 * PAGE_SIZE)
134#define FRAME_BUFFER_SIZE (405 * PAGE_SIZE)
135#define FIELD_BUFFER_MANY 4
136#define FRAME_BUFFER_MANY 6
137/*---------------------------------------------------------------------------*/
138/*
139 * AUDIO STREAMING PARAMETERS
140 */
141/*---------------------------------------------------------------------------*/
142#define AUDIO_ISOC_BUFFER_MANY 16
Mike Thomasa9855912011-01-10 18:41:11 +0000143#define AUDIO_ISOC_ORDER 1
144#define AUDIO_ISOC_FRAMESPERDESC 32
R.M. Thomas702422b2010-06-18 12:29:49 -0700145#define AUDIO_ISOC_BUFFER_SIZE (PAGE_SIZE << AUDIO_ISOC_ORDER)
146/*---------------------------------------------------------------------------*/
147/*
148 * AUDIO BUFFERS
149 */
150/*---------------------------------------------------------------------------*/
151#define AUDIO_FRAGMENT_MANY 32
Mike Thomasa9855912011-01-10 18:41:11 +0000152#define PAGES_PER_AUDIO_FRAGMENT 4
R.M. Thomas702422b2010-06-18 12:29:49 -0700153/*---------------------------------------------------------------------------*/
154/*
Mike Thomas3d423e92010-07-11 10:51:13 +0100155 * IT IS ESSENTIAL THAT EVEN-NUMBERED STANDARDS ARE 25 FRAMES PER SECOND,
156 * ODD-NUMBERED STANDARDS ARE 30 FRAMES PER SECOND.
157 * THE NUMBERING OF STANDARDS MUST NOT BE CHANGED WITHOUT DUE CARE. NOT
158 * ONLY MUST THE PARAMETER
159 * STANDARD_MANY
160 * BE CHANGED TO CORRESPOND TO THE NEW NUMBER OF STANDARDS, BUT ALSO THE
161 * NUMBERING MUST REMAIN AN UNBROKEN ASCENDING SEQUENCE: DUMMY STANDARDS
162 * MAY NEED TO BE ADDED. APPROPRIATE CHANGES WILL ALWAYS BE REQUIRED IN
163 * ROUTINE fillin_formats() AND POSSIBLY ELSEWHERE. BEWARE.
164 */
165/*---------------------------------------------------------------------------*/
166#define PAL_BGHIN 0
167#define PAL_Nc 2
168#define SECAM 4
169#define NTSC_N 6
170#define NTSC_N_443 8
171#define NTSC_M 1
172#define NTSC_443 3
173#define NTSC_M_JP 5
174#define PAL_60 7
175#define PAL_M 9
Mike Thomas40b8d502010-11-07 20:02:15 +0000176#define PAL_BGHIN_SLOW 10
177#define PAL_Nc_SLOW 12
178#define SECAM_SLOW 14
179#define NTSC_N_SLOW 16
180#define NTSC_N_443_SLOW 18
181#define NTSC_M_SLOW 11
182#define NTSC_443_SLOW 13
183#define NTSC_M_JP_SLOW 15
184#define PAL_60_SLOW 17
185#define PAL_M_SLOW 19
186#define STANDARD_MANY 20
Mike Thomas3d423e92010-07-11 10:51:13 +0100187/*---------------------------------------------------------------------------*/
188/*
189 * ENUMS
190 */
191/*---------------------------------------------------------------------------*/
192enum {
Tomas Winkler03389992011-01-23 01:13:58 +0200193 AT_720x576,
194 AT_704x576,
195 AT_640x480,
196 AT_720x480,
197 AT_360x288,
198 AT_320x240,
199 AT_360x240,
200 RESOLUTION_MANY
Mike Thomas3d423e92010-07-11 10:51:13 +0100201};
202enum {
Tomas Winkler03389992011-01-23 01:13:58 +0200203 FMT_UYVY,
204 FMT_YUY2,
205 FMT_RGB24,
206 FMT_RGB32,
207 FMT_BGR24,
208 FMT_BGR32,
209 PIXELFORMAT_MANY
Mike Thomas3d423e92010-07-11 10:51:13 +0100210};
211enum {
Tomas Winkler03389992011-01-23 01:13:58 +0200212 FIELD_NONE,
213 FIELD_INTERLACED,
214 INTERLACE_MANY
Mike Thomas3d423e92010-07-11 10:51:13 +0100215};
216#define SETTINGS_MANY (STANDARD_MANY * \
217 RESOLUTION_MANY * \
218 2 * \
219 PIXELFORMAT_MANY * \
220 INTERLACE_MANY)
221/*---------------------------------------------------------------------------*/
222/*
R.M. Thomas702422b2010-06-18 12:29:49 -0700223 * STRUCTURE DEFINITIONS
224 */
225/*---------------------------------------------------------------------------*/
Mike Thomasae59dad2010-11-07 20:09:19 +0000226struct easycap_dongle {
Tomas Winkler03389992011-01-23 01:13:58 +0200227 struct easycap *peasycap;
228 struct mutex mutex_video;
229 struct mutex mutex_audio;
Mike Thomasae59dad2010-11-07 20:09:19 +0000230};
231/*---------------------------------------------------------------------------*/
R.M. Thomas702422b2010-06-18 12:29:49 -0700232struct data_buffer {
Tomas Winkler03389992011-01-23 01:13:58 +0200233 struct list_head list_head;
234 void *pgo;
235 void *pto;
Tomas Winkler055e3a32011-02-03 13:42:47 +0200236 u16 kount;
237 u16 input;
R.M. Thomas702422b2010-06-18 12:29:49 -0700238};
239/*---------------------------------------------------------------------------*/
240struct data_urb {
Tomas Winkler03389992011-01-23 01:13:58 +0200241 struct list_head list_head;
242 struct urb *purb;
243 int isbuf;
244 int length;
R.M. Thomas702422b2010-06-18 12:29:49 -0700245};
246/*---------------------------------------------------------------------------*/
Mike Thomas3d423e92010-07-11 10:51:13 +0100247struct easycap_standard {
Tomas Winkler055e3a32011-02-03 13:42:47 +0200248 u16 mask;
Mike Thomas3d423e92010-07-11 10:51:13 +0100249struct v4l2_standard v4l2_standard;
250};
251struct easycap_format {
Tomas Winkler055e3a32011-02-03 13:42:47 +0200252 u16 mask;
Tomas Winkler03389992011-01-23 01:13:58 +0200253 char name[128];
Mike Thomas3d423e92010-07-11 10:51:13 +0100254struct v4l2_format v4l2_format;
255};
Mike Thomasf36bc372010-11-07 20:00:35 +0000256struct inputset {
Tomas Winkler03389992011-01-23 01:13:58 +0200257 int input;
258 int input_ok;
259 int standard_offset;
260 int standard_offset_ok;
261 int format_offset;
262 int format_offset_ok;
263 int brightness;
264 int brightness_ok;
265 int contrast;
266 int contrast_ok;
267 int saturation;
268 int saturation_ok;
269 int hue;
270 int hue_ok;
Mike Thomasf36bc372010-11-07 20:00:35 +0000271};
Mike Thomas3d423e92010-07-11 10:51:13 +0100272/*---------------------------------------------------------------------------*/
R.M. Thomas702422b2010-06-18 12:29:49 -0700273/*
274 * easycap.ilk == 0 => CVBS+S-VIDEO HARDWARE, AUDIO wMaxPacketSize=256
275 * easycap.ilk == 2 => CVBS+S-VIDEO HARDWARE, AUDIO wMaxPacketSize=9
276 * easycap.ilk == 3 => FOUR-CVBS HARDWARE, AUDIO wMaxPacketSize=9
277 */
278/*---------------------------------------------------------------------------*/
279struct easycap {
Tomas Winkler03389992011-01-23 01:13:58 +0200280 int isdongle;
281 int minor;
Mike Thomase68703c2010-11-07 19:58:55 +0000282
Tomas Winkler03389992011-01-23 01:13:58 +0200283 struct video_device video_device;
Tomas Winkler03389992011-01-23 01:13:58 +0200284 struct v4l2_device v4l2_device;
Tomas Winklercb81fa02011-03-06 00:55:22 +0200285
Tomas Winkler03389992011-01-23 01:13:58 +0200286 int status;
287 unsigned int audio_pages_per_fragment;
288 unsigned int audio_bytes_per_fragment;
289 unsigned int audio_buffer_page_many;
Mike Thomas3d423e92010-07-11 10:51:13 +0100290
291#define UPSAMPLE
Tomas Winkler3fc0dae2011-02-03 13:42:40 +0200292#ifdef UPSAMPLE
Tomas Winkler055e3a32011-02-03 13:42:47 +0200293 s16 oldaudio;
Mike Thomas3d423e92010-07-11 10:51:13 +0100294#endif /*UPSAMPLE*/
295
Tomas Winkler03389992011-01-23 01:13:58 +0200296 int ilk;
297 bool microphone;
R.M. Thomas702422b2010-06-18 12:29:49 -0700298
Tomas Winkler03389992011-01-23 01:13:58 +0200299 struct usb_device *pusb_device;
300 struct usb_interface *pusb_interface;
R.M. Thomas702422b2010-06-18 12:29:49 -0700301
Tomas Winkler03389992011-01-23 01:13:58 +0200302 struct kref kref;
R.M. Thomas702422b2010-06-18 12:29:49 -0700303
Tomas Winkler03389992011-01-23 01:13:58 +0200304 int queued[FRAME_BUFFER_MANY];
305 int done[FRAME_BUFFER_MANY];
R.M. Thomas702422b2010-06-18 12:29:49 -0700306
Tomas Winkler03389992011-01-23 01:13:58 +0200307 wait_queue_head_t wq_video;
308 wait_queue_head_t wq_audio;
309 wait_queue_head_t wq_trigger;
R.M. Thomas702422b2010-06-18 12:29:49 -0700310
Tomas Winkler03389992011-01-23 01:13:58 +0200311 int input;
312 int polled;
313 int standard_offset;
314 int format_offset;
315 struct inputset inputset[INPUT_MANY];
R.M. Thomas702422b2010-06-18 12:29:49 -0700316
Tomas Winkler03389992011-01-23 01:13:58 +0200317 bool ntsc;
318 int fps;
319 int usec;
320 int tolerate;
321 int skip;
322 int skipped;
323 int lost[INPUT_MANY];
324 int merit[180];
R.M. Thomas702422b2010-06-18 12:29:49 -0700325
Tomas Winkler03389992011-01-23 01:13:58 +0200326 int video_interface;
327 int video_altsetting_on;
328 int video_altsetting_off;
329 int video_endpointnumber;
330 int video_isoc_maxframesize;
331 int video_isoc_buffer_size;
332 int video_isoc_framesperdesc;
R.M. Thomas702422b2010-06-18 12:29:49 -0700333
Tomas Winkler03389992011-01-23 01:13:58 +0200334 int video_isoc_streaming;
335 int video_isoc_sequence;
336 int video_idle;
337 int video_eof;
338 int video_junk;
R.M. Thomas702422b2010-06-18 12:29:49 -0700339
Tomas Winkler03389992011-01-23 01:13:58 +0200340 struct data_buffer video_isoc_buffer[VIDEO_ISOC_BUFFER_MANY];
341 struct data_buffer field_buffer[FIELD_BUFFER_MANY]
342 [(FIELD_BUFFER_SIZE/PAGE_SIZE)];
343 struct data_buffer frame_buffer[FRAME_BUFFER_MANY]
344 [(FRAME_BUFFER_SIZE/PAGE_SIZE)];
R.M. Thomas702422b2010-06-18 12:29:49 -0700345
Tomas Winkler03389992011-01-23 01:13:58 +0200346 struct list_head urb_video_head;
347 struct list_head *purb_video_head;
R.M. Thomas702422b2010-06-18 12:29:49 -0700348
Tomas Winkler055e3a32011-02-03 13:42:47 +0200349 u8 cache[8];
350 u8 *pcache;
Tomas Winkler03389992011-01-23 01:13:58 +0200351 int video_mt;
352 int audio_mt;
Tomas Winkler055e3a32011-02-03 13:42:47 +0200353 u32 isequence;
Mike Thomase68703c2010-11-07 19:58:55 +0000354
Tomas Winkler03389992011-01-23 01:13:58 +0200355 int vma_many;
R.M. Thomas702422b2010-06-18 12:29:49 -0700356/*---------------------------------------------------------------------------*/
357/*
358 * BUFFER INDICATORS
359 */
360/*---------------------------------------------------------------------------*/
Tomas Winkler03389992011-01-23 01:13:58 +0200361 int field_fill; /* Field buffer being filled by easycap_complete(). */
R.M. Thomas702422b2010-06-18 12:29:49 -0700362 /* Bumped only by easycap_complete(). */
Tomas Winkler03389992011-01-23 01:13:58 +0200363 int field_page; /* Page of field buffer page being filled by */
R.M. Thomas702422b2010-06-18 12:29:49 -0700364 /* easycap_complete(). */
Tomas Winkler03389992011-01-23 01:13:58 +0200365 int field_read; /* Field buffer to be read by field2frame(). */
R.M. Thomas702422b2010-06-18 12:29:49 -0700366 /* Bumped only by easycap_complete(). */
Tomas Winkler03389992011-01-23 01:13:58 +0200367 int frame_fill; /* Frame buffer being filled by field2frame(). */
R.M. Thomas702422b2010-06-18 12:29:49 -0700368 /* Bumped only by easycap_dqbuf() when */
369 /* field2frame() has created a complete frame. */
Tomas Winkler03389992011-01-23 01:13:58 +0200370 int frame_read; /* Frame buffer offered to user by DQBUF. */
R.M. Thomas702422b2010-06-18 12:29:49 -0700371 /* Set only by easycap_dqbuf() to trail frame_fill.*/
Tomas Winkler03389992011-01-23 01:13:58 +0200372 int frame_lock; /* Flag set to 1 by DQBUF and cleared by QBUF */
R.M. Thomas702422b2010-06-18 12:29:49 -0700373/*---------------------------------------------------------------------------*/
374/*
375 * IMAGE PROPERTIES
376 */
377/*---------------------------------------------------------------------------*/
Tomas Winkler055e3a32011-02-03 13:42:47 +0200378 u32 pixelformat;
Tomas Winkler03389992011-01-23 01:13:58 +0200379 int width;
380 int height;
381 int bytesperpixel;
382 bool byteswaporder;
383 bool decimatepixel;
384 bool offerfields;
385 int frame_buffer_used;
386 int frame_buffer_many;
387 int videofieldamount;
R.M. Thomas702422b2010-06-18 12:29:49 -0700388
Tomas Winkler03389992011-01-23 01:13:58 +0200389 int brightness;
390 int contrast;
391 int saturation;
392 int hue;
R.M. Thomas702422b2010-06-18 12:29:49 -0700393
Tomas Winkler03389992011-01-23 01:13:58 +0200394 int allocation_video_urb;
395 int allocation_video_page;
396 int allocation_video_struct;
397 int registered_video;
R.M. Thomas702422b2010-06-18 12:29:49 -0700398/*---------------------------------------------------------------------------*/
399/*
Mike Thomasa9855912011-01-10 18:41:11 +0000400 * ALSA
401 */
402/*---------------------------------------------------------------------------*/
Tomas Winkler03389992011-01-23 01:13:58 +0200403 struct snd_pcm_hardware alsa_hardware;
404 struct snd_card *psnd_card;
405 struct snd_pcm *psnd_pcm;
406 struct snd_pcm_substream *psubstream;
407 int dma_fill;
408 int dma_next;
409 int dma_read;
Mike Thomasa9855912011-01-10 18:41:11 +0000410/*---------------------------------------------------------------------------*/
411/*
R.M. Thomas702422b2010-06-18 12:29:49 -0700412 * SOUND PROPERTIES
413 */
414/*---------------------------------------------------------------------------*/
Tomas Winkler03389992011-01-23 01:13:58 +0200415 int audio_interface;
416 int audio_altsetting_on;
417 int audio_altsetting_off;
418 int audio_endpointnumber;
419 int audio_isoc_maxframesize;
420 int audio_isoc_buffer_size;
421 int audio_isoc_framesperdesc;
R.M. Thomas702422b2010-06-18 12:29:49 -0700422
Tomas Winkler03389992011-01-23 01:13:58 +0200423 int audio_isoc_streaming;
424 int audio_idle;
425 int audio_eof;
426 int volume;
427 int mute;
428 s8 gain;
R.M. Thomas702422b2010-06-18 12:29:49 -0700429
Tomas Winkler03389992011-01-23 01:13:58 +0200430 struct data_buffer audio_isoc_buffer[AUDIO_ISOC_BUFFER_MANY];
R.M. Thomas702422b2010-06-18 12:29:49 -0700431
Tomas Winkler03389992011-01-23 01:13:58 +0200432 struct list_head urb_audio_head;
433 struct list_head *purb_audio_head;
R.M. Thomas702422b2010-06-18 12:29:49 -0700434/*---------------------------------------------------------------------------*/
435/*
436 * BUFFER INDICATORS
437 */
438/*---------------------------------------------------------------------------*/
Tomas Winkler03389992011-01-23 01:13:58 +0200439 int audio_fill; /* Audio buffer being filled by easycap_complete(). */
Mike Thomasa9855912011-01-10 18:41:11 +0000440 /* Bumped only by easycap_complete(). */
Tomas Winkler03389992011-01-23 01:13:58 +0200441 int audio_read; /* Audio buffer page being read by easycap_read(). */
Mike Thomasa9855912011-01-10 18:41:11 +0000442 /* Set by easycap_read() to trail audio_fill by */
R.M. Thomas702422b2010-06-18 12:29:49 -0700443 /* one fragment. */
444/*---------------------------------------------------------------------------*/
445/*
446 * SOUND PROPERTIES
447 */
448/*---------------------------------------------------------------------------*/
Tomas Winkler03389992011-01-23 01:13:58 +0200449 int allocation_audio_urb;
450 int allocation_audio_page;
451 int allocation_audio_struct;
452 int registered_audio;
R.M. Thomas702422b2010-06-18 12:29:49 -0700453
Tomas Winkler03389992011-01-23 01:13:58 +0200454 long long int audio_sample;
455 long long int audio_niveau;
456 long long int audio_square;
R.M. Thomas702422b2010-06-18 12:29:49 -0700457
Tomas Winkler03389992011-01-23 01:13:58 +0200458 struct data_buffer audio_buffer[];
R.M. Thomas702422b2010-06-18 12:29:49 -0700459};
460/*---------------------------------------------------------------------------*/
R.M. Thomas702422b2010-06-18 12:29:49 -0700461/*
462 * VIDEO FUNCTION PROTOTYPES
463 */
R.M. Thomas702422b2010-06-18 12:29:49 -0700464/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
Tomas Winkler96bec7d2011-11-09 08:26:40 -0300465int easycap_newinput(struct easycap *, int);
Tomas Winkler98680552011-11-09 08:26:32 -0300466void easycap_testcard(struct easycap *, int);
Tomas Winkler96bec7d2011-11-09 08:26:40 -0300467int easycap_isdongle(struct easycap *);
468
469long easycap_unlocked_ioctl(struct file *, unsigned int, unsigned long);
470
471int easycap_video_dqbuf(struct easycap *, int);
472int easycap_video_submit_urbs(struct easycap *);
473int easycap_video_kill_urbs(struct easycap *);
474int easycap_video_fillin_formats(void);
Tomas Winkler98680552011-11-09 08:26:32 -0300475
476int adjust_standard(struct easycap *, v4l2_std_id);
477int adjust_format(struct easycap *, u32, u32, u32, int, bool);
478int adjust_brightness(struct easycap *, int);
479int adjust_contrast(struct easycap *, int);
480int adjust_saturation(struct easycap *, int);
481int adjust_hue(struct easycap *, int);
R.M. Thomas702422b2010-06-18 12:29:49 -0700482/*---------------------------------------------------------------------------*/
483/*
484 * AUDIO FUNCTION PROTOTYPES
485 */
486/*---------------------------------------------------------------------------*/
Tomas Winkler98680552011-11-09 08:26:32 -0300487int easycap_alsa_probe(struct easycap *);
Tomas Winkler8b1fad22011-11-09 08:26:37 -0300488int easycap_audio_kill_urbs(struct easycap *);
Tomas Winkler98680552011-11-09 08:26:32 -0300489void easycap_alsa_complete(struct urb *);
R.M. Thomas702422b2010-06-18 12:29:49 -0700490/*---------------------------------------------------------------------------*/
491/*
492 * LOW-LEVEL FUNCTION PROTOTYPES
493 */
494/*---------------------------------------------------------------------------*/
Tomas Winkler96bec7d2011-11-09 08:26:40 -0300495int easycap_audio_gainset(struct usb_device *, s8);
496int easycap_audio_setup(struct easycap *);
R.M. Thomas702422b2010-06-18 12:29:49 -0700497
Tomas Winkler96bec7d2011-11-09 08:26:40 -0300498int easycap_wakeup_device(struct usb_device *);
R.M. Thomas702422b2010-06-18 12:29:49 -0700499
Tomas Winkler98680552011-11-09 08:26:32 -0300500int setup_stk(struct usb_device *, bool);
501int setup_saa(struct usb_device *, bool);
502int ready_saa(struct usb_device *);
503int merit_saa(struct usb_device *);
504int check_vt(struct usb_device *);
505int select_input(struct usb_device *, int, int);
506int set_resolution(struct usb_device *, u16, u16, u16, u16);
R.M. Thomas702422b2010-06-18 12:29:49 -0700507
Tomas Winkler98680552011-11-09 08:26:32 -0300508int read_saa(struct usb_device *, u16);
509int write_saa(struct usb_device *, u16, u16);
510int start_100(struct usb_device *);
511int stop_100(struct usb_device *);
R.M. Thomas702422b2010-06-18 12:29:49 -0700512/*---------------------------------------------------------------------------*/
Tomas Winkler2a9a05c2011-01-18 14:03:23 +0200513
514
R.M. Thomas702422b2010-06-18 12:29:49 -0700515/*---------------------------------------------------------------------------*/
516/*
Mike Thomase68703c2010-11-07 19:58:55 +0000517 * MACROS SAM(...) AND JOM(...) ALLOW DIAGNOSTIC OUTPUT TO BE TAGGED WITH
518 * THE IDENTITY OF THE DONGLE TO WHICH IT APPLIES, BUT IF INVOKED WHEN THE
519 * POINTER peasycap IS INVALID AN Oops IS LIKELY, AND ITS CAUSE MAY NOT BE
520 * IMMEDIATELY OBVIOUS FROM A CASUAL READING OF THE SOURCE CODE. BEWARE.
521*/
522/*---------------------------------------------------------------------------*/
Tomas Winkler5c0c6c32011-01-24 13:27:02 +0200523const char *strerror(int err);
524
R.M. Thomas702422b2010-06-18 12:29:49 -0700525#define SAY(format, args...) do { \
Mike Thomase68703c2010-11-07 19:58:55 +0000526 printk(KERN_DEBUG "easycap:: %s: " \
527 format, __func__, ##args); \
R.M. Thomas702422b2010-06-18 12:29:49 -0700528} while (0)
Mike Thomase68703c2010-11-07 19:58:55 +0000529#define SAM(format, args...) do { \
530 printk(KERN_DEBUG "easycap::%i%s: " \
531 format, peasycap->isdongle, __func__, ##args);\
532} while (0)
R.M. Thomas702422b2010-06-18 12:29:49 -0700533
Tomas Winkler02149cf2011-01-23 01:13:56 +0200534#ifdef CONFIG_EASYCAP_DEBUG
535extern int easycap_debug;
R.M. Thomas702422b2010-06-18 12:29:49 -0700536#define JOT(n, format, args...) do { \
Randy Dunlap62af33e2010-11-11 10:44:22 -0800537 if (n <= easycap_debug) { \
Mike Thomase68703c2010-11-07 19:58:55 +0000538 printk(KERN_DEBUG "easycap:: %s: " \
539 format, __func__, ##args);\
R.M. Thomas702422b2010-06-18 12:29:49 -0700540 } \
541} while (0)
Mike Thomase68703c2010-11-07 19:58:55 +0000542#define JOM(n, format, args...) do { \
Randy Dunlap62af33e2010-11-11 10:44:22 -0800543 if (n <= easycap_debug) { \
Mike Thomase68703c2010-11-07 19:58:55 +0000544 printk(KERN_DEBUG "easycap::%i%s: " \
545 format, peasycap->isdongle, __func__, ##args);\
546 } \
547} while (0)
548
R.M. Thomas702422b2010-06-18 12:29:49 -0700549#else
550#define JOT(n, format, args...) do {} while (0)
Mike Thomase68703c2010-11-07 19:58:55 +0000551#define JOM(n, format, args...) do {} while (0)
Tomas Winkler02149cf2011-01-23 01:13:56 +0200552#endif /* CONFIG_EASYCAP_DEBUG */
R.M. Thomas702422b2010-06-18 12:29:49 -0700553
R.M. Thomas702422b2010-06-18 12:29:49 -0700554/*---------------------------------------------------------------------------*/
R.M. Thomas702422b2010-06-18 12:29:49 -0700555
Tomas Winklerb4f63e92011-01-23 01:13:54 +0200556/*---------------------------------------------------------------------------*/
557/* globals
558 */
559/*---------------------------------------------------------------------------*/
560
Tomas Winkler2ef0c052011-02-09 01:12:51 +0200561extern bool easycap_readback;
Tomas Winklerb4f63e92011-01-23 01:13:54 +0200562extern const struct easycap_standard easycap_standard[];
563extern struct easycap_format easycap_format[];
564extern struct v4l2_queryctrl easycap_control[];
Tomas Winklerb4f63e92011-01-23 01:13:54 +0200565extern struct easycap_dongle easycapdc60_dongle[];
Tomas Winklerb4f63e92011-01-23 01:13:54 +0200566
Tomas Winkler3dbab732011-01-23 01:13:55 +0200567#endif /* !__EASYCAP_H__ */