xref: /openbmc/linux/drivers/media/usb/gspca/ov534.c (revision ecc23d0a422a3118fcf6e4f0a46e17a6c2047b02)
1  // SPDX-License-Identifier: GPL-2.0-or-later
2  /*
3   * ov534-ov7xxx gspca driver
4   *
5   * Copyright (C) 2008 Antonio Ospite <ospite@studenti.unina.it>
6   * Copyright (C) 2008 Jim Paris <jim@jtan.com>
7   * Copyright (C) 2009 Jean-Francois Moine http://moinejf.free.fr
8   *
9   * Based on a prototype written by Mark Ferrell <majortrips@gmail.com>
10   * USB protocol reverse engineered by Jim Paris <jim@jtan.com>
11   * https://jim.sh/svn/jim/devl/playstation/ps3/eye/test/
12   *
13   * PS3 Eye camera enhanced by Richard Kaswy http://kaswy.free.fr
14   * PS3 Eye camera - brightness, contrast, awb, agc, aec controls
15   *                  added by Max Thrun <bear24rw@gmail.com>
16   * PS3 Eye camera - FPS range extended by Joseph Howse
17   *                  <josephhowse@nummist.com> https://nummist.com
18   */
19  
20  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
21  
22  #define MODULE_NAME "ov534"
23  
24  #include "gspca.h"
25  
26  #include <linux/fixp-arith.h>
27  #include <media/v4l2-ctrls.h>
28  
29  #define OV534_REG_ADDRESS	0xf1	/* sensor address */
30  #define OV534_REG_SUBADDR	0xf2
31  #define OV534_REG_WRITE		0xf3
32  #define OV534_REG_READ		0xf4
33  #define OV534_REG_OPERATION	0xf5
34  #define OV534_REG_STATUS	0xf6
35  
36  #define OV534_OP_WRITE_3	0x37
37  #define OV534_OP_WRITE_2	0x33
38  #define OV534_OP_READ_2		0xf9
39  
40  #define CTRL_TIMEOUT 500
41  #define DEFAULT_FRAME_RATE 30
42  
43  MODULE_AUTHOR("Antonio Ospite <ospite@studenti.unina.it>");
44  MODULE_DESCRIPTION("GSPCA/OV534 USB Camera Driver");
45  MODULE_LICENSE("GPL");
46  
47  /* specific webcam descriptor */
48  struct sd {
49  	struct gspca_dev gspca_dev;	/* !! must be the first item */
50  
51  	struct v4l2_ctrl_handler ctrl_handler;
52  	struct v4l2_ctrl *hue;
53  	struct v4l2_ctrl *saturation;
54  	struct v4l2_ctrl *brightness;
55  	struct v4l2_ctrl *contrast;
56  	struct { /* gain control cluster */
57  		struct v4l2_ctrl *autogain;
58  		struct v4l2_ctrl *gain;
59  	};
60  	struct v4l2_ctrl *autowhitebalance;
61  	struct { /* exposure control cluster */
62  		struct v4l2_ctrl *autoexposure;
63  		struct v4l2_ctrl *exposure;
64  	};
65  	struct v4l2_ctrl *sharpness;
66  	struct v4l2_ctrl *hflip;
67  	struct v4l2_ctrl *vflip;
68  	struct v4l2_ctrl *plfreq;
69  
70  	__u32 last_pts;
71  	u16 last_fid;
72  	u8 frame_rate;
73  
74  	u8 sensor;
75  };
76  enum sensors {
77  	SENSOR_OV767x,
78  	SENSOR_OV772x,
79  	NSENSORS
80  };
81  
82  static int sd_start(struct gspca_dev *gspca_dev);
83  static void sd_stopN(struct gspca_dev *gspca_dev);
84  
85  
86  static const struct v4l2_pix_format ov772x_mode[] = {
87  	{320, 240, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE,
88  	 .bytesperline = 320 * 2,
89  	 .sizeimage = 320 * 240 * 2,
90  	 .colorspace = V4L2_COLORSPACE_SRGB,
91  	 .priv = 1},
92  	{640, 480, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE,
93  	 .bytesperline = 640 * 2,
94  	 .sizeimage = 640 * 480 * 2,
95  	 .colorspace = V4L2_COLORSPACE_SRGB,
96  	 .priv = 0},
97  	{320, 240, V4L2_PIX_FMT_SGRBG8, V4L2_FIELD_NONE,
98  	 .bytesperline = 320,
99  	 .sizeimage = 320 * 240,
100  	 .colorspace = V4L2_COLORSPACE_SRGB,
101  	 .priv = 1},
102  	{640, 480, V4L2_PIX_FMT_SGRBG8, V4L2_FIELD_NONE,
103  	 .bytesperline = 640,
104  	 .sizeimage = 640 * 480,
105  	 .colorspace = V4L2_COLORSPACE_SRGB,
106  	 .priv = 0},
107  };
108  static const struct v4l2_pix_format ov767x_mode[] = {
109  	{320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
110  		.bytesperline = 320,
111  		.sizeimage = 320 * 240 * 3 / 8 + 590,
112  		.colorspace = V4L2_COLORSPACE_JPEG},
113  	{640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
114  		.bytesperline = 640,
115  		.sizeimage = 640 * 480 * 3 / 8 + 590,
116  		.colorspace = V4L2_COLORSPACE_JPEG},
117  };
118  
119  static const u8 qvga_rates[] = {187, 150, 137, 125, 100, 75, 60, 50, 37, 30};
120  static const u8 vga_rates[] = {60, 50, 40, 30, 15};
121  
122  static const struct framerates ov772x_framerates[] = {
123  	{ /* 320x240 */
124  		.rates = qvga_rates,
125  		.nrates = ARRAY_SIZE(qvga_rates),
126  	},
127  	{ /* 640x480 */
128  		.rates = vga_rates,
129  		.nrates = ARRAY_SIZE(vga_rates),
130  	},
131  	{ /* 320x240 SGBRG8 */
132  		.rates = qvga_rates,
133  		.nrates = ARRAY_SIZE(qvga_rates),
134  	},
135  	{ /* 640x480 SGBRG8 */
136  		.rates = vga_rates,
137  		.nrates = ARRAY_SIZE(vga_rates),
138  	},
139  };
140  
141  struct reg_array {
142  	const u8 (*val)[2];
143  	int len;
144  };
145  
146  static const u8 bridge_init_767x[][2] = {
147  /* comments from the ms-win file apollo7670.set */
148  /* str1 */
149  	{0xf1, 0x42},
150  	{0x88, 0xf8},
151  	{0x89, 0xff},
152  	{0x76, 0x03},
153  	{0x92, 0x03},
154  	{0x95, 0x10},
155  	{0xe2, 0x00},
156  	{0xe7, 0x3e},
157  	{0x8d, 0x1c},
158  	{0x8e, 0x00},
159  	{0x8f, 0x00},
160  	{0x1f, 0x00},
161  	{0xc3, 0xf9},
162  	{0x89, 0xff},
163  	{0x88, 0xf8},
164  	{0x76, 0x03},
165  	{0x92, 0x01},
166  	{0x93, 0x18},
167  	{0x1c, 0x00},
168  	{0x1d, 0x48},
169  	{0x1d, 0x00},
170  	{0x1d, 0xff},
171  	{0x1d, 0x02},
172  	{0x1d, 0x58},
173  	{0x1d, 0x00},
174  	{0x1c, 0x0a},
175  	{0x1d, 0x0a},
176  	{0x1d, 0x0e},
177  	{0xc0, 0x50},	/* HSize 640 */
178  	{0xc1, 0x3c},	/* VSize 480 */
179  	{0x34, 0x05},	/* enable Audio Suspend mode */
180  	{0xc2, 0x0c},	/* Input YUV */
181  	{0xc3, 0xf9},	/* enable PRE */
182  	{0x34, 0x05},	/* enable Audio Suspend mode */
183  	{0xe7, 0x2e},	/* this solves failure of "SuspendResumeTest" */
184  	{0x31, 0xf9},	/* enable 1.8V Suspend */
185  	{0x35, 0x02},	/* turn on JPEG */
186  	{0xd9, 0x10},
187  	{0x25, 0x42},	/* GPIO[8]:Input */
188  	{0x94, 0x11},	/* If the default setting is loaded when
189  			 * system boots up, this flag is closed here */
190  };
191  static const u8 sensor_init_767x[][2] = {
192  	{0x12, 0x80},
193  	{0x11, 0x03},
194  	{0x3a, 0x04},
195  	{0x12, 0x00},
196  	{0x17, 0x13},
197  	{0x18, 0x01},
198  	{0x32, 0xb6},
199  	{0x19, 0x02},
200  	{0x1a, 0x7a},
201  	{0x03, 0x0a},
202  	{0x0c, 0x00},
203  	{0x3e, 0x00},
204  	{0x70, 0x3a},
205  	{0x71, 0x35},
206  	{0x72, 0x11},
207  	{0x73, 0xf0},
208  	{0xa2, 0x02},
209  	{0x7a, 0x2a},	/* set Gamma=1.6 below */
210  	{0x7b, 0x12},
211  	{0x7c, 0x1d},
212  	{0x7d, 0x2d},
213  	{0x7e, 0x45},
214  	{0x7f, 0x50},
215  	{0x80, 0x59},
216  	{0x81, 0x62},
217  	{0x82, 0x6b},
218  	{0x83, 0x73},
219  	{0x84, 0x7b},
220  	{0x85, 0x8a},
221  	{0x86, 0x98},
222  	{0x87, 0xb2},
223  	{0x88, 0xca},
224  	{0x89, 0xe0},
225  	{0x13, 0xe0},
226  	{0x00, 0x00},
227  	{0x10, 0x00},
228  	{0x0d, 0x40},
229  	{0x14, 0x38},	/* gain max 16x */
230  	{0xa5, 0x05},
231  	{0xab, 0x07},
232  	{0x24, 0x95},
233  	{0x25, 0x33},
234  	{0x26, 0xe3},
235  	{0x9f, 0x78},
236  	{0xa0, 0x68},
237  	{0xa1, 0x03},
238  	{0xa6, 0xd8},
239  	{0xa7, 0xd8},
240  	{0xa8, 0xf0},
241  	{0xa9, 0x90},
242  	{0xaa, 0x94},
243  	{0x13, 0xe5},
244  	{0x0e, 0x61},
245  	{0x0f, 0x4b},
246  	{0x16, 0x02},
247  	{0x21, 0x02},
248  	{0x22, 0x91},
249  	{0x29, 0x07},
250  	{0x33, 0x0b},
251  	{0x35, 0x0b},
252  	{0x37, 0x1d},
253  	{0x38, 0x71},
254  	{0x39, 0x2a},
255  	{0x3c, 0x78},
256  	{0x4d, 0x40},
257  	{0x4e, 0x20},
258  	{0x69, 0x00},
259  	{0x6b, 0x4a},
260  	{0x74, 0x10},
261  	{0x8d, 0x4f},
262  	{0x8e, 0x00},
263  	{0x8f, 0x00},
264  	{0x90, 0x00},
265  	{0x91, 0x00},
266  	{0x96, 0x00},
267  	{0x9a, 0x80},
268  	{0xb0, 0x84},
269  	{0xb1, 0x0c},
270  	{0xb2, 0x0e},
271  	{0xb3, 0x82},
272  	{0xb8, 0x0a},
273  	{0x43, 0x0a},
274  	{0x44, 0xf0},
275  	{0x45, 0x34},
276  	{0x46, 0x58},
277  	{0x47, 0x28},
278  	{0x48, 0x3a},
279  	{0x59, 0x88},
280  	{0x5a, 0x88},
281  	{0x5b, 0x44},
282  	{0x5c, 0x67},
283  	{0x5d, 0x49},
284  	{0x5e, 0x0e},
285  	{0x6c, 0x0a},
286  	{0x6d, 0x55},
287  	{0x6e, 0x11},
288  	{0x6f, 0x9f},
289  	{0x6a, 0x40},
290  	{0x01, 0x40},
291  	{0x02, 0x40},
292  	{0x13, 0xe7},
293  	{0x4f, 0x80},
294  	{0x50, 0x80},
295  	{0x51, 0x00},
296  	{0x52, 0x22},
297  	{0x53, 0x5e},
298  	{0x54, 0x80},
299  	{0x58, 0x9e},
300  	{0x41, 0x08},
301  	{0x3f, 0x00},
302  	{0x75, 0x04},
303  	{0x76, 0xe1},
304  	{0x4c, 0x00},
305  	{0x77, 0x01},
306  	{0x3d, 0xc2},
307  	{0x4b, 0x09},
308  	{0xc9, 0x60},
309  	{0x41, 0x38},	/* jfm: auto sharpness + auto de-noise  */
310  	{0x56, 0x40},
311  	{0x34, 0x11},
312  	{0x3b, 0xc2},
313  	{0xa4, 0x8a},	/* Night mode trigger point */
314  	{0x96, 0x00},
315  	{0x97, 0x30},
316  	{0x98, 0x20},
317  	{0x99, 0x20},
318  	{0x9a, 0x84},
319  	{0x9b, 0x29},
320  	{0x9c, 0x03},
321  	{0x9d, 0x4c},
322  	{0x9e, 0x3f},
323  	{0x78, 0x04},
324  	{0x79, 0x01},
325  	{0xc8, 0xf0},
326  	{0x79, 0x0f},
327  	{0xc8, 0x00},
328  	{0x79, 0x10},
329  	{0xc8, 0x7e},
330  	{0x79, 0x0a},
331  	{0xc8, 0x80},
332  	{0x79, 0x0b},
333  	{0xc8, 0x01},
334  	{0x79, 0x0c},
335  	{0xc8, 0x0f},
336  	{0x79, 0x0d},
337  	{0xc8, 0x20},
338  	{0x79, 0x09},
339  	{0xc8, 0x80},
340  	{0x79, 0x02},
341  	{0xc8, 0xc0},
342  	{0x79, 0x03},
343  	{0xc8, 0x20},
344  	{0x79, 0x26},
345  };
346  static const u8 bridge_start_vga_767x[][2] = {
347  /* str59 JPG */
348  	{0x94, 0xaa},
349  	{0xf1, 0x42},
350  	{0xe5, 0x04},
351  	{0xc0, 0x50},
352  	{0xc1, 0x3c},
353  	{0xc2, 0x0c},
354  	{0x35, 0x02},	/* turn on JPEG */
355  	{0xd9, 0x10},
356  	{0xda, 0x00},	/* for higher clock rate(30fps) */
357  	{0x34, 0x05},	/* enable Audio Suspend mode */
358  	{0xc3, 0xf9},	/* enable PRE */
359  	{0x8c, 0x00},	/* CIF VSize LSB[2:0] */
360  	{0x8d, 0x1c},	/* output YUV */
361  /*	{0x34, 0x05},	 * enable Audio Suspend mode (?) */
362  	{0x50, 0x00},	/* H/V divider=0 */
363  	{0x51, 0xa0},	/* input H=640/4 */
364  	{0x52, 0x3c},	/* input V=480/4 */
365  	{0x53, 0x00},	/* offset X=0 */
366  	{0x54, 0x00},	/* offset Y=0 */
367  	{0x55, 0x00},	/* H/V size[8]=0 */
368  	{0x57, 0x00},	/* H-size[9]=0 */
369  	{0x5c, 0x00},	/* output size[9:8]=0 */
370  	{0x5a, 0xa0},	/* output H=640/4 */
371  	{0x5b, 0x78},	/* output V=480/4 */
372  	{0x1c, 0x0a},
373  	{0x1d, 0x0a},
374  	{0x94, 0x11},
375  };
376  static const u8 sensor_start_vga_767x[][2] = {
377  	{0x11, 0x01},
378  	{0x1e, 0x04},
379  	{0x19, 0x02},
380  	{0x1a, 0x7a},
381  };
382  static const u8 bridge_start_qvga_767x[][2] = {
383  /* str86 JPG */
384  	{0x94, 0xaa},
385  	{0xf1, 0x42},
386  	{0xe5, 0x04},
387  	{0xc0, 0x80},
388  	{0xc1, 0x60},
389  	{0xc2, 0x0c},
390  	{0x35, 0x02},	/* turn on JPEG */
391  	{0xd9, 0x10},
392  	{0xc0, 0x50},	/* CIF HSize 640 */
393  	{0xc1, 0x3c},	/* CIF VSize 480 */
394  	{0x8c, 0x00},	/* CIF VSize LSB[2:0] */
395  	{0x8d, 0x1c},	/* output YUV */
396  	{0x34, 0x05},	/* enable Audio Suspend mode */
397  	{0xc2, 0x4c},	/* output YUV and Enable DCW */
398  	{0xc3, 0xf9},	/* enable PRE */
399  	{0x1c, 0x00},	/* indirect addressing */
400  	{0x1d, 0x48},	/* output YUV422 */
401  	{0x50, 0x89},	/* H/V divider=/2; plus DCW AVG */
402  	{0x51, 0xa0},	/* DCW input H=640/4 */
403  	{0x52, 0x78},	/* DCW input V=480/4 */
404  	{0x53, 0x00},	/* offset X=0 */
405  	{0x54, 0x00},	/* offset Y=0 */
406  	{0x55, 0x00},	/* H/V size[8]=0 */
407  	{0x57, 0x00},	/* H-size[9]=0 */
408  	{0x5c, 0x00},	/* DCW output size[9:8]=0 */
409  	{0x5a, 0x50},	/* DCW output H=320/4 */
410  	{0x5b, 0x3c},	/* DCW output V=240/4 */
411  	{0x1c, 0x0a},
412  	{0x1d, 0x0a},
413  	{0x94, 0x11},
414  };
415  static const u8 sensor_start_qvga_767x[][2] = {
416  	{0x11, 0x01},
417  	{0x1e, 0x04},
418  	{0x19, 0x02},
419  	{0x1a, 0x7a},
420  };
421  
422  static const u8 bridge_init_772x[][2] = {
423  	{ 0x88, 0xf8 },
424  	{ 0x89, 0xff },
425  	{ 0x76, 0x03 },
426  	{ 0x92, 0x01 },
427  	{ 0x93, 0x18 },
428  	{ 0x94, 0x10 },
429  	{ 0x95, 0x10 },
430  	{ 0xe2, 0x00 },
431  	{ 0xe7, 0x3e },
432  
433  	{ 0x96, 0x00 },
434  
435  	{ 0x97, 0x20 },
436  	{ 0x97, 0x20 },
437  	{ 0x97, 0x20 },
438  	{ 0x97, 0x0a },
439  	{ 0x97, 0x3f },
440  	{ 0x97, 0x4a },
441  	{ 0x97, 0x20 },
442  	{ 0x97, 0x15 },
443  	{ 0x97, 0x0b },
444  
445  	{ 0x8e, 0x40 },
446  	{ 0x1f, 0x81 },
447  	{ 0x34, 0x05 },
448  	{ 0xe3, 0x04 },
449  	{ 0x89, 0x00 },
450  	{ 0x76, 0x00 },
451  	{ 0xe7, 0x2e },
452  	{ 0x31, 0xf9 },
453  	{ 0x25, 0x42 },
454  	{ 0x21, 0xf0 },
455  
456  	{ 0x1c, 0x0a },
457  	{ 0x1d, 0x08 }, /* turn on UVC header */
458  	{ 0x1d, 0x0e }, /* .. */
459  };
460  static const u8 sensor_init_772x[][2] = {
461  	{ 0x12, 0x80 },
462  	{ 0x11, 0x01 },
463  /*fixme: better have a delay?*/
464  	{ 0x11, 0x01 },
465  	{ 0x11, 0x01 },
466  	{ 0x11, 0x01 },
467  	{ 0x11, 0x01 },
468  	{ 0x11, 0x01 },
469  	{ 0x11, 0x01 },
470  	{ 0x11, 0x01 },
471  	{ 0x11, 0x01 },
472  	{ 0x11, 0x01 },
473  	{ 0x11, 0x01 },
474  
475  	{ 0x3d, 0x03 },
476  	{ 0x17, 0x26 },
477  	{ 0x18, 0xa0 },
478  	{ 0x19, 0x07 },
479  	{ 0x1a, 0xf0 },
480  	{ 0x32, 0x00 },
481  	{ 0x29, 0xa0 },
482  	{ 0x2c, 0xf0 },
483  	{ 0x65, 0x20 },
484  	{ 0x11, 0x01 },
485  	{ 0x42, 0x7f },
486  	{ 0x63, 0xaa },		/* AWB - was e0 */
487  	{ 0x64, 0xff },
488  	{ 0x66, 0x00 },
489  	{ 0x13, 0xf0 },		/* com8 */
490  	{ 0x0d, 0x41 },
491  	{ 0x0f, 0xc5 },
492  	{ 0x14, 0x11 },
493  
494  	{ 0x22, 0x7f },
495  	{ 0x23, 0x03 },
496  	{ 0x24, 0x40 },
497  	{ 0x25, 0x30 },
498  	{ 0x26, 0xa1 },
499  	{ 0x2a, 0x00 },
500  	{ 0x2b, 0x00 },
501  	{ 0x6b, 0xaa },
502  	{ 0x13, 0xff },		/* AWB */
503  
504  	{ 0x90, 0x05 },
505  	{ 0x91, 0x01 },
506  	{ 0x92, 0x03 },
507  	{ 0x93, 0x00 },
508  	{ 0x94, 0x60 },
509  	{ 0x95, 0x3c },
510  	{ 0x96, 0x24 },
511  	{ 0x97, 0x1e },
512  	{ 0x98, 0x62 },
513  	{ 0x99, 0x80 },
514  	{ 0x9a, 0x1e },
515  	{ 0x9b, 0x08 },
516  	{ 0x9c, 0x20 },
517  	{ 0x9e, 0x81 },
518  
519  	{ 0xa6, 0x07 },
520  	{ 0x7e, 0x0c },
521  	{ 0x7f, 0x16 },
522  	{ 0x80, 0x2a },
523  	{ 0x81, 0x4e },
524  	{ 0x82, 0x61 },
525  	{ 0x83, 0x6f },
526  	{ 0x84, 0x7b },
527  	{ 0x85, 0x86 },
528  	{ 0x86, 0x8e },
529  	{ 0x87, 0x97 },
530  	{ 0x88, 0xa4 },
531  	{ 0x89, 0xaf },
532  	{ 0x8a, 0xc5 },
533  	{ 0x8b, 0xd7 },
534  	{ 0x8c, 0xe8 },
535  	{ 0x8d, 0x20 },
536  
537  	{ 0x2b, 0x00 },
538  	{ 0x22, 0x7f },
539  	{ 0x23, 0x03 },
540  	{ 0x11, 0x01 },
541  	{ 0x64, 0xff },
542  	{ 0x0d, 0x41 },
543  
544  	{ 0x14, 0x41 },
545  	{ 0x0e, 0xcd },
546  	{ 0xac, 0xbf },
547  	{ 0x8e, 0x00 },		/* De-noise threshold */
548  };
549  static const u8 bridge_start_vga_yuyv_772x[][2] = {
550  	{0x88, 0x00},
551  	{0x1c, 0x00},
552  	{0x1d, 0x40},
553  	{0x1d, 0x02},
554  	{0x1d, 0x00},
555  	{0x1d, 0x02},
556  	{0x1d, 0x58},
557  	{0x1d, 0x00},
558  	{0x8d, 0x1c},
559  	{0x8e, 0x80},
560  	{0xc0, 0x50},
561  	{0xc1, 0x3c},
562  	{0xc2, 0x0c},
563  	{0xc3, 0x69},
564  };
565  static const u8 sensor_start_vga_yuyv_772x[][2] = {
566  	{0x12, 0x00},
567  	{0x17, 0x26},
568  	{0x18, 0xa0},
569  	{0x19, 0x07},
570  	{0x1a, 0xf0},
571  	{0x29, 0xa0},
572  	{0x2c, 0xf0},
573  	{0x65, 0x20},
574  	{0x67, 0x00},
575  };
576  static const u8 bridge_start_qvga_yuyv_772x[][2] = {
577  	{0x88, 0x00},
578  	{0x1c, 0x00},
579  	{0x1d, 0x40},
580  	{0x1d, 0x02},
581  	{0x1d, 0x00},
582  	{0x1d, 0x01},
583  	{0x1d, 0x4b},
584  	{0x1d, 0x00},
585  	{0x8d, 0x1c},
586  	{0x8e, 0x80},
587  	{0xc0, 0x28},
588  	{0xc1, 0x1e},
589  	{0xc2, 0x0c},
590  	{0xc3, 0x69},
591  };
592  static const u8 sensor_start_qvga_yuyv_772x[][2] = {
593  	{0x12, 0x40},
594  	{0x17, 0x3f},
595  	{0x18, 0x50},
596  	{0x19, 0x03},
597  	{0x1a, 0x78},
598  	{0x29, 0x50},
599  	{0x2c, 0x78},
600  	{0x65, 0x2f},
601  	{0x67, 0x00},
602  };
603  static const u8 bridge_start_vga_gbrg_772x[][2] = {
604  	{0x88, 0x08},
605  	{0x1c, 0x00},
606  	{0x1d, 0x00},
607  	{0x1d, 0x02},
608  	{0x1d, 0x00},
609  	{0x1d, 0x01},
610  	{0x1d, 0x2c},
611  	{0x1d, 0x00},
612  	{0x8d, 0x00},
613  	{0x8e, 0x00},
614  	{0xc0, 0x50},
615  	{0xc1, 0x3c},
616  	{0xc2, 0x01},
617  	{0xc3, 0x01},
618  };
619  static const u8 sensor_start_vga_gbrg_772x[][2] = {
620  	{0x12, 0x01},
621  	{0x17, 0x26},
622  	{0x18, 0xa0},
623  	{0x19, 0x07},
624  	{0x1a, 0xf0},
625  	{0x29, 0xa0},
626  	{0x2c, 0xf0},
627  	{0x65, 0x20},
628  	{0x67, 0x02},
629  };
630  static const u8 bridge_start_qvga_gbrg_772x[][2] = {
631  	{0x88, 0x08},
632  	{0x1c, 0x00},
633  	{0x1d, 0x00},
634  	{0x1d, 0x02},
635  	{0x1d, 0x00},
636  	{0x1d, 0x00},
637  	{0x1d, 0x4b},
638  	{0x1d, 0x00},
639  	{0x8d, 0x00},
640  	{0x8e, 0x00},
641  	{0xc0, 0x28},
642  	{0xc1, 0x1e},
643  	{0xc2, 0x01},
644  	{0xc3, 0x01},
645  };
646  static const u8 sensor_start_qvga_gbrg_772x[][2] = {
647  	{0x12, 0x41},
648  	{0x17, 0x3f},
649  	{0x18, 0x50},
650  	{0x19, 0x03},
651  	{0x1a, 0x78},
652  	{0x29, 0x50},
653  	{0x2c, 0x78},
654  	{0x65, 0x2f},
655  	{0x67, 0x02},
656  };
657  
ov534_reg_write(struct gspca_dev * gspca_dev,u16 reg,u8 val)658  static void ov534_reg_write(struct gspca_dev *gspca_dev, u16 reg, u8 val)
659  {
660  	struct usb_device *udev = gspca_dev->dev;
661  	int ret;
662  
663  	if (gspca_dev->usb_err < 0)
664  		return;
665  
666  	gspca_dbg(gspca_dev, D_USBO, "SET 01 0000 %04x %02x\n", reg, val);
667  	gspca_dev->usb_buf[0] = val;
668  	ret = usb_control_msg(udev,
669  			      usb_sndctrlpipe(udev, 0),
670  			      0x01,
671  			      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
672  			      0x00, reg, gspca_dev->usb_buf, 1, CTRL_TIMEOUT);
673  	if (ret < 0) {
674  		pr_err("write failed %d\n", ret);
675  		gspca_dev->usb_err = ret;
676  	}
677  }
678  
ov534_reg_read(struct gspca_dev * gspca_dev,u16 reg)679  static u8 ov534_reg_read(struct gspca_dev *gspca_dev, u16 reg)
680  {
681  	struct usb_device *udev = gspca_dev->dev;
682  	int ret;
683  
684  	if (gspca_dev->usb_err < 0)
685  		return 0;
686  	ret = usb_control_msg(udev,
687  			      usb_rcvctrlpipe(udev, 0),
688  			      0x01,
689  			      USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
690  			      0x00, reg, gspca_dev->usb_buf, 1, CTRL_TIMEOUT);
691  	gspca_dbg(gspca_dev, D_USBI, "GET 01 0000 %04x %02x\n",
692  		  reg, gspca_dev->usb_buf[0]);
693  	if (ret < 0) {
694  		pr_err("read failed %d\n", ret);
695  		gspca_dev->usb_err = ret;
696  		/*
697  		 * Make sure the result is zeroed to avoid uninitialized
698  		 * values.
699  		 */
700  		gspca_dev->usb_buf[0] = 0;
701  	}
702  	return gspca_dev->usb_buf[0];
703  }
704  
705  /* Two bits control LED: 0x21 bit 7 and 0x23 bit 7.
706   * (direction and output)? */
ov534_set_led(struct gspca_dev * gspca_dev,int status)707  static void ov534_set_led(struct gspca_dev *gspca_dev, int status)
708  {
709  	u8 data;
710  
711  	gspca_dbg(gspca_dev, D_CONF, "led status: %d\n", status);
712  
713  	data = ov534_reg_read(gspca_dev, 0x21);
714  	data |= 0x80;
715  	ov534_reg_write(gspca_dev, 0x21, data);
716  
717  	data = ov534_reg_read(gspca_dev, 0x23);
718  	if (status)
719  		data |= 0x80;
720  	else
721  		data &= ~0x80;
722  
723  	ov534_reg_write(gspca_dev, 0x23, data);
724  
725  	if (!status) {
726  		data = ov534_reg_read(gspca_dev, 0x21);
727  		data &= ~0x80;
728  		ov534_reg_write(gspca_dev, 0x21, data);
729  	}
730  }
731  
sccb_check_status(struct gspca_dev * gspca_dev)732  static int sccb_check_status(struct gspca_dev *gspca_dev)
733  {
734  	u8 data;
735  	int i;
736  
737  	for (i = 0; i < 5; i++) {
738  		usleep_range(10000, 20000);
739  		data = ov534_reg_read(gspca_dev, OV534_REG_STATUS);
740  
741  		switch (data) {
742  		case 0x00:
743  			return 1;
744  		case 0x04:
745  			return 0;
746  		case 0x03:
747  			break;
748  		default:
749  			gspca_err(gspca_dev, "sccb status 0x%02x, attempt %d/5\n",
750  				  data, i + 1);
751  		}
752  	}
753  	return 0;
754  }
755  
sccb_reg_write(struct gspca_dev * gspca_dev,u8 reg,u8 val)756  static void sccb_reg_write(struct gspca_dev *gspca_dev, u8 reg, u8 val)
757  {
758  	gspca_dbg(gspca_dev, D_USBO, "sccb write: %02x %02x\n", reg, val);
759  	ov534_reg_write(gspca_dev, OV534_REG_SUBADDR, reg);
760  	ov534_reg_write(gspca_dev, OV534_REG_WRITE, val);
761  	ov534_reg_write(gspca_dev, OV534_REG_OPERATION, OV534_OP_WRITE_3);
762  
763  	if (!sccb_check_status(gspca_dev)) {
764  		pr_err("sccb_reg_write failed\n");
765  		gspca_dev->usb_err = -EIO;
766  	}
767  }
768  
sccb_reg_read(struct gspca_dev * gspca_dev,u16 reg)769  static u8 sccb_reg_read(struct gspca_dev *gspca_dev, u16 reg)
770  {
771  	ov534_reg_write(gspca_dev, OV534_REG_SUBADDR, reg);
772  	ov534_reg_write(gspca_dev, OV534_REG_OPERATION, OV534_OP_WRITE_2);
773  	if (!sccb_check_status(gspca_dev))
774  		pr_err("sccb_reg_read failed 1\n");
775  
776  	ov534_reg_write(gspca_dev, OV534_REG_OPERATION, OV534_OP_READ_2);
777  	if (!sccb_check_status(gspca_dev))
778  		pr_err("sccb_reg_read failed 2\n");
779  
780  	return ov534_reg_read(gspca_dev, OV534_REG_READ);
781  }
782  
783  /* output a bridge sequence (reg - val) */
reg_w_array(struct gspca_dev * gspca_dev,const u8 (* data)[2],int len)784  static void reg_w_array(struct gspca_dev *gspca_dev,
785  			const u8 (*data)[2], int len)
786  {
787  	while (--len >= 0) {
788  		ov534_reg_write(gspca_dev, (*data)[0], (*data)[1]);
789  		data++;
790  	}
791  }
792  
793  /* output a sensor sequence (reg - val) */
sccb_w_array(struct gspca_dev * gspca_dev,const u8 (* data)[2],int len)794  static void sccb_w_array(struct gspca_dev *gspca_dev,
795  			const u8 (*data)[2], int len)
796  {
797  	while (--len >= 0) {
798  		if ((*data)[0] != 0xff) {
799  			sccb_reg_write(gspca_dev, (*data)[0], (*data)[1]);
800  		} else {
801  			sccb_reg_read(gspca_dev, (*data)[1]);
802  			sccb_reg_write(gspca_dev, 0xff, 0x00);
803  		}
804  		data++;
805  	}
806  }
807  
808  /* ov772x specific controls */
set_frame_rate(struct gspca_dev * gspca_dev)809  static void set_frame_rate(struct gspca_dev *gspca_dev)
810  {
811  	struct sd *sd = (struct sd *) gspca_dev;
812  	int i;
813  	struct rate_s {
814  		u8 fps;
815  		u8 r11;
816  		u8 r0d;
817  		u8 re5;
818  	};
819  	const struct rate_s *r;
820  	static const struct rate_s rate_0[] = {	/* 640x480 */
821  		{60, 0x01, 0xc1, 0x04},
822  		{50, 0x01, 0x41, 0x02},
823  		{40, 0x02, 0xc1, 0x04},
824  		{30, 0x04, 0x81, 0x02},
825  		{15, 0x03, 0x41, 0x04},
826  	};
827  	static const struct rate_s rate_1[] = {	/* 320x240 */
828  /*		{205, 0x01, 0xc1, 0x02},  * 205 FPS: video is partly corrupt */
829  		{187, 0x01, 0x81, 0x02}, /* 187 FPS or below: video is valid */
830  		{150, 0x01, 0xc1, 0x04},
831  		{137, 0x02, 0xc1, 0x02},
832  		{125, 0x02, 0x81, 0x02},
833  		{100, 0x02, 0xc1, 0x04},
834  		{75, 0x03, 0xc1, 0x04},
835  		{60, 0x04, 0xc1, 0x04},
836  		{50, 0x02, 0x41, 0x04},
837  		{37, 0x03, 0x41, 0x04},
838  		{30, 0x04, 0x41, 0x04},
839  	};
840  
841  	if (sd->sensor != SENSOR_OV772x)
842  		return;
843  	if (gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv == 0) {
844  		r = rate_0;
845  		i = ARRAY_SIZE(rate_0);
846  	} else {
847  		r = rate_1;
848  		i = ARRAY_SIZE(rate_1);
849  	}
850  	while (--i >= 0) {
851  		if (sd->frame_rate >= r->fps)
852  			break;
853  		r++;
854  	}
855  
856  	sccb_reg_write(gspca_dev, 0x11, r->r11);
857  	sccb_reg_write(gspca_dev, 0x0d, r->r0d);
858  	ov534_reg_write(gspca_dev, 0xe5, r->re5);
859  
860  	gspca_dbg(gspca_dev, D_PROBE, "frame_rate: %d\n", r->fps);
861  }
862  
sethue(struct gspca_dev * gspca_dev,s32 val)863  static void sethue(struct gspca_dev *gspca_dev, s32 val)
864  {
865  	struct sd *sd = (struct sd *) gspca_dev;
866  
867  	if (sd->sensor == SENSOR_OV767x) {
868  		/* TBD */
869  	} else {
870  		s16 huesin;
871  		s16 huecos;
872  
873  		/* According to the datasheet the registers expect HUESIN and
874  		 * HUECOS to be the result of the trigonometric functions,
875  		 * scaled by 0x80.
876  		 *
877  		 * The 0x7fff here represents the maximum absolute value
878  		 * returned byt fixp_sin and fixp_cos, so the scaling will
879  		 * consider the result like in the interval [-1.0, 1.0].
880  		 */
881  		huesin = fixp_sin16(val) * 0x80 / 0x7fff;
882  		huecos = fixp_cos16(val) * 0x80 / 0x7fff;
883  
884  		if (huesin < 0) {
885  			sccb_reg_write(gspca_dev, 0xab,
886  				sccb_reg_read(gspca_dev, 0xab) | 0x2);
887  			huesin = -huesin;
888  		} else {
889  			sccb_reg_write(gspca_dev, 0xab,
890  				sccb_reg_read(gspca_dev, 0xab) & ~0x2);
891  
892  		}
893  		sccb_reg_write(gspca_dev, 0xa9, (u8)huecos);
894  		sccb_reg_write(gspca_dev, 0xaa, (u8)huesin);
895  	}
896  }
897  
setsaturation(struct gspca_dev * gspca_dev,s32 val)898  static void setsaturation(struct gspca_dev *gspca_dev, s32 val)
899  {
900  	struct sd *sd = (struct sd *) gspca_dev;
901  
902  	if (sd->sensor == SENSOR_OV767x) {
903  		int i;
904  		static u8 color_tb[][6] = {
905  			{0x42, 0x42, 0x00, 0x11, 0x30, 0x41},
906  			{0x52, 0x52, 0x00, 0x16, 0x3c, 0x52},
907  			{0x66, 0x66, 0x00, 0x1b, 0x4b, 0x66},
908  			{0x80, 0x80, 0x00, 0x22, 0x5e, 0x80},
909  			{0x9a, 0x9a, 0x00, 0x29, 0x71, 0x9a},
910  			{0xb8, 0xb8, 0x00, 0x31, 0x87, 0xb8},
911  			{0xdd, 0xdd, 0x00, 0x3b, 0xa2, 0xdd},
912  		};
913  
914  		for (i = 0; i < ARRAY_SIZE(color_tb[0]); i++)
915  			sccb_reg_write(gspca_dev, 0x4f + i, color_tb[val][i]);
916  	} else {
917  		sccb_reg_write(gspca_dev, 0xa7, val); /* U saturation */
918  		sccb_reg_write(gspca_dev, 0xa8, val); /* V saturation */
919  	}
920  }
921  
setbrightness(struct gspca_dev * gspca_dev,s32 val)922  static void setbrightness(struct gspca_dev *gspca_dev, s32 val)
923  {
924  	struct sd *sd = (struct sd *) gspca_dev;
925  
926  	if (sd->sensor == SENSOR_OV767x) {
927  		if (val < 0)
928  			val = 0x80 - val;
929  		sccb_reg_write(gspca_dev, 0x55, val);	/* bright */
930  	} else {
931  		sccb_reg_write(gspca_dev, 0x9b, val);
932  	}
933  }
934  
setcontrast(struct gspca_dev * gspca_dev,s32 val)935  static void setcontrast(struct gspca_dev *gspca_dev, s32 val)
936  {
937  	struct sd *sd = (struct sd *) gspca_dev;
938  
939  	if (sd->sensor == SENSOR_OV767x)
940  		sccb_reg_write(gspca_dev, 0x56, val);	/* contras */
941  	else
942  		sccb_reg_write(gspca_dev, 0x9c, val);
943  }
944  
setgain(struct gspca_dev * gspca_dev,s32 val)945  static void setgain(struct gspca_dev *gspca_dev, s32 val)
946  {
947  	switch (val & 0x30) {
948  	case 0x00:
949  		val &= 0x0f;
950  		break;
951  	case 0x10:
952  		val &= 0x0f;
953  		val |= 0x30;
954  		break;
955  	case 0x20:
956  		val &= 0x0f;
957  		val |= 0x70;
958  		break;
959  	default:
960  /*	case 0x30: */
961  		val &= 0x0f;
962  		val |= 0xf0;
963  		break;
964  	}
965  	sccb_reg_write(gspca_dev, 0x00, val);
966  }
967  
getgain(struct gspca_dev * gspca_dev)968  static s32 getgain(struct gspca_dev *gspca_dev)
969  {
970  	return sccb_reg_read(gspca_dev, 0x00);
971  }
972  
setexposure(struct gspca_dev * gspca_dev,s32 val)973  static void setexposure(struct gspca_dev *gspca_dev, s32 val)
974  {
975  	struct sd *sd = (struct sd *) gspca_dev;
976  
977  	if (sd->sensor == SENSOR_OV767x) {
978  
979  		/* set only aec[9:2] */
980  		sccb_reg_write(gspca_dev, 0x10, val);	/* aech */
981  	} else {
982  
983  		/* 'val' is one byte and represents half of the exposure value
984  		 * we are going to set into registers, a two bytes value:
985  		 *
986  		 *    MSB: ((u16) val << 1) >> 8   == val >> 7
987  		 *    LSB: ((u16) val << 1) & 0xff == val << 1
988  		 */
989  		sccb_reg_write(gspca_dev, 0x08, val >> 7);
990  		sccb_reg_write(gspca_dev, 0x10, val << 1);
991  	}
992  }
993  
getexposure(struct gspca_dev * gspca_dev)994  static s32 getexposure(struct gspca_dev *gspca_dev)
995  {
996  	struct sd *sd = (struct sd *) gspca_dev;
997  
998  	if (sd->sensor == SENSOR_OV767x) {
999  		/* get only aec[9:2] */
1000  		return sccb_reg_read(gspca_dev, 0x10);	/* aech */
1001  	} else {
1002  		u8 hi = sccb_reg_read(gspca_dev, 0x08);
1003  		u8 lo = sccb_reg_read(gspca_dev, 0x10);
1004  		return (hi << 8 | lo) >> 1;
1005  	}
1006  }
1007  
setagc(struct gspca_dev * gspca_dev,s32 val)1008  static void setagc(struct gspca_dev *gspca_dev, s32 val)
1009  {
1010  	if (val) {
1011  		sccb_reg_write(gspca_dev, 0x13,
1012  				sccb_reg_read(gspca_dev, 0x13) | 0x04);
1013  		sccb_reg_write(gspca_dev, 0x64,
1014  				sccb_reg_read(gspca_dev, 0x64) | 0x03);
1015  	} else {
1016  		sccb_reg_write(gspca_dev, 0x13,
1017  				sccb_reg_read(gspca_dev, 0x13) & ~0x04);
1018  		sccb_reg_write(gspca_dev, 0x64,
1019  				sccb_reg_read(gspca_dev, 0x64) & ~0x03);
1020  	}
1021  }
1022  
setawb(struct gspca_dev * gspca_dev,s32 val)1023  static void setawb(struct gspca_dev *gspca_dev, s32 val)
1024  {
1025  	struct sd *sd = (struct sd *) gspca_dev;
1026  
1027  	if (val) {
1028  		sccb_reg_write(gspca_dev, 0x13,
1029  				sccb_reg_read(gspca_dev, 0x13) | 0x02);
1030  		if (sd->sensor == SENSOR_OV772x)
1031  			sccb_reg_write(gspca_dev, 0x63,
1032  				sccb_reg_read(gspca_dev, 0x63) | 0xc0);
1033  	} else {
1034  		sccb_reg_write(gspca_dev, 0x13,
1035  				sccb_reg_read(gspca_dev, 0x13) & ~0x02);
1036  		if (sd->sensor == SENSOR_OV772x)
1037  			sccb_reg_write(gspca_dev, 0x63,
1038  				sccb_reg_read(gspca_dev, 0x63) & ~0xc0);
1039  	}
1040  }
1041  
setaec(struct gspca_dev * gspca_dev,s32 val)1042  static void setaec(struct gspca_dev *gspca_dev, s32 val)
1043  {
1044  	struct sd *sd = (struct sd *) gspca_dev;
1045  	u8 data;
1046  
1047  	data = sd->sensor == SENSOR_OV767x ?
1048  			0x05 :		/* agc + aec */
1049  			0x01;		/* agc */
1050  	switch (val) {
1051  	case V4L2_EXPOSURE_AUTO:
1052  		sccb_reg_write(gspca_dev, 0x13,
1053  				sccb_reg_read(gspca_dev, 0x13) | data);
1054  		break;
1055  	case V4L2_EXPOSURE_MANUAL:
1056  		sccb_reg_write(gspca_dev, 0x13,
1057  				sccb_reg_read(gspca_dev, 0x13) & ~data);
1058  		break;
1059  	}
1060  }
1061  
setsharpness(struct gspca_dev * gspca_dev,s32 val)1062  static void setsharpness(struct gspca_dev *gspca_dev, s32 val)
1063  {
1064  	sccb_reg_write(gspca_dev, 0x91, val);	/* Auto de-noise threshold */
1065  	sccb_reg_write(gspca_dev, 0x8e, val);	/* De-noise threshold */
1066  }
1067  
sethvflip(struct gspca_dev * gspca_dev,s32 hflip,s32 vflip)1068  static void sethvflip(struct gspca_dev *gspca_dev, s32 hflip, s32 vflip)
1069  {
1070  	struct sd *sd = (struct sd *) gspca_dev;
1071  	u8 val;
1072  
1073  	if (sd->sensor == SENSOR_OV767x) {
1074  		val = sccb_reg_read(gspca_dev, 0x1e);	/* mvfp */
1075  		val &= ~0x30;
1076  		if (hflip)
1077  			val |= 0x20;
1078  		if (vflip)
1079  			val |= 0x10;
1080  		sccb_reg_write(gspca_dev, 0x1e, val);
1081  	} else {
1082  		val = sccb_reg_read(gspca_dev, 0x0c);
1083  		val &= ~0xc0;
1084  		if (hflip == 0)
1085  			val |= 0x40;
1086  		if (vflip == 0)
1087  			val |= 0x80;
1088  		sccb_reg_write(gspca_dev, 0x0c, val);
1089  	}
1090  }
1091  
setlightfreq(struct gspca_dev * gspca_dev,s32 val)1092  static void setlightfreq(struct gspca_dev *gspca_dev, s32 val)
1093  {
1094  	struct sd *sd = (struct sd *) gspca_dev;
1095  
1096  	val = val ? 0x9e : 0x00;
1097  	if (sd->sensor == SENSOR_OV767x) {
1098  		sccb_reg_write(gspca_dev, 0x2a, 0x00);
1099  		if (val)
1100  			val = 0x9d;	/* insert dummy to 25fps for 50Hz */
1101  	}
1102  	sccb_reg_write(gspca_dev, 0x2b, val);
1103  }
1104  
1105  
1106  /* this function is called at probe time */
sd_config(struct gspca_dev * gspca_dev,const struct usb_device_id * id)1107  static int sd_config(struct gspca_dev *gspca_dev,
1108  		     const struct usb_device_id *id)
1109  {
1110  	struct sd *sd = (struct sd *) gspca_dev;
1111  	struct cam *cam;
1112  
1113  	cam = &gspca_dev->cam;
1114  
1115  	cam->cam_mode = ov772x_mode;
1116  	cam->nmodes = ARRAY_SIZE(ov772x_mode);
1117  
1118  	sd->frame_rate = DEFAULT_FRAME_RATE;
1119  
1120  	return 0;
1121  }
1122  
ov534_g_volatile_ctrl(struct v4l2_ctrl * ctrl)1123  static int ov534_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
1124  {
1125  	struct sd *sd = container_of(ctrl->handler, struct sd, ctrl_handler);
1126  	struct gspca_dev *gspca_dev = &sd->gspca_dev;
1127  
1128  	switch (ctrl->id) {
1129  	case V4L2_CID_AUTOGAIN:
1130  		gspca_dev->usb_err = 0;
1131  		if (ctrl->val && sd->gain && gspca_dev->streaming)
1132  			sd->gain->val = getgain(gspca_dev);
1133  		return gspca_dev->usb_err;
1134  
1135  	case V4L2_CID_EXPOSURE_AUTO:
1136  		gspca_dev->usb_err = 0;
1137  		if (ctrl->val == V4L2_EXPOSURE_AUTO && sd->exposure &&
1138  		    gspca_dev->streaming)
1139  			sd->exposure->val = getexposure(gspca_dev);
1140  		return gspca_dev->usb_err;
1141  	}
1142  	return -EINVAL;
1143  }
1144  
ov534_s_ctrl(struct v4l2_ctrl * ctrl)1145  static int ov534_s_ctrl(struct v4l2_ctrl *ctrl)
1146  {
1147  	struct sd *sd = container_of(ctrl->handler, struct sd, ctrl_handler);
1148  	struct gspca_dev *gspca_dev = &sd->gspca_dev;
1149  
1150  	gspca_dev->usb_err = 0;
1151  	if (!gspca_dev->streaming)
1152  		return 0;
1153  
1154  	switch (ctrl->id) {
1155  	case V4L2_CID_HUE:
1156  		sethue(gspca_dev, ctrl->val);
1157  		break;
1158  	case V4L2_CID_SATURATION:
1159  		setsaturation(gspca_dev, ctrl->val);
1160  		break;
1161  	case V4L2_CID_BRIGHTNESS:
1162  		setbrightness(gspca_dev, ctrl->val);
1163  		break;
1164  	case V4L2_CID_CONTRAST:
1165  		setcontrast(gspca_dev, ctrl->val);
1166  		break;
1167  	case V4L2_CID_AUTOGAIN:
1168  	/* case V4L2_CID_GAIN: */
1169  		setagc(gspca_dev, ctrl->val);
1170  		if (!gspca_dev->usb_err && !ctrl->val && sd->gain)
1171  			setgain(gspca_dev, sd->gain->val);
1172  		break;
1173  	case V4L2_CID_AUTO_WHITE_BALANCE:
1174  		setawb(gspca_dev, ctrl->val);
1175  		break;
1176  	case V4L2_CID_EXPOSURE_AUTO:
1177  	/* case V4L2_CID_EXPOSURE: */
1178  		setaec(gspca_dev, ctrl->val);
1179  		if (!gspca_dev->usb_err && ctrl->val == V4L2_EXPOSURE_MANUAL &&
1180  		    sd->exposure)
1181  			setexposure(gspca_dev, sd->exposure->val);
1182  		break;
1183  	case V4L2_CID_SHARPNESS:
1184  		setsharpness(gspca_dev, ctrl->val);
1185  		break;
1186  	case V4L2_CID_HFLIP:
1187  		sethvflip(gspca_dev, ctrl->val, sd->vflip->val);
1188  		break;
1189  	case V4L2_CID_VFLIP:
1190  		sethvflip(gspca_dev, sd->hflip->val, ctrl->val);
1191  		break;
1192  	case V4L2_CID_POWER_LINE_FREQUENCY:
1193  		setlightfreq(gspca_dev, ctrl->val);
1194  		break;
1195  	}
1196  	return gspca_dev->usb_err;
1197  }
1198  
1199  static const struct v4l2_ctrl_ops ov534_ctrl_ops = {
1200  	.g_volatile_ctrl = ov534_g_volatile_ctrl,
1201  	.s_ctrl = ov534_s_ctrl,
1202  };
1203  
sd_init_controls(struct gspca_dev * gspca_dev)1204  static int sd_init_controls(struct gspca_dev *gspca_dev)
1205  {
1206  	struct sd *sd = (struct sd *) gspca_dev;
1207  	struct v4l2_ctrl_handler *hdl = &sd->ctrl_handler;
1208  	/* parameters with different values between the supported sensors */
1209  	int saturation_min;
1210  	int saturation_max;
1211  	int saturation_def;
1212  	int brightness_min;
1213  	int brightness_max;
1214  	int brightness_def;
1215  	int contrast_max;
1216  	int contrast_def;
1217  	int exposure_min;
1218  	int exposure_max;
1219  	int exposure_def;
1220  	int hflip_def;
1221  
1222  	if (sd->sensor == SENSOR_OV767x) {
1223  		saturation_min = 0;
1224  		saturation_max = 6;
1225  		saturation_def = 3;
1226  		brightness_min = -127;
1227  		brightness_max = 127;
1228  		brightness_def = 0;
1229  		contrast_max = 0x80;
1230  		contrast_def = 0x40;
1231  		exposure_min = 0x08;
1232  		exposure_max = 0x60;
1233  		exposure_def = 0x13;
1234  		hflip_def = 1;
1235  	} else {
1236  		saturation_min = 0;
1237  		saturation_max = 255;
1238  		saturation_def = 64;
1239  		brightness_min = 0;
1240  		brightness_max = 255;
1241  		brightness_def = 0;
1242  		contrast_max = 255;
1243  		contrast_def = 32;
1244  		exposure_min = 0;
1245  		exposure_max = 255;
1246  		exposure_def = 120;
1247  		hflip_def = 0;
1248  	}
1249  
1250  	gspca_dev->vdev.ctrl_handler = hdl;
1251  
1252  	v4l2_ctrl_handler_init(hdl, 13);
1253  
1254  	if (sd->sensor == SENSOR_OV772x)
1255  		sd->hue = v4l2_ctrl_new_std(hdl, &ov534_ctrl_ops,
1256  				V4L2_CID_HUE, -90, 90, 1, 0);
1257  
1258  	sd->saturation = v4l2_ctrl_new_std(hdl, &ov534_ctrl_ops,
1259  			V4L2_CID_SATURATION, saturation_min, saturation_max, 1,
1260  			saturation_def);
1261  	sd->brightness = v4l2_ctrl_new_std(hdl, &ov534_ctrl_ops,
1262  			V4L2_CID_BRIGHTNESS, brightness_min, brightness_max, 1,
1263  			brightness_def);
1264  	sd->contrast = v4l2_ctrl_new_std(hdl, &ov534_ctrl_ops,
1265  			V4L2_CID_CONTRAST, 0, contrast_max, 1, contrast_def);
1266  
1267  	if (sd->sensor == SENSOR_OV772x) {
1268  		sd->autogain = v4l2_ctrl_new_std(hdl, &ov534_ctrl_ops,
1269  				V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
1270  		sd->gain = v4l2_ctrl_new_std(hdl, &ov534_ctrl_ops,
1271  				V4L2_CID_GAIN, 0, 63, 1, 20);
1272  	}
1273  
1274  	sd->autoexposure = v4l2_ctrl_new_std_menu(hdl, &ov534_ctrl_ops,
1275  			V4L2_CID_EXPOSURE_AUTO,
1276  			V4L2_EXPOSURE_MANUAL, 0,
1277  			V4L2_EXPOSURE_AUTO);
1278  	sd->exposure = v4l2_ctrl_new_std(hdl, &ov534_ctrl_ops,
1279  			V4L2_CID_EXPOSURE, exposure_min, exposure_max, 1,
1280  			exposure_def);
1281  
1282  	sd->autowhitebalance = v4l2_ctrl_new_std(hdl, &ov534_ctrl_ops,
1283  			V4L2_CID_AUTO_WHITE_BALANCE, 0, 1, 1, 1);
1284  
1285  	if (sd->sensor == SENSOR_OV772x)
1286  		sd->sharpness = v4l2_ctrl_new_std(hdl, &ov534_ctrl_ops,
1287  				V4L2_CID_SHARPNESS, 0, 63, 1, 0);
1288  
1289  	sd->hflip = v4l2_ctrl_new_std(hdl, &ov534_ctrl_ops,
1290  			V4L2_CID_HFLIP, 0, 1, 1, hflip_def);
1291  	sd->vflip = v4l2_ctrl_new_std(hdl, &ov534_ctrl_ops,
1292  			V4L2_CID_VFLIP, 0, 1, 1, 0);
1293  	sd->plfreq = v4l2_ctrl_new_std_menu(hdl, &ov534_ctrl_ops,
1294  			V4L2_CID_POWER_LINE_FREQUENCY,
1295  			V4L2_CID_POWER_LINE_FREQUENCY_50HZ, 0,
1296  			V4L2_CID_POWER_LINE_FREQUENCY_DISABLED);
1297  
1298  	if (hdl->error) {
1299  		pr_err("Could not initialize controls\n");
1300  		return hdl->error;
1301  	}
1302  
1303  	if (sd->sensor == SENSOR_OV772x)
1304  		v4l2_ctrl_auto_cluster(2, &sd->autogain, 0, true);
1305  
1306  	v4l2_ctrl_auto_cluster(2, &sd->autoexposure, V4L2_EXPOSURE_MANUAL,
1307  			       true);
1308  
1309  	return 0;
1310  }
1311  
1312  /* this function is called at probe and resume time */
sd_init(struct gspca_dev * gspca_dev)1313  static int sd_init(struct gspca_dev *gspca_dev)
1314  {
1315  	struct sd *sd = (struct sd *) gspca_dev;
1316  	u16 sensor_id;
1317  	static const struct reg_array bridge_init[NSENSORS] = {
1318  	[SENSOR_OV767x] = {bridge_init_767x, ARRAY_SIZE(bridge_init_767x)},
1319  	[SENSOR_OV772x] = {bridge_init_772x, ARRAY_SIZE(bridge_init_772x)},
1320  	};
1321  	static const struct reg_array sensor_init[NSENSORS] = {
1322  	[SENSOR_OV767x] = {sensor_init_767x, ARRAY_SIZE(sensor_init_767x)},
1323  	[SENSOR_OV772x] = {sensor_init_772x, ARRAY_SIZE(sensor_init_772x)},
1324  	};
1325  
1326  	/* reset bridge */
1327  	ov534_reg_write(gspca_dev, 0xe7, 0x3a);
1328  	ov534_reg_write(gspca_dev, 0xe0, 0x08);
1329  	msleep(100);
1330  
1331  	/* initialize the sensor address */
1332  	ov534_reg_write(gspca_dev, OV534_REG_ADDRESS, 0x42);
1333  
1334  	/* reset sensor */
1335  	sccb_reg_write(gspca_dev, 0x12, 0x80);
1336  	usleep_range(10000, 20000);
1337  
1338  	/* probe the sensor */
1339  	sccb_reg_read(gspca_dev, 0x0a);
1340  	sensor_id = sccb_reg_read(gspca_dev, 0x0a) << 8;
1341  	sccb_reg_read(gspca_dev, 0x0b);
1342  	sensor_id |= sccb_reg_read(gspca_dev, 0x0b);
1343  	gspca_dbg(gspca_dev, D_PROBE, "Sensor ID: %04x\n", sensor_id);
1344  
1345  	if ((sensor_id & 0xfff0) == 0x7670) {
1346  		sd->sensor = SENSOR_OV767x;
1347  		gspca_dev->cam.cam_mode = ov767x_mode;
1348  		gspca_dev->cam.nmodes = ARRAY_SIZE(ov767x_mode);
1349  	} else {
1350  		sd->sensor = SENSOR_OV772x;
1351  		gspca_dev->cam.bulk = 1;
1352  		gspca_dev->cam.bulk_size = 16384;
1353  		gspca_dev->cam.bulk_nurbs = 2;
1354  		gspca_dev->cam.mode_framerates = ov772x_framerates;
1355  	}
1356  
1357  	/* initialize */
1358  	reg_w_array(gspca_dev, bridge_init[sd->sensor].val,
1359  			bridge_init[sd->sensor].len);
1360  	ov534_set_led(gspca_dev, 1);
1361  	sccb_w_array(gspca_dev, sensor_init[sd->sensor].val,
1362  			sensor_init[sd->sensor].len);
1363  
1364  	sd_stopN(gspca_dev);
1365  /*	set_frame_rate(gspca_dev);	*/
1366  
1367  	return gspca_dev->usb_err;
1368  }
1369  
sd_start(struct gspca_dev * gspca_dev)1370  static int sd_start(struct gspca_dev *gspca_dev)
1371  {
1372  	struct sd *sd = (struct sd *) gspca_dev;
1373  	int mode;
1374  	static const struct reg_array bridge_start[NSENSORS][4] = {
1375  	[SENSOR_OV767x] = {{bridge_start_qvga_767x,
1376  					ARRAY_SIZE(bridge_start_qvga_767x)},
1377  			{bridge_start_vga_767x,
1378  					ARRAY_SIZE(bridge_start_vga_767x)}},
1379  	[SENSOR_OV772x] = {{bridge_start_qvga_yuyv_772x,
1380  				ARRAY_SIZE(bridge_start_qvga_yuyv_772x)},
1381  			{bridge_start_vga_yuyv_772x,
1382  				ARRAY_SIZE(bridge_start_vga_yuyv_772x)},
1383  			{bridge_start_qvga_gbrg_772x,
1384  				ARRAY_SIZE(bridge_start_qvga_gbrg_772x)},
1385  			{bridge_start_vga_gbrg_772x,
1386  				ARRAY_SIZE(bridge_start_vga_gbrg_772x)} },
1387  	};
1388  	static const struct reg_array sensor_start[NSENSORS][4] = {
1389  	[SENSOR_OV767x] = {{sensor_start_qvga_767x,
1390  					ARRAY_SIZE(sensor_start_qvga_767x)},
1391  			{sensor_start_vga_767x,
1392  					ARRAY_SIZE(sensor_start_vga_767x)}},
1393  	[SENSOR_OV772x] = {{sensor_start_qvga_yuyv_772x,
1394  				ARRAY_SIZE(sensor_start_qvga_yuyv_772x)},
1395  			{sensor_start_vga_yuyv_772x,
1396  				ARRAY_SIZE(sensor_start_vga_yuyv_772x)},
1397  			{sensor_start_qvga_gbrg_772x,
1398  				ARRAY_SIZE(sensor_start_qvga_gbrg_772x)},
1399  			{sensor_start_vga_gbrg_772x,
1400  				ARRAY_SIZE(sensor_start_vga_gbrg_772x)} },
1401  	};
1402  
1403  	/* (from ms-win trace) */
1404  	if (sd->sensor == SENSOR_OV767x)
1405  		sccb_reg_write(gspca_dev, 0x1e, 0x04);
1406  					/* black sun enable ? */
1407  
1408  	mode = gspca_dev->curr_mode;	/* 0: 320x240, 1: 640x480 */
1409  	reg_w_array(gspca_dev, bridge_start[sd->sensor][mode].val,
1410  				bridge_start[sd->sensor][mode].len);
1411  	sccb_w_array(gspca_dev, sensor_start[sd->sensor][mode].val,
1412  				sensor_start[sd->sensor][mode].len);
1413  
1414  	set_frame_rate(gspca_dev);
1415  
1416  	if (sd->hue)
1417  		sethue(gspca_dev, v4l2_ctrl_g_ctrl(sd->hue));
1418  	setsaturation(gspca_dev, v4l2_ctrl_g_ctrl(sd->saturation));
1419  	if (sd->autogain)
1420  		setagc(gspca_dev, v4l2_ctrl_g_ctrl(sd->autogain));
1421  	setawb(gspca_dev, v4l2_ctrl_g_ctrl(sd->autowhitebalance));
1422  	setaec(gspca_dev, v4l2_ctrl_g_ctrl(sd->autoexposure));
1423  	if (sd->gain)
1424  		setgain(gspca_dev, v4l2_ctrl_g_ctrl(sd->gain));
1425  	setexposure(gspca_dev, v4l2_ctrl_g_ctrl(sd->exposure));
1426  	setbrightness(gspca_dev, v4l2_ctrl_g_ctrl(sd->brightness));
1427  	setcontrast(gspca_dev, v4l2_ctrl_g_ctrl(sd->contrast));
1428  	if (sd->sharpness)
1429  		setsharpness(gspca_dev, v4l2_ctrl_g_ctrl(sd->sharpness));
1430  	sethvflip(gspca_dev, v4l2_ctrl_g_ctrl(sd->hflip),
1431  		  v4l2_ctrl_g_ctrl(sd->vflip));
1432  	setlightfreq(gspca_dev, v4l2_ctrl_g_ctrl(sd->plfreq));
1433  
1434  	ov534_set_led(gspca_dev, 1);
1435  	ov534_reg_write(gspca_dev, 0xe0, 0x00);
1436  	return gspca_dev->usb_err;
1437  }
1438  
sd_stopN(struct gspca_dev * gspca_dev)1439  static void sd_stopN(struct gspca_dev *gspca_dev)
1440  {
1441  	ov534_reg_write(gspca_dev, 0xe0, 0x09);
1442  	ov534_set_led(gspca_dev, 0);
1443  }
1444  
1445  /* Values for bmHeaderInfo (Video and Still Image Payload Headers, 2.4.3.3) */
1446  #define UVC_STREAM_EOH	(1 << 7)
1447  #define UVC_STREAM_ERR	(1 << 6)
1448  #define UVC_STREAM_STI	(1 << 5)
1449  #define UVC_STREAM_RES	(1 << 4)
1450  #define UVC_STREAM_SCR	(1 << 3)
1451  #define UVC_STREAM_PTS	(1 << 2)
1452  #define UVC_STREAM_EOF	(1 << 1)
1453  #define UVC_STREAM_FID	(1 << 0)
1454  
sd_pkt_scan(struct gspca_dev * gspca_dev,u8 * data,int len)1455  static void sd_pkt_scan(struct gspca_dev *gspca_dev,
1456  			u8 *data, int len)
1457  {
1458  	struct sd *sd = (struct sd *) gspca_dev;
1459  	__u32 this_pts;
1460  	u16 this_fid;
1461  	int remaining_len = len;
1462  	int payload_len;
1463  
1464  	payload_len = gspca_dev->cam.bulk ? 2048 : 2040;
1465  	do {
1466  		len = min(remaining_len, payload_len);
1467  
1468  		/* Payloads are prefixed with a UVC-style header.  We
1469  		   consider a frame to start when the FID toggles, or the PTS
1470  		   changes.  A frame ends when EOF is set, and we've received
1471  		   the correct number of bytes. */
1472  
1473  		/* Verify UVC header.  Header length is always 12 */
1474  		if (data[0] != 12 || len < 12) {
1475  			gspca_dbg(gspca_dev, D_PACK, "bad header\n");
1476  			goto discard;
1477  		}
1478  
1479  		/* Check errors */
1480  		if (data[1] & UVC_STREAM_ERR) {
1481  			gspca_dbg(gspca_dev, D_PACK, "payload error\n");
1482  			goto discard;
1483  		}
1484  
1485  		/* Extract PTS and FID */
1486  		if (!(data[1] & UVC_STREAM_PTS)) {
1487  			gspca_dbg(gspca_dev, D_PACK, "PTS not present\n");
1488  			goto discard;
1489  		}
1490  		this_pts = (data[5] << 24) | (data[4] << 16)
1491  						| (data[3] << 8) | data[2];
1492  		this_fid = (data[1] & UVC_STREAM_FID) ? 1 : 0;
1493  
1494  		/* If PTS or FID has changed, start a new frame. */
1495  		if (this_pts != sd->last_pts || this_fid != sd->last_fid) {
1496  			if (gspca_dev->last_packet_type == INTER_PACKET)
1497  				gspca_frame_add(gspca_dev, LAST_PACKET,
1498  						NULL, 0);
1499  			sd->last_pts = this_pts;
1500  			sd->last_fid = this_fid;
1501  			gspca_frame_add(gspca_dev, FIRST_PACKET,
1502  					data + 12, len - 12);
1503  		/* If this packet is marked as EOF, end the frame */
1504  		} else if (data[1] & UVC_STREAM_EOF) {
1505  			sd->last_pts = 0;
1506  			if (gspca_dev->pixfmt.pixelformat != V4L2_PIX_FMT_JPEG
1507  			 && gspca_dev->image_len + len - 12 !=
1508  			    gspca_dev->pixfmt.sizeimage) {
1509  				gspca_dbg(gspca_dev, D_PACK, "wrong sized frame\n");
1510  				goto discard;
1511  			}
1512  			gspca_frame_add(gspca_dev, LAST_PACKET,
1513  					data + 12, len - 12);
1514  		} else {
1515  
1516  			/* Add the data from this payload */
1517  			gspca_frame_add(gspca_dev, INTER_PACKET,
1518  					data + 12, len - 12);
1519  		}
1520  
1521  		/* Done this payload */
1522  		goto scan_next;
1523  
1524  discard:
1525  		/* Discard data until a new frame starts. */
1526  		gspca_dev->last_packet_type = DISCARD_PACKET;
1527  
1528  scan_next:
1529  		remaining_len -= len;
1530  		data += len;
1531  	} while (remaining_len > 0);
1532  }
1533  
1534  /* get stream parameters (framerate) */
sd_get_streamparm(struct gspca_dev * gspca_dev,struct v4l2_streamparm * parm)1535  static void sd_get_streamparm(struct gspca_dev *gspca_dev,
1536  			     struct v4l2_streamparm *parm)
1537  {
1538  	struct v4l2_captureparm *cp = &parm->parm.capture;
1539  	struct v4l2_fract *tpf = &cp->timeperframe;
1540  	struct sd *sd = (struct sd *) gspca_dev;
1541  
1542  	tpf->numerator = 1;
1543  	tpf->denominator = sd->frame_rate;
1544  }
1545  
1546  /* set stream parameters (framerate) */
sd_set_streamparm(struct gspca_dev * gspca_dev,struct v4l2_streamparm * parm)1547  static void sd_set_streamparm(struct gspca_dev *gspca_dev,
1548  			     struct v4l2_streamparm *parm)
1549  {
1550  	struct v4l2_captureparm *cp = &parm->parm.capture;
1551  	struct v4l2_fract *tpf = &cp->timeperframe;
1552  	struct sd *sd = (struct sd *) gspca_dev;
1553  
1554  	if (tpf->numerator == 0 || tpf->denominator == 0)
1555  		sd->frame_rate = DEFAULT_FRAME_RATE;
1556  	else
1557  		sd->frame_rate = tpf->denominator / tpf->numerator;
1558  
1559  	if (gspca_dev->streaming)
1560  		set_frame_rate(gspca_dev);
1561  
1562  	/* Return the actual framerate */
1563  	tpf->numerator = 1;
1564  	tpf->denominator = sd->frame_rate;
1565  }
1566  
1567  /* sub-driver description */
1568  static const struct sd_desc sd_desc = {
1569  	.name     = MODULE_NAME,
1570  	.config   = sd_config,
1571  	.init     = sd_init,
1572  	.init_controls = sd_init_controls,
1573  	.start    = sd_start,
1574  	.stopN    = sd_stopN,
1575  	.pkt_scan = sd_pkt_scan,
1576  	.get_streamparm = sd_get_streamparm,
1577  	.set_streamparm = sd_set_streamparm,
1578  };
1579  
1580  /* -- module initialisation -- */
1581  static const struct usb_device_id device_table[] = {
1582  	{USB_DEVICE(0x1415, 0x2000)},
1583  	{USB_DEVICE(0x06f8, 0x3002)},
1584  	{}
1585  };
1586  
1587  MODULE_DEVICE_TABLE(usb, device_table);
1588  
1589  /* -- device connect -- */
sd_probe(struct usb_interface * intf,const struct usb_device_id * id)1590  static int sd_probe(struct usb_interface *intf, const struct usb_device_id *id)
1591  {
1592  	return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
1593  				THIS_MODULE);
1594  }
1595  
1596  static struct usb_driver sd_driver = {
1597  	.name       = MODULE_NAME,
1598  	.id_table   = device_table,
1599  	.probe      = sd_probe,
1600  	.disconnect = gspca_disconnect,
1601  #ifdef CONFIG_PM
1602  	.suspend    = gspca_suspend,
1603  	.resume     = gspca_resume,
1604  	.reset_resume = gspca_resume,
1605  #endif
1606  };
1607  
1608  module_usb_driver(sd_driver);
1609