4 * Copyright (C) 2008-2011 Jean-François Moine <moinejf@free.fr>
5 * Copyright (C) 2009 Hans de Goede <hdegoede@redhat.com>
7 * This module is adapted from the ov51x-jpeg package, which itself
8 * was adapted from the ov511 driver.
10 * Original copyright for the ov511 driver is:
12 * Copyright (c) 1999-2006 Mark W. McClelland
13 * Support for OV519, OV8610 Copyright (c) 2003 Joerg Heckenbach
14 * Many improvements by Bret Wallach <bwallac1@san.rr.com>
15 * Color fixes by by Orion Sky Lawlor <olawlor@acm.org> (2/26/2000)
16 * OV7620 fixes by Charl P. Botha <cpbotha@ieee.org>
17 * Changes by Claudio Matsuoka <claudio@conectiva.com>
19 * ov51x-jpeg original copyright is:
21 * Copyright (c) 2004-2007 Romain Beauxis <toots@rastageeks.org>
22 * Support for OV7670 sensors was contributed by Sam Skipsey <aoanla@yahoo.com>
24 * This program is free software; you can redistribute it and/or modify
25 * it under the terms of the GNU General Public License as published by
26 * the Free Software Foundation; either version 2 of the License, or
29 * This program is distributed in the hope that it will be useful,
30 * but WITHOUT ANY WARRANTY; without even the implied warranty of
31 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
32 * GNU General Public License for more details.
34 * You should have received a copy of the GNU General Public License
35 * along with this program; if not, write to the Free Software
36 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
40 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
42 #define MODULE_NAME "ov519"
44 #include <linux/input.h>
47 /* The jpeg_hdr is used by w996Xcf only */
48 /* The CONEX_CAM define for jpeg.h needs renaming, now its used here too */
52 MODULE_AUTHOR("Jean-Francois Moine <http://moinejf.free.fr>");
53 MODULE_DESCRIPTION("OV519 USB Camera Driver");
54 MODULE_LICENSE("GPL");
56 /* global parameters */
57 static int frame_rate
;
59 /* Number of times to retry a failed I2C transaction. Increase this if you
60 * are getting "Failed to read sensor ID..." */
61 static int i2c_detect_tries
= 10;
63 /* ov519 device descriptor */
65 struct gspca_dev gspca_dev
; /* !! must be the first item */
67 struct v4l2_ctrl
*jpegqual
;
68 struct v4l2_ctrl
*freq
;
69 struct { /* h/vflip control cluster */
70 struct v4l2_ctrl
*hflip
;
71 struct v4l2_ctrl
*vflip
;
73 struct { /* autobrightness/brightness control cluster */
74 struct v4l2_ctrl
*autobright
;
75 struct v4l2_ctrl
*brightness
;
81 #define BRIDGE_OV511 0
82 #define BRIDGE_OV511PLUS 1
83 #define BRIDGE_OV518 2
84 #define BRIDGE_OV518PLUS 3
85 #define BRIDGE_OV519 4 /* = ov530 */
86 #define BRIDGE_OVFX2 5
87 #define BRIDGE_W9968CF 6
91 #define BRIDGE_INVERT_LED 8
93 char snapshot_pressed
;
94 char snapshot_needs_reset
;
96 /* Determined by sensor type */
99 #define QUALITY_MIN 50
100 #define QUALITY_MAX 70
101 #define QUALITY_DEF 50
103 u8 stopped
; /* Streaming is temporarily paused */
106 u8 frame_rate
; /* current Framerate */
107 u8 clockdiv
; /* clockdiv override */
109 s8 sensor
; /* Type of image sensor chip (SEN_*) */
114 s16 sensor_reg_cache
[256];
116 u8 jpeg_hdr
[JPEG_HDR_SZ
];
137 /* Note this is a bit of a hack, but the w9968cf driver needs the code for all
138 the ov sensors which is already present here. When we have the time we
139 really should move the sensor drivers to v4l2 sub drivers. */
142 /* table of the disabled controls */
144 unsigned int has_brightness
:1;
145 unsigned int has_contrast
:1;
146 unsigned int has_exposure
:1;
147 unsigned int has_autogain
:1;
148 unsigned int has_sat
:1;
149 unsigned int has_hvflip
:1;
150 unsigned int has_autobright
:1;
151 unsigned int has_freq
:1;
154 static const struct ctrl_valid valid_controls
[] = {
250 static const struct v4l2_pix_format ov519_vga_mode
[] = {
251 {320, 240, V4L2_PIX_FMT_JPEG
, V4L2_FIELD_NONE
,
253 .sizeimage
= 320 * 240 * 3 / 8 + 590,
254 .colorspace
= V4L2_COLORSPACE_JPEG
,
256 {640, 480, V4L2_PIX_FMT_JPEG
, V4L2_FIELD_NONE
,
258 .sizeimage
= 640 * 480 * 3 / 8 + 590,
259 .colorspace
= V4L2_COLORSPACE_JPEG
,
262 static const struct v4l2_pix_format ov519_sif_mode
[] = {
263 {160, 120, V4L2_PIX_FMT_JPEG
, V4L2_FIELD_NONE
,
265 .sizeimage
= 160 * 120 * 3 / 8 + 590,
266 .colorspace
= V4L2_COLORSPACE_JPEG
,
268 {176, 144, V4L2_PIX_FMT_JPEG
, V4L2_FIELD_NONE
,
270 .sizeimage
= 176 * 144 * 3 / 8 + 590,
271 .colorspace
= V4L2_COLORSPACE_JPEG
,
273 {320, 240, V4L2_PIX_FMT_JPEG
, V4L2_FIELD_NONE
,
275 .sizeimage
= 320 * 240 * 3 / 8 + 590,
276 .colorspace
= V4L2_COLORSPACE_JPEG
,
278 {352, 288, V4L2_PIX_FMT_JPEG
, V4L2_FIELD_NONE
,
280 .sizeimage
= 352 * 288 * 3 / 8 + 590,
281 .colorspace
= V4L2_COLORSPACE_JPEG
,
285 /* Note some of the sizeimage values for the ov511 / ov518 may seem
286 larger then necessary, however they need to be this big as the ov511 /
287 ov518 always fills the entire isoc frame, using 0 padding bytes when
288 it doesn't have any data. So with low framerates the amount of data
289 transferred can become quite large (libv4l will remove all the 0 padding
291 static const struct v4l2_pix_format ov518_vga_mode
[] = {
292 {320, 240, V4L2_PIX_FMT_OV518
, V4L2_FIELD_NONE
,
294 .sizeimage
= 320 * 240 * 3,
295 .colorspace
= V4L2_COLORSPACE_JPEG
,
297 {640, 480, V4L2_PIX_FMT_OV518
, V4L2_FIELD_NONE
,
299 .sizeimage
= 640 * 480 * 2,
300 .colorspace
= V4L2_COLORSPACE_JPEG
,
303 static const struct v4l2_pix_format ov518_sif_mode
[] = {
304 {160, 120, V4L2_PIX_FMT_OV518
, V4L2_FIELD_NONE
,
307 .colorspace
= V4L2_COLORSPACE_JPEG
,
309 {176, 144, V4L2_PIX_FMT_OV518
, V4L2_FIELD_NONE
,
312 .colorspace
= V4L2_COLORSPACE_JPEG
,
314 {320, 240, V4L2_PIX_FMT_OV518
, V4L2_FIELD_NONE
,
316 .sizeimage
= 320 * 240 * 3,
317 .colorspace
= V4L2_COLORSPACE_JPEG
,
319 {352, 288, V4L2_PIX_FMT_OV518
, V4L2_FIELD_NONE
,
321 .sizeimage
= 352 * 288 * 3,
322 .colorspace
= V4L2_COLORSPACE_JPEG
,
326 static const struct v4l2_pix_format ov511_vga_mode
[] = {
327 {320, 240, V4L2_PIX_FMT_OV511
, V4L2_FIELD_NONE
,
329 .sizeimage
= 320 * 240 * 3,
330 .colorspace
= V4L2_COLORSPACE_JPEG
,
332 {640, 480, V4L2_PIX_FMT_OV511
, V4L2_FIELD_NONE
,
334 .sizeimage
= 640 * 480 * 2,
335 .colorspace
= V4L2_COLORSPACE_JPEG
,
338 static const struct v4l2_pix_format ov511_sif_mode
[] = {
339 {160, 120, V4L2_PIX_FMT_OV511
, V4L2_FIELD_NONE
,
342 .colorspace
= V4L2_COLORSPACE_JPEG
,
344 {176, 144, V4L2_PIX_FMT_OV511
, V4L2_FIELD_NONE
,
347 .colorspace
= V4L2_COLORSPACE_JPEG
,
349 {320, 240, V4L2_PIX_FMT_OV511
, V4L2_FIELD_NONE
,
351 .sizeimage
= 320 * 240 * 3,
352 .colorspace
= V4L2_COLORSPACE_JPEG
,
354 {352, 288, V4L2_PIX_FMT_OV511
, V4L2_FIELD_NONE
,
356 .sizeimage
= 352 * 288 * 3,
357 .colorspace
= V4L2_COLORSPACE_JPEG
,
361 static const struct v4l2_pix_format ovfx2_vga_mode
[] = {
362 {320, 240, V4L2_PIX_FMT_SBGGR8
, V4L2_FIELD_NONE
,
364 .sizeimage
= 320 * 240,
365 .colorspace
= V4L2_COLORSPACE_SRGB
,
367 {640, 480, V4L2_PIX_FMT_SBGGR8
, V4L2_FIELD_NONE
,
369 .sizeimage
= 640 * 480,
370 .colorspace
= V4L2_COLORSPACE_SRGB
,
373 static const struct v4l2_pix_format ovfx2_cif_mode
[] = {
374 {160, 120, V4L2_PIX_FMT_SBGGR8
, V4L2_FIELD_NONE
,
376 .sizeimage
= 160 * 120,
377 .colorspace
= V4L2_COLORSPACE_SRGB
,
379 {176, 144, V4L2_PIX_FMT_SBGGR8
, V4L2_FIELD_NONE
,
381 .sizeimage
= 176 * 144,
382 .colorspace
= V4L2_COLORSPACE_SRGB
,
384 {320, 240, V4L2_PIX_FMT_SBGGR8
, V4L2_FIELD_NONE
,
386 .sizeimage
= 320 * 240,
387 .colorspace
= V4L2_COLORSPACE_SRGB
,
389 {352, 288, V4L2_PIX_FMT_SBGGR8
, V4L2_FIELD_NONE
,
391 .sizeimage
= 352 * 288,
392 .colorspace
= V4L2_COLORSPACE_SRGB
,
395 static const struct v4l2_pix_format ovfx2_ov2610_mode
[] = {
396 {800, 600, V4L2_PIX_FMT_SBGGR8
, V4L2_FIELD_NONE
,
398 .sizeimage
= 800 * 600,
399 .colorspace
= V4L2_COLORSPACE_SRGB
,
401 {1600, 1200, V4L2_PIX_FMT_SBGGR8
, V4L2_FIELD_NONE
,
402 .bytesperline
= 1600,
403 .sizeimage
= 1600 * 1200,
404 .colorspace
= V4L2_COLORSPACE_SRGB
},
406 static const struct v4l2_pix_format ovfx2_ov3610_mode
[] = {
407 {640, 480, V4L2_PIX_FMT_SBGGR8
, V4L2_FIELD_NONE
,
409 .sizeimage
= 640 * 480,
410 .colorspace
= V4L2_COLORSPACE_SRGB
,
412 {800, 600, V4L2_PIX_FMT_SBGGR8
, V4L2_FIELD_NONE
,
414 .sizeimage
= 800 * 600,
415 .colorspace
= V4L2_COLORSPACE_SRGB
,
417 {1024, 768, V4L2_PIX_FMT_SBGGR8
, V4L2_FIELD_NONE
,
418 .bytesperline
= 1024,
419 .sizeimage
= 1024 * 768,
420 .colorspace
= V4L2_COLORSPACE_SRGB
,
422 {1600, 1200, V4L2_PIX_FMT_SBGGR8
, V4L2_FIELD_NONE
,
423 .bytesperline
= 1600,
424 .sizeimage
= 1600 * 1200,
425 .colorspace
= V4L2_COLORSPACE_SRGB
,
427 {2048, 1536, V4L2_PIX_FMT_SBGGR8
, V4L2_FIELD_NONE
,
428 .bytesperline
= 2048,
429 .sizeimage
= 2048 * 1536,
430 .colorspace
= V4L2_COLORSPACE_SRGB
,
433 static const struct v4l2_pix_format ovfx2_ov9600_mode
[] = {
434 {640, 480, V4L2_PIX_FMT_SBGGR8
, V4L2_FIELD_NONE
,
436 .sizeimage
= 640 * 480,
437 .colorspace
= V4L2_COLORSPACE_SRGB
,
439 {1280, 1024, V4L2_PIX_FMT_SBGGR8
, V4L2_FIELD_NONE
,
440 .bytesperline
= 1280,
441 .sizeimage
= 1280 * 1024,
442 .colorspace
= V4L2_COLORSPACE_SRGB
},
445 /* Registers common to OV511 / OV518 */
446 #define R51x_FIFO_PSIZE 0x30 /* 2 bytes wide w/ OV518(+) */
447 #define R51x_SYS_RESET 0x50
448 /* Reset type flags */
449 #define OV511_RESET_OMNICE 0x08
450 #define R51x_SYS_INIT 0x53
451 #define R51x_SYS_SNAP 0x52
452 #define R51x_SYS_CUST_ID 0x5f
453 #define R51x_COMP_LUT_BEGIN 0x80
455 /* OV511 Camera interface register numbers */
456 #define R511_CAM_DELAY 0x10
457 #define R511_CAM_EDGE 0x11
458 #define R511_CAM_PXCNT 0x12
459 #define R511_CAM_LNCNT 0x13
460 #define R511_CAM_PXDIV 0x14
461 #define R511_CAM_LNDIV 0x15
462 #define R511_CAM_UV_EN 0x16
463 #define R511_CAM_LINE_MODE 0x17
464 #define R511_CAM_OPTS 0x18
466 #define R511_SNAP_FRAME 0x19
467 #define R511_SNAP_PXCNT 0x1a
468 #define R511_SNAP_LNCNT 0x1b
469 #define R511_SNAP_PXDIV 0x1c
470 #define R511_SNAP_LNDIV 0x1d
471 #define R511_SNAP_UV_EN 0x1e
472 #define R511_SNAP_OPTS 0x1f
474 #define R511_DRAM_FLOW_CTL 0x20
475 #define R511_FIFO_OPTS 0x31
476 #define R511_I2C_CTL 0x40
477 #define R511_SYS_LED_CTL 0x55 /* OV511+ only */
478 #define R511_COMP_EN 0x78
479 #define R511_COMP_LUT_EN 0x79
481 /* OV518 Camera interface register numbers */
482 #define R518_GPIO_OUT 0x56 /* OV518(+) only */
483 #define R518_GPIO_CTL 0x57 /* OV518(+) only */
485 /* OV519 Camera interface register numbers */
486 #define OV519_R10_H_SIZE 0x10
487 #define OV519_R11_V_SIZE 0x11
488 #define OV519_R12_X_OFFSETL 0x12
489 #define OV519_R13_X_OFFSETH 0x13
490 #define OV519_R14_Y_OFFSETL 0x14
491 #define OV519_R15_Y_OFFSETH 0x15
492 #define OV519_R16_DIVIDER 0x16
493 #define OV519_R20_DFR 0x20
494 #define OV519_R25_FORMAT 0x25
496 /* OV519 System Controller register numbers */
497 #define OV519_R51_RESET1 0x51
498 #define OV519_R54_EN_CLK1 0x54
499 #define OV519_R57_SNAPSHOT 0x57
501 #define OV519_GPIO_DATA_OUT0 0x71
502 #define OV519_GPIO_IO_CTRL0 0x72
504 /*#define OV511_ENDPOINT_ADDRESS 1 * Isoc endpoint number */
507 * The FX2 chip does not give us a zero length read at end of frame.
508 * It does, however, give a short read at the end of a frame, if
509 * necessary, rather than run two frames together.
511 * By choosing the right bulk transfer size, we are guaranteed to always
512 * get a short read for the last read of each frame. Frame sizes are
513 * always a composite number (width * height, or a multiple) so if we
514 * choose a prime number, we are guaranteed that the last read of a
515 * frame will be short.
517 * But it isn't that easy: the 2.6 kernel requires a multiple of 4KB,
518 * otherwise EOVERFLOW "babbling" errors occur. I have not been able
519 * to figure out why. [PMiller]
521 * The constant (13 * 4096) is the largest "prime enough" number less than 64KB.
523 * It isn't enough to know the number of bytes per frame, in case we
524 * have data dropouts or buffer overruns (even though the FX2 double
525 * buffers, there are some pretty strict real time constraints for
526 * isochronous transfer for larger frame sizes).
528 /*jfm: this value does not work for 800x600 - see isoc_init */
529 #define OVFX2_BULK_SIZE (13 * 4096)
532 #define R51x_I2C_W_SID 0x41
533 #define R51x_I2C_SADDR_3 0x42
534 #define R51x_I2C_SADDR_2 0x43
535 #define R51x_I2C_R_SID 0x44
536 #define R51x_I2C_DATA 0x45
537 #define R518_I2C_CTL 0x47 /* OV518(+) only */
538 #define OVFX2_I2C_ADDR 0x00
541 #define OV7xx0_SID 0x42
542 #define OV_HIRES_SID 0x60 /* OV9xxx / OV2xxx / OV3xxx */
543 #define OV8xx0_SID 0xa0
544 #define OV6xx0_SID 0xc0
546 /* OV7610 registers */
547 #define OV7610_REG_GAIN 0x00 /* gain setting (5:0) */
548 #define OV7610_REG_BLUE 0x01 /* blue channel balance */
549 #define OV7610_REG_RED 0x02 /* red channel balance */
550 #define OV7610_REG_SAT 0x03 /* saturation */
551 #define OV8610_REG_HUE 0x04 /* 04 reserved */
552 #define OV7610_REG_CNT 0x05 /* Y contrast */
553 #define OV7610_REG_BRT 0x06 /* Y brightness */
554 #define OV7610_REG_COM_C 0x14 /* misc common regs */
555 #define OV7610_REG_ID_HIGH 0x1c /* manufacturer ID MSB */
556 #define OV7610_REG_ID_LOW 0x1d /* manufacturer ID LSB */
557 #define OV7610_REG_COM_I 0x29 /* misc settings */
559 /* OV7660 and OV7670 registers */
560 #define OV7670_R00_GAIN 0x00 /* Gain lower 8 bits (rest in vref) */
561 #define OV7670_R01_BLUE 0x01 /* blue gain */
562 #define OV7670_R02_RED 0x02 /* red gain */
563 #define OV7670_R03_VREF 0x03 /* Pieces of GAIN, VSTART, VSTOP */
564 #define OV7670_R04_COM1 0x04 /* Control 1 */
565 /*#define OV7670_R07_AECHH 0x07 * AEC MS 5 bits */
566 #define OV7670_R0C_COM3 0x0c /* Control 3 */
567 #define OV7670_R0D_COM4 0x0d /* Control 4 */
568 #define OV7670_R0E_COM5 0x0e /* All "reserved" */
569 #define OV7670_R0F_COM6 0x0f /* Control 6 */
570 #define OV7670_R10_AECH 0x10 /* More bits of AEC value */
571 #define OV7670_R11_CLKRC 0x11 /* Clock control */
572 #define OV7670_R12_COM7 0x12 /* Control 7 */
573 #define OV7670_COM7_FMT_VGA 0x00
574 /*#define OV7670_COM7_YUV 0x00 * YUV */
575 #define OV7670_COM7_FMT_QVGA 0x10 /* QVGA format */
576 #define OV7670_COM7_FMT_MASK 0x38
577 #define OV7670_COM7_RESET 0x80 /* Register reset */
578 #define OV7670_R13_COM8 0x13 /* Control 8 */
579 #define OV7670_COM8_AEC 0x01 /* Auto exposure enable */
580 #define OV7670_COM8_AWB 0x02 /* White balance enable */
581 #define OV7670_COM8_AGC 0x04 /* Auto gain enable */
582 #define OV7670_COM8_BFILT 0x20 /* Band filter enable */
583 #define OV7670_COM8_AECSTEP 0x40 /* Unlimited AEC step size */
584 #define OV7670_COM8_FASTAEC 0x80 /* Enable fast AGC/AEC */
585 #define OV7670_R14_COM9 0x14 /* Control 9 - gain ceiling */
586 #define OV7670_R15_COM10 0x15 /* Control 10 */
587 #define OV7670_R17_HSTART 0x17 /* Horiz start high bits */
588 #define OV7670_R18_HSTOP 0x18 /* Horiz stop high bits */
589 #define OV7670_R19_VSTART 0x19 /* Vert start high bits */
590 #define OV7670_R1A_VSTOP 0x1a /* Vert stop high bits */
591 #define OV7670_R1E_MVFP 0x1e /* Mirror / vflip */
592 #define OV7670_MVFP_VFLIP 0x10 /* vertical flip */
593 #define OV7670_MVFP_MIRROR 0x20 /* Mirror image */
594 #define OV7670_R24_AEW 0x24 /* AGC upper limit */
595 #define OV7670_R25_AEB 0x25 /* AGC lower limit */
596 #define OV7670_R26_VPT 0x26 /* AGC/AEC fast mode op region */
597 #define OV7670_R32_HREF 0x32 /* HREF pieces */
598 #define OV7670_R3A_TSLB 0x3a /* lots of stuff */
599 #define OV7670_R3B_COM11 0x3b /* Control 11 */
600 #define OV7670_COM11_EXP 0x02
601 #define OV7670_COM11_HZAUTO 0x10 /* Auto detect 50/60 Hz */
602 #define OV7670_R3C_COM12 0x3c /* Control 12 */
603 #define OV7670_R3D_COM13 0x3d /* Control 13 */
604 #define OV7670_COM13_GAMMA 0x80 /* Gamma enable */
605 #define OV7670_COM13_UVSAT 0x40 /* UV saturation auto adjustment */
606 #define OV7670_R3E_COM14 0x3e /* Control 14 */
607 #define OV7670_R3F_EDGE 0x3f /* Edge enhancement factor */
608 #define OV7670_R40_COM15 0x40 /* Control 15 */
609 /*#define OV7670_COM15_R00FF 0xc0 * 00 to FF */
610 #define OV7670_R41_COM16 0x41 /* Control 16 */
611 #define OV7670_COM16_AWBGAIN 0x08 /* AWB gain enable */
612 /* end of ov7660 common registers */
613 #define OV7670_R55_BRIGHT 0x55 /* Brightness */
614 #define OV7670_R56_CONTRAS 0x56 /* Contrast control */
615 #define OV7670_R69_GFIX 0x69 /* Fix gain control */
616 /*#define OV7670_R8C_RGB444 0x8c * RGB 444 control */
617 #define OV7670_R9F_HAECC1 0x9f /* Hist AEC/AGC control 1 */
618 #define OV7670_RA0_HAECC2 0xa0 /* Hist AEC/AGC control 2 */
619 #define OV7670_RA5_BD50MAX 0xa5 /* 50hz banding step limit */
620 #define OV7670_RA6_HAECC3 0xa6 /* Hist AEC/AGC control 3 */
621 #define OV7670_RA7_HAECC4 0xa7 /* Hist AEC/AGC control 4 */
622 #define OV7670_RA8_HAECC5 0xa8 /* Hist AEC/AGC control 5 */
623 #define OV7670_RA9_HAECC6 0xa9 /* Hist AEC/AGC control 6 */
624 #define OV7670_RAA_HAECC7 0xaa /* Hist AEC/AGC control 7 */
625 #define OV7670_RAB_BD60MAX 0xab /* 60hz banding step limit */
631 struct ov_i2c_regvals
{
636 /* Settings for OV2610 camera chip */
637 static const struct ov_i2c_regvals norm_2610
[] = {
638 { 0x12, 0x80 }, /* reset */
641 static const struct ov_i2c_regvals norm_2610ae
[] = {
642 {0x12, 0x80}, /* reset */
647 {0x12, 0x20}, /* 1600x1200 */
652 {0x11, 0x83}, /* clock / 3 ? */
653 {0x2d, 0x00}, /* 60 Hz filter */
654 {0x24, 0xb0}, /* normal colors */
659 static const struct ov_i2c_regvals norm_3620b
[] = {
661 * From the datasheet: "Note that after writing to register COMH
662 * (0x12) to change the sensor mode, registers related to the
663 * sensor’s cropping window will be reset back to their default
666 * "wait 4096 external clock ... to make sure the sensor is
667 * stable and ready to access registers" i.e. 160us at 24MHz
669 { 0x12, 0x80 }, /* COMH reset */
670 { 0x12, 0x00 }, /* QXGA, master */
673 * 11 CLKRC "Clock Rate Control"
674 * [7] internal frequency doublers: on
675 * [6] video port mode: master
676 * [5:0] clock divider: 1
681 * 13 COMI "Common Control I"
682 * = 192 (0xC0) 11000000
683 * COMI[7] "AEC speed selection"
684 * = 1 (0x01) 1....... "Faster AEC correction"
685 * COMI[6] "AEC speed step selection"
686 * = 1 (0x01) .1...... "Big steps, fast"
687 * COMI[5] "Banding filter on off"
688 * = 0 (0x00) ..0..... "Off"
689 * COMI[4] "Banding filter option"
690 * = 0 (0x00) ...0.... "Main clock is 48 MHz and
693 * = 0 (0x00) ....0...
694 * COMI[2] "AGC auto manual control selection"
695 * = 0 (0x00) .....0.. "Manual"
696 * COMI[1] "AWB auto manual control selection"
697 * = 0 (0x00) ......0. "Manual"
698 * COMI[0] "Exposure control"
699 * = 0 (0x00) .......0 "Manual"
704 * 09 COMC "Common Control C"
705 * = 8 (0x08) 00001000
706 * COMC[7:5] "Reserved"
707 * = 0 (0x00) 000.....
708 * COMC[4] "Sleep Mode Enable"
709 * = 0 (0x00) ...0.... "Normal mode"
710 * COMC[3:2] "Sensor sampling reset timing selection"
711 * = 2 (0x02) ....10.. "Longer reset time"
712 * COMC[1:0] "Output drive current select"
713 * = 0 (0x00) ......00 "Weakest"
718 * 0C COMD "Common Control D"
719 * = 8 (0x08) 00001000
721 * = 0 (0x00) 0.......
722 * COMD[6] "Swap MSB and LSB at the output port"
723 * = 0 (0x00) .0...... "False"
724 * COMD[5:3] "Reserved"
725 * = 1 (0x01) ..001...
726 * COMD[2] "Output Average On Off"
727 * = 0 (0x00) .....0.. "Output Normal"
728 * COMD[1] "Sensor precharge voltage selection"
729 * = 0 (0x00) ......0. "Selects internal
730 * reference precharge
732 * COMD[0] "Snapshot option"
733 * = 0 (0x00) .......0 "Enable live video output
734 * after snapshot sequence"
739 * 0D COME "Common Control E"
740 * = 161 (0xA1) 10100001
741 * COME[7] "Output average option"
742 * = 1 (0x01) 1....... "Output average of 4 pixels"
743 * COME[6] "Anti-blooming control"
744 * = 0 (0x00) .0...... "Off"
745 * COME[5:3] "Reserved"
746 * = 4 (0x04) ..100...
747 * COME[2] "Clock output power down pin status"
748 * = 0 (0x00) .....0.. "Tri-state data output pin
750 * COME[1] "Data output pin status selection at power down"
751 * = 0 (0x00) ......0. "Tri-state VSYNC, PCLK,
752 * HREF, and CHSYNC pins on
754 * COME[0] "Auto zero circuit select"
755 * = 1 (0x01) .......1 "On"
760 * 0E COMF "Common Control F"
761 * = 112 (0x70) 01110000
762 * COMF[7] "System clock selection"
763 * = 0 (0x00) 0....... "Use 24 MHz system clock"
764 * COMF[6:4] "Reserved"
765 * = 7 (0x07) .111....
766 * COMF[3] "Manual auto negative offset canceling selection"
767 * = 0 (0x00) ....0... "Auto detect negative
768 * offset and cancel it"
769 * COMF[2:0] "Reserved"
770 * = 0 (0x00) .....000
775 * 0F COMG "Common Control G"
776 * = 66 (0x42) 01000010
777 * COMG[7] "Optical black output selection"
778 * = 0 (0x00) 0....... "Disable"
779 * COMG[6] "Black level calibrate selection"
780 * = 1 (0x01) .1...... "Use optical black pixels
782 * COMG[5:4] "Reserved"
783 * = 0 (0x00) ..00....
784 * COMG[3] "Channel offset adjustment"
785 * = 0 (0x00) ....0... "Disable offset adjustment"
786 * COMG[2] "ADC black level calibration option"
787 * = 0 (0x00) .....0.. "Use B/G line and G/R
788 * line to calibrate each
789 * channel's black level"
791 * = 1 (0x01) ......1.
792 * COMG[0] "ADC black level calibration enable"
793 * = 0 (0x00) .......0 "Disable"
798 * 14 COMJ "Common Control J"
799 * = 198 (0xC6) 11000110
800 * COMJ[7:6] "AGC gain ceiling"
801 * = 3 (0x03) 11...... "8x"
802 * COMJ[5:4] "Reserved"
803 * = 0 (0x00) ..00....
804 * COMJ[3] "Auto banding filter"
805 * = 0 (0x00) ....0... "Banding filter is always
806 * on off depending on
808 * COMJ[2] "VSYNC drop option"
809 * = 1 (0x01) .....1.. "SYNC is dropped if frame
811 * COMJ[1] "Frame data drop"
812 * = 1 (0x01) ......1. "Drop frame data if
813 * exposure is not within
814 * tolerance. In AEC mode,
815 * data is normally dropped
816 * when data is out of
819 * = 0 (0x00) .......0
824 * 15 COMK "Common Control K"
825 * = 2 (0x02) 00000010
826 * COMK[7] "CHSYNC pin output swap"
827 * = 0 (0x00) 0....... "CHSYNC"
828 * COMK[6] "HREF pin output swap"
829 * = 0 (0x00) .0...... "HREF"
830 * COMK[5] "PCLK output selection"
831 * = 0 (0x00) ..0..... "PCLK always output"
832 * COMK[4] "PCLK edge selection"
833 * = 0 (0x00) ...0.... "Data valid on falling edge"
834 * COMK[3] "HREF output polarity"
835 * = 0 (0x00) ....0... "positive"
837 * = 0 (0x00) .....0..
838 * COMK[1] "VSYNC polarity"
839 * = 1 (0x01) ......1. "negative"
840 * COMK[0] "HSYNC polarity"
841 * = 0 (0x00) .......0 "positive"
846 * 33 CHLF "Current Control"
847 * = 9 (0x09) 00001001
848 * CHLF[7:6] "Sensor current control"
849 * = 0 (0x00) 00......
850 * CHLF[5] "Sensor current range control"
851 * = 0 (0x00) ..0..... "normal range"
852 * CHLF[4] "Sensor current"
853 * = 0 (0x00) ...0.... "normal current"
854 * CHLF[3] "Sensor buffer current control"
855 * = 1 (0x01) ....1... "half current"
856 * CHLF[2] "Column buffer current control"
857 * = 0 (0x00) .....0.. "normal current"
858 * CHLF[1] "Analog DSP current control"
859 * = 0 (0x00) ......0. "normal current"
860 * CHLF[1] "ADC current control"
861 * = 0 (0x00) ......0. "normal current"
866 * 34 VBLM "Blooming Control"
867 * = 80 (0x50) 01010000
868 * VBLM[7] "Hard soft reset switch"
869 * = 0 (0x00) 0....... "Hard reset"
870 * VBLM[6:4] "Blooming voltage selection"
871 * = 5 (0x05) .101....
872 * VBLM[3:0] "Sensor current control"
873 * = 0 (0x00) ....0000
878 * 36 VCHG "Sensor Precharge Voltage Control"
879 * = 0 (0x00) 00000000
881 * = 0 (0x00) 0.......
882 * VCHG[6:4] "Sensor precharge voltage control"
883 * = 0 (0x00) .000....
884 * VCHG[3:0] "Sensor array common reference"
885 * = 0 (0x00) ....0000
890 * 37 ADC "ADC Reference Control"
891 * = 4 (0x04) 00000100
892 * ADC[7:4] "Reserved"
893 * = 0 (0x00) 0000....
894 * ADC[3] "ADC input signal range"
895 * = 0 (0x00) ....0... "Input signal 1.0x"
896 * ADC[2:0] "ADC range control"
897 * = 4 (0x04) .....100
902 * 38 ACOM "Analog Common Ground"
903 * = 82 (0x52) 01010010
904 * ACOM[7] "Analog gain control"
905 * = 0 (0x00) 0....... "Gain 1x"
906 * ACOM[6] "Analog black level calibration"
907 * = 1 (0x01) .1...... "On"
908 * ACOM[5:0] "Reserved"
909 * = 18 (0x12) ..010010
914 * 3A FREFA "Internal Reference Adjustment"
915 * = 0 (0x00) 00000000
917 * = 0 (0x00) 00000000
922 * 3C FVOPT "Internal Reference Adjustment"
923 * = 31 (0x1F) 00011111
925 * = 31 (0x1F) 00011111
930 * 44 Undocumented = 0 (0x00) 00000000
931 * 44[7:0] "It's a secret"
932 * = 0 (0x00) 00000000
937 * 40 Undocumented = 0 (0x00) 00000000
938 * 40[7:0] "It's a secret"
939 * = 0 (0x00) 00000000
944 * 41 Undocumented = 0 (0x00) 00000000
945 * 41[7:0] "It's a secret"
946 * = 0 (0x00) 00000000
951 * 42 Undocumented = 0 (0x00) 00000000
952 * 42[7:0] "It's a secret"
953 * = 0 (0x00) 00000000
958 * 43 Undocumented = 0 (0x00) 00000000
959 * 43[7:0] "It's a secret"
960 * = 0 (0x00) 00000000
965 * 45 Undocumented = 128 (0x80) 10000000
966 * 45[7:0] "It's a secret"
967 * = 128 (0x80) 10000000
972 * 48 Undocumented = 192 (0xC0) 11000000
973 * 48[7:0] "It's a secret"
974 * = 192 (0xC0) 11000000
979 * 49 Undocumented = 25 (0x19) 00011001
980 * 49[7:0] "It's a secret"
981 * = 25 (0x19) 00011001
986 * 4B Undocumented = 128 (0x80) 10000000
987 * 4B[7:0] "It's a secret"
988 * = 128 (0x80) 10000000
993 * 4D Undocumented = 196 (0xC4) 11000100
994 * 4D[7:0] "It's a secret"
995 * = 196 (0xC4) 11000100
1000 * 35 VREF "Reference Voltage Control"
1001 * = 76 (0x4c) 01001100
1002 * VREF[7:5] "Column high reference control"
1003 * = 2 (0x02) 010..... "higher voltage"
1004 * VREF[4:2] "Column low reference control"
1005 * = 3 (0x03) ...011.. "Highest voltage"
1006 * VREF[1:0] "Reserved"
1007 * = 0 (0x00) ......00
1012 * 3D Undocumented = 0 (0x00) 00000000
1013 * 3D[7:0] "It's a secret"
1014 * = 0 (0x00) 00000000
1019 * 3E Undocumented = 0 (0x00) 00000000
1020 * 3E[7:0] "It's a secret"
1021 * = 0 (0x00) 00000000
1026 * 3B FREFB "Internal Reference Adjustment"
1027 * = 24 (0x18) 00011000
1028 * FREFB[7:0] "Range"
1029 * = 24 (0x18) 00011000
1034 * 33 CHLF "Current Control"
1035 * = 25 (0x19) 00011001
1036 * CHLF[7:6] "Sensor current control"
1037 * = 0 (0x00) 00......
1038 * CHLF[5] "Sensor current range control"
1039 * = 0 (0x00) ..0..... "normal range"
1040 * CHLF[4] "Sensor current"
1041 * = 1 (0x01) ...1.... "double current"
1042 * CHLF[3] "Sensor buffer current control"
1043 * = 1 (0x01) ....1... "half current"
1044 * CHLF[2] "Column buffer current control"
1045 * = 0 (0x00) .....0.. "normal current"
1046 * CHLF[1] "Analog DSP current control"
1047 * = 0 (0x00) ......0. "normal current"
1048 * CHLF[1] "ADC current control"
1049 * = 0 (0x00) ......0. "normal current"
1054 * 34 VBLM "Blooming Control"
1055 * = 90 (0x5A) 01011010
1056 * VBLM[7] "Hard soft reset switch"
1057 * = 0 (0x00) 0....... "Hard reset"
1058 * VBLM[6:4] "Blooming voltage selection"
1059 * = 5 (0x05) .101....
1060 * VBLM[3:0] "Sensor current control"
1061 * = 10 (0x0A) ....1010
1066 * 3B FREFB "Internal Reference Adjustment"
1067 * = 0 (0x00) 00000000
1068 * FREFB[7:0] "Range"
1069 * = 0 (0x00) 00000000
1074 * 33 CHLF "Current Control"
1075 * = 9 (0x09) 00001001
1076 * CHLF[7:6] "Sensor current control"
1077 * = 0 (0x00) 00......
1078 * CHLF[5] "Sensor current range control"
1079 * = 0 (0x00) ..0..... "normal range"
1080 * CHLF[4] "Sensor current"
1081 * = 0 (0x00) ...0.... "normal current"
1082 * CHLF[3] "Sensor buffer current control"
1083 * = 1 (0x01) ....1... "half current"
1084 * CHLF[2] "Column buffer current control"
1085 * = 0 (0x00) .....0.. "normal current"
1086 * CHLF[1] "Analog DSP current control"
1087 * = 0 (0x00) ......0. "normal current"
1088 * CHLF[1] "ADC current control"
1089 * = 0 (0x00) ......0. "normal current"
1094 * 34 VBLM "Blooming Control"
1095 * = 80 (0x50) 01010000
1096 * VBLM[7] "Hard soft reset switch"
1097 * = 0 (0x00) 0....... "Hard reset"
1098 * VBLM[6:4] "Blooming voltage selection"
1099 * = 5 (0x05) .101....
1100 * VBLM[3:0] "Sensor current control"
1101 * = 0 (0x00) ....0000
1106 * 12 COMH "Common Control H"
1107 * = 64 (0x40) 01000000
1109 * = 0 (0x00) 0....... "No-op"
1110 * COMH[6:4] "Resolution selection"
1111 * = 4 (0x04) .100.... "XGA"
1112 * COMH[3] "Master slave selection"
1113 * = 0 (0x00) ....0... "Master mode"
1114 * COMH[2] "Internal B/R channel option"
1115 * = 0 (0x00) .....0.. "B/R use same channel"
1116 * COMH[1] "Color bar test pattern"
1117 * = 0 (0x00) ......0. "Off"
1118 * COMH[0] "Reserved"
1119 * = 0 (0x00) .......0
1124 * 17 HREFST "Horizontal window start"
1125 * = 31 (0x1F) 00011111
1126 * HREFST[7:0] "Horizontal window start, 8 MSBs"
1127 * = 31 (0x1F) 00011111
1132 * 18 HREFEND "Horizontal window end"
1133 * = 95 (0x5F) 01011111
1134 * HREFEND[7:0] "Horizontal Window End, 8 MSBs"
1135 * = 95 (0x5F) 01011111
1140 * 19 VSTRT "Vertical window start"
1141 * = 0 (0x00) 00000000
1142 * VSTRT[7:0] "Vertical Window Start, 8 MSBs"
1143 * = 0 (0x00) 00000000
1148 * 1A VEND "Vertical window end"
1149 * = 96 (0x60) 01100000
1150 * VEND[7:0] "Vertical Window End, 8 MSBs"
1151 * = 96 (0x60) 01100000
1156 * 32 COMM "Common Control M"
1157 * = 18 (0x12) 00010010
1158 * COMM[7:6] "Pixel clock divide option"
1159 * = 0 (0x00) 00...... "/1"
1160 * COMM[5:3] "Horizontal window end position, 3 LSBs"
1161 * = 2 (0x02) ..010...
1162 * COMM[2:0] "Horizontal window start position, 3 LSBs"
1163 * = 2 (0x02) .....010
1168 * 03 COMA "Common Control A"
1169 * = 74 (0x4A) 01001010
1170 * COMA[7:4] "AWB Update Threshold"
1171 * = 4 (0x04) 0100....
1172 * COMA[3:2] "Vertical window end line control 2 LSBs"
1173 * = 2 (0x02) ....10..
1174 * COMA[1:0] "Vertical window start line control 2 LSBs"
1175 * = 2 (0x02) ......10
1180 * 11 CLKRC "Clock Rate Control"
1181 * = 128 (0x80) 10000000
1182 * CLKRC[7] "Internal frequency doublers on off seclection"
1183 * = 1 (0x01) 1....... "On"
1184 * CLKRC[6] "Digital video master slave selection"
1185 * = 0 (0x00) .0...... "Master mode, sensor
1187 * CLKRC[5:0] "Clock divider { CLK = PCLK/(1+CLKRC[5:0]) }"
1188 * = 0 (0x00) ..000000
1193 * 12 COMH "Common Control H"
1194 * = 0 (0x00) 00000000
1196 * = 0 (0x00) 0....... "No-op"
1197 * COMH[6:4] "Resolution selection"
1198 * = 0 (0x00) .000.... "QXGA"
1199 * COMH[3] "Master slave selection"
1200 * = 0 (0x00) ....0... "Master mode"
1201 * COMH[2] "Internal B/R channel option"
1202 * = 0 (0x00) .....0.. "B/R use same channel"
1203 * COMH[1] "Color bar test pattern"
1204 * = 0 (0x00) ......0. "Off"
1205 * COMH[0] "Reserved"
1206 * = 0 (0x00) .......0
1211 * 12 COMH "Common Control H"
1212 * = 64 (0x40) 01000000
1214 * = 0 (0x00) 0....... "No-op"
1215 * COMH[6:4] "Resolution selection"
1216 * = 4 (0x04) .100.... "XGA"
1217 * COMH[3] "Master slave selection"
1218 * = 0 (0x00) ....0... "Master mode"
1219 * COMH[2] "Internal B/R channel option"
1220 * = 0 (0x00) .....0.. "B/R use same channel"
1221 * COMH[1] "Color bar test pattern"
1222 * = 0 (0x00) ......0. "Off"
1223 * COMH[0] "Reserved"
1224 * = 0 (0x00) .......0
1229 * 17 HREFST "Horizontal window start"
1230 * = 31 (0x1F) 00011111
1231 * HREFST[7:0] "Horizontal window start, 8 MSBs"
1232 * = 31 (0x1F) 00011111
1237 * 18 HREFEND "Horizontal window end"
1238 * = 95 (0x5F) 01011111
1239 * HREFEND[7:0] "Horizontal Window End, 8 MSBs"
1240 * = 95 (0x5F) 01011111
1245 * 19 VSTRT "Vertical window start"
1246 * = 0 (0x00) 00000000
1247 * VSTRT[7:0] "Vertical Window Start, 8 MSBs"
1248 * = 0 (0x00) 00000000
1253 * 1A VEND "Vertical window end"
1254 * = 96 (0x60) 01100000
1255 * VEND[7:0] "Vertical Window End, 8 MSBs"
1256 * = 96 (0x60) 01100000
1261 * 32 COMM "Common Control M"
1262 * = 18 (0x12) 00010010
1263 * COMM[7:6] "Pixel clock divide option"
1264 * = 0 (0x00) 00...... "/1"
1265 * COMM[5:3] "Horizontal window end position, 3 LSBs"
1266 * = 2 (0x02) ..010...
1267 * COMM[2:0] "Horizontal window start position, 3 LSBs"
1268 * = 2 (0x02) .....010
1273 * 03 COMA "Common Control A"
1274 * = 74 (0x4A) 01001010
1275 * COMA[7:4] "AWB Update Threshold"
1276 * = 4 (0x04) 0100....
1277 * COMA[3:2] "Vertical window end line control 2 LSBs"
1278 * = 2 (0x02) ....10..
1279 * COMA[1:0] "Vertical window start line control 2 LSBs"
1280 * = 2 (0x02) ......10
1285 * 02 RED "Red Gain Control"
1286 * = 175 (0xAF) 10101111
1288 * = 1 (0x01) 1....... "gain = 1/(1+bitrev([6:0]))"
1290 * = 47 (0x2F) .0101111
1295 * 2D ADDVSL "VSYNC Pulse Width"
1296 * = 210 (0xD2) 11010010
1297 * ADDVSL[7:0] "VSYNC pulse width, LSB"
1298 * = 210 (0xD2) 11010010
1303 * 00 GAIN = 24 (0x18) 00011000
1304 * GAIN[7:6] "Reserved"
1305 * = 0 (0x00) 00......
1307 * = 0 (0x00) ..0..... "False"
1309 * = 1 (0x01) ...1.... "True"
1311 * = 8 (0x08) ....1000
1316 * 01 BLUE "Blue Gain Control"
1317 * = 240 (0xF0) 11110000
1319 * = 1 (0x01) 1....... "gain = 1/(1+bitrev([6:0]))"
1321 * = 112 (0x70) .1110000
1326 * 10 AEC "Automatic Exposure Control"
1327 * = 10 (0x0A) 00001010
1328 * AEC[7:0] "Automatic Exposure Control, 8 MSBs"
1329 * = 10 (0x0A) 00001010
1341 static const struct ov_i2c_regvals norm_6x20
[] = {
1342 { 0x12, 0x80 }, /* reset */
1345 { 0x05, 0x7f }, /* For when autoadjust is off */
1347 /* The ratio of 0x0c and 0x0d controls the white point */
1350 { 0x0f, 0x15 }, /* COMS */
1351 { 0x10, 0x75 }, /* AEC Exposure time */
1352 { 0x12, 0x24 }, /* Enable AGC */
1354 /* 0x16: 0x06 helps frame stability with moving objects */
1356 /* { 0x20, 0x30 }, * Aperture correction enable */
1357 { 0x26, 0xb2 }, /* BLC enable */
1358 /* 0x28: 0x05 Selects RGB format if RGB on */
1360 { 0x2a, 0x04 }, /* Disable framerate adjust */
1361 /* { 0x2b, 0xac }, * Framerate; Set 2a[7] first */
1363 { 0x33, 0xa0 }, /* Color Processing Parameter */
1364 { 0x34, 0xd2 }, /* Max A/D range */
1368 { 0x3c, 0x39 }, /* Enable AEC mode changing */
1369 { 0x3c, 0x3c }, /* Change AEC mode */
1370 { 0x3c, 0x24 }, /* Disable AEC mode changing */
1373 /* These next two registers (0x4a, 0x4b) are undocumented.
1374 * They control the color balance */
1377 { 0x4d, 0xd2 }, /* This reduces noise a bit */
1380 /* Do 50-53 have any effect? */
1381 /* Toggle 0x12[2] off and on here? */
1384 static const struct ov_i2c_regvals norm_6x30
[] = {
1385 { 0x12, 0x80 }, /* Reset */
1386 { 0x00, 0x1f }, /* Gain */
1387 { 0x01, 0x99 }, /* Blue gain */
1388 { 0x02, 0x7c }, /* Red gain */
1389 { 0x03, 0xc0 }, /* Saturation */
1390 { 0x05, 0x0a }, /* Contrast */
1391 { 0x06, 0x95 }, /* Brightness */
1392 { 0x07, 0x2d }, /* Sharpness */
1395 { 0x0e, 0xa0 }, /* Was 0x20, bit7 enables a 2x gain which we need */
1398 { 0x11, 0x00 }, /* Pixel clock = fastest */
1399 { 0x12, 0x24 }, /* Enable AGC and AWB */
1414 { 0x23, 0xc0 }, /* Crystal circuit power level */
1415 { 0x25, 0x9a }, /* Increase AEC black ratio */
1416 { 0x26, 0xb2 }, /* BLC enable */
1420 { 0x2a, 0x84 }, /* 60 Hz power */
1421 { 0x2b, 0xa8 }, /* 60 Hz power */
1423 { 0x2d, 0x95 }, /* Enable auto-brightness */
1437 { 0x40, 0x00 }, /* White bal */
1438 { 0x41, 0x00 }, /* White bal */
1440 { 0x43, 0x3f }, /* White bal */
1450 { 0x4d, 0x10 }, /* U = 0.563u, V = 0.714v */
1452 { 0x4f, 0x07 }, /* UV avg., col. killer: max */
1454 { 0x54, 0x23 }, /* Max AGC gain: 18dB */
1459 { 0x59, 0x01 }, /* AGC dark current comp.: +1 */
1461 { 0x5b, 0x0f }, /* AWB chrominance levels */
1465 { 0x12, 0x20 }, /* Toggle AWB */
1469 /* Lawrence Glaister <lg@jfm.bc.ca> reports:
1471 * Register 0x0f in the 7610 has the following effects:
1473 * 0x85 (AEC method 1): Best overall, good contrast range
1474 * 0x45 (AEC method 2): Very overexposed
1475 * 0xa5 (spec sheet default): Ok, but the black level is
1476 * shifted resulting in loss of contrast
1477 * 0x05 (old driver setting): very overexposed, too much
1480 static const struct ov_i2c_regvals norm_7610
[] = {
1487 { 0x28, 0x24 }, /* 0c */
1488 { 0x0f, 0x85 }, /* lg's setting */
1510 static const struct ov_i2c_regvals norm_7620
[] = {
1511 { 0x12, 0x80 }, /* reset */
1512 { 0x00, 0x00 }, /* gain */
1513 { 0x01, 0x80 }, /* blue gain */
1514 { 0x02, 0x80 }, /* red gain */
1515 { 0x03, 0xc0 }, /* OV7670_R03_VREF */
1538 { 0x28, 0x22 }, /* Was 0x20, bit1 enables a 2x gain which we need */
1577 /* 7640 and 7648. The defaults should be OK for most registers. */
1578 static const struct ov_i2c_regvals norm_7640
[] = {
1583 static const struct ov_regvals init_519_ov7660
[] = {
1584 { 0x5d, 0x03 }, /* Turn off suspend mode */
1585 { 0x53, 0x9b }, /* 0x9f enables the (unused) microcontroller */
1586 { 0x54, 0x0f }, /* bit2 (jpeg enable) */
1587 { 0xa2, 0x20 }, /* a2-a5 are undocumented */
1591 { 0x37, 0x00 }, /* SetUsbInit */
1592 { 0x55, 0x02 }, /* 4.096 Mhz audio clock */
1593 /* Enable both fields, YUV Input, disable defect comp (why?) */
1594 { 0x20, 0x0c }, /* 0x0d does U <-> V swap */
1597 { 0x17, 0x50 }, /* undocumented */
1598 { 0x37, 0x00 }, /* undocumented */
1599 { 0x40, 0xff }, /* I2C timeout counter */
1600 { 0x46, 0x00 }, /* I2C clock prescaler */
1602 static const struct ov_i2c_regvals norm_7660
[] = {
1603 {OV7670_R12_COM7
, OV7670_COM7_RESET
},
1604 {OV7670_R11_CLKRC
, 0x81},
1605 {0x92, 0x00}, /* DM_LNL */
1606 {0x93, 0x00}, /* DM_LNH */
1607 {0x9d, 0x4c}, /* BD50ST */
1608 {0x9e, 0x3f}, /* BD60ST */
1609 {OV7670_R3B_COM11
, 0x02},
1610 {OV7670_R13_COM8
, 0xf5},
1611 {OV7670_R10_AECH
, 0x00},
1612 {OV7670_R00_GAIN
, 0x00},
1613 {OV7670_R01_BLUE
, 0x7c},
1614 {OV7670_R02_RED
, 0x9d},
1615 {OV7670_R12_COM7
, 0x00},
1616 {OV7670_R04_COM1
, 00},
1617 {OV7670_R18_HSTOP
, 0x01},
1618 {OV7670_R17_HSTART
, 0x13},
1619 {OV7670_R32_HREF
, 0x92},
1620 {OV7670_R19_VSTART
, 0x02},
1621 {OV7670_R1A_VSTOP
, 0x7a},
1622 {OV7670_R03_VREF
, 0x00},
1623 {OV7670_R0E_COM5
, 0x04},
1624 {OV7670_R0F_COM6
, 0x62},
1625 {OV7670_R15_COM10
, 0x00},
1626 {0x16, 0x02}, /* RSVD */
1627 {0x1b, 0x00}, /* PSHFT */
1628 {OV7670_R1E_MVFP
, 0x01},
1629 {0x29, 0x3c}, /* RSVD */
1630 {0x33, 0x00}, /* CHLF */
1631 {0x34, 0x07}, /* ARBLM */
1632 {0x35, 0x84}, /* RSVD */
1633 {0x36, 0x00}, /* RSVD */
1634 {0x37, 0x04}, /* ADC */
1635 {0x39, 0x43}, /* OFON */
1636 {OV7670_R3A_TSLB
, 0x00},
1637 {OV7670_R3C_COM12
, 0x6c},
1638 {OV7670_R3D_COM13
, 0x98},
1639 {OV7670_R3F_EDGE
, 0x23},
1640 {OV7670_R40_COM15
, 0xc1},
1641 {OV7670_R41_COM16
, 0x22},
1642 {0x6b, 0x0a}, /* DBLV */
1643 {0xa1, 0x08}, /* RSVD */
1644 {0x69, 0x80}, /* HV */
1645 {0x43, 0xf0}, /* RSVD.. */
1660 {0x9f, 0x9d}, /* RSVD */
1661 {0xa0, 0xa0}, /* DSPC2 */
1662 {0x4f, 0x60}, /* matrix */
1671 {0x58, 0x0d}, /* matrix sign */
1672 {0x8b, 0xcc}, /* RSVD */
1675 {0x6c, 0x40}, /* gamma curve */
1691 {0x7c, 0x04}, /* gamma curve */
1706 {OV7670_R14_COM9
, 0x1e},
1707 {OV7670_R24_AEW
, 0x80},
1708 {OV7670_R25_AEB
, 0x72},
1709 {OV7670_R26_VPT
, 0xb3},
1710 {0x62, 0x80}, /* LCC1 */
1711 {0x63, 0x80}, /* LCC2 */
1712 {0x64, 0x06}, /* LCC3 */
1713 {0x65, 0x00}, /* LCC4 */
1714 {0x66, 0x01}, /* LCC5 */
1715 {0x94, 0x0e}, /* RSVD.. */
1717 {OV7670_R13_COM8
, OV7670_COM8_FASTAEC
1718 | OV7670_COM8_AECSTEP
1726 static const struct ov_i2c_regvals norm_9600
[] = {
1743 /* 7670. Defaults taken from OmniVision provided data,
1744 * as provided by Jonathan Corbet of OLPC */
1745 static const struct ov_i2c_regvals norm_7670
[] = {
1746 { OV7670_R12_COM7
, OV7670_COM7_RESET
},
1747 { OV7670_R3A_TSLB
, 0x04 }, /* OV */
1748 { OV7670_R12_COM7
, OV7670_COM7_FMT_VGA
}, /* VGA */
1749 { OV7670_R11_CLKRC
, 0x01 },
1751 * Set the hardware window. These values from OV don't entirely
1752 * make sense - hstop is less than hstart. But they work...
1754 { OV7670_R17_HSTART
, 0x13 },
1755 { OV7670_R18_HSTOP
, 0x01 },
1756 { OV7670_R32_HREF
, 0xb6 },
1757 { OV7670_R19_VSTART
, 0x02 },
1758 { OV7670_R1A_VSTOP
, 0x7a },
1759 { OV7670_R03_VREF
, 0x0a },
1761 { OV7670_R0C_COM3
, 0x00 },
1762 { OV7670_R3E_COM14
, 0x00 },
1763 /* Mystery scaling numbers */
1769 /* { OV7670_R15_COM10, 0x0 }, */
1771 /* Gamma curve values */
1789 /* AGC and AEC parameters. Note we start by disabling those features,
1790 then turn them only after tweaking the values. */
1791 { OV7670_R13_COM8
, OV7670_COM8_FASTAEC
1792 | OV7670_COM8_AECSTEP
1793 | OV7670_COM8_BFILT
},
1794 { OV7670_R00_GAIN
, 0x00 },
1795 { OV7670_R10_AECH
, 0x00 },
1796 { OV7670_R0D_COM4
, 0x40 }, /* magic reserved bit */
1797 { OV7670_R14_COM9
, 0x18 }, /* 4x gain + magic rsvd bit */
1798 { OV7670_RA5_BD50MAX
, 0x05 },
1799 { OV7670_RAB_BD60MAX
, 0x07 },
1800 { OV7670_R24_AEW
, 0x95 },
1801 { OV7670_R25_AEB
, 0x33 },
1802 { OV7670_R26_VPT
, 0xe3 },
1803 { OV7670_R9F_HAECC1
, 0x78 },
1804 { OV7670_RA0_HAECC2
, 0x68 },
1805 { 0xa1, 0x03 }, /* magic */
1806 { OV7670_RA6_HAECC3
, 0xd8 },
1807 { OV7670_RA7_HAECC4
, 0xd8 },
1808 { OV7670_RA8_HAECC5
, 0xf0 },
1809 { OV7670_RA9_HAECC6
, 0x90 },
1810 { OV7670_RAA_HAECC7
, 0x94 },
1811 { OV7670_R13_COM8
, OV7670_COM8_FASTAEC
1812 | OV7670_COM8_AECSTEP
1815 | OV7670_COM8_AEC
},
1817 /* Almost all of these are magic "reserved" values. */
1818 { OV7670_R0E_COM5
, 0x61 },
1819 { OV7670_R0F_COM6
, 0x4b },
1821 { OV7670_R1E_MVFP
, 0x07 },
1830 { OV7670_R3C_COM12
, 0x78 },
1833 { OV7670_R69_GFIX
, 0x00 },
1849 /* More reserved magic, some of which tweaks white balance */
1865 { 0x6f, 0x9f }, /* "9e for advance AWB" */
1867 { OV7670_R01_BLUE
, 0x40 },
1868 { OV7670_R02_RED
, 0x60 },
1869 { OV7670_R13_COM8
, OV7670_COM8_FASTAEC
1870 | OV7670_COM8_AECSTEP
1874 | OV7670_COM8_AWB
},
1876 /* Matrix coefficients */
1885 { OV7670_R41_COM16
, OV7670_COM16_AWBGAIN
},
1886 { OV7670_R3F_EDGE
, 0x00 },
1891 { OV7670_R3D_COM13
, OV7670_COM13_GAMMA
1892 | OV7670_COM13_UVSAT
1896 { OV7670_R41_COM16
, 0x38 },
1900 { OV7670_R3B_COM11
, OV7670_COM11_EXP
|OV7670_COM11_HZAUTO
},
1913 /* Extra-weird stuff. Some sort of multiplexor register */
1939 static const struct ov_i2c_regvals norm_8610
[] = {
1946 { 0x05, 0x30 }, /* was 0x10, new from windrv 090403 */
1947 { 0x06, 0x70 }, /* was 0x80, new from windrv 090403 */
1956 { 0x15, 0x01 }, /* Lin and Win think different about UV order */
1958 { 0x17, 0x38 }, /* was 0x2f, new from windrv 090403 */
1959 { 0x18, 0xea }, /* was 0xcf, new from windrv 090403 */
1960 { 0x19, 0x02 }, /* was 0x06, new from windrv 090403 */
1963 { 0x20, 0xd0 }, /* was 0x90, new from windrv 090403 */
1964 { 0x23, 0xc0 }, /* was 0x00, new from windrv 090403 */
1965 { 0x24, 0x30 }, /* was 0x1d, new from windrv 090403 */
1966 { 0x25, 0x50 }, /* was 0x57, new from windrv 090403 */
1972 { 0x2b, 0xc8 }, /* was 0xcc, new from windrv 090403 */
1974 { 0x2d, 0x45 }, /* was 0xd5, new from windrv 090403 */
1976 { 0x2f, 0x14 }, /* was 0x01, new from windrv 090403 */
1978 { 0x4d, 0x30 }, /* was 0x10, new from windrv 090403 */
1979 { 0x60, 0x02 }, /* was 0x01, new from windrv 090403 */
1980 { 0x61, 0x00 }, /* was 0x09, new from windrv 090403 */
1981 { 0x62, 0x5f }, /* was 0xd7, new from windrv 090403 */
1983 { 0x64, 0x53 }, /* new windrv 090403 says 0x57,
1984 * maybe thats wrong */
1988 { 0x68, 0xc0 }, /* was 0xaf, new from windrv 090403 */
1992 { 0x6c, 0x99 }, /* was 0x80, old windrv says 0x00, but
1993 * deleting bit7 colors the first images red */
1994 { 0x6d, 0x11 }, /* was 0x00, new from windrv 090403 */
1995 { 0x6e, 0x11 }, /* was 0x00, new from windrv 090403 */
2001 { 0x74, 0x00 },/* 0x60? - was 0x00, new from windrv 090403 */
2003 { 0x76, 0x02 }, /* was 0x02, new from windrv 090403 */
2008 { 0x7b, 0x10 }, /* was 0x13, new from windrv 090403 */
2010 { 0x7d, 0x08 }, /* was 0x09, new from windrv 090403 */
2011 { 0x7e, 0x08 }, /* was 0xc0, new from windrv 090403 */
2018 { 0x85, 0x62 }, /* was 0x61, new from windrv 090403 */
2024 { 0x12, 0x25 }, /* was 0x24, new from windrv 090403 */
2027 static unsigned char ov7670_abs_to_sm(unsigned char v
)
2031 return (128 - v
) | 0x80;
2034 /* Write a OV519 register */
2035 static void reg_w(struct sd
*sd
, u16 index
, u16 value
)
2037 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2040 if (sd
->gspca_dev
.usb_err
< 0)
2043 switch (sd
->bridge
) {
2045 case BRIDGE_OV511PLUS
:
2051 case BRIDGE_W9968CF
:
2052 PDEBUG(D_USBO
, "SET %02x %04x %04x",
2054 ret
= usb_control_msg(sd
->gspca_dev
.dev
,
2055 usb_sndctrlpipe(sd
->gspca_dev
.dev
, 0),
2057 USB_DIR_OUT
| USB_TYPE_VENDOR
| USB_RECIP_DEVICE
,
2058 value
, index
, NULL
, 0, 500);
2064 PDEBUG(D_USBO
, "SET %02x 0000 %04x %02x",
2066 sd
->gspca_dev
.usb_buf
[0] = value
;
2067 ret
= usb_control_msg(sd
->gspca_dev
.dev
,
2068 usb_sndctrlpipe(sd
->gspca_dev
.dev
, 0),
2070 USB_DIR_OUT
| USB_TYPE_VENDOR
| USB_RECIP_DEVICE
,
2072 sd
->gspca_dev
.usb_buf
, 1, 500);
2075 PERR("reg_w %02x failed %d\n", index
, ret
);
2076 sd
->gspca_dev
.usb_err
= ret
;
2081 /* Read from a OV519 register, note not valid for the w9968cf!! */
2082 /* returns: negative is error, pos or zero is data */
2083 static int reg_r(struct sd
*sd
, u16 index
)
2085 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2089 if (sd
->gspca_dev
.usb_err
< 0)
2092 switch (sd
->bridge
) {
2094 case BRIDGE_OV511PLUS
:
2104 ret
= usb_control_msg(sd
->gspca_dev
.dev
,
2105 usb_rcvctrlpipe(sd
->gspca_dev
.dev
, 0),
2107 USB_DIR_IN
| USB_TYPE_VENDOR
| USB_RECIP_DEVICE
,
2108 0, index
, sd
->gspca_dev
.usb_buf
, 1, 500);
2111 ret
= sd
->gspca_dev
.usb_buf
[0];
2112 PDEBUG(D_USBI
, "GET %02x 0000 %04x %02x",
2115 PERR("reg_r %02x failed %d\n", index
, ret
);
2116 sd
->gspca_dev
.usb_err
= ret
;
2122 /* Read 8 values from a OV519 register */
2123 static int reg_r8(struct sd
*sd
,
2126 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2129 if (sd
->gspca_dev
.usb_err
< 0)
2132 ret
= usb_control_msg(sd
->gspca_dev
.dev
,
2133 usb_rcvctrlpipe(sd
->gspca_dev
.dev
, 0),
2135 USB_DIR_IN
| USB_TYPE_VENDOR
| USB_RECIP_DEVICE
,
2136 0, index
, sd
->gspca_dev
.usb_buf
, 8, 500);
2139 ret
= sd
->gspca_dev
.usb_buf
[0];
2141 PERR("reg_r8 %02x failed %d\n", index
, ret
);
2142 sd
->gspca_dev
.usb_err
= ret
;
2149 * Writes bits at positions specified by mask to an OV51x reg. Bits that are in
2150 * the same position as 1's in "mask" are cleared and set to "value". Bits
2151 * that are in the same position as 0's in "mask" are preserved, regardless
2152 * of their respective state in "value".
2154 static void reg_w_mask(struct sd
*sd
,
2163 value
&= mask
; /* Enforce mask on value */
2164 ret
= reg_r(sd
, index
);
2168 oldval
= ret
& ~mask
; /* Clear the masked bits */
2169 value
|= oldval
; /* Set the desired bits */
2171 reg_w(sd
, index
, value
);
2175 * Writes multiple (n) byte value to a single register. Only valid with certain
2176 * registers (0x30 and 0xc4 - 0xce).
2178 static void ov518_reg_w32(struct sd
*sd
, u16 index
, u32 value
, int n
)
2180 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2183 if (sd
->gspca_dev
.usb_err
< 0)
2186 *((__le32
*) sd
->gspca_dev
.usb_buf
) = __cpu_to_le32(value
);
2188 ret
= usb_control_msg(sd
->gspca_dev
.dev
,
2189 usb_sndctrlpipe(sd
->gspca_dev
.dev
, 0),
2191 USB_DIR_OUT
| USB_TYPE_VENDOR
| USB_RECIP_DEVICE
,
2193 sd
->gspca_dev
.usb_buf
, n
, 500);
2195 PERR("reg_w32 %02x failed %d\n", index
, ret
);
2196 sd
->gspca_dev
.usb_err
= ret
;
2200 static void ov511_i2c_w(struct sd
*sd
, u8 reg
, u8 value
)
2202 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2205 PDEBUG(D_USBO
, "ov511_i2c_w %02x %02x", reg
, value
);
2207 /* Three byte write cycle */
2208 for (retries
= 6; ; ) {
2209 /* Select camera register */
2210 reg_w(sd
, R51x_I2C_SADDR_3
, reg
);
2212 /* Write "value" to I2C data port of OV511 */
2213 reg_w(sd
, R51x_I2C_DATA
, value
);
2215 /* Initiate 3-byte write cycle */
2216 reg_w(sd
, R511_I2C_CTL
, 0x01);
2219 rc
= reg_r(sd
, R511_I2C_CTL
);
2220 } while (rc
> 0 && ((rc
& 1) == 0)); /* Retry until idle */
2225 if ((rc
& 2) == 0) /* Ack? */
2227 if (--retries
< 0) {
2228 PDEBUG(D_USBO
, "i2c write retries exhausted");
2234 static int ov511_i2c_r(struct sd
*sd
, u8 reg
)
2236 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2237 int rc
, value
, retries
;
2239 /* Two byte write cycle */
2240 for (retries
= 6; ; ) {
2241 /* Select camera register */
2242 reg_w(sd
, R51x_I2C_SADDR_2
, reg
);
2244 /* Initiate 2-byte write cycle */
2245 reg_w(sd
, R511_I2C_CTL
, 0x03);
2248 rc
= reg_r(sd
, R511_I2C_CTL
);
2249 } while (rc
> 0 && ((rc
& 1) == 0)); /* Retry until idle */
2254 if ((rc
& 2) == 0) /* Ack? */
2258 reg_w(sd
, R511_I2C_CTL
, 0x10);
2260 if (--retries
< 0) {
2261 PDEBUG(D_USBI
, "i2c write retries exhausted");
2266 /* Two byte read cycle */
2267 for (retries
= 6; ; ) {
2268 /* Initiate 2-byte read cycle */
2269 reg_w(sd
, R511_I2C_CTL
, 0x05);
2272 rc
= reg_r(sd
, R511_I2C_CTL
);
2273 } while (rc
> 0 && ((rc
& 1) == 0)); /* Retry until idle */
2278 if ((rc
& 2) == 0) /* Ack? */
2282 reg_w(sd
, R511_I2C_CTL
, 0x10);
2284 if (--retries
< 0) {
2285 PDEBUG(D_USBI
, "i2c read retries exhausted");
2290 value
= reg_r(sd
, R51x_I2C_DATA
);
2292 PDEBUG(D_USBI
, "ov511_i2c_r %02x %02x", reg
, value
);
2294 /* This is needed to make i2c_w() work */
2295 reg_w(sd
, R511_I2C_CTL
, 0x05);
2301 * The OV518 I2C I/O procedure is different, hence, this function.
2302 * This is normally only called from i2c_w(). Note that this function
2303 * always succeeds regardless of whether the sensor is present and working.
2305 static void ov518_i2c_w(struct sd
*sd
,
2309 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2311 PDEBUG(D_USBO
, "ov518_i2c_w %02x %02x", reg
, value
);
2313 /* Select camera register */
2314 reg_w(sd
, R51x_I2C_SADDR_3
, reg
);
2316 /* Write "value" to I2C data port of OV511 */
2317 reg_w(sd
, R51x_I2C_DATA
, value
);
2319 /* Initiate 3-byte write cycle */
2320 reg_w(sd
, R518_I2C_CTL
, 0x01);
2322 /* wait for write complete */
2324 reg_r8(sd
, R518_I2C_CTL
);
2328 * returns: negative is error, pos or zero is data
2330 * The OV518 I2C I/O procedure is different, hence, this function.
2331 * This is normally only called from i2c_r(). Note that this function
2332 * always succeeds regardless of whether the sensor is present and working.
2334 static int ov518_i2c_r(struct sd
*sd
, u8 reg
)
2336 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2339 /* Select camera register */
2340 reg_w(sd
, R51x_I2C_SADDR_2
, reg
);
2342 /* Initiate 2-byte write cycle */
2343 reg_w(sd
, R518_I2C_CTL
, 0x03);
2344 reg_r8(sd
, R518_I2C_CTL
);
2346 /* Initiate 2-byte read cycle */
2347 reg_w(sd
, R518_I2C_CTL
, 0x05);
2348 reg_r8(sd
, R518_I2C_CTL
);
2350 value
= reg_r(sd
, R51x_I2C_DATA
);
2351 PDEBUG(D_USBI
, "ov518_i2c_r %02x %02x", reg
, value
);
2355 static void ovfx2_i2c_w(struct sd
*sd
, u8 reg
, u8 value
)
2357 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2360 if (sd
->gspca_dev
.usb_err
< 0)
2363 ret
= usb_control_msg(sd
->gspca_dev
.dev
,
2364 usb_sndctrlpipe(sd
->gspca_dev
.dev
, 0),
2366 USB_DIR_OUT
| USB_TYPE_VENDOR
| USB_RECIP_DEVICE
,
2367 (u16
) value
, (u16
) reg
, NULL
, 0, 500);
2370 PERR("ovfx2_i2c_w %02x failed %d\n", reg
, ret
);
2371 sd
->gspca_dev
.usb_err
= ret
;
2374 PDEBUG(D_USBO
, "ovfx2_i2c_w %02x %02x", reg
, value
);
2377 static int ovfx2_i2c_r(struct sd
*sd
, u8 reg
)
2379 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2382 if (sd
->gspca_dev
.usb_err
< 0)
2385 ret
= usb_control_msg(sd
->gspca_dev
.dev
,
2386 usb_rcvctrlpipe(sd
->gspca_dev
.dev
, 0),
2388 USB_DIR_IN
| USB_TYPE_VENDOR
| USB_RECIP_DEVICE
,
2389 0, (u16
) reg
, sd
->gspca_dev
.usb_buf
, 1, 500);
2392 ret
= sd
->gspca_dev
.usb_buf
[0];
2393 PDEBUG(D_USBI
, "ovfx2_i2c_r %02x %02x", reg
, ret
);
2395 PERR("ovfx2_i2c_r %02x failed %d\n", reg
, ret
);
2396 sd
->gspca_dev
.usb_err
= ret
;
2402 static void i2c_w(struct sd
*sd
, u8 reg
, u8 value
)
2404 if (sd
->sensor_reg_cache
[reg
] == value
)
2407 switch (sd
->bridge
) {
2409 case BRIDGE_OV511PLUS
:
2410 ov511_i2c_w(sd
, reg
, value
);
2413 case BRIDGE_OV518PLUS
:
2415 ov518_i2c_w(sd
, reg
, value
);
2418 ovfx2_i2c_w(sd
, reg
, value
);
2420 case BRIDGE_W9968CF
:
2421 w9968cf_i2c_w(sd
, reg
, value
);
2425 if (sd
->gspca_dev
.usb_err
>= 0) {
2426 /* Up on sensor reset empty the register cache */
2427 if (reg
== 0x12 && (value
& 0x80))
2428 memset(sd
->sensor_reg_cache
, -1,
2429 sizeof(sd
->sensor_reg_cache
));
2431 sd
->sensor_reg_cache
[reg
] = value
;
2435 static int i2c_r(struct sd
*sd
, u8 reg
)
2439 if (sd
->sensor_reg_cache
[reg
] != -1)
2440 return sd
->sensor_reg_cache
[reg
];
2442 switch (sd
->bridge
) {
2444 case BRIDGE_OV511PLUS
:
2445 ret
= ov511_i2c_r(sd
, reg
);
2448 case BRIDGE_OV518PLUS
:
2450 ret
= ov518_i2c_r(sd
, reg
);
2453 ret
= ovfx2_i2c_r(sd
, reg
);
2455 case BRIDGE_W9968CF
:
2456 ret
= w9968cf_i2c_r(sd
, reg
);
2461 sd
->sensor_reg_cache
[reg
] = ret
;
2466 /* Writes bits at positions specified by mask to an I2C reg. Bits that are in
2467 * the same position as 1's in "mask" are cleared and set to "value". Bits
2468 * that are in the same position as 0's in "mask" are preserved, regardless
2469 * of their respective state in "value".
2471 static void i2c_w_mask(struct sd
*sd
,
2479 value
&= mask
; /* Enforce mask on value */
2480 rc
= i2c_r(sd
, reg
);
2483 oldval
= rc
& ~mask
; /* Clear the masked bits */
2484 value
|= oldval
; /* Set the desired bits */
2485 i2c_w(sd
, reg
, value
);
2488 /* Temporarily stops OV511 from functioning. Must do this before changing
2489 * registers while the camera is streaming */
2490 static inline void ov51x_stop(struct sd
*sd
)
2492 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2494 PDEBUG(D_STREAM
, "stopping");
2496 switch (sd
->bridge
) {
2498 case BRIDGE_OV511PLUS
:
2499 reg_w(sd
, R51x_SYS_RESET
, 0x3d);
2502 case BRIDGE_OV518PLUS
:
2503 reg_w_mask(sd
, R51x_SYS_RESET
, 0x3a, 0x3a);
2506 reg_w(sd
, OV519_R51_RESET1
, 0x0f);
2507 reg_w(sd
, OV519_R51_RESET1
, 0x00);
2508 reg_w(sd
, 0x22, 0x00); /* FRAR */
2511 reg_w_mask(sd
, 0x0f, 0x00, 0x02);
2513 case BRIDGE_W9968CF
:
2514 reg_w(sd
, 0x3c, 0x0a05); /* stop USB transfer */
2519 /* Restarts OV511 after ov511_stop() is called. Has no effect if it is not
2520 * actually stopped (for performance). */
2521 static inline void ov51x_restart(struct sd
*sd
)
2523 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2525 PDEBUG(D_STREAM
, "restarting");
2530 /* Reinitialize the stream */
2531 switch (sd
->bridge
) {
2533 case BRIDGE_OV511PLUS
:
2534 reg_w(sd
, R51x_SYS_RESET
, 0x00);
2537 case BRIDGE_OV518PLUS
:
2538 reg_w(sd
, 0x2f, 0x80);
2539 reg_w(sd
, R51x_SYS_RESET
, 0x00);
2542 reg_w(sd
, OV519_R51_RESET1
, 0x0f);
2543 reg_w(sd
, OV519_R51_RESET1
, 0x00);
2544 reg_w(sd
, 0x22, 0x1d); /* FRAR */
2547 reg_w_mask(sd
, 0x0f, 0x02, 0x02);
2549 case BRIDGE_W9968CF
:
2550 reg_w(sd
, 0x3c, 0x8a05); /* USB FIFO enable */
2555 static void ov51x_set_slave_ids(struct sd
*sd
, u8 slave
);
2557 /* This does an initial reset of an OmniVision sensor and ensures that I2C
2558 * is synchronized. Returns <0 on failure.
2560 static int init_ov_sensor(struct sd
*sd
, u8 slave
)
2563 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2565 ov51x_set_slave_ids(sd
, slave
);
2567 /* Reset the sensor */
2568 i2c_w(sd
, 0x12, 0x80);
2570 /* Wait for it to initialize */
2573 for (i
= 0; i
< i2c_detect_tries
; i
++) {
2574 if (i2c_r(sd
, OV7610_REG_ID_HIGH
) == 0x7f &&
2575 i2c_r(sd
, OV7610_REG_ID_LOW
) == 0xa2) {
2576 PDEBUG(D_PROBE
, "I2C synced in %d attempt(s)", i
);
2580 /* Reset the sensor */
2581 i2c_w(sd
, 0x12, 0x80);
2583 /* Wait for it to initialize */
2586 /* Dummy read to sync I2C */
2587 if (i2c_r(sd
, 0x00) < 0)
2593 /* Set the read and write slave IDs. The "slave" argument is the write slave,
2594 * and the read slave will be set to (slave + 1).
2595 * This should not be called from outside the i2c I/O functions.
2596 * Sets I2C read and write slave IDs. Returns <0 for error
2598 static void ov51x_set_slave_ids(struct sd
*sd
,
2601 switch (sd
->bridge
) {
2603 reg_w(sd
, OVFX2_I2C_ADDR
, slave
);
2605 case BRIDGE_W9968CF
:
2606 sd
->sensor_addr
= slave
;
2610 reg_w(sd
, R51x_I2C_W_SID
, slave
);
2611 reg_w(sd
, R51x_I2C_R_SID
, slave
+ 1);
2614 static void write_regvals(struct sd
*sd
,
2615 const struct ov_regvals
*regvals
,
2619 reg_w(sd
, regvals
->reg
, regvals
->val
);
2624 static void write_i2c_regvals(struct sd
*sd
,
2625 const struct ov_i2c_regvals
*regvals
,
2629 i2c_w(sd
, regvals
->reg
, regvals
->val
);
2634 /****************************************************************************
2636 * OV511 and sensor configuration
2638 ***************************************************************************/
2640 /* This initializes the OV2x10 / OV3610 / OV3620 / OV9600 */
2641 static void ov_hires_configure(struct sd
*sd
)
2643 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2646 if (sd
->bridge
!= BRIDGE_OVFX2
) {
2647 PERR("error hires sensors only supported with ovfx2\n");
2651 PDEBUG(D_PROBE
, "starting ov hires configuration");
2653 /* Detect sensor (sub)type */
2654 high
= i2c_r(sd
, 0x0a);
2655 low
= i2c_r(sd
, 0x0b);
2656 /* info("%x, %x", high, low); */
2661 PDEBUG(D_PROBE
, "Sensor is a OV2610");
2662 sd
->sensor
= SEN_OV2610
;
2665 PDEBUG(D_PROBE
, "Sensor is a OV2610AE");
2666 sd
->sensor
= SEN_OV2610AE
;
2669 PDEBUG(D_PROBE
, "Sensor is a OV9600");
2670 sd
->sensor
= SEN_OV9600
;
2675 if ((low
& 0x0f) == 0x00) {
2676 PDEBUG(D_PROBE
, "Sensor is a OV3610");
2677 sd
->sensor
= SEN_OV3610
;
2682 PERR("Error unknown sensor type: %02x%02x\n", high
, low
);
2685 /* This initializes the OV8110, OV8610 sensor. The OV8110 uses
2686 * the same register settings as the OV8610, since they are very similar.
2688 static void ov8xx0_configure(struct sd
*sd
)
2690 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2693 PDEBUG(D_PROBE
, "starting ov8xx0 configuration");
2695 /* Detect sensor (sub)type */
2696 rc
= i2c_r(sd
, OV7610_REG_COM_I
);
2698 PERR("Error detecting sensor type");
2702 sd
->sensor
= SEN_OV8610
;
2704 PERR("Unknown image sensor version: %d\n", rc
& 3);
2707 /* This initializes the OV7610, OV7620, or OV76BE sensor. The OV76BE uses
2708 * the same register settings as the OV7610, since they are very similar.
2710 static void ov7xx0_configure(struct sd
*sd
)
2712 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2715 PDEBUG(D_PROBE
, "starting OV7xx0 configuration");
2717 /* Detect sensor (sub)type */
2718 rc
= i2c_r(sd
, OV7610_REG_COM_I
);
2721 * it appears to be wrongly detected as a 7610 by default */
2723 PERR("Error detecting sensor type\n");
2726 if ((rc
& 3) == 3) {
2727 /* quick hack to make OV7670s work */
2728 high
= i2c_r(sd
, 0x0a);
2729 low
= i2c_r(sd
, 0x0b);
2730 /* info("%x, %x", high, low); */
2731 if (high
== 0x76 && (low
& 0xf0) == 0x70) {
2732 PDEBUG(D_PROBE
, "Sensor is an OV76%02x", low
);
2733 sd
->sensor
= SEN_OV7670
;
2735 PDEBUG(D_PROBE
, "Sensor is an OV7610");
2736 sd
->sensor
= SEN_OV7610
;
2738 } else if ((rc
& 3) == 1) {
2739 /* I don't know what's different about the 76BE yet. */
2740 if (i2c_r(sd
, 0x15) & 1) {
2741 PDEBUG(D_PROBE
, "Sensor is an OV7620AE");
2742 sd
->sensor
= SEN_OV7620AE
;
2744 PDEBUG(D_PROBE
, "Sensor is an OV76BE");
2745 sd
->sensor
= SEN_OV76BE
;
2747 } else if ((rc
& 3) == 0) {
2748 /* try to read product id registers */
2749 high
= i2c_r(sd
, 0x0a);
2751 PERR("Error detecting camera chip PID\n");
2754 low
= i2c_r(sd
, 0x0b);
2756 PERR("Error detecting camera chip VER\n");
2762 PERR("Sensor is an OV7630/OV7635\n");
2763 PERR("7630 is not supported by this driver\n");
2766 PDEBUG(D_PROBE
, "Sensor is an OV7645");
2767 sd
->sensor
= SEN_OV7640
; /* FIXME */
2770 PDEBUG(D_PROBE
, "Sensor is an OV7645B");
2771 sd
->sensor
= SEN_OV7640
; /* FIXME */
2774 PDEBUG(D_PROBE
, "Sensor is an OV7648");
2775 sd
->sensor
= SEN_OV7648
;
2778 PDEBUG(D_PROBE
, "Sensor is a OV7660");
2779 sd
->sensor
= SEN_OV7660
;
2782 PERR("Unknown sensor: 0x76%02x\n", low
);
2786 PDEBUG(D_PROBE
, "Sensor is an OV7620");
2787 sd
->sensor
= SEN_OV7620
;
2790 PERR("Unknown image sensor version: %d\n", rc
& 3);
2794 /* This initializes the OV6620, OV6630, OV6630AE, or OV6630AF sensor. */
2795 static void ov6xx0_configure(struct sd
*sd
)
2797 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2800 PDEBUG(D_PROBE
, "starting OV6xx0 configuration");
2802 /* Detect sensor (sub)type */
2803 rc
= i2c_r(sd
, OV7610_REG_COM_I
);
2805 PERR("Error detecting sensor type\n");
2809 /* Ugh. The first two bits are the version bits, but
2810 * the entire register value must be used. I guess OVT
2811 * underestimated how many variants they would make. */
2814 sd
->sensor
= SEN_OV6630
;
2815 pr_warn("WARNING: Sensor is an OV66308. Your camera may have been misdetected in previous driver versions.\n");
2818 sd
->sensor
= SEN_OV6620
;
2819 PDEBUG(D_PROBE
, "Sensor is an OV6620");
2822 sd
->sensor
= SEN_OV6630
;
2823 PDEBUG(D_PROBE
, "Sensor is an OV66308AE");
2826 sd
->sensor
= SEN_OV66308AF
;
2827 PDEBUG(D_PROBE
, "Sensor is an OV66308AF");
2830 sd
->sensor
= SEN_OV6630
;
2831 pr_warn("WARNING: Sensor is an OV66307. Your camera may have been misdetected in previous driver versions.\n");
2834 PERR("FATAL: Unknown sensor version: 0x%02x\n", rc
);
2838 /* Set sensor-specific vars */
2842 /* Turns on or off the LED. Only has an effect with OV511+/OV518(+)/OV519 */
2843 static void ov51x_led_control(struct sd
*sd
, int on
)
2848 switch (sd
->bridge
) {
2849 /* OV511 has no LED control */
2850 case BRIDGE_OV511PLUS
:
2851 reg_w(sd
, R511_SYS_LED_CTL
, on
);
2854 case BRIDGE_OV518PLUS
:
2855 reg_w_mask(sd
, R518_GPIO_OUT
, 0x02 * on
, 0x02);
2858 reg_w_mask(sd
, OV519_GPIO_DATA_OUT0
, on
, 1);
2863 static void sd_reset_snapshot(struct gspca_dev
*gspca_dev
)
2865 struct sd
*sd
= (struct sd
*) gspca_dev
;
2867 if (!sd
->snapshot_needs_reset
)
2870 /* Note it is important that we clear sd->snapshot_needs_reset,
2871 before actually clearing the snapshot state in the bridge
2872 otherwise we might race with the pkt_scan interrupt handler */
2873 sd
->snapshot_needs_reset
= 0;
2875 switch (sd
->bridge
) {
2877 case BRIDGE_OV511PLUS
:
2878 reg_w(sd
, R51x_SYS_SNAP
, 0x02);
2879 reg_w(sd
, R51x_SYS_SNAP
, 0x00);
2882 case BRIDGE_OV518PLUS
:
2883 reg_w(sd
, R51x_SYS_SNAP
, 0x02); /* Reset */
2884 reg_w(sd
, R51x_SYS_SNAP
, 0x01); /* Enable */
2887 reg_w(sd
, R51x_SYS_RESET
, 0x40);
2888 reg_w(sd
, R51x_SYS_RESET
, 0x00);
2893 static void ov51x_upload_quan_tables(struct sd
*sd
)
2895 const unsigned char yQuanTable511
[] = {
2896 0, 1, 1, 2, 2, 3, 3, 4,
2897 1, 1, 1, 2, 2, 3, 4, 4,
2898 1, 1, 2, 2, 3, 4, 4, 4,
2899 2, 2, 2, 3, 4, 4, 4, 4,
2900 2, 2, 3, 4, 4, 5, 5, 5,
2901 3, 3, 4, 4, 5, 5, 5, 5,
2902 3, 4, 4, 4, 5, 5, 5, 5,
2903 4, 4, 4, 4, 5, 5, 5, 5
2906 const unsigned char uvQuanTable511
[] = {
2907 0, 2, 2, 3, 4, 4, 4, 4,
2908 2, 2, 2, 4, 4, 4, 4, 4,
2909 2, 2, 3, 4, 4, 4, 4, 4,
2910 3, 4, 4, 4, 4, 4, 4, 4,
2911 4, 4, 4, 4, 4, 4, 4, 4,
2912 4, 4, 4, 4, 4, 4, 4, 4,
2913 4, 4, 4, 4, 4, 4, 4, 4,
2914 4, 4, 4, 4, 4, 4, 4, 4
2917 /* OV518 quantization tables are 8x4 (instead of 8x8) */
2918 const unsigned char yQuanTable518
[] = {
2919 5, 4, 5, 6, 6, 7, 7, 7,
2920 5, 5, 5, 5, 6, 7, 7, 7,
2921 6, 6, 6, 6, 7, 7, 7, 8,
2922 7, 7, 6, 7, 7, 7, 8, 8
2924 const unsigned char uvQuanTable518
[] = {
2925 6, 6, 6, 7, 7, 7, 7, 7,
2926 6, 6, 6, 7, 7, 7, 7, 7,
2927 6, 6, 6, 7, 7, 7, 7, 8,
2928 7, 7, 7, 7, 7, 7, 8, 8
2931 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
2932 const unsigned char *pYTable
, *pUVTable
;
2933 unsigned char val0
, val1
;
2934 int i
, size
, reg
= R51x_COMP_LUT_BEGIN
;
2936 PDEBUG(D_PROBE
, "Uploading quantization tables");
2938 if (sd
->bridge
== BRIDGE_OV511
|| sd
->bridge
== BRIDGE_OV511PLUS
) {
2939 pYTable
= yQuanTable511
;
2940 pUVTable
= uvQuanTable511
;
2943 pYTable
= yQuanTable518
;
2944 pUVTable
= uvQuanTable518
;
2948 for (i
= 0; i
< size
; i
++) {
2954 reg_w(sd
, reg
, val0
);
2961 reg_w(sd
, reg
+ size
, val0
);
2967 /* This initializes the OV511/OV511+ and the sensor */
2968 static void ov511_configure(struct gspca_dev
*gspca_dev
)
2970 struct sd
*sd
= (struct sd
*) gspca_dev
;
2972 /* For 511 and 511+ */
2973 const struct ov_regvals init_511
[] = {
2974 { R51x_SYS_RESET
, 0x7f },
2975 { R51x_SYS_INIT
, 0x01 },
2976 { R51x_SYS_RESET
, 0x7f },
2977 { R51x_SYS_INIT
, 0x01 },
2978 { R51x_SYS_RESET
, 0x3f },
2979 { R51x_SYS_INIT
, 0x01 },
2980 { R51x_SYS_RESET
, 0x3d },
2983 const struct ov_regvals norm_511
[] = {
2984 { R511_DRAM_FLOW_CTL
, 0x01 },
2985 { R51x_SYS_SNAP
, 0x00 },
2986 { R51x_SYS_SNAP
, 0x02 },
2987 { R51x_SYS_SNAP
, 0x00 },
2988 { R511_FIFO_OPTS
, 0x1f },
2989 { R511_COMP_EN
, 0x00 },
2990 { R511_COMP_LUT_EN
, 0x03 },
2993 const struct ov_regvals norm_511_p
[] = {
2994 { R511_DRAM_FLOW_CTL
, 0xff },
2995 { R51x_SYS_SNAP
, 0x00 },
2996 { R51x_SYS_SNAP
, 0x02 },
2997 { R51x_SYS_SNAP
, 0x00 },
2998 { R511_FIFO_OPTS
, 0xff },
2999 { R511_COMP_EN
, 0x00 },
3000 { R511_COMP_LUT_EN
, 0x03 },
3003 const struct ov_regvals compress_511
[] = {
3014 PDEBUG(D_PROBE
, "Device custom id %x", reg_r(sd
, R51x_SYS_CUST_ID
));
3016 write_regvals(sd
, init_511
, ARRAY_SIZE(init_511
));
3018 switch (sd
->bridge
) {
3020 write_regvals(sd
, norm_511
, ARRAY_SIZE(norm_511
));
3022 case BRIDGE_OV511PLUS
:
3023 write_regvals(sd
, norm_511_p
, ARRAY_SIZE(norm_511_p
));
3027 /* Init compression */
3028 write_regvals(sd
, compress_511
, ARRAY_SIZE(compress_511
));
3030 ov51x_upload_quan_tables(sd
);
3033 /* This initializes the OV518/OV518+ and the sensor */
3034 static void ov518_configure(struct gspca_dev
*gspca_dev
)
3036 struct sd
*sd
= (struct sd
*) gspca_dev
;
3038 /* For 518 and 518+ */
3039 const struct ov_regvals init_518
[] = {
3040 { R51x_SYS_RESET
, 0x40 },
3041 { R51x_SYS_INIT
, 0xe1 },
3042 { R51x_SYS_RESET
, 0x3e },
3043 { R51x_SYS_INIT
, 0xe1 },
3044 { R51x_SYS_RESET
, 0x00 },
3045 { R51x_SYS_INIT
, 0xe1 },
3050 const struct ov_regvals norm_518
[] = {
3051 { R51x_SYS_SNAP
, 0x02 }, /* Reset */
3052 { R51x_SYS_SNAP
, 0x01 }, /* Enable */
3063 const struct ov_regvals norm_518_p
[] = {
3064 { R51x_SYS_SNAP
, 0x02 }, /* Reset */
3065 { R51x_SYS_SNAP
, 0x01 }, /* Enable */
3082 /* First 5 bits of custom ID reg are a revision ID on OV518 */
3083 PDEBUG(D_PROBE
, "Device revision %d",
3084 0x1f & reg_r(sd
, R51x_SYS_CUST_ID
));
3086 write_regvals(sd
, init_518
, ARRAY_SIZE(init_518
));
3088 /* Set LED GPIO pin to output mode */
3089 reg_w_mask(sd
, R518_GPIO_CTL
, 0x00, 0x02);
3091 switch (sd
->bridge
) {
3093 write_regvals(sd
, norm_518
, ARRAY_SIZE(norm_518
));
3095 case BRIDGE_OV518PLUS
:
3096 write_regvals(sd
, norm_518_p
, ARRAY_SIZE(norm_518_p
));
3100 ov51x_upload_quan_tables(sd
);
3102 reg_w(sd
, 0x2f, 0x80);
3105 static void ov519_configure(struct sd
*sd
)
3107 static const struct ov_regvals init_519
[] = {
3108 { 0x5a, 0x6d }, /* EnableSystem */
3109 { 0x53, 0x9b }, /* don't enable the microcontroller */
3110 { OV519_R54_EN_CLK1
, 0xff }, /* set bit2 to enable jpeg */
3114 /* Set LED pin to output mode. Bit 4 must be cleared or sensor
3115 * detection will fail. This deserves further investigation. */
3116 { OV519_GPIO_IO_CTRL0
, 0xee },
3117 { OV519_R51_RESET1
, 0x0f },
3118 { OV519_R51_RESET1
, 0x00 },
3120 /* windows reads 0x55 at this point*/
3123 write_regvals(sd
, init_519
, ARRAY_SIZE(init_519
));
3126 static void ovfx2_configure(struct sd
*sd
)
3128 static const struct ov_regvals init_fx2
[] = {
3140 write_regvals(sd
, init_fx2
, ARRAY_SIZE(init_fx2
));
3144 /* This function works for ov7660 only */
3145 static void ov519_set_mode(struct sd
*sd
)
3147 static const struct ov_regvals bridge_ov7660
[2][10] = {
3148 {{0x10, 0x14}, {0x11, 0x1e}, {0x12, 0x00}, {0x13, 0x00},
3149 {0x14, 0x00}, {0x15, 0x00}, {0x16, 0x00}, {0x20, 0x0c},
3150 {0x25, 0x01}, {0x26, 0x00}},
3151 {{0x10, 0x28}, {0x11, 0x3c}, {0x12, 0x00}, {0x13, 0x00},
3152 {0x14, 0x00}, {0x15, 0x00}, {0x16, 0x00}, {0x20, 0x0c},
3153 {0x25, 0x03}, {0x26, 0x00}}
3155 static const struct ov_i2c_regvals sensor_ov7660
[2][3] = {
3156 {{0x12, 0x00}, {0x24, 0x00}, {0x0c, 0x0c}},
3157 {{0x12, 0x00}, {0x04, 0x00}, {0x0c, 0x00}}
3159 static const struct ov_i2c_regvals sensor_ov7660_2
[] = {
3160 {OV7670_R17_HSTART
, 0x13},
3161 {OV7670_R18_HSTOP
, 0x01},
3162 {OV7670_R32_HREF
, 0x92},
3163 {OV7670_R19_VSTART
, 0x02},
3164 {OV7670_R1A_VSTOP
, 0x7a},
3165 {OV7670_R03_VREF
, 0x00},
3172 write_regvals(sd
, bridge_ov7660
[sd
->gspca_dev
.curr_mode
],
3173 ARRAY_SIZE(bridge_ov7660
[0]));
3174 write_i2c_regvals(sd
, sensor_ov7660
[sd
->gspca_dev
.curr_mode
],
3175 ARRAY_SIZE(sensor_ov7660
[0]));
3176 write_i2c_regvals(sd
, sensor_ov7660_2
,
3177 ARRAY_SIZE(sensor_ov7660_2
));
3180 /* set the frame rate */
3181 /* This function works for sensors ov7640, ov7648 ov7660 and ov7670 only */
3182 static void ov519_set_fr(struct sd
*sd
)
3186 /* frame rate table with indices:
3187 * - mode = 0: 320x240, 1: 640x480
3188 * - fr rate = 0: 30, 1: 25, 2: 20, 3: 15, 4: 10, 5: 5
3189 * - reg = 0: bridge a4, 1: bridge 23, 2: sensor 11 (clock)
3191 static const u8 fr_tb
[2][6][3] = {
3192 {{0x04, 0xff, 0x00},
3197 {0x04, 0x01, 0x00}},
3198 {{0x0c, 0xff, 0x00},
3203 {0x04, 0x1b, 0x01}},
3207 sd
->frame_rate
= frame_rate
;
3208 if (sd
->frame_rate
>= 30)
3210 else if (sd
->frame_rate
>= 25)
3212 else if (sd
->frame_rate
>= 20)
3214 else if (sd
->frame_rate
>= 15)
3216 else if (sd
->frame_rate
>= 10)
3220 reg_w(sd
, 0xa4, fr_tb
[sd
->gspca_dev
.curr_mode
][fr
][0]);
3221 reg_w(sd
, 0x23, fr_tb
[sd
->gspca_dev
.curr_mode
][fr
][1]);
3222 clock
= fr_tb
[sd
->gspca_dev
.curr_mode
][fr
][2];
3223 if (sd
->sensor
== SEN_OV7660
)
3224 clock
|= 0x80; /* enable double clock */
3225 ov518_i2c_w(sd
, OV7670_R11_CLKRC
, clock
);
3228 static void setautogain(struct gspca_dev
*gspca_dev
, s32 val
)
3230 struct sd
*sd
= (struct sd
*) gspca_dev
;
3232 i2c_w_mask(sd
, 0x13, val
? 0x05 : 0x00, 0x05);
3235 /* this function is called at probe time */
3236 static int sd_config(struct gspca_dev
*gspca_dev
,
3237 const struct usb_device_id
*id
)
3239 struct sd
*sd
= (struct sd
*) gspca_dev
;
3240 struct cam
*cam
= &gspca_dev
->cam
;
3242 sd
->bridge
= id
->driver_info
& BRIDGE_MASK
;
3243 sd
->invert_led
= (id
->driver_info
& BRIDGE_INVERT_LED
) != 0;
3245 switch (sd
->bridge
) {
3247 case BRIDGE_OV511PLUS
:
3248 cam
->cam_mode
= ov511_vga_mode
;
3249 cam
->nmodes
= ARRAY_SIZE(ov511_vga_mode
);
3252 case BRIDGE_OV518PLUS
:
3253 cam
->cam_mode
= ov518_vga_mode
;
3254 cam
->nmodes
= ARRAY_SIZE(ov518_vga_mode
);
3257 cam
->cam_mode
= ov519_vga_mode
;
3258 cam
->nmodes
= ARRAY_SIZE(ov519_vga_mode
);
3261 cam
->cam_mode
= ov519_vga_mode
;
3262 cam
->nmodes
= ARRAY_SIZE(ov519_vga_mode
);
3263 cam
->bulk_size
= OVFX2_BULK_SIZE
;
3264 cam
->bulk_nurbs
= MAX_NURBS
;
3267 case BRIDGE_W9968CF
:
3268 cam
->cam_mode
= w9968cf_vga_mode
;
3269 cam
->nmodes
= ARRAY_SIZE(w9968cf_vga_mode
);
3273 sd
->frame_rate
= 15;
3278 /* this function is called at probe and resume time */
3279 static int sd_init(struct gspca_dev
*gspca_dev
)
3281 struct sd
*sd
= (struct sd
*) gspca_dev
;
3282 struct cam
*cam
= &gspca_dev
->cam
;
3284 switch (sd
->bridge
) {
3286 case BRIDGE_OV511PLUS
:
3287 ov511_configure(gspca_dev
);
3290 case BRIDGE_OV518PLUS
:
3291 ov518_configure(gspca_dev
);
3294 ov519_configure(sd
);
3297 ovfx2_configure(sd
);
3299 case BRIDGE_W9968CF
:
3300 w9968cf_configure(sd
);
3304 /* The OV519 must be more aggressive about sensor detection since
3305 * I2C write will never fail if the sensor is not present. We have
3306 * to try to initialize the sensor to detect its presence */
3310 if (init_ov_sensor(sd
, OV7xx0_SID
) >= 0) {
3311 ov7xx0_configure(sd
);
3314 } else if (init_ov_sensor(sd
, OV6xx0_SID
) >= 0) {
3315 ov6xx0_configure(sd
);
3318 } else if (init_ov_sensor(sd
, OV8xx0_SID
) >= 0) {
3319 ov8xx0_configure(sd
);
3321 /* Test for 3xxx / 2xxx */
3322 } else if (init_ov_sensor(sd
, OV_HIRES_SID
) >= 0) {
3323 ov_hires_configure(sd
);
3325 PERR("Can't determine sensor slave IDs\n");
3332 ov51x_led_control(sd
, 0); /* turn LED off */
3334 switch (sd
->bridge
) {
3336 case BRIDGE_OV511PLUS
:
3338 cam
->cam_mode
= ov511_sif_mode
;
3339 cam
->nmodes
= ARRAY_SIZE(ov511_sif_mode
);
3343 case BRIDGE_OV518PLUS
:
3345 cam
->cam_mode
= ov518_sif_mode
;
3346 cam
->nmodes
= ARRAY_SIZE(ov518_sif_mode
);
3351 cam
->cam_mode
= ov519_sif_mode
;
3352 cam
->nmodes
= ARRAY_SIZE(ov519_sif_mode
);
3356 switch (sd
->sensor
) {
3359 cam
->cam_mode
= ovfx2_ov2610_mode
;
3360 cam
->nmodes
= ARRAY_SIZE(ovfx2_ov2610_mode
);
3363 cam
->cam_mode
= ovfx2_ov3610_mode
;
3364 cam
->nmodes
= ARRAY_SIZE(ovfx2_ov3610_mode
);
3367 cam
->cam_mode
= ovfx2_ov9600_mode
;
3368 cam
->nmodes
= ARRAY_SIZE(ovfx2_ov9600_mode
);
3372 cam
->cam_mode
= ov519_sif_mode
;
3373 cam
->nmodes
= ARRAY_SIZE(ov519_sif_mode
);
3378 case BRIDGE_W9968CF
:
3380 cam
->nmodes
= ARRAY_SIZE(w9968cf_vga_mode
) - 1;
3382 /* w9968cf needs initialisation once the sensor is known */
3387 /* initialize the sensor */
3388 switch (sd
->sensor
) {
3390 write_i2c_regvals(sd
, norm_2610
, ARRAY_SIZE(norm_2610
));
3392 /* Enable autogain, autoexpo, awb, bandfilter */
3393 i2c_w_mask(sd
, 0x13, 0x27, 0x27);
3396 write_i2c_regvals(sd
, norm_2610ae
, ARRAY_SIZE(norm_2610ae
));
3398 /* enable autoexpo */
3399 i2c_w_mask(sd
, 0x13, 0x05, 0x05);
3402 write_i2c_regvals(sd
, norm_3620b
, ARRAY_SIZE(norm_3620b
));
3404 /* Enable autogain, autoexpo, awb, bandfilter */
3405 i2c_w_mask(sd
, 0x13, 0x27, 0x27);
3408 write_i2c_regvals(sd
, norm_6x20
, ARRAY_SIZE(norm_6x20
));
3412 write_i2c_regvals(sd
, norm_6x30
, ARRAY_SIZE(norm_6x30
));
3415 /* case SEN_OV7610: */
3416 /* case SEN_OV76BE: */
3417 write_i2c_regvals(sd
, norm_7610
, ARRAY_SIZE(norm_7610
));
3418 i2c_w_mask(sd
, 0x0e, 0x00, 0x40);
3422 write_i2c_regvals(sd
, norm_7620
, ARRAY_SIZE(norm_7620
));
3426 write_i2c_regvals(sd
, norm_7640
, ARRAY_SIZE(norm_7640
));
3429 i2c_w(sd
, OV7670_R12_COM7
, OV7670_COM7_RESET
);
3431 reg_w(sd
, OV519_R57_SNAPSHOT
, 0x23);
3432 write_regvals(sd
, init_519_ov7660
,
3433 ARRAY_SIZE(init_519_ov7660
));
3434 write_i2c_regvals(sd
, norm_7660
, ARRAY_SIZE(norm_7660
));
3435 sd
->gspca_dev
.curr_mode
= 1; /* 640x480 */
3438 sd_reset_snapshot(gspca_dev
);
3440 ov51x_stop(sd
); /* not in win traces */
3441 ov51x_led_control(sd
, 0);
3444 write_i2c_regvals(sd
, norm_7670
, ARRAY_SIZE(norm_7670
));
3447 write_i2c_regvals(sd
, norm_8610
, ARRAY_SIZE(norm_8610
));
3450 write_i2c_regvals(sd
, norm_9600
, ARRAY_SIZE(norm_9600
));
3452 /* enable autoexpo */
3453 /* i2c_w_mask(sd, 0x13, 0x05, 0x05); */
3456 return gspca_dev
->usb_err
;
3458 PERR("OV519 Config failed");
3462 /* function called at start time before URB creation */
3463 static int sd_isoc_init(struct gspca_dev
*gspca_dev
)
3465 struct sd
*sd
= (struct sd
*) gspca_dev
;
3467 switch (sd
->bridge
) {
3469 if (gspca_dev
->width
!= 800)
3470 gspca_dev
->cam
.bulk_size
= OVFX2_BULK_SIZE
;
3472 gspca_dev
->cam
.bulk_size
= 7 * 4096;
3478 /* Set up the OV511/OV511+ with the given image parameters.
3480 * Do not put any sensor-specific code in here (including I2C I/O functions)
3482 static void ov511_mode_init_regs(struct sd
*sd
)
3484 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
3485 int hsegs
, vsegs
, packet_size
, fps
, needed
;
3487 struct usb_host_interface
*alt
;
3488 struct usb_interface
*intf
;
3490 intf
= usb_ifnum_to_if(sd
->gspca_dev
.dev
, sd
->gspca_dev
.iface
);
3491 alt
= usb_altnum_to_altsetting(intf
, sd
->gspca_dev
.alt
);
3493 PERR("Couldn't get altsetting\n");
3494 sd
->gspca_dev
.usb_err
= -EIO
;
3498 packet_size
= le16_to_cpu(alt
->endpoint
[0].desc
.wMaxPacketSize
);
3499 reg_w(sd
, R51x_FIFO_PSIZE
, packet_size
>> 5);
3501 reg_w(sd
, R511_CAM_UV_EN
, 0x01);
3502 reg_w(sd
, R511_SNAP_UV_EN
, 0x01);
3503 reg_w(sd
, R511_SNAP_OPTS
, 0x03);
3505 /* Here I'm assuming that snapshot size == image size.
3506 * I hope that's always true. --claudio
3508 hsegs
= (sd
->gspca_dev
.width
>> 3) - 1;
3509 vsegs
= (sd
->gspca_dev
.height
>> 3) - 1;
3511 reg_w(sd
, R511_CAM_PXCNT
, hsegs
);
3512 reg_w(sd
, R511_CAM_LNCNT
, vsegs
);
3513 reg_w(sd
, R511_CAM_PXDIV
, 0x00);
3514 reg_w(sd
, R511_CAM_LNDIV
, 0x00);
3516 /* YUV420, low pass filter on */
3517 reg_w(sd
, R511_CAM_OPTS
, 0x03);
3519 /* Snapshot additions */
3520 reg_w(sd
, R511_SNAP_PXCNT
, hsegs
);
3521 reg_w(sd
, R511_SNAP_LNCNT
, vsegs
);
3522 reg_w(sd
, R511_SNAP_PXDIV
, 0x00);
3523 reg_w(sd
, R511_SNAP_LNDIV
, 0x00);
3525 /******** Set the framerate ********/
3527 sd
->frame_rate
= frame_rate
;
3529 switch (sd
->sensor
) {
3531 /* No framerate control, doesn't like higher rates yet */
3535 /* Note once the FIXME's in mode_init_ov_sensor_regs() are fixed
3536 for more sensors we need to do this for them too */
3542 if (sd
->gspca_dev
.width
== 320)
3548 switch (sd
->frame_rate
) {
3551 /* Not enough bandwidth to do 640x480 @ 30 fps */
3552 if (sd
->gspca_dev
.width
!= 640) {
3556 /* Fall through for 640x480 case */
3570 sd
->clockdiv
= (sd
->clockdiv
+ 1) * 2 - 1;
3571 /* Higher then 10 does not work */
3572 if (sd
->clockdiv
> 10)
3578 /* No framerate control ?? */
3583 /* Check if we have enough bandwidth to disable compression */
3584 fps
= (interlaced
? 60 : 30) / (sd
->clockdiv
+ 1) + 1;
3585 needed
= fps
* sd
->gspca_dev
.width
* sd
->gspca_dev
.height
* 3 / 2;
3586 /* 1000 isoc packets/sec */
3587 if (needed
> 1000 * packet_size
) {
3588 /* Enable Y and UV quantization and compression */
3589 reg_w(sd
, R511_COMP_EN
, 0x07);
3590 reg_w(sd
, R511_COMP_LUT_EN
, 0x03);
3592 reg_w(sd
, R511_COMP_EN
, 0x06);
3593 reg_w(sd
, R511_COMP_LUT_EN
, 0x00);
3596 reg_w(sd
, R51x_SYS_RESET
, OV511_RESET_OMNICE
);
3597 reg_w(sd
, R51x_SYS_RESET
, 0);
3600 /* Sets up the OV518/OV518+ with the given image parameters
3602 * OV518 needs a completely different approach, until we can figure out what
3603 * the individual registers do. Also, only 15 FPS is supported now.
3605 * Do not put any sensor-specific code in here (including I2C I/O functions)
3607 static void ov518_mode_init_regs(struct sd
*sd
)
3609 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
3610 int hsegs
, vsegs
, packet_size
;
3611 struct usb_host_interface
*alt
;
3612 struct usb_interface
*intf
;
3614 intf
= usb_ifnum_to_if(sd
->gspca_dev
.dev
, sd
->gspca_dev
.iface
);
3615 alt
= usb_altnum_to_altsetting(intf
, sd
->gspca_dev
.alt
);
3617 PERR("Couldn't get altsetting\n");
3618 sd
->gspca_dev
.usb_err
= -EIO
;
3622 packet_size
= le16_to_cpu(alt
->endpoint
[0].desc
.wMaxPacketSize
);
3623 ov518_reg_w32(sd
, R51x_FIFO_PSIZE
, packet_size
& ~7, 2);
3625 /******** Set the mode ********/
3635 if (sd
->bridge
== BRIDGE_OV518
) {
3636 /* Set 8-bit (YVYU) input format */
3637 reg_w_mask(sd
, 0x20, 0x08, 0x08);
3639 /* Set 12-bit (4:2:0) output format */
3640 reg_w_mask(sd
, 0x28, 0x80, 0xf0);
3641 reg_w_mask(sd
, 0x38, 0x80, 0xf0);
3643 reg_w(sd
, 0x28, 0x80);
3644 reg_w(sd
, 0x38, 0x80);
3647 hsegs
= sd
->gspca_dev
.width
/ 16;
3648 vsegs
= sd
->gspca_dev
.height
/ 4;
3650 reg_w(sd
, 0x29, hsegs
);
3651 reg_w(sd
, 0x2a, vsegs
);
3653 reg_w(sd
, 0x39, hsegs
);
3654 reg_w(sd
, 0x3a, vsegs
);
3656 /* Windows driver does this here; who knows why */
3657 reg_w(sd
, 0x2f, 0x80);
3659 /******** Set the framerate ********/
3662 /* Mode independent, but framerate dependent, regs */
3663 /* 0x51: Clock divider; Only works on some cams which use 2 crystals */
3664 reg_w(sd
, 0x51, 0x04);
3665 reg_w(sd
, 0x22, 0x18);
3666 reg_w(sd
, 0x23, 0xff);
3668 if (sd
->bridge
== BRIDGE_OV518PLUS
) {
3669 switch (sd
->sensor
) {
3671 if (sd
->gspca_dev
.width
== 320) {
3672 reg_w(sd
, 0x20, 0x00);
3673 reg_w(sd
, 0x21, 0x19);
3675 reg_w(sd
, 0x20, 0x60);
3676 reg_w(sd
, 0x21, 0x1f);
3680 reg_w(sd
, 0x20, 0x00);
3681 reg_w(sd
, 0x21, 0x19);
3684 reg_w(sd
, 0x21, 0x19);
3687 reg_w(sd
, 0x71, 0x17); /* Compression-related? */
3689 /* FIXME: Sensor-specific */
3690 /* Bit 5 is what matters here. Of course, it is "reserved" */
3691 i2c_w(sd
, 0x54, 0x23);
3693 reg_w(sd
, 0x2f, 0x80);
3695 if (sd
->bridge
== BRIDGE_OV518PLUS
) {
3696 reg_w(sd
, 0x24, 0x94);
3697 reg_w(sd
, 0x25, 0x90);
3698 ov518_reg_w32(sd
, 0xc4, 400, 2); /* 190h */
3699 ov518_reg_w32(sd
, 0xc6, 540, 2); /* 21ch */
3700 ov518_reg_w32(sd
, 0xc7, 540, 2); /* 21ch */
3701 ov518_reg_w32(sd
, 0xc8, 108, 2); /* 6ch */
3702 ov518_reg_w32(sd
, 0xca, 131098, 3); /* 2001ah */
3703 ov518_reg_w32(sd
, 0xcb, 532, 2); /* 214h */
3704 ov518_reg_w32(sd
, 0xcc, 2400, 2); /* 960h */
3705 ov518_reg_w32(sd
, 0xcd, 32, 2); /* 20h */
3706 ov518_reg_w32(sd
, 0xce, 608, 2); /* 260h */
3708 reg_w(sd
, 0x24, 0x9f);
3709 reg_w(sd
, 0x25, 0x90);
3710 ov518_reg_w32(sd
, 0xc4, 400, 2); /* 190h */
3711 ov518_reg_w32(sd
, 0xc6, 381, 2); /* 17dh */
3712 ov518_reg_w32(sd
, 0xc7, 381, 2); /* 17dh */
3713 ov518_reg_w32(sd
, 0xc8, 128, 2); /* 80h */
3714 ov518_reg_w32(sd
, 0xca, 183331, 3); /* 2cc23h */
3715 ov518_reg_w32(sd
, 0xcb, 746, 2); /* 2eah */
3716 ov518_reg_w32(sd
, 0xcc, 1750, 2); /* 6d6h */
3717 ov518_reg_w32(sd
, 0xcd, 45, 2); /* 2dh */
3718 ov518_reg_w32(sd
, 0xce, 851, 2); /* 353h */
3721 reg_w(sd
, 0x2f, 0x80);
3724 /* Sets up the OV519 with the given image parameters
3726 * OV519 needs a completely different approach, until we can figure out what
3727 * the individual registers do.
3729 * Do not put any sensor-specific code in here (including I2C I/O functions)
3731 static void ov519_mode_init_regs(struct sd
*sd
)
3733 static const struct ov_regvals mode_init_519_ov7670
[] = {
3734 { 0x5d, 0x03 }, /* Turn off suspend mode */
3735 { 0x53, 0x9f }, /* was 9b in 1.65-1.08 */
3736 { OV519_R54_EN_CLK1
, 0x0f }, /* bit2 (jpeg enable) */
3737 { 0xa2, 0x20 }, /* a2-a5 are undocumented */
3741 { 0x37, 0x00 }, /* SetUsbInit */
3742 { 0x55, 0x02 }, /* 4.096 Mhz audio clock */
3743 /* Enable both fields, YUV Input, disable defect comp (why?) */
3747 { 0x17, 0x50 }, /* undocumented */
3748 { 0x37, 0x00 }, /* undocumented */
3749 { 0x40, 0xff }, /* I2C timeout counter */
3750 { 0x46, 0x00 }, /* I2C clock prescaler */
3751 { 0x59, 0x04 }, /* new from windrv 090403 */
3752 { 0xff, 0x00 }, /* undocumented */
3753 /* windows reads 0x55 at this point, why? */
3756 static const struct ov_regvals mode_init_519
[] = {
3757 { 0x5d, 0x03 }, /* Turn off suspend mode */
3758 { 0x53, 0x9f }, /* was 9b in 1.65-1.08 */
3759 { OV519_R54_EN_CLK1
, 0x0f }, /* bit2 (jpeg enable) */
3760 { 0xa2, 0x20 }, /* a2-a5 are undocumented */
3764 { 0x37, 0x00 }, /* SetUsbInit */
3765 { 0x55, 0x02 }, /* 4.096 Mhz audio clock */
3766 /* Enable both fields, YUV Input, disable defect comp (why?) */
3768 { 0x17, 0x50 }, /* undocumented */
3769 { 0x37, 0x00 }, /* undocumented */
3770 { 0x40, 0xff }, /* I2C timeout counter */
3771 { 0x46, 0x00 }, /* I2C clock prescaler */
3772 { 0x59, 0x04 }, /* new from windrv 090403 */
3773 { 0xff, 0x00 }, /* undocumented */
3774 /* windows reads 0x55 at this point, why? */
3777 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
3779 /******** Set the mode ********/
3780 switch (sd
->sensor
) {
3782 write_regvals(sd
, mode_init_519
, ARRAY_SIZE(mode_init_519
));
3783 if (sd
->sensor
== SEN_OV7640
||
3784 sd
->sensor
== SEN_OV7648
) {
3785 /* Select 8-bit input mode */
3786 reg_w_mask(sd
, OV519_R20_DFR
, 0x10, 0x10);
3790 return; /* done by ov519_set_mode/fr() */
3792 write_regvals(sd
, mode_init_519_ov7670
,
3793 ARRAY_SIZE(mode_init_519_ov7670
));
3797 reg_w(sd
, OV519_R10_H_SIZE
, sd
->gspca_dev
.width
>> 4);
3798 reg_w(sd
, OV519_R11_V_SIZE
, sd
->gspca_dev
.height
>> 3);
3799 if (sd
->sensor
== SEN_OV7670
&&
3800 sd
->gspca_dev
.cam
.cam_mode
[sd
->gspca_dev
.curr_mode
].priv
)
3801 reg_w(sd
, OV519_R12_X_OFFSETL
, 0x04);
3802 else if (sd
->sensor
== SEN_OV7648
&&
3803 sd
->gspca_dev
.cam
.cam_mode
[sd
->gspca_dev
.curr_mode
].priv
)
3804 reg_w(sd
, OV519_R12_X_OFFSETL
, 0x01);
3806 reg_w(sd
, OV519_R12_X_OFFSETL
, 0x00);
3807 reg_w(sd
, OV519_R13_X_OFFSETH
, 0x00);
3808 reg_w(sd
, OV519_R14_Y_OFFSETL
, 0x00);
3809 reg_w(sd
, OV519_R15_Y_OFFSETH
, 0x00);
3810 reg_w(sd
, OV519_R16_DIVIDER
, 0x00);
3811 reg_w(sd
, OV519_R25_FORMAT
, 0x03); /* YUV422 */
3812 reg_w(sd
, 0x26, 0x00); /* Undocumented */
3814 /******** Set the framerate ********/
3816 sd
->frame_rate
= frame_rate
;
3818 /* FIXME: These are only valid at the max resolution. */
3820 switch (sd
->sensor
) {
3823 switch (sd
->frame_rate
) {
3826 reg_w(sd
, 0xa4, 0x0c);
3827 reg_w(sd
, 0x23, 0xff);
3830 reg_w(sd
, 0xa4, 0x0c);
3831 reg_w(sd
, 0x23, 0x1f);
3834 reg_w(sd
, 0xa4, 0x0c);
3835 reg_w(sd
, 0x23, 0x1b);
3838 reg_w(sd
, 0xa4, 0x04);
3839 reg_w(sd
, 0x23, 0xff);
3843 reg_w(sd
, 0xa4, 0x04);
3844 reg_w(sd
, 0x23, 0x1f);
3848 reg_w(sd
, 0xa4, 0x04);
3849 reg_w(sd
, 0x23, 0x1b);
3855 switch (sd
->frame_rate
) {
3856 default: /* 15 fps */
3858 reg_w(sd
, 0xa4, 0x06);
3859 reg_w(sd
, 0x23, 0xff);
3862 reg_w(sd
, 0xa4, 0x06);
3863 reg_w(sd
, 0x23, 0x1f);
3866 reg_w(sd
, 0xa4, 0x06);
3867 reg_w(sd
, 0x23, 0x1b);
3871 case SEN_OV7670
: /* guesses, based on 7640 */
3872 PDEBUG(D_STREAM
, "Setting framerate to %d fps",
3873 (sd
->frame_rate
== 0) ? 15 : sd
->frame_rate
);
3874 reg_w(sd
, 0xa4, 0x10);
3875 switch (sd
->frame_rate
) {
3877 reg_w(sd
, 0x23, 0xff);
3880 reg_w(sd
, 0x23, 0x1b);
3884 reg_w(sd
, 0x23, 0xff);
3892 static void mode_init_ov_sensor_regs(struct sd
*sd
)
3894 struct gspca_dev
*gspca_dev
= (struct gspca_dev
*)sd
;
3895 int qvga
, xstart
, xend
, ystart
, yend
;
3898 qvga
= gspca_dev
->cam
.cam_mode
[gspca_dev
->curr_mode
].priv
& 1;
3900 /******** Mode (VGA/QVGA) and sensor specific regs ********/
3901 switch (sd
->sensor
) {
3903 i2c_w_mask(sd
, 0x14, qvga
? 0x20 : 0x00, 0x20);
3904 i2c_w_mask(sd
, 0x28, qvga
? 0x00 : 0x20, 0x20);
3905 i2c_w(sd
, 0x24, qvga
? 0x20 : 0x3a);
3906 i2c_w(sd
, 0x25, qvga
? 0x30 : 0x60);
3907 i2c_w_mask(sd
, 0x2d, qvga
? 0x40 : 0x00, 0x40);
3908 i2c_w_mask(sd
, 0x67, qvga
? 0xf0 : 0x90, 0xf0);
3909 i2c_w_mask(sd
, 0x74, qvga
? 0x20 : 0x00, 0x20);
3911 case SEN_OV2610AE
: {
3915 * 10fps / 5 fps for 1600x1200
3916 * 40fps / 20fps for 800x600
3920 if (sd
->frame_rate
< 25)
3923 if (sd
->frame_rate
< 10)
3927 i2c_w(sd
, 0x12, qvga
? 0x60 : 0x20);
3932 xstart
= (1040 - gspca_dev
->width
) / 2 + (0x1f << 4);
3933 ystart
= (776 - gspca_dev
->height
) / 2;
3935 xstart
= (2076 - gspca_dev
->width
) / 2 + (0x10 << 4);
3936 ystart
= (1544 - gspca_dev
->height
) / 2;
3938 xend
= xstart
+ gspca_dev
->width
;
3939 yend
= ystart
+ gspca_dev
->height
;
3940 /* Writing to the COMH register resets the other windowing regs
3941 to their default values, so we must do this first. */
3942 i2c_w_mask(sd
, 0x12, qvga
? 0x40 : 0x00, 0xf0);
3943 i2c_w_mask(sd
, 0x32,
3944 (((xend
>> 1) & 7) << 3) | ((xstart
>> 1) & 7),
3946 i2c_w_mask(sd
, 0x03,
3947 (((yend
>> 1) & 3) << 2) | ((ystart
>> 1) & 3),
3949 i2c_w(sd
, 0x17, xstart
>> 4);
3950 i2c_w(sd
, 0x18, xend
>> 4);
3951 i2c_w(sd
, 0x19, ystart
>> 3);
3952 i2c_w(sd
, 0x1a, yend
>> 3);
3955 /* For OV8610 qvga means qsvga */
3956 i2c_w_mask(sd
, OV7610_REG_COM_C
, qvga
? (1 << 5) : 0, 1 << 5);
3957 i2c_w_mask(sd
, 0x13, 0x00, 0x20); /* Select 16 bit data bus */
3958 i2c_w_mask(sd
, 0x12, 0x04, 0x06); /* AWB: 1 Test pattern: 0 */
3959 i2c_w_mask(sd
, 0x2d, 0x00, 0x40); /* from windrv 090403 */
3960 i2c_w_mask(sd
, 0x28, 0x20, 0x20); /* progressive mode on */
3963 i2c_w_mask(sd
, 0x14, qvga
? 0x20 : 0x00, 0x20);
3964 i2c_w(sd
, 0x35, qvga
? 0x1e : 0x9e);
3965 i2c_w_mask(sd
, 0x13, 0x00, 0x20); /* Select 16 bit data bus */
3966 i2c_w_mask(sd
, 0x12, 0x04, 0x06); /* AWB: 1 Test pattern: 0 */
3971 i2c_w_mask(sd
, 0x14, qvga
? 0x20 : 0x00, 0x20);
3972 i2c_w_mask(sd
, 0x28, qvga
? 0x00 : 0x20, 0x20);
3973 i2c_w(sd
, 0x24, qvga
? 0x20 : 0x3a);
3974 i2c_w(sd
, 0x25, qvga
? 0x30 : 0x60);
3975 i2c_w_mask(sd
, 0x2d, qvga
? 0x40 : 0x00, 0x40);
3976 i2c_w_mask(sd
, 0x67, qvga
? 0xb0 : 0x90, 0xf0);
3977 i2c_w_mask(sd
, 0x74, qvga
? 0x20 : 0x00, 0x20);
3978 i2c_w_mask(sd
, 0x13, 0x00, 0x20); /* Select 16 bit data bus */
3979 i2c_w_mask(sd
, 0x12, 0x04, 0x06); /* AWB: 1 Test pattern: 0 */
3980 if (sd
->sensor
== SEN_OV76BE
)
3981 i2c_w(sd
, 0x35, qvga
? 0x1e : 0x9e);
3985 i2c_w_mask(sd
, 0x14, qvga
? 0x20 : 0x00, 0x20);
3986 i2c_w_mask(sd
, 0x28, qvga
? 0x00 : 0x20, 0x20);
3987 /* Setting this undocumented bit in qvga mode removes a very
3988 annoying vertical shaking of the image */
3989 i2c_w_mask(sd
, 0x2d, qvga
? 0x40 : 0x00, 0x40);
3991 i2c_w_mask(sd
, 0x67, qvga
? 0xf0 : 0x90, 0xf0);
3992 /* Allow higher automatic gain (to allow higher framerates) */
3993 i2c_w_mask(sd
, 0x74, qvga
? 0x20 : 0x00, 0x20);
3994 i2c_w_mask(sd
, 0x12, 0x04, 0x04); /* AWB: 1 */
3997 /* set COM7_FMT_VGA or COM7_FMT_QVGA
3998 * do we need to set anything else?
3999 * HSTART etc are set in set_ov_sensor_window itself */
4000 i2c_w_mask(sd
, OV7670_R12_COM7
,
4001 qvga
? OV7670_COM7_FMT_QVGA
: OV7670_COM7_FMT_VGA
,
4002 OV7670_COM7_FMT_MASK
);
4003 i2c_w_mask(sd
, 0x13, 0x00, 0x20); /* Select 16 bit data bus */
4004 i2c_w_mask(sd
, OV7670_R13_COM8
, OV7670_COM8_AWB
,
4006 if (qvga
) { /* QVGA from ov7670.c by
4007 * Jonathan Corbet */
4018 /* OV7670 hardware window registers are split across
4019 * multiple locations */
4020 i2c_w(sd
, OV7670_R17_HSTART
, xstart
>> 3);
4021 i2c_w(sd
, OV7670_R18_HSTOP
, xend
>> 3);
4022 v
= i2c_r(sd
, OV7670_R32_HREF
);
4023 v
= (v
& 0xc0) | ((xend
& 0x7) << 3) | (xstart
& 0x07);
4024 msleep(10); /* need to sleep between read and write to
4026 i2c_w(sd
, OV7670_R32_HREF
, v
);
4028 i2c_w(sd
, OV7670_R19_VSTART
, ystart
>> 2);
4029 i2c_w(sd
, OV7670_R1A_VSTOP
, yend
>> 2);
4030 v
= i2c_r(sd
, OV7670_R03_VREF
);
4031 v
= (v
& 0xc0) | ((yend
& 0x3) << 2) | (ystart
& 0x03);
4032 msleep(10); /* need to sleep between read and write to
4034 i2c_w(sd
, OV7670_R03_VREF
, v
);
4037 i2c_w_mask(sd
, 0x14, qvga
? 0x20 : 0x00, 0x20);
4038 i2c_w_mask(sd
, 0x13, 0x00, 0x20); /* Select 16 bit data bus */
4039 i2c_w_mask(sd
, 0x12, 0x04, 0x06); /* AWB: 1 Test pattern: 0 */
4043 i2c_w_mask(sd
, 0x14, qvga
? 0x20 : 0x00, 0x20);
4044 i2c_w_mask(sd
, 0x12, 0x04, 0x06); /* AWB: 1 Test pattern: 0 */
4047 const struct ov_i2c_regvals
*vals
;
4048 static const struct ov_i2c_regvals sxga_15
[] = {
4049 {0x11, 0x80}, {0x14, 0x3e}, {0x24, 0x85}, {0x25, 0x75}
4051 static const struct ov_i2c_regvals sxga_7_5
[] = {
4052 {0x11, 0x81}, {0x14, 0x3e}, {0x24, 0x85}, {0x25, 0x75}
4054 static const struct ov_i2c_regvals vga_30
[] = {
4055 {0x11, 0x81}, {0x14, 0x7e}, {0x24, 0x70}, {0x25, 0x60}
4057 static const struct ov_i2c_regvals vga_15
[] = {
4058 {0x11, 0x83}, {0x14, 0x3e}, {0x24, 0x80}, {0x25, 0x70}
4062 * 15fps / 7.5 fps for 1280x1024
4063 * 30fps / 15fps for 640x480
4065 i2c_w_mask(sd
, 0x12, qvga
? 0x40 : 0x00, 0x40);
4067 vals
= sd
->frame_rate
< 30 ? vga_15
: vga_30
;
4069 vals
= sd
->frame_rate
< 15 ? sxga_7_5
: sxga_15
;
4070 write_i2c_regvals(sd
, vals
, ARRAY_SIZE(sxga_15
));
4077 /******** Clock programming ********/
4078 i2c_w(sd
, 0x11, sd
->clockdiv
);
4081 /* this function works for bridge ov519 and sensors ov7660 and ov7670 only */
4082 static void sethvflip(struct gspca_dev
*gspca_dev
, s32 hflip
, s32 vflip
)
4084 struct sd
*sd
= (struct sd
*) gspca_dev
;
4086 if (sd
->gspca_dev
.streaming
)
4087 reg_w(sd
, OV519_R51_RESET1
, 0x0f); /* block stream */
4088 i2c_w_mask(sd
, OV7670_R1E_MVFP
,
4089 OV7670_MVFP_MIRROR
* hflip
| OV7670_MVFP_VFLIP
* vflip
,
4090 OV7670_MVFP_MIRROR
| OV7670_MVFP_VFLIP
);
4091 if (sd
->gspca_dev
.streaming
)
4092 reg_w(sd
, OV519_R51_RESET1
, 0x00); /* restart stream */
4095 static void set_ov_sensor_window(struct sd
*sd
)
4097 struct gspca_dev
*gspca_dev
;
4099 int hwsbase
, hwebase
, vwsbase
, vwebase
, hwscale
, vwscale
;
4101 /* mode setup is fully handled in mode_init_ov_sensor_regs for these */
4102 switch (sd
->sensor
) {
4108 mode_init_ov_sensor_regs(sd
);
4116 gspca_dev
= &sd
->gspca_dev
;
4117 qvga
= gspca_dev
->cam
.cam_mode
[gspca_dev
->curr_mode
].priv
& 1;
4118 crop
= gspca_dev
->cam
.cam_mode
[gspca_dev
->curr_mode
].priv
& 2;
4120 /* The different sensor ICs handle setting up of window differently.
4121 * IF YOU SET IT WRONG, YOU WILL GET ALL ZERO ISOC DATA FROM OV51x!! */
4122 switch (sd
->sensor
) {
4133 vwsbase
= vwebase
= 0x05;
4142 if (sd
->sensor
== SEN_OV66308AF
&& qvga
)
4143 /* HDG: this fixes U and V getting swapped */
4154 hwsbase
= 0x2f; /* From 7620.SET (spec is wrong) */
4156 vwsbase
= vwebase
= 0x05;
4162 vwsbase
= vwebase
= 0x03;
4168 switch (sd
->sensor
) {
4172 if (qvga
) { /* QCIF */
4177 vwscale
= 1; /* The datasheet says 0;
4182 if (qvga
) { /* QSVGA */
4190 default: /* SEN_OV7xx0 */
4191 if (qvga
) { /* QVGA */
4200 mode_init_ov_sensor_regs(sd
);
4202 i2c_w(sd
, 0x17, hwsbase
);
4203 i2c_w(sd
, 0x18, hwebase
+ (sd
->sensor_width
>> hwscale
));
4204 i2c_w(sd
, 0x19, vwsbase
);
4205 i2c_w(sd
, 0x1a, vwebase
+ (sd
->sensor_height
>> vwscale
));
4208 /* -- start the camera -- */
4209 static int sd_start(struct gspca_dev
*gspca_dev
)
4211 struct sd
*sd
= (struct sd
*) gspca_dev
;
4213 /* Default for most bridges, allow bridge_mode_init_regs to override */
4214 sd
->sensor_width
= sd
->gspca_dev
.width
;
4215 sd
->sensor_height
= sd
->gspca_dev
.height
;
4217 switch (sd
->bridge
) {
4219 case BRIDGE_OV511PLUS
:
4220 ov511_mode_init_regs(sd
);
4223 case BRIDGE_OV518PLUS
:
4224 ov518_mode_init_regs(sd
);
4227 ov519_mode_init_regs(sd
);
4229 /* case BRIDGE_OVFX2: nothing to do */
4230 case BRIDGE_W9968CF
:
4231 w9968cf_mode_init_regs(sd
);
4235 set_ov_sensor_window(sd
);
4237 /* Force clear snapshot state in case the snapshot button was
4238 pressed while we weren't streaming */
4239 sd
->snapshot_needs_reset
= 1;
4240 sd_reset_snapshot(gspca_dev
);
4242 sd
->first_frame
= 3;
4245 ov51x_led_control(sd
, 1);
4246 return gspca_dev
->usb_err
;
4249 static void sd_stopN(struct gspca_dev
*gspca_dev
)
4251 struct sd
*sd
= (struct sd
*) gspca_dev
;
4254 ov51x_led_control(sd
, 0);
4257 static void sd_stop0(struct gspca_dev
*gspca_dev
)
4259 struct sd
*sd
= (struct sd
*) gspca_dev
;
4261 if (!sd
->gspca_dev
.present
)
4263 if (sd
->bridge
== BRIDGE_W9968CF
)
4266 #if IS_ENABLED(CONFIG_INPUT)
4267 /* If the last button state is pressed, release it now! */
4268 if (sd
->snapshot_pressed
) {
4269 input_report_key(gspca_dev
->input_dev
, KEY_CAMERA
, 0);
4270 input_sync(gspca_dev
->input_dev
);
4271 sd
->snapshot_pressed
= 0;
4274 if (sd
->bridge
== BRIDGE_OV519
)
4275 reg_w(sd
, OV519_R57_SNAPSHOT
, 0x23);
4278 static void ov51x_handle_button(struct gspca_dev
*gspca_dev
, u8 state
)
4280 struct sd
*sd
= (struct sd
*) gspca_dev
;
4282 if (sd
->snapshot_pressed
!= state
) {
4283 #if IS_ENABLED(CONFIG_INPUT)
4284 input_report_key(gspca_dev
->input_dev
, KEY_CAMERA
, state
);
4285 input_sync(gspca_dev
->input_dev
);
4288 sd
->snapshot_needs_reset
= 1;
4290 sd
->snapshot_pressed
= state
;
4292 /* On the ov511 / ov519 we need to reset the button state
4293 multiple times, as resetting does not work as long as the
4294 button stays pressed */
4295 switch (sd
->bridge
) {
4297 case BRIDGE_OV511PLUS
:
4300 sd
->snapshot_needs_reset
= 1;
4306 static void ov511_pkt_scan(struct gspca_dev
*gspca_dev
,
4307 u8
*in
, /* isoc packet */
4308 int len
) /* iso packet length */
4310 struct sd
*sd
= (struct sd
*) gspca_dev
;
4312 /* SOF/EOF packets have 1st to 8th bytes zeroed and the 9th
4313 * byte non-zero. The EOF packet has image width/height in the
4314 * 10th and 11th bytes. The 9th byte is given as follows:
4317 * 6: compression enabled
4318 * 5: 422/420/400 modes
4319 * 4: 422/420/400 modes
4321 * 2: snapshot button on
4325 if (!(in
[0] | in
[1] | in
[2] | in
[3] | in
[4] | in
[5] | in
[6] | in
[7]) &&
4327 ov51x_handle_button(gspca_dev
, (in
[8] >> 2) & 1);
4330 if ((in
[9] + 1) * 8 != gspca_dev
->width
||
4331 (in
[10] + 1) * 8 != gspca_dev
->height
) {
4332 PERR("Invalid frame size, got: %dx%d,"
4333 " requested: %dx%d\n",
4334 (in
[9] + 1) * 8, (in
[10] + 1) * 8,
4335 gspca_dev
->width
, gspca_dev
->height
);
4336 gspca_dev
->last_packet_type
= DISCARD_PACKET
;
4339 /* Add 11 byte footer to frame, might be useful */
4340 gspca_frame_add(gspca_dev
, LAST_PACKET
, in
, 11);
4344 gspca_frame_add(gspca_dev
, FIRST_PACKET
, in
, 0);
4349 /* Ignore the packet number */
4352 /* intermediate packet */
4353 gspca_frame_add(gspca_dev
, INTER_PACKET
, in
, len
);
4356 static void ov518_pkt_scan(struct gspca_dev
*gspca_dev
,
4357 u8
*data
, /* isoc packet */
4358 int len
) /* iso packet length */
4360 struct sd
*sd
= (struct sd
*) gspca_dev
;
4362 /* A false positive here is likely, until OVT gives me
4363 * the definitive SOF/EOF format */
4364 if ((!(data
[0] | data
[1] | data
[2] | data
[3] | data
[5])) && data
[6]) {
4365 ov51x_handle_button(gspca_dev
, (data
[6] >> 1) & 1);
4366 gspca_frame_add(gspca_dev
, LAST_PACKET
, NULL
, 0);
4367 gspca_frame_add(gspca_dev
, FIRST_PACKET
, NULL
, 0);
4371 if (gspca_dev
->last_packet_type
== DISCARD_PACKET
)
4374 /* Does this device use packet numbers ? */
4377 if (sd
->packet_nr
== data
[len
])
4379 /* The last few packets of the frame (which are all 0's
4380 except that they may contain part of the footer), are
4382 else if (sd
->packet_nr
== 0 || data
[len
]) {
4383 PERR("Invalid packet nr: %d (expect: %d)",
4384 (int)data
[len
], (int)sd
->packet_nr
);
4385 gspca_dev
->last_packet_type
= DISCARD_PACKET
;
4390 /* intermediate packet */
4391 gspca_frame_add(gspca_dev
, INTER_PACKET
, data
, len
);
4394 static void ov519_pkt_scan(struct gspca_dev
*gspca_dev
,
4395 u8
*data
, /* isoc packet */
4396 int len
) /* iso packet length */
4398 /* Header of ov519 is 16 bytes:
4399 * Byte Value Description
4403 * 3 0xXX 0x50 = SOF, 0x51 = EOF
4404 * 9 0xXX 0x01 initial frame without data,
4405 * 0x00 standard frame with image
4406 * 14 Lo in EOF: length of image data / 8
4410 if (data
[0] == 0xff && data
[1] == 0xff && data
[2] == 0xff) {
4412 case 0x50: /* start of frame */
4413 /* Don't check the button state here, as the state
4414 usually (always ?) changes at EOF and checking it
4415 here leads to unnecessary snapshot state resets. */
4420 if (data
[0] == 0xff || data
[1] == 0xd8)
4421 gspca_frame_add(gspca_dev
, FIRST_PACKET
,
4424 gspca_dev
->last_packet_type
= DISCARD_PACKET
;
4426 case 0x51: /* end of frame */
4427 ov51x_handle_button(gspca_dev
, data
[11] & 1);
4429 gspca_dev
->last_packet_type
= DISCARD_PACKET
;
4430 gspca_frame_add(gspca_dev
, LAST_PACKET
,
4436 /* intermediate packet */
4437 gspca_frame_add(gspca_dev
, INTER_PACKET
, data
, len
);
4440 static void ovfx2_pkt_scan(struct gspca_dev
*gspca_dev
,
4441 u8
*data
, /* isoc packet */
4442 int len
) /* iso packet length */
4444 struct sd
*sd
= (struct sd
*) gspca_dev
;
4446 gspca_frame_add(gspca_dev
, INTER_PACKET
, data
, len
);
4448 /* A short read signals EOF */
4449 if (len
< gspca_dev
->cam
.bulk_size
) {
4450 /* If the frame is short, and it is one of the first ones
4451 the sensor and bridge are still syncing, so drop it. */
4452 if (sd
->first_frame
) {
4454 if (gspca_dev
->image_len
<
4455 sd
->gspca_dev
.width
* sd
->gspca_dev
.height
)
4456 gspca_dev
->last_packet_type
= DISCARD_PACKET
;
4458 gspca_frame_add(gspca_dev
, LAST_PACKET
, NULL
, 0);
4459 gspca_frame_add(gspca_dev
, FIRST_PACKET
, NULL
, 0);
4463 static void sd_pkt_scan(struct gspca_dev
*gspca_dev
,
4464 u8
*data
, /* isoc packet */
4465 int len
) /* iso packet length */
4467 struct sd
*sd
= (struct sd
*) gspca_dev
;
4469 switch (sd
->bridge
) {
4471 case BRIDGE_OV511PLUS
:
4472 ov511_pkt_scan(gspca_dev
, data
, len
);
4475 case BRIDGE_OV518PLUS
:
4476 ov518_pkt_scan(gspca_dev
, data
, len
);
4479 ov519_pkt_scan(gspca_dev
, data
, len
);
4482 ovfx2_pkt_scan(gspca_dev
, data
, len
);
4484 case BRIDGE_W9968CF
:
4485 w9968cf_pkt_scan(gspca_dev
, data
, len
);
4490 /* -- management routines -- */
4492 static void setbrightness(struct gspca_dev
*gspca_dev
, s32 val
)
4494 struct sd
*sd
= (struct sd
*) gspca_dev
;
4495 static const struct ov_i2c_regvals brit_7660
[][7] = {
4496 {{0x0f, 0x6a}, {0x24, 0x40}, {0x25, 0x2b}, {0x26, 0x90},
4497 {0x27, 0xe0}, {0x28, 0xe0}, {0x2c, 0xe0}},
4498 {{0x0f, 0x6a}, {0x24, 0x50}, {0x25, 0x40}, {0x26, 0xa1},
4499 {0x27, 0xc0}, {0x28, 0xc0}, {0x2c, 0xc0}},
4500 {{0x0f, 0x6a}, {0x24, 0x68}, {0x25, 0x58}, {0x26, 0xc2},
4501 {0x27, 0xa0}, {0x28, 0xa0}, {0x2c, 0xa0}},
4502 {{0x0f, 0x6a}, {0x24, 0x70}, {0x25, 0x68}, {0x26, 0xd3},
4503 {0x27, 0x80}, {0x28, 0x80}, {0x2c, 0x80}},
4504 {{0x0f, 0x6a}, {0x24, 0x80}, {0x25, 0x70}, {0x26, 0xd3},
4505 {0x27, 0x20}, {0x28, 0x20}, {0x2c, 0x20}},
4506 {{0x0f, 0x6a}, {0x24, 0x88}, {0x25, 0x78}, {0x26, 0xd3},
4507 {0x27, 0x40}, {0x28, 0x40}, {0x2c, 0x40}},
4508 {{0x0f, 0x6a}, {0x24, 0x90}, {0x25, 0x80}, {0x26, 0xd4},
4509 {0x27, 0x60}, {0x28, 0x60}, {0x2c, 0x60}}
4512 switch (sd
->sensor
) {
4521 i2c_w(sd
, OV7610_REG_BRT
, val
);
4525 i2c_w(sd
, OV7610_REG_BRT
, val
);
4528 write_i2c_regvals(sd
, brit_7660
[val
],
4529 ARRAY_SIZE(brit_7660
[0]));
4533 * i2c_w_mask(sd, OV7670_R13_COM8, 0, OV7670_COM8_AEC); */
4534 i2c_w(sd
, OV7670_R55_BRIGHT
, ov7670_abs_to_sm(val
));
4539 static void setcontrast(struct gspca_dev
*gspca_dev
, s32 val
)
4541 struct sd
*sd
= (struct sd
*) gspca_dev
;
4542 static const struct ov_i2c_regvals contrast_7660
[][31] = {
4543 {{0x6c, 0xf0}, {0x6d, 0xf0}, {0x6e, 0xf8}, {0x6f, 0xa0},
4544 {0x70, 0x58}, {0x71, 0x38}, {0x72, 0x30}, {0x73, 0x30},
4545 {0x74, 0x28}, {0x75, 0x28}, {0x76, 0x24}, {0x77, 0x24},
4546 {0x78, 0x22}, {0x79, 0x28}, {0x7a, 0x2a}, {0x7b, 0x34},
4547 {0x7c, 0x0f}, {0x7d, 0x1e}, {0x7e, 0x3d}, {0x7f, 0x65},
4548 {0x80, 0x70}, {0x81, 0x77}, {0x82, 0x7d}, {0x83, 0x83},
4549 {0x84, 0x88}, {0x85, 0x8d}, {0x86, 0x96}, {0x87, 0x9f},
4550 {0x88, 0xb0}, {0x89, 0xc4}, {0x8a, 0xd9}},
4551 {{0x6c, 0xf0}, {0x6d, 0xf0}, {0x6e, 0xf8}, {0x6f, 0x94},
4552 {0x70, 0x58}, {0x71, 0x40}, {0x72, 0x30}, {0x73, 0x30},
4553 {0x74, 0x30}, {0x75, 0x30}, {0x76, 0x2c}, {0x77, 0x24},
4554 {0x78, 0x22}, {0x79, 0x28}, {0x7a, 0x2a}, {0x7b, 0x31},
4555 {0x7c, 0x0f}, {0x7d, 0x1e}, {0x7e, 0x3d}, {0x7f, 0x62},
4556 {0x80, 0x6d}, {0x81, 0x75}, {0x82, 0x7b}, {0x83, 0x81},
4557 {0x84, 0x87}, {0x85, 0x8d}, {0x86, 0x98}, {0x87, 0xa1},
4558 {0x88, 0xb2}, {0x89, 0xc6}, {0x8a, 0xdb}},
4559 {{0x6c, 0xf0}, {0x6d, 0xf0}, {0x6e, 0xf0}, {0x6f, 0x84},
4560 {0x70, 0x58}, {0x71, 0x48}, {0x72, 0x40}, {0x73, 0x40},
4561 {0x74, 0x28}, {0x75, 0x28}, {0x76, 0x28}, {0x77, 0x24},
4562 {0x78, 0x26}, {0x79, 0x28}, {0x7a, 0x28}, {0x7b, 0x34},
4563 {0x7c, 0x0f}, {0x7d, 0x1e}, {0x7e, 0x3c}, {0x7f, 0x5d},
4564 {0x80, 0x68}, {0x81, 0x71}, {0x82, 0x79}, {0x83, 0x81},
4565 {0x84, 0x86}, {0x85, 0x8b}, {0x86, 0x95}, {0x87, 0x9e},
4566 {0x88, 0xb1}, {0x89, 0xc5}, {0x8a, 0xd9}},
4567 {{0x6c, 0xf0}, {0x6d, 0xf0}, {0x6e, 0xf0}, {0x6f, 0x70},
4568 {0x70, 0x58}, {0x71, 0x58}, {0x72, 0x48}, {0x73, 0x48},
4569 {0x74, 0x38}, {0x75, 0x40}, {0x76, 0x34}, {0x77, 0x34},
4570 {0x78, 0x2e}, {0x79, 0x28}, {0x7a, 0x24}, {0x7b, 0x22},
4571 {0x7c, 0x0f}, {0x7d, 0x1e}, {0x7e, 0x3c}, {0x7f, 0x58},
4572 {0x80, 0x63}, {0x81, 0x6e}, {0x82, 0x77}, {0x83, 0x80},
4573 {0x84, 0x87}, {0x85, 0x8f}, {0x86, 0x9c}, {0x87, 0xa9},
4574 {0x88, 0xc0}, {0x89, 0xd4}, {0x8a, 0xe6}},
4575 {{0x6c, 0xa0}, {0x6d, 0xf0}, {0x6e, 0x90}, {0x6f, 0x80},
4576 {0x70, 0x70}, {0x71, 0x80}, {0x72, 0x60}, {0x73, 0x60},
4577 {0x74, 0x58}, {0x75, 0x60}, {0x76, 0x4c}, {0x77, 0x38},
4578 {0x78, 0x38}, {0x79, 0x2a}, {0x7a, 0x20}, {0x7b, 0x0e},
4579 {0x7c, 0x0a}, {0x7d, 0x14}, {0x7e, 0x26}, {0x7f, 0x46},
4580 {0x80, 0x54}, {0x81, 0x64}, {0x82, 0x70}, {0x83, 0x7c},
4581 {0x84, 0x87}, {0x85, 0x93}, {0x86, 0xa6}, {0x87, 0xb4},
4582 {0x88, 0xd0}, {0x89, 0xe5}, {0x8a, 0xf5}},
4583 {{0x6c, 0x60}, {0x6d, 0x80}, {0x6e, 0x60}, {0x6f, 0x80},
4584 {0x70, 0x80}, {0x71, 0x80}, {0x72, 0x88}, {0x73, 0x30},
4585 {0x74, 0x70}, {0x75, 0x68}, {0x76, 0x64}, {0x77, 0x50},
4586 {0x78, 0x3c}, {0x79, 0x22}, {0x7a, 0x10}, {0x7b, 0x08},
4587 {0x7c, 0x06}, {0x7d, 0x0e}, {0x7e, 0x1a}, {0x7f, 0x3a},
4588 {0x80, 0x4a}, {0x81, 0x5a}, {0x82, 0x6b}, {0x83, 0x7b},
4589 {0x84, 0x89}, {0x85, 0x96}, {0x86, 0xaf}, {0x87, 0xc3},
4590 {0x88, 0xe1}, {0x89, 0xf2}, {0x8a, 0xfa}},
4591 {{0x6c, 0x20}, {0x6d, 0x40}, {0x6e, 0x20}, {0x6f, 0x60},
4592 {0x70, 0x88}, {0x71, 0xc8}, {0x72, 0xc0}, {0x73, 0xb8},
4593 {0x74, 0xa8}, {0x75, 0xb8}, {0x76, 0x80}, {0x77, 0x5c},
4594 {0x78, 0x26}, {0x79, 0x10}, {0x7a, 0x08}, {0x7b, 0x04},
4595 {0x7c, 0x02}, {0x7d, 0x06}, {0x7e, 0x0a}, {0x7f, 0x22},
4596 {0x80, 0x33}, {0x81, 0x4c}, {0x82, 0x64}, {0x83, 0x7b},
4597 {0x84, 0x90}, {0x85, 0xa7}, {0x86, 0xc7}, {0x87, 0xde},
4598 {0x88, 0xf1}, {0x89, 0xf9}, {0x8a, 0xfd}},
4601 switch (sd
->sensor
) {
4604 i2c_w(sd
, OV7610_REG_CNT
, val
);
4608 i2c_w_mask(sd
, OV7610_REG_CNT
, val
>> 4, 0x0f);
4611 static const u8 ctab
[] = {
4612 0x03, 0x09, 0x0b, 0x0f, 0x53, 0x6f, 0x35, 0x7f
4615 /* Use Y gamma control instead. Bit 0 enables it. */
4616 i2c_w(sd
, 0x64, ctab
[val
>> 5]);
4620 case SEN_OV7620AE
: {
4621 static const u8 ctab
[] = {
4622 0x01, 0x05, 0x09, 0x11, 0x15, 0x35, 0x37, 0x57,
4623 0x5b, 0xa5, 0xa7, 0xc7, 0xc9, 0xcf, 0xef, 0xff
4626 /* Use Y gamma control instead. Bit 0 enables it. */
4627 i2c_w(sd
, 0x64, ctab
[val
>> 4]);
4631 write_i2c_regvals(sd
, contrast_7660
[val
],
4632 ARRAY_SIZE(contrast_7660
[0]));
4635 /* check that this isn't just the same as ov7610 */
4636 i2c_w(sd
, OV7670_R56_CONTRAS
, val
>> 1);
4641 static void setexposure(struct gspca_dev
*gspca_dev
, s32 val
)
4643 struct sd
*sd
= (struct sd
*) gspca_dev
;
4645 i2c_w(sd
, 0x10, val
);
4648 static void setcolors(struct gspca_dev
*gspca_dev
, s32 val
)
4650 struct sd
*sd
= (struct sd
*) gspca_dev
;
4651 static const struct ov_i2c_regvals colors_7660
[][6] = {
4652 {{0x4f, 0x28}, {0x50, 0x2a}, {0x51, 0x02}, {0x52, 0x0a},
4653 {0x53, 0x19}, {0x54, 0x23}},
4654 {{0x4f, 0x47}, {0x50, 0x4a}, {0x51, 0x03}, {0x52, 0x11},
4655 {0x53, 0x2c}, {0x54, 0x3e}},
4656 {{0x4f, 0x66}, {0x50, 0x6b}, {0x51, 0x05}, {0x52, 0x19},
4657 {0x53, 0x40}, {0x54, 0x59}},
4658 {{0x4f, 0x84}, {0x50, 0x8b}, {0x51, 0x06}, {0x52, 0x20},
4659 {0x53, 0x53}, {0x54, 0x73}},
4660 {{0x4f, 0xa3}, {0x50, 0xab}, {0x51, 0x08}, {0x52, 0x28},
4661 {0x53, 0x66}, {0x54, 0x8e}},
4664 switch (sd
->sensor
) {
4671 i2c_w(sd
, OV7610_REG_SAT
, val
);
4675 /* Use UV gamma control instead. Bits 0 & 7 are reserved. */
4676 /* rc = ov_i2c_write(sd->dev, 0x62, (val >> 9) & 0x7e);
4679 i2c_w(sd
, OV7610_REG_SAT
, val
);
4683 i2c_w(sd
, OV7610_REG_SAT
, val
& 0xf0);
4686 write_i2c_regvals(sd
, colors_7660
[val
],
4687 ARRAY_SIZE(colors_7660
[0]));
4690 /* supported later once I work out how to do it
4691 * transparently fail now! */
4692 /* set REG_COM13 values for UV sat auto mode */
4697 static void setautobright(struct gspca_dev
*gspca_dev
, s32 val
)
4699 struct sd
*sd
= (struct sd
*) gspca_dev
;
4701 i2c_w_mask(sd
, 0x2d, val
? 0x10 : 0x00, 0x10);
4704 static void setfreq_i(struct sd
*sd
, s32 val
)
4706 if (sd
->sensor
== SEN_OV7660
4707 || sd
->sensor
== SEN_OV7670
) {
4709 case 0: /* Banding filter disabled */
4710 i2c_w_mask(sd
, OV7670_R13_COM8
, 0, OV7670_COM8_BFILT
);
4713 i2c_w_mask(sd
, OV7670_R13_COM8
, OV7670_COM8_BFILT
,
4715 i2c_w_mask(sd
, OV7670_R3B_COM11
, 0x08, 0x18);
4718 i2c_w_mask(sd
, OV7670_R13_COM8
, OV7670_COM8_BFILT
,
4720 i2c_w_mask(sd
, OV7670_R3B_COM11
, 0x00, 0x18);
4722 case 3: /* Auto hz - ov7670 only */
4723 i2c_w_mask(sd
, OV7670_R13_COM8
, OV7670_COM8_BFILT
,
4725 i2c_w_mask(sd
, OV7670_R3B_COM11
, OV7670_COM11_HZAUTO
,
4731 case 0: /* Banding filter disabled */
4732 i2c_w_mask(sd
, 0x2d, 0x00, 0x04);
4733 i2c_w_mask(sd
, 0x2a, 0x00, 0x80);
4735 case 1: /* 50 hz (filter on and framerate adj) */
4736 i2c_w_mask(sd
, 0x2d, 0x04, 0x04);
4737 i2c_w_mask(sd
, 0x2a, 0x80, 0x80);
4738 /* 20 fps -> 16.667 fps */
4739 if (sd
->sensor
== SEN_OV6620
||
4740 sd
->sensor
== SEN_OV6630
||
4741 sd
->sensor
== SEN_OV66308AF
)
4742 i2c_w(sd
, 0x2b, 0x5e);
4744 i2c_w(sd
, 0x2b, 0xac);
4746 case 2: /* 60 hz (filter on, ...) */
4747 i2c_w_mask(sd
, 0x2d, 0x04, 0x04);
4748 if (sd
->sensor
== SEN_OV6620
||
4749 sd
->sensor
== SEN_OV6630
||
4750 sd
->sensor
== SEN_OV66308AF
) {
4751 /* 20 fps -> 15 fps */
4752 i2c_w_mask(sd
, 0x2a, 0x80, 0x80);
4753 i2c_w(sd
, 0x2b, 0xa8);
4755 /* no framerate adj. */
4756 i2c_w_mask(sd
, 0x2a, 0x00, 0x80);
4763 static void setfreq(struct gspca_dev
*gspca_dev
, s32 val
)
4765 struct sd
*sd
= (struct sd
*) gspca_dev
;
4769 /* Ugly but necessary */
4770 if (sd
->bridge
== BRIDGE_W9968CF
)
4771 w9968cf_set_crop_window(sd
);
4774 static int sd_get_jcomp(struct gspca_dev
*gspca_dev
,
4775 struct v4l2_jpegcompression
*jcomp
)
4777 struct sd
*sd
= (struct sd
*) gspca_dev
;
4779 if (sd
->bridge
!= BRIDGE_W9968CF
)
4782 memset(jcomp
, 0, sizeof *jcomp
);
4783 jcomp
->quality
= v4l2_ctrl_g_ctrl(sd
->jpegqual
);
4784 jcomp
->jpeg_markers
= V4L2_JPEG_MARKER_DHT
| V4L2_JPEG_MARKER_DQT
|
4785 V4L2_JPEG_MARKER_DRI
;
4789 static int sd_set_jcomp(struct gspca_dev
*gspca_dev
,
4790 const struct v4l2_jpegcompression
*jcomp
)
4792 struct sd
*sd
= (struct sd
*) gspca_dev
;
4794 if (sd
->bridge
!= BRIDGE_W9968CF
)
4797 v4l2_ctrl_s_ctrl(sd
->jpegqual
, jcomp
->quality
);
4801 static int sd_g_volatile_ctrl(struct v4l2_ctrl
*ctrl
)
4803 struct gspca_dev
*gspca_dev
=
4804 container_of(ctrl
->handler
, struct gspca_dev
, ctrl_handler
);
4805 struct sd
*sd
= (struct sd
*)gspca_dev
;
4807 gspca_dev
->usb_err
= 0;
4810 case V4L2_CID_AUTOGAIN
:
4811 gspca_dev
->exposure
->val
= i2c_r(sd
, 0x10);
4817 static int sd_s_ctrl(struct v4l2_ctrl
*ctrl
)
4819 struct gspca_dev
*gspca_dev
=
4820 container_of(ctrl
->handler
, struct gspca_dev
, ctrl_handler
);
4821 struct sd
*sd
= (struct sd
*)gspca_dev
;
4823 gspca_dev
->usb_err
= 0;
4825 if (!gspca_dev
->streaming
)
4829 case V4L2_CID_BRIGHTNESS
:
4830 setbrightness(gspca_dev
, ctrl
->val
);
4832 case V4L2_CID_CONTRAST
:
4833 setcontrast(gspca_dev
, ctrl
->val
);
4835 case V4L2_CID_POWER_LINE_FREQUENCY
:
4836 setfreq(gspca_dev
, ctrl
->val
);
4838 case V4L2_CID_AUTOBRIGHTNESS
:
4840 setautobright(gspca_dev
, ctrl
->val
);
4841 if (!ctrl
->val
&& sd
->brightness
->is_new
)
4842 setbrightness(gspca_dev
, sd
->brightness
->val
);
4844 case V4L2_CID_SATURATION
:
4845 setcolors(gspca_dev
, ctrl
->val
);
4847 case V4L2_CID_HFLIP
:
4848 sethvflip(gspca_dev
, ctrl
->val
, sd
->vflip
->val
);
4850 case V4L2_CID_AUTOGAIN
:
4852 setautogain(gspca_dev
, ctrl
->val
);
4853 if (!ctrl
->val
&& gspca_dev
->exposure
->is_new
)
4854 setexposure(gspca_dev
, gspca_dev
->exposure
->val
);
4856 case V4L2_CID_JPEG_COMPRESSION_QUALITY
:
4857 return -EBUSY
; /* Should never happen, as we grab the ctrl */
4859 return gspca_dev
->usb_err
;
4862 static const struct v4l2_ctrl_ops sd_ctrl_ops
= {
4863 .g_volatile_ctrl
= sd_g_volatile_ctrl
,
4864 .s_ctrl
= sd_s_ctrl
,
4867 static int sd_init_controls(struct gspca_dev
*gspca_dev
)
4869 struct sd
*sd
= (struct sd
*)gspca_dev
;
4870 struct v4l2_ctrl_handler
*hdl
= &gspca_dev
->ctrl_handler
;
4872 gspca_dev
->vdev
.ctrl_handler
= hdl
;
4873 v4l2_ctrl_handler_init(hdl
, 10);
4874 if (valid_controls
[sd
->sensor
].has_brightness
)
4875 sd
->brightness
= v4l2_ctrl_new_std(hdl
, &sd_ctrl_ops
,
4876 V4L2_CID_BRIGHTNESS
, 0,
4877 sd
->sensor
== SEN_OV7660
? 6 : 255, 1,
4878 sd
->sensor
== SEN_OV7660
? 3 : 127);
4879 if (valid_controls
[sd
->sensor
].has_contrast
) {
4880 if (sd
->sensor
== SEN_OV7660
)
4881 v4l2_ctrl_new_std(hdl
, &sd_ctrl_ops
,
4882 V4L2_CID_CONTRAST
, 0, 6, 1, 3);
4884 v4l2_ctrl_new_std(hdl
, &sd_ctrl_ops
,
4885 V4L2_CID_CONTRAST
, 0, 255, 1,
4886 (sd
->sensor
== SEN_OV6630
||
4887 sd
->sensor
== SEN_OV66308AF
) ? 200 : 127);
4889 if (valid_controls
[sd
->sensor
].has_sat
)
4890 v4l2_ctrl_new_std(hdl
, &sd_ctrl_ops
,
4891 V4L2_CID_SATURATION
, 0,
4892 sd
->sensor
== SEN_OV7660
? 4 : 255, 1,
4893 sd
->sensor
== SEN_OV7660
? 2 : 127);
4894 if (valid_controls
[sd
->sensor
].has_exposure
)
4895 gspca_dev
->exposure
= v4l2_ctrl_new_std(hdl
, &sd_ctrl_ops
,
4896 V4L2_CID_EXPOSURE
, 0, 255, 1, 127);
4897 if (valid_controls
[sd
->sensor
].has_hvflip
) {
4898 sd
->hflip
= v4l2_ctrl_new_std(hdl
, &sd_ctrl_ops
,
4899 V4L2_CID_HFLIP
, 0, 1, 1, 0);
4900 sd
->vflip
= v4l2_ctrl_new_std(hdl
, &sd_ctrl_ops
,
4901 V4L2_CID_VFLIP
, 0, 1, 1, 0);
4903 if (valid_controls
[sd
->sensor
].has_autobright
)
4904 sd
->autobright
= v4l2_ctrl_new_std(hdl
, &sd_ctrl_ops
,
4905 V4L2_CID_AUTOBRIGHTNESS
, 0, 1, 1, 1);
4906 if (valid_controls
[sd
->sensor
].has_autogain
)
4907 gspca_dev
->autogain
= v4l2_ctrl_new_std(hdl
, &sd_ctrl_ops
,
4908 V4L2_CID_AUTOGAIN
, 0, 1, 1, 1);
4909 if (valid_controls
[sd
->sensor
].has_freq
) {
4910 if (sd
->sensor
== SEN_OV7670
)
4911 sd
->freq
= v4l2_ctrl_new_std_menu(hdl
, &sd_ctrl_ops
,
4912 V4L2_CID_POWER_LINE_FREQUENCY
,
4913 V4L2_CID_POWER_LINE_FREQUENCY_AUTO
, 0,
4914 V4L2_CID_POWER_LINE_FREQUENCY_AUTO
);
4916 sd
->freq
= v4l2_ctrl_new_std_menu(hdl
, &sd_ctrl_ops
,
4917 V4L2_CID_POWER_LINE_FREQUENCY
,
4918 V4L2_CID_POWER_LINE_FREQUENCY_60HZ
, 0, 0);
4920 if (sd
->bridge
== BRIDGE_W9968CF
)
4921 sd
->jpegqual
= v4l2_ctrl_new_std(hdl
, &sd_ctrl_ops
,
4922 V4L2_CID_JPEG_COMPRESSION_QUALITY
,
4923 QUALITY_MIN
, QUALITY_MAX
, 1, QUALITY_DEF
);
4926 PERR("Could not initialize controls\n");
4929 if (gspca_dev
->autogain
)
4930 v4l2_ctrl_auto_cluster(3, &gspca_dev
->autogain
, 0, true);
4932 v4l2_ctrl_auto_cluster(2, &sd
->autobright
, 0, false);
4934 v4l2_ctrl_cluster(2, &sd
->hflip
);
4938 /* sub-driver description */
4939 static const struct sd_desc sd_desc
= {
4940 .name
= MODULE_NAME
,
4941 .config
= sd_config
,
4943 .init_controls
= sd_init_controls
,
4944 .isoc_init
= sd_isoc_init
,
4948 .pkt_scan
= sd_pkt_scan
,
4949 .dq_callback
= sd_reset_snapshot
,
4950 .get_jcomp
= sd_get_jcomp
,
4951 .set_jcomp
= sd_set_jcomp
,
4952 #if IS_ENABLED(CONFIG_INPUT)
4957 /* -- module initialisation -- */
4958 static const struct usb_device_id device_table
[] = {
4959 {USB_DEVICE(0x041e, 0x4003), .driver_info
= BRIDGE_W9968CF
},
4960 {USB_DEVICE(0x041e, 0x4052),
4961 .driver_info
= BRIDGE_OV519
| BRIDGE_INVERT_LED
},
4962 {USB_DEVICE(0x041e, 0x405f), .driver_info
= BRIDGE_OV519
},
4963 {USB_DEVICE(0x041e, 0x4060), .driver_info
= BRIDGE_OV519
},
4964 {USB_DEVICE(0x041e, 0x4061), .driver_info
= BRIDGE_OV519
},
4965 {USB_DEVICE(0x041e, 0x4064), .driver_info
= BRIDGE_OV519
},
4966 {USB_DEVICE(0x041e, 0x4067), .driver_info
= BRIDGE_OV519
},
4967 {USB_DEVICE(0x041e, 0x4068), .driver_info
= BRIDGE_OV519
},
4968 {USB_DEVICE(0x045e, 0x028c),
4969 .driver_info
= BRIDGE_OV519
| BRIDGE_INVERT_LED
},
4970 {USB_DEVICE(0x054c, 0x0154), .driver_info
= BRIDGE_OV519
},
4971 {USB_DEVICE(0x054c, 0x0155), .driver_info
= BRIDGE_OV519
},
4972 {USB_DEVICE(0x05a9, 0x0511), .driver_info
= BRIDGE_OV511
},
4973 {USB_DEVICE(0x05a9, 0x0518), .driver_info
= BRIDGE_OV518
},
4974 {USB_DEVICE(0x05a9, 0x0519),
4975 .driver_info
= BRIDGE_OV519
| BRIDGE_INVERT_LED
},
4976 {USB_DEVICE(0x05a9, 0x0530),
4977 .driver_info
= BRIDGE_OV519
| BRIDGE_INVERT_LED
},
4978 {USB_DEVICE(0x05a9, 0x2800), .driver_info
= BRIDGE_OVFX2
},
4979 {USB_DEVICE(0x05a9, 0x4519), .driver_info
= BRIDGE_OV519
},
4980 {USB_DEVICE(0x05a9, 0x8519), .driver_info
= BRIDGE_OV519
},
4981 {USB_DEVICE(0x05a9, 0xa511), .driver_info
= BRIDGE_OV511PLUS
},
4982 {USB_DEVICE(0x05a9, 0xa518), .driver_info
= BRIDGE_OV518PLUS
},
4983 {USB_DEVICE(0x0813, 0x0002), .driver_info
= BRIDGE_OV511PLUS
},
4984 {USB_DEVICE(0x0b62, 0x0059), .driver_info
= BRIDGE_OVFX2
},
4985 {USB_DEVICE(0x0e96, 0xc001), .driver_info
= BRIDGE_OVFX2
},
4986 {USB_DEVICE(0x1046, 0x9967), .driver_info
= BRIDGE_W9968CF
},
4987 {USB_DEVICE(0x8020, 0xef04), .driver_info
= BRIDGE_OVFX2
},
4991 MODULE_DEVICE_TABLE(usb
, device_table
);
4993 /* -- device connect -- */
4994 static int sd_probe(struct usb_interface
*intf
,
4995 const struct usb_device_id
*id
)
4997 return gspca_dev_probe(intf
, id
, &sd_desc
, sizeof(struct sd
),
5001 static struct usb_driver sd_driver
= {
5002 .name
= MODULE_NAME
,
5003 .id_table
= device_table
,
5005 .disconnect
= gspca_disconnect
,
5007 .suspend
= gspca_suspend
,
5008 .resume
= gspca_resume
,
5009 .reset_resume
= gspca_resume
,
5013 module_usb_driver(sd_driver
);
5015 module_param(frame_rate
, int, 0644);
5016 MODULE_PARM_DESC(frame_rate
, "Frame rate (5, 10, 15, 20 or 30 fps)");