^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) * Connexant Cx11646 library
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2004 Michel Xhaard mxhaard@magic.fr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * V4L2 by Jean-Francois Moine <http://moinejf.free.fr>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #define MODULE_NAME "conex"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include "gspca.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define CONEX_CAM 1 /* special JPEG header */
^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) MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) MODULE_DESCRIPTION("GSPCA USB Conexant Camera Driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define QUALITY 50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) /* specific webcam descriptor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) struct sd {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) struct gspca_dev gspca_dev; /* !! must be the first item */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) struct v4l2_ctrl *brightness;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) struct v4l2_ctrl *contrast;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) struct v4l2_ctrl *sat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) u8 jpeg_hdr[JPEG_HDR_SZ];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) static const struct v4l2_pix_format vga_mode[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) {176, 144, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) .bytesperline = 176,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) .sizeimage = 176 * 144 * 3 / 8 + 590,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) .colorspace = V4L2_COLORSPACE_JPEG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) .priv = 3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) .bytesperline = 320,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) .sizeimage = 320 * 240 * 3 / 8 + 590,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) .colorspace = V4L2_COLORSPACE_JPEG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) .priv = 2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) {352, 288, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) .bytesperline = 352,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) .sizeimage = 352 * 288 * 3 / 8 + 590,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) .colorspace = V4L2_COLORSPACE_JPEG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) .priv = 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) {640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) .bytesperline = 640,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) .sizeimage = 640 * 480 * 3 / 8 + 590,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) .colorspace = V4L2_COLORSPACE_JPEG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) .priv = 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) /* the read bytes are found in gspca_dev->usb_buf */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) static void reg_r(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) __u16 index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) __u16 len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) struct usb_device *dev = gspca_dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) if (len > USB_BUF_SZ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) gspca_err(gspca_dev, "reg_r: buffer overflow\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) usb_control_msg(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) usb_rcvctrlpipe(dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) index, gspca_dev->usb_buf, len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) 500);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) gspca_dbg(gspca_dev, D_USBI, "reg read [%02x] -> %02x ..\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) index, gspca_dev->usb_buf[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) /* the bytes to write are in gspca_dev->usb_buf */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) static void reg_w_val(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) __u16 index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) __u8 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) struct usb_device *dev = gspca_dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) gspca_dev->usb_buf[0] = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) usb_control_msg(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) usb_sndctrlpipe(dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) index, gspca_dev->usb_buf, 1, 500);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) static void reg_w(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) __u16 index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) const __u8 *buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) __u16 len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) struct usb_device *dev = gspca_dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) if (len > USB_BUF_SZ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) gspca_err(gspca_dev, "reg_w: buffer overflow\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) gspca_dbg(gspca_dev, D_USBO, "reg write [%02x] = %02x..\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) index, *buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) memcpy(gspca_dev->usb_buf, buffer, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) usb_control_msg(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) usb_sndctrlpipe(dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) index, gspca_dev->usb_buf, len, 500);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) static const __u8 cx_sensor_init[][4] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) {0x88, 0x11, 0x01, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) {0x88, 0x12, 0x70, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) {0x88, 0x0f, 0x00, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) {0x88, 0x05, 0x01, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) {}
^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) static const __u8 cx11646_fw1[][3] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) {0x00, 0x02, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) {0x01, 0x43, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) {0x02, 0xA7, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) {0x03, 0x8B, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) {0x04, 0xE9, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) {0x05, 0x08, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) {0x06, 0x08, 0x05},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) {0x07, 0x07, 0x06},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) {0x08, 0xE7, 0x06},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) {0x09, 0xC6, 0x07},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) {0x0A, 0x86, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) {0x0B, 0x46, 0x09},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) {0x0C, 0x05, 0x0A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) {0x0D, 0xA5, 0x0A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) {0x0E, 0x45, 0x0B},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) {0x0F, 0xE5, 0x0B},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) {0x10, 0x85, 0x0C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) {0x11, 0x25, 0x0D},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) {0x12, 0xC4, 0x0D},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) {0x13, 0x45, 0x0E},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) {0x14, 0xE4, 0x0E},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) {0x15, 0x64, 0x0F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) {0x16, 0xE4, 0x0F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) {0x17, 0x64, 0x10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) {0x18, 0xE4, 0x10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) {0x19, 0x64, 0x11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) {0x1A, 0xE4, 0x11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) {0x1B, 0x64, 0x12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) {0x1C, 0xE3, 0x12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) {0x1D, 0x44, 0x13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) {0x1E, 0xC3, 0x13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) {0x1F, 0x24, 0x14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) {0x20, 0xA3, 0x14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) {0x21, 0x04, 0x15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) {0x22, 0x83, 0x15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) {0x23, 0xE3, 0x15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) {0x24, 0x43, 0x16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) {0x25, 0xA4, 0x16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) {0x26, 0x23, 0x17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) {0x27, 0x83, 0x17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) {0x28, 0xE3, 0x17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) {0x29, 0x43, 0x18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) {0x2A, 0xA3, 0x18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) {0x2B, 0x03, 0x19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) {0x2C, 0x63, 0x19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) {0x2D, 0xC3, 0x19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) {0x2E, 0x22, 0x1A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) {0x2F, 0x63, 0x1A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) {0x30, 0xC3, 0x1A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) {0x31, 0x23, 0x1B},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) {0x32, 0x83, 0x1B},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) {0x33, 0xE2, 0x1B},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) {0x34, 0x23, 0x1C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) {0x35, 0x83, 0x1C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) {0x36, 0xE2, 0x1C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) {0x37, 0x23, 0x1D},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) {0x38, 0x83, 0x1D},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) {0x39, 0xE2, 0x1D},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) {0x3A, 0x23, 0x1E},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) {0x3B, 0x82, 0x1E},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) {0x3C, 0xC3, 0x1E},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) {0x3D, 0x22, 0x1F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) {0x3E, 0x63, 0x1F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) {0x3F, 0xC1, 0x1F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) static void cx11646_fw(struct gspca_dev*gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) reg_w_val(gspca_dev, 0x006a, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) while (cx11646_fw1[i][1]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) reg_w(gspca_dev, 0x006b, cx11646_fw1[i], 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) reg_w_val(gspca_dev, 0x006a, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) static const __u8 cxsensor[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 0x88, 0x12, 0x70, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 0x88, 0x0d, 0x02, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 0x88, 0x0f, 0x00, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 0x88, 0x03, 0x71, 0x01, 0x88, 0x04, 0x00, 0x01, /* 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 0x88, 0x02, 0x10, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 0x88, 0x00, 0xD4, 0x01, 0x88, 0x01, 0x01, 0x01, /* 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 0x88, 0x0B, 0x00, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 0x88, 0x0A, 0x0A, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 0x88, 0x00, 0x08, 0x01, 0x88, 0x01, 0x00, 0x01, /* 8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 0x88, 0x05, 0x01, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 0xA1, 0x18, 0x00, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) static const __u8 reg20[] = { 0x10, 0x42, 0x81, 0x19, 0xd3, 0xff, 0xa7, 0xff };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) static const __u8 reg28[] = { 0x87, 0x00, 0x87, 0x00, 0x8f, 0xff, 0xea, 0xff };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) static const __u8 reg10[] = { 0xb1, 0xb1 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) static const __u8 reg71a[] = { 0x08, 0x18, 0x0a, 0x1e }; /* 640 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) static const __u8 reg71b[] = { 0x04, 0x0c, 0x05, 0x0f };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) /* 352{0x04,0x0a,0x06,0x12}; //352{0x05,0x0e,0x06,0x11}; //352 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) static const __u8 reg71c[] = { 0x02, 0x07, 0x03, 0x09 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) /* 320{0x04,0x0c,0x05,0x0f}; //320 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) static const __u8 reg71d[] = { 0x02, 0x07, 0x03, 0x09 }; /* 176 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) static const __u8 reg7b[] = { 0x00, 0xff, 0x00, 0xff, 0x00, 0xff };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) static void cx_sensor(struct gspca_dev*gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) int length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) const __u8 *ptsensor = cxsensor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) reg_w(gspca_dev, 0x0020, reg20, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) reg_w(gspca_dev, 0x0028, reg28, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) reg_w(gspca_dev, 0x0010, reg10, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) reg_w_val(gspca_dev, 0x0092, 0x03);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) switch (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) reg_w(gspca_dev, 0x0071, reg71a, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) reg_w(gspca_dev, 0x0071, reg71b, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) /* case 2: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) reg_w(gspca_dev, 0x0071, reg71c, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) reg_w(gspca_dev, 0x0071, reg71d, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) reg_w(gspca_dev, 0x007b, reg7b, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) reg_w_val(gspca_dev, 0x00f8, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) reg_w(gspca_dev, 0x0010, reg10, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) reg_w_val(gspca_dev, 0x0098, 0x41);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) for (i = 0; i < 11; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) if (i == 3 || i == 5 || i == 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) length = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) length = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) reg_w(gspca_dev, 0x00e5, ptsensor, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) if (length == 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) reg_r(gspca_dev, 0x00e8, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) reg_r(gspca_dev, 0x00e8, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) ptsensor += length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) reg_r(gspca_dev, 0x00e7, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) static const __u8 cx_inits_176[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 0x33, 0x81, 0xB0, 0x00, 0x90, 0x00, 0x0A, 0x03, /* 176x144 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 0x00, 0x03, 0x03, 0x03, 0x1B, 0x05, 0x30, 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 0x65, 0x15, 0x18, 0x25, 0x03, 0x25, 0x08, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 0x3B, 0x25, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 0xDC, 0xFF, 0xEE, 0xFF, 0xC5, 0xFF, 0xBF, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 0xF7, 0xFF, 0x88, 0xFF, 0x66, 0x02, 0x28, 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 0x1E, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) static const __u8 cx_inits_320[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 0x7f, 0x7f, 0x40, 0x01, 0xf0, 0x00, 0x02, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 0x00, 0x01, 0x01, 0x01, 0x10, 0x00, 0x02, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 0x65, 0x45, 0xfa, 0x4c, 0x2c, 0xdf, 0xb9, 0x81,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 0xe2, 0xff, 0xf1, 0xff, 0xc2, 0xff, 0xbc, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 0xf5, 0xff, 0x6d, 0xff, 0xf6, 0x01, 0x43, 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 0xd3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) static const __u8 cx_inits_352[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 0x2e, 0x7c, 0x60, 0x01, 0x20, 0x01, 0x05, 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 0x00, 0x06, 0x03, 0x06, 0x1b, 0x10, 0x05, 0x3b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 0x30, 0x25, 0x18, 0x25, 0x08, 0x30, 0x03, 0x25,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 0x3b, 0x30, 0x25, 0x1b, 0x10, 0x05, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 0xe3, 0xff, 0xf1, 0xff, 0xc2, 0xff, 0xbc, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 0xf5, 0xff, 0x6b, 0xff, 0xee, 0x01, 0x43, 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 0xe4, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) static const __u8 cx_inits_640[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 0x7e, 0x7e, 0x80, 0x02, 0xe0, 0x01, 0x01, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 0x00, 0x02, 0x01, 0x02, 0x10, 0x30, 0x01, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 0x65, 0x45, 0xf7, 0x52, 0x2c, 0xdf, 0xb9, 0x81,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 0xe2, 0xff, 0xf1, 0xff, 0xc2, 0xff, 0xbc, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 0xf6, 0xff, 0x7b, 0xff, 0x01, 0x02, 0x43, 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 0x77, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) static void cx11646_initsize(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) const __u8 *cxinit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) static const __u8 reg12[] = { 0x08, 0x05, 0x07, 0x04, 0x24 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) static const __u8 reg17[] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) { 0x0a, 0x00, 0xf2, 0x01, 0x0f, 0x00, 0x97, 0x02 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) switch (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) cxinit = cx_inits_640;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) cxinit = cx_inits_352;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) /* case 2: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) cxinit = cx_inits_320;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) cxinit = cx_inits_176;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) reg_w_val(gspca_dev, 0x009a, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) reg_w_val(gspca_dev, 0x0010, 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) reg_w(gspca_dev, 0x0012, reg12, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) reg_w(gspca_dev, 0x0017, reg17, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) reg_w_val(gspca_dev, 0x00c0, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) reg_w_val(gspca_dev, 0x00c1, 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) reg_w_val(gspca_dev, 0x00c2, 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) reg_w(gspca_dev, 0x0061, cxinit, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) cxinit += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) reg_w(gspca_dev, 0x00ca, cxinit, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) cxinit += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) reg_w(gspca_dev, 0x00d2, cxinit, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) cxinit += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) reg_w(gspca_dev, 0x00da, cxinit, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) cxinit += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) reg_w(gspca_dev, 0x0041, cxinit, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) cxinit += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) reg_w(gspca_dev, 0x0049, cxinit, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) cxinit += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) reg_w(gspca_dev, 0x0051, cxinit, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) reg_r(gspca_dev, 0x0010, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) static const __u8 cx_jpeg_init[][8] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) {0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x15}, /* 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) {0x0f, 0x10, 0x12, 0x10, 0x0d, 0x15, 0x12, 0x11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) {0x12, 0x18, 0x16, 0x15, 0x19, 0x20, 0x35, 0x22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) {0x20, 0x1d, 0x1d, 0x20, 0x41, 0x2e, 0x31, 0x26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) {0x35, 0x4d, 0x43, 0x51, 0x4f, 0x4b, 0x43, 0x4a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) {0x49, 0x55, 0x5F, 0x79, 0x67, 0x55, 0x5A, 0x73},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) {0x5B, 0x49, 0x4A, 0x6A, 0x90, 0x6B, 0x73, 0x7D},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) {0x81, 0x88, 0x89, 0x88, 0x52, 0x66, 0x95, 0xA0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) {0x94, 0x84, 0x9E, 0x79, 0x85, 0x88, 0x83, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) {0x15, 0x0F, 0x10, 0x12, 0x10, 0x0D, 0x15, 0x12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) {0x11, 0x12, 0x18, 0x16, 0x15, 0x19, 0x20, 0x35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) {0x22, 0x20, 0x1D, 0x1D, 0x20, 0x41, 0x2E, 0x31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) {0x26, 0x35, 0x4D, 0x43, 0x51, 0x4F, 0x4B, 0x43},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) {0x4A, 0x49, 0x55, 0x5F, 0x79, 0x67, 0x55, 0x5A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) {0x73, 0x5B, 0x49, 0x4A, 0x6A, 0x90, 0x6B, 0x73},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) {0x7D, 0x81, 0x88, 0x89, 0x88, 0x52, 0x66, 0x95},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) {0xA0, 0x94, 0x84, 0x9E, 0x79, 0x85, 0x88, 0x83},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) {0xFF, 0xC4, 0x01, 0xA2, 0x00, 0x00, 0x01, 0x05},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) {0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) {0x0B, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) {0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) {0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) {0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x10, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) {0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) {0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) {0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) {0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) {0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08, 0x23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) {0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) {0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) {0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) {0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) {0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) {0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) {0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) {0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) {0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) {0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) {0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) {0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) {0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) {0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) {0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 0xE3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) {0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) {0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) {0xFA, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) {0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) {0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) {0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) {0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) {0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) {0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) {0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) {0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) {0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) {0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) {0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) {0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) {0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) {0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) {0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) {0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) {0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) {0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) {0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) {0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) {0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) {0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0x20, 0x00, 0x1F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) {0x02, 0x0C, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) {0x00, 0x00, 0x11, 0x00, 0x11, 0x22, 0x00, 0x22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) {0x22, 0x11, 0x22, 0x22, 0x11, 0x33, 0x33, 0x11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) {0x44, 0x66, 0x22, 0x55, 0x66, 0xFF, 0xDD, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) {0x04, 0x00, 0x14, 0xFF, 0xC0, 0x00, 0x11, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) {0x00, 0xF0, 0x01, 0x40, 0x03, 0x00, 0x21, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) {0x01, 0x11, 0x01, 0x02, 0x11, 0x01, 0xFF, 0xDA},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) {0x00, 0x0C, 0x03, 0x00, 0x00, 0x01, 0x11, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) {0x11, 0x00, 0x3F, 0x00, 0xFF, 0xD9, 0x00, 0x00} /* 79 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) static const __u8 cxjpeg_640[][8] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) {0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x10}, /* 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) {0x0b, 0x0c, 0x0e, 0x0c, 0x0a, 0x10, 0x0e, 0x0d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) {0x0e, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28, 0x1a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) {0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25, 0x1d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) {0x28, 0x3a, 0x33, 0x3D, 0x3C, 0x39, 0x33, 0x38},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) {0x37, 0x40, 0x48, 0x5C, 0x4E, 0x40, 0x44, 0x57},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) {0x45, 0x37, 0x38, 0x50, 0x6D, 0x51, 0x57, 0x5F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) {0x62, 0x67, 0x68, 0x67, 0x3E, 0x4D, 0x71, 0x79},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) {0x70, 0x64, 0x78, 0x5C, 0x65, 0x67, 0x63, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) {0x10, 0x0B, 0x0C, 0x0E, 0x0C, 0x0A, 0x10, 0x0E},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) {0x0D, 0x0E, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) {0x1A, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) {0x1D, 0x28, 0x3A, 0x33, 0x3D, 0x3C, 0x39, 0x33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) {0x38, 0x37, 0x40, 0x48, 0x5C, 0x4E, 0x40, 0x44},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) {0x57, 0x45, 0x37, 0x38, 0x50, 0x6D, 0x51, 0x57},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) {0x5F, 0x62, 0x67, 0x68, 0x67, 0x3E, 0x4D, 0x71},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) {0x79, 0x70, 0x64, 0x78, 0x5C, 0x65, 0x67, 0x63},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) {0xFF, 0x20, 0x00, 0x1F, 0x00, 0x83, 0x00, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) {0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) {0x11, 0x22, 0x00, 0x22, 0x22, 0x11, 0x22, 0x22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) {0x11, 0x33, 0x33, 0x11, 0x44, 0x66, 0x22, 0x55},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) {0x66, 0xFF, 0xDD, 0x00, 0x04, 0x00, 0x28, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) {0xC0, 0x00, 0x11, 0x08, 0x01, 0xE0, 0x02, 0x80},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) {0x03, 0x00, 0x21, 0x00, 0x01, 0x11, 0x01, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) {0x11, 0x01, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) {0x00, 0x01, 0x11, 0x02, 0x11, 0x00, 0x3F, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) {0xFF, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} /* 27 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) static const __u8 cxjpeg_352[][8] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) {0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x0d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) {0x09, 0x09, 0x0b, 0x09, 0x08, 0x0D, 0x0b, 0x0a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) {0x0b, 0x0e, 0x0d, 0x0d, 0x0f, 0x13, 0x1f, 0x14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) {0x13, 0x11, 0x11, 0x13, 0x26, 0x1b, 0x1d, 0x17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) {0x1F, 0x2D, 0x28, 0x30, 0x2F, 0x2D, 0x28, 0x2C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) {0x2B, 0x32, 0x38, 0x48, 0x3D, 0x32, 0x35, 0x44},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) {0x36, 0x2B, 0x2C, 0x3F, 0x55, 0x3F, 0x44, 0x4A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) {0x4D, 0x50, 0x51, 0x50, 0x30, 0x3C, 0x58, 0x5F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) {0x58, 0x4E, 0x5E, 0x48, 0x4F, 0x50, 0x4D, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) {0x0D, 0x09, 0x09, 0x0B, 0x09, 0x08, 0x0D, 0x0B},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) {0x0A, 0x0B, 0x0E, 0x0D, 0x0D, 0x0F, 0x13, 0x1F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) {0x14, 0x13, 0x11, 0x11, 0x13, 0x26, 0x1B, 0x1D},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) {0x17, 0x1F, 0x2D, 0x28, 0x30, 0x2F, 0x2D, 0x28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) {0x2C, 0x2B, 0x32, 0x38, 0x48, 0x3D, 0x32, 0x35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) {0x44, 0x36, 0x2B, 0x2C, 0x3F, 0x55, 0x3F, 0x44},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) {0x4A, 0x4D, 0x50, 0x51, 0x50, 0x30, 0x3C, 0x58},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) {0x5F, 0x58, 0x4E, 0x5E, 0x48, 0x4F, 0x50, 0x4D},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) {0xFF, 0x20, 0x00, 0x1F, 0x01, 0x83, 0x00, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) {0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) {0x11, 0x22, 0x00, 0x22, 0x22, 0x11, 0x22, 0x22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) {0x11, 0x33, 0x33, 0x11, 0x44, 0x66, 0x22, 0x55},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) {0x66, 0xFF, 0xDD, 0x00, 0x04, 0x00, 0x16, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) {0xC0, 0x00, 0x11, 0x08, 0x01, 0x20, 0x01, 0x60},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) {0x03, 0x00, 0x21, 0x00, 0x01, 0x11, 0x01, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) {0x11, 0x01, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) {0x00, 0x01, 0x11, 0x02, 0x11, 0x00, 0x3F, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) {0xFF, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) static const __u8 cxjpeg_320[][8] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) {0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x05},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) {0x03, 0x04, 0x04, 0x04, 0x03, 0x05, 0x04, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) {0x04, 0x05, 0x05, 0x05, 0x06, 0x07, 0x0c, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) {0x07, 0x07, 0x07, 0x07, 0x0f, 0x0b, 0x0b, 0x09},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) {0x0C, 0x11, 0x0F, 0x12, 0x12, 0x11, 0x0f, 0x11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) {0x11, 0x13, 0x16, 0x1C, 0x17, 0x13, 0x14, 0x1A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) {0x15, 0x11, 0x11, 0x18, 0x21, 0x18, 0x1A, 0x1D},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) {0x1D, 0x1F, 0x1F, 0x1F, 0x13, 0x17, 0x22, 0x24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) {0x22, 0x1E, 0x24, 0x1C, 0x1E, 0x1F, 0x1E, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) {0x05, 0x03, 0x04, 0x04, 0x04, 0x03, 0x05, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) {0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x07, 0x0C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) {0x08, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0B, 0x0B},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) {0x09, 0x0C, 0x11, 0x0F, 0x12, 0x12, 0x11, 0x0F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) {0x11, 0x11, 0x13, 0x16, 0x1C, 0x17, 0x13, 0x14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) {0x1A, 0x15, 0x11, 0x11, 0x18, 0x21, 0x18, 0x1A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) {0x1D, 0x1D, 0x1F, 0x1F, 0x1F, 0x13, 0x17, 0x22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) {0x24, 0x22, 0x1E, 0x24, 0x1C, 0x1E, 0x1F, 0x1E},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) {0xFF, 0x20, 0x00, 0x1F, 0x02, 0x0C, 0x00, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) {0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) {0x11, 0x22, 0x00, 0x22, 0x22, 0x11, 0x22, 0x22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) {0x11, 0x33, 0x33, 0x11, 0x44, 0x66, 0x22, 0x55},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) {0x66, 0xFF, 0xDD, 0x00, 0x04, 0x00, 0x14, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) {0xC0, 0x00, 0x11, 0x08, 0x00, 0xF0, 0x01, 0x40},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) {0x03, 0x00, 0x21, 0x00, 0x01, 0x11, 0x01, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) {0x11, 0x01, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) {0x00, 0x01, 0x11, 0x02, 0x11, 0x00, 0x3F, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) {0xFF, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} /* 27 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) static const __u8 cxjpeg_176[][8] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) {0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x0d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) {0x09, 0x09, 0x0B, 0x09, 0x08, 0x0D, 0x0B, 0x0A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) {0x0B, 0x0E, 0x0D, 0x0D, 0x0F, 0x13, 0x1F, 0x14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) {0x13, 0x11, 0x11, 0x13, 0x26, 0x1B, 0x1D, 0x17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) {0x1F, 0x2D, 0x28, 0x30, 0x2F, 0x2D, 0x28, 0x2C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) {0x2B, 0x32, 0x38, 0x48, 0x3D, 0x32, 0x35, 0x44},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) {0x36, 0x2B, 0x2C, 0x3F, 0x55, 0x3F, 0x44, 0x4A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) {0x4D, 0x50, 0x51, 0x50, 0x30, 0x3C, 0x58, 0x5F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) {0x58, 0x4E, 0x5E, 0x48, 0x4F, 0x50, 0x4D, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) {0x0D, 0x09, 0x09, 0x0B, 0x09, 0x08, 0x0D, 0x0B},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) {0x0A, 0x0B, 0x0E, 0x0D, 0x0D, 0x0F, 0x13, 0x1F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) {0x14, 0x13, 0x11, 0x11, 0x13, 0x26, 0x1B, 0x1D},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) {0x17, 0x1F, 0x2D, 0x28, 0x30, 0x2F, 0x2D, 0x28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) {0x2C, 0x2B, 0x32, 0x38, 0x48, 0x3D, 0x32, 0x35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) {0x44, 0x36, 0x2B, 0x2C, 0x3F, 0x55, 0x3F, 0x44},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) {0x4A, 0x4D, 0x50, 0x51, 0x50, 0x30, 0x3C, 0x58},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) {0x5F, 0x58, 0x4E, 0x5E, 0x48, 0x4F, 0x50, 0x4D},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) {0xFF, 0x20, 0x00, 0x1F, 0x03, 0xA1, 0x00, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) {0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) {0x11, 0x22, 0x00, 0x22, 0x22, 0x11, 0x22, 0x22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) {0x11, 0x33, 0x33, 0x11, 0x44, 0x66, 0x22, 0x55},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) {0x66, 0xFF, 0xDD, 0x00, 0x04, 0x00, 0x0B, 0xFF},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) {0xC0, 0x00, 0x11, 0x08, 0x00, 0x90, 0x00, 0xB0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) {0x03, 0x00, 0x21, 0x00, 0x01, 0x11, 0x01, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) {0x11, 0x01, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) {0x00, 0x01, 0x11, 0x02, 0x11, 0x00, 0x3F, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) {0xFF, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) /* 640 take with the zcx30x part */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) static const __u8 cxjpeg_qtable[][8] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) {0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x08},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) {0x06, 0x06, 0x07, 0x06, 0x05, 0x08, 0x07, 0x07},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) {0x07, 0x09, 0x09, 0x08, 0x0a, 0x0c, 0x14, 0x0a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) {0x0c, 0x0b, 0x0b, 0x0c, 0x19, 0x12, 0x13, 0x0f},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) {0x14, 0x1d, 0x1a, 0x1f, 0x1e, 0x1d, 0x1a, 0x1c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) {0x1c, 0x20, 0x24, 0x2e, 0x27, 0x20, 0x22, 0x2c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) {0x23, 0x1c, 0x1c, 0x28, 0x37, 0x29, 0x2c, 0x30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) {0x31, 0x34, 0x34, 0x34, 0x1f, 0x27, 0x39, 0x3d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) {0x38, 0x32, 0x3c, 0x2e, 0x33, 0x34, 0x32, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) {0x09, 0x09, 0x09, 0x0c, 0x0b, 0x0c, 0x18, 0x0a},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) {0x0a, 0x18, 0x32, 0x21, 0x1c, 0x21, 0x32, 0x32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) {0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) {0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) {0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) {0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) {0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) {0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) {0xFF, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} /* 18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) static void cx11646_jpegInit(struct gspca_dev*gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) int length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) reg_w_val(gspca_dev, 0x00c0, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) reg_w_val(gspca_dev, 0x00c3, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) reg_w_val(gspca_dev, 0x00c0, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) reg_r(gspca_dev, 0x0001, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) length = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) for (i = 0; i < 79; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) if (i == 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) length = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) reg_w(gspca_dev, 0x0008, cx_jpeg_init[i], length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) reg_r(gspca_dev, 0x0002, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) reg_w_val(gspca_dev, 0x0055, 0x14);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) static const __u8 reg12[] = { 0x0a, 0x05, 0x07, 0x04, 0x19 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) static const __u8 regE5_8[] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) { 0x88, 0x00, 0xd4, 0x01, 0x88, 0x01, 0x01, 0x01 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) static const __u8 regE5a[] = { 0x88, 0x0a, 0x0c, 0x01 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) static const __u8 regE5b[] = { 0x88, 0x0b, 0x12, 0x01 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) static const __u8 regE5c[] = { 0x88, 0x05, 0x01, 0x01 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) static const __u8 reg51[] = { 0x77, 0x03 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) #define reg70 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) static void cx11646_jpeg(struct gspca_dev*gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) int length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) __u8 Reg55;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) int retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) reg_w_val(gspca_dev, 0x00c0, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) reg_w_val(gspca_dev, 0x00c3, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) reg_w_val(gspca_dev, 0x00c0, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) reg_r(gspca_dev, 0x0001, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) length = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) switch (gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) for (i = 0; i < 27; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) if (i == 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) length = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) reg_w(gspca_dev, 0x0008, cxjpeg_640[i], length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) Reg55 = 0x28;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) for (i = 0; i < 27; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) if (i == 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) length = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) reg_w(gspca_dev, 0x0008, cxjpeg_352[i], length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) Reg55 = 0x16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) /* case 2: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) for (i = 0; i < 27; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) if (i == 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) length = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) reg_w(gspca_dev, 0x0008, cxjpeg_320[i], length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) Reg55 = 0x14;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) for (i = 0; i < 27; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) if (i == 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) length = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) reg_w(gspca_dev, 0x0008, cxjpeg_176[i], length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) Reg55 = 0x0B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) reg_r(gspca_dev, 0x0002, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) reg_w_val(gspca_dev, 0x0055, Reg55);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) reg_r(gspca_dev, 0x0002, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) reg_w(gspca_dev, 0x0010, reg10, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) reg_w_val(gspca_dev, 0x0054, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) reg_w_val(gspca_dev, 0x0054, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) reg_w_val(gspca_dev, 0x0000, 0x94);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) reg_w_val(gspca_dev, 0x0053, 0xc0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) reg_w_val(gspca_dev, 0x00fc, 0xe1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) reg_w_val(gspca_dev, 0x0000, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) /* wait for completion */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) retry = 50;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) reg_r(gspca_dev, 0x0002, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) /* 0x07 until 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) if (gspca_dev->usb_buf[0] == 0x00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) reg_w_val(gspca_dev, 0x0053, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) } while (--retry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) if (retry == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) gspca_err(gspca_dev, "Damned Errors sending jpeg Table\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) /* send the qtable now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) reg_r(gspca_dev, 0x0001, 1); /* -> 0x18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) length = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) for (i = 0; i < 18; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) if (i == 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) length = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) reg_w(gspca_dev, 0x0008, cxjpeg_qtable[i], length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) reg_r(gspca_dev, 0x0002, 1); /* 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) reg_r(gspca_dev, 0x0053, 1); /* 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) reg_w_val(gspca_dev, 0x0054, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) reg_w_val(gspca_dev, 0x0054, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) reg_w_val(gspca_dev, 0x0000, 0x94);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) reg_w_val(gspca_dev, 0x0053, 0xc0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) reg_r(gspca_dev, 0x0038, 1); /* 0x40 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) reg_r(gspca_dev, 0x0038, 1); /* 0x40 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) reg_r(gspca_dev, 0x001f, 1); /* 0x38 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) reg_w(gspca_dev, 0x0012, reg12, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) reg_w(gspca_dev, 0x00e5, regE5_8, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) reg_r(gspca_dev, 0x00e8, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) reg_w(gspca_dev, 0x00e5, regE5a, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) reg_r(gspca_dev, 0x00e8, 1); /* 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) reg_w_val(gspca_dev, 0x009a, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) reg_w(gspca_dev, 0x00e5, regE5b, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) reg_r(gspca_dev, 0x00e8, 1); /* 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) reg_w(gspca_dev, 0x00e5, regE5c, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) reg_r(gspca_dev, 0x00e8, 1); /* 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) reg_w(gspca_dev, 0x0051, reg51, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) reg_w(gspca_dev, 0x0010, reg10, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) reg_w_val(gspca_dev, 0x0070, reg70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) static void cx11646_init1(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) reg_w_val(gspca_dev, 0x0010, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) reg_w_val(gspca_dev, 0x0053, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) reg_w_val(gspca_dev, 0x0052, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) reg_w_val(gspca_dev, 0x009b, 0x2f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) reg_w_val(gspca_dev, 0x009c, 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) reg_r(gspca_dev, 0x0098, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) reg_w_val(gspca_dev, 0x0098, 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) reg_r(gspca_dev, 0x0099, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) reg_w_val(gspca_dev, 0x0099, 0x07);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) reg_w_val(gspca_dev, 0x0039, 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) reg_w_val(gspca_dev, 0x003c, 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) reg_w_val(gspca_dev, 0x003f, 0x1f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) reg_w_val(gspca_dev, 0x003d, 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) /* reg_w_val(gspca_dev, 0x003d, 0x60); */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) reg_r(gspca_dev, 0x0099, 1); /* ->0x07 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) while (cx_sensor_init[i][0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) reg_w_val(gspca_dev, 0x00e5, cx_sensor_init[i][0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) reg_r(gspca_dev, 0x00e8, 1); /* -> 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) if (i == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) reg_w_val(gspca_dev, 0x00ed, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) reg_r(gspca_dev, 0x00ed, 1); /* -> 0x01 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) reg_w_val(gspca_dev, 0x00c3, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) /* this function is called at probe time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) static int sd_config(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) struct cam *cam;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) cam = &gspca_dev->cam;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) cam->cam_mode = vga_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) cam->nmodes = ARRAY_SIZE(vga_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) /* this function is called at probe and resume time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) static int sd_init(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) cx11646_init1(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) cx11646_initsize(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) cx11646_fw(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) cx_sensor(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) cx11646_jpegInit(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) static int sd_start(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) /* create the JPEG header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) gspca_dev->pixfmt.width,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) 0x22); /* JPEG 411 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) jpeg_set_qual(sd->jpeg_hdr, QUALITY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) cx11646_initsize(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) cx11646_fw(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) cx_sensor(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) cx11646_jpeg(gspca_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) /* called on streamoff with alt 0 and on disconnect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) static void sd_stop0(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) int retry = 50;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) if (!gspca_dev->present)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) reg_w_val(gspca_dev, 0x0000, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) reg_r(gspca_dev, 0x0002, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) reg_w_val(gspca_dev, 0x0053, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) while (retry--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) /* reg_r(gspca_dev, 0x0002, 1);*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) reg_r(gspca_dev, 0x0053, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) if (gspca_dev->usb_buf[0] == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) reg_w_val(gspca_dev, 0x0000, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) reg_r(gspca_dev, 0x0002, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) reg_w_val(gspca_dev, 0x0010, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) reg_r(gspca_dev, 0x0033, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) reg_w_val(gspca_dev, 0x00fc, 0xe0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) static void sd_pkt_scan(struct gspca_dev *gspca_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) u8 *data, /* isoc packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) int len) /* iso packet length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) struct sd *sd = (struct sd *) gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) if (data[0] == 0xff && data[1] == 0xd8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) /* start of frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) /* put the JPEG header in the new frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) gspca_frame_add(gspca_dev, FIRST_PACKET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) sd->jpeg_hdr, JPEG_HDR_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) data += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) len -= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) static void setbrightness(struct gspca_dev *gspca_dev, s32 val, s32 sat)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) __u8 regE5cbx[] = { 0x88, 0x00, 0xd4, 0x01, 0x88, 0x01, 0x01, 0x01 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) __u8 reg51c[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) regE5cbx[2] = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) reg_w(gspca_dev, 0x00e5, regE5cbx, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) reg_r(gspca_dev, 0x00e8, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) reg_w(gspca_dev, 0x00e5, regE5c, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) reg_r(gspca_dev, 0x00e8, 1); /* 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) reg51c[0] = 0x77;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) reg51c[1] = sat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) reg_w(gspca_dev, 0x0051, reg51c, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) reg_w(gspca_dev, 0x0010, reg10, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) reg_w_val(gspca_dev, 0x0070, reg70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) static void setcontrast(struct gspca_dev *gspca_dev, s32 val, s32 sat)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) __u8 regE5acx[] = { 0x88, 0x0a, 0x0c, 0x01 }; /* seem MSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) /* __u8 regE5bcx[] = { 0x88, 0x0b, 0x12, 0x01}; * LSB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) __u8 reg51c[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) regE5acx[2] = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) reg_w(gspca_dev, 0x00e5, regE5acx, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) reg_r(gspca_dev, 0x00e8, 1); /* 0x00 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) reg51c[0] = 0x77;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) reg51c[1] = sat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) reg_w(gspca_dev, 0x0051, reg51c, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) reg_w(gspca_dev, 0x0010, reg10, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) reg_w_val(gspca_dev, 0x0070, reg70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) struct gspca_dev *gspca_dev =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) struct sd *sd = (struct sd *)gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) gspca_dev->usb_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) if (!gspca_dev->streaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) switch (ctrl->id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) case V4L2_CID_BRIGHTNESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) setbrightness(gspca_dev, ctrl->val, sd->sat->cur.val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) case V4L2_CID_CONTRAST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) setcontrast(gspca_dev, ctrl->val, sd->sat->cur.val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) case V4L2_CID_SATURATION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) setbrightness(gspca_dev, sd->brightness->cur.val, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) setcontrast(gspca_dev, sd->contrast->cur.val, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) return gspca_dev->usb_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) static const struct v4l2_ctrl_ops sd_ctrl_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) .s_ctrl = sd_s_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) static int sd_init_controls(struct gspca_dev *gspca_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) struct sd *sd = (struct sd *)gspca_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) gspca_dev->vdev.ctrl_handler = hdl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) v4l2_ctrl_handler_init(hdl, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) sd->brightness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) V4L2_CID_BRIGHTNESS, 0, 255, 1, 0xd4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) sd->contrast = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) V4L2_CID_CONTRAST, 0x0a, 0x1f, 1, 0x0c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) sd->sat = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) V4L2_CID_SATURATION, 0, 7, 1, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) if (hdl->error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) pr_err("Could not initialize controls\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) return hdl->error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) /* sub-driver description */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) static const struct sd_desc sd_desc = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) .name = MODULE_NAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) .config = sd_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) .init = sd_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) .init_controls = sd_init_controls,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) .start = sd_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) .stop0 = sd_stop0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) .pkt_scan = sd_pkt_scan,
^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) /* -- module initialisation -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) static const struct usb_device_id device_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) {USB_DEVICE(0x0572, 0x0041)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) MODULE_DEVICE_TABLE(usb, device_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) /* -- device connect -- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) static int sd_probe(struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) THIS_MODULE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) static struct usb_driver sd_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) .name = MODULE_NAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) .id_table = device_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) .probe = sd_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) .disconnect = gspca_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) .suspend = gspca_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) .resume = gspca_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) .reset_resume = gspca_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) module_usb_driver(sd_driver);