162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * SPCA508 chip based cameras subdriver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2009 Jean-Francois Moine <http://moinejf.free.fr> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#define MODULE_NAME "spca508" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include "gspca.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ciMODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); 1562306a36Sopenharmony_ciMODULE_DESCRIPTION("GSPCA/SPCA508 USB Camera Driver"); 1662306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci/* specific webcam descriptor */ 1962306a36Sopenharmony_cistruct sd { 2062306a36Sopenharmony_ci struct gspca_dev gspca_dev; /* !! must be the first item */ 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci u8 subtype; 2362306a36Sopenharmony_ci#define CreativeVista 0 2462306a36Sopenharmony_ci#define HamaUSBSightcam 1 2562306a36Sopenharmony_ci#define HamaUSBSightcam2 2 2662306a36Sopenharmony_ci#define IntelEasyPCCamera 3 2762306a36Sopenharmony_ci#define MicroInnovationIC200 4 2862306a36Sopenharmony_ci#define ViewQuestVQ110 5 2962306a36Sopenharmony_ci}; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cistatic const struct v4l2_pix_format sif_mode[] = { 3262306a36Sopenharmony_ci {160, 120, V4L2_PIX_FMT_SPCA508, V4L2_FIELD_NONE, 3362306a36Sopenharmony_ci .bytesperline = 160, 3462306a36Sopenharmony_ci .sizeimage = 160 * 120 * 3 / 2, 3562306a36Sopenharmony_ci .colorspace = V4L2_COLORSPACE_SRGB, 3662306a36Sopenharmony_ci .priv = 3}, 3762306a36Sopenharmony_ci {176, 144, V4L2_PIX_FMT_SPCA508, V4L2_FIELD_NONE, 3862306a36Sopenharmony_ci .bytesperline = 176, 3962306a36Sopenharmony_ci .sizeimage = 176 * 144 * 3 / 2, 4062306a36Sopenharmony_ci .colorspace = V4L2_COLORSPACE_SRGB, 4162306a36Sopenharmony_ci .priv = 2}, 4262306a36Sopenharmony_ci {320, 240, V4L2_PIX_FMT_SPCA508, V4L2_FIELD_NONE, 4362306a36Sopenharmony_ci .bytesperline = 320, 4462306a36Sopenharmony_ci .sizeimage = 320 * 240 * 3 / 2, 4562306a36Sopenharmony_ci .colorspace = V4L2_COLORSPACE_SRGB, 4662306a36Sopenharmony_ci .priv = 1}, 4762306a36Sopenharmony_ci {352, 288, V4L2_PIX_FMT_SPCA508, V4L2_FIELD_NONE, 4862306a36Sopenharmony_ci .bytesperline = 352, 4962306a36Sopenharmony_ci .sizeimage = 352 * 288 * 3 / 2, 5062306a36Sopenharmony_ci .colorspace = V4L2_COLORSPACE_SRGB, 5162306a36Sopenharmony_ci .priv = 0}, 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* Frame packet header offsets for the spca508 */ 5562306a36Sopenharmony_ci#define SPCA508_OFFSET_DATA 37 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci/* 5862306a36Sopenharmony_ci * Initialization data: this is the first set-up data written to the 5962306a36Sopenharmony_ci * device (before the open data). 6062306a36Sopenharmony_ci */ 6162306a36Sopenharmony_cistatic const u16 spca508_init_data[][2] = { 6262306a36Sopenharmony_ci {0x0000, 0x870b}, 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci {0x0020, 0x8112}, /* Video drop enable, ISO streaming disable */ 6562306a36Sopenharmony_ci {0x0003, 0x8111}, /* Reset compression & memory */ 6662306a36Sopenharmony_ci {0x0000, 0x8110}, /* Disable all outputs */ 6762306a36Sopenharmony_ci /* READ {0x0000, 0x8114} -> 0000: 00 */ 6862306a36Sopenharmony_ci {0x0000, 0x8114}, /* SW GPIO data */ 6962306a36Sopenharmony_ci {0x0008, 0x8110}, /* Enable charge pump output */ 7062306a36Sopenharmony_ci {0x0002, 0x8116}, /* 200 kHz pump clock */ 7162306a36Sopenharmony_ci /* UNKNOWN DIRECTION (URB_FUNCTION_SELECT_INTERFACE:) */ 7262306a36Sopenharmony_ci {0x0003, 0x8111}, /* Reset compression & memory */ 7362306a36Sopenharmony_ci {0x0000, 0x8111}, /* Normal mode (not reset) */ 7462306a36Sopenharmony_ci {0x0098, 0x8110}, 7562306a36Sopenharmony_ci /* Enable charge pump output, sync.serial,external 2x clock */ 7662306a36Sopenharmony_ci {0x000d, 0x8114}, /* SW GPIO data */ 7762306a36Sopenharmony_ci {0x0002, 0x8116}, /* 200 kHz pump clock */ 7862306a36Sopenharmony_ci {0x0020, 0x8112}, /* Video drop enable, ISO streaming disable */ 7962306a36Sopenharmony_ci/* --------------------------------------- */ 8062306a36Sopenharmony_ci {0x000f, 0x8402}, /* memory bank */ 8162306a36Sopenharmony_ci {0x0000, 0x8403}, /* ... address */ 8262306a36Sopenharmony_ci/* --------------------------------------- */ 8362306a36Sopenharmony_ci/* 0x88__ is Synchronous Serial Interface. */ 8462306a36Sopenharmony_ci/* TBD: This table could be expressed more compactly */ 8562306a36Sopenharmony_ci/* using spca508_write_i2c_vector(). */ 8662306a36Sopenharmony_ci/* TBD: Should see if the values in spca50x_i2c_data */ 8762306a36Sopenharmony_ci/* would work with the VQ110 instead of the values */ 8862306a36Sopenharmony_ci/* below. */ 8962306a36Sopenharmony_ci {0x00c0, 0x8804}, /* SSI slave addr */ 9062306a36Sopenharmony_ci {0x0008, 0x8802}, /* 375 Khz SSI clock */ 9162306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 9262306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 9362306a36Sopenharmony_ci {0x0008, 0x8802}, /* 375 Khz SSI clock */ 9462306a36Sopenharmony_ci {0x0012, 0x8801}, /* SSI reg addr */ 9562306a36Sopenharmony_ci {0x0080, 0x8800}, /* SSI data to write */ 9662306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 9762306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 9862306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 9962306a36Sopenharmony_ci {0x0008, 0x8802}, /* 375 Khz SSI clock */ 10062306a36Sopenharmony_ci {0x0012, 0x8801}, /* SSI reg addr */ 10162306a36Sopenharmony_ci {0x0000, 0x8800}, /* SSI data to write */ 10262306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 10362306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 10462306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 10562306a36Sopenharmony_ci {0x0008, 0x8802}, /* 375 Khz SSI clock */ 10662306a36Sopenharmony_ci {0x0011, 0x8801}, /* SSI reg addr */ 10762306a36Sopenharmony_ci {0x0040, 0x8800}, /* SSI data to write */ 10862306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 10962306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 11062306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 11162306a36Sopenharmony_ci {0x0008, 0x8802}, 11262306a36Sopenharmony_ci {0x0013, 0x8801}, 11362306a36Sopenharmony_ci {0x0000, 0x8800}, 11462306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 11562306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 11662306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 11762306a36Sopenharmony_ci {0x0008, 0x8802}, 11862306a36Sopenharmony_ci {0x0014, 0x8801}, 11962306a36Sopenharmony_ci {0x0000, 0x8800}, 12062306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 12162306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 12262306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 12362306a36Sopenharmony_ci {0x0008, 0x8802}, 12462306a36Sopenharmony_ci {0x0015, 0x8801}, 12562306a36Sopenharmony_ci {0x0001, 0x8800}, 12662306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 12762306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 12862306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 12962306a36Sopenharmony_ci {0x0008, 0x8802}, 13062306a36Sopenharmony_ci {0x0016, 0x8801}, 13162306a36Sopenharmony_ci {0x0003, 0x8800}, 13262306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 13362306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 13462306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 13562306a36Sopenharmony_ci {0x0008, 0x8802}, 13662306a36Sopenharmony_ci {0x0017, 0x8801}, 13762306a36Sopenharmony_ci {0x0036, 0x8800}, 13862306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 13962306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 14062306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 14162306a36Sopenharmony_ci {0x0008, 0x8802}, 14262306a36Sopenharmony_ci {0x0018, 0x8801}, 14362306a36Sopenharmony_ci {0x00ec, 0x8800}, 14462306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 14562306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 14662306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 14762306a36Sopenharmony_ci {0x0008, 0x8802}, 14862306a36Sopenharmony_ci {0x001a, 0x8801}, 14962306a36Sopenharmony_ci {0x0094, 0x8800}, 15062306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 15162306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 15262306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 15362306a36Sopenharmony_ci {0x0008, 0x8802}, 15462306a36Sopenharmony_ci {0x001b, 0x8801}, 15562306a36Sopenharmony_ci {0x0000, 0x8800}, 15662306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 15762306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 15862306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 15962306a36Sopenharmony_ci {0x0008, 0x8802}, 16062306a36Sopenharmony_ci {0x0027, 0x8801}, 16162306a36Sopenharmony_ci {0x00a2, 0x8800}, 16262306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 16362306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 16462306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 16562306a36Sopenharmony_ci {0x0008, 0x8802}, 16662306a36Sopenharmony_ci {0x0028, 0x8801}, 16762306a36Sopenharmony_ci {0x0040, 0x8800}, 16862306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 16962306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 17062306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 17162306a36Sopenharmony_ci {0x0008, 0x8802}, 17262306a36Sopenharmony_ci {0x002a, 0x8801}, 17362306a36Sopenharmony_ci {0x0084, 0x8800}, 17462306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 17562306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 17662306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 17762306a36Sopenharmony_ci {0x0008, 0x8802}, 17862306a36Sopenharmony_ci {0x002b, 0x8801}, 17962306a36Sopenharmony_ci {0x00a8, 0x8800}, 18062306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 18162306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 18262306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 18362306a36Sopenharmony_ci {0x0008, 0x8802}, 18462306a36Sopenharmony_ci {0x002c, 0x8801}, 18562306a36Sopenharmony_ci {0x00fe, 0x8800}, 18662306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 18762306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 18862306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 18962306a36Sopenharmony_ci {0x0008, 0x8802}, 19062306a36Sopenharmony_ci {0x002d, 0x8801}, 19162306a36Sopenharmony_ci {0x0003, 0x8800}, 19262306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 19362306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 19462306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 19562306a36Sopenharmony_ci {0x0008, 0x8802}, 19662306a36Sopenharmony_ci {0x0038, 0x8801}, 19762306a36Sopenharmony_ci {0x0083, 0x8800}, 19862306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 19962306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 20062306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 20162306a36Sopenharmony_ci {0x0008, 0x8802}, 20262306a36Sopenharmony_ci {0x0033, 0x8801}, 20362306a36Sopenharmony_ci {0x0081, 0x8800}, 20462306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 20562306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 20662306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 20762306a36Sopenharmony_ci {0x0008, 0x8802}, 20862306a36Sopenharmony_ci {0x0034, 0x8801}, 20962306a36Sopenharmony_ci {0x004a, 0x8800}, 21062306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 21162306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 21262306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 21362306a36Sopenharmony_ci {0x0008, 0x8802}, 21462306a36Sopenharmony_ci {0x0039, 0x8801}, 21562306a36Sopenharmony_ci {0x0000, 0x8800}, 21662306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 21762306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 21862306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 21962306a36Sopenharmony_ci {0x0008, 0x8802}, 22062306a36Sopenharmony_ci {0x0010, 0x8801}, 22162306a36Sopenharmony_ci {0x00a8, 0x8800}, 22262306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 22362306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 22462306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 22562306a36Sopenharmony_ci {0x0008, 0x8802}, 22662306a36Sopenharmony_ci {0x0006, 0x8801}, 22762306a36Sopenharmony_ci {0x0058, 0x8800}, 22862306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 22962306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 23062306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 23162306a36Sopenharmony_ci {0x0008, 0x8802}, 23262306a36Sopenharmony_ci {0x0000, 0x8801}, 23362306a36Sopenharmony_ci {0x0004, 0x8800}, 23462306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 23562306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 23662306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 23762306a36Sopenharmony_ci {0x0008, 0x8802}, 23862306a36Sopenharmony_ci {0x0040, 0x8801}, 23962306a36Sopenharmony_ci {0x0080, 0x8800}, 24062306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 24162306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 24262306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 24362306a36Sopenharmony_ci {0x0008, 0x8802}, 24462306a36Sopenharmony_ci {0x0041, 0x8801}, 24562306a36Sopenharmony_ci {0x000c, 0x8800}, 24662306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 24762306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 24862306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 24962306a36Sopenharmony_ci {0x0008, 0x8802}, 25062306a36Sopenharmony_ci {0x0042, 0x8801}, 25162306a36Sopenharmony_ci {0x000c, 0x8800}, 25262306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 25362306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 25462306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 25562306a36Sopenharmony_ci {0x0008, 0x8802}, 25662306a36Sopenharmony_ci {0x0043, 0x8801}, 25762306a36Sopenharmony_ci {0x0028, 0x8800}, 25862306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 25962306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 26062306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 26162306a36Sopenharmony_ci {0x0008, 0x8802}, 26262306a36Sopenharmony_ci {0x0044, 0x8801}, 26362306a36Sopenharmony_ci {0x0080, 0x8800}, 26462306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 26562306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 26662306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 26762306a36Sopenharmony_ci {0x0008, 0x8802}, 26862306a36Sopenharmony_ci {0x0045, 0x8801}, 26962306a36Sopenharmony_ci {0x0020, 0x8800}, 27062306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 27162306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 27262306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 27362306a36Sopenharmony_ci {0x0008, 0x8802}, 27462306a36Sopenharmony_ci {0x0046, 0x8801}, 27562306a36Sopenharmony_ci {0x0020, 0x8800}, 27662306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 27762306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 27862306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 27962306a36Sopenharmony_ci {0x0008, 0x8802}, 28062306a36Sopenharmony_ci {0x0047, 0x8801}, 28162306a36Sopenharmony_ci {0x0080, 0x8800}, 28262306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 28362306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 28462306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 28562306a36Sopenharmony_ci {0x0008, 0x8802}, 28662306a36Sopenharmony_ci {0x0048, 0x8801}, 28762306a36Sopenharmony_ci {0x004c, 0x8800}, 28862306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 28962306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 29062306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 29162306a36Sopenharmony_ci {0x0008, 0x8802}, 29262306a36Sopenharmony_ci {0x0049, 0x8801}, 29362306a36Sopenharmony_ci {0x0084, 0x8800}, 29462306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 29562306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 29662306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 29762306a36Sopenharmony_ci {0x0008, 0x8802}, 29862306a36Sopenharmony_ci {0x004a, 0x8801}, 29962306a36Sopenharmony_ci {0x0084, 0x8800}, 30062306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 30162306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 30262306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 30362306a36Sopenharmony_ci {0x0008, 0x8802}, 30462306a36Sopenharmony_ci {0x004b, 0x8801}, 30562306a36Sopenharmony_ci {0x0084, 0x8800}, 30662306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 30762306a36Sopenharmony_ci /* --------------------------------------- */ 30862306a36Sopenharmony_ci {0x0012, 0x8700}, /* Clock speed 48Mhz/(2+2)/2= 6 Mhz */ 30962306a36Sopenharmony_ci {0x0000, 0x8701}, /* CKx1 clock delay adj */ 31062306a36Sopenharmony_ci {0x0000, 0x8701}, /* CKx1 clock delay adj */ 31162306a36Sopenharmony_ci {0x0001, 0x870c}, /* CKOx2 output */ 31262306a36Sopenharmony_ci /* --------------------------------------- */ 31362306a36Sopenharmony_ci {0x0080, 0x8600}, /* Line memory read counter (L) */ 31462306a36Sopenharmony_ci {0x0001, 0x8606}, /* reserved */ 31562306a36Sopenharmony_ci {0x0064, 0x8607}, /* Line memory read counter (H) 0x6480=25,728 */ 31662306a36Sopenharmony_ci {0x002a, 0x8601}, /* CDSP sharp interpolation mode, 31762306a36Sopenharmony_ci * line sel for color sep, edge enhance enab */ 31862306a36Sopenharmony_ci {0x0000, 0x8602}, /* optical black level for user settng = 0 */ 31962306a36Sopenharmony_ci {0x0080, 0x8600}, /* Line memory read counter (L) */ 32062306a36Sopenharmony_ci {0x000a, 0x8603}, /* optical black level calc mode: 32162306a36Sopenharmony_ci * auto; optical black offset = 10 */ 32262306a36Sopenharmony_ci {0x00df, 0x865b}, /* Horiz offset for valid pixels (L)=0xdf */ 32362306a36Sopenharmony_ci {0x0012, 0x865c}, /* Vert offset for valid lines (L)=0x12 */ 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci/* The following two lines seem to be the "wrong" resolution. */ 32662306a36Sopenharmony_ci/* But perhaps these indicate the actual size of the sensor */ 32762306a36Sopenharmony_ci/* rather than the size of the current video mode. */ 32862306a36Sopenharmony_ci {0x0058, 0x865d}, /* Horiz valid pixels (*4) (L) = 352 */ 32962306a36Sopenharmony_ci {0x0048, 0x865e}, /* Vert valid lines (*4) (L) = 288 */ 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci {0x0015, 0x8608}, /* A11 Coef ... */ 33262306a36Sopenharmony_ci {0x0030, 0x8609}, 33362306a36Sopenharmony_ci {0x00fb, 0x860a}, 33462306a36Sopenharmony_ci {0x003e, 0x860b}, 33562306a36Sopenharmony_ci {0x00ce, 0x860c}, 33662306a36Sopenharmony_ci {0x00f4, 0x860d}, 33762306a36Sopenharmony_ci {0x00eb, 0x860e}, 33862306a36Sopenharmony_ci {0x00dc, 0x860f}, 33962306a36Sopenharmony_ci {0x0039, 0x8610}, 34062306a36Sopenharmony_ci {0x0001, 0x8611}, /* R offset for white balance ... */ 34162306a36Sopenharmony_ci {0x0000, 0x8612}, 34262306a36Sopenharmony_ci {0x0001, 0x8613}, 34362306a36Sopenharmony_ci {0x0000, 0x8614}, 34462306a36Sopenharmony_ci {0x005b, 0x8651}, /* R gain for white balance ... */ 34562306a36Sopenharmony_ci {0x0040, 0x8652}, 34662306a36Sopenharmony_ci {0x0060, 0x8653}, 34762306a36Sopenharmony_ci {0x0040, 0x8654}, 34862306a36Sopenharmony_ci {0x0000, 0x8655}, 34962306a36Sopenharmony_ci {0x0001, 0x863f}, /* Fixed gamma correction enable, USB control, 35062306a36Sopenharmony_ci * lum filter disable, lum noise clip disable */ 35162306a36Sopenharmony_ci {0x00a1, 0x8656}, /* Window1 size 256x256, Windows2 size 64x64, 35262306a36Sopenharmony_ci * gamma look-up disable, 35362306a36Sopenharmony_ci * new edge enhancement enable */ 35462306a36Sopenharmony_ci {0x0018, 0x8657}, /* Edge gain high thresh */ 35562306a36Sopenharmony_ci {0x0020, 0x8658}, /* Edge gain low thresh */ 35662306a36Sopenharmony_ci {0x000a, 0x8659}, /* Edge bandwidth high threshold */ 35762306a36Sopenharmony_ci {0x0005, 0x865a}, /* Edge bandwidth low threshold */ 35862306a36Sopenharmony_ci /* -------------------------------- */ 35962306a36Sopenharmony_ci {0x0030, 0x8112}, /* Video drop enable, ISO streaming enable */ 36062306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 36162306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 36262306a36Sopenharmony_ci {0xa908, 0x8802}, 36362306a36Sopenharmony_ci {0x0034, 0x8801}, /* SSI reg addr */ 36462306a36Sopenharmony_ci {0x00ca, 0x8800}, 36562306a36Sopenharmony_ci /* SSI data to write */ 36662306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 36762306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 36862306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 36962306a36Sopenharmony_ci {0x1f08, 0x8802}, 37062306a36Sopenharmony_ci {0x0006, 0x8801}, 37162306a36Sopenharmony_ci {0x0080, 0x8800}, 37262306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci/* ----- Read back coefs we wrote earlier. */ 37562306a36Sopenharmony_ci /* READ { 0x0000, 0x8608 } -> 0000: 15 */ 37662306a36Sopenharmony_ci /* READ { 0x0000, 0x8609 } -> 0000: 30 */ 37762306a36Sopenharmony_ci /* READ { 0x0000, 0x860a } -> 0000: fb */ 37862306a36Sopenharmony_ci /* READ { 0x0000, 0x860b } -> 0000: 3e */ 37962306a36Sopenharmony_ci /* READ { 0x0000, 0x860c } -> 0000: ce */ 38062306a36Sopenharmony_ci /* READ { 0x0000, 0x860d } -> 0000: f4 */ 38162306a36Sopenharmony_ci /* READ { 0x0000, 0x860e } -> 0000: eb */ 38262306a36Sopenharmony_ci /* READ { 0x0000, 0x860f } -> 0000: dc */ 38362306a36Sopenharmony_ci /* READ { 0x0000, 0x8610 } -> 0000: 39 */ 38462306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 38562306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 08 */ 38662306a36Sopenharmony_ci {0xb008, 0x8802}, 38762306a36Sopenharmony_ci {0x0006, 0x8801}, 38862306a36Sopenharmony_ci {0x007d, 0x8800}, 38962306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci /* This chunk is seemingly redundant with */ 39362306a36Sopenharmony_ci /* earlier commands (A11 Coef...), but if I disable it, */ 39462306a36Sopenharmony_ci /* the image appears too dark. Maybe there was some kind of */ 39562306a36Sopenharmony_ci /* reset since the earlier commands, so this is necessary again. */ 39662306a36Sopenharmony_ci {0x0015, 0x8608}, 39762306a36Sopenharmony_ci {0x0030, 0x8609}, 39862306a36Sopenharmony_ci {0xfffb, 0x860a}, 39962306a36Sopenharmony_ci {0x003e, 0x860b}, 40062306a36Sopenharmony_ci {0xffce, 0x860c}, 40162306a36Sopenharmony_ci {0xfff4, 0x860d}, 40262306a36Sopenharmony_ci {0xffeb, 0x860e}, 40362306a36Sopenharmony_ci {0xffdc, 0x860f}, 40462306a36Sopenharmony_ci {0x0039, 0x8610}, 40562306a36Sopenharmony_ci {0x0018, 0x8657}, 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci {0x0000, 0x8508}, /* Disable compression. */ 40862306a36Sopenharmony_ci /* Previous line was: 40962306a36Sopenharmony_ci {0x0021, 0x8508}, * Enable compression. */ 41062306a36Sopenharmony_ci {0x0032, 0x850b}, /* compression stuff */ 41162306a36Sopenharmony_ci {0x0003, 0x8509}, /* compression stuff */ 41262306a36Sopenharmony_ci {0x0011, 0x850a}, /* compression stuff */ 41362306a36Sopenharmony_ci {0x0021, 0x850d}, /* compression stuff */ 41462306a36Sopenharmony_ci {0x0010, 0x850c}, /* compression stuff */ 41562306a36Sopenharmony_ci {0x0003, 0x8500}, /* *** Video mode: 160x120 */ 41662306a36Sopenharmony_ci {0x0001, 0x8501}, /* Hardware-dominated snap control */ 41762306a36Sopenharmony_ci {0x0061, 0x8656}, /* Window1 size 128x128, Windows2 size 128x128, 41862306a36Sopenharmony_ci * gamma look-up disable, 41962306a36Sopenharmony_ci * new edge enhancement enable */ 42062306a36Sopenharmony_ci {0x0018, 0x8617}, /* Window1 start X (*2) */ 42162306a36Sopenharmony_ci {0x0008, 0x8618}, /* Window1 start Y (*2) */ 42262306a36Sopenharmony_ci {0x0061, 0x8656}, /* Window1 size 128x128, Windows2 size 128x128, 42362306a36Sopenharmony_ci * gamma look-up disable, 42462306a36Sopenharmony_ci * new edge enhancement enable */ 42562306a36Sopenharmony_ci {0x0058, 0x8619}, /* Window2 start X (*2) */ 42662306a36Sopenharmony_ci {0x0008, 0x861a}, /* Window2 start Y (*2) */ 42762306a36Sopenharmony_ci {0x00ff, 0x8615}, /* High lum thresh for white balance */ 42862306a36Sopenharmony_ci {0x0000, 0x8616}, /* Low lum thresh for white balance */ 42962306a36Sopenharmony_ci {0x0012, 0x8700}, /* Clock speed 48Mhz/(2+2)/2= 6 Mhz */ 43062306a36Sopenharmony_ci {0x0012, 0x8700}, /* Clock speed 48Mhz/(2+2)/2= 6 Mhz */ 43162306a36Sopenharmony_ci /* READ { 0x0000, 0x8656 } -> 0000: 61 */ 43262306a36Sopenharmony_ci {0x0028, 0x8802}, /* 375 Khz SSI clock, SSI r/w sync with VSYNC */ 43362306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 43462306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 28 */ 43562306a36Sopenharmony_ci {0x1f28, 0x8802}, /* 375 Khz SSI clock, SSI r/w sync with VSYNC */ 43662306a36Sopenharmony_ci {0x0010, 0x8801}, /* SSI reg addr */ 43762306a36Sopenharmony_ci {0x003e, 0x8800}, /* SSI data to write */ 43862306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 43962306a36Sopenharmony_ci {0x0028, 0x8802}, 44062306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 44162306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 28 */ 44262306a36Sopenharmony_ci {0x1f28, 0x8802}, 44362306a36Sopenharmony_ci {0x0000, 0x8801}, 44462306a36Sopenharmony_ci {0x001f, 0x8800}, 44562306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 44662306a36Sopenharmony_ci {0x0001, 0x8602}, /* optical black level for user settning = 1 */ 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci /* Original: */ 44962306a36Sopenharmony_ci {0x0023, 0x8700}, /* Clock speed 48Mhz/(3+2)/4= 2.4 Mhz */ 45062306a36Sopenharmony_ci {0x000f, 0x8602}, /* optical black level for user settning = 15 */ 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_ci {0x0028, 0x8802}, 45362306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 45462306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 28 */ 45562306a36Sopenharmony_ci {0x1f28, 0x8802}, 45662306a36Sopenharmony_ci {0x0010, 0x8801}, 45762306a36Sopenharmony_ci {0x007b, 0x8800}, 45862306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 45962306a36Sopenharmony_ci {0x002f, 0x8651}, /* R gain for white balance ... */ 46062306a36Sopenharmony_ci {0x0080, 0x8653}, 46162306a36Sopenharmony_ci /* READ { 0x0000, 0x8655 } -> 0000: 00 */ 46262306a36Sopenharmony_ci {0x0000, 0x8655}, 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ci {0x0030, 0x8112}, /* Video drop enable, ISO streaming enable */ 46562306a36Sopenharmony_ci {0x0020, 0x8112}, /* Video drop enable, ISO streaming disable */ 46662306a36Sopenharmony_ci /* UNKNOWN DIRECTION (URB_FUNCTION_SELECT_INTERFACE: (ALT=0) ) */ 46762306a36Sopenharmony_ci {} 46862306a36Sopenharmony_ci}; 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_ci/* 47162306a36Sopenharmony_ci * Initialization data for Intel EasyPC Camera CS110 47262306a36Sopenharmony_ci */ 47362306a36Sopenharmony_cistatic const u16 spca508cs110_init_data[][2] = { 47462306a36Sopenharmony_ci {0x0000, 0x870b}, /* Reset CTL3 */ 47562306a36Sopenharmony_ci {0x0003, 0x8111}, /* Soft Reset compression, memory, TG & CDSP */ 47662306a36Sopenharmony_ci {0x0000, 0x8111}, /* Normal operation on reset */ 47762306a36Sopenharmony_ci {0x0090, 0x8110}, 47862306a36Sopenharmony_ci /* External Clock 2x & Synchronous Serial Interface Output */ 47962306a36Sopenharmony_ci {0x0020, 0x8112}, /* Video Drop packet enable */ 48062306a36Sopenharmony_ci {0x0000, 0x8114}, /* Software GPIO output data */ 48162306a36Sopenharmony_ci {0x0001, 0x8114}, 48262306a36Sopenharmony_ci {0x0001, 0x8114}, 48362306a36Sopenharmony_ci {0x0001, 0x8114}, 48462306a36Sopenharmony_ci {0x0003, 0x8114}, 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_ci /* Initial sequence Synchronous Serial Interface */ 48762306a36Sopenharmony_ci {0x000f, 0x8402}, /* Memory bank Address */ 48862306a36Sopenharmony_ci {0x0000, 0x8403}, /* Memory bank Address */ 48962306a36Sopenharmony_ci {0x00ba, 0x8804}, /* SSI Slave address */ 49062306a36Sopenharmony_ci {0x0010, 0x8802}, /* 93.75kHz SSI Clock Two DataByte */ 49162306a36Sopenharmony_ci {0x0010, 0x8802}, /* 93.75kHz SSI Clock two DataByte */ 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ci {0x0001, 0x8801}, 49462306a36Sopenharmony_ci {0x000a, 0x8805}, /* a - NWG: Dunno what this is about */ 49562306a36Sopenharmony_ci {0x0000, 0x8800}, 49662306a36Sopenharmony_ci {0x0010, 0x8802}, 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_ci {0x0002, 0x8801}, 49962306a36Sopenharmony_ci {0x0000, 0x8805}, 50062306a36Sopenharmony_ci {0x0000, 0x8800}, 50162306a36Sopenharmony_ci {0x0010, 0x8802}, 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_ci {0x0003, 0x8801}, 50462306a36Sopenharmony_ci {0x0027, 0x8805}, 50562306a36Sopenharmony_ci {0x0001, 0x8800}, 50662306a36Sopenharmony_ci {0x0010, 0x8802}, 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ci {0x0004, 0x8801}, 50962306a36Sopenharmony_ci {0x0065, 0x8805}, 51062306a36Sopenharmony_ci {0x0001, 0x8800}, 51162306a36Sopenharmony_ci {0x0010, 0x8802}, 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_ci {0x0005, 0x8801}, 51462306a36Sopenharmony_ci {0x0003, 0x8805}, 51562306a36Sopenharmony_ci {0x0000, 0x8800}, 51662306a36Sopenharmony_ci {0x0010, 0x8802}, 51762306a36Sopenharmony_ci 51862306a36Sopenharmony_ci {0x0006, 0x8801}, 51962306a36Sopenharmony_ci {0x001c, 0x8805}, 52062306a36Sopenharmony_ci {0x0000, 0x8800}, 52162306a36Sopenharmony_ci {0x0010, 0x8802}, 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_ci {0x0007, 0x8801}, 52462306a36Sopenharmony_ci {0x002a, 0x8805}, 52562306a36Sopenharmony_ci {0x0000, 0x8800}, 52662306a36Sopenharmony_ci {0x0010, 0x8802}, 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_ci {0x0002, 0x8704}, /* External input CKIx1 */ 52962306a36Sopenharmony_ci {0x0001, 0x8606}, /* 1 Line memory Read Counter (H) Result: (d)410 */ 53062306a36Sopenharmony_ci {0x009a, 0x8600}, /* Line memory Read Counter (L) */ 53162306a36Sopenharmony_ci {0x0001, 0x865b}, /* 1 Horizontal Offset for Valid Pixel(L) */ 53262306a36Sopenharmony_ci {0x0003, 0x865c}, /* 3 Vertical Offset for Valid Lines(L) */ 53362306a36Sopenharmony_ci {0x0058, 0x865d}, /* 58 Horizontal Valid Pixel Window(L) */ 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_ci {0x0006, 0x8660}, /* Nibble data + input order */ 53662306a36Sopenharmony_ci 53762306a36Sopenharmony_ci {0x000a, 0x8602}, /* Optical black level set to 0x0a */ 53862306a36Sopenharmony_ci {0x0000, 0x8603}, /* Optical black level Offset */ 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_ci/* {0x0000, 0x8611}, * 0 R Offset for white Balance */ 54162306a36Sopenharmony_ci/* {0x0000, 0x8612}, * 1 Gr Offset for white Balance */ 54262306a36Sopenharmony_ci/* {0x0000, 0x8613}, * 1f B Offset for white Balance */ 54362306a36Sopenharmony_ci/* {0x0000, 0x8614}, * f0 Gb Offset for white Balance */ 54462306a36Sopenharmony_ci 54562306a36Sopenharmony_ci {0x0040, 0x8651}, /* 2b BLUE gain for white balance good at all 60 */ 54662306a36Sopenharmony_ci {0x0030, 0x8652}, /* 41 Gr Gain for white Balance (L) */ 54762306a36Sopenharmony_ci {0x0035, 0x8653}, /* 26 RED gain for white balance */ 54862306a36Sopenharmony_ci {0x0035, 0x8654}, /* 40Gb Gain for white Balance (L) */ 54962306a36Sopenharmony_ci {0x0041, 0x863f}, 55062306a36Sopenharmony_ci /* Fixed Gamma correction enabled (makes colours look better) */ 55162306a36Sopenharmony_ci 55262306a36Sopenharmony_ci {0x0000, 0x8655}, 55362306a36Sopenharmony_ci /* High bits for white balance*****brightness control*** */ 55462306a36Sopenharmony_ci {} 55562306a36Sopenharmony_ci}; 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_cistatic const u16 spca508_sightcam_init_data[][2] = { 55862306a36Sopenharmony_ci/* This line seems to setup the frame/canvas */ 55962306a36Sopenharmony_ci {0x000f, 0x8402}, 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_ci/* These 6 lines are needed to startup the webcam */ 56262306a36Sopenharmony_ci {0x0090, 0x8110}, 56362306a36Sopenharmony_ci {0x0001, 0x8114}, 56462306a36Sopenharmony_ci {0x0001, 0x8114}, 56562306a36Sopenharmony_ci {0x0001, 0x8114}, 56662306a36Sopenharmony_ci {0x0003, 0x8114}, 56762306a36Sopenharmony_ci {0x0080, 0x8804}, 56862306a36Sopenharmony_ci 56962306a36Sopenharmony_ci/* This part seems to make the pictures darker? (autobrightness?) */ 57062306a36Sopenharmony_ci {0x0001, 0x8801}, 57162306a36Sopenharmony_ci {0x0004, 0x8800}, 57262306a36Sopenharmony_ci {0x0003, 0x8801}, 57362306a36Sopenharmony_ci {0x00e0, 0x8800}, 57462306a36Sopenharmony_ci {0x0004, 0x8801}, 57562306a36Sopenharmony_ci {0x00b4, 0x8800}, 57662306a36Sopenharmony_ci {0x0005, 0x8801}, 57762306a36Sopenharmony_ci {0x0000, 0x8800}, 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ci {0x0006, 0x8801}, 58062306a36Sopenharmony_ci {0x00e0, 0x8800}, 58162306a36Sopenharmony_ci {0x0007, 0x8801}, 58262306a36Sopenharmony_ci {0x000c, 0x8800}, 58362306a36Sopenharmony_ci 58462306a36Sopenharmony_ci/* This section is just needed, it probably 58562306a36Sopenharmony_ci * does something like the previous section, 58662306a36Sopenharmony_ci * but the cam won't start if it's not included. 58762306a36Sopenharmony_ci */ 58862306a36Sopenharmony_ci {0x0014, 0x8801}, 58962306a36Sopenharmony_ci {0x0008, 0x8800}, 59062306a36Sopenharmony_ci {0x0015, 0x8801}, 59162306a36Sopenharmony_ci {0x0067, 0x8800}, 59262306a36Sopenharmony_ci {0x0016, 0x8801}, 59362306a36Sopenharmony_ci {0x0000, 0x8800}, 59462306a36Sopenharmony_ci {0x0017, 0x8801}, 59562306a36Sopenharmony_ci {0x0020, 0x8800}, 59662306a36Sopenharmony_ci {0x0018, 0x8801}, 59762306a36Sopenharmony_ci {0x0044, 0x8800}, 59862306a36Sopenharmony_ci 59962306a36Sopenharmony_ci/* Makes the picture darker - and the 60062306a36Sopenharmony_ci * cam won't start if not included 60162306a36Sopenharmony_ci */ 60262306a36Sopenharmony_ci {0x001e, 0x8801}, 60362306a36Sopenharmony_ci {0x00ea, 0x8800}, 60462306a36Sopenharmony_ci {0x001f, 0x8801}, 60562306a36Sopenharmony_ci {0x0001, 0x8800}, 60662306a36Sopenharmony_ci {0x0003, 0x8801}, 60762306a36Sopenharmony_ci {0x00e0, 0x8800}, 60862306a36Sopenharmony_ci 60962306a36Sopenharmony_ci/* seems to place the colors ontop of each other #1 */ 61062306a36Sopenharmony_ci {0x0006, 0x8704}, 61162306a36Sopenharmony_ci {0x0001, 0x870c}, 61262306a36Sopenharmony_ci {0x0016, 0x8600}, 61362306a36Sopenharmony_ci {0x0002, 0x8606}, 61462306a36Sopenharmony_ci 61562306a36Sopenharmony_ci/* if not included the pictures becomes _very_ dark */ 61662306a36Sopenharmony_ci {0x0064, 0x8607}, 61762306a36Sopenharmony_ci {0x003a, 0x8601}, 61862306a36Sopenharmony_ci {0x0000, 0x8602}, 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci/* seems to place the colors ontop of each other #2 */ 62162306a36Sopenharmony_ci {0x0016, 0x8600}, 62262306a36Sopenharmony_ci {0x0018, 0x8617}, 62362306a36Sopenharmony_ci {0x0008, 0x8618}, 62462306a36Sopenharmony_ci {0x00a1, 0x8656}, 62562306a36Sopenharmony_ci 62662306a36Sopenharmony_ci/* webcam won't start if not included */ 62762306a36Sopenharmony_ci {0x0007, 0x865b}, 62862306a36Sopenharmony_ci {0x0001, 0x865c}, 62962306a36Sopenharmony_ci {0x0058, 0x865d}, 63062306a36Sopenharmony_ci {0x0048, 0x865e}, 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_ci/* adjusts the colors */ 63362306a36Sopenharmony_ci {0x0049, 0x8651}, 63462306a36Sopenharmony_ci {0x0040, 0x8652}, 63562306a36Sopenharmony_ci {0x004c, 0x8653}, 63662306a36Sopenharmony_ci {0x0040, 0x8654}, 63762306a36Sopenharmony_ci {} 63862306a36Sopenharmony_ci}; 63962306a36Sopenharmony_ci 64062306a36Sopenharmony_cistatic const u16 spca508_sightcam2_init_data[][2] = { 64162306a36Sopenharmony_ci {0x0020, 0x8112}, 64262306a36Sopenharmony_ci 64362306a36Sopenharmony_ci {0x000f, 0x8402}, 64462306a36Sopenharmony_ci {0x0000, 0x8403}, 64562306a36Sopenharmony_ci 64662306a36Sopenharmony_ci {0x0008, 0x8201}, 64762306a36Sopenharmony_ci {0x0008, 0x8200}, 64862306a36Sopenharmony_ci {0x0001, 0x8200}, 64962306a36Sopenharmony_ci {0x0009, 0x8201}, 65062306a36Sopenharmony_ci {0x0008, 0x8200}, 65162306a36Sopenharmony_ci {0x0001, 0x8200}, 65262306a36Sopenharmony_ci {0x000a, 0x8201}, 65362306a36Sopenharmony_ci {0x0008, 0x8200}, 65462306a36Sopenharmony_ci {0x0001, 0x8200}, 65562306a36Sopenharmony_ci {0x000b, 0x8201}, 65662306a36Sopenharmony_ci {0x0008, 0x8200}, 65762306a36Sopenharmony_ci {0x0001, 0x8200}, 65862306a36Sopenharmony_ci {0x000c, 0x8201}, 65962306a36Sopenharmony_ci {0x0008, 0x8200}, 66062306a36Sopenharmony_ci {0x0001, 0x8200}, 66162306a36Sopenharmony_ci {0x000d, 0x8201}, 66262306a36Sopenharmony_ci {0x0008, 0x8200}, 66362306a36Sopenharmony_ci {0x0001, 0x8200}, 66462306a36Sopenharmony_ci {0x000e, 0x8201}, 66562306a36Sopenharmony_ci {0x0008, 0x8200}, 66662306a36Sopenharmony_ci {0x0001, 0x8200}, 66762306a36Sopenharmony_ci {0x0007, 0x8201}, 66862306a36Sopenharmony_ci {0x0008, 0x8200}, 66962306a36Sopenharmony_ci {0x0001, 0x8200}, 67062306a36Sopenharmony_ci {0x000f, 0x8201}, 67162306a36Sopenharmony_ci {0x0008, 0x8200}, 67262306a36Sopenharmony_ci {0x0001, 0x8200}, 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_ci {0x0018, 0x8660}, 67562306a36Sopenharmony_ci {0x0010, 0x8201}, 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_ci {0x0008, 0x8200}, 67862306a36Sopenharmony_ci {0x0001, 0x8200}, 67962306a36Sopenharmony_ci {0x0011, 0x8201}, 68062306a36Sopenharmony_ci {0x0008, 0x8200}, 68162306a36Sopenharmony_ci {0x0001, 0x8200}, 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_ci {0x0000, 0x86b0}, 68462306a36Sopenharmony_ci {0x0034, 0x86b1}, 68562306a36Sopenharmony_ci {0x0000, 0x86b2}, 68662306a36Sopenharmony_ci {0x0049, 0x86b3}, 68762306a36Sopenharmony_ci {0x0000, 0x86b4}, 68862306a36Sopenharmony_ci {0x0000, 0x86b4}, 68962306a36Sopenharmony_ci 69062306a36Sopenharmony_ci {0x0012, 0x8201}, 69162306a36Sopenharmony_ci {0x0008, 0x8200}, 69262306a36Sopenharmony_ci {0x0001, 0x8200}, 69362306a36Sopenharmony_ci {0x0013, 0x8201}, 69462306a36Sopenharmony_ci {0x0008, 0x8200}, 69562306a36Sopenharmony_ci {0x0001, 0x8200}, 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_ci {0x0001, 0x86b0}, 69862306a36Sopenharmony_ci {0x00aa, 0x86b1}, 69962306a36Sopenharmony_ci {0x0000, 0x86b2}, 70062306a36Sopenharmony_ci {0x00e4, 0x86b3}, 70162306a36Sopenharmony_ci {0x0000, 0x86b4}, 70262306a36Sopenharmony_ci {0x0000, 0x86b4}, 70362306a36Sopenharmony_ci 70462306a36Sopenharmony_ci {0x0018, 0x8660}, 70562306a36Sopenharmony_ci 70662306a36Sopenharmony_ci {0x0090, 0x8110}, 70762306a36Sopenharmony_ci {0x0001, 0x8114}, 70862306a36Sopenharmony_ci {0x0001, 0x8114}, 70962306a36Sopenharmony_ci {0x0001, 0x8114}, 71062306a36Sopenharmony_ci {0x0003, 0x8114}, 71162306a36Sopenharmony_ci 71262306a36Sopenharmony_ci {0x0080, 0x8804}, 71362306a36Sopenharmony_ci {0x0003, 0x8801}, 71462306a36Sopenharmony_ci {0x0012, 0x8800}, 71562306a36Sopenharmony_ci {0x0004, 0x8801}, 71662306a36Sopenharmony_ci {0x0005, 0x8800}, 71762306a36Sopenharmony_ci {0x0005, 0x8801}, 71862306a36Sopenharmony_ci {0x0000, 0x8800}, 71962306a36Sopenharmony_ci {0x0006, 0x8801}, 72062306a36Sopenharmony_ci {0x0000, 0x8800}, 72162306a36Sopenharmony_ci {0x0007, 0x8801}, 72262306a36Sopenharmony_ci {0x0000, 0x8800}, 72362306a36Sopenharmony_ci {0x0008, 0x8801}, 72462306a36Sopenharmony_ci {0x0005, 0x8800}, 72562306a36Sopenharmony_ci {0x000a, 0x8700}, 72662306a36Sopenharmony_ci {0x000e, 0x8801}, 72762306a36Sopenharmony_ci {0x0004, 0x8800}, 72862306a36Sopenharmony_ci {0x0005, 0x8801}, 72962306a36Sopenharmony_ci {0x0047, 0x8800}, 73062306a36Sopenharmony_ci {0x0006, 0x8801}, 73162306a36Sopenharmony_ci {0x0000, 0x8800}, 73262306a36Sopenharmony_ci {0x0007, 0x8801}, 73362306a36Sopenharmony_ci {0x00c0, 0x8800}, 73462306a36Sopenharmony_ci {0x0008, 0x8801}, 73562306a36Sopenharmony_ci {0x0003, 0x8800}, 73662306a36Sopenharmony_ci {0x0013, 0x8801}, 73762306a36Sopenharmony_ci {0x0001, 0x8800}, 73862306a36Sopenharmony_ci {0x0009, 0x8801}, 73962306a36Sopenharmony_ci {0x0000, 0x8800}, 74062306a36Sopenharmony_ci {0x000a, 0x8801}, 74162306a36Sopenharmony_ci {0x0000, 0x8800}, 74262306a36Sopenharmony_ci {0x000b, 0x8801}, 74362306a36Sopenharmony_ci {0x0000, 0x8800}, 74462306a36Sopenharmony_ci {0x000c, 0x8801}, 74562306a36Sopenharmony_ci {0x0000, 0x8800}, 74662306a36Sopenharmony_ci {0x000e, 0x8801}, 74762306a36Sopenharmony_ci {0x0004, 0x8800}, 74862306a36Sopenharmony_ci {0x000f, 0x8801}, 74962306a36Sopenharmony_ci {0x0000, 0x8800}, 75062306a36Sopenharmony_ci {0x0010, 0x8801}, 75162306a36Sopenharmony_ci {0x0006, 0x8800}, 75262306a36Sopenharmony_ci {0x0011, 0x8801}, 75362306a36Sopenharmony_ci {0x0006, 0x8800}, 75462306a36Sopenharmony_ci {0x0012, 0x8801}, 75562306a36Sopenharmony_ci {0x0000, 0x8800}, 75662306a36Sopenharmony_ci {0x0013, 0x8801}, 75762306a36Sopenharmony_ci {0x0001, 0x8800}, 75862306a36Sopenharmony_ci 75962306a36Sopenharmony_ci {0x000a, 0x8700}, 76062306a36Sopenharmony_ci {0x0000, 0x8702}, 76162306a36Sopenharmony_ci {0x0000, 0x8703}, 76262306a36Sopenharmony_ci {0x00c2, 0x8704}, 76362306a36Sopenharmony_ci {0x0001, 0x870c}, 76462306a36Sopenharmony_ci 76562306a36Sopenharmony_ci {0x0044, 0x8600}, 76662306a36Sopenharmony_ci {0x0002, 0x8606}, 76762306a36Sopenharmony_ci {0x0064, 0x8607}, 76862306a36Sopenharmony_ci {0x003a, 0x8601}, 76962306a36Sopenharmony_ci {0x0008, 0x8602}, 77062306a36Sopenharmony_ci {0x0044, 0x8600}, 77162306a36Sopenharmony_ci {0x0018, 0x8617}, 77262306a36Sopenharmony_ci {0x0008, 0x8618}, 77362306a36Sopenharmony_ci {0x00a1, 0x8656}, 77462306a36Sopenharmony_ci {0x0004, 0x865b}, 77562306a36Sopenharmony_ci {0x0002, 0x865c}, 77662306a36Sopenharmony_ci {0x0058, 0x865d}, 77762306a36Sopenharmony_ci {0x0048, 0x865e}, 77862306a36Sopenharmony_ci {0x0012, 0x8608}, 77962306a36Sopenharmony_ci {0x002c, 0x8609}, 78062306a36Sopenharmony_ci {0x0002, 0x860a}, 78162306a36Sopenharmony_ci {0x002c, 0x860b}, 78262306a36Sopenharmony_ci {0x00db, 0x860c}, 78362306a36Sopenharmony_ci {0x00f9, 0x860d}, 78462306a36Sopenharmony_ci {0x00f1, 0x860e}, 78562306a36Sopenharmony_ci {0x00e3, 0x860f}, 78662306a36Sopenharmony_ci {0x002c, 0x8610}, 78762306a36Sopenharmony_ci {0x006c, 0x8651}, 78862306a36Sopenharmony_ci {0x0041, 0x8652}, 78962306a36Sopenharmony_ci {0x0059, 0x8653}, 79062306a36Sopenharmony_ci {0x0040, 0x8654}, 79162306a36Sopenharmony_ci {0x00fa, 0x8611}, 79262306a36Sopenharmony_ci {0x00ff, 0x8612}, 79362306a36Sopenharmony_ci {0x00f8, 0x8613}, 79462306a36Sopenharmony_ci {0x0000, 0x8614}, 79562306a36Sopenharmony_ci {0x0001, 0x863f}, 79662306a36Sopenharmony_ci {0x0000, 0x8640}, 79762306a36Sopenharmony_ci {0x0026, 0x8641}, 79862306a36Sopenharmony_ci {0x0045, 0x8642}, 79962306a36Sopenharmony_ci {0x0060, 0x8643}, 80062306a36Sopenharmony_ci {0x0075, 0x8644}, 80162306a36Sopenharmony_ci {0x0088, 0x8645}, 80262306a36Sopenharmony_ci {0x009b, 0x8646}, 80362306a36Sopenharmony_ci {0x00b0, 0x8647}, 80462306a36Sopenharmony_ci {0x00c5, 0x8648}, 80562306a36Sopenharmony_ci {0x00d2, 0x8649}, 80662306a36Sopenharmony_ci {0x00dc, 0x864a}, 80762306a36Sopenharmony_ci {0x00e5, 0x864b}, 80862306a36Sopenharmony_ci {0x00eb, 0x864c}, 80962306a36Sopenharmony_ci {0x00f0, 0x864d}, 81062306a36Sopenharmony_ci {0x00f6, 0x864e}, 81162306a36Sopenharmony_ci {0x00fa, 0x864f}, 81262306a36Sopenharmony_ci {0x00ff, 0x8650}, 81362306a36Sopenharmony_ci {0x0060, 0x8657}, 81462306a36Sopenharmony_ci {0x0010, 0x8658}, 81562306a36Sopenharmony_ci {0x0018, 0x8659}, 81662306a36Sopenharmony_ci {0x0005, 0x865a}, 81762306a36Sopenharmony_ci {0x0018, 0x8660}, 81862306a36Sopenharmony_ci {0x0003, 0x8509}, 81962306a36Sopenharmony_ci {0x0011, 0x850a}, 82062306a36Sopenharmony_ci {0x0032, 0x850b}, 82162306a36Sopenharmony_ci {0x0010, 0x850c}, 82262306a36Sopenharmony_ci {0x0021, 0x850d}, 82362306a36Sopenharmony_ci {0x0001, 0x8500}, 82462306a36Sopenharmony_ci {0x0000, 0x8508}, 82562306a36Sopenharmony_ci {0x0012, 0x8608}, 82662306a36Sopenharmony_ci {0x002c, 0x8609}, 82762306a36Sopenharmony_ci {0x0002, 0x860a}, 82862306a36Sopenharmony_ci {0x0039, 0x860b}, 82962306a36Sopenharmony_ci {0x00d0, 0x860c}, 83062306a36Sopenharmony_ci {0x00f7, 0x860d}, 83162306a36Sopenharmony_ci {0x00ed, 0x860e}, 83262306a36Sopenharmony_ci {0x00db, 0x860f}, 83362306a36Sopenharmony_ci {0x0039, 0x8610}, 83462306a36Sopenharmony_ci {0x0012, 0x8657}, 83562306a36Sopenharmony_ci {0x000c, 0x8619}, 83662306a36Sopenharmony_ci {0x0004, 0x861a}, 83762306a36Sopenharmony_ci {0x00a1, 0x8656}, 83862306a36Sopenharmony_ci {0x00c8, 0x8615}, 83962306a36Sopenharmony_ci {0x0032, 0x8616}, 84062306a36Sopenharmony_ci 84162306a36Sopenharmony_ci {0x0030, 0x8112}, 84262306a36Sopenharmony_ci {0x0020, 0x8112}, 84362306a36Sopenharmony_ci {0x0020, 0x8112}, 84462306a36Sopenharmony_ci {0x000f, 0x8402}, 84562306a36Sopenharmony_ci {0x0000, 0x8403}, 84662306a36Sopenharmony_ci 84762306a36Sopenharmony_ci {0x0090, 0x8110}, 84862306a36Sopenharmony_ci {0x0001, 0x8114}, 84962306a36Sopenharmony_ci {0x0001, 0x8114}, 85062306a36Sopenharmony_ci {0x0001, 0x8114}, 85162306a36Sopenharmony_ci {0x0003, 0x8114}, 85262306a36Sopenharmony_ci {0x0080, 0x8804}, 85362306a36Sopenharmony_ci 85462306a36Sopenharmony_ci {0x0003, 0x8801}, 85562306a36Sopenharmony_ci {0x0012, 0x8800}, 85662306a36Sopenharmony_ci {0x0004, 0x8801}, 85762306a36Sopenharmony_ci {0x0005, 0x8800}, 85862306a36Sopenharmony_ci {0x0005, 0x8801}, 85962306a36Sopenharmony_ci {0x0047, 0x8800}, 86062306a36Sopenharmony_ci {0x0006, 0x8801}, 86162306a36Sopenharmony_ci {0x0000, 0x8800}, 86262306a36Sopenharmony_ci {0x0007, 0x8801}, 86362306a36Sopenharmony_ci {0x00c0, 0x8800}, 86462306a36Sopenharmony_ci {0x0008, 0x8801}, 86562306a36Sopenharmony_ci {0x0003, 0x8800}, 86662306a36Sopenharmony_ci {0x000a, 0x8700}, 86762306a36Sopenharmony_ci {0x000e, 0x8801}, 86862306a36Sopenharmony_ci {0x0004, 0x8800}, 86962306a36Sopenharmony_ci {0x0005, 0x8801}, 87062306a36Sopenharmony_ci {0x0047, 0x8800}, 87162306a36Sopenharmony_ci {0x0006, 0x8801}, 87262306a36Sopenharmony_ci {0x0000, 0x8800}, 87362306a36Sopenharmony_ci {0x0007, 0x8801}, 87462306a36Sopenharmony_ci {0x00c0, 0x8800}, 87562306a36Sopenharmony_ci {0x0008, 0x8801}, 87662306a36Sopenharmony_ci {0x0003, 0x8800}, 87762306a36Sopenharmony_ci {0x0013, 0x8801}, 87862306a36Sopenharmony_ci {0x0001, 0x8800}, 87962306a36Sopenharmony_ci {0x0009, 0x8801}, 88062306a36Sopenharmony_ci {0x0000, 0x8800}, 88162306a36Sopenharmony_ci {0x000a, 0x8801}, 88262306a36Sopenharmony_ci {0x0000, 0x8800}, 88362306a36Sopenharmony_ci {0x000b, 0x8801}, 88462306a36Sopenharmony_ci {0x0000, 0x8800}, 88562306a36Sopenharmony_ci {0x000c, 0x8801}, 88662306a36Sopenharmony_ci {0x0000, 0x8800}, 88762306a36Sopenharmony_ci {0x000e, 0x8801}, 88862306a36Sopenharmony_ci {0x0004, 0x8800}, 88962306a36Sopenharmony_ci {0x000f, 0x8801}, 89062306a36Sopenharmony_ci {0x0000, 0x8800}, 89162306a36Sopenharmony_ci {0x0010, 0x8801}, 89262306a36Sopenharmony_ci {0x0006, 0x8800}, 89362306a36Sopenharmony_ci {0x0011, 0x8801}, 89462306a36Sopenharmony_ci {0x0006, 0x8800}, 89562306a36Sopenharmony_ci {0x0012, 0x8801}, 89662306a36Sopenharmony_ci {0x0000, 0x8800}, 89762306a36Sopenharmony_ci {0x0013, 0x8801}, 89862306a36Sopenharmony_ci {0x0001, 0x8800}, 89962306a36Sopenharmony_ci {0x000a, 0x8700}, 90062306a36Sopenharmony_ci {0x0000, 0x8702}, 90162306a36Sopenharmony_ci {0x0000, 0x8703}, 90262306a36Sopenharmony_ci {0x00c2, 0x8704}, 90362306a36Sopenharmony_ci {0x0001, 0x870c}, 90462306a36Sopenharmony_ci {0x0044, 0x8600}, 90562306a36Sopenharmony_ci {0x0002, 0x8606}, 90662306a36Sopenharmony_ci {0x0064, 0x8607}, 90762306a36Sopenharmony_ci {0x003a, 0x8601}, 90862306a36Sopenharmony_ci {0x0008, 0x8602}, 90962306a36Sopenharmony_ci {0x0044, 0x8600}, 91062306a36Sopenharmony_ci {0x0018, 0x8617}, 91162306a36Sopenharmony_ci {0x0008, 0x8618}, 91262306a36Sopenharmony_ci {0x00a1, 0x8656}, 91362306a36Sopenharmony_ci {0x0004, 0x865b}, 91462306a36Sopenharmony_ci {0x0002, 0x865c}, 91562306a36Sopenharmony_ci {0x0058, 0x865d}, 91662306a36Sopenharmony_ci {0x0048, 0x865e}, 91762306a36Sopenharmony_ci {0x0012, 0x8608}, 91862306a36Sopenharmony_ci {0x002c, 0x8609}, 91962306a36Sopenharmony_ci {0x0002, 0x860a}, 92062306a36Sopenharmony_ci {0x002c, 0x860b}, 92162306a36Sopenharmony_ci {0x00db, 0x860c}, 92262306a36Sopenharmony_ci {0x00f9, 0x860d}, 92362306a36Sopenharmony_ci {0x00f1, 0x860e}, 92462306a36Sopenharmony_ci {0x00e3, 0x860f}, 92562306a36Sopenharmony_ci {0x002c, 0x8610}, 92662306a36Sopenharmony_ci {0x006c, 0x8651}, 92762306a36Sopenharmony_ci {0x0041, 0x8652}, 92862306a36Sopenharmony_ci {0x0059, 0x8653}, 92962306a36Sopenharmony_ci {0x0040, 0x8654}, 93062306a36Sopenharmony_ci {0x00fa, 0x8611}, 93162306a36Sopenharmony_ci {0x00ff, 0x8612}, 93262306a36Sopenharmony_ci {0x00f8, 0x8613}, 93362306a36Sopenharmony_ci {0x0000, 0x8614}, 93462306a36Sopenharmony_ci {0x0001, 0x863f}, 93562306a36Sopenharmony_ci {0x0000, 0x8640}, 93662306a36Sopenharmony_ci {0x0026, 0x8641}, 93762306a36Sopenharmony_ci {0x0045, 0x8642}, 93862306a36Sopenharmony_ci {0x0060, 0x8643}, 93962306a36Sopenharmony_ci {0x0075, 0x8644}, 94062306a36Sopenharmony_ci {0x0088, 0x8645}, 94162306a36Sopenharmony_ci {0x009b, 0x8646}, 94262306a36Sopenharmony_ci {0x00b0, 0x8647}, 94362306a36Sopenharmony_ci {0x00c5, 0x8648}, 94462306a36Sopenharmony_ci {0x00d2, 0x8649}, 94562306a36Sopenharmony_ci {0x00dc, 0x864a}, 94662306a36Sopenharmony_ci {0x00e5, 0x864b}, 94762306a36Sopenharmony_ci {0x00eb, 0x864c}, 94862306a36Sopenharmony_ci {0x00f0, 0x864d}, 94962306a36Sopenharmony_ci {0x00f6, 0x864e}, 95062306a36Sopenharmony_ci {0x00fa, 0x864f}, 95162306a36Sopenharmony_ci {0x00ff, 0x8650}, 95262306a36Sopenharmony_ci {0x0060, 0x8657}, 95362306a36Sopenharmony_ci {0x0010, 0x8658}, 95462306a36Sopenharmony_ci {0x0018, 0x8659}, 95562306a36Sopenharmony_ci {0x0005, 0x865a}, 95662306a36Sopenharmony_ci {0x0018, 0x8660}, 95762306a36Sopenharmony_ci {0x0003, 0x8509}, 95862306a36Sopenharmony_ci {0x0011, 0x850a}, 95962306a36Sopenharmony_ci {0x0032, 0x850b}, 96062306a36Sopenharmony_ci {0x0010, 0x850c}, 96162306a36Sopenharmony_ci {0x0021, 0x850d}, 96262306a36Sopenharmony_ci {0x0001, 0x8500}, 96362306a36Sopenharmony_ci {0x0000, 0x8508}, 96462306a36Sopenharmony_ci 96562306a36Sopenharmony_ci {0x0012, 0x8608}, 96662306a36Sopenharmony_ci {0x002c, 0x8609}, 96762306a36Sopenharmony_ci {0x0002, 0x860a}, 96862306a36Sopenharmony_ci {0x0039, 0x860b}, 96962306a36Sopenharmony_ci {0x00d0, 0x860c}, 97062306a36Sopenharmony_ci {0x00f7, 0x860d}, 97162306a36Sopenharmony_ci {0x00ed, 0x860e}, 97262306a36Sopenharmony_ci {0x00db, 0x860f}, 97362306a36Sopenharmony_ci {0x0039, 0x8610}, 97462306a36Sopenharmony_ci {0x0012, 0x8657}, 97562306a36Sopenharmony_ci {0x0064, 0x8619}, 97662306a36Sopenharmony_ci 97762306a36Sopenharmony_ci/* This line starts it all, it is not needed here */ 97862306a36Sopenharmony_ci/* since it has been build into the driver */ 97962306a36Sopenharmony_ci/* jfm: don't start now */ 98062306a36Sopenharmony_ci/* {0x0030, 0x8112}, */ 98162306a36Sopenharmony_ci {} 98262306a36Sopenharmony_ci}; 98362306a36Sopenharmony_ci 98462306a36Sopenharmony_ci/* 98562306a36Sopenharmony_ci * Initialization data for Creative Webcam Vista 98662306a36Sopenharmony_ci */ 98762306a36Sopenharmony_cistatic const u16 spca508_vista_init_data[][2] = { 98862306a36Sopenharmony_ci {0x0008, 0x8200}, /* Clear register */ 98962306a36Sopenharmony_ci {0x0000, 0x870b}, /* Reset CTL3 */ 99062306a36Sopenharmony_ci {0x0020, 0x8112}, /* Video Drop packet enable */ 99162306a36Sopenharmony_ci {0x0003, 0x8111}, /* Soft Reset compression, memory, TG & CDSP */ 99262306a36Sopenharmony_ci {0x0000, 0x8110}, /* Disable everything */ 99362306a36Sopenharmony_ci {0x0000, 0x8114}, /* Software GPIO output data */ 99462306a36Sopenharmony_ci {0x0000, 0x8114}, 99562306a36Sopenharmony_ci 99662306a36Sopenharmony_ci {0x0003, 0x8111}, 99762306a36Sopenharmony_ci {0x0000, 0x8111}, 99862306a36Sopenharmony_ci {0x0090, 0x8110}, /* Enable: SSI output, External 2X clock output */ 99962306a36Sopenharmony_ci {0x0020, 0x8112}, 100062306a36Sopenharmony_ci {0x0000, 0x8114}, 100162306a36Sopenharmony_ci {0x0001, 0x8114}, 100262306a36Sopenharmony_ci {0x0001, 0x8114}, 100362306a36Sopenharmony_ci {0x0001, 0x8114}, 100462306a36Sopenharmony_ci {0x0003, 0x8114}, 100562306a36Sopenharmony_ci 100662306a36Sopenharmony_ci {0x000f, 0x8402}, /* Memory bank Address */ 100762306a36Sopenharmony_ci {0x0000, 0x8403}, /* Memory bank Address */ 100862306a36Sopenharmony_ci {0x00ba, 0x8804}, /* SSI Slave address */ 100962306a36Sopenharmony_ci {0x0010, 0x8802}, /* 93.75kHz SSI Clock Two DataByte */ 101062306a36Sopenharmony_ci 101162306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 101262306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 10 */ 101362306a36Sopenharmony_ci {0x0010, 0x8802}, /* Will write 2 bytes (DATA1+DATA2) */ 101462306a36Sopenharmony_ci {0x0020, 0x8801}, /* Register address for SSI read/write */ 101562306a36Sopenharmony_ci {0x0044, 0x8805}, /* DATA2 */ 101662306a36Sopenharmony_ci {0x0004, 0x8800}, /* DATA1 -> write triggered */ 101762306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 101862306a36Sopenharmony_ci 101962306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 102062306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 10 */ 102162306a36Sopenharmony_ci {0x0010, 0x8802}, 102262306a36Sopenharmony_ci {0x0009, 0x8801}, 102362306a36Sopenharmony_ci {0x0042, 0x8805}, 102462306a36Sopenharmony_ci {0x0001, 0x8800}, 102562306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 102662306a36Sopenharmony_ci 102762306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 102862306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 10 */ 102962306a36Sopenharmony_ci {0x0010, 0x8802}, 103062306a36Sopenharmony_ci {0x003c, 0x8801}, 103162306a36Sopenharmony_ci {0x0001, 0x8805}, 103262306a36Sopenharmony_ci {0x0000, 0x8800}, 103362306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 103462306a36Sopenharmony_ci 103562306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 103662306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 10 */ 103762306a36Sopenharmony_ci {0x0010, 0x8802}, 103862306a36Sopenharmony_ci {0x0001, 0x8801}, 103962306a36Sopenharmony_ci {0x000a, 0x8805}, 104062306a36Sopenharmony_ci {0x0000, 0x8800}, 104162306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 104262306a36Sopenharmony_ci 104362306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 104462306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 10 */ 104562306a36Sopenharmony_ci {0x0010, 0x8802}, 104662306a36Sopenharmony_ci {0x0002, 0x8801}, 104762306a36Sopenharmony_ci {0x0000, 0x8805}, 104862306a36Sopenharmony_ci {0x0000, 0x8800}, 104962306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 105062306a36Sopenharmony_ci 105162306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 105262306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 10 */ 105362306a36Sopenharmony_ci {0x0010, 0x8802}, 105462306a36Sopenharmony_ci {0x0003, 0x8801}, 105562306a36Sopenharmony_ci {0x0027, 0x8805}, 105662306a36Sopenharmony_ci {0x0001, 0x8800}, 105762306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 105862306a36Sopenharmony_ci 105962306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 106062306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 10 */ 106162306a36Sopenharmony_ci {0x0010, 0x8802}, 106262306a36Sopenharmony_ci {0x0004, 0x8801}, 106362306a36Sopenharmony_ci {0x0065, 0x8805}, 106462306a36Sopenharmony_ci {0x0001, 0x8800}, 106562306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 106662306a36Sopenharmony_ci 106762306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 106862306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 10 */ 106962306a36Sopenharmony_ci {0x0010, 0x8802}, 107062306a36Sopenharmony_ci {0x0005, 0x8801}, 107162306a36Sopenharmony_ci {0x0003, 0x8805}, 107262306a36Sopenharmony_ci {0x0000, 0x8800}, 107362306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 107462306a36Sopenharmony_ci 107562306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 107662306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 10 */ 107762306a36Sopenharmony_ci {0x0010, 0x8802}, 107862306a36Sopenharmony_ci {0x0006, 0x8801}, 107962306a36Sopenharmony_ci {0x001c, 0x8805}, 108062306a36Sopenharmony_ci {0x0000, 0x8800}, 108162306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 108262306a36Sopenharmony_ci 108362306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 108462306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 10 */ 108562306a36Sopenharmony_ci {0x0010, 0x8802}, 108662306a36Sopenharmony_ci {0x0007, 0x8801}, 108762306a36Sopenharmony_ci {0x002a, 0x8805}, 108862306a36Sopenharmony_ci {0x0000, 0x8800}, 108962306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 109062306a36Sopenharmony_ci 109162306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 109262306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 10 */ 109362306a36Sopenharmony_ci {0x0010, 0x8802}, 109462306a36Sopenharmony_ci {0x000e, 0x8801}, 109562306a36Sopenharmony_ci {0x0000, 0x8805}, 109662306a36Sopenharmony_ci {0x0000, 0x8800}, 109762306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 109862306a36Sopenharmony_ci 109962306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 110062306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 10 */ 110162306a36Sopenharmony_ci {0x0010, 0x8802}, 110262306a36Sopenharmony_ci {0x0028, 0x8801}, 110362306a36Sopenharmony_ci {0x002e, 0x8805}, 110462306a36Sopenharmony_ci {0x0000, 0x8800}, 110562306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 110662306a36Sopenharmony_ci 110762306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 110862306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 10 */ 110962306a36Sopenharmony_ci {0x0010, 0x8802}, 111062306a36Sopenharmony_ci {0x0039, 0x8801}, 111162306a36Sopenharmony_ci {0x0013, 0x8805}, 111262306a36Sopenharmony_ci {0x0000, 0x8800}, 111362306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 111462306a36Sopenharmony_ci 111562306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 111662306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 10 */ 111762306a36Sopenharmony_ci {0x0010, 0x8802}, 111862306a36Sopenharmony_ci {0x003b, 0x8801}, 111962306a36Sopenharmony_ci {0x000c, 0x8805}, 112062306a36Sopenharmony_ci {0x0000, 0x8800}, 112162306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 112262306a36Sopenharmony_ci 112362306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 112462306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 10 */ 112562306a36Sopenharmony_ci {0x0010, 0x8802}, 112662306a36Sopenharmony_ci {0x0035, 0x8801}, 112762306a36Sopenharmony_ci {0x0028, 0x8805}, 112862306a36Sopenharmony_ci {0x0000, 0x8800}, 112962306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 113062306a36Sopenharmony_ci 113162306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 113262306a36Sopenharmony_ci /* READ { 0x0001, 0x8802 } -> 0000: 10 */ 113362306a36Sopenharmony_ci {0x0010, 0x8802}, 113462306a36Sopenharmony_ci {0x0009, 0x8801}, 113562306a36Sopenharmony_ci {0x0042, 0x8805}, 113662306a36Sopenharmony_ci {0x0001, 0x8800}, 113762306a36Sopenharmony_ci /* READ { 0x0001, 0x8803 } -> 0000: 00 */ 113862306a36Sopenharmony_ci 113962306a36Sopenharmony_ci {0x0050, 0x8703}, 114062306a36Sopenharmony_ci {0x0002, 0x8704}, /* External input CKIx1 */ 114162306a36Sopenharmony_ci {0x0001, 0x870c}, /* Select CKOx2 output */ 114262306a36Sopenharmony_ci {0x009a, 0x8600}, /* Line memory Read Counter (L) */ 114362306a36Sopenharmony_ci {0x0001, 0x8606}, /* 1 Line memory Read Counter (H) Result: (d)410 */ 114462306a36Sopenharmony_ci {0x0023, 0x8601}, 114562306a36Sopenharmony_ci {0x0010, 0x8602}, 114662306a36Sopenharmony_ci {0x000a, 0x8603}, 114762306a36Sopenharmony_ci {0x009a, 0x8600}, 114862306a36Sopenharmony_ci {0x0001, 0x865b}, /* 1 Horizontal Offset for Valid Pixel(L) */ 114962306a36Sopenharmony_ci {0x0003, 0x865c}, /* Vertical offset for valid lines (L) */ 115062306a36Sopenharmony_ci {0x0058, 0x865d}, /* Horizontal valid pixels window (L) */ 115162306a36Sopenharmony_ci {0x0048, 0x865e}, /* Vertical valid lines window (L) */ 115262306a36Sopenharmony_ci {0x0000, 0x865f}, 115362306a36Sopenharmony_ci 115462306a36Sopenharmony_ci {0x0006, 0x8660}, 115562306a36Sopenharmony_ci /* Enable nibble data input, select nibble input order */ 115662306a36Sopenharmony_ci 115762306a36Sopenharmony_ci {0x0013, 0x8608}, /* A11 Coeficients for color correction */ 115862306a36Sopenharmony_ci {0x0028, 0x8609}, 115962306a36Sopenharmony_ci /* Note: these values are confirmed at the end of array */ 116062306a36Sopenharmony_ci {0x0005, 0x860a}, /* ... */ 116162306a36Sopenharmony_ci {0x0025, 0x860b}, 116262306a36Sopenharmony_ci {0x00e1, 0x860c}, 116362306a36Sopenharmony_ci {0x00fa, 0x860d}, 116462306a36Sopenharmony_ci {0x00f4, 0x860e}, 116562306a36Sopenharmony_ci {0x00e8, 0x860f}, 116662306a36Sopenharmony_ci {0x0025, 0x8610}, /* A33 Coef. */ 116762306a36Sopenharmony_ci {0x00fc, 0x8611}, /* White balance offset: R */ 116862306a36Sopenharmony_ci {0x0001, 0x8612}, /* White balance offset: Gr */ 116962306a36Sopenharmony_ci {0x00fe, 0x8613}, /* White balance offset: B */ 117062306a36Sopenharmony_ci {0x0000, 0x8614}, /* White balance offset: Gb */ 117162306a36Sopenharmony_ci 117262306a36Sopenharmony_ci {0x0064, 0x8651}, /* R gain for white balance (L) */ 117362306a36Sopenharmony_ci {0x0040, 0x8652}, /* Gr gain for white balance (L) */ 117462306a36Sopenharmony_ci {0x0066, 0x8653}, /* B gain for white balance (L) */ 117562306a36Sopenharmony_ci {0x0040, 0x8654}, /* Gb gain for white balance (L) */ 117662306a36Sopenharmony_ci {0x0001, 0x863f}, /* Enable fixed gamma correction */ 117762306a36Sopenharmony_ci 117862306a36Sopenharmony_ci {0x00a1, 0x8656}, /* Size - Window1: 256x256, Window2: 128x128, 117962306a36Sopenharmony_ci * UV division: UV no change, 118062306a36Sopenharmony_ci * Enable New edge enhancement */ 118162306a36Sopenharmony_ci {0x0018, 0x8657}, /* Edge gain high threshold */ 118262306a36Sopenharmony_ci {0x0020, 0x8658}, /* Edge gain low threshold */ 118362306a36Sopenharmony_ci {0x000a, 0x8659}, /* Edge bandwidth high threshold */ 118462306a36Sopenharmony_ci {0x0005, 0x865a}, /* Edge bandwidth low threshold */ 118562306a36Sopenharmony_ci {0x0064, 0x8607}, /* UV filter enable */ 118662306a36Sopenharmony_ci 118762306a36Sopenharmony_ci {0x0016, 0x8660}, 118862306a36Sopenharmony_ci {0x0000, 0x86b0}, /* Bad pixels compensation address */ 118962306a36Sopenharmony_ci {0x00dc, 0x86b1}, /* X coord for bad pixels compensation (L) */ 119062306a36Sopenharmony_ci {0x0000, 0x86b2}, 119162306a36Sopenharmony_ci {0x0009, 0x86b3}, /* Y coord for bad pixels compensation (L) */ 119262306a36Sopenharmony_ci {0x0000, 0x86b4}, 119362306a36Sopenharmony_ci 119462306a36Sopenharmony_ci {0x0001, 0x86b0}, 119562306a36Sopenharmony_ci {0x00f5, 0x86b1}, 119662306a36Sopenharmony_ci {0x0000, 0x86b2}, 119762306a36Sopenharmony_ci {0x00c6, 0x86b3}, 119862306a36Sopenharmony_ci {0x0000, 0x86b4}, 119962306a36Sopenharmony_ci 120062306a36Sopenharmony_ci {0x0002, 0x86b0}, 120162306a36Sopenharmony_ci {0x001c, 0x86b1}, 120262306a36Sopenharmony_ci {0x0001, 0x86b2}, 120362306a36Sopenharmony_ci {0x00d7, 0x86b3}, 120462306a36Sopenharmony_ci {0x0000, 0x86b4}, 120562306a36Sopenharmony_ci 120662306a36Sopenharmony_ci {0x0003, 0x86b0}, 120762306a36Sopenharmony_ci {0x001c, 0x86b1}, 120862306a36Sopenharmony_ci {0x0001, 0x86b2}, 120962306a36Sopenharmony_ci {0x00d8, 0x86b3}, 121062306a36Sopenharmony_ci {0x0000, 0x86b4}, 121162306a36Sopenharmony_ci 121262306a36Sopenharmony_ci {0x0004, 0x86b0}, 121362306a36Sopenharmony_ci {0x001d, 0x86b1}, 121462306a36Sopenharmony_ci {0x0001, 0x86b2}, 121562306a36Sopenharmony_ci {0x00d8, 0x86b3}, 121662306a36Sopenharmony_ci {0x0000, 0x86b4}, 121762306a36Sopenharmony_ci {0x001e, 0x8660}, 121862306a36Sopenharmony_ci 121962306a36Sopenharmony_ci /* READ { 0x0000, 0x8608 } -> 0000: 13 */ 122062306a36Sopenharmony_ci /* READ { 0x0000, 0x8609 } -> 0000: 28 */ 122162306a36Sopenharmony_ci /* READ { 0x0000, 0x8610 } -> 0000: 05 */ 122262306a36Sopenharmony_ci /* READ { 0x0000, 0x8611 } -> 0000: 25 */ 122362306a36Sopenharmony_ci /* READ { 0x0000, 0x8612 } -> 0000: e1 */ 122462306a36Sopenharmony_ci /* READ { 0x0000, 0x8613 } -> 0000: fa */ 122562306a36Sopenharmony_ci /* READ { 0x0000, 0x8614 } -> 0000: f4 */ 122662306a36Sopenharmony_ci /* READ { 0x0000, 0x8615 } -> 0000: e8 */ 122762306a36Sopenharmony_ci /* READ { 0x0000, 0x8616 } -> 0000: 25 */ 122862306a36Sopenharmony_ci {} 122962306a36Sopenharmony_ci}; 123062306a36Sopenharmony_ci 123162306a36Sopenharmony_cistatic int reg_write(struct gspca_dev *gspca_dev, u16 index, u16 value) 123262306a36Sopenharmony_ci{ 123362306a36Sopenharmony_ci int ret; 123462306a36Sopenharmony_ci struct usb_device *dev = gspca_dev->dev; 123562306a36Sopenharmony_ci 123662306a36Sopenharmony_ci ret = usb_control_msg(dev, 123762306a36Sopenharmony_ci usb_sndctrlpipe(dev, 0), 123862306a36Sopenharmony_ci 0, /* request */ 123962306a36Sopenharmony_ci USB_TYPE_VENDOR | USB_RECIP_DEVICE, 124062306a36Sopenharmony_ci value, index, NULL, 0, 500); 124162306a36Sopenharmony_ci gspca_dbg(gspca_dev, D_USBO, "reg write i:0x%04x = 0x%02x\n", 124262306a36Sopenharmony_ci index, value); 124362306a36Sopenharmony_ci if (ret < 0) 124462306a36Sopenharmony_ci pr_err("reg write: error %d\n", ret); 124562306a36Sopenharmony_ci return ret; 124662306a36Sopenharmony_ci} 124762306a36Sopenharmony_ci 124862306a36Sopenharmony_ci/* read 1 byte */ 124962306a36Sopenharmony_ci/* returns: negative is error, pos or zero is data */ 125062306a36Sopenharmony_cistatic int reg_read(struct gspca_dev *gspca_dev, 125162306a36Sopenharmony_ci u16 index) /* wIndex */ 125262306a36Sopenharmony_ci{ 125362306a36Sopenharmony_ci int ret; 125462306a36Sopenharmony_ci 125562306a36Sopenharmony_ci ret = usb_control_msg(gspca_dev->dev, 125662306a36Sopenharmony_ci usb_rcvctrlpipe(gspca_dev->dev, 0), 125762306a36Sopenharmony_ci 0, /* register */ 125862306a36Sopenharmony_ci USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 125962306a36Sopenharmony_ci 0, /* value */ 126062306a36Sopenharmony_ci index, 126162306a36Sopenharmony_ci gspca_dev->usb_buf, 1, 126262306a36Sopenharmony_ci 500); /* timeout */ 126362306a36Sopenharmony_ci gspca_dbg(gspca_dev, D_USBI, "reg read i:%04x --> %02x\n", 126462306a36Sopenharmony_ci index, gspca_dev->usb_buf[0]); 126562306a36Sopenharmony_ci if (ret < 0) { 126662306a36Sopenharmony_ci pr_err("reg_read err %d\n", ret); 126762306a36Sopenharmony_ci return ret; 126862306a36Sopenharmony_ci } 126962306a36Sopenharmony_ci return gspca_dev->usb_buf[0]; 127062306a36Sopenharmony_ci} 127162306a36Sopenharmony_ci 127262306a36Sopenharmony_ci/* send 1 or 2 bytes to the sensor via the Synchronous Serial Interface */ 127362306a36Sopenharmony_cistatic int ssi_w(struct gspca_dev *gspca_dev, 127462306a36Sopenharmony_ci u16 reg, u16 val) 127562306a36Sopenharmony_ci{ 127662306a36Sopenharmony_ci int ret, retry; 127762306a36Sopenharmony_ci 127862306a36Sopenharmony_ci ret = reg_write(gspca_dev, 0x8802, reg >> 8); 127962306a36Sopenharmony_ci if (ret < 0) 128062306a36Sopenharmony_ci goto out; 128162306a36Sopenharmony_ci ret = reg_write(gspca_dev, 0x8801, reg & 0x00ff); 128262306a36Sopenharmony_ci if (ret < 0) 128362306a36Sopenharmony_ci goto out; 128462306a36Sopenharmony_ci if ((reg & 0xff00) == 0x1000) { /* if 2 bytes */ 128562306a36Sopenharmony_ci ret = reg_write(gspca_dev, 0x8805, val & 0x00ff); 128662306a36Sopenharmony_ci if (ret < 0) 128762306a36Sopenharmony_ci goto out; 128862306a36Sopenharmony_ci val >>= 8; 128962306a36Sopenharmony_ci } 129062306a36Sopenharmony_ci ret = reg_write(gspca_dev, 0x8800, val); 129162306a36Sopenharmony_ci if (ret < 0) 129262306a36Sopenharmony_ci goto out; 129362306a36Sopenharmony_ci 129462306a36Sopenharmony_ci /* poll until not busy */ 129562306a36Sopenharmony_ci retry = 10; 129662306a36Sopenharmony_ci for (;;) { 129762306a36Sopenharmony_ci ret = reg_read(gspca_dev, 0x8803); 129862306a36Sopenharmony_ci if (ret < 0) 129962306a36Sopenharmony_ci break; 130062306a36Sopenharmony_ci if (gspca_dev->usb_buf[0] == 0) 130162306a36Sopenharmony_ci break; 130262306a36Sopenharmony_ci if (--retry <= 0) { 130362306a36Sopenharmony_ci gspca_err(gspca_dev, "ssi_w busy %02x\n", 130462306a36Sopenharmony_ci gspca_dev->usb_buf[0]); 130562306a36Sopenharmony_ci ret = -1; 130662306a36Sopenharmony_ci break; 130762306a36Sopenharmony_ci } 130862306a36Sopenharmony_ci msleep(8); 130962306a36Sopenharmony_ci } 131062306a36Sopenharmony_ci 131162306a36Sopenharmony_ciout: 131262306a36Sopenharmony_ci return ret; 131362306a36Sopenharmony_ci} 131462306a36Sopenharmony_ci 131562306a36Sopenharmony_cistatic int write_vector(struct gspca_dev *gspca_dev, 131662306a36Sopenharmony_ci const u16 (*data)[2]) 131762306a36Sopenharmony_ci{ 131862306a36Sopenharmony_ci int ret = 0; 131962306a36Sopenharmony_ci 132062306a36Sopenharmony_ci while ((*data)[1] != 0) { 132162306a36Sopenharmony_ci if ((*data)[1] & 0x8000) { 132262306a36Sopenharmony_ci if ((*data)[1] == 0xdd00) /* delay */ 132362306a36Sopenharmony_ci msleep((*data)[0]); 132462306a36Sopenharmony_ci else 132562306a36Sopenharmony_ci ret = reg_write(gspca_dev, (*data)[1], 132662306a36Sopenharmony_ci (*data)[0]); 132762306a36Sopenharmony_ci } else { 132862306a36Sopenharmony_ci ret = ssi_w(gspca_dev, (*data)[1], (*data)[0]); 132962306a36Sopenharmony_ci } 133062306a36Sopenharmony_ci if (ret < 0) 133162306a36Sopenharmony_ci break; 133262306a36Sopenharmony_ci data++; 133362306a36Sopenharmony_ci } 133462306a36Sopenharmony_ci return ret; 133562306a36Sopenharmony_ci} 133662306a36Sopenharmony_ci 133762306a36Sopenharmony_ci/* this function is called at probe time */ 133862306a36Sopenharmony_cistatic int sd_config(struct gspca_dev *gspca_dev, 133962306a36Sopenharmony_ci const struct usb_device_id *id) 134062306a36Sopenharmony_ci{ 134162306a36Sopenharmony_ci struct sd *sd = (struct sd *) gspca_dev; 134262306a36Sopenharmony_ci struct cam *cam; 134362306a36Sopenharmony_ci const u16 (*init_data)[2]; 134462306a36Sopenharmony_ci static const u16 (*(init_data_tb[]))[2] = { 134562306a36Sopenharmony_ci spca508_vista_init_data, /* CreativeVista 0 */ 134662306a36Sopenharmony_ci spca508_sightcam_init_data, /* HamaUSBSightcam 1 */ 134762306a36Sopenharmony_ci spca508_sightcam2_init_data, /* HamaUSBSightcam2 2 */ 134862306a36Sopenharmony_ci spca508cs110_init_data, /* IntelEasyPCCamera 3 */ 134962306a36Sopenharmony_ci spca508cs110_init_data, /* MicroInnovationIC200 4 */ 135062306a36Sopenharmony_ci spca508_init_data, /* ViewQuestVQ110 5 */ 135162306a36Sopenharmony_ci }; 135262306a36Sopenharmony_ci int data1, data2; 135362306a36Sopenharmony_ci 135462306a36Sopenharmony_ci /* Read from global register the USB product and vendor IDs, just to 135562306a36Sopenharmony_ci * prove that we can communicate with the device. This works, which 135662306a36Sopenharmony_ci * confirms at we are communicating properly and that the device 135762306a36Sopenharmony_ci * is a 508. */ 135862306a36Sopenharmony_ci data1 = reg_read(gspca_dev, 0x8104); 135962306a36Sopenharmony_ci data2 = reg_read(gspca_dev, 0x8105); 136062306a36Sopenharmony_ci gspca_dbg(gspca_dev, D_PROBE, "Webcam Vendor ID: 0x%02x%02x\n", 136162306a36Sopenharmony_ci data2, data1); 136262306a36Sopenharmony_ci 136362306a36Sopenharmony_ci data1 = reg_read(gspca_dev, 0x8106); 136462306a36Sopenharmony_ci data2 = reg_read(gspca_dev, 0x8107); 136562306a36Sopenharmony_ci gspca_dbg(gspca_dev, D_PROBE, "Webcam Product ID: 0x%02x%02x\n", 136662306a36Sopenharmony_ci data2, data1); 136762306a36Sopenharmony_ci 136862306a36Sopenharmony_ci data1 = reg_read(gspca_dev, 0x8621); 136962306a36Sopenharmony_ci gspca_dbg(gspca_dev, D_PROBE, "Window 1 average luminance: %d\n", 137062306a36Sopenharmony_ci data1); 137162306a36Sopenharmony_ci 137262306a36Sopenharmony_ci cam = &gspca_dev->cam; 137362306a36Sopenharmony_ci cam->cam_mode = sif_mode; 137462306a36Sopenharmony_ci cam->nmodes = ARRAY_SIZE(sif_mode); 137562306a36Sopenharmony_ci 137662306a36Sopenharmony_ci sd->subtype = id->driver_info; 137762306a36Sopenharmony_ci 137862306a36Sopenharmony_ci init_data = init_data_tb[sd->subtype]; 137962306a36Sopenharmony_ci return write_vector(gspca_dev, init_data); 138062306a36Sopenharmony_ci} 138162306a36Sopenharmony_ci 138262306a36Sopenharmony_ci/* this function is called at probe and resume time */ 138362306a36Sopenharmony_cistatic int sd_init(struct gspca_dev *gspca_dev) 138462306a36Sopenharmony_ci{ 138562306a36Sopenharmony_ci return 0; 138662306a36Sopenharmony_ci} 138762306a36Sopenharmony_ci 138862306a36Sopenharmony_cistatic int sd_start(struct gspca_dev *gspca_dev) 138962306a36Sopenharmony_ci{ 139062306a36Sopenharmony_ci int mode; 139162306a36Sopenharmony_ci 139262306a36Sopenharmony_ci mode = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv; 139362306a36Sopenharmony_ci reg_write(gspca_dev, 0x8500, mode); 139462306a36Sopenharmony_ci switch (mode) { 139562306a36Sopenharmony_ci case 0: 139662306a36Sopenharmony_ci case 1: 139762306a36Sopenharmony_ci reg_write(gspca_dev, 0x8700, 0x28); /* clock */ 139862306a36Sopenharmony_ci break; 139962306a36Sopenharmony_ci default: 140062306a36Sopenharmony_ci/* case 2: */ 140162306a36Sopenharmony_ci/* case 3: */ 140262306a36Sopenharmony_ci reg_write(gspca_dev, 0x8700, 0x23); /* clock */ 140362306a36Sopenharmony_ci break; 140462306a36Sopenharmony_ci } 140562306a36Sopenharmony_ci reg_write(gspca_dev, 0x8112, 0x10 | 0x20); 140662306a36Sopenharmony_ci return 0; 140762306a36Sopenharmony_ci} 140862306a36Sopenharmony_ci 140962306a36Sopenharmony_cistatic void sd_stopN(struct gspca_dev *gspca_dev) 141062306a36Sopenharmony_ci{ 141162306a36Sopenharmony_ci /* Video ISO disable, Video Drop Packet enable: */ 141262306a36Sopenharmony_ci reg_write(gspca_dev, 0x8112, 0x20); 141362306a36Sopenharmony_ci} 141462306a36Sopenharmony_ci 141562306a36Sopenharmony_cistatic void sd_pkt_scan(struct gspca_dev *gspca_dev, 141662306a36Sopenharmony_ci u8 *data, /* isoc packet */ 141762306a36Sopenharmony_ci int len) /* iso packet length */ 141862306a36Sopenharmony_ci{ 141962306a36Sopenharmony_ci switch (data[0]) { 142062306a36Sopenharmony_ci case 0: /* start of frame */ 142162306a36Sopenharmony_ci gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0); 142262306a36Sopenharmony_ci data += SPCA508_OFFSET_DATA; 142362306a36Sopenharmony_ci len -= SPCA508_OFFSET_DATA; 142462306a36Sopenharmony_ci gspca_frame_add(gspca_dev, FIRST_PACKET, data, len); 142562306a36Sopenharmony_ci break; 142662306a36Sopenharmony_ci case 0xff: /* drop */ 142762306a36Sopenharmony_ci break; 142862306a36Sopenharmony_ci default: 142962306a36Sopenharmony_ci data += 1; 143062306a36Sopenharmony_ci len -= 1; 143162306a36Sopenharmony_ci gspca_frame_add(gspca_dev, INTER_PACKET, data, len); 143262306a36Sopenharmony_ci break; 143362306a36Sopenharmony_ci } 143462306a36Sopenharmony_ci} 143562306a36Sopenharmony_ci 143662306a36Sopenharmony_cistatic void setbrightness(struct gspca_dev *gspca_dev, s32 brightness) 143762306a36Sopenharmony_ci{ 143862306a36Sopenharmony_ci /* MX seem contrast */ 143962306a36Sopenharmony_ci reg_write(gspca_dev, 0x8651, brightness); 144062306a36Sopenharmony_ci reg_write(gspca_dev, 0x8652, brightness); 144162306a36Sopenharmony_ci reg_write(gspca_dev, 0x8653, brightness); 144262306a36Sopenharmony_ci reg_write(gspca_dev, 0x8654, brightness); 144362306a36Sopenharmony_ci} 144462306a36Sopenharmony_ci 144562306a36Sopenharmony_cistatic int sd_s_ctrl(struct v4l2_ctrl *ctrl) 144662306a36Sopenharmony_ci{ 144762306a36Sopenharmony_ci struct gspca_dev *gspca_dev = 144862306a36Sopenharmony_ci container_of(ctrl->handler, struct gspca_dev, ctrl_handler); 144962306a36Sopenharmony_ci 145062306a36Sopenharmony_ci gspca_dev->usb_err = 0; 145162306a36Sopenharmony_ci 145262306a36Sopenharmony_ci if (!gspca_dev->streaming) 145362306a36Sopenharmony_ci return 0; 145462306a36Sopenharmony_ci 145562306a36Sopenharmony_ci switch (ctrl->id) { 145662306a36Sopenharmony_ci case V4L2_CID_BRIGHTNESS: 145762306a36Sopenharmony_ci setbrightness(gspca_dev, ctrl->val); 145862306a36Sopenharmony_ci break; 145962306a36Sopenharmony_ci } 146062306a36Sopenharmony_ci return gspca_dev->usb_err; 146162306a36Sopenharmony_ci} 146262306a36Sopenharmony_ci 146362306a36Sopenharmony_cistatic const struct v4l2_ctrl_ops sd_ctrl_ops = { 146462306a36Sopenharmony_ci .s_ctrl = sd_s_ctrl, 146562306a36Sopenharmony_ci}; 146662306a36Sopenharmony_ci 146762306a36Sopenharmony_cistatic int sd_init_controls(struct gspca_dev *gspca_dev) 146862306a36Sopenharmony_ci{ 146962306a36Sopenharmony_ci struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler; 147062306a36Sopenharmony_ci 147162306a36Sopenharmony_ci gspca_dev->vdev.ctrl_handler = hdl; 147262306a36Sopenharmony_ci v4l2_ctrl_handler_init(hdl, 5); 147362306a36Sopenharmony_ci v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 147462306a36Sopenharmony_ci V4L2_CID_BRIGHTNESS, 0, 255, 1, 128); 147562306a36Sopenharmony_ci 147662306a36Sopenharmony_ci if (hdl->error) { 147762306a36Sopenharmony_ci pr_err("Could not initialize controls\n"); 147862306a36Sopenharmony_ci return hdl->error; 147962306a36Sopenharmony_ci } 148062306a36Sopenharmony_ci return 0; 148162306a36Sopenharmony_ci} 148262306a36Sopenharmony_ci 148362306a36Sopenharmony_ci/* sub-driver description */ 148462306a36Sopenharmony_cistatic const struct sd_desc sd_desc = { 148562306a36Sopenharmony_ci .name = MODULE_NAME, 148662306a36Sopenharmony_ci .config = sd_config, 148762306a36Sopenharmony_ci .init = sd_init, 148862306a36Sopenharmony_ci .init_controls = sd_init_controls, 148962306a36Sopenharmony_ci .start = sd_start, 149062306a36Sopenharmony_ci .stopN = sd_stopN, 149162306a36Sopenharmony_ci .pkt_scan = sd_pkt_scan, 149262306a36Sopenharmony_ci}; 149362306a36Sopenharmony_ci 149462306a36Sopenharmony_ci/* -- module initialisation -- */ 149562306a36Sopenharmony_cistatic const struct usb_device_id device_table[] = { 149662306a36Sopenharmony_ci {USB_DEVICE(0x0130, 0x0130), .driver_info = HamaUSBSightcam}, 149762306a36Sopenharmony_ci {USB_DEVICE(0x041e, 0x4018), .driver_info = CreativeVista}, 149862306a36Sopenharmony_ci {USB_DEVICE(0x0733, 0x0110), .driver_info = ViewQuestVQ110}, 149962306a36Sopenharmony_ci {USB_DEVICE(0x0af9, 0x0010), .driver_info = HamaUSBSightcam}, 150062306a36Sopenharmony_ci {USB_DEVICE(0x0af9, 0x0011), .driver_info = HamaUSBSightcam2}, 150162306a36Sopenharmony_ci {USB_DEVICE(0x8086, 0x0110), .driver_info = IntelEasyPCCamera}, 150262306a36Sopenharmony_ci {} 150362306a36Sopenharmony_ci}; 150462306a36Sopenharmony_ciMODULE_DEVICE_TABLE(usb, device_table); 150562306a36Sopenharmony_ci 150662306a36Sopenharmony_ci/* -- device connect -- */ 150762306a36Sopenharmony_cistatic int sd_probe(struct usb_interface *intf, 150862306a36Sopenharmony_ci const struct usb_device_id *id) 150962306a36Sopenharmony_ci{ 151062306a36Sopenharmony_ci return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd), 151162306a36Sopenharmony_ci THIS_MODULE); 151262306a36Sopenharmony_ci} 151362306a36Sopenharmony_ci 151462306a36Sopenharmony_cistatic struct usb_driver sd_driver = { 151562306a36Sopenharmony_ci .name = MODULE_NAME, 151662306a36Sopenharmony_ci .id_table = device_table, 151762306a36Sopenharmony_ci .probe = sd_probe, 151862306a36Sopenharmony_ci .disconnect = gspca_disconnect, 151962306a36Sopenharmony_ci#ifdef CONFIG_PM 152062306a36Sopenharmony_ci .suspend = gspca_suspend, 152162306a36Sopenharmony_ci .resume = gspca_resume, 152262306a36Sopenharmony_ci .reset_resume = gspca_resume, 152362306a36Sopenharmony_ci#endif 152462306a36Sopenharmony_ci}; 152562306a36Sopenharmony_ci 152662306a36Sopenharmony_cimodule_usb_driver(sd_driver); 1527