1c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* 28d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine * ov534-ov9xxx gspca driver 3c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * 48d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine * Copyright (C) 2009-2011 Jean-Francois Moine http://moinejf.free.fr 5c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * Copyright (C) 2008 Antonio Ospite <ospite@studenti.unina.it> 6c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * Copyright (C) 2008 Jim Paris <jim@jtan.com> 7c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * 8c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * Based on a prototype written by Mark Ferrell <majortrips@gmail.com> 9c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * USB protocol reverse engineered by Jim Paris <jim@jtan.com> 10c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * https://jim.sh/svn/jim/devl/playstation/ps3/eye/test/ 11c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * 12c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * This program is free software; you can redistribute it and/or modify 13c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * it under the terms of the GNU General Public License as published by 14c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * the Free Software Foundation; either version 2 of the License, or 15c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * any later version. 16c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * 17c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * This program is distributed in the hope that it will be useful, 18c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * but WITHOUT ANY WARRANTY; without even the implied warranty of 19c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * GNU General Public License for more details. 21c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * 22c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * You should have received a copy of the GNU General Public License 23c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * along with this program; if not, write to the Free Software 24c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 25c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine */ 26c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 27133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 28133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches 29c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define MODULE_NAME "ov534_9" 30c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 31c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#include "gspca.h" 32c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 33c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_REG_ADDRESS 0xf1 /* sensor address */ 34c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_REG_SUBADDR 0xf2 35c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_REG_WRITE 0xf3 36c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_REG_READ 0xf4 37c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_REG_OPERATION 0xf5 38c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_REG_STATUS 0xf6 39c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 40c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_OP_WRITE_3 0x37 41c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_OP_WRITE_2 0x33 42c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define OV534_OP_READ_2 0xf9 43c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 44c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define CTRL_TIMEOUT 500 45c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 46c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois MoineMODULE_AUTHOR("Jean-Francois Moine <moinejf@free.fr>"); 47c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois MoineMODULE_DESCRIPTION("GSPCA/OV534_9 USB Camera Driver"); 48c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois MoineMODULE_LICENSE("GPL"); 49c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 507592e0377636963eade33810fcad06487b8b153fJean-François Moine/* controls */ 517592e0377636963eade33810fcad06487b8b153fJean-François Moineenum e_ctrl { 527592e0377636963eade33810fcad06487b8b153fJean-François Moine BRIGHTNESS, 537592e0377636963eade33810fcad06487b8b153fJean-François Moine CONTRAST, 547592e0377636963eade33810fcad06487b8b153fJean-François Moine AUTOGAIN, 557592e0377636963eade33810fcad06487b8b153fJean-François Moine EXPOSURE, 567592e0377636963eade33810fcad06487b8b153fJean-François Moine SHARPNESS, 577592e0377636963eade33810fcad06487b8b153fJean-François Moine SATUR, 587592e0377636963eade33810fcad06487b8b153fJean-François Moine LIGHTFREQ, 597592e0377636963eade33810fcad06487b8b153fJean-François Moine NCTRLS /* number of controls */ 607592e0377636963eade33810fcad06487b8b153fJean-François Moine}; 617592e0377636963eade33810fcad06487b8b153fJean-François Moine 62c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* specific webcam descriptor */ 63c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestruct sd { 64c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine struct gspca_dev gspca_dev; /* !! must be the first item */ 657592e0377636963eade33810fcad06487b8b153fJean-François Moine struct gspca_ctrl ctrls[NCTRLS]; 66c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine __u32 last_pts; 67c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine u8 last_fid; 688d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine 698d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine u8 sensor; 708d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine}; 718d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moineenum sensors { 728d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine SENSOR_OV965x, /* ov9657 */ 738d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine SENSOR_OV971x, /* ov9712 */ 74965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero SENSOR_OV562x, /* ov5621 */ 758d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine NSENSORS 76c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 77c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 78c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* V4L2 controls supported by the driver */ 797592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic void setbrightness(struct gspca_dev *gspca_dev); 807592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic void setcontrast(struct gspca_dev *gspca_dev); 817592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic void setautogain(struct gspca_dev *gspca_dev); 827592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic void setexposure(struct gspca_dev *gspca_dev); 837592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic void setsharpness(struct gspca_dev *gspca_dev); 847592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic void setsatur(struct gspca_dev *gspca_dev); 857592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic void setlightfreq(struct gspca_dev *gspca_dev); 867592e0377636963eade33810fcad06487b8b153fJean-François Moine 877592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic const struct ctrl sd_ctrls[NCTRLS] = { 887592e0377636963eade33810fcad06487b8b153fJean-François Moine[BRIGHTNESS] = { 89c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine { 90c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .id = V4L2_CID_BRIGHTNESS, 91c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .type = V4L2_CTRL_TYPE_INTEGER, 92c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .name = "Brightness", 93c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .minimum = 0, 94c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .maximum = 15, 95c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .step = 1, 967592e0377636963eade33810fcad06487b8b153fJean-François Moine .default_value = 7 97c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine }, 987592e0377636963eade33810fcad06487b8b153fJean-François Moine .set_control = setbrightness 99c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine }, 1007592e0377636963eade33810fcad06487b8b153fJean-François Moine[CONTRAST] = { 101c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine { 102c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .id = V4L2_CID_CONTRAST, 103c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .type = V4L2_CTRL_TYPE_INTEGER, 104c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .name = "Contrast", 105c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .minimum = 0, 106c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .maximum = 15, 107c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .step = 1, 1087592e0377636963eade33810fcad06487b8b153fJean-François Moine .default_value = 3 109c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine }, 1107592e0377636963eade33810fcad06487b8b153fJean-François Moine .set_control = setcontrast 111c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine }, 1127592e0377636963eade33810fcad06487b8b153fJean-François Moine[AUTOGAIN] = { 113c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine { 114c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .id = V4L2_CID_AUTOGAIN, 115c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .type = V4L2_CTRL_TYPE_BOOLEAN, 116c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .name = "Autogain", 117c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .minimum = 0, 118c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .maximum = 1, 119c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .step = 1, 120c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define AUTOGAIN_DEF 1 121c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .default_value = AUTOGAIN_DEF, 122c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine }, 1237592e0377636963eade33810fcad06487b8b153fJean-François Moine .set_control = setautogain 124c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine }, 1257592e0377636963eade33810fcad06487b8b153fJean-François Moine[EXPOSURE] = { 126c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine { 127c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .id = V4L2_CID_EXPOSURE, 128c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .type = V4L2_CTRL_TYPE_INTEGER, 129c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .name = "Exposure", 130c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .minimum = 0, 131c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .maximum = 3, 132c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .step = 1, 1337592e0377636963eade33810fcad06487b8b153fJean-François Moine .default_value = 0 134c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine }, 1357592e0377636963eade33810fcad06487b8b153fJean-François Moine .set_control = setexposure 136c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine }, 1377592e0377636963eade33810fcad06487b8b153fJean-François Moine[SHARPNESS] = { 138c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine { 139c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .id = V4L2_CID_SHARPNESS, 140c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .type = V4L2_CTRL_TYPE_INTEGER, 141c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .name = "Sharpness", 142c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .minimum = -1, /* -1 = auto */ 143c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .maximum = 4, 144c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .step = 1, 1457592e0377636963eade33810fcad06487b8b153fJean-François Moine .default_value = -1 146c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine }, 1477592e0377636963eade33810fcad06487b8b153fJean-François Moine .set_control = setsharpness 148c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine }, 1497592e0377636963eade33810fcad06487b8b153fJean-François Moine[SATUR] = { 150c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine { 151c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .id = V4L2_CID_SATURATION, 152c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .type = V4L2_CTRL_TYPE_INTEGER, 153c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .name = "Saturation", 154c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .minimum = 0, 155c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .maximum = 4, 156c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .step = 1, 1577592e0377636963eade33810fcad06487b8b153fJean-François Moine .default_value = 2 158c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine }, 1597592e0377636963eade33810fcad06487b8b153fJean-François Moine .set_control = setsatur 160c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine }, 1617592e0377636963eade33810fcad06487b8b153fJean-François Moine[LIGHTFREQ] = { 162c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine { 163c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .id = V4L2_CID_POWER_LINE_FREQUENCY, 164c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .type = V4L2_CTRL_TYPE_MENU, 165c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .name = "Light frequency filter", 166c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .minimum = 0, 167c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .maximum = 2, /* 0: 0, 1: 50Hz, 2:60Hz */ 168c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .step = 1, 1697592e0377636963eade33810fcad06487b8b153fJean-François Moine .default_value = 0 170c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine }, 1717592e0377636963eade33810fcad06487b8b153fJean-François Moine .set_control = setlightfreq 172c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine }, 173c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 174c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 175c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const struct v4l2_pix_format ov965x_mode[] = { 176c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define QVGA_MODE 0 177c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 178c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .bytesperline = 320, 179c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .sizeimage = 320 * 240 * 3 / 8 + 590, 180c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .colorspace = V4L2_COLORSPACE_JPEG}, 181c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define VGA_MODE 1 182c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 183c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .bytesperline = 640, 184c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .sizeimage = 640 * 480 * 3 / 8 + 590, 185c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .colorspace = V4L2_COLORSPACE_JPEG}, 186c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define SVGA_MODE 2 187c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {800, 600, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 188c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .bytesperline = 800, 189c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .sizeimage = 800 * 600 * 3 / 8 + 590, 190c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .colorspace = V4L2_COLORSPACE_JPEG}, 191c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define XGA_MODE 3 192c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {1024, 768, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 193c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .bytesperline = 1024, 194c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .sizeimage = 1024 * 768 * 3 / 8 + 590, 195c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .colorspace = V4L2_COLORSPACE_JPEG}, 196c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define SXGA_MODE 4 197c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {1280, 1024, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 198c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .bytesperline = 1280, 199c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .sizeimage = 1280 * 1024 * 3 / 8 + 590, 200c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .colorspace = V4L2_COLORSPACE_JPEG}, 201c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 202c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 2038d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const struct v4l2_pix_format ov971x_mode[] = { 2048d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {640, 480, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE, 2058d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine .bytesperline = 640, 2068d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine .sizeimage = 640 * 480, 2078d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine .colorspace = V4L2_COLORSPACE_SRGB 2088d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine } 2098d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine}; 2108d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine 211965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguerostatic const struct v4l2_pix_format ov562x_mode[] = { 212965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {2592, 1680, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE, 213965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero .bytesperline = 2592, 214965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero .sizeimage = 2592 * 1680, 215965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero .colorspace = V4L2_COLORSPACE_SRGB 216965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero } 217965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero}; 218965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero 219c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const u8 bridge_init[][2] = { 220c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x88, 0xf8}, 221c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x89, 0xff}, 222c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x76, 0x03}, 223c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x92, 0x03}, 224c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x95, 0x10}, 225c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xe2, 0x00}, 226c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xe7, 0x3e}, 227c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8d, 0x1c}, 228c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8e, 0x00}, 229c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8f, 0x00}, 230c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x1f, 0x00}, 231c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc3, 0xf9}, 232c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x89, 0xff}, 233c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x88, 0xf8}, 234c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x76, 0x03}, 235c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x92, 0x01}, 236c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x93, 0x18}, 237c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x1c, 0x0a}, 238c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x1d, 0x48}, 239c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc0, 0x50}, 240c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc1, 0x3c}, 241c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x34, 0x05}, 242c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc2, 0x0c}, 243c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc3, 0xf9}, 244c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x34, 0x05}, 245c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xe7, 0x2e}, 246c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x31, 0xf9}, 247c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x35, 0x02}, 248c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xd9, 0x10}, 249c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x25, 0x42}, 250c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x94, 0x11}, 251c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 252c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 2538d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_init[][2] = { 254c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x12, 0x80}, /* com7 - SSCB reset */ 255c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x00, 0x00}, /* gain */ 256c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x01, 0x80}, /* blue */ 257c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x02, 0x80}, /* red */ 258c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x03, 0x1b}, /* vref */ 259c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x04, 0x03}, /* com1 - exposure low bits */ 260c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x0b, 0x57}, /* ver */ 261c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x0e, 0x61}, /* com5 */ 262c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x0f, 0x42}, /* com6 */ 263c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x11, 0x00}, /* clkrc */ 264c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x12, 0x02}, /* com7 - 15fps VGA YUYV */ 265c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x13, 0xe7}, /* com8 - everything (AGC, AWB and AEC) */ 266c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x14, 0x28}, /* com9 */ 267c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x16, 0x24}, /* reg16 */ 268c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x17, 0x1d}, /* hstart*/ 269c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x18, 0xbd}, /* hstop */ 270c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x19, 0x01}, /* vstrt */ 271c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x1a, 0x81}, /* vstop*/ 272c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x1e, 0x04}, /* mvfp */ 273c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x24, 0x3c}, /* aew */ 274c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x25, 0x36}, /* aeb */ 275c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x26, 0x71}, /* vpt */ 276c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x27, 0x08}, /* bbias */ 277c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x28, 0x08}, /* gbbias */ 278c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x29, 0x15}, /* gr com */ 279c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x2a, 0x00}, /* exhch */ 280c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x2b, 0x00}, /* exhcl */ 281c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x2c, 0x08}, /* rbias */ 282c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x32, 0xff}, /* href */ 283c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x33, 0x00}, /* chlf */ 284c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x34, 0x3f}, /* aref1 */ 285c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x35, 0x00}, /* aref2 */ 286c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x36, 0xf8}, /* aref3 */ 287c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x38, 0x72}, /* adc2 */ 288c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x39, 0x57}, /* aref4 */ 289c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x3a, 0x80}, /* tslb - yuyv */ 290c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x3b, 0xc4}, /* com11 - night mode 1/4 frame rate */ 291c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x3d, 0x99}, /* com13 */ 292c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x3f, 0xc1}, /* edge */ 293c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x40, 0xc0}, /* com15 */ 294c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x41, 0x40}, /* com16 */ 295c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x42, 0xc0}, /* com17 */ 296c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x43, 0x0a}, /* rsvd */ 297c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x44, 0xf0}, 298c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x45, 0x46}, 299c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x46, 0x62}, 300c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x47, 0x2a}, 301c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x48, 0x3c}, 302c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x4a, 0xfc}, 303c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x4b, 0xfc}, 304c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x4c, 0x7f}, 305c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x4d, 0x7f}, 306c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x4e, 0x7f}, 307c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x4f, 0x98}, /* matrix */ 308c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x50, 0x98}, 309c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x51, 0x00}, 310c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x52, 0x28}, 311c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x53, 0x70}, 312c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x54, 0x98}, 313c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x58, 0x1a}, /* matrix coef sign */ 314c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x59, 0x85}, /* AWB control */ 315c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5a, 0xa9}, 316c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5b, 0x64}, 317c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5c, 0x84}, 318c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5d, 0x53}, 319c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5e, 0x0e}, 320c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5f, 0xf0}, /* AWB blue limit */ 321c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x60, 0xf0}, /* AWB red limit */ 322c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x61, 0xf0}, /* AWB green limit */ 323c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x62, 0x00}, /* lcc1 */ 324c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x63, 0x00}, /* lcc2 */ 325c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x64, 0x02}, /* lcc3 */ 326c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x65, 0x16}, /* lcc4 */ 327c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x66, 0x01}, /* lcc5 */ 328c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x69, 0x02}, /* hv */ 329c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x6b, 0x5a}, /* dbvl */ 330c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x6c, 0x04}, 331c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x6d, 0x55}, 332c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x6e, 0x00}, 333c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x6f, 0x9d}, 334c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x70, 0x21}, /* dnsth */ 335c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x71, 0x78}, 336c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x72, 0x00}, /* poidx */ 337c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x73, 0x01}, /* pckdv */ 338c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x74, 0x3a}, /* xindx */ 339c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x75, 0x35}, /* yindx */ 340c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x76, 0x01}, 341c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x77, 0x02}, 342c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x7a, 0x12}, /* gamma curve */ 343c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x7b, 0x08}, 344c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x7c, 0x16}, 345c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x7d, 0x30}, 346c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x7e, 0x5e}, 347c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x7f, 0x72}, 348c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x80, 0x82}, 349c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x81, 0x8e}, 350c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x82, 0x9a}, 351c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x83, 0xa4}, 352c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x84, 0xac}, 353c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x85, 0xb8}, 354c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x86, 0xc3}, 355c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x87, 0xd6}, 356c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x88, 0xe6}, 357c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x89, 0xf2}, 358c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8a, 0x03}, 359c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8c, 0x89}, /* com19 */ 360c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x14, 0x28}, /* com9 */ 361c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x90, 0x7d}, 362c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x91, 0x7b}, 363c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x9d, 0x03}, /* lcc6 */ 364c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x9e, 0x04}, /* lcc7 */ 365c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x9f, 0x7a}, 366c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xa0, 0x79}, 367c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xa1, 0x40}, /* aechm */ 368c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xa4, 0x50}, /* com21 */ 369c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xa5, 0x68}, /* com26 */ 370c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xa6, 0x4a}, /* AWB green */ 371c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xa8, 0xc1}, /* refa8 */ 372c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xa9, 0xef}, /* refa9 */ 373c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xaa, 0x92}, 374c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xab, 0x04}, 375c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xac, 0x80}, /* black level control */ 376c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xad, 0x80}, 377c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xae, 0x80}, 378c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xaf, 0x80}, 379c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xb2, 0xf2}, 380c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xb3, 0x20}, 381c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xb4, 0x20}, /* ctrlb4 */ 382c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xb5, 0x00}, 383c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xb6, 0xaf}, 384c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xbb, 0xae}, 385c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xbc, 0x7f}, /* ADC channel offsets */ 386c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xdb, 0x7f}, 387c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xbe, 0x7f}, 388c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xbf, 0x7f}, 389c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc0, 0xe2}, 390c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc1, 0xc0}, 391c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc2, 0x01}, 392c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc3, 0x4e}, 393c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc6, 0x85}, 394c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc7, 0x80}, /* com24 */ 395c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc9, 0xe0}, 396c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xca, 0xe8}, 397c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xcb, 0xf0}, 398c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xcc, 0xd8}, 399c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xcd, 0xf1}, 400c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x4f, 0x98}, /* matrix */ 401c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x50, 0x98}, 402c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x51, 0x00}, 403c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x52, 0x28}, 404c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x53, 0x70}, 405c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x54, 0x98}, 406c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x58, 0x1a}, 407c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xff, 0x41}, /* read 41, write ff 00 */ 408c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x41, 0x40}, /* com16 */ 409c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 410c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc5, 0x03}, /* 60 Hz banding filter */ 411c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x6a, 0x02}, /* 50 Hz banding filter */ 412c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 413c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x12, 0x62}, /* com7 - 30fps VGA YUV */ 414c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x36, 0xfa}, /* aref3 */ 415c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x69, 0x0a}, /* hv */ 416c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8c, 0x89}, /* com22 */ 417c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x14, 0x28}, /* com9 */ 418c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x3e, 0x0c}, 419c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x41, 0x40}, /* com16 */ 420c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x72, 0x00}, 421c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x73, 0x00}, 422c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x74, 0x3a}, 423c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x75, 0x35}, 424c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x76, 0x01}, 425c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc7, 0x80}, 426c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x03, 0x12}, /* vref */ 427c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x17, 0x16}, /* hstart */ 428c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x18, 0x02}, /* hstop */ 429c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x19, 0x01}, /* vstrt */ 430c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x1a, 0x3d}, /* vstop */ 431c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x32, 0xff}, /* href */ 432c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc0, 0xaa}, 433c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 434c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 435c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const u8 bridge_init_2[][2] = { 436c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x94, 0xaa}, 437c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xf1, 0x60}, 438c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xe5, 0x04}, 439c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc0, 0x50}, 440c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc1, 0x3c}, 441c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8c, 0x00}, 442c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8d, 0x1c}, 443c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x34, 0x05}, 444c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 445c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc2, 0x0c}, 446c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc3, 0xf9}, 447c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xda, 0x01}, 448c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x50, 0x00}, 449c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x51, 0xa0}, 450c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x52, 0x3c}, 451c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x53, 0x00}, 452c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x54, 0x00}, 453c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x55, 0x00}, 454c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x57, 0x00}, 455c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5c, 0x00}, 456c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5a, 0xa0}, 457c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5b, 0x78}, 458c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x35, 0x02}, 459c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xd9, 0x10}, 460c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x94, 0x11}, 461c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 462c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 4638d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_init_2[][2] = { 464c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x3b, 0xc4}, 465c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x1e, 0x04}, /* mvfp */ 466c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x13, 0xe0}, /* com8 */ 467c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x00, 0x00}, /* gain */ 468c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x13, 0xe7}, /* com8 - everything (AGC, AWB and AEC) */ 469c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x11, 0x03}, /* clkrc */ 470c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x6b, 0x5a}, /* dblv */ 471c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x6a, 0x05}, 472c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc5, 0x07}, 473c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xa2, 0x4b}, 474c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xa3, 0x3e}, 475c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x2d, 0x00}, 476c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xff, 0x42}, /* read 42, write ff 00 */ 477c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x42, 0xc0}, /* com17 */ 478c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x2d, 0x00}, 479c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xff, 0x42}, /* read 42, write ff 00 */ 480c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x42, 0xc1}, /* com17 */ 481c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* sharpness */ 482c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x3f, 0x01}, 483c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xff, 0x42}, /* read 42, write ff 00 */ 484c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x42, 0xc1}, /* com17 */ 485c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* saturation */ 486c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x4f, 0x98}, /* matrix */ 487c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x50, 0x98}, 488c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x51, 0x00}, 489c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x52, 0x28}, 490c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x53, 0x70}, 491c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x54, 0x98}, 492c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x58, 0x1a}, 493c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xff, 0x41}, /* read 41, write ff 00 */ 494c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x41, 0x40}, /* com16 */ 495c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* contrast */ 496c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x56, 0x40}, 497c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* brightness */ 498c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x55, 0x8f}, 499c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* expo */ 500c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x10, 0x25}, /* aech - exposure high bits */ 501c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xff, 0x13}, /* read 13, write ff 00 */ 502c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x13, 0xe7}, /* com8 - everything (AGC, AWB and AEC) */ 503c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 504c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 5058d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov971x_init[][2] = { 5068d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x12, 0x80}, 5078d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x09, 0x10}, 5088d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x1e, 0x07}, 5098d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x5f, 0x18}, 5108d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x69, 0x04}, 5118d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x65, 0x2a}, 5128d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x68, 0x0a}, 5138d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x39, 0x28}, 5148d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x4d, 0x90}, 5158d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0xc1, 0x80}, 5168d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x0c, 0x30}, 5178d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x6d, 0x02}, 5188d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x96, 0xf1}, 5198d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0xbc, 0x68}, 5208d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x12, 0x00}, 5218d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x3b, 0x00}, 5228d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x97, 0x80}, 5238d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x17, 0x25}, 5248d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x18, 0xa2}, 5258d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x19, 0x01}, 5268d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x1a, 0xca}, 5278d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x03, 0x0a}, 5288d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x32, 0x07}, 5298d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x98, 0x40}, /*{0x98, 0x00},*/ 5308d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x99, 0xA0}, /*{0x99, 0x00},*/ 5318d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x9a, 0x01}, /*{0x9a, 0x00},*/ 5328d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x57, 0x00}, 5338d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x58, 0x78}, /*{0x58, 0xc8},*/ 5348d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x59, 0x50}, /*{0x59, 0xa0},*/ 5358d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x4c, 0x13}, 5368d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x4b, 0x36}, 5378d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x3d, 0x3c}, 5388d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x3e, 0x03}, 5398d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0xbd, 0x50}, /*{0xbd, 0xa0},*/ 5408d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0xbe, 0x78}, /*{0xbe, 0xc8},*/ 5418d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x4e, 0x55}, 5428d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x4f, 0x55}, 5438d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x50, 0x55}, 5448d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x51, 0x55}, 5458d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x24, 0x55}, 5468d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x25, 0x40}, 5478d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x26, 0xa1}, 5488d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x5c, 0x59}, 5498d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x5d, 0x00}, 5508d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x11, 0x00}, 5518d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x2a, 0x98}, 5528d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x2b, 0x06}, 5538d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x2d, 0x00}, 5548d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x2e, 0x00}, 5558d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x13, 0xa5}, 5568d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x14, 0x40}, 5578d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x4a, 0x00}, 5588d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x49, 0xce}, 5598d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x22, 0x03}, 5608d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {0x09, 0x00} 5618d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine}; 5628d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine 5638d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_start_1_vga[][2] = { /* same for qvga */ 564c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x12, 0x62}, /* com7 - 30fps VGA YUV */ 565c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x36, 0xfa}, /* aref3 */ 566c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x69, 0x0a}, /* hv */ 567c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8c, 0x89}, /* com22 */ 568c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x14, 0x28}, /* com9 */ 569c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x3e, 0x0c}, /* com14 */ 570c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x41, 0x40}, /* com16 */ 571c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x72, 0x00}, 572c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x73, 0x00}, 573c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x74, 0x3a}, 574c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x75, 0x35}, 575c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x76, 0x01}, 576c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc7, 0x80}, /* com24 */ 577c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x03, 0x12}, /* vref */ 578c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x17, 0x16}, /* hstart */ 579c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x18, 0x02}, /* hstop */ 580c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x19, 0x01}, /* vstrt */ 581c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x1a, 0x3d}, /* vstop */ 582c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x32, 0xff}, /* href */ 583c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc0, 0xaa}, 584c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 585c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 5868d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_start_1_svga[][2] = { 587c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x12, 0x02}, /* com7 - YUYV - VGA 15 full resolution */ 588c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x36, 0xf8}, /* aref3 */ 589c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x69, 0x02}, /* hv */ 590c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8c, 0x0d}, /* com22 */ 591c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x3e, 0x0c}, /* com14 */ 592c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x41, 0x40}, /* com16 */ 593c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x72, 0x00}, 594c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x73, 0x01}, 595c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x74, 0x3a}, 596c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x75, 0x35}, 597c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x76, 0x01}, 598c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc7, 0x80}, /* com24 */ 599c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x03, 0x1b}, /* vref */ 600c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x17, 0x1d}, /* hstart */ 601c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x18, 0xbd}, /* hstop */ 602c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x19, 0x01}, /* vstrt */ 603c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x1a, 0x81}, /* vstop */ 604c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x32, 0xff}, /* href */ 605c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc0, 0xe2}, 606c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 607c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 6088d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_start_1_xga[][2] = { 609c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x12, 0x02}, /* com7 */ 610c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x36, 0xf8}, /* aref3 */ 611c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x69, 0x02}, /* hv */ 612c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8c, 0x89}, /* com22 */ 613c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x14, 0x28}, /* com9 */ 614c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x3e, 0x0c}, /* com14 */ 615c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x41, 0x40}, /* com16 */ 616c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x72, 0x00}, 617c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x73, 0x01}, 618c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x74, 0x3a}, 619c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x75, 0x35}, 620c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x76, 0x01}, 621c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc7, 0x80}, /* com24 */ 622c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x03, 0x1b}, /* vref */ 623c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x17, 0x1d}, /* hstart */ 624c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x18, 0xbd}, /* hstop */ 625c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x19, 0x01}, /* vstrt */ 626c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x1a, 0x81}, /* vstop */ 627c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x32, 0xff}, /* href */ 628c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc0, 0xe2}, 629c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 630c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 6318d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_start_1_sxga[][2] = { 632c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x12, 0x02}, /* com7 */ 633c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x36, 0xf8}, /* aref3 */ 634c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x69, 0x02}, /* hv */ 635c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8c, 0x89}, /* com22 */ 636c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x14, 0x28}, /* com9 */ 637c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x3e, 0x0c}, /* com14 */ 638c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x41, 0x40}, /* com16 */ 639c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x72, 0x00}, 640c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x73, 0x01}, 641c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x74, 0x3a}, 642c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x75, 0x35}, 643c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x76, 0x01}, 644c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc7, 0x80}, /* com24 */ 645c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x03, 0x1b}, /* vref */ 646c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x17, 0x1d}, /* hstart */ 647c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x18, 0x02}, /* hstop */ 648c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x19, 0x01}, /* vstrt */ 649c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x1a, 0x81}, /* vstop */ 650c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x32, 0xff}, /* href */ 651c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc0, 0xe2}, 652c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 653c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 654c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const u8 bridge_start_qvga[][2] = { 655c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x94, 0xaa}, 656c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xf1, 0x60}, 657c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xe5, 0x04}, 658c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc0, 0x50}, 659c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc1, 0x3c}, 660c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8c, 0x00}, 661c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8d, 0x1c}, 662c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x34, 0x05}, 663c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 664c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc2, 0x4c}, 665c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc3, 0xf9}, 666c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xda, 0x00}, 667c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x50, 0x00}, 668c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x51, 0xa0}, 669c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x52, 0x78}, 670c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x53, 0x00}, 671c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x54, 0x00}, 672c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x55, 0x00}, 673c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x57, 0x00}, 674c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5c, 0x00}, 675c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5a, 0x50}, 676c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5b, 0x3c}, 677c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x35, 0x02}, 678c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xd9, 0x10}, 679c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x94, 0x11}, 680c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 681c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 682c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const u8 bridge_start_vga[][2] = { 683c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x94, 0xaa}, 684c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xf1, 0x60}, 685c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xe5, 0x04}, 686c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc0, 0x50}, 687c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc1, 0x3c}, 688c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8c, 0x00}, 689c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8d, 0x1c}, 690c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x34, 0x05}, 691c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc2, 0x0c}, 692c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc3, 0xf9}, 693c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xda, 0x01}, 694c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x50, 0x00}, 695c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x51, 0xa0}, 696c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x52, 0x3c}, 697c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x53, 0x00}, 698c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x54, 0x00}, 699c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x55, 0x00}, 700c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x57, 0x00}, 701c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5c, 0x00}, 702c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5a, 0xa0}, 703c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5b, 0x78}, 704c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x35, 0x02}, 705c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xd9, 0x10}, 706c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x94, 0x11}, 707c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 708c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 709c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const u8 bridge_start_svga[][2] = { 710c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x94, 0xaa}, 711c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xf1, 0x60}, 712c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xe5, 0x04}, 713c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc0, 0xa0}, 714c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc1, 0x80}, 715c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8c, 0x00}, 716c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8d, 0x1c}, 717c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x34, 0x05}, 718c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc2, 0x4c}, 719c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc3, 0xf9}, 720c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x50, 0x00}, 721c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x51, 0x40}, 722c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x52, 0x00}, 723c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x53, 0x00}, 724c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x54, 0x00}, 725c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x55, 0x88}, 726c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x57, 0x00}, 727c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5c, 0x00}, 728c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5a, 0xc8}, 729c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5b, 0x96}, 730c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x35, 0x02}, 731c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xd9, 0x10}, 732c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xda, 0x00}, 733c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x94, 0x11}, 734c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 735c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 736c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const u8 bridge_start_xga[][2] = { 737c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x94, 0xaa}, 738c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xf1, 0x60}, 739c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xe5, 0x04}, 740c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc0, 0xa0}, 741c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc1, 0x80}, 742c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8c, 0x00}, 743c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8d, 0x1c}, 744c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x34, 0x05}, 745c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc2, 0x4c}, 746c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc3, 0xf9}, 747c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x50, 0x00}, 748c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x51, 0x40}, 749c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x52, 0x00}, 750c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x53, 0x00}, 751c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x54, 0x00}, 752c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x55, 0x88}, 753c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x57, 0x00}, 754c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5c, 0x01}, 755c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5a, 0x00}, 756c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x5b, 0xc0}, 757c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x35, 0x02}, 758c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xd9, 0x10}, 759c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xda, 0x01}, 760c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x94, 0x11}, 761c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 762c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 763c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const u8 bridge_start_sxga[][2] = { 764c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x94, 0xaa}, 765c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xf1, 0x60}, 766c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xe5, 0x04}, 767c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc0, 0xa0}, 768c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc1, 0x80}, 769c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8c, 0x00}, 770c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x8d, 0x1c}, 771c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x34, 0x05}, 772c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc2, 0x0c}, 773c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc3, 0xf9}, 774c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xda, 0x00}, 775c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x35, 0x02}, 776c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xd9, 0x10}, 777c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x94, 0x11}, 778c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 779c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 7808d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_start_2_qvga[][2] = { 781c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x3b, 0xe4}, /* com11 - night mode 1/4 frame rate */ 782c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x1e, 0x04}, /* mvfp */ 783c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x13, 0xe0}, /* com8 */ 784c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x00, 0x00}, 785c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x13, 0xe7}, /* com8 - everything (AGC, AWB and AEC) */ 786c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x11, 0x01}, /* clkrc */ 787c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x6b, 0x5a}, /* dblv */ 788c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x6a, 0x02}, /* 50 Hz banding filter */ 789c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc5, 0x03}, /* 60 Hz banding filter */ 790c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xa2, 0x96}, /* bd50 */ 791c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xa3, 0x7d}, /* bd60 */ 792c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 793c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xff, 0x13}, /* read 13, write ff 00 */ 794c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x13, 0xe7}, 795c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x3a, 0x80}, /* tslb - yuyv */ 796c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 797c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 7988d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_start_2_vga[][2] = { 799c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x3b, 0xc4}, /* com11 - night mode 1/4 frame rate */ 800c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x1e, 0x04}, /* mvfp */ 801c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x13, 0xe0}, /* com8 */ 802c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x00, 0x00}, 803c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x13, 0xe7}, /* com8 - everything (AGC, AWB and AEC) */ 804c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x11, 0x03}, /* clkrc */ 805c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x6b, 0x5a}, /* dblv */ 806c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x6a, 0x05}, /* 50 Hz banding filter */ 807c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc5, 0x07}, /* 60 Hz banding filter */ 808c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xa2, 0x4b}, /* bd50 */ 809c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xa3, 0x3e}, /* bd60 */ 810c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 811c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x2d, 0x00}, /* advfl */ 812c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 813c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 8148d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_start_2_svga[][2] = { /* same for xga */ 815c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x3b, 0xc4}, /* com11 - night mode 1/4 frame rate */ 816c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x1e, 0x04}, /* mvfp */ 817c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x13, 0xe0}, /* com8 */ 818c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x00, 0x00}, 819c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x13, 0xe7}, /* com8 - everything (AGC, AWB and AEC) */ 820c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x11, 0x01}, /* clkrc */ 821c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x6b, 0x5a}, /* dblv */ 822c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x6a, 0x0c}, /* 50 Hz banding filter */ 823c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc5, 0x0f}, /* 60 Hz banding filter */ 824c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xa2, 0x4e}, /* bd50 */ 825c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xa3, 0x41}, /* bd60 */ 826c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 827c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 8288d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moinestatic const u8 ov965x_start_2_sxga[][2] = { 829c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x13, 0xe0}, /* com8 */ 830c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x00, 0x00}, 831c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x13, 0xe7}, /* com8 - everything (AGC, AWB and AEC) */ 832c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x3b, 0xc4}, /* com11 - night mode 1/4 frame rate */ 833c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x1e, 0x04}, /* mvfp */ 834c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x11, 0x01}, /* clkrc */ 835c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x6b, 0x5a}, /* dblv */ 836c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x6a, 0x0c}, /* 50 Hz banding filter */ 837c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xc5, 0x0f}, /* 60 Hz banding filter */ 838c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xa2, 0x4e}, /* bd50 */ 839c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0xa3, 0x41}, /* bd60 */ 840c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 841c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 842965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguerostatic const u8 ov562x_init[][2] = { 843965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x88, 0x20}, 844965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x89, 0x0a}, 845965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x8a, 0x90}, 846965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x8b, 0x06}, 847965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x8c, 0x01}, 848965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x8d, 0x10}, 849965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x1c, 0x00}, 850965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x1d, 0x48}, 851965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x1d, 0x00}, 852965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x1d, 0xff}, 853965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x1c, 0x0a}, 854965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x1d, 0x2e}, 855965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x1d, 0x1e}, 856965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero}; 857965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero 858965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguerostatic const u8 ov562x_init_2[][2] = { 859965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x12, 0x80}, 860965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x11, 0x41}, 861965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x13, 0x00}, 862965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x10, 0x1e}, 863965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x3b, 0x07}, 864965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x5b, 0x40}, 865965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x39, 0x07}, 866965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x53, 0x02}, 867965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x54, 0x60}, 868965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x04, 0x20}, 869965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x27, 0x04}, 870965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x3d, 0x40}, 871965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x36, 0x00}, 872965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0xc5, 0x04}, 873965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x4e, 0x00}, 874965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x4f, 0x93}, 875965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x50, 0x7b}, 876965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0xca, 0x0c}, 877965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0xcb, 0x0f}, 878965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x39, 0x07}, 879965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x4a, 0x10}, 880965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x3e, 0x0a}, 881965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x3d, 0x00}, 882965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x0c, 0x38}, 883965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x38, 0x90}, 884965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x46, 0x30}, 885965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x4f, 0x93}, 886965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x50, 0x7b}, 887965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0xab, 0x00}, 888965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0xca, 0x0c}, 889965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0xcb, 0x0f}, 890965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x37, 0x02}, 891965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x44, 0x48}, 892965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x8d, 0x44}, 893965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x2a, 0x00}, 894965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x2b, 0x00}, 895965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x32, 0x00}, 896965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x38, 0x90}, 897965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x53, 0x02}, 898965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x54, 0x60}, 899965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x12, 0x00}, 900965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x17, 0x12}, 901965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x18, 0xb4}, 902965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x19, 0x0c}, 903965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x1a, 0xf4}, 904965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x03, 0x4a}, 905965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x89, 0x20}, 906965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x83, 0x80}, 907965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0xb7, 0x9d}, 908965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0xb6, 0x11}, 909965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0xb5, 0x55}, 910965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0xb4, 0x00}, 911965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0xa9, 0xf0}, 912965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0xa8, 0x0a}, 913965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0xb8, 0xf0}, 914965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0xb9, 0xf0}, 915965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0xba, 0xf0}, 916965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x81, 0x07}, 917965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x63, 0x44}, 918965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x13, 0xc7}, 919965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x14, 0x60}, 920965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x33, 0x75}, 921965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x2c, 0x00}, 922965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x09, 0x00}, 923965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x35, 0x30}, 924965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x27, 0x04}, 925965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x3c, 0x07}, 926965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x3a, 0x0a}, 927965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x3b, 0x07}, 928965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x01, 0x40}, 929965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x02, 0x40}, 930965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x16, 0x40}, 931965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x52, 0xb0}, 932965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x51, 0x83}, 933965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x21, 0xbb}, 934965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x22, 0x10}, 935965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x23, 0x03}, 936965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x35, 0x38}, 937965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x20, 0x90}, 938965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x28, 0x30}, 939965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x73, 0xe1}, 940965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x6c, 0x00}, 941965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x6d, 0x80}, 942965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x6e, 0x00}, 943965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x70, 0x04}, 944965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x71, 0x00}, 945965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x8d, 0x04}, 946965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x64, 0x00}, 947965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x65, 0x00}, 948965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x66, 0x00}, 949965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x67, 0x00}, 950965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x68, 0x00}, 951965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x69, 0x00}, 952965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x6a, 0x00}, 953965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x6b, 0x00}, 954965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x71, 0x94}, 955965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x74, 0x20}, 956965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x80, 0x09}, 957965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {0x85, 0xc0}, 958965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero}; 959965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero 960c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void reg_w_i(struct gspca_dev *gspca_dev, u16 reg, u8 val) 961c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 962c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine struct usb_device *udev = gspca_dev->dev; 963c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine int ret; 964c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 965c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if (gspca_dev->usb_err < 0) 966c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine return; 967c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine gspca_dev->usb_buf[0] = val; 968c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine ret = usb_control_msg(udev, 969c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine usb_sndctrlpipe(udev, 0), 970c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 0x01, 971c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 972c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 0x00, reg, gspca_dev->usb_buf, 1, CTRL_TIMEOUT); 973c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if (ret < 0) { 974133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches pr_err("reg_w failed %d\n", ret); 975c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine gspca_dev->usb_err = ret; 976c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 977c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 978c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 979c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void reg_w(struct gspca_dev *gspca_dev, u16 reg, u8 val) 980c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 981c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine PDEBUG(D_USBO, "reg_w [%04x] = %02x", reg, val); 982c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w_i(gspca_dev, reg, val); 983c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 984c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 985c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic u8 reg_r(struct gspca_dev *gspca_dev, u16 reg) 986c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 987c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine struct usb_device *udev = gspca_dev->dev; 988c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine int ret; 989c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 990c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if (gspca_dev->usb_err < 0) 991c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine return 0; 992c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine ret = usb_control_msg(udev, 993c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine usb_rcvctrlpipe(udev, 0), 994c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 0x01, 995c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 996c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 0x00, reg, gspca_dev->usb_buf, 1, CTRL_TIMEOUT); 997c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine PDEBUG(D_USBI, "reg_r [%04x] -> %02x", reg, gspca_dev->usb_buf[0]); 998c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if (ret < 0) { 999133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches pr_err("reg_r err %d\n", ret); 1000c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine gspca_dev->usb_err = ret; 1001c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 1002c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine return gspca_dev->usb_buf[0]; 1003c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1004c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1005c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic int sccb_check_status(struct gspca_dev *gspca_dev) 1006c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1007c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine u8 data; 1008c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine int i; 1009c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1010c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine for (i = 0; i < 5; i++) { 1011c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine data = reg_r(gspca_dev, OV534_REG_STATUS); 1012c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1013c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine switch (data) { 1014c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine case 0x00: 1015c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine return 1; 1016c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine case 0x04: 1017c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine return 0; 1018c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine case 0x03: 1019c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine break; 1020c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine default: 1021c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine PDEBUG(D_USBI|D_USBO, 1022c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine "sccb status 0x%02x, attempt %d/5", 1023c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine data, i + 1); 1024c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 1025c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 1026c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine return 0; 1027c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1028c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1029c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void sccb_write(struct gspca_dev *gspca_dev, u8 reg, u8 val) 1030c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1031c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine PDEBUG(D_USBO, "sccb_write [%02x] = %02x", reg, val); 1032c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w_i(gspca_dev, OV534_REG_SUBADDR, reg); 1033c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w_i(gspca_dev, OV534_REG_WRITE, val); 1034c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w_i(gspca_dev, OV534_REG_OPERATION, OV534_OP_WRITE_3); 1035c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1036c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if (!sccb_check_status(gspca_dev)) 1037133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches pr_err("sccb_write failed\n"); 1038c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1039c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1040c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic u8 sccb_read(struct gspca_dev *gspca_dev, u16 reg) 1041c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1042c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w(gspca_dev, OV534_REG_SUBADDR, reg); 1043c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w(gspca_dev, OV534_REG_OPERATION, OV534_OP_WRITE_2); 1044c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if (!sccb_check_status(gspca_dev)) 1045133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches pr_err("sccb_read failed 1\n"); 1046c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1047c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w(gspca_dev, OV534_REG_OPERATION, OV534_OP_READ_2); 1048c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if (!sccb_check_status(gspca_dev)) 1049133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches pr_err("sccb_read failed 2\n"); 1050c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1051c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine return reg_r(gspca_dev, OV534_REG_READ); 1052c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1053c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1054c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* output a bridge sequence (reg - val) */ 1055c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void reg_w_array(struct gspca_dev *gspca_dev, 1056c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine const u8 (*data)[2], int len) 1057c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1058c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine while (--len >= 0) { 1059c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w(gspca_dev, (*data)[0], (*data)[1]); 1060c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine data++; 1061c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 1062c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1063c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1064c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* output a sensor sequence (reg - val) */ 1065c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void sccb_w_array(struct gspca_dev *gspca_dev, 1066c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine const u8 (*data)[2], int len) 1067c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1068c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine while (--len >= 0) { 1069c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if ((*data)[0] != 0xff) { 1070c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, (*data)[0], (*data)[1]); 1071c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } else { 1072c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_read(gspca_dev, (*data)[1]); 1073c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0xff, 0x00); 1074c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 1075c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine data++; 1076c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 1077c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1078c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1079c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* Two bits control LED: 0x21 bit 7 and 0x23 bit 7. 1080c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine * (direction and output)? */ 1081c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void set_led(struct gspca_dev *gspca_dev, int status) 1082c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1083c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine u8 data; 1084c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1085c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine PDEBUG(D_CONF, "led status: %d", status); 1086c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1087c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine data = reg_r(gspca_dev, 0x21); 1088c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine data |= 0x80; 1089c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w(gspca_dev, 0x21, data); 1090c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1091c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine data = reg_r(gspca_dev, 0x23); 1092c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if (status) 1093c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine data |= 0x80; 1094c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine else 1095c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine data &= ~0x80; 1096c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1097c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w(gspca_dev, 0x23, data); 1098c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1099c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if (!status) { 1100c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine data = reg_r(gspca_dev, 0x21); 1101c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine data &= ~0x80; 1102c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w(gspca_dev, 0x21, data); 1103c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 1104c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1105c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1106c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setbrightness(struct gspca_dev *gspca_dev) 1107c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1108c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 1109c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine u8 val; 1110d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero s8 sval; 1111c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 11127592e0377636963eade33810fcad06487b8b153fJean-François Moine if (gspca_dev->ctrl_dis & (1 << BRIGHTNESS)) 11137592e0377636963eade33810fcad06487b8b153fJean-François Moine return; 1114d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero if (sd->sensor == SENSOR_OV562x) { 1115d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero sval = sd->ctrls[BRIGHTNESS].val; 1116d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero val = 0x76; 1117d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero val += sval; 1118d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero sccb_write(gspca_dev, 0x24, val); 1119d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero val = 0x6a; 1120d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero val += sval; 1121d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero sccb_write(gspca_dev, 0x25, val); 1122d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero if (sval < -40) 1123d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero val = 0x71; 1124d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero else if (sval < 20) 1125d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero val = 0x94; 1126d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero else 1127d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero val = 0xe6; 1128d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero sccb_write(gspca_dev, 0x26, val); 1129d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero } else { 1130d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero val = sd->ctrls[BRIGHTNESS].val; 1131d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero if (val < 8) 1132d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero val = 15 - val; /* f .. 8 */ 1133d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero else 1134d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero val = val - 8; /* 0 .. 7 */ 1135d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero sccb_write(gspca_dev, 0x55, /* brtn - brightness adjustment */ 1136d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero 0x0f | (val << 4)); 1137d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero } 1138c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1139c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1140c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setcontrast(struct gspca_dev *gspca_dev) 1141c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1142c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 1143c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 11448d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine if (gspca_dev->ctrl_dis & (1 << CONTRAST)) 11458d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine return; 1146c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x56, /* cnst1 - contrast 1 ctrl coeff */ 11477592e0377636963eade33810fcad06487b8b153fJean-François Moine sd->ctrls[CONTRAST].val << 4); 1148c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1149c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1150c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setautogain(struct gspca_dev *gspca_dev) 1151c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1152c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 1153c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine u8 val; 1154c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 11558d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine if (gspca_dev->ctrl_dis & (1 << AUTOGAIN)) 11568d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine return; 1157c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/*fixme: should adjust agc/awb/aec by different controls */ 1158c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine val = sccb_read(gspca_dev, 0x13); /* com8 */ 1159c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0xff, 0x00); 11607592e0377636963eade33810fcad06487b8b153fJean-François Moine if (sd->ctrls[AUTOGAIN].val) 1161c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine val |= 0x05; /* agc & aec */ 1162c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine else 1163c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine val &= 0xfa; 1164c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x13, val); 1165c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1166c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1167c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setexposure(struct gspca_dev *gspca_dev) 1168c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1169c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 1170c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine u8 val; 1171c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine static const u8 expo[4] = {0x00, 0x25, 0x38, 0x5e}; 1172c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 11738d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine if (gspca_dev->ctrl_dis & (1 << EXPOSURE)) 11748d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine return; 1175c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x10, /* aec[9:2] */ 11767592e0377636963eade33810fcad06487b8b153fJean-François Moine expo[sd->ctrls[EXPOSURE].val]); 1177c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1178c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine val = sccb_read(gspca_dev, 0x13); /* com8 */ 1179c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0xff, 0x00); 1180c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x13, val); 1181c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1182c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine val = sccb_read(gspca_dev, 0xa1); /* aech */ 1183c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0xff, 0x00); 1184c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0xa1, val & 0xe0); /* aec[15:10] = 0 */ 1185c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1186c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1187c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setsharpness(struct gspca_dev *gspca_dev) 1188c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1189c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 1190c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine s8 val; 1191c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 11928d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine if (gspca_dev->ctrl_dis & (1 << SHARPNESS)) 11938d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine return; 11947592e0377636963eade33810fcad06487b8b153fJean-François Moine val = sd->ctrls[SHARPNESS].val; 1195c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if (val < 0) { /* auto */ 1196c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine val = sccb_read(gspca_dev, 0x42); /* com17 */ 1197c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0xff, 0x00); 1198c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x42, val | 0x40); 1199c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine /* Edge enhancement strength auto adjust */ 1200c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine return; 1201c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 1202c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if (val != 0) 1203c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine val = 1 << (val - 1); 1204c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x3f, /* edge - edge enhance. factor */ 1205c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine val); 1206c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine val = sccb_read(gspca_dev, 0x42); /* com17 */ 1207c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0xff, 0x00); 1208c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x42, val & 0xbf); 1209c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1210c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1211c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setsatur(struct gspca_dev *gspca_dev) 1212c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1213c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 1214c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine u8 val1, val2, val3; 1215c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine static const u8 matrix[5][2] = { 1216c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x14, 0x38}, 1217c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x1e, 0x54}, 1218c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x28, 0x70}, 1219c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x32, 0x8c}, 1220c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {0x48, 0x90} 1221c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine }; 1222c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 12238d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine if (gspca_dev->ctrl_dis & (1 << SATUR)) 12248d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine return; 12257592e0377636963eade33810fcad06487b8b153fJean-François Moine val1 = matrix[sd->ctrls[SATUR].val][0]; 12267592e0377636963eade33810fcad06487b8b153fJean-François Moine val2 = matrix[sd->ctrls[SATUR].val][1]; 1227c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine val3 = val1 + val2; 1228c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x4f, val3); /* matrix coeff */ 1229c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x50, val3); 1230c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x51, 0x00); 1231c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x52, val1); 1232c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x53, val2); 1233c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x54, val3); 1234c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x58, 0x1a); /* mtxs - coeff signs */ 1235c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1236c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine val1 = sccb_read(gspca_dev, 0x41); /* com16 */ 1237c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0xff, 0x00); 1238c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x41, val1); 1239c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1240c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 12417592e0377636963eade33810fcad06487b8b153fJean-François Moinestatic void setlightfreq(struct gspca_dev *gspca_dev) 1242c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1243c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 1244c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine u8 val; 1245c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 12468d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine if (gspca_dev->ctrl_dis & (1 << LIGHTFREQ)) 12478d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine return; 1248c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine val = sccb_read(gspca_dev, 0x13); /* com8 */ 1249c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0xff, 0x00); 12507592e0377636963eade33810fcad06487b8b153fJean-François Moine if (sd->ctrls[LIGHTFREQ].val == 0) { 1251c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x13, val & 0xdf); 1252c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine return; 1253c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 1254c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x13, val | 0x20); 1255c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1256c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine val = sccb_read(gspca_dev, 0x42); /* com17 */ 1257c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0xff, 0x00); 12587592e0377636963eade33810fcad06487b8b153fJean-François Moine if (sd->ctrls[LIGHTFREQ].val == 1) 1259c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine val |= 0x01; 1260c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine else 1261c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine val &= 0xfe; 1262c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x42, val); 1263c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1264c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1265c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* this function is called at probe time */ 1266c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic int sd_config(struct gspca_dev *gspca_dev, 1267c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine const struct usb_device_id *id) 1268c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1269c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 1270c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 12717592e0377636963eade33810fcad06487b8b153fJean-François Moine gspca_dev->cam.ctrls = sd->ctrls; 1272c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1273c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#if AUTOGAIN_DEF != 0 12747592e0377636963eade33810fcad06487b8b153fJean-François Moine gspca_dev->ctrl_inac |= (1 << EXPOSURE); 1275c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#endif 1276c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine return 0; 1277c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1278c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1279c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* this function is called at probe and resume time */ 1280c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic int sd_init(struct gspca_dev *gspca_dev) 1281c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 12828d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine struct sd *sd = (struct sd *) gspca_dev; 1283c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine u16 sensor_id; 1284c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1285c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine /* reset bridge */ 1286c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w(gspca_dev, 0xe7, 0x3a); 1287c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w(gspca_dev, 0xe0, 0x08); 1288c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine msleep(100); 1289c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1290c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine /* initialize the sensor address */ 1291c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w(gspca_dev, OV534_REG_ADDRESS, 0x60); 1292c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1293c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine /* reset sensor */ 1294c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_write(gspca_dev, 0x12, 0x80); 1295c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine msleep(10); 1296c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1297c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine /* probe the sensor */ 1298c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_read(gspca_dev, 0x0a); 1299c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sensor_id = sccb_read(gspca_dev, 0x0a) << 8; 1300c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sccb_read(gspca_dev, 0x0b); 1301c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sensor_id |= sccb_read(gspca_dev, 0x0b); 1302c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine PDEBUG(D_PROBE, "Sensor ID: %04x", sensor_id); 1303c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1304c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine /* initialize */ 13058d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine if ((sensor_id & 0xfff0) == 0x9650) { 13068d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine sd->sensor = SENSOR_OV965x; 13078d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine 13088d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine gspca_dev->cam.cam_mode = ov965x_mode; 13098d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine gspca_dev->cam.nmodes = ARRAY_SIZE(ov965x_mode); 13108d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine 13118d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine reg_w_array(gspca_dev, bridge_init, 13128d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine ARRAY_SIZE(bridge_init)); 13138d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine sccb_w_array(gspca_dev, ov965x_init, 13148d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine ARRAY_SIZE(ov965x_init)); 13158d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine reg_w_array(gspca_dev, bridge_init_2, 13168d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine ARRAY_SIZE(bridge_init_2)); 13178d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine sccb_w_array(gspca_dev, ov965x_init_2, 13188d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine ARRAY_SIZE(ov965x_init_2)); 13198d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine reg_w(gspca_dev, 0xe0, 0x00); 13208d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine reg_w(gspca_dev, 0xe0, 0x01); 13218d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine set_led(gspca_dev, 0); 13228d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine reg_w(gspca_dev, 0xe0, 0x00); 13238d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine } else if ((sensor_id & 0xfff0) == 0x9710) { 13248d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine const char *p; 13258d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine int l; 13268d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine 13278d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine sd->sensor = SENSOR_OV971x; 13288d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine 13298d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine gspca_dev->cam.cam_mode = ov971x_mode; 13308d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine gspca_dev->cam.nmodes = ARRAY_SIZE(ov971x_mode); 13318d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine 13328d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine /* no control yet */ 13338d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine gspca_dev->ctrl_dis = (1 << NCTRLS) - 1; 13348d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine 13358d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine gspca_dev->cam.bulk = 1; 13368d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine gspca_dev->cam.bulk_size = 16384; 13378d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine gspca_dev->cam.bulk_nurbs = 2; 13388d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine 13398d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine sccb_w_array(gspca_dev, ov971x_init, 13408d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine ARRAY_SIZE(ov971x_init)); 13418d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine 13428d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine /* set video format on bridge processor */ 13438d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine /* access bridge processor's video format registers at: 0x00 */ 13448d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine reg_w(gspca_dev, 0x1c, 0x00); 13458d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine /*set register: 0x00 is 'RAW8', 0x40 is 'YUV422' (YUYV?)*/ 13468d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine reg_w(gspca_dev, 0x1d, 0x00); 13478d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine 13488d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine /* Will W. specific stuff 13498d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine * set VSYNC to 13508d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine * output (0x1f) if first webcam 13518d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine * input (0x17) if 2nd or 3rd webcam */ 13528d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine p = video_device_node_name(&gspca_dev->vdev); 13538d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine l = strlen(p) - 1; 13548d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine if (p[l] == '0') 13558d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine reg_w(gspca_dev, 0x56, 0x1f); 13568d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine else 13578d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine reg_w(gspca_dev, 0x56, 0x17); 1358965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero } else if ((sensor_id & 0xfff0) == 0x5620) { 1359965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero sd->sensor = SENSOR_OV562x; 1360d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero gspca_dev->ctrl_dis = (1 << CONTRAST) | 1361d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero (1 << AUTOGAIN) | 1362d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero (1 << EXPOSURE) | 1363d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero (1 << SHARPNESS) | 1364d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero (1 << SATUR) | 1365d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero (1 << LIGHTFREQ); 1366d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero 1367d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero sd->ctrls[BRIGHTNESS].min = -90; 1368d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero sd->ctrls[BRIGHTNESS].max = 90; 1369d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero sd->ctrls[BRIGHTNESS].def = 0; 1370965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero gspca_dev->cam.cam_mode = ov562x_mode; 1371965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero gspca_dev->cam.nmodes = ARRAY_SIZE(ov562x_mode); 1372965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero 1373965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero reg_w_array(gspca_dev, ov562x_init, 1374965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero ARRAY_SIZE(ov562x_init)); 1375965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero sccb_w_array(gspca_dev, ov562x_init_2, 1376965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero ARRAY_SIZE(ov562x_init_2)); 1377965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero reg_w(gspca_dev, 0xe0, 0x00); 13788d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine } else { 13798d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine err("Unknown sensor %04x", sensor_id); 13808d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine return -EINVAL; 13818d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine } 1382c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 13834b27d074748553916ebbdeed9630a6959c85e7deJean-Francois Moine return gspca_dev->usb_err; 1384c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1385c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1386c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic int sd_start(struct gspca_dev *gspca_dev) 1387c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 13888d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine struct sd *sd = (struct sd *) gspca_dev; 13898d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine 1390d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero if (sd->sensor == SENSOR_OV971x) 13918d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine return gspca_dev->usb_err; 1392d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero else if (sd->sensor == SENSOR_OV562x) { 1393d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero setbrightness(gspca_dev); 1394d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero return gspca_dev->usb_err; 1395d9ef28a9154b07e991ccd6295ca839f4dc9f4e5cJose Alberto Reguero } 1396c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine switch (gspca_dev->curr_mode) { 1397c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine case QVGA_MODE: /* 320x240 */ 13988d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine sccb_w_array(gspca_dev, ov965x_start_1_vga, 13998d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine ARRAY_SIZE(ov965x_start_1_vga)); 1400c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w_array(gspca_dev, bridge_start_qvga, 1401c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine ARRAY_SIZE(bridge_start_qvga)); 14028d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine sccb_w_array(gspca_dev, ov965x_start_2_qvga, 14038d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine ARRAY_SIZE(ov965x_start_2_qvga)); 1404c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine break; 1405c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine case VGA_MODE: /* 640x480 */ 14068d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine sccb_w_array(gspca_dev, ov965x_start_1_vga, 14078d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine ARRAY_SIZE(ov965x_start_1_vga)); 1408c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w_array(gspca_dev, bridge_start_vga, 1409c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine ARRAY_SIZE(bridge_start_vga)); 14108d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine sccb_w_array(gspca_dev, ov965x_start_2_vga, 14118d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine ARRAY_SIZE(ov965x_start_2_vga)); 1412c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine break; 1413c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine case SVGA_MODE: /* 800x600 */ 14148d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine sccb_w_array(gspca_dev, ov965x_start_1_svga, 14158d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine ARRAY_SIZE(ov965x_start_1_svga)); 1416c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w_array(gspca_dev, bridge_start_svga, 1417c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine ARRAY_SIZE(bridge_start_svga)); 14188d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine sccb_w_array(gspca_dev, ov965x_start_2_svga, 14198d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine ARRAY_SIZE(ov965x_start_2_svga)); 1420c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine break; 1421c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine case XGA_MODE: /* 1024x768 */ 14228d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine sccb_w_array(gspca_dev, ov965x_start_1_xga, 14238d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine ARRAY_SIZE(ov965x_start_1_xga)); 1424c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w_array(gspca_dev, bridge_start_xga, 1425c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine ARRAY_SIZE(bridge_start_xga)); 14268d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine sccb_w_array(gspca_dev, ov965x_start_2_svga, 14278d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine ARRAY_SIZE(ov965x_start_2_svga)); 1428c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine break; 1429c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine default: 1430c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* case SXGA_MODE: * 1280x1024 */ 14318d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine sccb_w_array(gspca_dev, ov965x_start_1_sxga, 14328d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine ARRAY_SIZE(ov965x_start_1_sxga)); 1433c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w_array(gspca_dev, bridge_start_sxga, 1434c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine ARRAY_SIZE(bridge_start_sxga)); 14358d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine sccb_w_array(gspca_dev, ov965x_start_2_sxga, 14368d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine ARRAY_SIZE(ov965x_start_2_sxga)); 1437c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine break; 1438c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 14397592e0377636963eade33810fcad06487b8b153fJean-François Moine setlightfreq(gspca_dev); 1440c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine setautogain(gspca_dev); 1441c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine setbrightness(gspca_dev); 1442c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine setcontrast(gspca_dev); 1443c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine setexposure(gspca_dev); 1444c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine setsharpness(gspca_dev); 1445c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine setsatur(gspca_dev); 1446c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1447c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w(gspca_dev, 0xe0, 0x00); 1448c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w(gspca_dev, 0xe0, 0x00); 1449c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine set_led(gspca_dev, 1); 14504b27d074748553916ebbdeed9630a6959c85e7deJean-Francois Moine return gspca_dev->usb_err; 1451c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1452c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1453c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void sd_stopN(struct gspca_dev *gspca_dev) 1454c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1455c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w(gspca_dev, 0xe0, 0x01); 1456c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine set_led(gspca_dev, 0); 1457c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine reg_w(gspca_dev, 0xe0, 0x00); 1458c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1459c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1460c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* Values for bmHeaderInfo (Video and Still Image Payload Headers, 2.4.3.3) */ 1461c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define UVC_STREAM_EOH (1 << 7) 1462c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define UVC_STREAM_ERR (1 << 6) 1463c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define UVC_STREAM_STI (1 << 5) 1464c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define UVC_STREAM_RES (1 << 4) 1465c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define UVC_STREAM_SCR (1 << 3) 1466c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define UVC_STREAM_PTS (1 << 2) 1467c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define UVC_STREAM_EOF (1 << 1) 1468c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#define UVC_STREAM_FID (1 << 0) 1469c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1470c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void sd_pkt_scan(struct gspca_dev *gspca_dev, 1471c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine u8 *data, int len) 1472c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1473c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 1474c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine __u32 this_pts; 1475c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine u8 this_fid; 1476c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine int remaining_len = len; 14778d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine int payload_len; 1478c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 14798d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine payload_len = gspca_dev->cam.bulk ? 2048 : 2040; 1480c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine do { 14818d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine len = min(remaining_len, payload_len); 1482c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1483c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine /* Payloads are prefixed with a UVC-style header. We 1484c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine consider a frame to start when the FID toggles, or the PTS 1485c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine changes. A frame ends when EOF is set, and we've received 1486c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine the correct number of bytes. */ 1487c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1488c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine /* Verify UVC header. Header length is always 12 */ 1489c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if (data[0] != 12 || len < 12) { 1490c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine PDEBUG(D_PACK, "bad header"); 1491c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine goto discard; 1492c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 1493c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1494c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine /* Check errors */ 1495c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if (data[1] & UVC_STREAM_ERR) { 1496c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine PDEBUG(D_PACK, "payload error"); 1497c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine goto discard; 1498c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 1499c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1500c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine /* Extract PTS and FID */ 1501c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if (!(data[1] & UVC_STREAM_PTS)) { 1502c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine PDEBUG(D_PACK, "PTS not present"); 1503c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine goto discard; 1504c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 1505c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine this_pts = (data[5] << 24) | (data[4] << 16) 1506c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine | (data[3] << 8) | data[2]; 1507c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine this_fid = data[1] & UVC_STREAM_FID; 1508c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1509c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine /* If PTS or FID has changed, start a new frame. */ 1510c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if (this_pts != sd->last_pts || this_fid != sd->last_fid) { 1511c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if (gspca_dev->last_packet_type == INTER_PACKET) 1512c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine gspca_frame_add(gspca_dev, LAST_PACKET, 1513c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine NULL, 0); 1514c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sd->last_pts = this_pts; 1515c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sd->last_fid = this_fid; 1516c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine gspca_frame_add(gspca_dev, FIRST_PACKET, 1517c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine data + 12, len - 12); 1518c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine /* If this packet is marked as EOF, end the frame */ 1519c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } else if (data[1] & UVC_STREAM_EOF) { 1520c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine sd->last_pts = 0; 1521c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine gspca_frame_add(gspca_dev, LAST_PACKET, 1522c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine data + 12, len - 12); 1523c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } else { 1524c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1525c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine /* Add the data from this payload */ 1526c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine gspca_frame_add(gspca_dev, INTER_PACKET, 1527c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine data + 12, len - 12); 1528c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 1529c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1530c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine /* Done this payload */ 1531c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine goto scan_next; 1532c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1533c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinediscard: 1534c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine /* Discard data until a new frame starts. */ 1535c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine gspca_dev->last_packet_type = DISCARD_PACKET; 1536c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1537c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinescan_next: 1538c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine remaining_len -= len; 1539c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine data += len; 1540c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } while (remaining_len > 0); 1541c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1542c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1543c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic int sd_querymenu(struct gspca_dev *gspca_dev, 1544c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine struct v4l2_querymenu *menu) 1545c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1546c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine switch (menu->id) { 1547c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine case V4L2_CID_POWER_LINE_FREQUENCY: 1548c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine switch (menu->index) { 1549c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine case 0: /* V4L2_CID_POWER_LINE_FREQUENCY_DISABLED */ 1550c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine strcpy((char *) menu->name, "NoFliker"); 1551c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine return 0; 1552c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine case 1: /* V4L2_CID_POWER_LINE_FREQUENCY_50HZ */ 1553c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine strcpy((char *) menu->name, "50 Hz"); 1554c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine return 0; 1555c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine case 2: /* V4L2_CID_POWER_LINE_FREQUENCY_60HZ */ 1556c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine strcpy((char *) menu->name, "60 Hz"); 1557c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine return 0; 1558c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 1559c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine break; 1560c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 1561c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine return -EINVAL; 1562c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1563c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1564c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* sub-driver description */ 1565c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const struct sd_desc sd_desc = { 1566c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .name = MODULE_NAME, 1567c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .ctrls = sd_ctrls, 15687592e0377636963eade33810fcad06487b8b153fJean-François Moine .nctrls = NCTRLS, 1569c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .config = sd_config, 1570c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .init = sd_init, 1571c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .start = sd_start, 1572c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .stopN = sd_stopN, 1573c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .pkt_scan = sd_pkt_scan, 1574c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .querymenu = sd_querymenu, 1575c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 1576c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1577c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* -- module initialisation -- */ 157895c967c167785eb991cf6b22fb854dd8d61d0ff8Jean-François Moinestatic const struct usb_device_id device_table[] = { 15798d64d4f67eb051551c0702501c35e9cc27d8b75dJean-François Moine {USB_DEVICE(0x05a9, 0x8065)}, 1580c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {USB_DEVICE(0x06f8, 0x3003)}, 1581965b37a477915b75ec09cd38d077d0eee9e71abfJose Alberto Reguero {USB_DEVICE(0x05a9, 0x1550)}, 1582c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {} 1583c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 1584c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1585c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois MoineMODULE_DEVICE_TABLE(usb, device_table); 1586c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1587c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine/* -- device connect -- */ 1588c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic int sd_probe(struct usb_interface *intf, const struct usb_device_id *id) 1589c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine{ 1590c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd), 1591c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine THIS_MODULE); 1592c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine} 1593c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1594c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic struct usb_driver sd_driver = { 1595c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .name = MODULE_NAME, 1596c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .id_table = device_table, 1597c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .probe = sd_probe, 1598c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .disconnect = gspca_disconnect, 1599c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#ifdef CONFIG_PM 1600c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .suspend = gspca_suspend, 1601c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .resume = gspca_resume, 1602c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine#endif 1603c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine}; 1604c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1605ecb3b2b35db49778b6d89e3ffd0c400776c20735Greg Kroah-Hartmanmodule_usb_driver(sd_driver); 1606