]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - drivers/media/usb/gspca/sonixb.c
Merge tag 'media/v4.11-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab...
[mirror_ubuntu-artful-kernel.git] / drivers / media / usb / gspca / sonixb.c
1 /*
2 * sonix sn9c102 (bayer) library
3 *
4 * Copyright (C) 2009-2011 Jean-François Moine <http://moinejf.free.fr>
5 * Copyright (C) 2003 2004 Michel Xhaard mxhaard@magic.fr
6 * Add Pas106 Stefano Mozzi (C) 2004
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 */
18
19 /* Some documentation on known sonixb registers:
20
21 Reg Use
22 sn9c101 / sn9c102:
23 0x10 high nibble red gain low nibble blue gain
24 0x11 low nibble green gain
25 sn9c103:
26 0x05 red gain 0-127
27 0x06 blue gain 0-127
28 0x07 green gain 0-127
29 all:
30 0x08-0x0f i2c / 3wire registers
31 0x12 hstart
32 0x13 vstart
33 0x15 hsize (hsize = register-value * 16)
34 0x16 vsize (vsize = register-value * 16)
35 0x17 bit 0 toggle compression quality (according to sn9c102 driver)
36 0x18 bit 7 enables compression, bit 4-5 set image down scaling:
37 00 scale 1, 01 scale 1/2, 10, scale 1/4
38 0x19 high-nibble is sensor clock divider, changes exposure on sensors which
39 use a clock generated by the bridge. Some sensors have their own clock.
40 0x1c auto_exposure area (for avg_lum) startx (startx = register-value * 32)
41 0x1d auto_exposure area (for avg_lum) starty (starty = register-value * 32)
42 0x1e auto_exposure area (for avg_lum) stopx (hsize = (0x1e - 0x1c) * 32)
43 0x1f auto_exposure area (for avg_lum) stopy (vsize = (0x1f - 0x1d) * 32)
44 */
45
46 #define MODULE_NAME "sonixb"
47
48 #include <linux/input.h>
49 #include "gspca.h"
50
51 MODULE_AUTHOR("Jean-François Moine <http://moinejf.free.fr>");
52 MODULE_DESCRIPTION("GSPCA/SN9C102 USB Camera Driver");
53 MODULE_LICENSE("GPL");
54
55 /* specific webcam descriptor */
56 struct sd {
57 struct gspca_dev gspca_dev; /* !! must be the first item */
58
59 struct v4l2_ctrl *brightness;
60 struct v4l2_ctrl *plfreq;
61
62 atomic_t avg_lum;
63 int prev_avg_lum;
64 int exposure_knee;
65 int header_read;
66 u8 header[12]; /* Header without sof marker */
67
68 unsigned char autogain_ignore_frames;
69 unsigned char frames_to_drop;
70
71 __u8 bridge; /* Type of bridge */
72 #define BRIDGE_101 0
73 #define BRIDGE_102 0 /* We make no difference between 101 and 102 */
74 #define BRIDGE_103 1
75
76 __u8 sensor; /* Type of image sensor chip */
77 #define SENSOR_HV7131D 0
78 #define SENSOR_HV7131R 1
79 #define SENSOR_OV6650 2
80 #define SENSOR_OV7630 3
81 #define SENSOR_PAS106 4
82 #define SENSOR_PAS202 5
83 #define SENSOR_TAS5110C 6
84 #define SENSOR_TAS5110D 7
85 #define SENSOR_TAS5130CXX 8
86 __u8 reg11;
87 };
88
89 typedef const __u8 sensor_init_t[8];
90
91 struct sensor_data {
92 const __u8 *bridge_init;
93 sensor_init_t *sensor_init;
94 int sensor_init_size;
95 int flags;
96 __u8 sensor_addr;
97 };
98
99 /* sensor_data flags */
100 #define F_SIF 0x01 /* sif or vga */
101
102 /* priv field of struct v4l2_pix_format flags (do not use low nibble!) */
103 #define MODE_RAW 0x10 /* raw bayer mode */
104 #define MODE_REDUCED_SIF 0x20 /* vga mode (320x240 / 160x120) on sif cam */
105
106 #define COMP 0xc7 /* 0x87 //0x07 */
107 #define COMP1 0xc9 /* 0x89 //0x09 */
108
109 #define MCK_INIT 0x63
110 #define MCK_INIT1 0x20 /*fixme: Bayer - 0x50 for JPEG ??*/
111
112 #define SYS_CLK 0x04
113
114 #define SENS(bridge, sensor, _flags, _sensor_addr) \
115 { \
116 .bridge_init = bridge, \
117 .sensor_init = sensor, \
118 .sensor_init_size = sizeof(sensor), \
119 .flags = _flags, .sensor_addr = _sensor_addr \
120 }
121
122 /* We calculate the autogain at the end of the transfer of a frame, at this
123 moment a frame with the old settings is being captured and transmitted. So
124 if we adjust the gain or exposure we must ignore atleast the next frame for
125 the new settings to come into effect before doing any other adjustments. */
126 #define AUTOGAIN_IGNORE_FRAMES 1
127
128 static const struct v4l2_pix_format vga_mode[] = {
129 {160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
130 .bytesperline = 160,
131 .sizeimage = 160 * 120,
132 .colorspace = V4L2_COLORSPACE_SRGB,
133 .priv = 2 | MODE_RAW},
134 {160, 120, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
135 .bytesperline = 160,
136 .sizeimage = 160 * 120 * 5 / 4,
137 .colorspace = V4L2_COLORSPACE_SRGB,
138 .priv = 2},
139 {320, 240, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
140 .bytesperline = 320,
141 .sizeimage = 320 * 240 * 5 / 4,
142 .colorspace = V4L2_COLORSPACE_SRGB,
143 .priv = 1},
144 {640, 480, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
145 .bytesperline = 640,
146 .sizeimage = 640 * 480 * 5 / 4,
147 .colorspace = V4L2_COLORSPACE_SRGB,
148 .priv = 0},
149 };
150 static const struct v4l2_pix_format sif_mode[] = {
151 {160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
152 .bytesperline = 160,
153 .sizeimage = 160 * 120,
154 .colorspace = V4L2_COLORSPACE_SRGB,
155 .priv = 1 | MODE_RAW | MODE_REDUCED_SIF},
156 {160, 120, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
157 .bytesperline = 160,
158 .sizeimage = 160 * 120 * 5 / 4,
159 .colorspace = V4L2_COLORSPACE_SRGB,
160 .priv = 1 | MODE_REDUCED_SIF},
161 {176, 144, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
162 .bytesperline = 176,
163 .sizeimage = 176 * 144,
164 .colorspace = V4L2_COLORSPACE_SRGB,
165 .priv = 1 | MODE_RAW},
166 {176, 144, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
167 .bytesperline = 176,
168 .sizeimage = 176 * 144 * 5 / 4,
169 .colorspace = V4L2_COLORSPACE_SRGB,
170 .priv = 1},
171 {320, 240, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
172 .bytesperline = 320,
173 .sizeimage = 320 * 240 * 5 / 4,
174 .colorspace = V4L2_COLORSPACE_SRGB,
175 .priv = 0 | MODE_REDUCED_SIF},
176 {352, 288, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
177 .bytesperline = 352,
178 .sizeimage = 352 * 288 * 5 / 4,
179 .colorspace = V4L2_COLORSPACE_SRGB,
180 .priv = 0},
181 };
182
183 static const __u8 initHv7131d[] = {
184 0x04, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x00,
185 0x00, 0x00,
186 0x00, 0x00, 0x00, 0x02, 0x02, 0x00,
187 0x28, 0x1e, 0x60, 0x8e, 0x42,
188 };
189 static const __u8 hv7131d_sensor_init[][8] = {
190 {0xa0, 0x11, 0x01, 0x04, 0x00, 0x00, 0x00, 0x17},
191 {0xa0, 0x11, 0x02, 0x00, 0x00, 0x00, 0x00, 0x17},
192 {0xa0, 0x11, 0x28, 0x00, 0x00, 0x00, 0x00, 0x17},
193 {0xa0, 0x11, 0x30, 0x30, 0x00, 0x00, 0x00, 0x17}, /* reset level */
194 {0xa0, 0x11, 0x34, 0x02, 0x00, 0x00, 0x00, 0x17}, /* pixel bias volt */
195 };
196
197 static const __u8 initHv7131r[] = {
198 0x46, 0x77, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x00,
199 0x00, 0x00,
200 0x00, 0x00, 0x00, 0x02, 0x01, 0x00,
201 0x28, 0x1e, 0x60, 0x8a, 0x20,
202 };
203 static const __u8 hv7131r_sensor_init[][8] = {
204 {0xc0, 0x11, 0x31, 0x38, 0x2a, 0x2e, 0x00, 0x10},
205 {0xa0, 0x11, 0x01, 0x08, 0x2a, 0x2e, 0x00, 0x10},
206 {0xb0, 0x11, 0x20, 0x00, 0xd0, 0x2e, 0x00, 0x10},
207 {0xc0, 0x11, 0x25, 0x03, 0x0e, 0x28, 0x00, 0x16},
208 {0xa0, 0x11, 0x30, 0x10, 0x0e, 0x28, 0x00, 0x15},
209 };
210 static const __u8 initOv6650[] = {
211 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
212 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213 0x00, 0x01, 0x01, 0x0a, 0x16, 0x12, 0x68, 0x8b,
214 0x10,
215 };
216 static const __u8 ov6650_sensor_init[][8] = {
217 /* Bright, contrast, etc are set through SCBB interface.
218 * AVCAP on win2 do not send any data on this controls. */
219 /* Anyway, some registers appears to alter bright and constrat */
220
221 /* Reset sensor */
222 {0xa0, 0x60, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10},
223 /* Set clock register 0x11 low nibble is clock divider */
224 {0xd0, 0x60, 0x11, 0xc0, 0x1b, 0x18, 0xc1, 0x10},
225 /* Next some unknown stuff */
226 {0xb0, 0x60, 0x15, 0x00, 0x02, 0x18, 0xc1, 0x10},
227 /* {0xa0, 0x60, 0x1b, 0x01, 0x02, 0x18, 0xc1, 0x10},
228 * THIS SET GREEN SCREEN
229 * (pixels could be innverted in decode kind of "brg",
230 * but blue wont be there. Avoid this data ... */
231 {0xd0, 0x60, 0x26, 0x01, 0x14, 0xd8, 0xa4, 0x10}, /* format out? */
232 {0xd0, 0x60, 0x26, 0x01, 0x14, 0xd8, 0xa4, 0x10},
233 {0xa0, 0x60, 0x30, 0x3d, 0x0a, 0xd8, 0xa4, 0x10},
234 /* Enable rgb brightness control */
235 {0xa0, 0x60, 0x61, 0x08, 0x00, 0x00, 0x00, 0x10},
236 /* HDG: Note windows uses the line below, which sets both register 0x60
237 and 0x61 I believe these registers of the ov6650 are identical as
238 those of the ov7630, because if this is true the windows settings
239 add a bit additional red gain and a lot additional blue gain, which
240 matches my findings that the windows settings make blue much too
241 blue and red a little too red.
242 {0xb0, 0x60, 0x60, 0x66, 0x68, 0xd8, 0xa4, 0x10}, */
243 /* Some more unknown stuff */
244 {0xa0, 0x60, 0x68, 0x04, 0x68, 0xd8, 0xa4, 0x10},
245 {0xd0, 0x60, 0x17, 0x24, 0xd6, 0x04, 0x94, 0x10}, /* Clipreg */
246 };
247
248 static const __u8 initOv7630[] = {
249 0x04, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* r01 .. r08 */
250 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* r09 .. r10 */
251 0x00, 0x01, 0x01, 0x0a, /* r11 .. r14 */
252 0x28, 0x1e, /* H & V sizes r15 .. r16 */
253 0x68, 0x8f, MCK_INIT1, /* r17 .. r19 */
254 };
255 static const __u8 ov7630_sensor_init[][8] = {
256 {0xa0, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10},
257 {0xb0, 0x21, 0x01, 0x77, 0x3a, 0x00, 0x00, 0x10},
258 /* {0xd0, 0x21, 0x12, 0x7c, 0x01, 0x80, 0x34, 0x10}, jfm */
259 {0xd0, 0x21, 0x12, 0x5c, 0x00, 0x80, 0x34, 0x10}, /* jfm */
260 {0xa0, 0x21, 0x1b, 0x04, 0x00, 0x80, 0x34, 0x10},
261 {0xa0, 0x21, 0x20, 0x44, 0x00, 0x80, 0x34, 0x10},
262 {0xa0, 0x21, 0x23, 0xee, 0x00, 0x80, 0x34, 0x10},
263 {0xd0, 0x21, 0x26, 0xa0, 0x9a, 0xa0, 0x30, 0x10},
264 {0xb0, 0x21, 0x2a, 0x80, 0x00, 0xa0, 0x30, 0x10},
265 {0xb0, 0x21, 0x2f, 0x3d, 0x24, 0xa0, 0x30, 0x10},
266 {0xa0, 0x21, 0x32, 0x86, 0x24, 0xa0, 0x30, 0x10},
267 {0xb0, 0x21, 0x60, 0xa9, 0x4a, 0xa0, 0x30, 0x10},
268 /* {0xb0, 0x21, 0x60, 0xa9, 0x42, 0xa0, 0x30, 0x10}, * jfm */
269 {0xa0, 0x21, 0x65, 0x00, 0x42, 0xa0, 0x30, 0x10},
270 {0xa0, 0x21, 0x69, 0x38, 0x42, 0xa0, 0x30, 0x10},
271 {0xc0, 0x21, 0x6f, 0x88, 0x0b, 0x00, 0x30, 0x10},
272 {0xc0, 0x21, 0x74, 0x21, 0x8e, 0x00, 0x30, 0x10},
273 {0xa0, 0x21, 0x7d, 0xf7, 0x8e, 0x00, 0x30, 0x10},
274 {0xd0, 0x21, 0x17, 0x1c, 0xbd, 0x06, 0xf6, 0x10},
275 };
276
277 static const __u8 initPas106[] = {
278 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x40, 0x00, 0x00, 0x00,
279 0x00, 0x00,
280 0x00, 0x00, 0x00, 0x04, 0x01, 0x00,
281 0x16, 0x12, 0x24, COMP1, MCK_INIT1,
282 };
283 /* compression 0x86 mckinit1 0x2b */
284
285 /* "Known" PAS106B registers:
286 0x02 clock divider
287 0x03 Variable framerate bits 4-11
288 0x04 Var framerate bits 0-3, one must leave the 4 msb's at 0 !!
289 The variable framerate control must never be set lower then 300,
290 which sets the framerate at 90 / reg02, otherwise vsync is lost.
291 0x05 Shutter Time Line Offset, this can be used as an exposure control:
292 0 = use full frame time, 255 = no exposure at all
293 Note this may never be larger then "var-framerate control" / 2 - 2.
294 When var-framerate control is < 514, no exposure is reached at the max
295 allowed value for the framerate control value, rather then at 255.
296 0x06 Shutter Time Pixel Offset, like reg05 this influences exposure, but
297 only a very little bit, leave at 0xcd
298 0x07 offset sign bit (bit0 1 > negative offset)
299 0x08 offset
300 0x09 Blue Gain
301 0x0a Green1 Gain
302 0x0b Green2 Gain
303 0x0c Red Gain
304 0x0e Global gain
305 0x13 Write 1 to commit settings to sensor
306 */
307
308 static const __u8 pas106_sensor_init[][8] = {
309 /* Pixel Clock Divider 6 */
310 { 0xa1, 0x40, 0x02, 0x04, 0x00, 0x00, 0x00, 0x14 },
311 /* Frame Time MSB (also seen as 0x12) */
312 { 0xa1, 0x40, 0x03, 0x13, 0x00, 0x00, 0x00, 0x14 },
313 /* Frame Time LSB (also seen as 0x05) */
314 { 0xa1, 0x40, 0x04, 0x06, 0x00, 0x00, 0x00, 0x14 },
315 /* Shutter Time Line Offset (also seen as 0x6d) */
316 { 0xa1, 0x40, 0x05, 0x65, 0x00, 0x00, 0x00, 0x14 },
317 /* Shutter Time Pixel Offset (also seen as 0xb1) */
318 { 0xa1, 0x40, 0x06, 0xcd, 0x00, 0x00, 0x00, 0x14 },
319 /* Black Level Subtract Sign (also seen 0x00) */
320 { 0xa1, 0x40, 0x07, 0xc1, 0x00, 0x00, 0x00, 0x14 },
321 /* Black Level Subtract Level (also seen 0x01) */
322 { 0xa1, 0x40, 0x08, 0x06, 0x00, 0x00, 0x00, 0x14 },
323 { 0xa1, 0x40, 0x08, 0x06, 0x00, 0x00, 0x00, 0x14 },
324 /* Color Gain B Pixel 5 a */
325 { 0xa1, 0x40, 0x09, 0x05, 0x00, 0x00, 0x00, 0x14 },
326 /* Color Gain G1 Pixel 1 5 */
327 { 0xa1, 0x40, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x14 },
328 /* Color Gain G2 Pixel 1 0 5 */
329 { 0xa1, 0x40, 0x0b, 0x04, 0x00, 0x00, 0x00, 0x14 },
330 /* Color Gain R Pixel 3 1 */
331 { 0xa1, 0x40, 0x0c, 0x05, 0x00, 0x00, 0x00, 0x14 },
332 /* Color GainH Pixel */
333 { 0xa1, 0x40, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x14 },
334 /* Global Gain */
335 { 0xa1, 0x40, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x14 },
336 /* Contrast */
337 { 0xa1, 0x40, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x14 },
338 /* H&V synchro polarity */
339 { 0xa1, 0x40, 0x10, 0x06, 0x00, 0x00, 0x00, 0x14 },
340 /* ?default */
341 { 0xa1, 0x40, 0x11, 0x06, 0x00, 0x00, 0x00, 0x14 },
342 /* DAC scale */
343 { 0xa1, 0x40, 0x12, 0x06, 0x00, 0x00, 0x00, 0x14 },
344 /* ?default */
345 { 0xa1, 0x40, 0x14, 0x02, 0x00, 0x00, 0x00, 0x14 },
346 /* Validate Settings */
347 { 0xa1, 0x40, 0x13, 0x01, 0x00, 0x00, 0x00, 0x14 },
348 };
349
350 static const __u8 initPas202[] = {
351 0x44, 0x44, 0x21, 0x30, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00,
352 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x06, 0x03, 0x0a,
354 0x28, 0x1e, 0x20, 0x89, 0x20,
355 };
356
357 /* "Known" PAS202BCB registers:
358 0x02 clock divider
359 0x04 Variable framerate bits 6-11 (*)
360 0x05 Var framerate bits 0-5, one must leave the 2 msb's at 0 !!
361 0x07 Blue Gain
362 0x08 Green Gain
363 0x09 Red Gain
364 0x0b offset sign bit (bit0 1 > negative offset)
365 0x0c offset
366 0x0e Unknown image is slightly brighter when bit 0 is 0, if reg0f is 0 too,
367 leave at 1 otherwise we get a jump in our exposure control
368 0x0f Exposure 0-255, 0 = use full frame time, 255 = no exposure at all
369 0x10 Master gain 0 - 31
370 0x11 write 1 to apply changes
371 (*) The variable framerate control must never be set lower then 500
372 which sets the framerate at 30 / reg02, otherwise vsync is lost.
373 */
374 static const __u8 pas202_sensor_init[][8] = {
375 /* Set the clock divider to 4 -> 30 / 4 = 7.5 fps, we would like
376 to set it lower, but for some reason the bridge starts missing
377 vsync's then */
378 {0xa0, 0x40, 0x02, 0x04, 0x00, 0x00, 0x00, 0x10},
379 {0xd0, 0x40, 0x04, 0x07, 0x34, 0x00, 0x09, 0x10},
380 {0xd0, 0x40, 0x08, 0x01, 0x00, 0x00, 0x01, 0x10},
381 {0xd0, 0x40, 0x0c, 0x00, 0x0c, 0x01, 0x32, 0x10},
382 {0xd0, 0x40, 0x10, 0x00, 0x01, 0x00, 0x63, 0x10},
383 {0xa0, 0x40, 0x15, 0x70, 0x01, 0x00, 0x63, 0x10},
384 {0xa0, 0x40, 0x18, 0x00, 0x01, 0x00, 0x63, 0x10},
385 {0xa0, 0x40, 0x11, 0x01, 0x01, 0x00, 0x63, 0x10},
386 {0xa0, 0x40, 0x03, 0x56, 0x01, 0x00, 0x63, 0x10},
387 {0xa0, 0x40, 0x11, 0x01, 0x01, 0x00, 0x63, 0x10},
388 };
389
390 static const __u8 initTas5110c[] = {
391 0x44, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x11, 0x00, 0x00, 0x00,
392 0x00, 0x00,
393 0x00, 0x00, 0x00, 0x45, 0x09, 0x0a,
394 0x16, 0x12, 0x60, 0x86, 0x2b,
395 };
396 /* Same as above, except a different hstart */
397 static const __u8 initTas5110d[] = {
398 0x44, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x11, 0x00, 0x00, 0x00,
399 0x00, 0x00,
400 0x00, 0x00, 0x00, 0x41, 0x09, 0x0a,
401 0x16, 0x12, 0x60, 0x86, 0x2b,
402 };
403 /* tas5110c is 3 wire, tas5110d is 2 wire (regular i2c) */
404 static const __u8 tas5110c_sensor_init[][8] = {
405 {0x30, 0x11, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x10},
406 {0x30, 0x11, 0x02, 0x20, 0xa9, 0x00, 0x00, 0x10},
407 };
408 /* Known TAS5110D registers
409 * reg02: gain, bit order reversed!! 0 == max gain, 255 == min gain
410 * reg03: bit3: vflip, bit4: ~hflip, bit7: ~gainboost (~ == inverted)
411 * Note: writing reg03 seems to only work when written together with 02
412 */
413 static const __u8 tas5110d_sensor_init[][8] = {
414 {0xa0, 0x61, 0x9a, 0xca, 0x00, 0x00, 0x00, 0x17}, /* reset */
415 };
416
417 static const __u8 initTas5130[] = {
418 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x11, 0x00, 0x00, 0x00,
419 0x00, 0x00,
420 0x00, 0x00, 0x00, 0x68, 0x0c, 0x0a,
421 0x28, 0x1e, 0x60, COMP, MCK_INIT,
422 };
423 static const __u8 tas5130_sensor_init[][8] = {
424 /* {0x30, 0x11, 0x00, 0x40, 0x47, 0x00, 0x00, 0x10},
425 * shutter 0x47 short exposure? */
426 {0x30, 0x11, 0x00, 0x40, 0x01, 0x00, 0x00, 0x10},
427 /* shutter 0x01 long exposure */
428 {0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10},
429 };
430
431 static const struct sensor_data sensor_data[] = {
432 SENS(initHv7131d, hv7131d_sensor_init, 0, 0),
433 SENS(initHv7131r, hv7131r_sensor_init, 0, 0),
434 SENS(initOv6650, ov6650_sensor_init, F_SIF, 0x60),
435 SENS(initOv7630, ov7630_sensor_init, 0, 0x21),
436 SENS(initPas106, pas106_sensor_init, F_SIF, 0),
437 SENS(initPas202, pas202_sensor_init, 0, 0),
438 SENS(initTas5110c, tas5110c_sensor_init, F_SIF, 0),
439 SENS(initTas5110d, tas5110d_sensor_init, F_SIF, 0),
440 SENS(initTas5130, tas5130_sensor_init, 0, 0),
441 };
442
443 /* get one byte in gspca_dev->usb_buf */
444 static void reg_r(struct gspca_dev *gspca_dev,
445 __u16 value)
446 {
447 int res;
448
449 if (gspca_dev->usb_err < 0)
450 return;
451
452 res = usb_control_msg(gspca_dev->dev,
453 usb_rcvctrlpipe(gspca_dev->dev, 0),
454 0, /* request */
455 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
456 value,
457 0, /* index */
458 gspca_dev->usb_buf, 1,
459 500);
460
461 if (res < 0) {
462 dev_err(gspca_dev->v4l2_dev.dev,
463 "Error reading register %02x: %d\n", value, res);
464 gspca_dev->usb_err = res;
465 }
466 }
467
468 static void reg_w(struct gspca_dev *gspca_dev,
469 __u16 value,
470 const __u8 *buffer,
471 int len)
472 {
473 int res;
474
475 if (gspca_dev->usb_err < 0)
476 return;
477
478 memcpy(gspca_dev->usb_buf, buffer, len);
479 res = usb_control_msg(gspca_dev->dev,
480 usb_sndctrlpipe(gspca_dev->dev, 0),
481 0x08, /* request */
482 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
483 value,
484 0, /* index */
485 gspca_dev->usb_buf, len,
486 500);
487
488 if (res < 0) {
489 dev_err(gspca_dev->v4l2_dev.dev,
490 "Error writing register %02x: %d\n", value, res);
491 gspca_dev->usb_err = res;
492 }
493 }
494
495 static void i2c_w(struct gspca_dev *gspca_dev, const u8 *buf)
496 {
497 int retry = 60;
498
499 if (gspca_dev->usb_err < 0)
500 return;
501
502 /* is i2c ready */
503 reg_w(gspca_dev, 0x08, buf, 8);
504 while (retry--) {
505 if (gspca_dev->usb_err < 0)
506 return;
507 msleep(1);
508 reg_r(gspca_dev, 0x08);
509 if (gspca_dev->usb_buf[0] & 0x04) {
510 if (gspca_dev->usb_buf[0] & 0x08) {
511 dev_err(gspca_dev->v4l2_dev.dev,
512 "i2c error writing %8ph\n", buf);
513 gspca_dev->usb_err = -EIO;
514 }
515 return;
516 }
517 }
518
519 dev_err(gspca_dev->v4l2_dev.dev, "i2c write timeout\n");
520 gspca_dev->usb_err = -EIO;
521 }
522
523 static void i2c_w_vector(struct gspca_dev *gspca_dev,
524 const __u8 buffer[][8], int len)
525 {
526 for (;;) {
527 if (gspca_dev->usb_err < 0)
528 return;
529 i2c_w(gspca_dev, *buffer);
530 len -= 8;
531 if (len <= 0)
532 break;
533 buffer++;
534 }
535 }
536
537 static void setbrightness(struct gspca_dev *gspca_dev)
538 {
539 struct sd *sd = (struct sd *) gspca_dev;
540
541 switch (sd->sensor) {
542 case SENSOR_OV6650:
543 case SENSOR_OV7630: {
544 __u8 i2cOV[] =
545 {0xa0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x10};
546
547 /* change reg 0x06 */
548 i2cOV[1] = sensor_data[sd->sensor].sensor_addr;
549 i2cOV[3] = sd->brightness->val;
550 i2c_w(gspca_dev, i2cOV);
551 break;
552 }
553 case SENSOR_PAS106:
554 case SENSOR_PAS202: {
555 __u8 i2cpbright[] =
556 {0xb0, 0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x16};
557 __u8 i2cpdoit[] =
558 {0xa0, 0x40, 0x11, 0x01, 0x00, 0x00, 0x00, 0x16};
559
560 /* PAS106 uses reg 7 and 8 instead of b and c */
561 if (sd->sensor == SENSOR_PAS106) {
562 i2cpbright[2] = 7;
563 i2cpdoit[2] = 0x13;
564 }
565
566 if (sd->brightness->val < 127) {
567 /* change reg 0x0b, signreg */
568 i2cpbright[3] = 0x01;
569 /* set reg 0x0c, offset */
570 i2cpbright[4] = 127 - sd->brightness->val;
571 } else
572 i2cpbright[4] = sd->brightness->val - 127;
573
574 i2c_w(gspca_dev, i2cpbright);
575 i2c_w(gspca_dev, i2cpdoit);
576 break;
577 }
578 default:
579 break;
580 }
581 }
582
583 static void setgain(struct gspca_dev *gspca_dev)
584 {
585 struct sd *sd = (struct sd *) gspca_dev;
586 u8 gain = gspca_dev->gain->val;
587
588 switch (sd->sensor) {
589 case SENSOR_HV7131D: {
590 __u8 i2c[] =
591 {0xc0, 0x11, 0x31, 0x00, 0x00, 0x00, 0x00, 0x17};
592
593 i2c[3] = 0x3f - gain;
594 i2c[4] = 0x3f - gain;
595 i2c[5] = 0x3f - gain;
596
597 i2c_w(gspca_dev, i2c);
598 break;
599 }
600 case SENSOR_TAS5110C:
601 case SENSOR_TAS5130CXX: {
602 __u8 i2c[] =
603 {0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10};
604
605 i2c[4] = 255 - gain;
606 i2c_w(gspca_dev, i2c);
607 break;
608 }
609 case SENSOR_TAS5110D: {
610 __u8 i2c[] = {
611 0xb0, 0x61, 0x02, 0x00, 0x10, 0x00, 0x00, 0x17 };
612 gain = 255 - gain;
613 /* The bits in the register are the wrong way around!! */
614 i2c[3] |= (gain & 0x80) >> 7;
615 i2c[3] |= (gain & 0x40) >> 5;
616 i2c[3] |= (gain & 0x20) >> 3;
617 i2c[3] |= (gain & 0x10) >> 1;
618 i2c[3] |= (gain & 0x08) << 1;
619 i2c[3] |= (gain & 0x04) << 3;
620 i2c[3] |= (gain & 0x02) << 5;
621 i2c[3] |= (gain & 0x01) << 7;
622 i2c_w(gspca_dev, i2c);
623 break;
624 }
625 case SENSOR_OV6650:
626 case SENSOR_OV7630: {
627 __u8 i2c[] = {0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
628
629 /*
630 * The ov7630's gain is weird, at 32 the gain drops to the
631 * same level as at 16, so skip 32-47 (of the 0-63 scale).
632 */
633 if (sd->sensor == SENSOR_OV7630 && gain >= 32)
634 gain += 16;
635
636 i2c[1] = sensor_data[sd->sensor].sensor_addr;
637 i2c[3] = gain;
638 i2c_w(gspca_dev, i2c);
639 break;
640 }
641 case SENSOR_PAS106:
642 case SENSOR_PAS202: {
643 __u8 i2cpgain[] =
644 {0xa0, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x15};
645 __u8 i2cpcolorgain[] =
646 {0xc0, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, 0x15};
647 __u8 i2cpdoit[] =
648 {0xa0, 0x40, 0x11, 0x01, 0x00, 0x00, 0x00, 0x16};
649
650 /* PAS106 uses different regs (and has split green gains) */
651 if (sd->sensor == SENSOR_PAS106) {
652 i2cpgain[2] = 0x0e;
653 i2cpcolorgain[0] = 0xd0;
654 i2cpcolorgain[2] = 0x09;
655 i2cpdoit[2] = 0x13;
656 }
657
658 i2cpgain[3] = gain;
659 i2cpcolorgain[3] = gain >> 1;
660 i2cpcolorgain[4] = gain >> 1;
661 i2cpcolorgain[5] = gain >> 1;
662 i2cpcolorgain[6] = gain >> 1;
663
664 i2c_w(gspca_dev, i2cpgain);
665 i2c_w(gspca_dev, i2cpcolorgain);
666 i2c_w(gspca_dev, i2cpdoit);
667 break;
668 }
669 default:
670 if (sd->bridge == BRIDGE_103) {
671 u8 buf[3] = { gain, gain, gain }; /* R, G, B */
672 reg_w(gspca_dev, 0x05, buf, 3);
673 } else {
674 u8 buf[2];
675 buf[0] = gain << 4 | gain; /* Red and blue */
676 buf[1] = gain; /* Green */
677 reg_w(gspca_dev, 0x10, buf, 2);
678 }
679 }
680 }
681
682 static void setexposure(struct gspca_dev *gspca_dev)
683 {
684 struct sd *sd = (struct sd *) gspca_dev;
685
686 switch (sd->sensor) {
687 case SENSOR_HV7131D: {
688 /* Note the datasheet wrongly says line mode exposure uses reg
689 0x26 and 0x27, testing has shown 0x25 + 0x26 */
690 __u8 i2c[] = {0xc0, 0x11, 0x25, 0x00, 0x00, 0x00, 0x00, 0x17};
691 u16 reg = gspca_dev->exposure->val;
692
693 i2c[3] = reg >> 8;
694 i2c[4] = reg & 0xff;
695 i2c_w(gspca_dev, i2c);
696 break;
697 }
698 case SENSOR_TAS5110C:
699 case SENSOR_TAS5110D: {
700 /* register 19's high nibble contains the sn9c10x clock divider
701 The high nibble configures the no fps according to the
702 formula: 60 / high_nibble. With a maximum of 30 fps */
703 u8 reg = gspca_dev->exposure->val;
704
705 reg = (reg << 4) | 0x0b;
706 reg_w(gspca_dev, 0x19, &reg, 1);
707 break;
708 }
709 case SENSOR_OV6650:
710 case SENSOR_OV7630: {
711 /* The ov6650 / ov7630 have 2 registers which both influence
712 exposure, register 11, whose low nibble sets the nr off fps
713 according to: fps = 30 / (low_nibble + 1)
714
715 The fps configures the maximum exposure setting, but it is
716 possible to use less exposure then what the fps maximum
717 allows by setting register 10. register 10 configures the
718 actual exposure as quotient of the full exposure, with 0
719 being no exposure at all (not very useful) and reg10_max
720 being max exposure possible at that framerate.
721
722 The code maps our 0 - 510 ms exposure ctrl to these 2
723 registers, trying to keep fps as high as possible.
724 */
725 __u8 i2c[] = {0xb0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10};
726 int reg10, reg11, reg10_max;
727
728 /* ov6645 datasheet says reg10_max is 9a, but that uses
729 tline * 2 * reg10 as formula for calculating texpo, the
730 ov6650 probably uses the same formula as the 7730 which uses
731 tline * 4 * reg10, which explains why the reg10max we've
732 found experimentally for the ov6650 is exactly half that of
733 the ov6645. The ov7630 datasheet says the max is 0x41. */
734 if (sd->sensor == SENSOR_OV6650) {
735 reg10_max = 0x4d;
736 i2c[4] = 0xc0; /* OV6650 needs non default vsync pol */
737 } else
738 reg10_max = 0x41;
739
740 reg11 = (15 * gspca_dev->exposure->val + 999) / 1000;
741 if (reg11 < 1)
742 reg11 = 1;
743 else if (reg11 > 16)
744 reg11 = 16;
745
746 /* In 640x480, if the reg11 has less than 4, the image is
747 unstable (the bridge goes into a higher compression mode
748 which we have not reverse engineered yet). */
749 if (gspca_dev->pixfmt.width == 640 && reg11 < 4)
750 reg11 = 4;
751
752 /* frame exposure time in ms = 1000 * reg11 / 30 ->
753 reg10 = (gspca_dev->exposure->val / 2) * reg10_max
754 / (1000 * reg11 / 30) */
755 reg10 = (gspca_dev->exposure->val * 15 * reg10_max)
756 / (1000 * reg11);
757
758 /* Don't allow this to get below 10 when using autogain, the
759 steps become very large (relatively) when below 10 causing
760 the image to oscilate from much too dark, to much too bright
761 and back again. */
762 if (gspca_dev->autogain->val && reg10 < 10)
763 reg10 = 10;
764 else if (reg10 > reg10_max)
765 reg10 = reg10_max;
766
767 /* Write reg 10 and reg11 low nibble */
768 i2c[1] = sensor_data[sd->sensor].sensor_addr;
769 i2c[3] = reg10;
770 i2c[4] |= reg11 - 1;
771
772 /* If register 11 didn't change, don't change it */
773 if (sd->reg11 == reg11)
774 i2c[0] = 0xa0;
775
776 i2c_w(gspca_dev, i2c);
777 if (gspca_dev->usb_err == 0)
778 sd->reg11 = reg11;
779 break;
780 }
781 case SENSOR_PAS202: {
782 __u8 i2cpframerate[] =
783 {0xb0, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x16};
784 __u8 i2cpexpo[] =
785 {0xa0, 0x40, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x16};
786 const __u8 i2cpdoit[] =
787 {0xa0, 0x40, 0x11, 0x01, 0x00, 0x00, 0x00, 0x16};
788 int framerate_ctrl;
789
790 /* The exposure knee for the autogain algorithm is 200
791 (100 ms / 10 fps on other sensors), for values below this
792 use the control for setting the partial frame expose time,
793 above that use variable framerate. This way we run at max
794 framerate (640x480@7.5 fps, 320x240@10fps) until the knee
795 is reached. Using the variable framerate control above 200
796 is better then playing around with both clockdiv + partial
797 frame exposure times (like we are doing with the ov chips),
798 as that sometimes leads to jumps in the exposure control,
799 which are bad for auto exposure. */
800 if (gspca_dev->exposure->val < 200) {
801 i2cpexpo[3] = 255 - (gspca_dev->exposure->val * 255)
802 / 200;
803 framerate_ctrl = 500;
804 } else {
805 /* The PAS202's exposure control goes from 0 - 4095,
806 but anything below 500 causes vsync issues, so scale
807 our 200-1023 to 500-4095 */
808 framerate_ctrl = (gspca_dev->exposure->val - 200)
809 * 1000 / 229 + 500;
810 }
811
812 i2cpframerate[3] = framerate_ctrl >> 6;
813 i2cpframerate[4] = framerate_ctrl & 0x3f;
814 i2c_w(gspca_dev, i2cpframerate);
815 i2c_w(gspca_dev, i2cpexpo);
816 i2c_w(gspca_dev, i2cpdoit);
817 break;
818 }
819 case SENSOR_PAS106: {
820 __u8 i2cpframerate[] =
821 {0xb1, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x14};
822 __u8 i2cpexpo[] =
823 {0xa1, 0x40, 0x05, 0x00, 0x00, 0x00, 0x00, 0x14};
824 const __u8 i2cpdoit[] =
825 {0xa1, 0x40, 0x13, 0x01, 0x00, 0x00, 0x00, 0x14};
826 int framerate_ctrl;
827
828 /* For values below 150 use partial frame exposure, above
829 that use framerate ctrl */
830 if (gspca_dev->exposure->val < 150) {
831 i2cpexpo[3] = 150 - gspca_dev->exposure->val;
832 framerate_ctrl = 300;
833 } else {
834 /* The PAS106's exposure control goes from 0 - 4095,
835 but anything below 300 causes vsync issues, so scale
836 our 150-1023 to 300-4095 */
837 framerate_ctrl = (gspca_dev->exposure->val - 150)
838 * 1000 / 230 + 300;
839 }
840
841 i2cpframerate[3] = framerate_ctrl >> 4;
842 i2cpframerate[4] = framerate_ctrl & 0x0f;
843 i2c_w(gspca_dev, i2cpframerate);
844 i2c_w(gspca_dev, i2cpexpo);
845 i2c_w(gspca_dev, i2cpdoit);
846 break;
847 }
848 default:
849 break;
850 }
851 }
852
853 static void setfreq(struct gspca_dev *gspca_dev)
854 {
855 struct sd *sd = (struct sd *) gspca_dev;
856
857 if (sd->sensor == SENSOR_OV6650 || sd->sensor == SENSOR_OV7630) {
858 /* Framerate adjust register for artificial light 50 hz flicker
859 compensation, for the ov6650 this is identical to ov6630
860 0x2b register, see ov6630 datasheet.
861 0x4f / 0x8a -> (30 fps -> 25 fps), 0x00 -> no adjustment */
862 __u8 i2c[] = {0xa0, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x10};
863 switch (sd->plfreq->val) {
864 default:
865 /* case 0: * no filter*/
866 /* case 2: * 60 hz */
867 i2c[3] = 0;
868 break;
869 case 1: /* 50 hz */
870 i2c[3] = (sd->sensor == SENSOR_OV6650)
871 ? 0x4f : 0x8a;
872 break;
873 }
874 i2c[1] = sensor_data[sd->sensor].sensor_addr;
875 i2c_w(gspca_dev, i2c);
876 }
877 }
878
879 static void do_autogain(struct gspca_dev *gspca_dev)
880 {
881 struct sd *sd = (struct sd *) gspca_dev;
882 int deadzone, desired_avg_lum, avg_lum;
883
884 avg_lum = atomic_read(&sd->avg_lum);
885 if (avg_lum == -1)
886 return;
887
888 if (sd->autogain_ignore_frames > 0) {
889 sd->autogain_ignore_frames--;
890 return;
891 }
892
893 /* SIF / VGA sensors have a different autoexposure area and thus
894 different avg_lum values for the same picture brightness */
895 if (sensor_data[sd->sensor].flags & F_SIF) {
896 deadzone = 500;
897 /* SIF sensors tend to overexpose, so keep this small */
898 desired_avg_lum = 5000;
899 } else {
900 deadzone = 1500;
901 desired_avg_lum = 13000;
902 }
903
904 if (sd->brightness)
905 desired_avg_lum = sd->brightness->val * desired_avg_lum / 127;
906
907 if (gspca_dev->exposure->maximum < 500) {
908 if (gspca_coarse_grained_expo_autogain(gspca_dev, avg_lum,
909 desired_avg_lum, deadzone))
910 sd->autogain_ignore_frames = AUTOGAIN_IGNORE_FRAMES;
911 } else {
912 int gain_knee = (s32)gspca_dev->gain->maximum * 9 / 10;
913 if (gspca_expo_autogain(gspca_dev, avg_lum, desired_avg_lum,
914 deadzone, gain_knee, sd->exposure_knee))
915 sd->autogain_ignore_frames = AUTOGAIN_IGNORE_FRAMES;
916 }
917 }
918
919 /* this function is called at probe time */
920 static int sd_config(struct gspca_dev *gspca_dev,
921 const struct usb_device_id *id)
922 {
923 struct sd *sd = (struct sd *) gspca_dev;
924 struct cam *cam;
925
926 reg_r(gspca_dev, 0x00);
927 if (gspca_dev->usb_buf[0] != 0x10)
928 return -ENODEV;
929
930 /* copy the webcam info from the device id */
931 sd->sensor = id->driver_info >> 8;
932 sd->bridge = id->driver_info & 0xff;
933
934 cam = &gspca_dev->cam;
935 if (!(sensor_data[sd->sensor].flags & F_SIF)) {
936 cam->cam_mode = vga_mode;
937 cam->nmodes = ARRAY_SIZE(vga_mode);
938 } else {
939 cam->cam_mode = sif_mode;
940 cam->nmodes = ARRAY_SIZE(sif_mode);
941 }
942 cam->npkt = 36; /* 36 packets per ISOC message */
943
944 return 0;
945 }
946
947 /* this function is called at probe and resume time */
948 static int sd_init(struct gspca_dev *gspca_dev)
949 {
950 const __u8 stop = 0x09; /* Disable stream turn of LED */
951
952 reg_w(gspca_dev, 0x01, &stop, 1);
953
954 return gspca_dev->usb_err;
955 }
956
957 static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
958 {
959 struct gspca_dev *gspca_dev =
960 container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
961 struct sd *sd = (struct sd *)gspca_dev;
962
963 gspca_dev->usb_err = 0;
964
965 if (ctrl->id == V4L2_CID_AUTOGAIN && ctrl->is_new && ctrl->val) {
966 /* when switching to autogain set defaults to make sure
967 we are on a valid point of the autogain gain /
968 exposure knee graph, and give this change time to
969 take effect before doing autogain. */
970 gspca_dev->gain->val = gspca_dev->gain->default_value;
971 gspca_dev->exposure->val = gspca_dev->exposure->default_value;
972 sd->autogain_ignore_frames = AUTOGAIN_IGNORE_FRAMES;
973 }
974
975 if (!gspca_dev->streaming)
976 return 0;
977
978 switch (ctrl->id) {
979 case V4L2_CID_BRIGHTNESS:
980 setbrightness(gspca_dev);
981 break;
982 case V4L2_CID_AUTOGAIN:
983 if (gspca_dev->exposure->is_new || (ctrl->is_new && ctrl->val))
984 setexposure(gspca_dev);
985 if (gspca_dev->gain->is_new || (ctrl->is_new && ctrl->val))
986 setgain(gspca_dev);
987 break;
988 case V4L2_CID_POWER_LINE_FREQUENCY:
989 setfreq(gspca_dev);
990 break;
991 default:
992 return -EINVAL;
993 }
994 return gspca_dev->usb_err;
995 }
996
997 static const struct v4l2_ctrl_ops sd_ctrl_ops = {
998 .s_ctrl = sd_s_ctrl,
999 };
1000
1001 /* this function is called at probe time */
1002 static int sd_init_controls(struct gspca_dev *gspca_dev)
1003 {
1004 struct sd *sd = (struct sd *) gspca_dev;
1005 struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
1006
1007 gspca_dev->vdev.ctrl_handler = hdl;
1008 v4l2_ctrl_handler_init(hdl, 5);
1009
1010 if (sd->sensor == SENSOR_OV6650 || sd->sensor == SENSOR_OV7630 ||
1011 sd->sensor == SENSOR_PAS106 || sd->sensor == SENSOR_PAS202)
1012 sd->brightness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1013 V4L2_CID_BRIGHTNESS, 0, 255, 1, 127);
1014
1015 /* Gain range is sensor dependent */
1016 switch (sd->sensor) {
1017 case SENSOR_OV6650:
1018 case SENSOR_PAS106:
1019 case SENSOR_PAS202:
1020 gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1021 V4L2_CID_GAIN, 0, 31, 1, 15);
1022 break;
1023 case SENSOR_OV7630:
1024 gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1025 V4L2_CID_GAIN, 0, 47, 1, 31);
1026 break;
1027 case SENSOR_HV7131D:
1028 gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1029 V4L2_CID_GAIN, 0, 63, 1, 31);
1030 break;
1031 case SENSOR_TAS5110C:
1032 case SENSOR_TAS5110D:
1033 case SENSOR_TAS5130CXX:
1034 gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1035 V4L2_CID_GAIN, 0, 255, 1, 127);
1036 break;
1037 default:
1038 if (sd->bridge == BRIDGE_103) {
1039 gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1040 V4L2_CID_GAIN, 0, 127, 1, 63);
1041 } else {
1042 gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1043 V4L2_CID_GAIN, 0, 15, 1, 7);
1044 }
1045 }
1046
1047 /* Exposure range is sensor dependent, and not all have exposure */
1048 switch (sd->sensor) {
1049 case SENSOR_HV7131D:
1050 gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1051 V4L2_CID_EXPOSURE, 0, 8191, 1, 482);
1052 sd->exposure_knee = 964;
1053 break;
1054 case SENSOR_OV6650:
1055 case SENSOR_OV7630:
1056 case SENSOR_PAS106:
1057 case SENSOR_PAS202:
1058 gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1059 V4L2_CID_EXPOSURE, 0, 1023, 1, 66);
1060 sd->exposure_knee = 200;
1061 break;
1062 case SENSOR_TAS5110C:
1063 case SENSOR_TAS5110D:
1064 gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1065 V4L2_CID_EXPOSURE, 2, 15, 1, 2);
1066 break;
1067 }
1068
1069 if (gspca_dev->exposure) {
1070 gspca_dev->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1071 V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
1072 }
1073
1074 if (sd->sensor == SENSOR_OV6650 || sd->sensor == SENSOR_OV7630)
1075 sd->plfreq = v4l2_ctrl_new_std_menu(hdl, &sd_ctrl_ops,
1076 V4L2_CID_POWER_LINE_FREQUENCY,
1077 V4L2_CID_POWER_LINE_FREQUENCY_60HZ, 0,
1078 V4L2_CID_POWER_LINE_FREQUENCY_DISABLED);
1079
1080 if (hdl->error) {
1081 pr_err("Could not initialize controls\n");
1082 return hdl->error;
1083 }
1084
1085 if (gspca_dev->autogain)
1086 v4l2_ctrl_auto_cluster(3, &gspca_dev->autogain, 0, false);
1087
1088 return 0;
1089 }
1090
1091 /* -- start the camera -- */
1092 static int sd_start(struct gspca_dev *gspca_dev)
1093 {
1094 struct sd *sd = (struct sd *) gspca_dev;
1095 struct cam *cam = &gspca_dev->cam;
1096 int i, mode;
1097 __u8 regs[0x31];
1098
1099 mode = cam->cam_mode[gspca_dev->curr_mode].priv & 0x07;
1100 /* Copy registers 0x01 - 0x19 from the template */
1101 memcpy(&regs[0x01], sensor_data[sd->sensor].bridge_init, 0x19);
1102 /* Set the mode */
1103 regs[0x18] |= mode << 4;
1104
1105 /* Set bridge gain to 1.0 */
1106 if (sd->bridge == BRIDGE_103) {
1107 regs[0x05] = 0x20; /* Red */
1108 regs[0x06] = 0x20; /* Green */
1109 regs[0x07] = 0x20; /* Blue */
1110 } else {
1111 regs[0x10] = 0x00; /* Red and blue */
1112 regs[0x11] = 0x00; /* Green */
1113 }
1114
1115 /* Setup pixel numbers and auto exposure window */
1116 if (sensor_data[sd->sensor].flags & F_SIF) {
1117 regs[0x1a] = 0x14; /* HO_SIZE 640, makes no sense */
1118 regs[0x1b] = 0x0a; /* VO_SIZE 320, makes no sense */
1119 regs[0x1c] = 0x02; /* AE H-start 64 */
1120 regs[0x1d] = 0x02; /* AE V-start 64 */
1121 regs[0x1e] = 0x09; /* AE H-end 288 */
1122 regs[0x1f] = 0x07; /* AE V-end 224 */
1123 } else {
1124 regs[0x1a] = 0x1d; /* HO_SIZE 960, makes no sense */
1125 regs[0x1b] = 0x10; /* VO_SIZE 512, makes no sense */
1126 regs[0x1c] = 0x05; /* AE H-start 160 */
1127 regs[0x1d] = 0x03; /* AE V-start 96 */
1128 regs[0x1e] = 0x0f; /* AE H-end 480 */
1129 regs[0x1f] = 0x0c; /* AE V-end 384 */
1130 }
1131
1132 /* Setup the gamma table (only used with the sn9c103 bridge) */
1133 for (i = 0; i < 16; i++)
1134 regs[0x20 + i] = i * 16;
1135 regs[0x20 + i] = 255;
1136
1137 /* Special cases where some regs depend on mode or bridge */
1138 switch (sd->sensor) {
1139 case SENSOR_TAS5130CXX:
1140 /* FIXME / TESTME
1141 probably not mode specific at all most likely the upper
1142 nibble of 0x19 is exposure (clock divider) just as with
1143 the tas5110, we need someone to test this. */
1144 regs[0x19] = mode ? 0x23 : 0x43;
1145 break;
1146 case SENSOR_OV7630:
1147 /* FIXME / TESTME for some reason with the 101/102 bridge the
1148 clock is set to 12 Mhz (reg1 == 0x04), rather then 24.
1149 Also the hstart needs to go from 1 to 2 when using a 103,
1150 which is likely related. This does not seem right. */
1151 if (sd->bridge == BRIDGE_103) {
1152 regs[0x01] = 0x44; /* Select 24 Mhz clock */
1153 regs[0x12] = 0x02; /* Set hstart to 2 */
1154 }
1155 break;
1156 case SENSOR_PAS202:
1157 /* For some unknown reason we need to increase hstart by 1 on
1158 the sn9c103, otherwise we get wrong colors (bayer shift). */
1159 if (sd->bridge == BRIDGE_103)
1160 regs[0x12] += 1;
1161 break;
1162 }
1163 /* Disable compression when the raw bayer format has been selected */
1164 if (cam->cam_mode[gspca_dev->curr_mode].priv & MODE_RAW)
1165 regs[0x18] &= ~0x80;
1166
1167 /* Vga mode emulation on SIF sensor? */
1168 if (cam->cam_mode[gspca_dev->curr_mode].priv & MODE_REDUCED_SIF) {
1169 regs[0x12] += 16; /* hstart adjust */
1170 regs[0x13] += 24; /* vstart adjust */
1171 regs[0x15] = 320 / 16; /* hsize */
1172 regs[0x16] = 240 / 16; /* vsize */
1173 }
1174
1175 /* reg 0x01 bit 2 video transfert on */
1176 reg_w(gspca_dev, 0x01, &regs[0x01], 1);
1177 /* reg 0x17 SensorClk enable inv Clk 0x60 */
1178 reg_w(gspca_dev, 0x17, &regs[0x17], 1);
1179 /* Set the registers from the template */
1180 reg_w(gspca_dev, 0x01, &regs[0x01],
1181 (sd->bridge == BRIDGE_103) ? 0x30 : 0x1f);
1182
1183 /* Init the sensor */
1184 i2c_w_vector(gspca_dev, sensor_data[sd->sensor].sensor_init,
1185 sensor_data[sd->sensor].sensor_init_size);
1186
1187 /* Mode / bridge specific sensor setup */
1188 switch (sd->sensor) {
1189 case SENSOR_PAS202: {
1190 const __u8 i2cpclockdiv[] =
1191 {0xa0, 0x40, 0x02, 0x03, 0x00, 0x00, 0x00, 0x10};
1192 /* clockdiv from 4 to 3 (7.5 -> 10 fps) when in low res mode */
1193 if (mode)
1194 i2c_w(gspca_dev, i2cpclockdiv);
1195 break;
1196 }
1197 case SENSOR_OV7630:
1198 /* FIXME / TESTME We should be able to handle this identical
1199 for the 101/102 and the 103 case */
1200 if (sd->bridge == BRIDGE_103) {
1201 const __u8 i2c[] = { 0xa0, 0x21, 0x13,
1202 0x80, 0x00, 0x00, 0x00, 0x10 };
1203 i2c_w(gspca_dev, i2c);
1204 }
1205 break;
1206 }
1207 /* H_size V_size 0x28, 0x1e -> 640x480. 0x16, 0x12 -> 352x288 */
1208 reg_w(gspca_dev, 0x15, &regs[0x15], 2);
1209 /* compression register */
1210 reg_w(gspca_dev, 0x18, &regs[0x18], 1);
1211 /* H_start */
1212 reg_w(gspca_dev, 0x12, &regs[0x12], 1);
1213 /* V_START */
1214 reg_w(gspca_dev, 0x13, &regs[0x13], 1);
1215 /* reset 0x17 SensorClk enable inv Clk 0x60 */
1216 /*fixme: ov7630 [17]=68 8f (+20 if 102)*/
1217 reg_w(gspca_dev, 0x17, &regs[0x17], 1);
1218 /*MCKSIZE ->3 */ /*fixme: not ov7630*/
1219 reg_w(gspca_dev, 0x19, &regs[0x19], 1);
1220 /* AE_STRX AE_STRY AE_ENDX AE_ENDY */
1221 reg_w(gspca_dev, 0x1c, &regs[0x1c], 4);
1222 /* Enable video transfert */
1223 reg_w(gspca_dev, 0x01, &regs[0x01], 1);
1224 /* Compression */
1225 reg_w(gspca_dev, 0x18, &regs[0x18], 2);
1226 msleep(20);
1227
1228 sd->reg11 = -1;
1229
1230 setgain(gspca_dev);
1231 setbrightness(gspca_dev);
1232 setexposure(gspca_dev);
1233 setfreq(gspca_dev);
1234
1235 sd->frames_to_drop = 0;
1236 sd->autogain_ignore_frames = 0;
1237 gspca_dev->exp_too_high_cnt = 0;
1238 gspca_dev->exp_too_low_cnt = 0;
1239 atomic_set(&sd->avg_lum, -1);
1240 return gspca_dev->usb_err;
1241 }
1242
1243 static void sd_stopN(struct gspca_dev *gspca_dev)
1244 {
1245 sd_init(gspca_dev);
1246 }
1247
1248 static u8* find_sof(struct gspca_dev *gspca_dev, u8 *data, int len)
1249 {
1250 struct sd *sd = (struct sd *) gspca_dev;
1251 int i, header_size = (sd->bridge == BRIDGE_103) ? 18 : 12;
1252
1253 /* frames start with:
1254 * ff ff 00 c4 c4 96 synchro
1255 * 00 (unknown)
1256 * xx (frame sequence / size / compression)
1257 * (xx) (idem - extra byte for sn9c103)
1258 * ll mm brightness sum inside auto exposure
1259 * ll mm brightness sum outside auto exposure
1260 * (xx xx xx xx xx) audio values for snc103
1261 */
1262 for (i = 0; i < len; i++) {
1263 switch (sd->header_read) {
1264 case 0:
1265 if (data[i] == 0xff)
1266 sd->header_read++;
1267 break;
1268 case 1:
1269 if (data[i] == 0xff)
1270 sd->header_read++;
1271 else
1272 sd->header_read = 0;
1273 break;
1274 case 2:
1275 if (data[i] == 0x00)
1276 sd->header_read++;
1277 else if (data[i] != 0xff)
1278 sd->header_read = 0;
1279 break;
1280 case 3:
1281 if (data[i] == 0xc4)
1282 sd->header_read++;
1283 else if (data[i] == 0xff)
1284 sd->header_read = 1;
1285 else
1286 sd->header_read = 0;
1287 break;
1288 case 4:
1289 if (data[i] == 0xc4)
1290 sd->header_read++;
1291 else if (data[i] == 0xff)
1292 sd->header_read = 1;
1293 else
1294 sd->header_read = 0;
1295 break;
1296 case 5:
1297 if (data[i] == 0x96)
1298 sd->header_read++;
1299 else if (data[i] == 0xff)
1300 sd->header_read = 1;
1301 else
1302 sd->header_read = 0;
1303 break;
1304 default:
1305 sd->header[sd->header_read - 6] = data[i];
1306 sd->header_read++;
1307 if (sd->header_read == header_size) {
1308 sd->header_read = 0;
1309 return data + i + 1;
1310 }
1311 }
1312 }
1313 return NULL;
1314 }
1315
1316 static void sd_pkt_scan(struct gspca_dev *gspca_dev,
1317 u8 *data, /* isoc packet */
1318 int len) /* iso packet length */
1319 {
1320 int fr_h_sz = 0, lum_offset = 0, len_after_sof = 0;
1321 struct sd *sd = (struct sd *) gspca_dev;
1322 struct cam *cam = &gspca_dev->cam;
1323 u8 *sof;
1324
1325 sof = find_sof(gspca_dev, data, len);
1326 if (sof) {
1327 if (sd->bridge == BRIDGE_103) {
1328 fr_h_sz = 18;
1329 lum_offset = 3;
1330 } else {
1331 fr_h_sz = 12;
1332 lum_offset = 2;
1333 }
1334
1335 len_after_sof = len - (sof - data);
1336 len = (sof - data) - fr_h_sz;
1337 if (len < 0)
1338 len = 0;
1339 }
1340
1341 if (cam->cam_mode[gspca_dev->curr_mode].priv & MODE_RAW) {
1342 /* In raw mode we sometimes get some garbage after the frame
1343 ignore this */
1344 int used;
1345 int size = cam->cam_mode[gspca_dev->curr_mode].sizeimage;
1346
1347 used = gspca_dev->image_len;
1348 if (used + len > size)
1349 len = size - used;
1350 }
1351
1352 gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
1353
1354 if (sof) {
1355 int lum = sd->header[lum_offset] +
1356 (sd->header[lum_offset + 1] << 8);
1357
1358 /* When exposure changes midway a frame we
1359 get a lum of 0 in this case drop 2 frames
1360 as the frames directly after an exposure
1361 change have an unstable image. Sometimes lum
1362 *really* is 0 (cam used in low light with
1363 low exposure setting), so do not drop frames
1364 if the previous lum was 0 too. */
1365 if (lum == 0 && sd->prev_avg_lum != 0) {
1366 lum = -1;
1367 sd->frames_to_drop = 2;
1368 sd->prev_avg_lum = 0;
1369 } else
1370 sd->prev_avg_lum = lum;
1371 atomic_set(&sd->avg_lum, lum);
1372
1373 if (sd->frames_to_drop)
1374 sd->frames_to_drop--;
1375 else
1376 gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
1377
1378 gspca_frame_add(gspca_dev, FIRST_PACKET, sof, len_after_sof);
1379 }
1380 }
1381
1382 #if IS_ENABLED(CONFIG_INPUT)
1383 static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
1384 u8 *data, /* interrupt packet data */
1385 int len) /* interrupt packet length */
1386 {
1387 int ret = -EINVAL;
1388
1389 if (len == 1 && data[0] == 1) {
1390 input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);
1391 input_sync(gspca_dev->input_dev);
1392 input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);
1393 input_sync(gspca_dev->input_dev);
1394 ret = 0;
1395 }
1396
1397 return ret;
1398 }
1399 #endif
1400
1401 /* sub-driver description */
1402 static const struct sd_desc sd_desc = {
1403 .name = MODULE_NAME,
1404 .config = sd_config,
1405 .init = sd_init,
1406 .init_controls = sd_init_controls,
1407 .start = sd_start,
1408 .stopN = sd_stopN,
1409 .pkt_scan = sd_pkt_scan,
1410 .dq_callback = do_autogain,
1411 #if IS_ENABLED(CONFIG_INPUT)
1412 .int_pkt_scan = sd_int_pkt_scan,
1413 #endif
1414 };
1415
1416 /* -- module initialisation -- */
1417 #define SB(sensor, bridge) \
1418 .driver_info = (SENSOR_ ## sensor << 8) | BRIDGE_ ## bridge
1419
1420
1421 static const struct usb_device_id device_table[] = {
1422 {USB_DEVICE(0x0c45, 0x6001), SB(TAS5110C, 102)}, /* TAS5110C1B */
1423 {USB_DEVICE(0x0c45, 0x6005), SB(TAS5110C, 101)}, /* TAS5110C1B */
1424 {USB_DEVICE(0x0c45, 0x6007), SB(TAS5110D, 101)}, /* TAS5110D */
1425 {USB_DEVICE(0x0c45, 0x6009), SB(PAS106, 101)},
1426 {USB_DEVICE(0x0c45, 0x600d), SB(PAS106, 101)},
1427 {USB_DEVICE(0x0c45, 0x6011), SB(OV6650, 101)},
1428 {USB_DEVICE(0x0c45, 0x6019), SB(OV7630, 101)},
1429 {USB_DEVICE(0x0c45, 0x6024), SB(TAS5130CXX, 102)},
1430 {USB_DEVICE(0x0c45, 0x6025), SB(TAS5130CXX, 102)},
1431 {USB_DEVICE(0x0c45, 0x6027), SB(OV7630, 101)}, /* Genius Eye 310 */
1432 {USB_DEVICE(0x0c45, 0x6028), SB(PAS202, 102)},
1433 {USB_DEVICE(0x0c45, 0x6029), SB(PAS106, 102)},
1434 {USB_DEVICE(0x0c45, 0x602a), SB(HV7131D, 102)},
1435 /* {USB_DEVICE(0x0c45, 0x602b), SB(MI0343, 102)}, */
1436 {USB_DEVICE(0x0c45, 0x602c), SB(OV7630, 102)},
1437 {USB_DEVICE(0x0c45, 0x602d), SB(HV7131R, 102)},
1438 {USB_DEVICE(0x0c45, 0x602e), SB(OV7630, 102)},
1439 /* {USB_DEVICE(0x0c45, 0x6030), SB(MI03XX, 102)}, */ /* MI0343 MI0360 MI0330 */
1440 /* {USB_DEVICE(0x0c45, 0x6082), SB(MI03XX, 103)}, */ /* MI0343 MI0360 */
1441 {USB_DEVICE(0x0c45, 0x6083), SB(HV7131D, 103)},
1442 {USB_DEVICE(0x0c45, 0x608c), SB(HV7131R, 103)},
1443 /* {USB_DEVICE(0x0c45, 0x608e), SB(CISVF10, 103)}, */
1444 {USB_DEVICE(0x0c45, 0x608f), SB(OV7630, 103)},
1445 {USB_DEVICE(0x0c45, 0x60a8), SB(PAS106, 103)},
1446 {USB_DEVICE(0x0c45, 0x60aa), SB(TAS5130CXX, 103)},
1447 {USB_DEVICE(0x0c45, 0x60af), SB(PAS202, 103)},
1448 {USB_DEVICE(0x0c45, 0x60b0), SB(OV7630, 103)},
1449 {}
1450 };
1451 MODULE_DEVICE_TABLE(usb, device_table);
1452
1453 /* -- device connect -- */
1454 static int sd_probe(struct usb_interface *intf,
1455 const struct usb_device_id *id)
1456 {
1457 return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
1458 THIS_MODULE);
1459 }
1460
1461 static struct usb_driver sd_driver = {
1462 .name = MODULE_NAME,
1463 .id_table = device_table,
1464 .probe = sd_probe,
1465 .disconnect = gspca_disconnect,
1466 #ifdef CONFIG_PM
1467 .suspend = gspca_suspend,
1468 .resume = gspca_resume,
1469 .reset_resume = gspca_resume,
1470 #endif
1471 };
1472
1473 module_usb_driver(sd_driver);