• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/drivers/staging/easycap/
1/******************************************************************************
2*                                                                             *
3*  easycap_settings.c                                                         *
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#include "easycap.h"
29#include "easycap_debug.h"
30
31/*---------------------------------------------------------------------------*/
32/*
33 *  THE LEAST SIGNIFICANT BIT OF easycap_standard.mask HAS MEANING:
34 *                         0 => 25 fps
35 *                         1 => 30 fps
36 */
37/*---------------------------------------------------------------------------*/
38const struct easycap_standard easycap_standard[] = {
39{
40.mask = 0x000F & PAL_BGHIN ,
41.v4l2_standard = {
42	.index = PAL_BGHIN,
43	.id = (V4L2_STD_PAL_B | V4L2_STD_PAL_G | V4L2_STD_PAL_H | \
44					V4L2_STD_PAL_I | V4L2_STD_PAL_N),
45	.name = "PAL_BGHIN",
46	.frameperiod = {1, 25},
47	.framelines = 625,
48	.reserved = {0, 0, 0, 0}
49	}
50},
51/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
52{
53.mask = 0x000F & NTSC_N_443 ,
54.v4l2_standard = {
55	.index = NTSC_N_443,
56	.id = V4L2_STD_UNKNOWN,
57	.name = "NTSC_N_443",
58	.frameperiod = {1, 25},
59	.framelines = 480,
60	.reserved = {0, 0, 0, 0}
61}
62},
63/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
64{
65.mask = 0x000F & PAL_Nc ,
66.v4l2_standard = {
67	.index = PAL_Nc,
68	.id = V4L2_STD_PAL_Nc,
69	.name = "PAL_Nc",
70	.frameperiod = {1, 25},
71	.framelines = 625,
72	.reserved = {0, 0, 0, 0}
73}
74},
75/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
76{
77.mask = 0x000F & NTSC_N ,
78.v4l2_standard = {
79	.index = NTSC_N,
80	.id = V4L2_STD_UNKNOWN,
81	.name = "NTSC_N",
82	.frameperiod = {1, 25},
83	.framelines = 525,
84	.reserved = {0, 0, 0, 0}
85}
86},
87/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
88{
89.mask = 0x000F & SECAM ,
90.v4l2_standard = {
91	.index = SECAM,
92	.id = V4L2_STD_SECAM,
93	.name = "SECAM",
94	.frameperiod = {1, 25},
95	.framelines = 625,
96	.reserved = {0, 0, 0, 0}
97}
98},
99/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
100{
101.mask = 0x000F & NTSC_M ,
102.v4l2_standard = {
103	.index = NTSC_M,
104	.id = V4L2_STD_NTSC_M,
105	.name = "NTSC_M",
106	.frameperiod = {1, 30},
107	.framelines = 525,
108	.reserved = {0, 0, 0, 0}
109}
110},
111/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
112{
113.mask = 0x000F & NTSC_M_JP ,
114.v4l2_standard = {
115	.index = NTSC_M_JP,
116	.id = V4L2_STD_NTSC_M_JP,
117	.name = "NTSC_M_JP",
118	.frameperiod = {1, 30},
119	.framelines = 525,
120	.reserved = {0, 0, 0, 0}
121}
122},
123/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
124{
125.mask = 0x000F & PAL_60 ,
126.v4l2_standard = {
127	.index = PAL_60,
128	.id = V4L2_STD_PAL_60,
129	.name = "PAL_60",
130	.frameperiod = {1, 30},
131	.framelines = 525,
132	.reserved = {0, 0, 0, 0}
133}
134},
135/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
136{
137.mask = 0x000F & NTSC_443 ,
138.v4l2_standard = {
139	.index = NTSC_443,
140	.id = V4L2_STD_NTSC_443,
141	.name = "NTSC_443",
142	.frameperiod = {1, 30},
143	.framelines = 525,
144	.reserved = {0, 0, 0, 0}
145}
146},
147/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
148{
149.mask = 0x000F & PAL_M ,
150.v4l2_standard = {
151	.index = PAL_M,
152	.id = V4L2_STD_PAL_M,
153	.name = "PAL_M",
154	.frameperiod = {1, 30},
155	.framelines = 525,
156	.reserved = {0, 0, 0, 0}
157}
158},
159/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
160{
161.mask = 0xFFFF
162}
163};
164/*---------------------------------------------------------------------------*/
165/*
166 *  THE 16-BIT easycap_format.mask HAS MEANING:
167 *    (least significant) BIT  0:     0 => PAL, 25 FPS;   1 => NTSC, 30 FPS
168 *                        BITS 1-3:   RESERVED FOR DIFFERENTIATING STANDARDS
169 *                        BITS 4-7:   NUMBER OF BYTES PER PIXEL
170 *                        BIT  8:     0 => NATIVE BYTE ORDER;  1 => SWAPPED
171 *                        BITS 9-10:  RESERVED FOR OTHER BYTE PERMUTATIONS
172 *                        BIT 11:     0 => UNDECIMATED;  1 => DECIMATED
173 *                        BIT 12:     0 => OFFER FRAMES; 1 => OFFER FIELDS
174 *     (most significant) BITS 13-15: RESERVED FOR OTHER FIELD ORDER OPTIONS
175 *  IT FOLLOWS THAT:
176 *     bytesperpixel IS         ((0x00F0 & easycap_format.mask) >> 4)
177 *     byteswaporder IS true IF (0 != (0x0100 & easycap_format.mask))
178 *
179 *     decimatepixel IS true IF (0 != (0x0800 & easycap_format.mask))
180 *
181 *       offerfields IS true IF (0 != (0x1000 & easycap_format.mask))
182 */
183/*---------------------------------------------------------------------------*/
184
185struct easycap_format easycap_format[1 + SETTINGS_MANY];
186
187int
188fillin_formats(void)
189{
190int i, j, k, m, n;
191__u32 width, height, pixelformat, bytesperline, sizeimage;
192__u32 field, colorspace;
193__u16 mask1, mask2, mask3, mask4;
194char name1[32], name2[32], name3[32], name4[32];
195
196for (i = 0, n = 0; i < STANDARD_MANY; i++) {
197	mask1 = 0x0000;
198	switch (i) {
199	case PAL_BGHIN: {
200		mask1 = PAL_BGHIN;
201		strcpy(&name1[0], "PAL_BGHIN");
202		colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
203		break;
204	}
205	case SECAM: {
206		mask1 = SECAM;
207		strcpy(&name1[0], "SECAM");
208		colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
209		break;
210	}
211	case PAL_Nc: {
212		mask1 = PAL_Nc;
213		strcpy(&name1[0], "PAL_Nc");
214		colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
215		break;
216	}
217	case PAL_60: {
218		mask1 = PAL_60;
219		strcpy(&name1[0], "PAL_60");
220		colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
221		break;
222	}
223	case PAL_M: {
224		mask1 = PAL_M;
225		strcpy(&name1[0], "PAL_M");
226		colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
227		break;
228	}
229	case NTSC_M: {
230		mask1 = NTSC_M;
231		strcpy(&name1[0], "NTSC_M");
232		colorspace = V4L2_COLORSPACE_470_SYSTEM_M;
233		break;
234	}
235	case NTSC_443: {
236		mask1 = NTSC_443;
237		strcpy(&name1[0], "NTSC_443");
238		colorspace = V4L2_COLORSPACE_470_SYSTEM_M;
239		break;
240	}
241	case NTSC_M_JP: {
242		mask1 = NTSC_M_JP;
243		strcpy(&name1[0], "NTSC_M_JP");
244		colorspace = V4L2_COLORSPACE_470_SYSTEM_M;
245		break;
246	}
247	case NTSC_N: {
248		mask1 = NTSC_M;
249		strcpy(&name1[0], "NTSC_N");
250		colorspace = V4L2_COLORSPACE_470_SYSTEM_M;
251		break;
252	}
253	case NTSC_N_443: {
254		mask1 = NTSC_N_443;
255		strcpy(&name1[0], "NTSC_N_443");
256		colorspace = V4L2_COLORSPACE_470_SYSTEM_M;
257		break;
258	}
259	default:
260		return -1;
261	}
262
263	for (j = 0; j < RESOLUTION_MANY; j++) {
264		mask2 = 0x0000;
265		switch (j) {
266		case AT_720x576: {
267			if (0x1 & mask1)
268				continue;
269			strcpy(&name2[0], "_AT_720x576");
270			width = 720; height = 576; break;
271		}
272		case AT_704x576: {
273			if (0x1 & mask1)
274				continue;
275			strcpy(&name2[0], "_AT_704x576");
276			width = 704; height = 576; break;
277		}
278		case AT_640x480: {
279			strcpy(&name2[0], "_AT_640x480");
280			width = 640; height = 480; break;
281		}
282		case AT_720x480: {
283			if (!(0x1 & mask1))
284				continue;
285			strcpy(&name2[0], "_AT_720x480");
286			width = 720; height = 480; break;
287		}
288		case AT_360x288: {
289			if (0x1 & mask1)
290				continue;
291			strcpy(&name2[0], "_AT_360x288");
292			width = 360; height = 288; mask2 = 0x0800; break;
293		}
294		case AT_320x240: {
295			strcpy(&name2[0], "_AT_320x240");
296			width = 320; height = 240; mask2 = 0x0800; break;
297		}
298		case AT_360x240: {
299			if (!(0x1 & mask1))
300				continue;
301			strcpy(&name2[0], "_AT_360x240");
302			width = 360; height = 240; mask2 = 0x0800; break;
303		}
304		default:
305			return -2;
306		}
307
308		for (k = 0; k < PIXELFORMAT_MANY; k++) {
309			mask3 = 0x0000;
310			switch (k) {
311			case FMT_UYVY: {
312				strcpy(&name3[0], "_" STRINGIZE(FMT_UYVY));
313				pixelformat = V4L2_PIX_FMT_UYVY;
314				mask3 |= (0x02 << 4);
315				break;
316			}
317			case FMT_YUY2: {
318				strcpy(&name3[0], "_" STRINGIZE(FMT_YUY2));
319				pixelformat = V4L2_PIX_FMT_YUYV;
320				mask3 |= (0x02 << 4);
321				mask3 |= 0x0100;
322				break;
323			}
324			case FMT_RGB24: {
325				strcpy(&name3[0], "_" STRINGIZE(FMT_RGB24));
326				pixelformat = V4L2_PIX_FMT_RGB24;
327				mask3 |= (0x03 << 4);
328				break;
329			}
330			case FMT_RGB32: {
331				strcpy(&name3[0], "_" STRINGIZE(FMT_RGB32));
332				pixelformat = V4L2_PIX_FMT_RGB32;
333				mask3 |= (0x04 << 4);
334				break;
335			}
336			case FMT_BGR24: {
337				strcpy(&name3[0], "_" STRINGIZE(FMT_BGR24));
338				pixelformat = V4L2_PIX_FMT_BGR24;
339				mask3 |= (0x03 << 4);
340				mask3 |= 0x0100;
341				break;
342			}
343			case FMT_BGR32: {
344				strcpy(&name3[0], "_" STRINGIZE(FMT_BGR32));
345				pixelformat = V4L2_PIX_FMT_BGR32;
346				mask3 |= (0x04 << 4);
347				mask3 |= 0x0100;
348				break;
349			}
350			default:
351				return -3;
352			}
353			bytesperline = width * ((mask3 & 0x00F0) >> 4);
354			sizeimage =  bytesperline * height;
355
356			for (m = 0; m < INTERLACE_MANY; m++) {
357				mask4 = 0x0000;
358				switch (m) {
359				case FIELD_NONE: {
360					strcpy(&name4[0], "-n");
361					field = V4L2_FIELD_NONE;
362					break;
363				}
364				case FIELD_INTERLACED: {
365					strcpy(&name4[0], "-i");
366					field = V4L2_FIELD_INTERLACED;
367					break;
368				}
369				case FIELD_ALTERNATE: {
370					strcpy(&name4[0], "-a");
371					mask4 |= 0x1000;
372					field = V4L2_FIELD_ALTERNATE;
373					break;
374				}
375				default:
376					return -4;
377				}
378				if (SETTINGS_MANY <= n)
379					return -5;
380				strcpy(&easycap_format[n].name[0], &name1[0]);
381				strcat(&easycap_format[n].name[0], &name2[0]);
382				strcat(&easycap_format[n].name[0], &name3[0]);
383				strcat(&easycap_format[n].name[0], &name4[0]);
384				easycap_format[n].mask = \
385						mask1 | mask2 | mask3 | mask4;
386				easycap_format[n].v4l2_format\
387					.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
388				easycap_format[n].v4l2_format\
389					.fmt.pix.width = width;
390				easycap_format[n].v4l2_format\
391					.fmt.pix.height = height;
392				easycap_format[n].v4l2_format\
393					.fmt.pix.pixelformat = pixelformat;
394				easycap_format[n].v4l2_format\
395					.fmt.pix.field = field;
396				easycap_format[n].v4l2_format\
397					.fmt.pix.bytesperline = bytesperline;
398				easycap_format[n].v4l2_format\
399					.fmt.pix.sizeimage = sizeimage;
400				easycap_format[n].v4l2_format\
401					.fmt.pix.colorspace = colorspace;
402				easycap_format[n].v4l2_format\
403					.fmt.pix.priv = 0;
404				n++;
405			}
406		}
407	}
408}
409if ((1 + SETTINGS_MANY) <= n)
410	return -6;
411easycap_format[n].mask = 0xFFFF;
412return n;
413}
414/*---------------------------------------------------------------------------*/
415struct v4l2_queryctrl easycap_control[] = \
416 {{
417.id       = V4L2_CID_BRIGHTNESS,
418.type     = V4L2_CTRL_TYPE_INTEGER,
419.name     = "Brightness",
420.minimum  = 0,
421.maximum  = 255,
422.step     =  1,
423.default_value = SAA_0A_DEFAULT,
424.flags    = 0,
425.reserved = {0, 0}
426},
427/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
428{
429.id       = V4L2_CID_CONTRAST,
430.type     = V4L2_CTRL_TYPE_INTEGER,
431.name     = "Contrast",
432.minimum  = 0,
433.maximum  = 255,
434.step     =   1,
435.default_value = SAA_0B_DEFAULT + 128,
436.flags    = 0,
437.reserved = {0, 0}
438},
439/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
440{
441.id       = V4L2_CID_SATURATION,
442.type     = V4L2_CTRL_TYPE_INTEGER,
443.name     = "Saturation",
444.minimum  = 0,
445.maximum  = 255,
446.step     =   1,
447.default_value = SAA_0C_DEFAULT + 128,
448.flags    = 0,
449.reserved = {0, 0}
450},
451/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
452{
453.id       = V4L2_CID_HUE,
454.type     = V4L2_CTRL_TYPE_INTEGER,
455.name     = "Hue",
456.minimum  = 0,
457.maximum  = 255,
458.step     =   1,
459.default_value = SAA_0D_DEFAULT + 128,
460.flags    = 0,
461.reserved = {0, 0}
462},
463/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
464{
465.id       = V4L2_CID_AUDIO_VOLUME,
466.type     = V4L2_CTRL_TYPE_INTEGER,
467.name     = "Volume",
468.minimum  = 0,
469.maximum  = 31,
470.step     =   1,
471.default_value = 16,
472.flags    = 0,
473.reserved = {0, 0}
474},
475/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
476{
477.id       = V4L2_CID_AUDIO_MUTE,
478.type     = V4L2_CTRL_TYPE_BOOLEAN,
479.name     = "Mute",
480.default_value = true,
481.flags    = 0,
482.reserved = {0, 0}
483},
484/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
485{
486.id = 0xFFFFFFFF
487}
488 };
489/*****************************************************************************/
490