^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * SPCA508 chip based cameras subdriver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2009 Jean-Francois Moine <http://moinejf.free.fr>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define MODULE_NAME "spca508"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include "gspca.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) MODULE_DESCRIPTION("GSPCA/SPCA508 USB Camera Driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) /* specific webcam descriptor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) struct sd {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) struct gspca_dev gspca_dev; /* !! must be the first item */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) u8 subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define CreativeVista 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define HamaUSBSightcam 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define HamaUSBSightcam2 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define IntelEasyPCCamera 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define MicroInnovationIC200 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define ViewQuestVQ110 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) static const struct v4l2_pix_format sif_mode[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) {160, 120, V4L2_PIX_FMT_SPCA508, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) .bytesperline = 160,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) .sizeimage = 160 * 120 * 3 / 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) .priv = 3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) {176, 144, V4L2_PIX_FMT_SPCA508, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) .bytesperline = 176,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) .sizeimage = 176 * 144 * 3 / 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) .priv = 2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) {320, 240, V4L2_PIX_FMT_SPCA508, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) .bytesperline = 320,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) .sizeimage = 320 * 240 * 3 / 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) .priv = 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) {352, 288, V4L2_PIX_FMT_SPCA508, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) .bytesperline = 352,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) .sizeimage = 352 * 288 * 3 / 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) .priv = 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) /* Frame packet header offsets for the spca508 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define SPCA508_OFFSET_DATA 37
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * Initialization data: this is the first set-up data written to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * device (before the open data).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) static const u16 spca508_init_data[][2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) {0x0000, 0x870b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) {0x0020, 0x8112}, /* Video drop enable, ISO streaming disable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) {0x0003, 0x8111}, /* Reset compression & memory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) {0x0000, 0x8110}, /* Disable all outputs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) /* READ {0x0000, 0x8114} -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) {0x0000, 0x8114}, /* SW GPIO data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) {0x0008, 0x8110}, /* Enable charge pump output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) {0x0002, 0x8116}, /* 200 kHz pump clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) /* UNKNOWN DIRECTION (URB_FUNCTION_SELECT_INTERFACE:) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) {0x0003, 0x8111}, /* Reset compression & memory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) {0x0000, 0x8111}, /* Normal mode (not reset) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) {0x0098, 0x8110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) /* Enable charge pump output, sync.serial,external 2x clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) {0x000d, 0x8114}, /* SW GPIO data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) {0x0002, 0x8116}, /* 200 kHz pump clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) {0x0020, 0x8112}, /* Video drop enable, ISO streaming disable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) /* --------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) {0x000f, 0x8402}, /* memory bank */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) {0x0000, 0x8403}, /* ... address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) /* --------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) /* 0x88__ is Synchronous Serial Interface. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) /* TBD: This table could be expressed more compactly */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /* using spca508_write_i2c_vector(). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) /* TBD: Should see if the values in spca50x_i2c_data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /* would work with the VQ110 instead of the values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) /* below. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) {0x00c0, 0x8804}, /* SSI slave addr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) {0x0008, 0x8802}, /* 375 Khz SSI clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) {0x0008, 0x8802}, /* 375 Khz SSI clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) {0x0012, 0x8801}, /* SSI reg addr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) {0x0080, 0x8800}, /* SSI data to write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) {0x0008, 0x8802}, /* 375 Khz SSI clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) {0x0012, 0x8801}, /* SSI reg addr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) {0x0000, 0x8800}, /* SSI data to write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) {0x0008, 0x8802}, /* 375 Khz SSI clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) {0x0011, 0x8801}, /* SSI reg addr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) {0x0040, 0x8800}, /* SSI data to write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) {0x0013, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) {0x0014, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) {0x0015, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) {0x0001, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) {0x0016, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) {0x0003, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) {0x0017, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) {0x0036, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) {0x0018, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) {0x00ec, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) {0x001a, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) {0x0094, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) {0x001b, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) {0x0027, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) {0x00a2, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) {0x0028, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) {0x0040, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) {0x002a, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) {0x0084, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) {0x002b, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) {0x00a8, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) {0x002c, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) {0x00fe, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) {0x002d, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) {0x0003, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) {0x0038, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) {0x0083, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) {0x0033, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) {0x0081, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) {0x0034, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) {0x004a, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) {0x0039, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) {0x0010, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) {0x00a8, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) {0x0006, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) {0x0058, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) {0x0000, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) {0x0004, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) {0x0040, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) {0x0080, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) {0x0041, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) {0x000c, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) {0x0042, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) {0x000c, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) {0x0043, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) {0x0028, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) {0x0044, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) {0x0080, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) {0x0045, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) {0x0020, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) {0x0046, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) {0x0020, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) {0x0047, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) {0x0080, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) {0x0048, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) {0x004c, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) {0x0049, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) {0x0084, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) {0x004a, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) {0x0084, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) {0x0008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) {0x004b, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) {0x0084, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) /* --------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) {0x0012, 0x8700}, /* Clock speed 48Mhz/(2+2)/2= 6 Mhz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) {0x0000, 0x8701}, /* CKx1 clock delay adj */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) {0x0000, 0x8701}, /* CKx1 clock delay adj */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) {0x0001, 0x870c}, /* CKOx2 output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) /* --------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) {0x0080, 0x8600}, /* Line memory read counter (L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) {0x0001, 0x8606}, /* reserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) {0x0064, 0x8607}, /* Line memory read counter (H) 0x6480=25,728 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) {0x002a, 0x8601}, /* CDSP sharp interpolation mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) * line sel for color sep, edge enhance enab */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) {0x0000, 0x8602}, /* optical black level for user settng = 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) {0x0080, 0x8600}, /* Line memory read counter (L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) {0x000a, 0x8603}, /* optical black level calc mode:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) * auto; optical black offset = 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) {0x00df, 0x865b}, /* Horiz offset for valid pixels (L)=0xdf */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) {0x0012, 0x865c}, /* Vert offset for valid lines (L)=0x12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) /* The following two lines seem to be the "wrong" resolution. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) /* But perhaps these indicate the actual size of the sensor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) /* rather than the size of the current video mode. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) {0x0058, 0x865d}, /* Horiz valid pixels (*4) (L) = 352 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) {0x0048, 0x865e}, /* Vert valid lines (*4) (L) = 288 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) {0x0015, 0x8608}, /* A11 Coef ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) {0x0030, 0x8609},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) {0x00fb, 0x860a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) {0x003e, 0x860b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) {0x00ce, 0x860c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) {0x00f4, 0x860d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) {0x00eb, 0x860e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) {0x00dc, 0x860f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) {0x0039, 0x8610},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) {0x0001, 0x8611}, /* R offset for white balance ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) {0x0000, 0x8612},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) {0x0001, 0x8613},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) {0x0000, 0x8614},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) {0x005b, 0x8651}, /* R gain for white balance ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) {0x0040, 0x8652},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) {0x0060, 0x8653},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) {0x0040, 0x8654},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) {0x0000, 0x8655},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) {0x0001, 0x863f}, /* Fixed gamma correction enable, USB control,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) * lum filter disable, lum noise clip disable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) {0x00a1, 0x8656}, /* Window1 size 256x256, Windows2 size 64x64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) * gamma look-up disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) * new edge enhancement enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) {0x0018, 0x8657}, /* Edge gain high thresh */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) {0x0020, 0x8658}, /* Edge gain low thresh */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) {0x000a, 0x8659}, /* Edge bandwidth high threshold */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) {0x0005, 0x865a}, /* Edge bandwidth low threshold */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) /* -------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) {0x0030, 0x8112}, /* Video drop enable, ISO streaming enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) {0xa908, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) {0x0034, 0x8801}, /* SSI reg addr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) {0x00ca, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) /* SSI data to write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) {0x1f08, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) {0x0006, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) {0x0080, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) /* ----- Read back coefs we wrote earlier. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) /* READ { 0x0000, 0x8608 } -> 0000: 15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) /* READ { 0x0000, 0x8609 } -> 0000: 30 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) /* READ { 0x0000, 0x860a } -> 0000: fb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) /* READ { 0x0000, 0x860b } -> 0000: 3e */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) /* READ { 0x0000, 0x860c } -> 0000: ce */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) /* READ { 0x0000, 0x860d } -> 0000: f4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) /* READ { 0x0000, 0x860e } -> 0000: eb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) /* READ { 0x0000, 0x860f } -> 0000: dc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) /* READ { 0x0000, 0x8610 } -> 0000: 39 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) /* READ { 0x0001, 0x8802 } -> 0000: 08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) {0xb008, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) {0x0006, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) {0x007d, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) /* This chunk is seemingly redundant with */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) /* earlier commands (A11 Coef...), but if I disable it, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) /* the image appears too dark. Maybe there was some kind of */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) /* reset since the earlier commands, so this is necessary again. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) {0x0015, 0x8608},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) {0x0030, 0x8609},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) {0xfffb, 0x860a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) {0x003e, 0x860b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) {0xffce, 0x860c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) {0xfff4, 0x860d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) {0xffeb, 0x860e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) {0xffdc, 0x860f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) {0x0039, 0x8610},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) {0x0018, 0x8657},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) {0x0000, 0x8508}, /* Disable compression. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) /* Previous line was:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) {0x0021, 0x8508}, * Enable compression. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) {0x0032, 0x850b}, /* compression stuff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) {0x0003, 0x8509}, /* compression stuff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) {0x0011, 0x850a}, /* compression stuff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) {0x0021, 0x850d}, /* compression stuff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) {0x0010, 0x850c}, /* compression stuff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) {0x0003, 0x8500}, /* *** Video mode: 160x120 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) {0x0001, 0x8501}, /* Hardware-dominated snap control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) {0x0061, 0x8656}, /* Window1 size 128x128, Windows2 size 128x128,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) * gamma look-up disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) * new edge enhancement enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) {0x0018, 0x8617}, /* Window1 start X (*2) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) {0x0008, 0x8618}, /* Window1 start Y (*2) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) {0x0061, 0x8656}, /* Window1 size 128x128, Windows2 size 128x128,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) * gamma look-up disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) * new edge enhancement enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) {0x0058, 0x8619}, /* Window2 start X (*2) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) {0x0008, 0x861a}, /* Window2 start Y (*2) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) {0x00ff, 0x8615}, /* High lum thresh for white balance */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) {0x0000, 0x8616}, /* Low lum thresh for white balance */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) {0x0012, 0x8700}, /* Clock speed 48Mhz/(2+2)/2= 6 Mhz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) {0x0012, 0x8700}, /* Clock speed 48Mhz/(2+2)/2= 6 Mhz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) /* READ { 0x0000, 0x8656 } -> 0000: 61 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) {0x0028, 0x8802}, /* 375 Khz SSI clock, SSI r/w sync with VSYNC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) /* READ { 0x0001, 0x8802 } -> 0000: 28 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) {0x1f28, 0x8802}, /* 375 Khz SSI clock, SSI r/w sync with VSYNC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) {0x0010, 0x8801}, /* SSI reg addr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) {0x003e, 0x8800}, /* SSI data to write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) {0x0028, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) /* READ { 0x0001, 0x8802 } -> 0000: 28 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) {0x1f28, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) {0x0000, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) {0x001f, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) {0x0001, 0x8602}, /* optical black level for user settning = 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) /* Original: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) {0x0023, 0x8700}, /* Clock speed 48Mhz/(3+2)/4= 2.4 Mhz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) {0x000f, 0x8602}, /* optical black level for user settning = 15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) {0x0028, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) /* READ { 0x0001, 0x8802 } -> 0000: 28 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) {0x1f28, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) {0x0010, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) {0x007b, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) {0x002f, 0x8651}, /* R gain for white balance ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) {0x0080, 0x8653},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) /* READ { 0x0000, 0x8655 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) {0x0000, 0x8655},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) {0x0030, 0x8112}, /* Video drop enable, ISO streaming enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) {0x0020, 0x8112}, /* Video drop enable, ISO streaming disable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) /* UNKNOWN DIRECTION (URB_FUNCTION_SELECT_INTERFACE: (ALT=0) ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) * Initialization data for Intel EasyPC Camera CS110
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) static const u16 spca508cs110_init_data[][2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) {0x0000, 0x870b}, /* Reset CTL3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) {0x0003, 0x8111}, /* Soft Reset compression, memory, TG & CDSP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) {0x0000, 0x8111}, /* Normal operation on reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) {0x0090, 0x8110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) /* External Clock 2x & Synchronous Serial Interface Output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) {0x0020, 0x8112}, /* Video Drop packet enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) {0x0000, 0x8114}, /* Software GPIO output data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) {0x0001, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) {0x0001, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) {0x0001, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) {0x0003, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) /* Initial sequence Synchronous Serial Interface */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) {0x000f, 0x8402}, /* Memory bank Address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) {0x0000, 0x8403}, /* Memory bank Address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) {0x00ba, 0x8804}, /* SSI Slave address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) {0x0010, 0x8802}, /* 93.75kHz SSI Clock Two DataByte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) {0x0010, 0x8802}, /* 93.75kHz SSI Clock two DataByte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) {0x0001, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) {0x000a, 0x8805}, /* a - NWG: Dunno what this is about */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) {0x0002, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) {0x0000, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) {0x0003, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) {0x0027, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) {0x0001, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) {0x0004, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) {0x0065, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) {0x0001, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) {0x0005, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) {0x0003, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) {0x0006, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) {0x001c, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) {0x0007, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) {0x002a, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) {0x0002, 0x8704}, /* External input CKIx1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) {0x0001, 0x8606}, /* 1 Line memory Read Counter (H) Result: (d)410 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) {0x009a, 0x8600}, /* Line memory Read Counter (L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) {0x0001, 0x865b}, /* 1 Horizontal Offset for Valid Pixel(L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) {0x0003, 0x865c}, /* 3 Vertical Offset for Valid Lines(L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) {0x0058, 0x865d}, /* 58 Horizontal Valid Pixel Window(L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) {0x0006, 0x8660}, /* Nibble data + input order */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) {0x000a, 0x8602}, /* Optical black level set to 0x0a */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) {0x0000, 0x8603}, /* Optical black level Offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) /* {0x0000, 0x8611}, * 0 R Offset for white Balance */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) /* {0x0000, 0x8612}, * 1 Gr Offset for white Balance */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) /* {0x0000, 0x8613}, * 1f B Offset for white Balance */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) /* {0x0000, 0x8614}, * f0 Gb Offset for white Balance */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) {0x0040, 0x8651}, /* 2b BLUE gain for white balance good at all 60 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) {0x0030, 0x8652}, /* 41 Gr Gain for white Balance (L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) {0x0035, 0x8653}, /* 26 RED gain for white balance */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) {0x0035, 0x8654}, /* 40Gb Gain for white Balance (L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) {0x0041, 0x863f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) /* Fixed Gamma correction enabled (makes colours look better) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) {0x0000, 0x8655},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) /* High bits for white balance*****brightness control*** */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) static const u16 spca508_sightcam_init_data[][2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) /* This line seems to setup the frame/canvas */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) {0x000f, 0x8402},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) /* These 6 lines are needed to startup the webcam */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) {0x0090, 0x8110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) {0x0001, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) {0x0001, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) {0x0001, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) {0x0003, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) {0x0080, 0x8804},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) /* This part seems to make the pictures darker? (autobrightness?) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) {0x0001, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) {0x0004, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) {0x0003, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) {0x00e0, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) {0x0004, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) {0x00b4, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) {0x0005, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) {0x0006, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) {0x00e0, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) {0x0007, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) {0x000c, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) /* This section is just needed, it probably
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) * does something like the previous section,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) * but the cam won't start if it's not included.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) {0x0014, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) {0x0008, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) {0x0015, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) {0x0067, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) {0x0016, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) {0x0017, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) {0x0020, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) {0x0018, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) {0x0044, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) /* Makes the picture darker - and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) * cam won't start if not included
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) {0x001e, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) {0x00ea, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) {0x001f, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) {0x0001, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) {0x0003, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) {0x00e0, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) /* seems to place the colors ontop of each other #1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) {0x0006, 0x8704},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) {0x0001, 0x870c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) {0x0016, 0x8600},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) {0x0002, 0x8606},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) /* if not included the pictures becomes _very_ dark */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) {0x0064, 0x8607},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) {0x003a, 0x8601},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) {0x0000, 0x8602},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) /* seems to place the colors ontop of each other #2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) {0x0016, 0x8600},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) {0x0018, 0x8617},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) {0x0008, 0x8618},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) {0x00a1, 0x8656},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) /* webcam won't start if not included */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) {0x0007, 0x865b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) {0x0001, 0x865c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) {0x0058, 0x865d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) {0x0048, 0x865e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) /* adjusts the colors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) {0x0049, 0x8651},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) {0x0040, 0x8652},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) {0x004c, 0x8653},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) {0x0040, 0x8654},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) static const u16 spca508_sightcam2_init_data[][2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) {0x0020, 0x8112},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) {0x000f, 0x8402},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) {0x0000, 0x8403},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) {0x0008, 0x8201},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) {0x0008, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) {0x0001, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) {0x0009, 0x8201},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) {0x0008, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) {0x0001, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) {0x000a, 0x8201},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) {0x0008, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) {0x0001, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) {0x000b, 0x8201},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) {0x0008, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) {0x0001, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) {0x000c, 0x8201},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) {0x0008, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) {0x0001, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) {0x000d, 0x8201},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) {0x0008, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) {0x0001, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) {0x000e, 0x8201},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) {0x0008, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) {0x0001, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) {0x0007, 0x8201},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) {0x0008, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) {0x0001, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) {0x000f, 0x8201},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) {0x0008, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) {0x0001, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) {0x0018, 0x8660},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) {0x0010, 0x8201},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) {0x0008, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) {0x0001, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) {0x0011, 0x8201},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) {0x0008, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) {0x0001, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) {0x0000, 0x86b0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) {0x0034, 0x86b1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) {0x0000, 0x86b2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) {0x0049, 0x86b3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) {0x0000, 0x86b4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) {0x0000, 0x86b4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) {0x0012, 0x8201},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) {0x0008, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) {0x0001, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) {0x0013, 0x8201},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) {0x0008, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) {0x0001, 0x8200},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) {0x0001, 0x86b0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) {0x00aa, 0x86b1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) {0x0000, 0x86b2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) {0x00e4, 0x86b3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) {0x0000, 0x86b4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) {0x0000, 0x86b4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) {0x0018, 0x8660},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) {0x0090, 0x8110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) {0x0001, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) {0x0001, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) {0x0001, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) {0x0003, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) {0x0080, 0x8804},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) {0x0003, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) {0x0012, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) {0x0004, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) {0x0005, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) {0x0005, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) {0x0006, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) {0x0007, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) {0x0008, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) {0x0005, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) {0x000a, 0x8700},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) {0x000e, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) {0x0004, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) {0x0005, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) {0x0047, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) {0x0006, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) {0x0007, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) {0x00c0, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) {0x0008, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) {0x0003, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) {0x0013, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) {0x0001, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) {0x0009, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) {0x000a, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) {0x000b, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) {0x000c, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) {0x000e, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) {0x0004, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) {0x000f, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) {0x0010, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) {0x0006, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) {0x0011, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) {0x0006, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) {0x0012, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) {0x0013, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) {0x0001, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) {0x000a, 0x8700},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) {0x0000, 0x8702},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) {0x0000, 0x8703},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) {0x00c2, 0x8704},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) {0x0001, 0x870c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) {0x0044, 0x8600},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) {0x0002, 0x8606},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) {0x0064, 0x8607},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) {0x003a, 0x8601},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) {0x0008, 0x8602},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) {0x0044, 0x8600},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) {0x0018, 0x8617},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) {0x0008, 0x8618},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) {0x00a1, 0x8656},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) {0x0004, 0x865b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) {0x0002, 0x865c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) {0x0058, 0x865d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) {0x0048, 0x865e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) {0x0012, 0x8608},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) {0x002c, 0x8609},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) {0x0002, 0x860a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) {0x002c, 0x860b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) {0x00db, 0x860c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) {0x00f9, 0x860d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) {0x00f1, 0x860e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) {0x00e3, 0x860f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) {0x002c, 0x8610},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) {0x006c, 0x8651},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) {0x0041, 0x8652},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) {0x0059, 0x8653},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) {0x0040, 0x8654},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) {0x00fa, 0x8611},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) {0x00ff, 0x8612},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) {0x00f8, 0x8613},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) {0x0000, 0x8614},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) {0x0001, 0x863f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) {0x0000, 0x8640},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) {0x0026, 0x8641},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) {0x0045, 0x8642},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) {0x0060, 0x8643},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) {0x0075, 0x8644},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) {0x0088, 0x8645},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) {0x009b, 0x8646},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) {0x00b0, 0x8647},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) {0x00c5, 0x8648},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) {0x00d2, 0x8649},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) {0x00dc, 0x864a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) {0x00e5, 0x864b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) {0x00eb, 0x864c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) {0x00f0, 0x864d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) {0x00f6, 0x864e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) {0x00fa, 0x864f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) {0x00ff, 0x8650},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) {0x0060, 0x8657},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) {0x0010, 0x8658},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) {0x0018, 0x8659},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) {0x0005, 0x865a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) {0x0018, 0x8660},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) {0x0003, 0x8509},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) {0x0011, 0x850a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) {0x0032, 0x850b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) {0x0010, 0x850c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) {0x0021, 0x850d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) {0x0001, 0x8500},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) {0x0000, 0x8508},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) {0x0012, 0x8608},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) {0x002c, 0x8609},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) {0x0002, 0x860a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) {0x0039, 0x860b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) {0x00d0, 0x860c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) {0x00f7, 0x860d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) {0x00ed, 0x860e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) {0x00db, 0x860f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) {0x0039, 0x8610},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) {0x0012, 0x8657},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) {0x000c, 0x8619},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) {0x0004, 0x861a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) {0x00a1, 0x8656},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) {0x00c8, 0x8615},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) {0x0032, 0x8616},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) {0x0030, 0x8112},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) {0x0020, 0x8112},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) {0x0020, 0x8112},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) {0x000f, 0x8402},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) {0x0000, 0x8403},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) {0x0090, 0x8110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) {0x0001, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) {0x0001, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) {0x0001, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) {0x0003, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) {0x0080, 0x8804},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) {0x0003, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) {0x0012, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) {0x0004, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) {0x0005, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) {0x0005, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) {0x0047, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) {0x0006, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) {0x0007, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) {0x00c0, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) {0x0008, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) {0x0003, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) {0x000a, 0x8700},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) {0x000e, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) {0x0004, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) {0x0005, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) {0x0047, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) {0x0006, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) {0x0007, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) {0x00c0, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) {0x0008, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) {0x0003, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) {0x0013, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) {0x0001, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) {0x0009, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) {0x000a, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) {0x000b, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) {0x000c, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) {0x000e, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) {0x0004, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) {0x000f, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) {0x0010, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) {0x0006, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) {0x0011, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) {0x0006, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) {0x0012, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) {0x0013, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) {0x0001, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) {0x000a, 0x8700},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) {0x0000, 0x8702},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) {0x0000, 0x8703},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) {0x00c2, 0x8704},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) {0x0001, 0x870c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) {0x0044, 0x8600},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) {0x0002, 0x8606},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) {0x0064, 0x8607},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) {0x003a, 0x8601},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) {0x0008, 0x8602},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) {0x0044, 0x8600},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) {0x0018, 0x8617},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) {0x0008, 0x8618},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) {0x00a1, 0x8656},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) {0x0004, 0x865b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) {0x0002, 0x865c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) {0x0058, 0x865d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) {0x0048, 0x865e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) {0x0012, 0x8608},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) {0x002c, 0x8609},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) {0x0002, 0x860a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) {0x002c, 0x860b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) {0x00db, 0x860c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) {0x00f9, 0x860d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) {0x00f1, 0x860e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) {0x00e3, 0x860f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) {0x002c, 0x8610},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) {0x006c, 0x8651},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) {0x0041, 0x8652},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) {0x0059, 0x8653},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) {0x0040, 0x8654},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) {0x00fa, 0x8611},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) {0x00ff, 0x8612},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) {0x00f8, 0x8613},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) {0x0000, 0x8614},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) {0x0001, 0x863f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) {0x0000, 0x8640},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) {0x0026, 0x8641},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) {0x0045, 0x8642},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) {0x0060, 0x8643},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) {0x0075, 0x8644},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) {0x0088, 0x8645},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) {0x009b, 0x8646},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) {0x00b0, 0x8647},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) {0x00c5, 0x8648},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) {0x00d2, 0x8649},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) {0x00dc, 0x864a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) {0x00e5, 0x864b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) {0x00eb, 0x864c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) {0x00f0, 0x864d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) {0x00f6, 0x864e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) {0x00fa, 0x864f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) {0x00ff, 0x8650},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) {0x0060, 0x8657},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) {0x0010, 0x8658},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) {0x0018, 0x8659},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) {0x0005, 0x865a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) {0x0018, 0x8660},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) {0x0003, 0x8509},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) {0x0011, 0x850a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) {0x0032, 0x850b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) {0x0010, 0x850c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) {0x0021, 0x850d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) {0x0001, 0x8500},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) {0x0000, 0x8508},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) {0x0012, 0x8608},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) {0x002c, 0x8609},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) {0x0002, 0x860a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) {0x0039, 0x860b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) {0x00d0, 0x860c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) {0x00f7, 0x860d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) {0x00ed, 0x860e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) {0x00db, 0x860f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) {0x0039, 0x8610},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) {0x0012, 0x8657},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) {0x0064, 0x8619},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) /* This line starts it all, it is not needed here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) /* since it has been build into the driver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) /* jfm: don't start now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) /* {0x0030, 0x8112}, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) * Initialization data for Creative Webcam Vista
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) static const u16 spca508_vista_init_data[][2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) {0x0008, 0x8200}, /* Clear register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) {0x0000, 0x870b}, /* Reset CTL3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) {0x0020, 0x8112}, /* Video Drop packet enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) {0x0003, 0x8111}, /* Soft Reset compression, memory, TG & CDSP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) {0x0000, 0x8110}, /* Disable everything */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) {0x0000, 0x8114}, /* Software GPIO output data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) {0x0000, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) {0x0003, 0x8111},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) {0x0000, 0x8111},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) {0x0090, 0x8110}, /* Enable: SSI output, External 2X clock output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) {0x0020, 0x8112},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) {0x0000, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) {0x0001, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) {0x0001, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) {0x0001, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) {0x0003, 0x8114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) {0x000f, 0x8402}, /* Memory bank Address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) {0x0000, 0x8403}, /* Memory bank Address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) {0x00ba, 0x8804}, /* SSI Slave address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) {0x0010, 0x8802}, /* 93.75kHz SSI Clock Two DataByte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) /* READ { 0x0001, 0x8802 } -> 0000: 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) {0x0010, 0x8802}, /* Will write 2 bytes (DATA1+DATA2) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) {0x0020, 0x8801}, /* Register address for SSI read/write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) {0x0044, 0x8805}, /* DATA2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) {0x0004, 0x8800}, /* DATA1 -> write triggered */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) /* READ { 0x0001, 0x8802 } -> 0000: 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) {0x0009, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) {0x0042, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) {0x0001, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) /* READ { 0x0001, 0x8802 } -> 0000: 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) {0x003c, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) {0x0001, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) /* READ { 0x0001, 0x8802 } -> 0000: 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) {0x0001, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) {0x000a, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) /* READ { 0x0001, 0x8802 } -> 0000: 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) {0x0002, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) {0x0000, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) /* READ { 0x0001, 0x8802 } -> 0000: 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) {0x0003, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) {0x0027, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) {0x0001, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) /* READ { 0x0001, 0x8802 } -> 0000: 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) {0x0004, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) {0x0065, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) {0x0001, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) /* READ { 0x0001, 0x8802 } -> 0000: 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) {0x0005, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) {0x0003, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) /* READ { 0x0001, 0x8802 } -> 0000: 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) {0x0006, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) {0x001c, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) /* READ { 0x0001, 0x8802 } -> 0000: 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) {0x0007, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) {0x002a, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) /* READ { 0x0001, 0x8802 } -> 0000: 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) {0x000e, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) {0x0000, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) /* READ { 0x0001, 0x8802 } -> 0000: 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) {0x0028, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) {0x002e, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) /* READ { 0x0001, 0x8802 } -> 0000: 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) {0x0039, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) {0x0013, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) /* READ { 0x0001, 0x8802 } -> 0000: 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) {0x003b, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) {0x000c, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) /* READ { 0x0001, 0x8802 } -> 0000: 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) {0x0035, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) {0x0028, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) {0x0000, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) /* READ { 0x0001, 0x8802 } -> 0000: 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) {0x0010, 0x8802},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) {0x0009, 0x8801},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) {0x0042, 0x8805},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) {0x0001, 0x8800},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) /* READ { 0x0001, 0x8803 } -> 0000: 00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) {0x0050, 0x8703},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) {0x0002, 0x8704}, /* External input CKIx1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) {0x0001, 0x870c}, /* Select CKOx2 output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) {0x009a, 0x8600}, /* Line memory Read Counter (L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) {0x0001, 0x8606}, /* 1 Line memory Read Counter (H) Result: (d)410 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) {0x0023, 0x8601},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) {0x0010, 0x8602},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) {0x000a, 0x8603},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) {0x009a, 0x8600},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) {0x0001, 0x865b}, /* 1 Horizontal Offset for Valid Pixel(L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) {0x0003, 0x865c}, /* Vertical offset for valid lines (L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) {0x0058, 0x865d}, /* Horizontal valid pixels window (L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) {0x0048, 0x865e}, /* Vertical valid lines window (L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) {0x0000, 0x865f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) {0x0006, 0x8660},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) /* Enable nibble data input, select nibble input order */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) {0x0013, 0x8608}, /* A11 Coeficients for color correction */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) {0x0028, 0x8609},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) /* Note: these values are confirmed at the end of array */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) {0x0005, 0x860a}, /* ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) {0x0025, 0x860b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) {0x00e1, 0x860c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) {0x00fa, 0x860d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) {0x00f4, 0x860e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) {0x00e8, 0x860f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) {0x0025, 0x8610}, /* A33 Coef. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) {0x00fc, 0x8611}, /* White balance offset: R */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) {0x0001, 0x8612}, /* White balance offset: Gr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) {0x00fe, 0x8613}, /* White balance offset: B */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) {0x0000, 0x8614}, /* White balance offset: Gb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) {0x0064, 0x8651}, /* R gain for white balance (L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) {0x0040, 0x8652}, /* Gr gain for white balance (L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) {0x0066, 0x8653}, /* B gain for white balance (L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) {0x0040, 0x8654}, /* Gb gain for white balance (L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) {0x0001, 0x863f}, /* Enable fixed gamma correction */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) {0x00a1, 0x8656}, /* Size - Window1: 256x256, Window2: 128x128,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) * UV division: UV no change,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) * Enable New edge enhancement */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) {0x0018, 0x8657}, /* Edge gain high threshold */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) {0x0020, 0x8658}, /* Edge gain low threshold */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) {0x000a, 0x8659}, /* Edge bandwidth high threshold */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) {0x0005, 0x865a}, /* Edge bandwidth low threshold */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) {0x0064, 0x8607}, /* UV filter enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) {0x0016, 0x8660},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) {0x0000, 0x86b0}, /* Bad pixels compensation address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) {0x00dc, 0x86b1}, /* X coord for bad pixels compensation (L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) {0x0000, 0x86b2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) {0x0009, 0x86b3}, /* Y coord for bad pixels compensation (L) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) {0x0000, 0x86b4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) {0x0001, 0x86b0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) {0x00f5, 0x86b1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) {0x0000, 0x86b2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) {0x00c6, 0x86b3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) {0x0000, 0x86b4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) {0x0002, 0x86b0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) {0x001c, 0x86b1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) {0x0001, 0x86b2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) {0x00d7, 0x86b3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) {0x0000, 0x86b4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) {0x0003, 0x86b0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) {0x001c, 0x86b1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) {0x0001, 0x86b2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) {0x00d8, 0x86b3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) {0x0000, 0x86b4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) {0x0004, 0x86b0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) {0x001d, 0x86b1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) {0x0001, 0x86b2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) {0x00d8, 0x86b3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) {0x0000, 0x86b4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) {0x001e, 0x8660},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) /* READ { 0x0000, 0x8608 } -> 0000: 13 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) /* READ { 0x0000, 0x8609 } -> 0000: 28 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) /* READ { 0x0000, 0x8610 } -> 0000: 05 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) /* READ { 0x0000, 0x8611 } -> 0000: 25 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) /* READ { 0x0000, 0x8612 } -> 0000: e1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) /* READ { 0x0000, 0x8613 } -> 0000: fa */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) /* READ { 0x0000, 0x8614 } -> 0000: f4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) /* READ { 0x0000, 0x8615 } -> 0000: e8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) /* READ { 0x0000, 0x8616 } -> 0000: 25 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) static int reg_write(struct gspca_dev *gspca_dev, u16 index, u16 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) struct usb_device *dev = gspca_dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) ret = usb_control_msg(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) usb_sndctrlpipe(dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) 0, /* request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) USB_TYPE_VENDOR | USB_RECIP_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) value, index, NULL, 0, 500);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) gspca_dbg(gspca_dev, D_USBO, "reg write i:0x%04x = 0x%02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) index, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) pr_err("reg write: error %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) /* read 1 byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) /* returns: negative is error, pos or zero is data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) static int reg_read(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) u16 index) /* wIndex */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) ret = usb_control_msg(gspca_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) usb_rcvctrlpipe(gspca_dev->dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) 0, /* register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) 0, /* value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) gspca_dev->usb_buf, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) 500); /* timeout */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) gspca_dbg(gspca_dev, D_USBI, "reg read i:%04x --> %02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) index, gspca_dev->usb_buf[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) pr_err("reg_read err %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) return gspca_dev->usb_buf[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) /* send 1 or 2 bytes to the sensor via the Synchronous Serial Interface */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) static int ssi_w(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) u16 reg, u16 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) int ret, retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) ret = reg_write(gspca_dev, 0x8802, reg >> 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) ret = reg_write(gspca_dev, 0x8801, reg & 0x00ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) if ((reg & 0xff00) == 0x1000) { /* if 2 bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) ret = reg_write(gspca_dev, 0x8805, val & 0x00ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) val >>= 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) ret = reg_write(gspca_dev, 0x8800, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) /* poll until not busy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) retry = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) for (;;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) ret = reg_read(gspca_dev, 0x8803);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) if (gspca_dev->usb_buf[0] == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) if (--retry <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) gspca_err(gspca_dev, "ssi_w busy %02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) gspca_dev->usb_buf[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) msleep(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) static int write_vector(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) const u16 (*data)[2])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) while ((*data)[1] != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) if ((*data)[1] & 0x8000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) if ((*data)[1] == 0xdd00) /* delay */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) msleep((*data)[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) ret = reg_write(gspca_dev, (*data)[1],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) (*data)[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) ret = ssi_w(gspca_dev, (*data)[1], (*data)[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) /* this function is called at probe time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) static int sd_config(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) struct cam *cam;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) const u16 (*init_data)[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) static const u16 (*(init_data_tb[]))[2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) spca508_vista_init_data, /* CreativeVista 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) spca508_sightcam_init_data, /* HamaUSBSightcam 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) spca508_sightcam2_init_data, /* HamaUSBSightcam2 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) spca508cs110_init_data, /* IntelEasyPCCamera 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) spca508cs110_init_data, /* MicroInnovationIC200 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) spca508_init_data, /* ViewQuestVQ110 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) int data1, data2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) /* Read from global register the USB product and vendor IDs, just to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) * prove that we can communicate with the device. This works, which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) * confirms at we are communicating properly and that the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) * is a 508. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) data1 = reg_read(gspca_dev, 0x8104);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) data2 = reg_read(gspca_dev, 0x8105);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) gspca_dbg(gspca_dev, D_PROBE, "Webcam Vendor ID: 0x%02x%02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) data2, data1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) data1 = reg_read(gspca_dev, 0x8106);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) data2 = reg_read(gspca_dev, 0x8107);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) gspca_dbg(gspca_dev, D_PROBE, "Webcam Product ID: 0x%02x%02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) data2, data1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) data1 = reg_read(gspca_dev, 0x8621);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) gspca_dbg(gspca_dev, D_PROBE, "Window 1 average luminance: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) data1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) cam = &gspca_dev->cam;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) cam->cam_mode = sif_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) cam->nmodes = ARRAY_SIZE(sif_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) sd->subtype = id->driver_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) init_data = init_data_tb[sd->subtype];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) return write_vector(gspca_dev, init_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) /* this function is called at probe and resume time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) static int sd_init(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) static int sd_start(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) int mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) mode = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) reg_write(gspca_dev, 0x8500, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) switch (mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) reg_write(gspca_dev, 0x8700, 0x28); /* clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) /* case 2: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) /* case 3: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) reg_write(gspca_dev, 0x8700, 0x23); /* clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) reg_write(gspca_dev, 0x8112, 0x10 | 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) static void sd_stopN(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) /* Video ISO disable, Video Drop Packet enable: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) reg_write(gspca_dev, 0x8112, 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) static void sd_pkt_scan(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) u8 *data, /* isoc packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) int len) /* iso packet length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) switch (data[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) case 0: /* start of frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) data += SPCA508_OFFSET_DATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) len -= SPCA508_OFFSET_DATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) gspca_frame_add(gspca_dev, FIRST_PACKET, data, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) case 0xff: /* drop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) data += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) len -= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) static void setbrightness(struct gspca_dev *gspca_dev, s32 brightness)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) /* MX seem contrast */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) reg_write(gspca_dev, 0x8651, brightness);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) reg_write(gspca_dev, 0x8652, brightness);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) reg_write(gspca_dev, 0x8653, brightness);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) reg_write(gspca_dev, 0x8654, brightness);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) struct gspca_dev *gspca_dev =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) if (!gspca_dev->streaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) switch (ctrl->id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) case V4L2_CID_BRIGHTNESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) setbrightness(gspca_dev, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) return gspca_dev->usb_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) static const struct v4l2_ctrl_ops sd_ctrl_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) .s_ctrl = sd_s_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) static int sd_init_controls(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) gspca_dev->vdev.ctrl_handler = hdl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) v4l2_ctrl_handler_init(hdl, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) V4L2_CID_BRIGHTNESS, 0, 255, 1, 128);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) if (hdl->error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) pr_err("Could not initialize controls\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) return hdl->error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) /* sub-driver description */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) static const struct sd_desc sd_desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) .name = MODULE_NAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) .config = sd_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) .init = sd_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) .init_controls = sd_init_controls,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) .start = sd_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) .stopN = sd_stopN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) .pkt_scan = sd_pkt_scan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) /* -- module initialisation -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) static const struct usb_device_id device_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) {USB_DEVICE(0x0130, 0x0130), .driver_info = HamaUSBSightcam},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) {USB_DEVICE(0x041e, 0x4018), .driver_info = CreativeVista},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) {USB_DEVICE(0x0733, 0x0110), .driver_info = ViewQuestVQ110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) {USB_DEVICE(0x0af9, 0x0010), .driver_info = HamaUSBSightcam},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) {USB_DEVICE(0x0af9, 0x0011), .driver_info = HamaUSBSightcam2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) {USB_DEVICE(0x8086, 0x0110), .driver_info = IntelEasyPCCamera},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) MODULE_DEVICE_TABLE(usb, device_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) /* -- device connect -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) static int sd_probe(struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) THIS_MODULE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) static struct usb_driver sd_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) .name = MODULE_NAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) .id_table = device_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) .probe = sd_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) .disconnect = gspca_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) .suspend = gspca_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) .resume = gspca_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) .reset_resume = gspca_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) module_usb_driver(sd_driver);