^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) * Sonix sn9c201 sn9c202 library
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2012 Jean-Francois Moine <http://moinejf.free.fr>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2008-2009 microdia project <microdia@googlegroups.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (C) 2009 Brian Johnson <brijohn@gmail.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/input.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include "gspca.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include "jpeg.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/dmi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) MODULE_AUTHOR("Brian Johnson <brijohn@gmail.com>, microdia project <microdia@googlegroups.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) MODULE_DESCRIPTION("GSPCA/SN9C20X USB Camera Driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * Pixel format private data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define SCALE_MASK 0x0f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define SCALE_160x120 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define SCALE_320x240 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define SCALE_640x480 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define SCALE_1280x1024 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define MODE_RAW 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define MODE_JPEG 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define MODE_SXGA 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define SENSOR_OV9650 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define SENSOR_OV9655 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define SENSOR_SOI968 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define SENSOR_OV7660 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define SENSOR_OV7670 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define SENSOR_MT9V011 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define SENSOR_MT9V111 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define SENSOR_MT9V112 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define SENSOR_MT9M001 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define SENSOR_MT9M111 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define SENSOR_MT9M112 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define SENSOR_HV7131R 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define SENSOR_MT9VPRB 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) /* camera flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define HAS_NO_BUTTON 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define LED_REVERSE 0x2 /* some cameras unset gpio to turn on leds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define FLIP_DETECT 0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) /* specific webcam descriptor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) struct sd {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct gspca_dev gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct { /* color control cluster */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct v4l2_ctrl *brightness;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) struct v4l2_ctrl *contrast;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) struct v4l2_ctrl *saturation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) struct v4l2_ctrl *hue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct { /* blue/red balance control cluster */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) struct v4l2_ctrl *blue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct v4l2_ctrl *red;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) struct { /* h/vflip control cluster */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) struct v4l2_ctrl *hflip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) struct v4l2_ctrl *vflip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) struct v4l2_ctrl *gamma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) struct { /* autogain and exposure or gain control cluster */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) struct v4l2_ctrl *autogain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) struct v4l2_ctrl *exposure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) struct v4l2_ctrl *gain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) struct v4l2_ctrl *jpegqual;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) struct work_struct work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) u32 pktsz; /* (used by pkt_scan) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) u16 npkt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) s8 nchg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) u8 fmt; /* (used for JPEG QTAB update */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define MIN_AVG_LUM 80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define MAX_AVG_LUM 130
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) atomic_t avg_lum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) u8 old_step;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) u8 older_step;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) u8 exposure_step;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) u8 i2c_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) u8 i2c_intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) u8 sensor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) u8 hstart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) u8 vstart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) u8 jpeg_hdr[JPEG_HDR_SZ];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) u8 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) static void qual_upd(struct work_struct *work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) struct i2c_reg_u8 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) u8 reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) struct i2c_reg_u16 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) u8 reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) u16 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) static const struct dmi_system_id flip_dmi_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) .ident = "MSI MS-1034",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) DMI_MATCH(DMI_SYS_VENDOR, "MICRO-STAR INT'L CO.,LTD."),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) DMI_MATCH(DMI_PRODUCT_NAME, "MS-1034"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) DMI_MATCH(DMI_PRODUCT_VERSION, "0341")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) .ident = "MSI MS-1039",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) DMI_MATCH(DMI_SYS_VENDOR, "MICRO-STAR INT'L CO.,LTD."),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) DMI_MATCH(DMI_PRODUCT_NAME, "MS-1039"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) .ident = "MSI MS-1632",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) DMI_MATCH(DMI_BOARD_VENDOR, "MSI"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) DMI_MATCH(DMI_BOARD_NAME, "MS-1632")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) .ident = "MSI MS-1633X",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) DMI_MATCH(DMI_BOARD_VENDOR, "MSI"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) DMI_MATCH(DMI_BOARD_NAME, "MS-1633X")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) .ident = "MSI MS-1635X",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) DMI_MATCH(DMI_BOARD_VENDOR, "MSI"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) DMI_MATCH(DMI_BOARD_NAME, "MS-1635X")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) .ident = "ASUSTeK W7J",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) DMI_MATCH(DMI_BOARD_NAME, "W7J ")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) static const struct v4l2_pix_format vga_mode[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) {160, 120, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) .bytesperline = 160,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) .sizeimage = 160 * 120 * 4 / 8 + 590,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) .colorspace = V4L2_COLORSPACE_JPEG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) .priv = SCALE_160x120 | MODE_JPEG},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) {160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) .bytesperline = 160,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) .sizeimage = 160 * 120,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) .priv = SCALE_160x120 | MODE_RAW},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) {160, 120, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) .bytesperline = 160,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) .sizeimage = 240 * 120,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) .priv = SCALE_160x120},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) .bytesperline = 320,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) .sizeimage = 320 * 240 * 4 / 8 + 590,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) .colorspace = V4L2_COLORSPACE_JPEG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) .priv = SCALE_320x240 | MODE_JPEG},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) {320, 240, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) .bytesperline = 320,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) .sizeimage = 320 * 240 ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) .priv = SCALE_320x240 | MODE_RAW},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) {320, 240, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) .bytesperline = 320,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) .sizeimage = 480 * 240 ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) .priv = SCALE_320x240},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) {640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) .bytesperline = 640,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) .sizeimage = 640 * 480 * 4 / 8 + 590,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) .colorspace = V4L2_COLORSPACE_JPEG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) .priv = SCALE_640x480 | MODE_JPEG},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) {640, 480, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) .bytesperline = 640,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) .sizeimage = 640 * 480,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) .priv = SCALE_640x480 | MODE_RAW},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) {640, 480, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) .bytesperline = 640,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) .sizeimage = 960 * 480,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) .priv = SCALE_640x480},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) static const struct v4l2_pix_format sxga_mode[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) {160, 120, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) .bytesperline = 160,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) .sizeimage = 160 * 120 * 4 / 8 + 590,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) .colorspace = V4L2_COLORSPACE_JPEG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) .priv = SCALE_160x120 | MODE_JPEG},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) {160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) .bytesperline = 160,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) .sizeimage = 160 * 120,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) .priv = SCALE_160x120 | MODE_RAW},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) {160, 120, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) .bytesperline = 160,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) .sizeimage = 240 * 120,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) .priv = SCALE_160x120},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) .bytesperline = 320,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) .sizeimage = 320 * 240 * 4 / 8 + 590,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) .colorspace = V4L2_COLORSPACE_JPEG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) .priv = SCALE_320x240 | MODE_JPEG},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) {320, 240, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) .bytesperline = 320,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) .sizeimage = 320 * 240 ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) .priv = SCALE_320x240 | MODE_RAW},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) {320, 240, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) .bytesperline = 320,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) .sizeimage = 480 * 240 ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) .priv = SCALE_320x240},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) {640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) .bytesperline = 640,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) .sizeimage = 640 * 480 * 4 / 8 + 590,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) .colorspace = V4L2_COLORSPACE_JPEG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) .priv = SCALE_640x480 | MODE_JPEG},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) {640, 480, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) .bytesperline = 640,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) .sizeimage = 640 * 480,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) .priv = SCALE_640x480 | MODE_RAW},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) {640, 480, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) .bytesperline = 640,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) .sizeimage = 960 * 480,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) .priv = SCALE_640x480},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) {1280, 1024, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) .bytesperline = 1280,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) .sizeimage = 1280 * 1024,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) .priv = SCALE_1280x1024 | MODE_RAW | MODE_SXGA},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) static const struct v4l2_pix_format mono_mode[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) {160, 120, V4L2_PIX_FMT_GREY, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) .bytesperline = 160,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) .sizeimage = 160 * 120,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) .priv = SCALE_160x120 | MODE_RAW},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) {320, 240, V4L2_PIX_FMT_GREY, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) .bytesperline = 320,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) .sizeimage = 320 * 240 ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) .priv = SCALE_320x240 | MODE_RAW},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) {640, 480, V4L2_PIX_FMT_GREY, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) .bytesperline = 640,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) .sizeimage = 640 * 480,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) .priv = SCALE_640x480 | MODE_RAW},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) {1280, 1024, V4L2_PIX_FMT_GREY, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) .bytesperline = 1280,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) .sizeimage = 1280 * 1024,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) .colorspace = V4L2_COLORSPACE_SRGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) .priv = SCALE_1280x1024 | MODE_RAW | MODE_SXGA},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) static const s16 hsv_red_x[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 41, 44, 46, 48, 50, 52, 54, 56,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 58, 60, 62, 64, 66, 68, 70, 72,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 74, 76, 78, 80, 81, 83, 85, 87,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 88, 90, 92, 93, 95, 97, 98, 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 101, 102, 104, 105, 107, 108, 109, 110,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 112, 113, 114, 115, 116, 117, 118, 119,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 120, 121, 122, 123, 123, 124, 125, 125,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 126, 127, 127, 128, 128, 129, 129, 129,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 130, 130, 130, 130, 131, 131, 131, 131,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 131, 131, 131, 131, 130, 130, 130, 130,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 129, 129, 129, 128, 128, 127, 127, 126,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 125, 125, 124, 123, 122, 122, 121, 120,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 119, 118, 117, 116, 115, 114, 112, 111,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 110, 109, 107, 106, 105, 103, 102, 101,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 99, 98, 96, 94, 93, 91, 90, 88,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 86, 84, 83, 81, 79, 77, 75, 74,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 72, 70, 68, 66, 64, 62, 60, 58,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 56, 54, 52, 49, 47, 45, 43, 41,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 39, 36, 34, 32, 30, 28, 25, 23,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 21, 19, 16, 14, 12, 9, 7, 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 3, 0, -1, -3, -6, -8, -10, -12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) -15, -17, -19, -22, -24, -26, -28, -30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) -33, -35, -37, -39, -41, -44, -46, -48,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) -50, -52, -54, -56, -58, -60, -62, -64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) -66, -68, -70, -72, -74, -76, -78, -80,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) -81, -83, -85, -87, -88, -90, -92, -93,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) -95, -97, -98, -100, -101, -102, -104, -105,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) -107, -108, -109, -110, -112, -113, -114, -115,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) -116, -117, -118, -119, -120, -121, -122, -123,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) -123, -124, -125, -125, -126, -127, -127, -128,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) -128, -128, -128, -128, -128, -128, -128, -128,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) -128, -128, -128, -128, -128, -128, -128, -128,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) -128, -128, -128, -128, -128, -128, -128, -128,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) -128, -127, -127, -126, -125, -125, -124, -123,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) -122, -122, -121, -120, -119, -118, -117, -116,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) -115, -114, -112, -111, -110, -109, -107, -106,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) -105, -103, -102, -101, -99, -98, -96, -94,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) -93, -91, -90, -88, -86, -84, -83, -81,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) -79, -77, -75, -74, -72, -70, -68, -66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) -64, -62, -60, -58, -56, -54, -52, -49,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) -47, -45, -43, -41, -39, -36, -34, -32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) -30, -28, -25, -23, -21, -19, -16, -14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) -12, -9, -7, -5, -3, 0, 1, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 6, 8, 10, 12, 15, 17, 19, 22,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 24, 26, 28, 30, 33, 35, 37, 39, 41
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) static const s16 hsv_red_y[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 82, 80, 78, 76, 74, 73, 71, 69,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 67, 65, 63, 61, 58, 56, 54, 52,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 50, 48, 46, 44, 41, 39, 37, 35,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 32, 30, 28, 26, 23, 21, 19, 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 14, 12, 10, 7, 5, 3, 0, -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) -3, -6, -8, -10, -13, -15, -17, -19,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) -22, -24, -26, -29, -31, -33, -35, -38,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) -40, -42, -44, -46, -48, -51, -53, -55,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) -57, -59, -61, -63, -65, -67, -69, -71,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) -73, -75, -77, -79, -81, -82, -84, -86,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) -88, -89, -91, -93, -94, -96, -98, -99,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) -101, -102, -104, -105, -106, -108, -109, -110,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) -112, -113, -114, -115, -116, -117, -119, -120,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) -120, -121, -122, -123, -124, -125, -126, -126,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) -127, -128, -128, -128, -128, -128, -128, -128,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) -128, -128, -128, -128, -128, -128, -128, -128,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) -128, -128, -128, -128, -128, -128, -128, -128,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) -128, -128, -128, -128, -128, -128, -128, -128,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) -127, -127, -126, -125, -125, -124, -123, -122,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) -121, -120, -119, -118, -117, -116, -115, -114,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) -113, -111, -110, -109, -107, -106, -105, -103,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) -102, -100, -99, -97, -96, -94, -92, -91,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) -89, -87, -85, -84, -82, -80, -78, -76,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) -74, -73, -71, -69, -67, -65, -63, -61,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) -58, -56, -54, -52, -50, -48, -46, -44,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) -41, -39, -37, -35, -32, -30, -28, -26,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) -23, -21, -19, -16, -14, -12, -10, -7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) -5, -3, 0, 1, 3, 6, 8, 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 13, 15, 17, 19, 22, 24, 26, 29,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 31, 33, 35, 38, 40, 42, 44, 46,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 48, 51, 53, 55, 57, 59, 61, 63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 65, 67, 69, 71, 73, 75, 77, 79,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 81, 82, 84, 86, 88, 89, 91, 93,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 94, 96, 98, 99, 101, 102, 104, 105,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 106, 108, 109, 110, 112, 113, 114, 115,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 116, 117, 119, 120, 120, 121, 122, 123,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 124, 125, 126, 126, 127, 128, 128, 129,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 129, 130, 130, 131, 131, 131, 131, 132,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 132, 132, 132, 132, 132, 132, 132, 132,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 132, 132, 132, 131, 131, 131, 130, 130,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 130, 129, 129, 128, 127, 127, 126, 125,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 125, 124, 123, 122, 121, 120, 119, 118,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 117, 116, 115, 114, 113, 111, 110, 109,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 107, 106, 105, 103, 102, 100, 99, 97,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 96, 94, 92, 91, 89, 87, 85, 84, 82
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) static const s16 hsv_green_x[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) -124, -124, -125, -125, -125, -125, -125, -125,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) -125, -126, -126, -125, -125, -125, -125, -125,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) -125, -124, -124, -124, -123, -123, -122, -122,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) -121, -121, -120, -120, -119, -118, -117, -117,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) -116, -115, -114, -113, -112, -111, -110, -109,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) -108, -107, -105, -104, -103, -102, -100, -99,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) -98, -96, -95, -93, -92, -91, -89, -87,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) -86, -84, -83, -81, -79, -77, -76, -74,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) -72, -70, -69, -67, -65, -63, -61, -59,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) -57, -55, -53, -51, -49, -47, -45, -43,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) -41, -39, -37, -35, -33, -30, -28, -26,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) -24, -22, -20, -18, -15, -13, -11, -9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) -7, -4, -2, 0, 1, 3, 6, 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 10, 12, 14, 17, 19, 21, 23, 25,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 27, 29, 32, 34, 36, 38, 40, 42,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 44, 46, 48, 50, 52, 54, 56, 58,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 60, 62, 64, 66, 68, 70, 71, 73,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 75, 77, 78, 80, 82, 83, 85, 87,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 88, 90, 91, 93, 94, 96, 97, 98,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 100, 101, 102, 104, 105, 106, 107, 108,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 109, 111, 112, 113, 113, 114, 115, 116,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 117, 118, 118, 119, 120, 120, 121, 122,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 122, 123, 123, 124, 124, 124, 125, 125,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 125, 125, 125, 125, 125, 126, 126, 125,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 125, 125, 125, 125, 125, 124, 124, 124,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 123, 123, 122, 122, 121, 121, 120, 120,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 119, 118, 117, 117, 116, 115, 114, 113,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 112, 111, 110, 109, 108, 107, 105, 104,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 103, 102, 100, 99, 98, 96, 95, 93,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 92, 91, 89, 87, 86, 84, 83, 81,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 79, 77, 76, 74, 72, 70, 69, 67,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 65, 63, 61, 59, 57, 55, 53, 51,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 49, 47, 45, 43, 41, 39, 37, 35,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 33, 30, 28, 26, 24, 22, 20, 18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 15, 13, 11, 9, 7, 4, 2, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) -1, -3, -6, -8, -10, -12, -14, -17,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) -19, -21, -23, -25, -27, -29, -32, -34,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) -36, -38, -40, -42, -44, -46, -48, -50,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) -52, -54, -56, -58, -60, -62, -64, -66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) -68, -70, -71, -73, -75, -77, -78, -80,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) -82, -83, -85, -87, -88, -90, -91, -93,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) -94, -96, -97, -98, -100, -101, -102, -104,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) -105, -106, -107, -108, -109, -111, -112, -113,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) -113, -114, -115, -116, -117, -118, -118, -119,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) -120, -120, -121, -122, -122, -123, -123, -124, -124
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) static const s16 hsv_green_y[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) -100, -99, -98, -97, -95, -94, -93, -91,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) -90, -89, -87, -86, -84, -83, -81, -80,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) -78, -76, -75, -73, -71, -70, -68, -66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) -64, -63, -61, -59, -57, -55, -53, -51,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) -49, -48, -46, -44, -42, -40, -38, -36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) -34, -32, -30, -27, -25, -23, -21, -19,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) -17, -15, -13, -11, -9, -7, -4, -2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 0, 1, 3, 5, 7, 9, 11, 14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 16, 18, 20, 22, 24, 26, 28, 30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 32, 34, 36, 38, 40, 42, 44, 46,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 48, 50, 52, 54, 56, 58, 59, 61,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 63, 65, 67, 68, 70, 72, 74, 75,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 77, 78, 80, 82, 83, 85, 86, 88,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 89, 90, 92, 93, 95, 96, 97, 98,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 100, 101, 102, 103, 104, 105, 106, 107,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 108, 109, 110, 111, 112, 112, 113, 114,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 115, 115, 116, 116, 117, 117, 118, 118,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 119, 119, 119, 120, 120, 120, 120, 120,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 121, 121, 121, 121, 121, 121, 120, 120,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 120, 120, 120, 119, 119, 119, 118, 118,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 117, 117, 116, 116, 115, 114, 114, 113,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 112, 111, 111, 110, 109, 108, 107, 106,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 105, 104, 103, 102, 100, 99, 98, 97,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 95, 94, 93, 91, 90, 89, 87, 86,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 84, 83, 81, 80, 78, 76, 75, 73,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 71, 70, 68, 66, 64, 63, 61, 59,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 57, 55, 53, 51, 49, 48, 46, 44,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 42, 40, 38, 36, 34, 32, 30, 27,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 25, 23, 21, 19, 17, 15, 13, 11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 9, 7, 4, 2, 0, -1, -3, -5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) -7, -9, -11, -14, -16, -18, -20, -22,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) -24, -26, -28, -30, -32, -34, -36, -38,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) -40, -42, -44, -46, -48, -50, -52, -54,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) -56, -58, -59, -61, -63, -65, -67, -68,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) -70, -72, -74, -75, -77, -78, -80, -82,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) -83, -85, -86, -88, -89, -90, -92, -93,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) -95, -96, -97, -98, -100, -101, -102, -103,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) -104, -105, -106, -107, -108, -109, -110, -111,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) -112, -112, -113, -114, -115, -115, -116, -116,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) -117, -117, -118, -118, -119, -119, -119, -120,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) -120, -120, -120, -120, -121, -121, -121, -121,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) -121, -121, -120, -120, -120, -120, -120, -119,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) -119, -119, -118, -118, -117, -117, -116, -116,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) -115, -114, -114, -113, -112, -111, -111, -110,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) -109, -108, -107, -106, -105, -104, -103, -102, -100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) static const s16 hsv_blue_x[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 112, 113, 114, 114, 115, 116, 117, 117,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 118, 118, 119, 119, 120, 120, 120, 121,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 121, 121, 122, 122, 122, 122, 122, 122,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) 122, 122, 122, 122, 122, 122, 121, 121,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) 121, 120, 120, 120, 119, 119, 118, 118,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 117, 116, 116, 115, 114, 113, 113, 112,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 111, 110, 109, 108, 107, 106, 105, 104,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 103, 102, 100, 99, 98, 97, 95, 94,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 93, 91, 90, 88, 87, 85, 84, 82,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 80, 79, 77, 76, 74, 72, 70, 69,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 67, 65, 63, 61, 60, 58, 56, 54,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) 52, 50, 48, 46, 44, 42, 40, 38,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 36, 34, 32, 30, 28, 26, 24, 22,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 19, 17, 15, 13, 11, 9, 7, 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 2, 0, -1, -3, -5, -7, -9, -12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) -14, -16, -18, -20, -22, -24, -26, -28,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) -31, -33, -35, -37, -39, -41, -43, -45,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) -47, -49, -51, -53, -54, -56, -58, -60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) -62, -64, -66, -67, -69, -71, -73, -74,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) -76, -78, -79, -81, -83, -84, -86, -87,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) -89, -90, -92, -93, -94, -96, -97, -98,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) -99, -101, -102, -103, -104, -105, -106, -107,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) -108, -109, -110, -111, -112, -113, -114, -114,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) -115, -116, -117, -117, -118, -118, -119, -119,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) -120, -120, -120, -121, -121, -121, -122, -122,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) -122, -122, -122, -122, -122, -122, -122, -122,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) -122, -122, -121, -121, -121, -120, -120, -120,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) -119, -119, -118, -118, -117, -116, -116, -115,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) -114, -113, -113, -112, -111, -110, -109, -108,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) -107, -106, -105, -104, -103, -102, -100, -99,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) -98, -97, -95, -94, -93, -91, -90, -88,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) -87, -85, -84, -82, -80, -79, -77, -76,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) -74, -72, -70, -69, -67, -65, -63, -61,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) -60, -58, -56, -54, -52, -50, -48, -46,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) -44, -42, -40, -38, -36, -34, -32, -30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) -28, -26, -24, -22, -19, -17, -15, -13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) -11, -9, -7, -5, -2, 0, 1, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) 5, 7, 9, 12, 14, 16, 18, 20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) 22, 24, 26, 28, 31, 33, 35, 37,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) 39, 41, 43, 45, 47, 49, 51, 53,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) 54, 56, 58, 60, 62, 64, 66, 67,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) 69, 71, 73, 74, 76, 78, 79, 81,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) 83, 84, 86, 87, 89, 90, 92, 93,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) 94, 96, 97, 98, 99, 101, 102, 103,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) 104, 105, 106, 107, 108, 109, 110, 111, 112
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) static const s16 hsv_blue_y[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) -11, -13, -15, -17, -19, -21, -23, -25,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) -27, -29, -31, -33, -35, -37, -39, -41,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) -43, -45, -46, -48, -50, -52, -54, -55,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) -57, -59, -61, -62, -64, -66, -67, -69,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) -71, -72, -74, -75, -77, -78, -80, -81,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) -83, -84, -86, -87, -88, -90, -91, -92,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) -93, -95, -96, -97, -98, -99, -100, -101,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) -102, -103, -104, -105, -106, -106, -107, -108,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) -109, -109, -110, -111, -111, -112, -112, -113,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) -113, -114, -114, -114, -115, -115, -115, -115,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) -116, -116, -116, -116, -116, -116, -116, -116,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) -116, -115, -115, -115, -115, -114, -114, -114,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) -113, -113, -112, -112, -111, -111, -110, -110,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) -109, -108, -108, -107, -106, -105, -104, -103,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) -102, -101, -100, -99, -98, -97, -96, -95,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) -94, -93, -91, -90, -89, -88, -86, -85,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) -84, -82, -81, -79, -78, -76, -75, -73,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) -71, -70, -68, -67, -65, -63, -62, -60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) -58, -56, -55, -53, -51, -49, -47, -45,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) -44, -42, -40, -38, -36, -34, -32, -30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) -28, -26, -24, -22, -20, -18, -16, -14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) -12, -10, -8, -6, -4, -2, 0, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 3, 5, 7, 9, 11, 13, 15, 17,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 19, 21, 23, 25, 27, 29, 31, 33,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 35, 37, 39, 41, 43, 45, 46, 48,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) 50, 52, 54, 55, 57, 59, 61, 62,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) 64, 66, 67, 69, 71, 72, 74, 75,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) 77, 78, 80, 81, 83, 84, 86, 87,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 88, 90, 91, 92, 93, 95, 96, 97,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) 98, 99, 100, 101, 102, 103, 104, 105,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 106, 106, 107, 108, 109, 109, 110, 111,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 111, 112, 112, 113, 113, 114, 114, 114,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) 115, 115, 115, 115, 116, 116, 116, 116,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 116, 116, 116, 116, 116, 115, 115, 115,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) 115, 114, 114, 114, 113, 113, 112, 112,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) 111, 111, 110, 110, 109, 108, 108, 107,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) 106, 105, 104, 103, 102, 101, 100, 99,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) 98, 97, 96, 95, 94, 93, 91, 90,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) 89, 88, 86, 85, 84, 82, 81, 79,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) 78, 76, 75, 73, 71, 70, 68, 67,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) 65, 63, 62, 60, 58, 56, 55, 53,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) 51, 49, 47, 45, 44, 42, 40, 38,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) 36, 34, 32, 30, 28, 26, 24, 22,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) 20, 18, 16, 14, 12, 10, 8, 6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) 4, 2, 0, -1, -3, -5, -7, -9, -11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) static const u16 bridge_init[][2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) {0x1000, 0x78}, {0x1001, 0x40}, {0x1002, 0x1c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) {0x1020, 0x80}, {0x1061, 0x01}, {0x1067, 0x40},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) {0x1068, 0x30}, {0x1069, 0x20}, {0x106a, 0x10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) {0x106b, 0x08}, {0x1188, 0x87}, {0x11a1, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) {0x11a2, 0x00}, {0x11a3, 0x6a}, {0x11a4, 0x50},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) {0x11ab, 0x00}, {0x11ac, 0x00}, {0x11ad, 0x50},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) {0x11ae, 0x3c}, {0x118a, 0x04}, {0x0395, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) {0x11b8, 0x3a}, {0x118b, 0x0e}, {0x10f7, 0x05},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) {0x10f8, 0x14}, {0x10fa, 0xff}, {0x10f9, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) {0x11ba, 0x0a}, {0x11a5, 0x2d}, {0x11a6, 0x2d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) {0x11a7, 0x3a}, {0x11a8, 0x05}, {0x11a9, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) {0x11aa, 0x3f}, {0x11af, 0x28}, {0x11b0, 0xd8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) {0x11b1, 0x14}, {0x11b2, 0xec}, {0x11b3, 0x32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) {0x11b4, 0xdd}, {0x11b5, 0x32}, {0x11b6, 0xdd},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) {0x10e0, 0x2c}, {0x11bc, 0x40}, {0x11bd, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) {0x11be, 0xf0}, {0x11bf, 0x00}, {0x118c, 0x1f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) {0x118d, 0x1f}, {0x118e, 0x1f}, {0x118f, 0x1f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) {0x1180, 0x01}, {0x1181, 0x00}, {0x1182, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) {0x1183, 0x00}, {0x1184, 0x50}, {0x1185, 0x80},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) {0x1007, 0x00}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) /* Gain = (bit[3:0] / 16 + 1) * (bit[4] + 1) * (bit[5] + 1) * (bit[6] + 1) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) static const u8 ov_gain[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) 0x00 /* 1x */, 0x04 /* 1.25x */, 0x08 /* 1.5x */, 0x0c /* 1.75x */,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) 0x10 /* 2x */, 0x12 /* 2.25x */, 0x14 /* 2.5x */, 0x16 /* 2.75x */,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) 0x18 /* 3x */, 0x1a /* 3.25x */, 0x1c /* 3.5x */, 0x1e /* 3.75x */,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) 0x30 /* 4x */, 0x31 /* 4.25x */, 0x32 /* 4.5x */, 0x33 /* 4.75x */,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) 0x34 /* 5x */, 0x35 /* 5.25x */, 0x36 /* 5.5x */, 0x37 /* 5.75x */,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) 0x38 /* 6x */, 0x39 /* 6.25x */, 0x3a /* 6.5x */, 0x3b /* 6.75x */,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) 0x3c /* 7x */, 0x3d /* 7.25x */, 0x3e /* 7.5x */, 0x3f /* 7.75x */,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) 0x70 /* 8x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) /* Gain = (bit[8] + 1) * (bit[7] + 1) * (bit[6:0] * 0.03125) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) static const u16 micron1_gain[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) /* 1x 1.25x 1.5x 1.75x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) 0x0020, 0x0028, 0x0030, 0x0038,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) /* 2x 2.25x 2.5x 2.75x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) 0x00a0, 0x00a4, 0x00a8, 0x00ac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) /* 3x 3.25x 3.5x 3.75x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) 0x00b0, 0x00b4, 0x00b8, 0x00bc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) /* 4x 4.25x 4.5x 4.75x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) 0x00c0, 0x00c4, 0x00c8, 0x00cc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) /* 5x 5.25x 5.5x 5.75x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) 0x00d0, 0x00d4, 0x00d8, 0x00dc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) /* 6x 6.25x 6.5x 6.75x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) 0x00e0, 0x00e4, 0x00e8, 0x00ec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) /* 7x 7.25x 7.5x 7.75x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) 0x00f0, 0x00f4, 0x00f8, 0x00fc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) /* 8x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) 0x01c0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) /* mt9m001 sensor uses a different gain formula then other micron sensors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) /* Gain = (bit[6] + 1) * (bit[5-0] * 0.125) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) static const u16 micron2_gain[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) /* 1x 1.25x 1.5x 1.75x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) 0x0008, 0x000a, 0x000c, 0x000e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) /* 2x 2.25x 2.5x 2.75x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) 0x0010, 0x0012, 0x0014, 0x0016,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) /* 3x 3.25x 3.5x 3.75x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) 0x0018, 0x001a, 0x001c, 0x001e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) /* 4x 4.25x 4.5x 4.75x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) 0x0020, 0x0051, 0x0052, 0x0053,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) /* 5x 5.25x 5.5x 5.75x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) 0x0054, 0x0055, 0x0056, 0x0057,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) /* 6x 6.25x 6.5x 6.75x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) 0x0058, 0x0059, 0x005a, 0x005b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) /* 7x 7.25x 7.5x 7.75x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) 0x005c, 0x005d, 0x005e, 0x005f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) /* 8x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) 0x0060
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) /* Gain = .5 + bit[7:0] / 16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) static const u8 hv7131r_gain[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) 0x08 /* 1x */, 0x0c /* 1.25x */, 0x10 /* 1.5x */, 0x14 /* 1.75x */,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) 0x18 /* 2x */, 0x1c /* 2.25x */, 0x20 /* 2.5x */, 0x24 /* 2.75x */,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) 0x28 /* 3x */, 0x2c /* 3.25x */, 0x30 /* 3.5x */, 0x34 /* 3.75x */,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) 0x38 /* 4x */, 0x3c /* 4.25x */, 0x40 /* 4.5x */, 0x44 /* 4.75x */,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) 0x48 /* 5x */, 0x4c /* 5.25x */, 0x50 /* 5.5x */, 0x54 /* 5.75x */,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) 0x58 /* 6x */, 0x5c /* 6.25x */, 0x60 /* 6.5x */, 0x64 /* 6.75x */,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) 0x68 /* 7x */, 0x6c /* 7.25x */, 0x70 /* 7.5x */, 0x74 /* 7.75x */,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) 0x78 /* 8x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) static const struct i2c_reg_u8 soi968_init[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) {0x0c, 0x00}, {0x0f, 0x1f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) {0x11, 0x80}, {0x38, 0x52}, {0x1e, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) {0x33, 0x08}, {0x35, 0x8c}, {0x36, 0x0c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) {0x37, 0x04}, {0x45, 0x04}, {0x47, 0xff},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) {0x3e, 0x00}, {0x3f, 0x00}, {0x3b, 0x20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) {0x3a, 0x96}, {0x3d, 0x0a}, {0x14, 0x8e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) {0x13, 0x8b}, {0x12, 0x40}, {0x17, 0x13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) {0x18, 0x63}, {0x19, 0x01}, {0x1a, 0x79},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) {0x32, 0x24}, {0x03, 0x00}, {0x11, 0x40},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) {0x2a, 0x10}, {0x2b, 0xe0}, {0x10, 0x32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) {0x00, 0x00}, {0x01, 0x80}, {0x02, 0x80},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) static const struct i2c_reg_u8 ov7660_init[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) {0x0e, 0x80}, {0x0d, 0x08}, {0x0f, 0xc3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) {0x04, 0xc3}, {0x10, 0x40}, {0x11, 0x40},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) {0x12, 0x05}, {0x13, 0xba}, {0x14, 0x2a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) /* HDG Set hstart and hstop, datasheet default 0x11, 0x61, using
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) 0x10, 0x61 and sd->hstart, vstart = 3, fixes ugly colored borders */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) {0x17, 0x10}, {0x18, 0x61},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) {0x37, 0x0f}, {0x38, 0x02}, {0x39, 0x43},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) {0x3a, 0x00}, {0x69, 0x90}, {0x2d, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) {0x2e, 0x00}, {0x01, 0x78}, {0x02, 0x50},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) static const struct i2c_reg_u8 ov7670_init[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) {0x11, 0x80}, {0x3a, 0x04}, {0x12, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) {0x32, 0xb6}, {0x03, 0x0a}, {0x0c, 0x00}, {0x3e, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) {0x70, 0x3a}, {0x71, 0x35}, {0x72, 0x11}, {0x73, 0xf0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) {0xa2, 0x02}, {0x13, 0xe0}, {0x00, 0x00}, {0x10, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) {0x0d, 0x40}, {0x14, 0x28}, {0xa5, 0x05}, {0xab, 0x07},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) {0x24, 0x95}, {0x25, 0x33}, {0x26, 0xe3}, {0x9f, 0x75},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) {0xa0, 0x65}, {0xa1, 0x0b}, {0xa6, 0xd8}, {0xa7, 0xd8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) {0xa8, 0xf0}, {0xa9, 0x90}, {0xaa, 0x94}, {0x13, 0xe5},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) {0x0e, 0x61}, {0x0f, 0x4b}, {0x16, 0x02}, {0x1e, 0x27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) {0x21, 0x02}, {0x22, 0x91}, {0x29, 0x07}, {0x33, 0x0b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) {0x35, 0x0b}, {0x37, 0x1d}, {0x38, 0x71}, {0x39, 0x2a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) {0x3c, 0x78}, {0x4d, 0x40}, {0x4e, 0x20}, {0x69, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) {0x74, 0x19}, {0x8d, 0x4f}, {0x8e, 0x00}, {0x8f, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) {0x90, 0x00}, {0x91, 0x00}, {0x96, 0x00}, {0x9a, 0x80},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) {0xb0, 0x84}, {0xb1, 0x0c}, {0xb2, 0x0e}, {0xb3, 0x82},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) {0xb8, 0x0a}, {0x43, 0x0a}, {0x44, 0xf0}, {0x45, 0x20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) {0x46, 0x7d}, {0x47, 0x29}, {0x48, 0x4a}, {0x59, 0x8c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) {0x5a, 0xa5}, {0x5b, 0xde}, {0x5c, 0x96}, {0x5d, 0x66},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) {0x5e, 0x10}, {0x6c, 0x0a}, {0x6d, 0x55}, {0x6e, 0x11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) {0x6f, 0x9e}, {0x6a, 0x40}, {0x01, 0x40}, {0x02, 0x40},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) {0x13, 0xe7}, {0x4f, 0x6e}, {0x50, 0x70}, {0x51, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) {0x52, 0x1d}, {0x53, 0x56}, {0x54, 0x73}, {0x55, 0x0a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) {0x56, 0x55}, {0x57, 0x80}, {0x58, 0x9e}, {0x41, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) {0x3f, 0x02}, {0x75, 0x03}, {0x76, 0x63}, {0x4c, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) {0x77, 0x06}, {0x3d, 0x02}, {0x4b, 0x09}, {0xc9, 0x30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) {0x41, 0x08}, {0x56, 0x48}, {0x34, 0x11}, {0xa4, 0x88},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) {0x96, 0x00}, {0x97, 0x30}, {0x98, 0x20}, {0x99, 0x30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) {0x9a, 0x84}, {0x9b, 0x29}, {0x9c, 0x03}, {0x9d, 0x99},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) {0x9e, 0x7f}, {0x78, 0x04}, {0x79, 0x01}, {0xc8, 0xf0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) {0x79, 0x0f}, {0xc8, 0x00}, {0x79, 0x10}, {0xc8, 0x7e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) {0x79, 0x0a}, {0xc8, 0x80}, {0x79, 0x0b}, {0xc8, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) {0x79, 0x0c}, {0xc8, 0x0f}, {0x79, 0x0d}, {0xc8, 0x20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) {0x79, 0x09}, {0xc8, 0x80}, {0x79, 0x02}, {0xc8, 0xc0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) {0x79, 0x03}, {0xc8, 0x40}, {0x79, 0x05}, {0xc8, 0x30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) {0x79, 0x26}, {0x62, 0x20}, {0x63, 0x00}, {0x64, 0x06},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) {0x65, 0x00}, {0x66, 0x05}, {0x94, 0x05}, {0x95, 0x0a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) {0x17, 0x13}, {0x18, 0x01}, {0x19, 0x02}, {0x1a, 0x7a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) {0x46, 0x59}, {0x47, 0x30}, {0x58, 0x9a}, {0x59, 0x84},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) {0x5a, 0x91}, {0x5b, 0x57}, {0x5c, 0x75}, {0x5d, 0x6d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) {0x5e, 0x13}, {0x64, 0x07}, {0x94, 0x07}, {0x95, 0x0d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) {0xa6, 0xdf}, {0xa7, 0xdf}, {0x48, 0x4d}, {0x51, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) {0x6b, 0x0a}, {0x11, 0x80}, {0x2a, 0x00}, {0x2b, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) {0x92, 0x00}, {0x93, 0x00}, {0x55, 0x0a}, {0x56, 0x60},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) {0x4f, 0x6e}, {0x50, 0x70}, {0x51, 0x00}, {0x52, 0x1d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) {0x53, 0x56}, {0x54, 0x73}, {0x58, 0x9a}, {0x4f, 0x6e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) {0x50, 0x70}, {0x51, 0x00}, {0x52, 0x1d}, {0x53, 0x56},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) {0x54, 0x73}, {0x58, 0x9a}, {0x3f, 0x01}, {0x7b, 0x03},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) {0x7c, 0x09}, {0x7d, 0x16}, {0x7e, 0x38}, {0x7f, 0x47},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) {0x80, 0x53}, {0x81, 0x5e}, {0x82, 0x6a}, {0x83, 0x74},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) {0x84, 0x80}, {0x85, 0x8c}, {0x86, 0x9b}, {0x87, 0xb2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) {0x88, 0xcc}, {0x89, 0xe5}, {0x7a, 0x24}, {0x3b, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) {0x9f, 0x76}, {0xa0, 0x65}, {0x13, 0xe2}, {0x6b, 0x0a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) {0x11, 0x80}, {0x2a, 0x00}, {0x2b, 0x00}, {0x92, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) {0x93, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) static const struct i2c_reg_u8 ov9650_init[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) {0x00, 0x00}, {0x01, 0x78},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) {0x02, 0x78}, {0x03, 0x36}, {0x04, 0x03},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) {0x05, 0x00}, {0x06, 0x00}, {0x08, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) {0x09, 0x01}, {0x0c, 0x00}, {0x0d, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) {0x0e, 0xa0}, {0x0f, 0x52}, {0x10, 0x7c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) {0x11, 0x80}, {0x12, 0x45}, {0x13, 0xc2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) {0x14, 0x2e}, {0x15, 0x00}, {0x16, 0x07},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) {0x17, 0x24}, {0x18, 0xc5}, {0x19, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) {0x1a, 0x3c}, {0x1b, 0x00}, {0x1e, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) {0x1f, 0x00}, {0x24, 0x78}, {0x25, 0x68},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) {0x26, 0xd4}, {0x27, 0x80}, {0x28, 0x80},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) {0x29, 0x30}, {0x2a, 0x00}, {0x2b, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) {0x2c, 0x80}, {0x2d, 0x00}, {0x2e, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) {0x2f, 0x00}, {0x30, 0x08}, {0x31, 0x30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) {0x32, 0x84}, {0x33, 0xe2}, {0x34, 0xbf},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) {0x35, 0x81}, {0x36, 0xf9}, {0x37, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) {0x38, 0x93}, {0x39, 0x50}, {0x3a, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) {0x3b, 0x01}, {0x3c, 0x73}, {0x3d, 0x19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) {0x3e, 0x0b}, {0x3f, 0x80}, {0x40, 0xc1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) {0x41, 0x00}, {0x42, 0x08}, {0x67, 0x80},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) {0x68, 0x80}, {0x69, 0x40}, {0x6a, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) {0x6b, 0x0a}, {0x8b, 0x06}, {0x8c, 0x20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) {0x8d, 0x00}, {0x8e, 0x00}, {0x8f, 0xdf},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) {0x92, 0x00}, {0x93, 0x00}, {0x94, 0x88},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) {0x95, 0x88}, {0x96, 0x04}, {0xa1, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) {0xa5, 0x80}, {0xa8, 0x80}, {0xa9, 0xb8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) {0xaa, 0x92}, {0xab, 0x0a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) static const struct i2c_reg_u8 ov9655_init[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) {0x0e, 0x61}, {0x11, 0x80}, {0x13, 0xba},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) {0x14, 0x2e}, {0x16, 0x24}, {0x1e, 0x04}, {0x27, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) {0x28, 0x08}, {0x29, 0x15}, {0x2c, 0x08}, {0x34, 0x3d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) {0x35, 0x00}, {0x38, 0x12}, {0x0f, 0x42}, {0x39, 0x57},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) {0x3a, 0x00}, {0x3b, 0xcc}, {0x3c, 0x0c}, {0x3d, 0x19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) {0x3e, 0x0c}, {0x3f, 0x01}, {0x41, 0x40}, {0x42, 0x80},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) {0x45, 0x46}, {0x46, 0x62}, {0x47, 0x2a}, {0x48, 0x3c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) {0x4a, 0xf0}, {0x4b, 0xdc}, {0x4c, 0xdc}, {0x4d, 0xdc},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) {0x4e, 0xdc}, {0x6c, 0x04}, {0x6f, 0x9e}, {0x70, 0x05},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) {0x71, 0x78}, {0x77, 0x02}, {0x8a, 0x23}, {0x90, 0x7e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) {0x91, 0x7c}, {0x9f, 0x6e}, {0xa0, 0x6e}, {0xa5, 0x68},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) {0xa6, 0x60}, {0xa8, 0xc1}, {0xa9, 0xfa}, {0xaa, 0x92},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) {0xab, 0x04}, {0xac, 0x80}, {0xad, 0x80}, {0xae, 0x80},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) {0xaf, 0x80}, {0xb2, 0xf2}, {0xb3, 0x20}, {0xb5, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) {0xb6, 0xaf}, {0xbb, 0xae}, {0xbc, 0x44}, {0xbd, 0x44},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) {0xbe, 0x3b}, {0xbf, 0x3a}, {0xc1, 0xc8}, {0xc2, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) {0xc4, 0x00}, {0xc6, 0x85}, {0xc7, 0x81}, {0xc9, 0xe0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) {0xca, 0xe8}, {0xcc, 0xd8}, {0xcd, 0x93}, {0x2d, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) {0x2e, 0x00}, {0x01, 0x80}, {0x02, 0x80}, {0x12, 0x61},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) {0x36, 0xfa}, {0x8c, 0x8d}, {0xc0, 0xaa}, {0x69, 0x0a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) {0x03, 0x09}, {0x17, 0x16}, {0x18, 0x6e}, {0x19, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) {0x1a, 0x3e}, {0x32, 0x09}, {0x2a, 0x10}, {0x2b, 0x0a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) {0x92, 0x00}, {0x93, 0x00}, {0xa1, 0x00}, {0x10, 0x7c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) {0x04, 0x03}, {0x00, 0x13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) static const struct i2c_reg_u16 mt9v112_init[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) {0xf0, 0x0000}, {0x0d, 0x0021}, {0x0d, 0x0020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) {0x34, 0xc019}, {0x0a, 0x0011}, {0x0b, 0x000b},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) {0x20, 0x0703}, {0x35, 0x2022}, {0xf0, 0x0001},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) {0x05, 0x0000}, {0x06, 0x340c}, {0x3b, 0x042a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) {0x3c, 0x0400}, {0xf0, 0x0002}, {0x2e, 0x0c58},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) {0x5b, 0x0001}, {0xc8, 0x9f0b}, {0xf0, 0x0001},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) {0x9b, 0x5300}, {0xf0, 0x0000}, {0x2b, 0x0020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) {0x2c, 0x002a}, {0x2d, 0x0032}, {0x2e, 0x0020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) {0x09, 0x01dc}, {0x01, 0x000c}, {0x02, 0x0020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) {0x03, 0x01e0}, {0x04, 0x0280}, {0x06, 0x000c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) {0x05, 0x0098}, {0x20, 0x0703}, {0x09, 0x01f2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) {0x2b, 0x00a0}, {0x2c, 0x00a0}, {0x2d, 0x00a0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) {0x2e, 0x00a0}, {0x01, 0x000c}, {0x02, 0x0020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) {0x03, 0x01e0}, {0x04, 0x0280}, {0x06, 0x000c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) {0x05, 0x0098}, {0x09, 0x01c1}, {0x2b, 0x00ae},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) {0x2c, 0x00ae}, {0x2d, 0x00ae}, {0x2e, 0x00ae},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) static const struct i2c_reg_u16 mt9v111_init[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) {0x01, 0x0004}, {0x0d, 0x0001}, {0x0d, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) {0x01, 0x0001}, {0x05, 0x0004}, {0x2d, 0xe0a0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) {0x2e, 0x0c64}, {0x2f, 0x0064}, {0x06, 0x600e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) {0x08, 0x0480}, {0x01, 0x0004}, {0x02, 0x0016},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) {0x03, 0x01e7}, {0x04, 0x0287}, {0x05, 0x0004},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) {0x06, 0x002d}, {0x07, 0x3002}, {0x08, 0x0008},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) {0x0e, 0x0008}, {0x20, 0x0000}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) static const struct i2c_reg_u16 mt9v011_init[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) {0x07, 0x0002}, {0x0d, 0x0001}, {0x0d, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) {0x01, 0x0008}, {0x02, 0x0016}, {0x03, 0x01e1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) {0x04, 0x0281}, {0x05, 0x0083}, {0x06, 0x0006},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) {0x0d, 0x0002}, {0x0a, 0x0000}, {0x0b, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) {0x0c, 0x0000}, {0x0d, 0x0000}, {0x0e, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) {0x0f, 0x0000}, {0x10, 0x0000}, {0x11, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) {0x12, 0x0000}, {0x13, 0x0000}, {0x14, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) {0x15, 0x0000}, {0x16, 0x0000}, {0x17, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) {0x18, 0x0000}, {0x19, 0x0000}, {0x1a, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) {0x1b, 0x0000}, {0x1c, 0x0000}, {0x1d, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) {0x32, 0x0000}, {0x20, 0x1101}, {0x21, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) {0x22, 0x0000}, {0x23, 0x0000}, {0x24, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) {0x25, 0x0000}, {0x26, 0x0000}, {0x27, 0x0024},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) {0x2f, 0xf7b0}, {0x30, 0x0005}, {0x31, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) {0x32, 0x0000}, {0x33, 0x0000}, {0x34, 0x0100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) {0x3d, 0x068f}, {0x40, 0x01e0}, {0x41, 0x00d1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) {0x44, 0x0082}, {0x5a, 0x0000}, {0x5b, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) {0x5c, 0x0000}, {0x5d, 0x0000}, {0x5e, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) {0x5f, 0xa31d}, {0x62, 0x0611}, {0x0a, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) {0x06, 0x0029}, {0x05, 0x0009}, {0x20, 0x1101},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) {0x20, 0x1101}, {0x09, 0x0064}, {0x07, 0x0003},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) {0x2b, 0x0033}, {0x2c, 0x00a0}, {0x2d, 0x00a0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) {0x2e, 0x0033}, {0x07, 0x0002}, {0x06, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) {0x06, 0x0029}, {0x05, 0x0009},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) static const struct i2c_reg_u16 mt9m001_init[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) {0x0d, 0x0001},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) {0x0d, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) {0x04, 0x0500}, /* hres = 1280 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) {0x03, 0x0400}, /* vres = 1024 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) {0x20, 0x1100},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) {0x06, 0x0010},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) {0x2b, 0x0024},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) {0x2e, 0x0024},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) {0x35, 0x0024},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) {0x2d, 0x0020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) {0x2c, 0x0020},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) {0x09, 0x0ad4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) {0x35, 0x0057},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) static const struct i2c_reg_u16 mt9m111_init[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) {0xf0, 0x0000}, {0x0d, 0x0021}, {0x0d, 0x0008},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) {0xf0, 0x0001}, {0x3a, 0x4300}, {0x9b, 0x4300},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) {0x06, 0x708e}, {0xf0, 0x0002}, {0x2e, 0x0a1e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) {0xf0, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) static const struct i2c_reg_u16 mt9m112_init[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) {0xf0, 0x0000}, {0x0d, 0x0021}, {0x0d, 0x0008},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) {0xf0, 0x0001}, {0x3a, 0x4300}, {0x9b, 0x4300},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) {0x06, 0x708e}, {0xf0, 0x0002}, {0x2e, 0x0a1e},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) {0xf0, 0x0000},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) static const struct i2c_reg_u8 hv7131r_init[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) {0x02, 0x08}, {0x02, 0x00}, {0x01, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) {0x02, 0x00}, {0x20, 0x00}, {0x21, 0xd0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) {0x22, 0x00}, {0x23, 0x09}, {0x01, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) {0x01, 0x08}, {0x01, 0x08}, {0x25, 0x07},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) {0x26, 0xc3}, {0x27, 0x50}, {0x30, 0x62},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) {0x31, 0x10}, {0x32, 0x06}, {0x33, 0x10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) {0x20, 0x00}, {0x21, 0xd0}, {0x22, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) {0x23, 0x09}, {0x01, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) static void reg_r(struct gspca_dev *gspca_dev, u16 reg, u16 length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) struct usb_device *dev = gspca_dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) gspca_dev->usb_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) 500);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) if (unlikely(result < 0 || result != length)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) pr_err("Read register %02x failed %d\n", reg, result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) gspca_dev->usb_err = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) * Make sure the buffer is zeroed to avoid uninitialized
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) * values.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) memset(gspca_dev->usb_buf, 0, USB_BUF_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) static void reg_w(struct gspca_dev *gspca_dev, u16 reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) const u8 *buffer, int length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) struct usb_device *dev = gspca_dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) memcpy(gspca_dev->usb_buf, buffer, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) 0x08,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) gspca_dev->usb_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) 500);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) if (unlikely(result < 0 || result != length)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) pr_err("Write register %02x failed %d\n", reg, result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) gspca_dev->usb_err = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) static void reg_w1(struct gspca_dev *gspca_dev, u16 reg, const u8 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) reg_w(gspca_dev, reg, &value, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) static void i2c_w(struct gspca_dev *gspca_dev, const u8 *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) reg_w(gspca_dev, 0x10c0, buffer, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) for (i = 0; i < 5; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) reg_r(gspca_dev, 0x10c0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) if (gspca_dev->usb_buf[0] & 0x04) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) if (gspca_dev->usb_buf[0] & 0x08) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) pr_err("i2c_w error\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) gspca_dev->usb_err = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) pr_err("i2c_w reg %02x no response\n", buffer[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) /* gspca_dev->usb_err = -EIO; fixme: may occur */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) static void i2c_w1(struct gspca_dev *gspca_dev, u8 reg, u8 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) u8 row[8];
^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) * from the point of view of the bridge, the length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) * includes the address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) row[0] = sd->i2c_intf | (2 << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) row[1] = sd->i2c_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) row[2] = reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) row[3] = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) row[4] = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) row[5] = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) row[6] = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) row[7] = 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) i2c_w(gspca_dev, row);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) static void i2c_w1_buf(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) const struct i2c_reg_u8 *buf, int sz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) while (--sz >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) i2c_w1(gspca_dev, buf->reg, buf->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) buf++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) static void i2c_w2(struct gspca_dev *gspca_dev, u8 reg, u16 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) u8 row[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) * from the point of view of the bridge, the length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) * includes the address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) row[0] = sd->i2c_intf | (3 << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) row[1] = sd->i2c_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) row[2] = reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) row[3] = val >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) row[4] = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) row[5] = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) row[6] = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) row[7] = 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) i2c_w(gspca_dev, row);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) static void i2c_w2_buf(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) const struct i2c_reg_u16 *buf, int sz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) while (--sz >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) i2c_w2(gspca_dev, buf->reg, buf->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) buf++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) static void i2c_r1(struct gspca_dev *gspca_dev, u8 reg, u8 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) u8 row[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) row[0] = sd->i2c_intf | (1 << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) row[1] = sd->i2c_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) row[2] = reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) row[3] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) row[4] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) row[5] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) row[6] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) row[7] = 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) i2c_w(gspca_dev, row);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) row[0] = sd->i2c_intf | (1 << 4) | 0x02;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) row[2] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) i2c_w(gspca_dev, row);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) reg_r(gspca_dev, 0x10c2, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) *val = gspca_dev->usb_buf[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) static void i2c_r2(struct gspca_dev *gspca_dev, u8 reg, u16 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) u8 row[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) row[0] = sd->i2c_intf | (1 << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) row[1] = sd->i2c_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) row[2] = reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) row[3] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) row[4] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) row[5] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) row[6] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) row[7] = 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) i2c_w(gspca_dev, row);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) row[0] = sd->i2c_intf | (2 << 4) | 0x02;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) row[2] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) i2c_w(gspca_dev, row);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) reg_r(gspca_dev, 0x10c2, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) *val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) static void ov9650_init_sensor(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) u16 id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) i2c_r2(gspca_dev, 0x1c, &id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) if (id != 0x7fa2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) pr_err("sensor id for ov9650 doesn't match (0x%04x)\n", id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) gspca_dev->usb_err = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) i2c_w1(gspca_dev, 0x12, 0x80); /* sensor reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) msleep(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) i2c_w1_buf(gspca_dev, ov9650_init, ARRAY_SIZE(ov9650_init));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) pr_err("OV9650 sensor initialization failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) sd->hstart = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) sd->vstart = 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) static void ov9655_init_sensor(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) i2c_w1(gspca_dev, 0x12, 0x80); /* sensor reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) msleep(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) i2c_w1_buf(gspca_dev, ov9655_init, ARRAY_SIZE(ov9655_init));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) pr_err("OV9655 sensor initialization failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) sd->hstart = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) sd->vstart = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) static void soi968_init_sensor(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) i2c_w1(gspca_dev, 0x12, 0x80); /* sensor reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) msleep(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) i2c_w1_buf(gspca_dev, soi968_init, ARRAY_SIZE(soi968_init));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) pr_err("SOI968 sensor initialization failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) sd->hstart = 60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) sd->vstart = 11;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) static void ov7660_init_sensor(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) i2c_w1(gspca_dev, 0x12, 0x80); /* sensor reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) msleep(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) i2c_w1_buf(gspca_dev, ov7660_init, ARRAY_SIZE(ov7660_init));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) pr_err("OV7660 sensor initialization failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) sd->hstart = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) sd->vstart = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) static void ov7670_init_sensor(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) i2c_w1(gspca_dev, 0x12, 0x80); /* sensor reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) msleep(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) i2c_w1_buf(gspca_dev, ov7670_init, ARRAY_SIZE(ov7670_init));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) pr_err("OV7670 sensor initialization failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) sd->hstart = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) sd->vstart = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) static void mt9v_init_sensor(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) u16 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) sd->i2c_addr = 0x5d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) i2c_r2(gspca_dev, 0xff, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) if (gspca_dev->usb_err >= 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) && value == 0x8243) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) i2c_w2_buf(gspca_dev, mt9v011_init, ARRAY_SIZE(mt9v011_init));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) if (gspca_dev->usb_err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) pr_err("MT9V011 sensor initialization failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) sd->hstart = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) sd->vstart = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) sd->sensor = SENSOR_MT9V011;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) pr_info("MT9V011 sensor detected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) sd->i2c_addr = 0x5c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) i2c_w2(gspca_dev, 0x01, 0x0004);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) i2c_r2(gspca_dev, 0xff, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) if (gspca_dev->usb_err >= 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) && value == 0x823a) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) i2c_w2_buf(gspca_dev, mt9v111_init, ARRAY_SIZE(mt9v111_init));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) if (gspca_dev->usb_err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) pr_err("MT9V111 sensor initialization failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) sd->hstart = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) sd->vstart = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) sd->sensor = SENSOR_MT9V111;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) pr_info("MT9V111 sensor detected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) sd->i2c_addr = 0x5d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) i2c_w2(gspca_dev, 0xf0, 0x0000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) if (gspca_dev->usb_err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) sd->i2c_addr = 0x48;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) i2c_w2(gspca_dev, 0xf0, 0x0000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) i2c_r2(gspca_dev, 0x00, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) if (gspca_dev->usb_err >= 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) && value == 0x1229) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) i2c_w2_buf(gspca_dev, mt9v112_init, ARRAY_SIZE(mt9v112_init));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) if (gspca_dev->usb_err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) pr_err("MT9V112 sensor initialization failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) sd->hstart = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) sd->vstart = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) sd->sensor = SENSOR_MT9V112;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) pr_info("MT9V112 sensor detected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) gspca_dev->usb_err = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) static void mt9m112_init_sensor(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) i2c_w2_buf(gspca_dev, mt9m112_init, ARRAY_SIZE(mt9m112_init));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) pr_err("MT9M112 sensor initialization failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) sd->hstart = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) sd->vstart = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) static void mt9m111_init_sensor(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) i2c_w2_buf(gspca_dev, mt9m111_init, ARRAY_SIZE(mt9m111_init));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) pr_err("MT9M111 sensor initialization failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) sd->hstart = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) sd->vstart = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) static void mt9m001_init_sensor(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) u16 id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) i2c_r2(gspca_dev, 0x00, &id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) /* must be 0x8411 or 0x8421 for colour sensor and 8431 for bw */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) switch (id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) case 0x8411:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) case 0x8421:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) pr_info("MT9M001 color sensor detected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) case 0x8431:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) pr_info("MT9M001 mono sensor detected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) pr_err("No MT9M001 chip detected, ID = %x\n\n", id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) gspca_dev->usb_err = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) i2c_w2_buf(gspca_dev, mt9m001_init, ARRAY_SIZE(mt9m001_init));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) pr_err("MT9M001 sensor initialization failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) sd->hstart = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) sd->vstart = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) static void hv7131r_init_sensor(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) i2c_w1_buf(gspca_dev, hv7131r_init, ARRAY_SIZE(hv7131r_init));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) pr_err("HV7131R Sensor initialization failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) sd->hstart = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) sd->vstart = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) static void set_cmatrix(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) s32 brightness, s32 contrast, s32 satur, s32 hue)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) s32 hue_coord, hue_index = 180 + hue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) u8 cmatrix[21];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) memset(cmatrix, 0, sizeof(cmatrix));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) cmatrix[2] = (contrast * 0x25 / 0x100) + 0x26;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) cmatrix[0] = 0x13 + (cmatrix[2] - 0x26) * 0x13 / 0x25;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) cmatrix[4] = 0x07 + (cmatrix[2] - 0x26) * 0x07 / 0x25;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) cmatrix[18] = brightness - 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) hue_coord = (hsv_red_x[hue_index] * satur) >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) cmatrix[6] = hue_coord;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) cmatrix[7] = (hue_coord >> 8) & 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) hue_coord = (hsv_red_y[hue_index] * satur) >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) cmatrix[8] = hue_coord;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) cmatrix[9] = (hue_coord >> 8) & 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) hue_coord = (hsv_green_x[hue_index] * satur) >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) cmatrix[10] = hue_coord;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) cmatrix[11] = (hue_coord >> 8) & 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) hue_coord = (hsv_green_y[hue_index] * satur) >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) cmatrix[12] = hue_coord;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) cmatrix[13] = (hue_coord >> 8) & 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) hue_coord = (hsv_blue_x[hue_index] * satur) >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) cmatrix[14] = hue_coord;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) cmatrix[15] = (hue_coord >> 8) & 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) hue_coord = (hsv_blue_y[hue_index] * satur) >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) cmatrix[16] = hue_coord;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) cmatrix[17] = (hue_coord >> 8) & 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) reg_w(gspca_dev, 0x10e1, cmatrix, 21);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) static void set_gamma(struct gspca_dev *gspca_dev, s32 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) u8 gamma[17];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) u8 gval = val * 0xb8 / 0x100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) gamma[0] = 0x0a;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) gamma[1] = 0x13 + (gval * (0xcb - 0x13) / 0xb8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) gamma[2] = 0x25 + (gval * (0xee - 0x25) / 0xb8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) gamma[3] = 0x37 + (gval * (0xfa - 0x37) / 0xb8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) gamma[4] = 0x45 + (gval * (0xfc - 0x45) / 0xb8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) gamma[5] = 0x55 + (gval * (0xfb - 0x55) / 0xb8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) gamma[6] = 0x65 + (gval * (0xfc - 0x65) / 0xb8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) gamma[7] = 0x74 + (gval * (0xfd - 0x74) / 0xb8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) gamma[8] = 0x83 + (gval * (0xfe - 0x83) / 0xb8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) gamma[9] = 0x92 + (gval * (0xfc - 0x92) / 0xb8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) gamma[10] = 0xa1 + (gval * (0xfc - 0xa1) / 0xb8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) gamma[11] = 0xb0 + (gval * (0xfc - 0xb0) / 0xb8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) gamma[12] = 0xbf + (gval * (0xfb - 0xbf) / 0xb8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) gamma[13] = 0xce + (gval * (0xfb - 0xce) / 0xb8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) gamma[14] = 0xdf + (gval * (0xfd - 0xdf) / 0xb8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) gamma[15] = 0xea + (gval * (0xf9 - 0xea) / 0xb8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) gamma[16] = 0xf5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) reg_w(gspca_dev, 0x1190, gamma, 17);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) static void set_redblue(struct gspca_dev *gspca_dev, s32 blue, s32 red)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) reg_w1(gspca_dev, 0x118c, red);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) reg_w1(gspca_dev, 0x118f, blue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) static void set_hvflip(struct gspca_dev *gspca_dev, s32 hflip, s32 vflip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) u8 value, tslb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) u16 value2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) if ((sd->flags & FLIP_DETECT) && dmi_check_system(flip_dmi_table)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) hflip = !hflip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) vflip = !vflip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) switch (sd->sensor) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) case SENSOR_OV7660:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) value = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) if (hflip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) value |= 0x20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) if (vflip) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) value |= 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) sd->vstart = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) sd->vstart = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) reg_w1(gspca_dev, 0x1182, sd->vstart);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) i2c_w1(gspca_dev, 0x1e, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) case SENSOR_OV9650:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) i2c_r1(gspca_dev, 0x1e, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) value &= ~0x30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) tslb = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) if (hflip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) value |= 0x20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) if (vflip) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) value |= 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) tslb = 0x49;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) i2c_w1(gspca_dev, 0x1e, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) i2c_w1(gspca_dev, 0x3a, tslb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) case SENSOR_MT9V111:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) case SENSOR_MT9V011:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) i2c_r2(gspca_dev, 0x20, &value2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) value2 &= ~0xc0a0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) if (hflip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) value2 |= 0x8080;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) if (vflip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) value2 |= 0x4020;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) i2c_w2(gspca_dev, 0x20, value2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) case SENSOR_MT9M112:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) case SENSOR_MT9M111:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) case SENSOR_MT9V112:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) i2c_r2(gspca_dev, 0x20, &value2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) value2 &= ~0x0003;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) if (hflip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) value2 |= 0x0002;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) if (vflip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) value2 |= 0x0001;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) i2c_w2(gspca_dev, 0x20, value2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) case SENSOR_HV7131R:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) i2c_r1(gspca_dev, 0x01, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) value &= ~0x03;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) if (vflip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) value |= 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) if (hflip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) value |= 0x02;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) i2c_w1(gspca_dev, 0x01, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) static void set_exposure(struct gspca_dev *gspca_dev, s32 expo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) u8 exp[8] = {sd->i2c_intf, sd->i2c_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) 0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) int expo2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) if (gspca_dev->streaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) exp[7] = 0x1e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) switch (sd->sensor) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) case SENSOR_OV7660:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) case SENSOR_OV7670:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) case SENSOR_OV9655:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) case SENSOR_OV9650:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) if (expo > 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) expo2 = 547;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) expo2 = expo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) exp[0] |= (2 << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) exp[2] = 0x10; /* AECH */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) exp[3] = expo2 >> 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) exp[7] = 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) i2c_w(gspca_dev, exp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) exp[2] = 0x04; /* COM1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) exp[3] = expo2 & 0x0003;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) exp[7] = 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) i2c_w(gspca_dev, exp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) expo -= expo2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) exp[7] = 0x1e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) exp[0] |= (3 << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) exp[2] = 0x2d; /* ADVFL & ADVFH */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) exp[3] = expo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) exp[4] = expo >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) case SENSOR_MT9M001:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) case SENSOR_MT9V112:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) case SENSOR_MT9V011:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) exp[0] |= (3 << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) exp[2] = 0x09;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) exp[3] = expo >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) exp[4] = expo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) case SENSOR_HV7131R:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) exp[0] |= (4 << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) exp[2] = 0x25;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) exp[3] = expo >> 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) exp[4] = expo << 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) exp[5] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) i2c_w(gspca_dev, exp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) static void set_gain(struct gspca_dev *gspca_dev, s32 g)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) u8 gain[8] = {sd->i2c_intf, sd->i2c_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) 0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) if (gspca_dev->streaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) gain[7] = 0x15; /* or 1d ? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) switch (sd->sensor) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) case SENSOR_OV7660:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) case SENSOR_OV7670:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) case SENSOR_SOI968:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) case SENSOR_OV9655:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) case SENSOR_OV9650:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) gain[0] |= (2 << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) gain[3] = ov_gain[g];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) case SENSOR_MT9V011:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) gain[0] |= (3 << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) gain[2] = 0x35;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) gain[3] = micron1_gain[g] >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) gain[4] = micron1_gain[g];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) case SENSOR_MT9V112:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) gain[0] |= (3 << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) gain[2] = 0x2f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) gain[3] = micron1_gain[g] >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) gain[4] = micron1_gain[g];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) case SENSOR_MT9M001:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) gain[0] |= (3 << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) gain[2] = 0x2f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) gain[3] = micron2_gain[g] >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) gain[4] = micron2_gain[g];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) case SENSOR_HV7131R:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) gain[0] |= (2 << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) gain[2] = 0x30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) gain[3] = hv7131r_gain[g];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) i2c_w(gspca_dev, gain);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) static void set_quality(struct gspca_dev *gspca_dev, s32 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) jpeg_set_qual(sd->jpeg_hdr, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) reg_w1(gspca_dev, 0x1061, 0x01); /* stop transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) reg_w1(gspca_dev, 0x10e0, sd->fmt | 0x20); /* write QTAB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) reg_w(gspca_dev, 0x1100, &sd->jpeg_hdr[JPEG_QT0_OFFSET], 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) reg_w(gspca_dev, 0x1140, &sd->jpeg_hdr[JPEG_QT1_OFFSET], 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) reg_w1(gspca_dev, 0x1061, 0x03); /* restart transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) reg_w1(gspca_dev, 0x10e0, sd->fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) sd->fmt ^= 0x0c; /* invert QTAB use + write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) reg_w1(gspca_dev, 0x10e0, sd->fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) #ifdef CONFIG_VIDEO_ADV_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) static int sd_dbg_g_register(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) struct v4l2_dbg_register *reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) reg->size = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) switch (reg->match.addr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) if (reg->reg < 0x1000 || reg->reg > 0x11ff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) reg_r(gspca_dev, reg->reg, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) reg->val = gspca_dev->usb_buf[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) return gspca_dev->usb_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) if (sd->sensor >= SENSOR_MT9V011 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) sd->sensor <= SENSOR_MT9M112) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) i2c_r2(gspca_dev, reg->reg, (u16 *) ®->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) reg->size = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) i2c_r1(gspca_dev, reg->reg, (u8 *) ®->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) return gspca_dev->usb_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) static int sd_dbg_s_register(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) const struct v4l2_dbg_register *reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) switch (reg->match.addr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) if (reg->reg < 0x1000 || reg->reg > 0x11ff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) reg_w1(gspca_dev, reg->reg, reg->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) return gspca_dev->usb_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) if (sd->sensor >= SENSOR_MT9V011 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) sd->sensor <= SENSOR_MT9M112) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) i2c_w2(gspca_dev, reg->reg, reg->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) i2c_w1(gspca_dev, reg->reg, reg->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) return gspca_dev->usb_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) static int sd_chip_info(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) struct v4l2_dbg_chip_info *chip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) if (chip->match.addr > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) if (chip->match.addr == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) strscpy(chip->name, "sensor", sizeof(chip->name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) static int sd_config(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) struct cam *cam;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) cam = &gspca_dev->cam;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) cam->needs_full_bandwidth = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) sd->sensor = id->driver_info >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) sd->i2c_addr = id->driver_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) sd->flags = id->driver_info >> 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) sd->i2c_intf = 0x80; /* i2c 100 Kb/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) switch (sd->sensor) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) case SENSOR_MT9M112:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) case SENSOR_MT9M111:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) case SENSOR_OV9650:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) case SENSOR_SOI968:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) cam->cam_mode = sxga_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) cam->nmodes = ARRAY_SIZE(sxga_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) case SENSOR_MT9M001:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) cam->cam_mode = mono_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) cam->nmodes = ARRAY_SIZE(mono_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) case SENSOR_HV7131R:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) sd->i2c_intf = 0x81; /* i2c 400 Kb/s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) cam->cam_mode = vga_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) cam->nmodes = ARRAY_SIZE(vga_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) sd->old_step = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) sd->older_step = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) sd->exposure_step = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) INIT_WORK(&sd->work, qual_upd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) struct gspca_dev *gspca_dev =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) struct sd *sd = (struct sd *)gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) if (!gspca_dev->streaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) switch (ctrl->id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) /* color control cluster */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) case V4L2_CID_BRIGHTNESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) set_cmatrix(gspca_dev, sd->brightness->val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) sd->contrast->val, sd->saturation->val, sd->hue->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) case V4L2_CID_GAMMA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) set_gamma(gspca_dev, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) /* blue/red balance cluster */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) case V4L2_CID_BLUE_BALANCE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) set_redblue(gspca_dev, sd->blue->val, sd->red->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) /* h/vflip cluster */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) case V4L2_CID_HFLIP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) set_hvflip(gspca_dev, sd->hflip->val, sd->vflip->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) /* standalone exposure control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) case V4L2_CID_EXPOSURE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) set_exposure(gspca_dev, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) /* standalone gain control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) case V4L2_CID_GAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) set_gain(gspca_dev, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) /* autogain + exposure or gain control cluster */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) case V4L2_CID_AUTOGAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) if (sd->sensor == SENSOR_SOI968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) set_gain(gspca_dev, sd->gain->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) set_exposure(gspca_dev, sd->exposure->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) case V4L2_CID_JPEG_COMPRESSION_QUALITY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) set_quality(gspca_dev, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) return gspca_dev->usb_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) static const struct v4l2_ctrl_ops sd_ctrl_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) .s_ctrl = sd_s_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) static int sd_init_controls(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) gspca_dev->vdev.ctrl_handler = hdl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) v4l2_ctrl_handler_init(hdl, 13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) sd->brightness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) V4L2_CID_BRIGHTNESS, 0, 255, 1, 127);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) sd->contrast = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) V4L2_CID_CONTRAST, 0, 255, 1, 127);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) sd->saturation = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) V4L2_CID_SATURATION, 0, 255, 1, 127);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) sd->hue = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) V4L2_CID_HUE, -180, 180, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) sd->gamma = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) V4L2_CID_GAMMA, 0, 255, 1, 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) sd->blue = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) V4L2_CID_BLUE_BALANCE, 0, 127, 1, 0x28);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) sd->red = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) V4L2_CID_RED_BALANCE, 0, 127, 1, 0x28);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) if (sd->sensor != SENSOR_OV9655 && sd->sensor != SENSOR_SOI968 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) sd->sensor != SENSOR_OV7670 && sd->sensor != SENSOR_MT9M001 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) sd->sensor != SENSOR_MT9VPRB) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) sd->hflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) V4L2_CID_HFLIP, 0, 1, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) sd->vflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) V4L2_CID_VFLIP, 0, 1, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) if (sd->sensor != SENSOR_SOI968 && sd->sensor != SENSOR_MT9VPRB &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) sd->sensor != SENSOR_MT9M112 && sd->sensor != SENSOR_MT9M111 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) sd->sensor != SENSOR_MT9V111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) sd->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) V4L2_CID_EXPOSURE, 0, 0x1780, 1, 0x33);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) if (sd->sensor != SENSOR_MT9VPRB && sd->sensor != SENSOR_MT9M112 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) sd->sensor != SENSOR_MT9M111 && sd->sensor != SENSOR_MT9V111) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) sd->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) V4L2_CID_GAIN, 0, 28, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) sd->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) sd->jpegqual = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) V4L2_CID_JPEG_COMPRESSION_QUALITY, 50, 90, 1, 80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) if (hdl->error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) pr_err("Could not initialize controls\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) return hdl->error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) v4l2_ctrl_cluster(4, &sd->brightness);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) v4l2_ctrl_cluster(2, &sd->blue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) if (sd->hflip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) v4l2_ctrl_cluster(2, &sd->hflip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) if (sd->autogain) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) if (sd->sensor == SENSOR_SOI968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) /* this sensor doesn't have the exposure control and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) autogain is clustered with gain instead. This works
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) because sd->exposure == NULL. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) v4l2_ctrl_auto_cluster(3, &sd->autogain, 0, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) /* Otherwise autogain is clustered with exposure. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) v4l2_ctrl_auto_cluster(2, &sd->autogain, 0, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) static int sd_init(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) u8 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) u8 i2c_init[9] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) 0x80, sd->i2c_addr, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) for (i = 0; i < ARRAY_SIZE(bridge_init); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) value = bridge_init[i][1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) reg_w(gspca_dev, bridge_init[i][0], &value, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) if (gspca_dev->usb_err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) pr_err("Device initialization failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) return gspca_dev->usb_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) if (sd->flags & LED_REVERSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) reg_w1(gspca_dev, 0x1006, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) reg_w1(gspca_dev, 0x1006, 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) reg_w(gspca_dev, 0x10c0, i2c_init, 9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) if (gspca_dev->usb_err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) pr_err("Device initialization failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) return gspca_dev->usb_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) switch (sd->sensor) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) case SENSOR_OV9650:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) ov9650_init_sensor(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) pr_info("OV9650 sensor detected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) case SENSOR_OV9655:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) ov9655_init_sensor(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) pr_info("OV9655 sensor detected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) case SENSOR_SOI968:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) soi968_init_sensor(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) pr_info("SOI968 sensor detected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) case SENSOR_OV7660:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) ov7660_init_sensor(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) pr_info("OV7660 sensor detected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) case SENSOR_OV7670:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) ov7670_init_sensor(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) pr_info("OV7670 sensor detected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) case SENSOR_MT9VPRB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) mt9v_init_sensor(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) pr_info("MT9VPRB sensor detected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) case SENSOR_MT9M111:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) mt9m111_init_sensor(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) pr_info("MT9M111 sensor detected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) case SENSOR_MT9M112:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) mt9m112_init_sensor(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) pr_info("MT9M112 sensor detected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) case SENSOR_MT9M001:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) mt9m001_init_sensor(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) case SENSOR_HV7131R:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) hv7131r_init_sensor(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) if (gspca_dev->usb_err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) pr_info("HV7131R sensor detected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) pr_err("Unsupported sensor\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) gspca_dev->usb_err = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) return gspca_dev->usb_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) static void configure_sensor_output(struct gspca_dev *gspca_dev, int mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) u8 value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) switch (sd->sensor) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) case SENSOR_SOI968:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) if (mode & MODE_SXGA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) i2c_w1(gspca_dev, 0x17, 0x1d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) i2c_w1(gspca_dev, 0x18, 0xbd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) i2c_w1(gspca_dev, 0x19, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) i2c_w1(gspca_dev, 0x1a, 0x81);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) i2c_w1(gspca_dev, 0x12, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) sd->hstart = 140;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) sd->vstart = 19;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) i2c_w1(gspca_dev, 0x17, 0x13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) i2c_w1(gspca_dev, 0x18, 0x63);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) i2c_w1(gspca_dev, 0x19, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) i2c_w1(gspca_dev, 0x1a, 0x79);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) i2c_w1(gspca_dev, 0x12, 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) sd->hstart = 60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) sd->vstart = 11;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) case SENSOR_OV9650:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) if (mode & MODE_SXGA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) i2c_w1(gspca_dev, 0x17, 0x1b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) i2c_w1(gspca_dev, 0x18, 0xbc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) i2c_w1(gspca_dev, 0x19, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) i2c_w1(gspca_dev, 0x1a, 0x82);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) i2c_r1(gspca_dev, 0x12, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) i2c_w1(gspca_dev, 0x12, value & 0x07);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) i2c_w1(gspca_dev, 0x17, 0x24);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) i2c_w1(gspca_dev, 0x18, 0xc5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) i2c_w1(gspca_dev, 0x19, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) i2c_w1(gspca_dev, 0x1a, 0x3c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) i2c_r1(gspca_dev, 0x12, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) i2c_w1(gspca_dev, 0x12, (value & 0x7) | 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) case SENSOR_MT9M112:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) case SENSOR_MT9M111:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) if (mode & MODE_SXGA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) i2c_w2(gspca_dev, 0xf0, 0x0002);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) i2c_w2(gspca_dev, 0xc8, 0x970b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) i2c_w2(gspca_dev, 0xf0, 0x0000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) i2c_w2(gspca_dev, 0xf0, 0x0002);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) i2c_w2(gspca_dev, 0xc8, 0x8000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) i2c_w2(gspca_dev, 0xf0, 0x0000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) static int sd_isoc_init(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) struct usb_interface *intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) u32 flags = gspca_dev->cam.cam_mode[(int)gspca_dev->curr_mode].priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) * When using the SN9C20X_I420 fmt the sn9c20x needs more bandwidth
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) * than our regular bandwidth calculations reserve, so we force the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) * use of a specific altsetting when using the SN9C20X_I420 fmt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) if (!(flags & (MODE_RAW | MODE_JPEG))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) intf = usb_ifnum_to_if(gspca_dev->dev, gspca_dev->iface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) if (intf->num_altsetting != 9) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) pr_warn("sn9c20x camera with unknown number of alt settings (%d), please report!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) intf->num_altsetting);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) gspca_dev->alt = intf->num_altsetting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) switch (gspca_dev->pixfmt.width) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) case 160: /* 160x120 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) gspca_dev->alt = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) case 320: /* 320x240 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) gspca_dev->alt = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) default: /* >= 640x480 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) gspca_dev->alt = 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) #define HW_WIN(mode, hstart, vstart) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) ((const u8 []){hstart, 0, vstart, 0, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) (mode & MODE_SXGA ? 1280 >> 4 : 640 >> 4), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) (mode & MODE_SXGA ? 1024 >> 3 : 480 >> 3)})
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) #define CLR_WIN(width, height) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) ((const u8 [])\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) {0, width >> 2, 0, height >> 1,\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) ((width >> 10) & 0x01) | ((height >> 8) & 0x6)})
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) static int sd_start(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) int mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) int width = gspca_dev->pixfmt.width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) int height = gspca_dev->pixfmt.height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) u8 fmt, scale = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) jpeg_define(sd->jpeg_hdr, height, width,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) 0x21);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) jpeg_set_qual(sd->jpeg_hdr, v4l2_ctrl_g_ctrl(sd->jpegqual));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) if (mode & MODE_RAW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) fmt = 0x2d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) else if (mode & MODE_JPEG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) fmt = 0x24;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) fmt = 0x2f; /* YUV 420 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) sd->fmt = fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) switch (mode & SCALE_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) case SCALE_1280x1024:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) scale = 0xc0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) pr_info("Set 1280x1024\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) case SCALE_640x480:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) scale = 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) pr_info("Set 640x480\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) case SCALE_320x240:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) scale = 0x90;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) pr_info("Set 320x240\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) case SCALE_160x120:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) scale = 0xa0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) pr_info("Set 160x120\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) configure_sensor_output(gspca_dev, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) reg_w(gspca_dev, 0x1100, &sd->jpeg_hdr[JPEG_QT0_OFFSET], 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) reg_w(gspca_dev, 0x1140, &sd->jpeg_hdr[JPEG_QT1_OFFSET], 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) reg_w(gspca_dev, 0x10fb, CLR_WIN(width, height), 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) reg_w(gspca_dev, 0x1180, HW_WIN(mode, sd->hstart, sd->vstart), 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) reg_w1(gspca_dev, 0x1189, scale);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) reg_w1(gspca_dev, 0x10e0, fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) set_cmatrix(gspca_dev, v4l2_ctrl_g_ctrl(sd->brightness),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) v4l2_ctrl_g_ctrl(sd->contrast),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) v4l2_ctrl_g_ctrl(sd->saturation),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) v4l2_ctrl_g_ctrl(sd->hue));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) set_gamma(gspca_dev, v4l2_ctrl_g_ctrl(sd->gamma));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) set_redblue(gspca_dev, v4l2_ctrl_g_ctrl(sd->blue),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) v4l2_ctrl_g_ctrl(sd->red));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) if (sd->gain)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) set_gain(gspca_dev, v4l2_ctrl_g_ctrl(sd->gain));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) if (sd->exposure)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) set_exposure(gspca_dev, v4l2_ctrl_g_ctrl(sd->exposure));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) if (sd->hflip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) set_hvflip(gspca_dev, v4l2_ctrl_g_ctrl(sd->hflip),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) v4l2_ctrl_g_ctrl(sd->vflip));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) reg_w1(gspca_dev, 0x1007, 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) reg_w1(gspca_dev, 0x1061, 0x03);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) /* if JPEG, prepare the compression quality update */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) if (mode & MODE_JPEG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) sd->pktsz = sd->npkt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) sd->nchg = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) return gspca_dev->usb_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) static void sd_stopN(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) reg_w1(gspca_dev, 0x1007, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) reg_w1(gspca_dev, 0x1061, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) /* called on streamoff with alt==0 and on disconnect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) /* the usb_lock is held at entry - restore on exit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) static void sd_stop0(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) mutex_unlock(&gspca_dev->usb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) flush_work(&sd->work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) mutex_lock(&gspca_dev->usb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) static void do_autoexposure(struct gspca_dev *gspca_dev, u16 avg_lum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) s32 cur_exp = v4l2_ctrl_g_ctrl(sd->exposure);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) s32 max = sd->exposure->maximum - sd->exposure_step;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) s32 min = sd->exposure->minimum + sd->exposure_step;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) s16 new_exp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) * some hardcoded values are present
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) * like those for maximal/minimal exposure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) * and exposure steps
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) if (avg_lum < MIN_AVG_LUM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) if (cur_exp > max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) new_exp = cur_exp + sd->exposure_step;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) if (new_exp > max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) new_exp = max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) if (new_exp < min)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) new_exp = min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) v4l2_ctrl_s_ctrl(sd->exposure, new_exp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) sd->older_step = sd->old_step;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) sd->old_step = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) if (sd->old_step ^ sd->older_step)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) sd->exposure_step /= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) sd->exposure_step += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) if (avg_lum > MAX_AVG_LUM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) if (cur_exp < min)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) new_exp = cur_exp - sd->exposure_step;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) if (new_exp > max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) new_exp = max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) if (new_exp < min)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) new_exp = min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) v4l2_ctrl_s_ctrl(sd->exposure, new_exp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) sd->older_step = sd->old_step;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) sd->old_step = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) if (sd->old_step ^ sd->older_step)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) sd->exposure_step /= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) sd->exposure_step += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) static void do_autogain(struct gspca_dev *gspca_dev, u16 avg_lum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) s32 cur_gain = v4l2_ctrl_g_ctrl(sd->gain);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) if (avg_lum < MIN_AVG_LUM && cur_gain < sd->gain->maximum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) v4l2_ctrl_s_ctrl(sd->gain, cur_gain + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) if (avg_lum > MAX_AVG_LUM && cur_gain > sd->gain->minimum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) v4l2_ctrl_s_ctrl(sd->gain, cur_gain - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) static void sd_dqcallback(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) int avg_lum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) if (sd->autogain == NULL || !v4l2_ctrl_g_ctrl(sd->autogain))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) avg_lum = atomic_read(&sd->avg_lum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) if (sd->sensor == SENSOR_SOI968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) do_autogain(gspca_dev, avg_lum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) do_autoexposure(gspca_dev, avg_lum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) /* JPEG quality update */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) /* This function is executed from a work queue. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) static void qual_upd(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) struct sd *sd = container_of(work, struct sd, work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) struct gspca_dev *gspca_dev = &sd->gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) s32 qual = v4l2_ctrl_g_ctrl(sd->jpegqual);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) /* To protect gspca_dev->usb_buf and gspca_dev->usb_err */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) mutex_lock(&gspca_dev->usb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) gspca_dbg(gspca_dev, D_STREAM, "qual_upd %d%%\n", qual);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) set_quality(gspca_dev, qual);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) mutex_unlock(&gspca_dev->usb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) #if IS_ENABLED(CONFIG_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) u8 *data, /* interrupt packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) int len) /* interrupt packet length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) if (!(sd->flags & HAS_NO_BUTTON) && len == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) input_sync(gspca_dev->input_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) input_sync(gspca_dev->input_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) /* check the JPEG compression */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) static void transfer_check(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) u8 *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) int new_qual, r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) new_qual = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) /* if USB error, discard the frame and decrease the quality */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) if (data[6] & 0x08) { /* USB FIFO full */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) gspca_dev->last_packet_type = DISCARD_PACKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) new_qual = -5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) /* else, compute the filling rate and a new JPEG quality */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) r = (sd->pktsz * 100) /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) (sd->npkt *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) gspca_dev->urb[0]->iso_frame_desc[0].length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) if (r >= 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) new_qual = -3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) else if (r < 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) new_qual = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) if (new_qual != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) sd->nchg += new_qual;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) if (sd->nchg < -6 || sd->nchg >= 12) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) /* Note: we are in interrupt context, so we can't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) use v4l2_ctrl_g/s_ctrl here. Access the value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) directly instead. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) s32 curqual = sd->jpegqual->cur.val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) sd->nchg = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) new_qual += curqual;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) if (new_qual < sd->jpegqual->minimum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) new_qual = sd->jpegqual->minimum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) else if (new_qual > sd->jpegqual->maximum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) new_qual = sd->jpegqual->maximum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) if (new_qual != curqual) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) sd->jpegqual->cur.val = new_qual;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) schedule_work(&sd->work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) sd->nchg = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) sd->pktsz = sd->npkt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) static void sd_pkt_scan(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) u8 *data, /* isoc packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) int len) /* iso packet length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) int avg_lum, is_jpeg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) static const u8 frame_header[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) 0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) is_jpeg = (sd->fmt & 0x03) == 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) if (len >= 64 && memcmp(data, frame_header, 6) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) avg_lum = ((data[35] >> 2) & 3) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) (data[20] << 2) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) (data[19] << 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) avg_lum += ((data[35] >> 4) & 3) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) (data[22] << 2) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) (data[21] << 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) avg_lum += ((data[35] >> 6) & 3) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) (data[24] << 2) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) (data[23] << 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) avg_lum += (data[36] & 3) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) (data[26] << 2) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) (data[25] << 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) avg_lum += ((data[36] >> 2) & 3) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) (data[28] << 2) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) (data[27] << 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) avg_lum += ((data[36] >> 4) & 3) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) (data[30] << 2) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) (data[29] << 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) avg_lum += ((data[36] >> 6) & 3) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) (data[32] << 2) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) (data[31] << 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) avg_lum += ((data[44] >> 4) & 3) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) (data[34] << 2) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) (data[33] << 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) avg_lum >>= 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) atomic_set(&sd->avg_lum, avg_lum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) if (is_jpeg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) transfer_check(gspca_dev, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) len -= 64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) if (len == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) data += 64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) if (gspca_dev->last_packet_type == LAST_PACKET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) if (is_jpeg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) gspca_frame_add(gspca_dev, FIRST_PACKET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) sd->jpeg_hdr, JPEG_HDR_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) gspca_frame_add(gspca_dev, INTER_PACKET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) data, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) gspca_frame_add(gspca_dev, FIRST_PACKET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) data, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) /* if JPEG, count the packets and their size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) if (is_jpeg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) sd->npkt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) sd->pktsz += len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) /* sub-driver description */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) static const struct sd_desc sd_desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) .name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) .config = sd_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) .init = sd_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) .init_controls = sd_init_controls,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) .isoc_init = sd_isoc_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) .start = sd_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) .stopN = sd_stopN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) .stop0 = sd_stop0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) .pkt_scan = sd_pkt_scan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) #if IS_ENABLED(CONFIG_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) .int_pkt_scan = sd_int_pkt_scan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) .dq_callback = sd_dqcallback,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) #ifdef CONFIG_VIDEO_ADV_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) .set_register = sd_dbg_s_register,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) .get_register = sd_dbg_g_register,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) .get_chip_info = sd_chip_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) #define SN9C20X(sensor, i2c_addr, flags) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) .driver_info = ((flags & 0xff) << 16) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) | (SENSOR_ ## sensor << 8) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) | (i2c_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) static const struct usb_device_id device_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) {USB_DEVICE(0x0c45, 0x6240), SN9C20X(MT9M001, 0x5d, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) {USB_DEVICE(0x0c45, 0x6242), SN9C20X(MT9M111, 0x5d, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) {USB_DEVICE(0x0c45, 0x6248), SN9C20X(OV9655, 0x30, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) {USB_DEVICE(0x0c45, 0x624c), SN9C20X(MT9M112, 0x5d, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) {USB_DEVICE(0x0c45, 0x624e), SN9C20X(SOI968, 0x30, LED_REVERSE)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) {USB_DEVICE(0x0c45, 0x624f), SN9C20X(OV9650, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) (FLIP_DETECT | HAS_NO_BUTTON))},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) {USB_DEVICE(0x0c45, 0x6251), SN9C20X(OV9650, 0x30, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) {USB_DEVICE(0x0c45, 0x6253), SN9C20X(OV9650, 0x30, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) {USB_DEVICE(0x0c45, 0x6260), SN9C20X(OV7670, 0x21, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) {USB_DEVICE(0x0c45, 0x6270), SN9C20X(MT9VPRB, 0x00, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) {USB_DEVICE(0x0c45, 0x627b), SN9C20X(OV7660, 0x21, FLIP_DETECT)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) {USB_DEVICE(0x0c45, 0x627c), SN9C20X(HV7131R, 0x11, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) {USB_DEVICE(0x0c45, 0x627f), SN9C20X(OV9650, 0x30, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) {USB_DEVICE(0x0c45, 0x6280), SN9C20X(MT9M001, 0x5d, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) {USB_DEVICE(0x0c45, 0x6282), SN9C20X(MT9M111, 0x5d, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) {USB_DEVICE(0x0c45, 0x6288), SN9C20X(OV9655, 0x30, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) {USB_DEVICE(0x0c45, 0x628c), SN9C20X(MT9M112, 0x5d, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) {USB_DEVICE(0x0c45, 0x628e), SN9C20X(SOI968, 0x30, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) {USB_DEVICE(0x0c45, 0x628f), SN9C20X(OV9650, 0x30, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) {USB_DEVICE(0x0c45, 0x62a0), SN9C20X(OV7670, 0x21, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) {USB_DEVICE(0x0c45, 0x62b0), SN9C20X(MT9VPRB, 0x00, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) {USB_DEVICE(0x0c45, 0x62b3), SN9C20X(OV9655, 0x30, LED_REVERSE)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) {USB_DEVICE(0x0c45, 0x62bb), SN9C20X(OV7660, 0x21, LED_REVERSE)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) {USB_DEVICE(0x0c45, 0x62bc), SN9C20X(HV7131R, 0x11, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) {USB_DEVICE(0x045e, 0x00f4), SN9C20X(OV9650, 0x30, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) {USB_DEVICE(0x145f, 0x013d), SN9C20X(OV7660, 0x21, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) {USB_DEVICE(0x0458, 0x7029), SN9C20X(HV7131R, 0x11, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) {USB_DEVICE(0x0458, 0x7045), SN9C20X(MT9M112, 0x5d, LED_REVERSE)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) {USB_DEVICE(0x0458, 0x704a), SN9C20X(MT9M112, 0x5d, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) {USB_DEVICE(0x0458, 0x704c), SN9C20X(MT9M112, 0x5d, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) {USB_DEVICE(0xa168, 0x0610), SN9C20X(HV7131R, 0x11, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) {USB_DEVICE(0xa168, 0x0611), SN9C20X(HV7131R, 0x11, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) {USB_DEVICE(0xa168, 0x0613), SN9C20X(HV7131R, 0x11, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) {USB_DEVICE(0xa168, 0x0618), SN9C20X(HV7131R, 0x11, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) {USB_DEVICE(0xa168, 0x0614), SN9C20X(MT9M111, 0x5d, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) {USB_DEVICE(0xa168, 0x0615), SN9C20X(MT9M111, 0x5d, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) {USB_DEVICE(0xa168, 0x0617), SN9C20X(MT9M111, 0x5d, 0)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) MODULE_DEVICE_TABLE(usb, device_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) /* -- device connect -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) static int sd_probe(struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) THIS_MODULE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) static struct usb_driver sd_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) .name = KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) .id_table = device_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) .probe = sd_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) .disconnect = gspca_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) .suspend = gspca_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) .resume = gspca_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) .reset_resume = gspca_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) module_usb_driver(sd_driver);