[media] DocBook improvement for U8 and U16 control types
[deliverable/linux.git] / drivers / media / usb / gspca / pac7302.c
1 /*
2 * Pixart PAC7302 driver
3 *
4 * Copyright (C) 2008-2012 Jean-Francois Moine <http://moinejf.free.fr>
5 * Copyright (C) 2005 Thomas Kaiser thomas@kaiser-linux.li
6 *
7 * Separated from Pixart PAC7311 library by Márton Németh
8 * Camera button input handling by Márton Németh <nm127@freemail.hu>
9 * Copyright (C) 2009-2010 Márton Németh <nm127@freemail.hu>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 */
25
26 /*
27 * Some documentation about various registers as determined by trial and error.
28 *
29 * Register page 0:
30 *
31 * Address Description
32 * 0x01 Red balance control
33 * 0x02 Green balance control
34 * 0x03 Blue balance control
35 * The Windows driver uses a quadratic approach to map
36 * the settable values (0-200) on register values:
37 * min=0x20, default=0x40, max=0x80
38 * 0x0f-0x20 Color and saturation control
39 * 0xa2-0xab Brightness, contrast and gamma control
40 * 0xb6 Sharpness control (bits 0-4)
41 *
42 * Register page 1:
43 *
44 * Address Description
45 * 0x78 Global control, bit 6 controls the LED (inverted)
46 * 0x80 Compression balance, 2 interesting settings:
47 * 0x0f Default
48 * 0x50 Values >= this switch the camera to a lower compression,
49 * using the same table for both luminance and chrominance.
50 * This gives a sharper picture. Only usable when running
51 * at < 15 fps! Note currently the driver does not use this
52 * as the quality gain is small and the generated JPG-s are
53 * only understood by v4l-utils >= 0.8.9
54 *
55 * Register page 3:
56 *
57 * Address Description
58 * 0x02 Clock divider 3-63, fps = 90 / val. Must be a multiple of 3 on
59 * the 7302, so one of 3, 6, 9, ..., except when between 6 and 12?
60 * 0x03 Variable framerate ctrl reg2==3: 0 -> ~30 fps, 255 -> ~22fps
61 * 0x04 Another var framerate ctrl reg2==3, reg3==0: 0 -> ~30 fps,
62 * 63 -> ~27 fps, the 2 msb's must always be 1 !!
63 * 0x05 Another var framerate ctrl reg2==3, reg3==0, reg4==0xc0:
64 * 1 -> ~30 fps, 2 -> ~20 fps
65 * 0x0e Exposure bits 0-7, 0-448, 0 = use full frame time
66 * 0x0f Exposure bit 8, 0-448, 448 = no exposure at all
67 * 0x10 Gain 0-31
68 * 0x12 Another gain 0-31, unlike 0x10 this one seems to start with an
69 * amplification value of 1 rather then 0 at its lowest setting
70 * 0x21 Bitfield: 0-1 unused, 2-3 vflip/hflip, 4-5 unknown, 6-7 unused
71 * 0x80 Another framerate control, best left at 1, moving it from 1 to
72 * 2 causes the framerate to become 3/4th of what it was, and
73 * also seems to cause pixel averaging, resulting in an effective
74 * resolution of 320x240 and thus a much blockier image
75 *
76 * The registers are accessed in the following functions:
77 *
78 * Page | Register | Function
79 * -----+------------+---------------------------------------------------
80 * 0 | 0x01 | setredbalance()
81 * 0 | 0x03 | setbluebalance()
82 * 0 | 0x0f..0x20 | setcolors()
83 * 0 | 0xa2..0xab | setbrightcont()
84 * 0 | 0xb6 | setsharpness()
85 * 0 | 0xc6 | setwhitebalance()
86 * 0 | 0xdc | setbrightcont(), setcolors()
87 * 3 | 0x02 | setexposure()
88 * 3 | 0x10, 0x12 | setgain()
89 * 3 | 0x11 | setcolors(), setgain(), setexposure(), sethvflip()
90 * 3 | 0x21 | sethvflip()
91 */
92
93 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
94
95 #include <linux/input.h>
96 #include "gspca.h"
97 /* Include pac common sof detection functions */
98 #include "pac_common.h"
99
100 #define PAC7302_RGB_BALANCE_MIN 0
101 #define PAC7302_RGB_BALANCE_MAX 200
102 #define PAC7302_RGB_BALANCE_DEFAULT 100
103 #define PAC7302_GAIN_DEFAULT 15
104 #define PAC7302_GAIN_KNEE 42
105 #define PAC7302_EXPOSURE_DEFAULT 66 /* 33 ms / 30 fps */
106 #define PAC7302_EXPOSURE_KNEE 133 /* 66 ms / 15 fps */
107
108 MODULE_AUTHOR("Jean-Francois Moine <http://moinejf.free.fr>, "
109 "Thomas Kaiser thomas@kaiser-linux.li");
110 MODULE_DESCRIPTION("Pixart PAC7302");
111 MODULE_LICENSE("GPL");
112
113 struct sd {
114 struct gspca_dev gspca_dev; /* !! must be the first item */
115
116 struct { /* brightness / contrast cluster */
117 struct v4l2_ctrl *brightness;
118 struct v4l2_ctrl *contrast;
119 };
120 struct v4l2_ctrl *saturation;
121 struct v4l2_ctrl *white_balance;
122 struct v4l2_ctrl *red_balance;
123 struct v4l2_ctrl *blue_balance;
124 struct { /* flip cluster */
125 struct v4l2_ctrl *hflip;
126 struct v4l2_ctrl *vflip;
127 };
128 struct v4l2_ctrl *sharpness;
129 u8 flags;
130 #define FL_HFLIP 0x01 /* mirrored by default */
131 #define FL_VFLIP 0x02 /* vertical flipped by default */
132
133 u8 sof_read;
134 s8 autogain_ignore_frames;
135
136 atomic_t avg_lum;
137 };
138
139 static const struct v4l2_pix_format vga_mode[] = {
140 {640, 480, V4L2_PIX_FMT_PJPG, V4L2_FIELD_NONE,
141 .bytesperline = 640,
142 .sizeimage = 640 * 480 * 3 / 8 + 590,
143 .colorspace = V4L2_COLORSPACE_JPEG,
144 },
145 };
146
147 #define LOAD_PAGE3 255
148 #define END_OF_SEQUENCE 0
149
150 static const u8 init_7302[] = {
151 /* index,value */
152 0xff, 0x01, /* page 1 */
153 0x78, 0x00, /* deactivate */
154 0xff, 0x01,
155 0x78, 0x40, /* led off */
156 };
157 static const u8 start_7302[] = {
158 /* index, len, [value]* */
159 0xff, 1, 0x00, /* page 0 */
160 0x00, 12, 0x01, 0x40, 0x40, 0x40, 0x01, 0xe0, 0x02, 0x80,
161 0x00, 0x00, 0x00, 0x00,
162 0x0d, 24, 0x03, 0x01, 0x00, 0xb5, 0x07, 0xcb, 0x00, 0x00,
163 0x07, 0xc8, 0x00, 0xea, 0x07, 0xcf, 0x07, 0xf7,
164 0x07, 0x7e, 0x01, 0x0b, 0x00, 0x00, 0x00, 0x11,
165 0x26, 2, 0xaa, 0xaa,
166 0x2e, 1, 0x31,
167 0x38, 1, 0x01,
168 0x3a, 3, 0x14, 0xff, 0x5a,
169 0x43, 11, 0x00, 0x0a, 0x18, 0x11, 0x01, 0x2c, 0x88, 0x11,
170 0x00, 0x54, 0x11,
171 0x55, 1, 0x00,
172 0x62, 4, 0x10, 0x1e, 0x1e, 0x18,
173 0x6b, 1, 0x00,
174 0x6e, 3, 0x08, 0x06, 0x00,
175 0x72, 3, 0x00, 0xff, 0x00,
176 0x7d, 23, 0x01, 0x01, 0x58, 0x46, 0x50, 0x3c, 0x50, 0x3c,
177 0x54, 0x46, 0x54, 0x56, 0x52, 0x50, 0x52, 0x50,
178 0x56, 0x64, 0xa4, 0x00, 0xda, 0x00, 0x00,
179 0xa2, 10, 0x22, 0x2c, 0x3c, 0x54, 0x69, 0x7c, 0x9c, 0xb9,
180 0xd2, 0xeb,
181 0xaf, 1, 0x02,
182 0xb5, 2, 0x08, 0x08,
183 0xb8, 2, 0x08, 0x88,
184 0xc4, 4, 0xae, 0x01, 0x04, 0x01,
185 0xcc, 1, 0x00,
186 0xd1, 11, 0x01, 0x30, 0x49, 0x5e, 0x6f, 0x7f, 0x8e, 0xa9,
187 0xc1, 0xd7, 0xec,
188 0xdc, 1, 0x01,
189 0xff, 1, 0x01, /* page 1 */
190 0x12, 3, 0x02, 0x00, 0x01,
191 0x3e, 2, 0x00, 0x00,
192 0x76, 5, 0x01, 0x20, 0x40, 0x00, 0xf2,
193 0x7c, 1, 0x00,
194 0x7f, 10, 0x4b, 0x0f, 0x01, 0x2c, 0x02, 0x58, 0x03, 0x20,
195 0x02, 0x00,
196 0x96, 5, 0x01, 0x10, 0x04, 0x01, 0x04,
197 0xc8, 14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
198 0x07, 0x00, 0x01, 0x07, 0x04, 0x01,
199 0xd8, 1, 0x01,
200 0xdb, 2, 0x00, 0x01,
201 0xde, 7, 0x00, 0x01, 0x04, 0x04, 0x00, 0x00, 0x00,
202 0xe6, 4, 0x00, 0x00, 0x00, 0x01,
203 0xeb, 1, 0x00,
204 0xff, 1, 0x02, /* page 2 */
205 0x22, 1, 0x00,
206 0xff, 1, 0x03, /* page 3 */
207 0, LOAD_PAGE3, /* load the page 3 */
208 0x11, 1, 0x01,
209 0xff, 1, 0x02, /* page 2 */
210 0x13, 1, 0x00,
211 0x22, 4, 0x1f, 0xa4, 0xf0, 0x96,
212 0x27, 2, 0x14, 0x0c,
213 0x2a, 5, 0xc8, 0x00, 0x18, 0x12, 0x22,
214 0x64, 8, 0x00, 0x00, 0xf0, 0x01, 0x14, 0x44, 0x44, 0x44,
215 0x6e, 1, 0x08,
216 0xff, 1, 0x01, /* page 1 */
217 0x78, 1, 0x00,
218 0, END_OF_SEQUENCE /* end of sequence */
219 };
220
221 #define SKIP 0xaa
222 /* page 3 - the value SKIP says skip the index - see reg_w_page() */
223 static const u8 page3_7302[] = {
224 0x90, 0x40, 0x03, 0x00, 0xc0, 0x01, 0x14, 0x16,
225 0x14, 0x12, 0x00, 0x00, 0x00, 0x02, 0x33, 0x00,
226 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227 0x00, 0x00, 0x00, 0x47, 0x01, 0xb3, 0x01, 0x00,
228 0x00, 0x08, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x21,
229 0x00, 0x00, 0x00, 0x54, 0xf4, 0x02, 0x52, 0x54,
230 0xa4, 0xb8, 0xe0, 0x2a, 0xf6, 0x00, 0x00, 0x00,
231 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
232 0x00, 0xfc, 0x00, 0xf2, 0x1f, 0x04, 0x00, 0x00,
233 SKIP, 0x00, 0x00, 0xc0, 0xc0, 0x10, 0x00, 0x00,
234 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
235 0x00, 0x40, 0xff, 0x03, 0x19, 0x00, 0x00, 0x00,
236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
237 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xc8, 0xc8,
238 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50,
239 0x08, 0x10, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00,
240 0x01, 0x00, 0x02, 0x47, 0x00, 0x00, 0x00, 0x00,
241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
242 0x00, 0x02, 0xfa, 0x00, 0x64, 0x5a, 0x28, 0x00,
243 0x00
244 };
245
246 static void reg_w_buf(struct gspca_dev *gspca_dev,
247 u8 index,
248 const u8 *buffer, int len)
249 {
250 int ret;
251
252 if (gspca_dev->usb_err < 0)
253 return;
254 memcpy(gspca_dev->usb_buf, buffer, len);
255 ret = usb_control_msg(gspca_dev->dev,
256 usb_sndctrlpipe(gspca_dev->dev, 0),
257 0, /* request */
258 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
259 0, /* value */
260 index, gspca_dev->usb_buf, len,
261 500);
262 if (ret < 0) {
263 pr_err("reg_w_buf failed i: %02x error %d\n",
264 index, ret);
265 gspca_dev->usb_err = ret;
266 }
267 }
268
269
270 static void reg_w(struct gspca_dev *gspca_dev,
271 u8 index,
272 u8 value)
273 {
274 int ret;
275
276 if (gspca_dev->usb_err < 0)
277 return;
278 gspca_dev->usb_buf[0] = value;
279 ret = usb_control_msg(gspca_dev->dev,
280 usb_sndctrlpipe(gspca_dev->dev, 0),
281 0, /* request */
282 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
283 0, index, gspca_dev->usb_buf, 1,
284 500);
285 if (ret < 0) {
286 pr_err("reg_w() failed i: %02x v: %02x error %d\n",
287 index, value, ret);
288 gspca_dev->usb_err = ret;
289 }
290 }
291
292 static void reg_w_seq(struct gspca_dev *gspca_dev,
293 const u8 *seq, int len)
294 {
295 while (--len >= 0) {
296 reg_w(gspca_dev, seq[0], seq[1]);
297 seq += 2;
298 }
299 }
300
301 /* load the beginning of a page */
302 static void reg_w_page(struct gspca_dev *gspca_dev,
303 const u8 *page, int len)
304 {
305 int index;
306 int ret = 0;
307
308 if (gspca_dev->usb_err < 0)
309 return;
310 for (index = 0; index < len; index++) {
311 if (page[index] == SKIP) /* skip this index */
312 continue;
313 gspca_dev->usb_buf[0] = page[index];
314 ret = usb_control_msg(gspca_dev->dev,
315 usb_sndctrlpipe(gspca_dev->dev, 0),
316 0, /* request */
317 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
318 0, index, gspca_dev->usb_buf, 1,
319 500);
320 if (ret < 0) {
321 pr_err("reg_w_page() failed i: %02x v: %02x error %d\n",
322 index, page[index], ret);
323 gspca_dev->usb_err = ret;
324 break;
325 }
326 }
327 }
328
329 /* output a variable sequence */
330 static void reg_w_var(struct gspca_dev *gspca_dev,
331 const u8 *seq,
332 const u8 *page3, unsigned int page3_len)
333 {
334 int index, len;
335
336 for (;;) {
337 index = *seq++;
338 len = *seq++;
339 switch (len) {
340 case END_OF_SEQUENCE:
341 return;
342 case LOAD_PAGE3:
343 reg_w_page(gspca_dev, page3, page3_len);
344 break;
345 default:
346 if (len > USB_BUF_SZ) {
347 PERR("Incorrect variable sequence");
348 return;
349 }
350 while (len > 0) {
351 if (len < 8) {
352 reg_w_buf(gspca_dev,
353 index, seq, len);
354 seq += len;
355 break;
356 }
357 reg_w_buf(gspca_dev, index, seq, 8);
358 seq += 8;
359 index += 8;
360 len -= 8;
361 }
362 }
363 }
364 /* not reached */
365 }
366
367 /* this function is called at probe time for pac7302 */
368 static int sd_config(struct gspca_dev *gspca_dev,
369 const struct usb_device_id *id)
370 {
371 struct sd *sd = (struct sd *) gspca_dev;
372 struct cam *cam;
373
374 cam = &gspca_dev->cam;
375
376 cam->cam_mode = vga_mode; /* only 640x480 */
377 cam->nmodes = ARRAY_SIZE(vga_mode);
378
379 sd->flags = id->driver_info;
380 return 0;
381 }
382
383 static void setbrightcont(struct gspca_dev *gspca_dev)
384 {
385 struct sd *sd = (struct sd *) gspca_dev;
386 int i, v;
387 static const u8 max[10] =
388 {0x29, 0x33, 0x42, 0x5a, 0x6e, 0x80, 0x9f, 0xbb,
389 0xd4, 0xec};
390 static const u8 delta[10] =
391 {0x35, 0x33, 0x33, 0x2f, 0x2a, 0x25, 0x1e, 0x17,
392 0x11, 0x0b};
393
394 reg_w(gspca_dev, 0xff, 0x00); /* page 0 */
395 for (i = 0; i < 10; i++) {
396 v = max[i];
397 v += (sd->brightness->val - sd->brightness->maximum)
398 * 150 / sd->brightness->maximum; /* 200 ? */
399 v -= delta[i] * sd->contrast->val / sd->contrast->maximum;
400 if (v < 0)
401 v = 0;
402 else if (v > 0xff)
403 v = 0xff;
404 reg_w(gspca_dev, 0xa2 + i, v);
405 }
406 reg_w(gspca_dev, 0xdc, 0x01);
407 }
408
409 static void setcolors(struct gspca_dev *gspca_dev)
410 {
411 struct sd *sd = (struct sd *) gspca_dev;
412 int i, v;
413 static const int a[9] =
414 {217, -212, 0, -101, 170, -67, -38, -315, 355};
415 static const int b[9] =
416 {19, 106, 0, 19, 106, 1, 19, 106, 1};
417
418 reg_w(gspca_dev, 0xff, 0x03); /* page 3 */
419 reg_w(gspca_dev, 0x11, 0x01);
420 reg_w(gspca_dev, 0xff, 0x00); /* page 0 */
421 for (i = 0; i < 9; i++) {
422 v = a[i] * sd->saturation->val / sd->saturation->maximum;
423 v += b[i];
424 reg_w(gspca_dev, 0x0f + 2 * i, (v >> 8) & 0x07);
425 reg_w(gspca_dev, 0x0f + 2 * i + 1, v);
426 }
427 reg_w(gspca_dev, 0xdc, 0x01);
428 }
429
430 static void setwhitebalance(struct gspca_dev *gspca_dev)
431 {
432 struct sd *sd = (struct sd *) gspca_dev;
433
434 reg_w(gspca_dev, 0xff, 0x00); /* page 0 */
435 reg_w(gspca_dev, 0xc6, sd->white_balance->val);
436
437 reg_w(gspca_dev, 0xdc, 0x01);
438 }
439
440 static u8 rgbbalance_ctrl_to_reg_value(s32 rgb_ctrl_val)
441 {
442 const unsigned int k = 1000; /* precision factor */
443 unsigned int norm;
444
445 /* Normed value [0...k] */
446 norm = k * (rgb_ctrl_val - PAC7302_RGB_BALANCE_MIN)
447 / (PAC7302_RGB_BALANCE_MAX - PAC7302_RGB_BALANCE_MIN);
448 /* Qudratic apporach improves control at small (register) values: */
449 return 64 * norm * norm / (k*k) + 32 * norm / k + 32;
450 /* Y = 64*X*X + 32*X + 32
451 * => register values 0x20-0x80; Windows driver uses these limits */
452
453 /* NOTE: for full value range (0x00-0xff) use
454 * Y = 254*X*X + X
455 * => 254 * norm * norm / (k*k) + 1 * norm / k */
456 }
457
458 static void setredbalance(struct gspca_dev *gspca_dev)
459 {
460 struct sd *sd = (struct sd *) gspca_dev;
461
462 reg_w(gspca_dev, 0xff, 0x00); /* page 0 */
463 reg_w(gspca_dev, 0x01,
464 rgbbalance_ctrl_to_reg_value(sd->red_balance->val));
465
466 reg_w(gspca_dev, 0xdc, 0x01);
467 }
468
469 static void setbluebalance(struct gspca_dev *gspca_dev)
470 {
471 struct sd *sd = (struct sd *) gspca_dev;
472
473 reg_w(gspca_dev, 0xff, 0x00); /* page 0 */
474 reg_w(gspca_dev, 0x03,
475 rgbbalance_ctrl_to_reg_value(sd->blue_balance->val));
476
477 reg_w(gspca_dev, 0xdc, 0x01);
478 }
479
480 static void setgain(struct gspca_dev *gspca_dev)
481 {
482 u8 reg10, reg12;
483
484 if (gspca_dev->gain->val < 32) {
485 reg10 = gspca_dev->gain->val;
486 reg12 = 0;
487 } else {
488 reg10 = 31;
489 reg12 = gspca_dev->gain->val - 31;
490 }
491
492 reg_w(gspca_dev, 0xff, 0x03); /* page 3 */
493 reg_w(gspca_dev, 0x10, reg10);
494 reg_w(gspca_dev, 0x12, reg12);
495
496 /* load registers to sensor (Bit 0, auto clear) */
497 reg_w(gspca_dev, 0x11, 0x01);
498 }
499
500 static void setexposure(struct gspca_dev *gspca_dev)
501 {
502 u8 clockdiv;
503 u16 exposure;
504
505 /*
506 * Register 2 of frame 3 contains the clock divider configuring the
507 * no fps according to the formula: 90 / reg. sd->exposure is the
508 * desired exposure time in 0.5 ms.
509 */
510 clockdiv = (90 * gspca_dev->exposure->val + 1999) / 2000;
511
512 /*
513 * Note clockdiv = 3 also works, but when running at 30 fps, depending
514 * on the scene being recorded, the camera switches to another
515 * quantization table for certain JPEG blocks, and we don't know how
516 * to decompress these blocks. So we cap the framerate at 15 fps.
517 */
518 if (clockdiv < 6)
519 clockdiv = 6;
520 else if (clockdiv > 63)
521 clockdiv = 63;
522
523 /*
524 * Register 2 MUST be a multiple of 3, except when between 6 and 12?
525 * Always round up, otherwise we cannot get the desired frametime
526 * using the partial frame time exposure control.
527 */
528 if (clockdiv < 6 || clockdiv > 12)
529 clockdiv = ((clockdiv + 2) / 3) * 3;
530
531 /*
532 * frame exposure time in ms = 1000 * clockdiv / 90 ->
533 * exposure = (sd->exposure / 2) * 448 / (1000 * clockdiv / 90)
534 */
535 exposure = (gspca_dev->exposure->val * 45 * 448) / (1000 * clockdiv);
536 /* 0 = use full frametime, 448 = no exposure, reverse it */
537 exposure = 448 - exposure;
538
539 reg_w(gspca_dev, 0xff, 0x03); /* page 3 */
540 reg_w(gspca_dev, 0x02, clockdiv);
541 reg_w(gspca_dev, 0x0e, exposure & 0xff);
542 reg_w(gspca_dev, 0x0f, exposure >> 8);
543
544 /* load registers to sensor (Bit 0, auto clear) */
545 reg_w(gspca_dev, 0x11, 0x01);
546 }
547
548 static void sethvflip(struct gspca_dev *gspca_dev)
549 {
550 struct sd *sd = (struct sd *) gspca_dev;
551 u8 data, hflip, vflip;
552
553 hflip = sd->hflip->val;
554 if (sd->flags & FL_HFLIP)
555 hflip = !hflip;
556 vflip = sd->vflip->val;
557 if (sd->flags & FL_VFLIP)
558 vflip = !vflip;
559
560 reg_w(gspca_dev, 0xff, 0x03); /* page 3 */
561 data = (hflip ? 0x08 : 0x00) | (vflip ? 0x04 : 0x00);
562 reg_w(gspca_dev, 0x21, data);
563
564 /* load registers to sensor (Bit 0, auto clear) */
565 reg_w(gspca_dev, 0x11, 0x01);
566 }
567
568 static void setsharpness(struct gspca_dev *gspca_dev)
569 {
570 struct sd *sd = (struct sd *) gspca_dev;
571
572 reg_w(gspca_dev, 0xff, 0x00); /* page 0 */
573 reg_w(gspca_dev, 0xb6, sd->sharpness->val);
574
575 reg_w(gspca_dev, 0xdc, 0x01);
576 }
577
578 /* this function is called at probe and resume time for pac7302 */
579 static int sd_init(struct gspca_dev *gspca_dev)
580 {
581 reg_w_seq(gspca_dev, init_7302, sizeof(init_7302)/2);
582 return gspca_dev->usb_err;
583 }
584
585 static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
586 {
587 struct gspca_dev *gspca_dev =
588 container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
589 struct sd *sd = (struct sd *)gspca_dev;
590
591 gspca_dev->usb_err = 0;
592
593 if (ctrl->id == V4L2_CID_AUTOGAIN && ctrl->is_new && ctrl->val) {
594 /* when switching to autogain set defaults to make sure
595 we are on a valid point of the autogain gain /
596 exposure knee graph, and give this change time to
597 take effect before doing autogain. */
598 gspca_dev->exposure->val = PAC7302_EXPOSURE_DEFAULT;
599 gspca_dev->gain->val = PAC7302_GAIN_DEFAULT;
600 sd->autogain_ignore_frames = PAC_AUTOGAIN_IGNORE_FRAMES;
601 }
602
603 if (!gspca_dev->streaming)
604 return 0;
605
606 switch (ctrl->id) {
607 case V4L2_CID_BRIGHTNESS:
608 setbrightcont(gspca_dev);
609 break;
610 case V4L2_CID_SATURATION:
611 setcolors(gspca_dev);
612 break;
613 case V4L2_CID_WHITE_BALANCE_TEMPERATURE:
614 setwhitebalance(gspca_dev);
615 break;
616 case V4L2_CID_RED_BALANCE:
617 setredbalance(gspca_dev);
618 break;
619 case V4L2_CID_BLUE_BALANCE:
620 setbluebalance(gspca_dev);
621 break;
622 case V4L2_CID_AUTOGAIN:
623 if (gspca_dev->exposure->is_new || (ctrl->is_new && ctrl->val))
624 setexposure(gspca_dev);
625 if (gspca_dev->gain->is_new || (ctrl->is_new && ctrl->val))
626 setgain(gspca_dev);
627 break;
628 case V4L2_CID_HFLIP:
629 sethvflip(gspca_dev);
630 break;
631 case V4L2_CID_SHARPNESS:
632 setsharpness(gspca_dev);
633 break;
634 default:
635 return -EINVAL;
636 }
637 return gspca_dev->usb_err;
638 }
639
640 static const struct v4l2_ctrl_ops sd_ctrl_ops = {
641 .s_ctrl = sd_s_ctrl,
642 };
643
644 /* this function is called at probe time */
645 static int sd_init_controls(struct gspca_dev *gspca_dev)
646 {
647 struct sd *sd = (struct sd *) gspca_dev;
648 struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
649
650 gspca_dev->vdev.ctrl_handler = hdl;
651 v4l2_ctrl_handler_init(hdl, 12);
652
653 sd->brightness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
654 V4L2_CID_BRIGHTNESS, 0, 32, 1, 16);
655 sd->contrast = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
656 V4L2_CID_CONTRAST, 0, 255, 1, 127);
657
658 sd->saturation = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
659 V4L2_CID_SATURATION, 0, 255, 1, 127);
660 sd->white_balance = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
661 V4L2_CID_WHITE_BALANCE_TEMPERATURE,
662 0, 255, 1, 55);
663 sd->red_balance = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
664 V4L2_CID_RED_BALANCE,
665 PAC7302_RGB_BALANCE_MIN,
666 PAC7302_RGB_BALANCE_MAX,
667 1, PAC7302_RGB_BALANCE_DEFAULT);
668 sd->blue_balance = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
669 V4L2_CID_BLUE_BALANCE,
670 PAC7302_RGB_BALANCE_MIN,
671 PAC7302_RGB_BALANCE_MAX,
672 1, PAC7302_RGB_BALANCE_DEFAULT);
673
674 gspca_dev->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
675 V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
676 gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
677 V4L2_CID_EXPOSURE, 0, 1023, 1,
678 PAC7302_EXPOSURE_DEFAULT);
679 gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
680 V4L2_CID_GAIN, 0, 62, 1,
681 PAC7302_GAIN_DEFAULT);
682
683 sd->hflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
684 V4L2_CID_HFLIP, 0, 1, 1, 0);
685 sd->vflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
686 V4L2_CID_VFLIP, 0, 1, 1, 0);
687
688 sd->sharpness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
689 V4L2_CID_SHARPNESS, 0, 15, 1, 8);
690
691 if (hdl->error) {
692 pr_err("Could not initialize controls\n");
693 return hdl->error;
694 }
695
696 v4l2_ctrl_cluster(2, &sd->brightness);
697 v4l2_ctrl_auto_cluster(3, &gspca_dev->autogain, 0, false);
698 v4l2_ctrl_cluster(2, &sd->hflip);
699 return 0;
700 }
701
702 /* -- start the camera -- */
703 static int sd_start(struct gspca_dev *gspca_dev)
704 {
705 struct sd *sd = (struct sd *) gspca_dev;
706
707 reg_w_var(gspca_dev, start_7302,
708 page3_7302, sizeof(page3_7302));
709
710 sd->sof_read = 0;
711 sd->autogain_ignore_frames = 0;
712 atomic_set(&sd->avg_lum, 270 + sd->brightness->val);
713
714 /* start stream */
715 reg_w(gspca_dev, 0xff, 0x01);
716 reg_w(gspca_dev, 0x78, 0x01);
717
718 return gspca_dev->usb_err;
719 }
720
721 static void sd_stopN(struct gspca_dev *gspca_dev)
722 {
723
724 /* stop stream */
725 reg_w(gspca_dev, 0xff, 0x01);
726 reg_w(gspca_dev, 0x78, 0x00);
727 }
728
729 /* called on streamoff with alt 0 and on disconnect for pac7302 */
730 static void sd_stop0(struct gspca_dev *gspca_dev)
731 {
732 if (!gspca_dev->present)
733 return;
734 reg_w(gspca_dev, 0xff, 0x01);
735 reg_w(gspca_dev, 0x78, 0x40);
736 }
737
738 static void do_autogain(struct gspca_dev *gspca_dev)
739 {
740 struct sd *sd = (struct sd *) gspca_dev;
741 int avg_lum = atomic_read(&sd->avg_lum);
742 int desired_lum;
743 const int deadzone = 30;
744
745 if (sd->autogain_ignore_frames < 0)
746 return;
747
748 if (sd->autogain_ignore_frames > 0) {
749 sd->autogain_ignore_frames--;
750 } else {
751 desired_lum = 270 + sd->brightness->val;
752
753 if (gspca_expo_autogain(gspca_dev, avg_lum, desired_lum,
754 deadzone, PAC7302_GAIN_KNEE,
755 PAC7302_EXPOSURE_KNEE))
756 sd->autogain_ignore_frames =
757 PAC_AUTOGAIN_IGNORE_FRAMES;
758 }
759 }
760
761 /* JPEG header */
762 static const u8 jpeg_header[] = {
763 0xff, 0xd8, /* SOI: Start of Image */
764
765 0xff, 0xc0, /* SOF0: Start of Frame (Baseline DCT) */
766 0x00, 0x11, /* length = 17 bytes (including this length field) */
767 0x08, /* Precision: 8 */
768 0x02, 0x80, /* height = 640 (image rotated) */
769 0x01, 0xe0, /* width = 480 */
770 0x03, /* Number of image components: 3 */
771 0x01, 0x21, 0x00, /* ID=1, Subsampling 1x1, Quantization table: 0 */
772 0x02, 0x11, 0x01, /* ID=2, Subsampling 2x1, Quantization table: 1 */
773 0x03, 0x11, 0x01, /* ID=3, Subsampling 2x1, Quantization table: 1 */
774
775 0xff, 0xda, /* SOS: Start Of Scan */
776 0x00, 0x0c, /* length = 12 bytes (including this length field) */
777 0x03, /* number of components: 3 */
778 0x01, 0x00, /* selector 1, table 0x00 */
779 0x02, 0x11, /* selector 2, table 0x11 */
780 0x03, 0x11, /* selector 3, table 0x11 */
781 0x00, 0x3f, /* Spectral selection: 0 .. 63 */
782 0x00 /* Successive approximation: 0 */
783 };
784
785 /* this function is run at interrupt level */
786 static void sd_pkt_scan(struct gspca_dev *gspca_dev,
787 u8 *data, /* isoc packet */
788 int len) /* iso packet length */
789 {
790 struct sd *sd = (struct sd *) gspca_dev;
791 u8 *image;
792 u8 *sof;
793
794 sof = pac_find_sof(gspca_dev, &sd->sof_read, data, len);
795 if (sof) {
796 int n, lum_offset, footer_length;
797
798 /*
799 * 6 bytes after the FF D9 EOF marker a number of lumination
800 * bytes are send corresponding to different parts of the
801 * image, the 14th and 15th byte after the EOF seem to
802 * correspond to the center of the image.
803 */
804 lum_offset = 61 + sizeof pac_sof_marker;
805 footer_length = 74;
806
807 /* Finish decoding current frame */
808 n = (sof - data) - (footer_length + sizeof pac_sof_marker);
809 if (n < 0) {
810 gspca_dev->image_len += n;
811 n = 0;
812 } else {
813 gspca_frame_add(gspca_dev, INTER_PACKET, data, n);
814 }
815
816 image = gspca_dev->image;
817 if (image != NULL
818 && image[gspca_dev->image_len - 2] == 0xff
819 && image[gspca_dev->image_len - 1] == 0xd9)
820 gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
821
822 n = sof - data;
823 len -= n;
824 data = sof;
825
826 /* Get average lumination */
827 if (gspca_dev->last_packet_type == LAST_PACKET &&
828 n >= lum_offset)
829 atomic_set(&sd->avg_lum, data[-lum_offset] +
830 data[-lum_offset + 1]);
831
832 /* Start the new frame with the jpeg header */
833 /* The PAC7302 has the image rotated 90 degrees */
834 gspca_frame_add(gspca_dev, FIRST_PACKET,
835 jpeg_header, sizeof jpeg_header);
836 }
837 gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
838 }
839
840 #ifdef CONFIG_VIDEO_ADV_DEBUG
841 static int sd_dbg_s_register(struct gspca_dev *gspca_dev,
842 const struct v4l2_dbg_register *reg)
843 {
844 u8 index;
845 u8 value;
846
847 /*
848 * reg->reg: bit0..15: reserved for register index (wIndex is 16bit
849 * long on the USB bus)
850 */
851 if (reg->match.addr == 0 &&
852 (reg->reg < 0x000000ff) &&
853 (reg->val <= 0x000000ff)
854 ) {
855 /* Currently writing to page 0 is only supported. */
856 /* reg_w() only supports 8bit index */
857 index = reg->reg;
858 value = reg->val;
859
860 /*
861 * Note that there shall be no access to other page
862 * by any other function between the page switch and
863 * the actual register write.
864 */
865 reg_w(gspca_dev, 0xff, 0x00); /* page 0 */
866 reg_w(gspca_dev, index, value);
867
868 reg_w(gspca_dev, 0xdc, 0x01);
869 }
870 return gspca_dev->usb_err;
871 }
872 #endif
873
874 #if IS_ENABLED(CONFIG_INPUT)
875 static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
876 u8 *data, /* interrupt packet data */
877 int len) /* interrupt packet length */
878 {
879 int ret = -EINVAL;
880 u8 data0, data1;
881
882 if (len == 2) {
883 data0 = data[0];
884 data1 = data[1];
885 if ((data0 == 0x00 && data1 == 0x11) ||
886 (data0 == 0x22 && data1 == 0x33) ||
887 (data0 == 0x44 && data1 == 0x55) ||
888 (data0 == 0x66 && data1 == 0x77) ||
889 (data0 == 0x88 && data1 == 0x99) ||
890 (data0 == 0xaa && data1 == 0xbb) ||
891 (data0 == 0xcc && data1 == 0xdd) ||
892 (data0 == 0xee && data1 == 0xff)) {
893 input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);
894 input_sync(gspca_dev->input_dev);
895 input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);
896 input_sync(gspca_dev->input_dev);
897 ret = 0;
898 }
899 }
900
901 return ret;
902 }
903 #endif
904
905 /* sub-driver description for pac7302 */
906 static const struct sd_desc sd_desc = {
907 .name = KBUILD_MODNAME,
908 .config = sd_config,
909 .init = sd_init,
910 .init_controls = sd_init_controls,
911 .start = sd_start,
912 .stopN = sd_stopN,
913 .stop0 = sd_stop0,
914 .pkt_scan = sd_pkt_scan,
915 .dq_callback = do_autogain,
916 #ifdef CONFIG_VIDEO_ADV_DEBUG
917 .set_register = sd_dbg_s_register,
918 #endif
919 #if IS_ENABLED(CONFIG_INPUT)
920 .int_pkt_scan = sd_int_pkt_scan,
921 #endif
922 };
923
924 /* -- module initialisation -- */
925 static const struct usb_device_id device_table[] = {
926 {USB_DEVICE(0x06f8, 0x3009)},
927 {USB_DEVICE(0x06f8, 0x301b)},
928 {USB_DEVICE(0x093a, 0x2620)},
929 {USB_DEVICE(0x093a, 0x2621)},
930 {USB_DEVICE(0x093a, 0x2622), .driver_info = FL_VFLIP},
931 {USB_DEVICE(0x093a, 0x2624), .driver_info = FL_VFLIP},
932 {USB_DEVICE(0x093a, 0x2625)},
933 {USB_DEVICE(0x093a, 0x2626)},
934 {USB_DEVICE(0x093a, 0x2627), .driver_info = FL_VFLIP},
935 {USB_DEVICE(0x093a, 0x2628)},
936 {USB_DEVICE(0x093a, 0x2629), .driver_info = FL_VFLIP},
937 {USB_DEVICE(0x093a, 0x262a)},
938 {USB_DEVICE(0x093a, 0x262c)},
939 {USB_DEVICE(0x145f, 0x013c)},
940 {USB_DEVICE(0x1ae7, 0x2001)}, /* SpeedLink Snappy Mic SL-6825-SBK */
941 {}
942 };
943 MODULE_DEVICE_TABLE(usb, device_table);
944
945 /* -- device connect -- */
946 static int sd_probe(struct usb_interface *intf,
947 const struct usb_device_id *id)
948 {
949 return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
950 THIS_MODULE);
951 }
952
953 static struct usb_driver sd_driver = {
954 .name = KBUILD_MODNAME,
955 .id_table = device_table,
956 .probe = sd_probe,
957 .disconnect = gspca_disconnect,
958 #ifdef CONFIG_PM
959 .suspend = gspca_suspend,
960 .resume = gspca_resume,
961 .reset_resume = gspca_resume,
962 #endif
963 };
964
965 module_usb_driver(sd_driver);
This page took 0.068402 seconds and 6 git commands to generate.