Pull platform-drivers into test branch
[linux-2.6/x86.git] / drivers / media / video / v4l2-common.c
blob752c82c37f558277d14e36f4a150e98e2c9f9e81
1 /*
2 * Video for Linux Two
4 * A generic video device interface for the LINUX operating system
5 * using a set of device structures/vectors for low level operations.
7 * This file replaces the videodev.c file that comes with the
8 * regular kernel distribution.
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version
13 * 2 of the License, or (at your option) any later version.
15 * Author: Bill Dirks <bdirks@pacbell.net>
16 * based on code by Alan Cox, <alan@cymru.net>
21 * Video capture interface for Linux
23 * A generic video device interface for the LINUX operating system
24 * using a set of device structures/vectors for low level operations.
26 * This program is free software; you can redistribute it and/or
27 * modify it under the terms of the GNU General Public License
28 * as published by the Free Software Foundation; either version
29 * 2 of the License, or (at your option) any later version.
31 * Author: Alan Cox, <alan@redhat.com>
33 * Fixes:
37 * Video4linux 1/2 integration by Justin Schoeman
38 * <justin@suntiger.ee.up.ac.za>
39 * 2.4 PROCFS support ported from 2.4 kernels by
40 * Iñaki García Etxebarria <garetxe@euskalnet.net>
41 * Makefile fix by "W. Michael Petullo" <mike@flyn.org>
42 * 2.4 devfs support ported from 2.4 kernels by
43 * Dan Merillat <dan@merillat.org>
44 * Added Gerd Knorrs v4l1 enhancements (Justin Schoeman)
47 #include <linux/module.h>
48 #include <linux/types.h>
49 #include <linux/kernel.h>
50 #include <linux/sched.h>
51 #include <linux/smp_lock.h>
52 #include <linux/mm.h>
53 #include <linux/string.h>
54 #include <linux/errno.h>
55 #include <asm/uaccess.h>
56 #include <asm/system.h>
57 #include <asm/pgtable.h>
58 #include <asm/io.h>
59 #include <asm/div64.h>
60 #include <linux/video_decoder.h>
61 #define __OLD_VIDIOC_ /* To allow fixing old calls*/
62 #include <media/v4l2-common.h>
64 #ifdef CONFIG_KMOD
65 #include <linux/kmod.h>
66 #endif
68 #if defined(CONFIG_UST) || defined(CONFIG_UST_MODULE)
69 #include <linux/ust.h>
70 #endif
73 #include <linux/videodev.h>
75 MODULE_AUTHOR("Bill Dirks, Justin Schoeman, Gerd Knorr");
76 MODULE_DESCRIPTION("misc helper functions for v4l2 device drivers");
77 MODULE_LICENSE("GPL");
81 * V 4 L 2 D R I V E R H E L P E R A P I
86 * Video Standard Operations (contributed by Michael Schimek)
90 char *v4l2_norm_to_name(v4l2_std_id id)
92 char *name;
94 switch (id) {
95 case V4L2_STD_PAL:
96 name="PAL"; break;
97 case V4L2_STD_PAL_BG:
98 name="PAL-BG"; break;
99 case V4L2_STD_PAL_DK:
100 name="PAL-DK"; break;
101 case V4L2_STD_PAL_B:
102 name="PAL-B"; break;
103 case V4L2_STD_PAL_B1:
104 name="PAL-B1"; break;
105 case V4L2_STD_PAL_G:
106 name="PAL-G"; break;
107 case V4L2_STD_PAL_H:
108 name="PAL-H"; break;
109 case V4L2_STD_PAL_I:
110 name="PAL-I"; break;
111 case V4L2_STD_PAL_D:
112 name="PAL-D"; break;
113 case V4L2_STD_PAL_D1:
114 name="PAL-D1"; break;
115 case V4L2_STD_PAL_K:
116 name="PAL-K"; break;
117 case V4L2_STD_PAL_M:
118 name="PAL-M"; break;
119 case V4L2_STD_PAL_N:
120 name="PAL-N"; break;
121 case V4L2_STD_PAL_Nc:
122 name="PAL-Nc"; break;
123 case V4L2_STD_PAL_60:
124 name="PAL-60"; break;
125 case V4L2_STD_NTSC:
126 name="NTSC"; break;
127 case V4L2_STD_NTSC_M:
128 name="NTSC-M"; break;
129 case V4L2_STD_NTSC_M_JP:
130 name="NTSC-M-JP"; break;
131 case V4L2_STD_NTSC_443:
132 name="NTSC-443"; break;
133 case V4L2_STD_NTSC_M_KR:
134 name="NTSC-M-KR"; break;
135 case V4L2_STD_SECAM:
136 name="SECAM"; break;
137 case V4L2_STD_SECAM_DK:
138 name="SECAM-DK"; break;
139 case V4L2_STD_SECAM_B:
140 name="SECAM-B"; break;
141 case V4L2_STD_SECAM_D:
142 name="SECAM-D"; break;
143 case V4L2_STD_SECAM_G:
144 name="SECAM-G"; break;
145 case V4L2_STD_SECAM_H:
146 name="SECAM-H"; break;
147 case V4L2_STD_SECAM_K:
148 name="SECAM-K"; break;
149 case V4L2_STD_SECAM_K1:
150 name="SECAM-K1"; break;
151 case V4L2_STD_SECAM_L:
152 name="SECAM-L"; break;
153 case V4L2_STD_SECAM_LC:
154 name="SECAM-LC"; break;
155 default:
156 name="Unknown"; break;
159 return name;
162 /* Fill in the fields of a v4l2_standard structure according to the
163 'id' and 'transmission' parameters. Returns negative on error. */
164 int v4l2_video_std_construct(struct v4l2_standard *vs,
165 int id, char *name)
167 u32 index = vs->index;
169 memset(vs, 0, sizeof(struct v4l2_standard));
170 vs->index = index;
171 vs->id = id;
172 if (id & V4L2_STD_525_60) {
173 vs->frameperiod.numerator = 1001;
174 vs->frameperiod.denominator = 30000;
175 vs->framelines = 525;
176 } else {
177 vs->frameperiod.numerator = 1;
178 vs->frameperiod.denominator = 25;
179 vs->framelines = 625;
181 strlcpy(vs->name,name,sizeof(vs->name));
182 return 0;
185 /* ----------------------------------------------------------------- */
186 /* priority handling */
188 #define V4L2_PRIO_VALID(val) (val == V4L2_PRIORITY_BACKGROUND || \
189 val == V4L2_PRIORITY_INTERACTIVE || \
190 val == V4L2_PRIORITY_RECORD)
192 int v4l2_prio_init(struct v4l2_prio_state *global)
194 memset(global,0,sizeof(*global));
195 return 0;
198 int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local,
199 enum v4l2_priority new)
201 if (!V4L2_PRIO_VALID(new))
202 return -EINVAL;
203 if (*local == new)
204 return 0;
206 atomic_inc(&global->prios[new]);
207 if (V4L2_PRIO_VALID(*local))
208 atomic_dec(&global->prios[*local]);
209 *local = new;
210 return 0;
213 int v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local)
215 return v4l2_prio_change(global,local,V4L2_PRIORITY_DEFAULT);
218 int v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority *local)
220 if (V4L2_PRIO_VALID(*local))
221 atomic_dec(&global->prios[*local]);
222 return 0;
225 enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global)
227 if (atomic_read(&global->prios[V4L2_PRIORITY_RECORD]) > 0)
228 return V4L2_PRIORITY_RECORD;
229 if (atomic_read(&global->prios[V4L2_PRIORITY_INTERACTIVE]) > 0)
230 return V4L2_PRIORITY_INTERACTIVE;
231 if (atomic_read(&global->prios[V4L2_PRIORITY_BACKGROUND]) > 0)
232 return V4L2_PRIORITY_BACKGROUND;
233 return V4L2_PRIORITY_UNSET;
236 int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority *local)
238 if (*local < v4l2_prio_max(global))
239 return -EBUSY;
240 return 0;
244 /* ----------------------------------------------------------------- */
245 /* some arrays for pretty-printing debug messages of enum types */
247 char *v4l2_field_names[] = {
248 [V4L2_FIELD_ANY] = "any",
249 [V4L2_FIELD_NONE] = "none",
250 [V4L2_FIELD_TOP] = "top",
251 [V4L2_FIELD_BOTTOM] = "bottom",
252 [V4L2_FIELD_INTERLACED] = "interlaced",
253 [V4L2_FIELD_SEQ_TB] = "seq-tb",
254 [V4L2_FIELD_SEQ_BT] = "seq-bt",
255 [V4L2_FIELD_ALTERNATE] = "alternate",
258 char *v4l2_type_names[] = {
259 [V4L2_BUF_TYPE_VIDEO_CAPTURE] = "video-cap",
260 [V4L2_BUF_TYPE_VIDEO_OVERLAY] = "video-over",
261 [V4L2_BUF_TYPE_VIDEO_OUTPUT] = "video-out",
262 [V4L2_BUF_TYPE_VBI_CAPTURE] = "vbi-cap",
263 [V4L2_BUF_TYPE_VBI_OUTPUT] = "vbi-out",
264 [V4L2_BUF_TYPE_SLICED_VBI_CAPTURE] = "sliced-vbi-cap",
265 [V4L2_BUF_TYPE_SLICED_VBI_OUTPUT] = "slicec-vbi-out",
268 static char *v4l2_memory_names[] = {
269 [V4L2_MEMORY_MMAP] = "mmap",
270 [V4L2_MEMORY_USERPTR] = "userptr",
271 [V4L2_MEMORY_OVERLAY] = "overlay",
274 #define prt_names(a,arr) (((a)>=0)&&((a)<ARRAY_SIZE(arr)))?arr[a]:"unknown"
276 /* ------------------------------------------------------------------ */
277 /* debug help functions */
279 #ifdef CONFIG_VIDEO_V4L1_COMPAT
280 static const char *v4l1_ioctls[] = {
281 [_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP",
282 [_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN",
283 [_IOC_NR(VIDIOCSCHAN)] = "VIDIOCSCHAN",
284 [_IOC_NR(VIDIOCGTUNER)] = "VIDIOCGTUNER",
285 [_IOC_NR(VIDIOCSTUNER)] = "VIDIOCSTUNER",
286 [_IOC_NR(VIDIOCGPICT)] = "VIDIOCGPICT",
287 [_IOC_NR(VIDIOCSPICT)] = "VIDIOCSPICT",
288 [_IOC_NR(VIDIOCCAPTURE)] = "VIDIOCCAPTURE",
289 [_IOC_NR(VIDIOCGWIN)] = "VIDIOCGWIN",
290 [_IOC_NR(VIDIOCSWIN)] = "VIDIOCSWIN",
291 [_IOC_NR(VIDIOCGFBUF)] = "VIDIOCGFBUF",
292 [_IOC_NR(VIDIOCSFBUF)] = "VIDIOCSFBUF",
293 [_IOC_NR(VIDIOCKEY)] = "VIDIOCKEY",
294 [_IOC_NR(VIDIOCGFREQ)] = "VIDIOCGFREQ",
295 [_IOC_NR(VIDIOCSFREQ)] = "VIDIOCSFREQ",
296 [_IOC_NR(VIDIOCGAUDIO)] = "VIDIOCGAUDIO",
297 [_IOC_NR(VIDIOCSAUDIO)] = "VIDIOCSAUDIO",
298 [_IOC_NR(VIDIOCSYNC)] = "VIDIOCSYNC",
299 [_IOC_NR(VIDIOCMCAPTURE)] = "VIDIOCMCAPTURE",
300 [_IOC_NR(VIDIOCGMBUF)] = "VIDIOCGMBUF",
301 [_IOC_NR(VIDIOCGUNIT)] = "VIDIOCGUNIT",
302 [_IOC_NR(VIDIOCGCAPTURE)] = "VIDIOCGCAPTURE",
303 [_IOC_NR(VIDIOCSCAPTURE)] = "VIDIOCSCAPTURE",
304 [_IOC_NR(VIDIOCSPLAYMODE)] = "VIDIOCSPLAYMODE",
305 [_IOC_NR(VIDIOCSWRITEMODE)] = "VIDIOCSWRITEMODE",
306 [_IOC_NR(VIDIOCGPLAYINFO)] = "VIDIOCGPLAYINFO",
307 [_IOC_NR(VIDIOCSMICROCODE)] = "VIDIOCSMICROCODE",
308 [_IOC_NR(VIDIOCGVBIFMT)] = "VIDIOCGVBIFMT",
309 [_IOC_NR(VIDIOCSVBIFMT)] = "VIDIOCSVBIFMT"
311 #define V4L1_IOCTLS ARRAY_SIZE(v4l1_ioctls)
312 #endif
314 static const char *v4l2_ioctls[] = {
315 [_IOC_NR(VIDIOC_QUERYCAP)] = "VIDIOC_QUERYCAP",
316 [_IOC_NR(VIDIOC_RESERVED)] = "VIDIOC_RESERVED",
317 [_IOC_NR(VIDIOC_ENUM_FMT)] = "VIDIOC_ENUM_FMT",
318 [_IOC_NR(VIDIOC_G_FMT)] = "VIDIOC_G_FMT",
319 [_IOC_NR(VIDIOC_S_FMT)] = "VIDIOC_S_FMT",
320 [_IOC_NR(VIDIOC_G_MPEGCOMP)] = "VIDIOC_G_MPEGCOMP",
321 [_IOC_NR(VIDIOC_S_MPEGCOMP)] = "VIDIOC_S_MPEGCOMP",
322 [_IOC_NR(VIDIOC_REQBUFS)] = "VIDIOC_REQBUFS",
323 [_IOC_NR(VIDIOC_QUERYBUF)] = "VIDIOC_QUERYBUF",
324 [_IOC_NR(VIDIOC_G_FBUF)] = "VIDIOC_G_FBUF",
325 [_IOC_NR(VIDIOC_S_FBUF)] = "VIDIOC_S_FBUF",
326 [_IOC_NR(VIDIOC_OVERLAY)] = "VIDIOC_OVERLAY",
327 [_IOC_NR(VIDIOC_QBUF)] = "VIDIOC_QBUF",
328 [_IOC_NR(VIDIOC_DQBUF)] = "VIDIOC_DQBUF",
329 [_IOC_NR(VIDIOC_STREAMON)] = "VIDIOC_STREAMON",
330 [_IOC_NR(VIDIOC_STREAMOFF)] = "VIDIOC_STREAMOFF",
331 [_IOC_NR(VIDIOC_G_PARM)] = "VIDIOC_G_PARM",
332 [_IOC_NR(VIDIOC_S_PARM)] = "VIDIOC_S_PARM",
333 [_IOC_NR(VIDIOC_G_STD)] = "VIDIOC_G_STD",
334 [_IOC_NR(VIDIOC_S_STD)] = "VIDIOC_S_STD",
335 [_IOC_NR(VIDIOC_ENUMSTD)] = "VIDIOC_ENUMSTD",
336 [_IOC_NR(VIDIOC_ENUMINPUT)] = "VIDIOC_ENUMINPUT",
337 [_IOC_NR(VIDIOC_G_CTRL)] = "VIDIOC_G_CTRL",
338 [_IOC_NR(VIDIOC_S_CTRL)] = "VIDIOC_S_CTRL",
339 [_IOC_NR(VIDIOC_G_TUNER)] = "VIDIOC_G_TUNER",
340 [_IOC_NR(VIDIOC_S_TUNER)] = "VIDIOC_S_TUNER",
341 [_IOC_NR(VIDIOC_G_AUDIO)] = "VIDIOC_G_AUDIO",
342 [_IOC_NR(VIDIOC_S_AUDIO)] = "VIDIOC_S_AUDIO",
343 [_IOC_NR(VIDIOC_QUERYCTRL)] = "VIDIOC_QUERYCTRL",
344 [_IOC_NR(VIDIOC_QUERYMENU)] = "VIDIOC_QUERYMENU",
345 [_IOC_NR(VIDIOC_G_INPUT)] = "VIDIOC_G_INPUT",
346 [_IOC_NR(VIDIOC_S_INPUT)] = "VIDIOC_S_INPUT",
347 [_IOC_NR(VIDIOC_G_OUTPUT)] = "VIDIOC_G_OUTPUT",
348 [_IOC_NR(VIDIOC_S_OUTPUT)] = "VIDIOC_S_OUTPUT",
349 [_IOC_NR(VIDIOC_ENUMOUTPUT)] = "VIDIOC_ENUMOUTPUT",
350 [_IOC_NR(VIDIOC_G_AUDOUT)] = "VIDIOC_G_AUDOUT",
351 [_IOC_NR(VIDIOC_S_AUDOUT)] = "VIDIOC_S_AUDOUT",
352 [_IOC_NR(VIDIOC_G_MODULATOR)] = "VIDIOC_G_MODULATOR",
353 [_IOC_NR(VIDIOC_S_MODULATOR)] = "VIDIOC_S_MODULATOR",
354 [_IOC_NR(VIDIOC_G_FREQUENCY)] = "VIDIOC_G_FREQUENCY",
355 [_IOC_NR(VIDIOC_S_FREQUENCY)] = "VIDIOC_S_FREQUENCY",
356 [_IOC_NR(VIDIOC_CROPCAP)] = "VIDIOC_CROPCAP",
357 [_IOC_NR(VIDIOC_G_CROP)] = "VIDIOC_G_CROP",
358 [_IOC_NR(VIDIOC_S_CROP)] = "VIDIOC_S_CROP",
359 [_IOC_NR(VIDIOC_G_JPEGCOMP)] = "VIDIOC_G_JPEGCOMP",
360 [_IOC_NR(VIDIOC_S_JPEGCOMP)] = "VIDIOC_S_JPEGCOMP",
361 [_IOC_NR(VIDIOC_QUERYSTD)] = "VIDIOC_QUERYSTD",
362 [_IOC_NR(VIDIOC_TRY_FMT)] = "VIDIOC_TRY_FMT",
363 [_IOC_NR(VIDIOC_ENUMAUDIO)] = "VIDIOC_ENUMAUDIO",
364 [_IOC_NR(VIDIOC_ENUMAUDOUT)] = "VIDIOC_ENUMAUDOUT",
365 [_IOC_NR(VIDIOC_G_PRIORITY)] = "VIDIOC_G_PRIORITY",
366 [_IOC_NR(VIDIOC_S_PRIORITY)] = "VIDIOC_S_PRIORITY",
367 #if 1
368 [_IOC_NR(VIDIOC_G_SLICED_VBI_CAP)] = "VIDIOC_G_SLICED_VBI_CAP",
369 #endif
370 [_IOC_NR(VIDIOC_LOG_STATUS)] = "VIDIOC_LOG_STATUS",
371 [_IOC_NR(VIDIOC_G_EXT_CTRLS)] = "VIDIOC_G_EXT_CTRLS",
372 [_IOC_NR(VIDIOC_S_EXT_CTRLS)] = "VIDIOC_S_EXT_CTRLS",
373 [_IOC_NR(VIDIOC_TRY_EXT_CTRLS)] = "VIDIOC_TRY_EXT_CTRLS"
375 #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
377 static const char *v4l2_int_ioctls[] = {
378 #ifdef CONFIG_VIDEO_V4L1_COMPAT
379 [_IOC_NR(DECODER_GET_CAPABILITIES)] = "DECODER_GET_CAPABILITIES",
380 [_IOC_NR(DECODER_GET_STATUS)] = "DECODER_GET_STATUS",
381 [_IOC_NR(DECODER_SET_NORM)] = "DECODER_SET_NORM",
382 [_IOC_NR(DECODER_SET_INPUT)] = "DECODER_SET_INPUT",
383 [_IOC_NR(DECODER_SET_OUTPUT)] = "DECODER_SET_OUTPUT",
384 [_IOC_NR(DECODER_ENABLE_OUTPUT)] = "DECODER_ENABLE_OUTPUT",
385 [_IOC_NR(DECODER_SET_PICTURE)] = "DECODER_SET_PICTURE",
386 [_IOC_NR(DECODER_SET_GPIO)] = "DECODER_SET_GPIO",
387 [_IOC_NR(DECODER_INIT)] = "DECODER_INIT",
388 [_IOC_NR(DECODER_SET_VBI_BYPASS)] = "DECODER_SET_VBI_BYPASS",
389 [_IOC_NR(DECODER_DUMP)] = "DECODER_DUMP",
390 #endif
391 [_IOC_NR(AUDC_SET_RADIO)] = "AUDC_SET_RADIO",
393 [_IOC_NR(TUNER_SET_TYPE_ADDR)] = "TUNER_SET_TYPE_ADDR",
394 [_IOC_NR(TUNER_SET_STANDBY)] = "TUNER_SET_STANDBY",
395 [_IOC_NR(TDA9887_SET_CONFIG)] = "TDA9887_SET_CONFIG",
397 [_IOC_NR(VIDIOC_INT_S_TUNER_MODE)] = "VIDIOC_INT_S_TUNER_MODE",
398 [_IOC_NR(VIDIOC_INT_S_REGISTER)] = "VIDIOC_INT_S_REGISTER",
399 [_IOC_NR(VIDIOC_INT_G_REGISTER)] = "VIDIOC_INT_G_REGISTER",
400 [_IOC_NR(VIDIOC_INT_RESET)] = "VIDIOC_INT_RESET",
401 [_IOC_NR(VIDIOC_INT_AUDIO_CLOCK_FREQ)] = "VIDIOC_INT_AUDIO_CLOCK_FREQ",
402 [_IOC_NR(VIDIOC_INT_DECODE_VBI_LINE)] = "VIDIOC_INT_DECODE_VBI_LINE",
403 [_IOC_NR(VIDIOC_INT_S_VBI_DATA)] = "VIDIOC_INT_S_VBI_DATA",
404 [_IOC_NR(VIDIOC_INT_G_VBI_DATA)] = "VIDIOC_INT_G_VBI_DATA",
405 [_IOC_NR(VIDIOC_INT_G_CHIP_IDENT)] = "VIDIOC_INT_G_CHIP_IDENT",
406 [_IOC_NR(VIDIOC_INT_I2S_CLOCK_FREQ)] = "VIDIOC_INT_I2S_CLOCK_FREQ",
407 [_IOC_NR(VIDIOC_INT_S_STANDBY)] = "VIDIOC_INT_S_STANDBY",
408 [_IOC_NR(VIDIOC_INT_S_AUDIO_ROUTING)] = "VIDIOC_INT_S_AUDIO_ROUTING",
409 [_IOC_NR(VIDIOC_INT_G_AUDIO_ROUTING)] = "VIDIOC_INT_G_AUDIO_ROUTING",
410 [_IOC_NR(VIDIOC_INT_S_VIDEO_ROUTING)] = "VIDIOC_INT_S_VIDEO_ROUTING",
411 [_IOC_NR(VIDIOC_INT_G_VIDEO_ROUTING)] = "VIDIOC_INT_G_VIDEO_ROUTING",
412 [_IOC_NR(VIDIOC_INT_S_CRYSTAL_FREQ)] = "VIDIOC_INT_S_CRYSTAL_FREQ"
414 #define V4L2_INT_IOCTLS ARRAY_SIZE(v4l2_int_ioctls)
416 static void v4l_print_pix_fmt (char *s, struct v4l2_pix_format *fmt)
418 printk ("%s: width=%d, height=%d, format=%d, field=%s, "
419 "bytesperline=%d sizeimage=%d, colorspace=%d\n", s,
420 fmt->width,fmt->height,fmt->pixelformat,
421 prt_names(fmt->field,v4l2_field_names),
422 fmt->bytesperline,fmt->sizeimage,fmt->colorspace);
425 /* Common ioctl debug function. This function can be used by
426 external ioctl messages as well as internal V4L ioctl */
427 void v4l_printk_ioctl(unsigned int cmd)
429 char *dir;
431 switch (_IOC_DIR(cmd)) {
432 case _IOC_NONE: dir = "--"; break;
433 case _IOC_READ: dir = "r-"; break;
434 case _IOC_WRITE: dir = "-w"; break;
435 case _IOC_READ | _IOC_WRITE: dir = "rw"; break;
436 default: dir = "*ERR*"; break;
438 switch (_IOC_TYPE(cmd)) {
439 case 'd':
440 printk("v4l2_int ioctl %s, dir=%s (0x%08x)\n",
441 (_IOC_NR(cmd) < V4L2_INT_IOCTLS) ?
442 v4l2_int_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd);
443 break;
444 #ifdef CONFIG_VIDEO_V4L1_COMPAT
445 case 'v':
446 printk("v4l1 ioctl %s, dir=%s (0x%08x)\n",
447 (_IOC_NR(cmd) < V4L1_IOCTLS) ?
448 v4l1_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd);
449 break;
450 #endif
451 case 'V':
452 printk("v4l2 ioctl %s, dir=%s (0x%08x)\n",
453 (_IOC_NR(cmd) < V4L2_IOCTLS) ?
454 v4l2_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd);
455 break;
457 default:
458 printk("unknown ioctl '%c', dir=%s, #%d (0x%08x)\n",
459 _IOC_TYPE(cmd), dir, _IOC_NR(cmd), cmd);
463 /* Common ioctl debug function. This function can be used by
464 external ioctl messages as well as internal V4L ioctl and its
465 arguments */
466 void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg)
468 printk(s);
469 printk(": ");
470 v4l_printk_ioctl(cmd);
471 switch (cmd) {
472 case VIDIOC_INT_G_CHIP_IDENT:
474 enum v4l2_chip_ident *p=arg;
475 printk ("%s: chip ident=%d\n", s, *p);
476 break;
478 case VIDIOC_G_PRIORITY:
479 case VIDIOC_S_PRIORITY:
481 enum v4l2_priority *p=arg;
482 printk ("%s: priority=%d\n", s, *p);
483 break;
485 case VIDIOC_INT_S_TUNER_MODE:
487 enum v4l2_tuner_type *p=arg;
488 printk ("%s: tuner type=%d\n", s, *p);
489 break;
491 #ifdef CONFIG_VIDEO_V4L1_COMPAT
492 case DECODER_SET_VBI_BYPASS:
493 case DECODER_ENABLE_OUTPUT:
494 case DECODER_GET_STATUS:
495 case DECODER_SET_OUTPUT:
496 case DECODER_SET_INPUT:
497 case DECODER_SET_GPIO:
498 case DECODER_SET_NORM:
499 case VIDIOCCAPTURE:
500 case VIDIOCSYNC:
501 case VIDIOCSWRITEMODE:
502 #endif
503 case TUNER_SET_TYPE_ADDR:
504 case TUNER_SET_STANDBY:
505 case TDA9887_SET_CONFIG:
506 #ifdef __OLD_VIDIOC_
507 case VIDIOC_OVERLAY_OLD:
508 #endif
509 case VIDIOC_STREAMOFF:
510 case VIDIOC_G_OUTPUT:
511 case VIDIOC_S_OUTPUT:
512 case VIDIOC_STREAMON:
513 case VIDIOC_G_INPUT:
514 case VIDIOC_OVERLAY:
515 case VIDIOC_S_INPUT:
517 int *p=arg;
518 printk ("%s: value=%d\n", s, *p);
519 break;
521 case VIDIOC_G_AUDIO:
522 case VIDIOC_S_AUDIO:
523 case VIDIOC_ENUMAUDIO:
524 #ifdef __OLD_VIDIOC_
525 case VIDIOC_G_AUDIO_OLD:
526 #endif
528 struct v4l2_audio *p=arg;
530 printk ("%s: index=%d, name=%s, capability=%d, mode=%d\n",
531 s,p->index, p->name,p->capability, p->mode);
532 break;
534 case VIDIOC_G_AUDOUT:
535 case VIDIOC_S_AUDOUT:
536 case VIDIOC_ENUMAUDOUT:
537 #ifdef __OLD_VIDIOC_
538 case VIDIOC_G_AUDOUT_OLD:
539 #endif
541 struct v4l2_audioout *p=arg;
542 printk ("%s: index=%d, name=%s, capability=%d, mode=%d\n", s,
543 p->index, p->name, p->capability,p->mode);
544 break;
546 case VIDIOC_QBUF:
547 case VIDIOC_DQBUF:
548 case VIDIOC_QUERYBUF:
550 struct v4l2_buffer *p=arg;
551 struct v4l2_timecode *tc=&p->timecode;
552 printk ("%s: %02ld:%02d:%02d.%08ld index=%d, type=%s, "
553 "bytesused=%d, flags=0x%08x, "
554 "field=%0d, sequence=%d, memory=%s, offset/userptr=0x%08lx\n",
556 (p->timestamp.tv_sec/3600),
557 (int)(p->timestamp.tv_sec/60)%60,
558 (int)(p->timestamp.tv_sec%60),
559 p->timestamp.tv_usec,
560 p->index,
561 prt_names(p->type,v4l2_type_names),
562 p->bytesused,p->flags,
563 p->field,p->sequence,
564 prt_names(p->memory,v4l2_memory_names),
565 p->m.userptr);
566 printk ("%s: timecode= %02d:%02d:%02d type=%d, "
567 "flags=0x%08x, frames=%d, userbits=0x%08x\n",
568 s,tc->hours,tc->minutes,tc->seconds,
569 tc->type, tc->flags, tc->frames, *(__u32 *) tc->userbits);
570 break;
572 case VIDIOC_QUERYCAP:
574 struct v4l2_capability *p=arg;
575 printk ("%s: driver=%s, card=%s, bus=%s, version=0x%08x, "
576 "capabilities=0x%08x\n", s,
577 p->driver,p->card,p->bus_info,
578 p->version,
579 p->capabilities);
580 break;
582 case VIDIOC_G_CTRL:
583 case VIDIOC_S_CTRL:
584 #ifdef __OLD_VIDIOC_
585 case VIDIOC_S_CTRL_OLD:
586 #endif
588 struct v4l2_control *p=arg;
589 printk ("%s: id=%d, value=%d\n", s, p->id, p->value);
590 break;
592 case VIDIOC_G_EXT_CTRLS:
593 case VIDIOC_S_EXT_CTRLS:
594 case VIDIOC_TRY_EXT_CTRLS:
596 struct v4l2_ext_controls *p = arg;
597 int i;
599 printk("%s: ctrl_class=%d, count=%d\n", s, p->ctrl_class, p->count);
600 for (i = 0; i < p->count; i++) {
601 struct v4l2_ext_control *c = &p->controls[i];
602 if (cmd == VIDIOC_G_EXT_CTRLS)
603 printk("%s: id=%d\n", s, c->id);
604 else
605 printk("%s: id=%d, value=%d\n", s, c->id, c->value);
607 break;
609 case VIDIOC_G_CROP:
610 case VIDIOC_S_CROP:
612 struct v4l2_crop *p=arg;
613 /*FIXME: Should also show rect structs */
614 printk ("%s: type=%d\n", s, p->type);
615 break;
617 case VIDIOC_CROPCAP:
618 #ifdef __OLD_VIDIOC_
619 case VIDIOC_CROPCAP_OLD:
620 #endif
622 struct v4l2_cropcap *p=arg;
623 /*FIXME: Should also show rect structs */
624 printk ("%s: type=%d\n", s, p->type);
625 break;
627 case VIDIOC_INT_DECODE_VBI_LINE:
629 struct v4l2_decode_vbi_line *p=arg;
630 printk ("%s: is_second_field=%d, ptr=0x%08lx, line=%d, "
631 "type=%d\n", s,
632 p->is_second_field,(unsigned long)p->p,p->line,p->type);
633 break;
635 case VIDIOC_ENUM_FMT:
637 struct v4l2_fmtdesc *p=arg;
638 printk ("%s: index=%d, type=%d, flags=%d, description=%s,"
639 " pixelformat=%d\n", s,
640 p->index, p->type, p->flags,p->description,
641 p->pixelformat);
643 break;
645 case VIDIOC_G_FMT:
646 case VIDIOC_S_FMT:
647 case VIDIOC_TRY_FMT:
649 struct v4l2_format *p=arg;
650 printk ("%s: type=%s\n", s,
651 prt_names(p->type,v4l2_type_names));
652 switch (p->type) {
653 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
654 v4l_print_pix_fmt (s, &p->fmt.pix);
655 break;
656 default:
657 break;
660 case VIDIOC_G_FBUF:
661 case VIDIOC_S_FBUF:
663 struct v4l2_framebuffer *p=arg;
664 printk ("%s: capability=%d, flags=%d, base=0x%08lx\n", s,
665 p->capability,p->flags, (unsigned long)p->base);
666 v4l_print_pix_fmt (s, &p->fmt);
667 break;
669 case VIDIOC_G_FREQUENCY:
670 case VIDIOC_S_FREQUENCY:
672 struct v4l2_frequency *p=arg;
673 printk ("%s: tuner=%d, type=%d, frequency=%d\n", s,
674 p->tuner,p->type,p->frequency);
675 break;
677 case VIDIOC_ENUMINPUT:
679 struct v4l2_input *p=arg;
680 printk ("%s: index=%d, name=%s, type=%d, audioset=%d, "
681 "tuner=%d, std=%Ld, status=%d\n", s,
682 p->index,p->name,p->type,p->audioset,
683 p->tuner,
684 (unsigned long long)p->std,
685 p->status);
686 break;
688 case VIDIOC_G_JPEGCOMP:
689 case VIDIOC_S_JPEGCOMP:
691 struct v4l2_jpegcompression *p=arg;
692 printk ("%s: quality=%d, APPn=%d, APP_len=%d, COM_len=%d,"
693 " jpeg_markers=%d\n", s,
694 p->quality,p->APPn,p->APP_len,
695 p->COM_len,p->jpeg_markers);
696 break;
698 case VIDIOC_G_MODULATOR:
699 case VIDIOC_S_MODULATOR:
701 struct v4l2_modulator *p=arg;
702 printk ("%s: index=%d, name=%s, capability=%d, rangelow=%d,"
703 " rangehigh=%d, txsubchans=%d\n", s,
704 p->index, p->name,p->capability,p->rangelow,
705 p->rangehigh,p->txsubchans);
706 break;
708 case VIDIOC_G_MPEGCOMP:
709 case VIDIOC_S_MPEGCOMP:
711 struct v4l2_mpeg_compression *p=arg;
712 /*FIXME: Several fields not shown */
713 printk ("%s: ts_pid_pmt=%d, ts_pid_audio=%d, ts_pid_video=%d, "
714 "ts_pid_pcr=%d, ps_size=%d, au_sample_rate=%d, "
715 "au_pesid=%c, vi_frame_rate=%d, vi_frames_per_gop=%d, "
716 "vi_bframes_count=%d, vi_pesid=%c\n", s,
717 p->ts_pid_pmt,p->ts_pid_audio, p->ts_pid_video,
718 p->ts_pid_pcr, p->ps_size, p->au_sample_rate,
719 p->au_pesid, p->vi_frame_rate,
720 p->vi_frames_per_gop, p->vi_bframes_count,
721 p->vi_pesid);
722 break;
724 case VIDIOC_ENUMOUTPUT:
726 struct v4l2_output *p=arg;
727 printk ("%s: index=%d, name=%s,type=%d, audioset=%d, "
728 "modulator=%d, std=%Ld\n",
729 s,p->index,p->name,p->type,p->audioset,
730 p->modulator,
731 (unsigned long long)p->std);
732 break;
734 case VIDIOC_QUERYCTRL:
736 struct v4l2_queryctrl *p=arg;
737 printk ("%s: id=%d, type=%d, name=%s, min/max=%d/%d,"
738 " step=%d, default=%d, flags=0x%08x\n", s,
739 p->id,p->type,p->name,p->minimum,p->maximum,
740 p->step,p->default_value,p->flags);
741 break;
743 case VIDIOC_QUERYMENU:
745 struct v4l2_querymenu *p=arg;
746 printk ("%s: id=%d, index=%d, name=%s\n", s,
747 p->id,p->index,p->name);
748 break;
750 case VIDIOC_INT_G_REGISTER:
751 case VIDIOC_INT_S_REGISTER:
753 struct v4l2_register *p=arg;
754 printk ("%s: i2c_id=%d, reg=%lu, val=%d\n", s,
755 p->i2c_id,p->reg,p->val);
757 break;
759 case VIDIOC_REQBUFS:
761 struct v4l2_requestbuffers *p=arg;
762 printk ("%s: count=%d, type=%s, memory=%s\n", s,
763 p->count,
764 prt_names(p->type,v4l2_type_names),
765 prt_names(p->memory,v4l2_memory_names));
766 break;
768 case VIDIOC_INT_S_AUDIO_ROUTING:
769 case VIDIOC_INT_S_VIDEO_ROUTING:
770 case VIDIOC_INT_G_AUDIO_ROUTING:
771 case VIDIOC_INT_G_VIDEO_ROUTING:
773 struct v4l2_routing *p=arg;
774 printk ("%s: input=0x%x, output=0x%x\n", s, p->input, p->output);
775 break;
777 case VIDIOC_INT_S_CRYSTAL_FREQ:
779 struct v4l2_crystal_freq *p=arg;
780 printk ("%s: freq=%u, flags=0x%x\n", s, p->freq, p->flags);
781 break;
783 case VIDIOC_G_SLICED_VBI_CAP:
785 struct v4l2_sliced_vbi_cap *p=arg;
786 printk ("%s: service_set=%d\n", s,
787 p->service_set);
788 break;
790 case VIDIOC_INT_S_VBI_DATA:
791 case VIDIOC_INT_G_VBI_DATA:
793 struct v4l2_sliced_vbi_data *p=arg;
794 printk ("%s: id=%d, field=%d, line=%d\n", s,
795 p->id, p->field, p->line);
796 break;
798 case VIDIOC_ENUMSTD:
800 struct v4l2_standard *p=arg;
801 printk ("%s: index=%d, id=%Ld, name=%s, fps=%d/%d, "
802 "framelines=%d\n", s, p->index,
803 (unsigned long long)p->id, p->name,
804 p->frameperiod.numerator,
805 p->frameperiod.denominator,
806 p->framelines);
808 break;
810 case VIDIOC_G_PARM:
811 case VIDIOC_S_PARM:
812 #ifdef __OLD_VIDIOC_
813 case VIDIOC_S_PARM_OLD:
814 #endif
816 struct v4l2_streamparm *p=arg;
817 printk ("%s: type=%d\n", s, p->type);
819 break;
821 case VIDIOC_G_TUNER:
822 case VIDIOC_S_TUNER:
824 struct v4l2_tuner *p=arg;
825 printk ("%s: index=%d, name=%s, type=%d, capability=%d, "
826 "rangelow=%d, rangehigh=%d, signal=%d, afc=%d, "
827 "rxsubchans=%d, audmode=%d\n", s,
828 p->index, p->name, p->type,
829 p->capability, p->rangelow,p->rangehigh,
830 p->rxsubchans, p->audmode, p->signal,
831 p->afc);
832 break;
834 #ifdef CONFIG_VIDEO_V4L1_COMPAT
835 case VIDIOCGVBIFMT:
836 case VIDIOCSVBIFMT:
838 struct vbi_format *p=arg;
839 printk ("%s: sampling_rate=%d, samples_per_line=%d, "
840 "sample_format=%d, start=%d/%d, count=%d/%d, flags=%d\n", s,
841 p->sampling_rate,p->samples_per_line,
842 p->sample_format,p->start[0],p->start[1],
843 p->count[0],p->count[1],p->flags);
844 break;
846 case VIDIOCGAUDIO:
847 case VIDIOCSAUDIO:
849 struct video_audio *p=arg;
850 printk ("%s: audio=%d, volume=%d, bass=%d, treble=%d, "
851 "flags=%d, name=%s, mode=%d, balance=%d, step=%d\n",
852 s,p->audio,p->volume,p->bass, p->treble,
853 p->flags,p->name,p->mode,p->balance,p->step);
854 break;
856 case VIDIOCGFBUF:
857 case VIDIOCSFBUF:
859 struct video_buffer *p=arg;
860 printk ("%s: base=%08lx, height=%d, width=%d, depth=%d, "
861 "bytesperline=%d\n", s,
862 (unsigned long) p->base, p->height, p->width,
863 p->depth,p->bytesperline);
864 break;
866 case VIDIOCGCAP:
868 struct video_capability *p=arg;
869 printk ("%s: name=%s, type=%d, channels=%d, audios=%d, "
870 "maxwidth=%d, maxheight=%d, minwidth=%d, minheight=%d\n",
871 s,p->name,p->type,p->channels,p->audios,
872 p->maxwidth,p->maxheight,p->minwidth,
873 p->minheight);
875 break;
877 case VIDIOCGCAPTURE:
878 case VIDIOCSCAPTURE:
880 struct video_capture *p=arg;
881 printk ("%s: x=%d, y=%d, width=%d, height=%d, decimation=%d,"
882 " flags=%d\n", s,
883 p->x, p->y,p->width, p->height,
884 p->decimation,p->flags);
885 break;
887 case VIDIOCGCHAN:
888 case VIDIOCSCHAN:
890 struct video_channel *p=arg;
891 printk ("%s: channel=%d, name=%s, tuners=%d, flags=%d, "
892 "type=%d, norm=%d\n", s,
893 p->channel,p->name,p->tuners,
894 p->flags,p->type,p->norm);
896 break;
898 case VIDIOCSMICROCODE:
900 struct video_code *p=arg;
901 printk ("%s: loadwhat=%s, datasize=%d\n", s,
902 p->loadwhat,p->datasize);
903 break;
905 case DECODER_GET_CAPABILITIES:
907 struct video_decoder_capability *p=arg;
908 printk ("%s: flags=%d, inputs=%d, outputs=%d\n", s,
909 p->flags,p->inputs,p->outputs);
910 break;
912 case DECODER_INIT:
914 struct video_decoder_init *p=arg;
915 printk ("%s: len=%c\n", s, p->len);
916 break;
918 case VIDIOCGPLAYINFO:
920 struct video_info *p=arg;
921 printk ("%s: frame_count=%d, h_size=%d, v_size=%d, "
922 "smpte_timecode=%d, picture_type=%d, "
923 "temporal_reference=%d, user_data=%s\n", s,
924 p->frame_count, p->h_size,
925 p->v_size, p->smpte_timecode,
926 p->picture_type, p->temporal_reference,
927 p->user_data);
928 break;
930 case VIDIOCKEY:
932 struct video_key *p=arg;
933 printk ("%s: key=%s, flags=%d\n", s,
934 p->key, p->flags);
935 break;
937 case VIDIOCGMBUF:
939 struct video_mbuf *p=arg;
940 printk ("%s: size=%d, frames=%d, offsets=0x%08lx\n", s,
941 p->size,
942 p->frames,
943 (unsigned long)p->offsets);
944 break;
946 case VIDIOCMCAPTURE:
948 struct video_mmap *p=arg;
949 printk ("%s: frame=%d, height=%d, width=%d, format=%d\n", s,
950 p->frame,
951 p->height, p->width,
952 p->format);
953 break;
955 case VIDIOCGPICT:
956 case VIDIOCSPICT:
957 case DECODER_SET_PICTURE:
959 struct video_picture *p=arg;
961 printk ("%s: brightness=%d, hue=%d, colour=%d, contrast=%d,"
962 " whiteness=%d, depth=%d, palette=%d\n", s,
963 p->brightness, p->hue, p->colour,
964 p->contrast, p->whiteness, p->depth,
965 p->palette);
966 break;
968 case VIDIOCSPLAYMODE:
970 struct video_play_mode *p=arg;
971 printk ("%s: mode=%d, p1=%d, p2=%d\n", s,
972 p->mode,p->p1,p->p2);
973 break;
975 case VIDIOCGTUNER:
976 case VIDIOCSTUNER:
978 struct video_tuner *p=arg;
979 printk ("%s: tuner=%d, name=%s, rangelow=%ld, rangehigh=%ld, "
980 "flags=%d, mode=%d, signal=%d\n", s,
981 p->tuner, p->name,p->rangelow, p->rangehigh,
982 p->flags,p->mode, p->signal);
983 break;
985 case VIDIOCGUNIT:
987 struct video_unit *p=arg;
988 printk ("%s: video=%d, vbi=%d, radio=%d, audio=%d, "
989 "teletext=%d\n", s,
990 p->video,p->vbi,p->radio,p->audio,p->teletext);
991 break;
993 case VIDIOCGWIN:
994 case VIDIOCSWIN:
996 struct video_window *p=arg;
997 printk ("%s: x=%d, y=%d, width=%d, height=%d, chromakey=%d,"
998 " flags=%d, clipcount=%d\n", s,
999 p->x, p->y,p->width, p->height,
1000 p->chromakey,p->flags,
1001 p->clipcount);
1002 break;
1004 case VIDIOCGFREQ:
1005 case VIDIOCSFREQ:
1007 unsigned long *p=arg;
1008 printk ("%s: value=%lu\n", s, *p);
1009 break;
1011 #endif
1012 case VIDIOC_INT_AUDIO_CLOCK_FREQ:
1013 case VIDIOC_INT_I2S_CLOCK_FREQ:
1014 case VIDIOC_INT_S_STANDBY:
1015 case VIDIOC_INT_RESET:
1017 u32 *p=arg;
1019 printk ("%s: value=%d\n", s, *p);
1020 break;
1022 case VIDIOC_G_STD:
1023 case VIDIOC_S_STD:
1024 case VIDIOC_QUERYSTD:
1026 v4l2_std_id *p=arg;
1028 printk ("%s: value=%Lu\n", s, (unsigned long long)*p);
1029 break;
1034 /* ----------------------------------------------------------------- */
1036 /* Helper functions for control handling */
1038 /* Check for correctness of the ctrl's value based on the data from
1039 struct v4l2_queryctrl and the available menu items. Note that
1040 menu_items may be NULL, in that case it is ignored. */
1041 int v4l2_ctrl_check(struct v4l2_ext_control *ctrl, struct v4l2_queryctrl *qctrl,
1042 const char **menu_items)
1044 if (qctrl->flags & V4L2_CTRL_FLAG_DISABLED)
1045 return -EINVAL;
1046 if (qctrl->flags & V4L2_CTRL_FLAG_GRABBED)
1047 return -EBUSY;
1048 if (qctrl->type == V4L2_CTRL_TYPE_BUTTON ||
1049 qctrl->type == V4L2_CTRL_TYPE_INTEGER64 ||
1050 qctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)
1051 return 0;
1052 if (ctrl->value < qctrl->minimum || ctrl->value > qctrl->maximum)
1053 return -ERANGE;
1054 if (qctrl->type == V4L2_CTRL_TYPE_MENU && menu_items != NULL) {
1055 if (menu_items[ctrl->value] == NULL ||
1056 menu_items[ctrl->value][0] == '\0')
1057 return -EINVAL;
1059 return 0;
1062 /* Returns NULL or a character pointer array containing the menu for
1063 the given control ID. The pointer array ends with a NULL pointer.
1064 An empty string signifies a menu entry that is invalid. This allows
1065 drivers to disable certain options if it is not supported. */
1066 const char **v4l2_ctrl_get_menu(u32 id)
1068 static const char *mpeg_audio_sampling_freq[] = {
1069 "44.1 kHz",
1070 "48 kHz",
1071 "32 kHz",
1072 NULL
1074 static const char *mpeg_audio_encoding[] = {
1075 "Layer I",
1076 "Layer II",
1077 "Layer III",
1078 NULL
1080 static const char *mpeg_audio_l1_bitrate[] = {
1081 "32 kbps",
1082 "64 kbps",
1083 "96 kbps",
1084 "128 kbps",
1085 "160 kbps",
1086 "192 kbps",
1087 "224 kbps",
1088 "256 kbps",
1089 "288 kbps",
1090 "320 kbps",
1091 "352 kbps",
1092 "384 kbps",
1093 "416 kbps",
1094 "448 kbps",
1095 NULL
1097 static const char *mpeg_audio_l2_bitrate[] = {
1098 "32 kbps",
1099 "48 kbps",
1100 "56 kbps",
1101 "64 kbps",
1102 "80 kbps",
1103 "96 kbps",
1104 "112 kbps",
1105 "128 kbps",
1106 "160 kbps",
1107 "192 kbps",
1108 "224 kbps",
1109 "256 kbps",
1110 "320 kbps",
1111 "384 kbps",
1112 NULL
1114 static const char *mpeg_audio_l3_bitrate[] = {
1115 "32 kbps",
1116 "40 kbps",
1117 "48 kbps",
1118 "56 kbps",
1119 "64 kbps",
1120 "80 kbps",
1121 "96 kbps",
1122 "112 kbps",
1123 "128 kbps",
1124 "160 kbps",
1125 "192 kbps",
1126 "224 kbps",
1127 "256 kbps",
1128 "320 kbps",
1129 NULL
1131 static const char *mpeg_audio_mode[] = {
1132 "Stereo",
1133 "Joint Stereo",
1134 "Dual",
1135 "Mono",
1136 NULL
1138 static const char *mpeg_audio_mode_extension[] = {
1139 "Bound 4",
1140 "Bound 8",
1141 "Bound 12",
1142 "Bound 16",
1143 NULL
1145 static const char *mpeg_audio_emphasis[] = {
1146 "No Emphasis",
1147 "50/15 us",
1148 "CCITT J17",
1149 NULL
1151 static const char *mpeg_audio_crc[] = {
1152 "No CRC",
1153 "16-bit CRC",
1154 NULL
1156 static const char *mpeg_video_encoding[] = {
1157 "MPEG-1",
1158 "MPEG-2",
1159 NULL
1161 static const char *mpeg_video_aspect[] = {
1162 "1x1",
1163 "4x3",
1164 "16x9",
1165 "2.21x1",
1166 NULL
1168 static const char *mpeg_video_bitrate_mode[] = {
1169 "Variable Bitrate",
1170 "Constant Bitrate",
1171 NULL
1173 static const char *mpeg_stream_type[] = {
1174 "MPEG-2 Program Stream",
1175 "MPEG-2 Transport Stream",
1176 "MPEG-1 System Stream",
1177 "MPEG-2 DVD-compatible Stream",
1178 "MPEG-1 VCD-compatible Stream",
1179 "MPEG-2 SVCD-compatible Stream",
1180 NULL
1182 static const char *mpeg_stream_vbi_fmt[] = {
1183 "No VBI",
1184 "Private packet, IVTV format",
1185 NULL
1188 switch (id) {
1189 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
1190 return mpeg_audio_sampling_freq;
1191 case V4L2_CID_MPEG_AUDIO_ENCODING:
1192 return mpeg_audio_encoding;
1193 case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
1194 return mpeg_audio_l1_bitrate;
1195 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
1196 return mpeg_audio_l2_bitrate;
1197 case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
1198 return mpeg_audio_l3_bitrate;
1199 case V4L2_CID_MPEG_AUDIO_MODE:
1200 return mpeg_audio_mode;
1201 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
1202 return mpeg_audio_mode_extension;
1203 case V4L2_CID_MPEG_AUDIO_EMPHASIS:
1204 return mpeg_audio_emphasis;
1205 case V4L2_CID_MPEG_AUDIO_CRC:
1206 return mpeg_audio_crc;
1207 case V4L2_CID_MPEG_VIDEO_ENCODING:
1208 return mpeg_video_encoding;
1209 case V4L2_CID_MPEG_VIDEO_ASPECT:
1210 return mpeg_video_aspect;
1211 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
1212 return mpeg_video_bitrate_mode;
1213 case V4L2_CID_MPEG_STREAM_TYPE:
1214 return mpeg_stream_type;
1215 case V4L2_CID_MPEG_STREAM_VBI_FMT:
1216 return mpeg_stream_vbi_fmt;
1217 default:
1218 return NULL;
1222 /* Fill in a struct v4l2_queryctrl */
1223 int v4l2_ctrl_query_fill(struct v4l2_queryctrl *qctrl, s32 min, s32 max, s32 step, s32 def)
1225 const char *name;
1227 qctrl->flags = 0;
1228 switch (qctrl->id) {
1229 /* USER controls */
1230 case V4L2_CID_USER_CLASS: name = "User Controls"; break;
1231 case V4L2_CID_AUDIO_VOLUME: name = "Volume"; break;
1232 case V4L2_CID_AUDIO_MUTE: name = "Mute"; break;
1233 case V4L2_CID_AUDIO_BALANCE: name = "Balance"; break;
1234 case V4L2_CID_AUDIO_BASS: name = "Bass"; break;
1235 case V4L2_CID_AUDIO_TREBLE: name = "Treble"; break;
1236 case V4L2_CID_AUDIO_LOUDNESS: name = "Loudness"; break;
1237 case V4L2_CID_BRIGHTNESS: name = "Brightness"; break;
1238 case V4L2_CID_CONTRAST: name = "Contrast"; break;
1239 case V4L2_CID_SATURATION: name = "Saturation"; break;
1240 case V4L2_CID_HUE: name = "Hue"; break;
1242 /* MPEG controls */
1243 case V4L2_CID_MPEG_CLASS: name = "MPEG Encoder Controls"; break;
1244 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ: name = "Audio Sampling Frequency"; break;
1245 case V4L2_CID_MPEG_AUDIO_ENCODING: name = "Audio Encoding Layer"; break;
1246 case V4L2_CID_MPEG_AUDIO_L1_BITRATE: name = "Audio Layer I Bitrate"; break;
1247 case V4L2_CID_MPEG_AUDIO_L2_BITRATE: name = "Audio Layer II Bitrate"; break;
1248 case V4L2_CID_MPEG_AUDIO_L3_BITRATE: name = "Audio Layer III Bitrate"; break;
1249 case V4L2_CID_MPEG_AUDIO_MODE: name = "Audio Stereo Mode"; break;
1250 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION: name = "Audio Stereo Mode Extension"; break;
1251 case V4L2_CID_MPEG_AUDIO_EMPHASIS: name = "Audio Emphasis"; break;
1252 case V4L2_CID_MPEG_AUDIO_CRC: name = "Audio CRC"; break;
1253 case V4L2_CID_MPEG_VIDEO_ENCODING: name = "Video Encoding"; break;
1254 case V4L2_CID_MPEG_VIDEO_ASPECT: name = "Video Aspect"; break;
1255 case V4L2_CID_MPEG_VIDEO_B_FRAMES: name = "Video B Frames"; break;
1256 case V4L2_CID_MPEG_VIDEO_GOP_SIZE: name = "Video GOP Size"; break;
1257 case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE: name = "Video GOP Closure"; break;
1258 case V4L2_CID_MPEG_VIDEO_PULLDOWN: name = "Video Pulldown"; break;
1259 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: name = "Video Bitrate Mode"; break;
1260 case V4L2_CID_MPEG_VIDEO_BITRATE: name = "Video Bitrate"; break;
1261 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK: name = "Video Peak Bitrate"; break;
1262 case V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION: name = "Video Temporal Decimation"; break;
1263 case V4L2_CID_MPEG_STREAM_TYPE: name = "Stream Type"; break;
1264 case V4L2_CID_MPEG_STREAM_PID_PMT: name = "Stream PMT Program ID"; break;
1265 case V4L2_CID_MPEG_STREAM_PID_AUDIO: name = "Stream Audio Program ID"; break;
1266 case V4L2_CID_MPEG_STREAM_PID_VIDEO: name = "Stream Video Program ID"; break;
1267 case V4L2_CID_MPEG_STREAM_PID_PCR: name = "Stream PCR Program ID"; break;
1268 case V4L2_CID_MPEG_STREAM_PES_ID_AUDIO: name = "Stream PES Audio ID"; break;
1269 case V4L2_CID_MPEG_STREAM_PES_ID_VIDEO: name = "Stream PES Video ID"; break;
1270 case V4L2_CID_MPEG_STREAM_VBI_FMT: name = "Stream VBI Format"; break;
1272 default:
1273 return -EINVAL;
1275 switch (qctrl->id) {
1276 case V4L2_CID_AUDIO_MUTE:
1277 case V4L2_CID_AUDIO_LOUDNESS:
1278 case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:
1279 case V4L2_CID_MPEG_VIDEO_PULLDOWN:
1280 qctrl->type = V4L2_CTRL_TYPE_BOOLEAN;
1281 min = 0;
1282 max = step = 1;
1283 break;
1284 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
1285 case V4L2_CID_MPEG_AUDIO_ENCODING:
1286 case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
1287 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
1288 case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
1289 case V4L2_CID_MPEG_AUDIO_MODE:
1290 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
1291 case V4L2_CID_MPEG_AUDIO_EMPHASIS:
1292 case V4L2_CID_MPEG_AUDIO_CRC:
1293 case V4L2_CID_MPEG_VIDEO_ENCODING:
1294 case V4L2_CID_MPEG_VIDEO_ASPECT:
1295 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
1296 case V4L2_CID_MPEG_STREAM_TYPE:
1297 case V4L2_CID_MPEG_STREAM_VBI_FMT:
1298 qctrl->type = V4L2_CTRL_TYPE_MENU;
1299 step = 1;
1300 break;
1301 case V4L2_CID_USER_CLASS:
1302 case V4L2_CID_MPEG_CLASS:
1303 qctrl->type = V4L2_CTRL_TYPE_CTRL_CLASS;
1304 qctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1305 min = max = step = def = 0;
1306 break;
1307 default:
1308 qctrl->type = V4L2_CTRL_TYPE_INTEGER;
1309 break;
1311 switch (qctrl->id) {
1312 case V4L2_CID_MPEG_AUDIO_ENCODING:
1313 case V4L2_CID_MPEG_AUDIO_MODE:
1314 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
1315 case V4L2_CID_MPEG_VIDEO_B_FRAMES:
1316 case V4L2_CID_MPEG_STREAM_TYPE:
1317 qctrl->flags |= V4L2_CTRL_FLAG_UPDATE;
1318 break;
1319 case V4L2_CID_AUDIO_VOLUME:
1320 case V4L2_CID_AUDIO_BALANCE:
1321 case V4L2_CID_AUDIO_BASS:
1322 case V4L2_CID_AUDIO_TREBLE:
1323 case V4L2_CID_BRIGHTNESS:
1324 case V4L2_CID_CONTRAST:
1325 case V4L2_CID_SATURATION:
1326 case V4L2_CID_HUE:
1327 qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
1328 break;
1330 qctrl->minimum = min;
1331 qctrl->maximum = max;
1332 qctrl->step = step;
1333 qctrl->default_value = def;
1334 qctrl->reserved[0] = qctrl->reserved[1] = 0;
1335 snprintf(qctrl->name, sizeof(qctrl->name), name);
1336 return 0;
1339 /* Fill in a struct v4l2_queryctrl with standard values based on
1340 the control ID. */
1341 int v4l2_ctrl_query_fill_std(struct v4l2_queryctrl *qctrl)
1343 switch (qctrl->id) {
1344 /* USER controls */
1345 case V4L2_CID_USER_CLASS:
1346 case V4L2_CID_MPEG_CLASS:
1347 return v4l2_ctrl_query_fill(qctrl, 0, 0, 0, 0);
1348 case V4L2_CID_AUDIO_VOLUME:
1349 return v4l2_ctrl_query_fill(qctrl, 0, 65535, 65535 / 100, 58880);
1350 case V4L2_CID_AUDIO_MUTE:
1351 case V4L2_CID_AUDIO_LOUDNESS:
1352 return v4l2_ctrl_query_fill(qctrl, 0, 1, 1, 0);
1353 case V4L2_CID_AUDIO_BALANCE:
1354 case V4L2_CID_AUDIO_BASS:
1355 case V4L2_CID_AUDIO_TREBLE:
1356 return v4l2_ctrl_query_fill(qctrl, 0, 65535, 65535 / 100, 32768);
1357 case V4L2_CID_BRIGHTNESS:
1358 return v4l2_ctrl_query_fill(qctrl, 0, 255, 1, 128);
1359 case V4L2_CID_CONTRAST:
1360 case V4L2_CID_SATURATION:
1361 return v4l2_ctrl_query_fill(qctrl, 0, 127, 1, 64);
1362 case V4L2_CID_HUE:
1363 return v4l2_ctrl_query_fill(qctrl, -128, 127, 1, 0);
1365 /* MPEG controls */
1366 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
1367 return v4l2_ctrl_query_fill(qctrl,
1368 V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100,
1369 V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000, 1,
1370 V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000);
1371 case V4L2_CID_MPEG_AUDIO_ENCODING:
1372 return v4l2_ctrl_query_fill(qctrl,
1373 V4L2_MPEG_AUDIO_ENCODING_LAYER_1,
1374 V4L2_MPEG_AUDIO_ENCODING_LAYER_3, 1,
1375 V4L2_MPEG_AUDIO_ENCODING_LAYER_2);
1376 case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
1377 return v4l2_ctrl_query_fill(qctrl,
1378 V4L2_MPEG_AUDIO_L1_BITRATE_32K,
1379 V4L2_MPEG_AUDIO_L1_BITRATE_448K, 1,
1380 V4L2_MPEG_AUDIO_L1_BITRATE_256K);
1381 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
1382 return v4l2_ctrl_query_fill(qctrl,
1383 V4L2_MPEG_AUDIO_L2_BITRATE_32K,
1384 V4L2_MPEG_AUDIO_L2_BITRATE_384K, 1,
1385 V4L2_MPEG_AUDIO_L2_BITRATE_224K);
1386 case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
1387 return v4l2_ctrl_query_fill(qctrl,
1388 V4L2_MPEG_AUDIO_L3_BITRATE_32K,
1389 V4L2_MPEG_AUDIO_L3_BITRATE_320K, 1,
1390 V4L2_MPEG_AUDIO_L3_BITRATE_192K);
1391 case V4L2_CID_MPEG_AUDIO_MODE:
1392 return v4l2_ctrl_query_fill(qctrl,
1393 V4L2_MPEG_AUDIO_MODE_STEREO,
1394 V4L2_MPEG_AUDIO_MODE_MONO, 1,
1395 V4L2_MPEG_AUDIO_MODE_STEREO);
1396 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
1397 return v4l2_ctrl_query_fill(qctrl,
1398 V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_4,
1399 V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_16, 1,
1400 V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_4);
1401 case V4L2_CID_MPEG_AUDIO_EMPHASIS:
1402 return v4l2_ctrl_query_fill(qctrl,
1403 V4L2_MPEG_AUDIO_EMPHASIS_NONE,
1404 V4L2_MPEG_AUDIO_EMPHASIS_CCITT_J17, 1,
1405 V4L2_MPEG_AUDIO_EMPHASIS_NONE);
1406 case V4L2_CID_MPEG_AUDIO_CRC:
1407 return v4l2_ctrl_query_fill(qctrl,
1408 V4L2_MPEG_AUDIO_CRC_NONE,
1409 V4L2_MPEG_AUDIO_CRC_CRC16, 1,
1410 V4L2_MPEG_AUDIO_CRC_NONE);
1411 case V4L2_CID_MPEG_VIDEO_ENCODING:
1412 return v4l2_ctrl_query_fill(qctrl,
1413 V4L2_MPEG_VIDEO_ENCODING_MPEG_1,
1414 V4L2_MPEG_VIDEO_ENCODING_MPEG_2, 1,
1415 V4L2_MPEG_VIDEO_ENCODING_MPEG_2);
1416 case V4L2_CID_MPEG_VIDEO_ASPECT:
1417 return v4l2_ctrl_query_fill(qctrl,
1418 V4L2_MPEG_VIDEO_ASPECT_1x1,
1419 V4L2_MPEG_VIDEO_ASPECT_221x100, 1,
1420 V4L2_MPEG_VIDEO_ASPECT_4x3);
1421 case V4L2_CID_MPEG_VIDEO_B_FRAMES:
1422 return v4l2_ctrl_query_fill(qctrl, 0, 33, 1, 2);
1423 case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
1424 return v4l2_ctrl_query_fill(qctrl, 1, 34, 1, 12);
1425 case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:
1426 return v4l2_ctrl_query_fill(qctrl, 0, 1, 1, 1);
1427 case V4L2_CID_MPEG_VIDEO_PULLDOWN:
1428 return v4l2_ctrl_query_fill(qctrl, 0, 1, 1, 0);
1429 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
1430 return v4l2_ctrl_query_fill(qctrl,
1431 V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
1432 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, 1,
1433 V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
1434 case V4L2_CID_MPEG_VIDEO_BITRATE:
1435 return v4l2_ctrl_query_fill(qctrl, 0, 27000000, 1, 6000000);
1436 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
1437 return v4l2_ctrl_query_fill(qctrl, 0, 27000000, 1, 8000000);
1438 case V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION:
1439 return v4l2_ctrl_query_fill(qctrl, 0, 255, 1, 0);
1440 case V4L2_CID_MPEG_STREAM_TYPE:
1441 return v4l2_ctrl_query_fill(qctrl,
1442 V4L2_MPEG_STREAM_TYPE_MPEG2_PS,
1443 V4L2_MPEG_STREAM_TYPE_MPEG2_SVCD, 1,
1444 V4L2_MPEG_STREAM_TYPE_MPEG2_PS);
1445 case V4L2_CID_MPEG_STREAM_PID_PMT:
1446 return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 16);
1447 case V4L2_CID_MPEG_STREAM_PID_AUDIO:
1448 return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 260);
1449 case V4L2_CID_MPEG_STREAM_PID_VIDEO:
1450 return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 256);
1451 case V4L2_CID_MPEG_STREAM_PID_PCR:
1452 return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 259);
1453 case V4L2_CID_MPEG_STREAM_PES_ID_AUDIO:
1454 return v4l2_ctrl_query_fill(qctrl, 0, 255, 1, 0);
1455 case V4L2_CID_MPEG_STREAM_PES_ID_VIDEO:
1456 return v4l2_ctrl_query_fill(qctrl, 0, 255, 1, 0);
1457 case V4L2_CID_MPEG_STREAM_VBI_FMT:
1458 return v4l2_ctrl_query_fill(qctrl,
1459 V4L2_MPEG_STREAM_VBI_FMT_NONE,
1460 V4L2_MPEG_STREAM_VBI_FMT_IVTV, 1,
1461 V4L2_MPEG_STREAM_VBI_FMT_NONE);
1462 default:
1463 return -EINVAL;
1467 /* Fill in a struct v4l2_querymenu based on the struct v4l2_queryctrl and
1468 the menu. The qctrl pointer may be NULL, in which case it is ignored. */
1469 int v4l2_ctrl_query_menu(struct v4l2_querymenu *qmenu, struct v4l2_queryctrl *qctrl,
1470 const char **menu_items)
1472 int i;
1474 if (menu_items == NULL ||
1475 (qctrl && (qmenu->index < qctrl->minimum || qmenu->index > qctrl->maximum)))
1476 return -EINVAL;
1477 for (i = 0; i < qmenu->index && menu_items[i]; i++) ;
1478 if (menu_items[i] == NULL || menu_items[i][0] == '\0')
1479 return -EINVAL;
1480 snprintf(qmenu->name, sizeof(qmenu->name), menu_items[qmenu->index]);
1481 qmenu->reserved = 0;
1482 return 0;
1485 /* ctrl_classes points to an array of u32 pointers, the last element is
1486 a NULL pointer. Each u32 array is a 0-terminated array of control IDs.
1487 Each array must be sorted low to high and belong to the same control
1488 class. The array of u32 pointer must also be sorted, from low class IDs
1489 to high class IDs.
1491 This function returns the first ID that follows after the given ID.
1492 When no more controls are available 0 is returned. */
1493 u32 v4l2_ctrl_next(const u32 * const * ctrl_classes, u32 id)
1495 u32 ctrl_class;
1496 const u32 *pctrl;
1498 /* if no query is desired, then just return the control ID */
1499 if ((id & V4L2_CTRL_FLAG_NEXT_CTRL) == 0)
1500 return id;
1501 if (ctrl_classes == NULL)
1502 return 0;
1503 id &= V4L2_CTRL_ID_MASK;
1504 ctrl_class = V4L2_CTRL_ID2CLASS(id);
1505 id++; /* select next control */
1506 /* find first class that matches (or is greater than) the class of
1507 the ID */
1508 while (*ctrl_classes && V4L2_CTRL_ID2CLASS(**ctrl_classes) < ctrl_class)
1509 ctrl_classes++;
1510 /* no more classes */
1511 if (*ctrl_classes == NULL)
1512 return 0;
1513 pctrl = *ctrl_classes;
1514 /* find first ctrl within the class that is >= ID */
1515 while (*pctrl && *pctrl < id) pctrl++;
1516 if (*pctrl)
1517 return *pctrl;
1518 /* we are at the end of the controls of the current class. */
1519 /* continue with next class if available */
1520 ctrl_classes++;
1521 if (*ctrl_classes == NULL)
1522 return 0;
1523 return **ctrl_classes;
1526 /* ----------------------------------------------------------------- */
1528 EXPORT_SYMBOL(v4l2_norm_to_name);
1529 EXPORT_SYMBOL(v4l2_video_std_construct);
1531 EXPORT_SYMBOL(v4l2_prio_init);
1532 EXPORT_SYMBOL(v4l2_prio_change);
1533 EXPORT_SYMBOL(v4l2_prio_open);
1534 EXPORT_SYMBOL(v4l2_prio_close);
1535 EXPORT_SYMBOL(v4l2_prio_max);
1536 EXPORT_SYMBOL(v4l2_prio_check);
1538 EXPORT_SYMBOL(v4l2_field_names);
1539 EXPORT_SYMBOL(v4l2_type_names);
1540 EXPORT_SYMBOL(v4l_printk_ioctl);
1541 EXPORT_SYMBOL(v4l_printk_ioctl_arg);
1543 EXPORT_SYMBOL(v4l2_ctrl_next);
1544 EXPORT_SYMBOL(v4l2_ctrl_check);
1545 EXPORT_SYMBOL(v4l2_ctrl_get_menu);
1546 EXPORT_SYMBOL(v4l2_ctrl_query_menu);
1547 EXPORT_SYMBOL(v4l2_ctrl_query_fill);
1548 EXPORT_SYMBOL(v4l2_ctrl_query_fill_std);
1551 * Local variables:
1552 * c-basic-offset: 8
1553 * End: