1fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite/* 2458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine * ov534-ov7xxx gspca driver 3189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine * 4fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * Copyright (C) 2008 Antonio Ospite <ospite@studenti.unina.it> 50f7a50b29dd9c8603d5ce15c11fd1a1d731e1a6dJim Paris * Copyright (C) 2008 Jim Paris <jim@jtan.com> 62ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine * Copyright (C) 2009 Jean-Francois Moine http://moinejf.free.fr 7fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * 8fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * Based on a prototype written by Mark Ferrell <majortrips@gmail.com> 9fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * USB protocol reverse engineered by Jim Paris <jim@jtan.com> 10fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * https://jim.sh/svn/jim/devl/playstation/ps3/eye/test/ 11fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * 12189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine * PS3 Eye camera enhanced by Richard Kaswy http://kaswy.free.fr 136721b51ece65967fe628007fee3e16479c07afd1Max Thrun * PS3 Eye camera - brightness, contrast, awb, agc, aec controls 146721b51ece65967fe628007fee3e16479c07afd1Max Thrun * added by Max Thrun <bear24rw@gmail.com> 15189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine * 16fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * This program is free software; you can redistribute it and/or modify 17fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * it under the terms of the GNU General Public License as published by 18fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * the Free Software Foundation; either version 2 of the License, or 19fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * any later version. 20fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * 21fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * This program is distributed in the hope that it will be useful, 22fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * but WITHOUT ANY WARRANTY; without even the implied warranty of 23fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 24fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * GNU General Public License for more details. 25fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * 26fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * You should have received a copy of the GNU General Public License 27fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * along with this program; if not, write to the Free Software 28fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 29fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite */ 30fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 31133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 32133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches 33fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define MODULE_NAME "ov534" 34fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 35fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#include "gspca.h" 36fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 372ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine#define OV534_REG_ADDRESS 0xf1 /* sensor address */ 38fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define OV534_REG_SUBADDR 0xf2 39fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define OV534_REG_WRITE 0xf3 40fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define OV534_REG_READ 0xf4 41fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define OV534_REG_OPERATION 0xf5 42fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define OV534_REG_STATUS 0xf6 43fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 44fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define OV534_OP_WRITE_3 0x37 45fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define OV534_OP_WRITE_2 0x33 46fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define OV534_OP_READ_2 0xf9 47fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 48fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#define CTRL_TIMEOUT 500 49fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 50fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio OspiteMODULE_AUTHOR("Antonio Ospite <ospite@studenti.unina.it>"); 51fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio OspiteMODULE_DESCRIPTION("GSPCA/OV534 USB Camera Driver"); 52fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio OspiteMODULE_LICENSE("GPL"); 53fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 54228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine/* controls */ 55228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moineenum e_ctrl { 56228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine BRIGHTNESS, 57228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine CONTRAST, 58228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine GAIN, 59228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine EXPOSURE, 60228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine AGC, 61228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine AWB, 62228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine AEC, 63228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine SHARPNESS, 64228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine HFLIP, 65228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine VFLIP, 66d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine COLORS, 67228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine LIGHTFREQ, 68228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine NCTRLS /* number of controls */ 69228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine}; 70228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine 71fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite/* specific webcam descriptor */ 72fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospitestruct sd { 73fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite struct gspca_dev gspca_dev; /* !! must be the first item */ 74228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine 75228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine struct gspca_ctrl ctrls[NCTRLS]; 76228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine 778c252050146fc6f54e9bf5ef8276b25f3dd67a1cJean-Francois Moine __u32 last_pts; 7884fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine u16 last_fid; 7984fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine u8 frame_rate; 80b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine 81458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine u8 sensor; 82458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine}; 83458efe2d558b51fff38026e8ede9374899340e60Jean-François Moineenum sensors { 84458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine SENSOR_OV767x, 85458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine SENSOR_OV772x, 86458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine NSENSORS 87fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite}; 88fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 89fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite/* V4L2 controls supported by the driver */ 90228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setbrightness(struct gspca_dev *gspca_dev); 91228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setcontrast(struct gspca_dev *gspca_dev); 92228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setgain(struct gspca_dev *gspca_dev); 93228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setexposure(struct gspca_dev *gspca_dev); 948b7fbda484176b46a7760fd474d605ca5152c86dMax Thrunstatic int sd_setagc(struct gspca_dev *gspca_dev, __s32 val); 95228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setawb(struct gspca_dev *gspca_dev); 96228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setaec(struct gspca_dev *gspca_dev); 97228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setsharpness(struct gspca_dev *gspca_dev); 98228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void sethvflip(struct gspca_dev *gspca_dev); 99d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moinestatic void setcolors(struct gspca_dev *gspca_dev); 100228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setlightfreq(struct gspca_dev *gspca_dev); 101228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine 102228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic int sd_start(struct gspca_dev *gspca_dev); 103228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void sd_stopN(struct gspca_dev *gspca_dev); 104189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 105c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const struct ctrl sd_ctrls[] = { 106228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[BRIGHTNESS] = { 1077f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite { 1087f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .id = V4L2_CID_BRIGHTNESS, 1097f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .type = V4L2_CTRL_TYPE_INTEGER, 1107f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .name = "Brightness", 1117f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .minimum = 0, 1127f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .maximum = 255, 1137f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .step = 1, 114228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .default_value = 0, 1157f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite }, 116228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .set_control = setbrightness 117b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine }, 118228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[CONTRAST] = { 1197f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite { 1207f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .id = V4L2_CID_CONTRAST, 1217f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .type = V4L2_CTRL_TYPE_INTEGER, 1227f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .name = "Contrast", 1237f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .minimum = 0, 1247f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .maximum = 255, 1257f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .step = 1, 126228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .default_value = 32, 1277f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite }, 128228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .set_control = setcontrast 129b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine }, 130228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[GAIN] = { 1317f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite { 1327f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .id = V4L2_CID_GAIN, 1337f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .type = V4L2_CTRL_TYPE_INTEGER, 1347f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .name = "Main Gain", 1357f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .minimum = 0, 1367f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .maximum = 63, 1377f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .step = 1, 138228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .default_value = 20, 1397f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite }, 140228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .set_control = setgain 141189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine }, 142228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[EXPOSURE] = { 1437f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite { 1447f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .id = V4L2_CID_EXPOSURE, 1457f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .type = V4L2_CTRL_TYPE_INTEGER, 1467f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .name = "Exposure", 1477f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .minimum = 0, 1487f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .maximum = 255, 1497f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .step = 1, 150228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .default_value = 120, 1517f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite }, 152228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .set_control = setexposure 153189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine }, 154228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[AGC] = { 1557f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite { 1567f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .id = V4L2_CID_AUTOGAIN, 1577f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .type = V4L2_CTRL_TYPE_BOOLEAN, 1587f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .name = "Auto Gain", 1597f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .minimum = 0, 1607f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .maximum = 1, 1617f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .step = 1, 162228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .default_value = 1, 1637f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite }, 164228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .set = sd_setagc 165189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine }, 166228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[AWB] = { 1677f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite { 1687f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .id = V4L2_CID_AUTO_WHITE_BALANCE, 1697f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .type = V4L2_CTRL_TYPE_BOOLEAN, 1707f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .name = "Auto White Balance", 1717f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .minimum = 0, 1727f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .maximum = 1, 1737f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .step = 1, 174228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .default_value = 1, 1757f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite }, 176228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .set_control = setawb 177b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine }, 178228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[AEC] = { 1797f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite { 1807f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .id = V4L2_CID_EXPOSURE_AUTO, 1817f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .type = V4L2_CTRL_TYPE_BOOLEAN, 1827f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .name = "Auto Exposure", 1837f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .minimum = 0, 1847f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .maximum = 1, 1857f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .step = 1, 186228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .default_value = 1, 1877f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite }, 188228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .set_control = setaec 189f2938822523739e99a39fd634943865a432e9c00Max Thrun }, 190228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[SHARPNESS] = { 1917f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite { 1927f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .id = V4L2_CID_SHARPNESS, 1937f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .type = V4L2_CTRL_TYPE_INTEGER, 1947f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .name = "Sharpness", 1957f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .minimum = 0, 1967f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .maximum = 63, 1977f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .step = 1, 198228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .default_value = 0, 1997f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite }, 200228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .set_control = setsharpness 201189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine }, 202228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[HFLIP] = { 2037f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite { 2047f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .id = V4L2_CID_HFLIP, 2057f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .type = V4L2_CTRL_TYPE_BOOLEAN, 2067f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .name = "HFlip", 2077f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .minimum = 0, 2087f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .maximum = 1, 2097f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .step = 1, 210228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .default_value = 0, 2117f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite }, 212228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .set_control = sethvflip 213189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine }, 214228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[VFLIP] = { 2157f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite { 2167f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .id = V4L2_CID_VFLIP, 2177f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .type = V4L2_CTRL_TYPE_BOOLEAN, 2187f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .name = "VFlip", 2197f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .minimum = 0, 2207f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .maximum = 1, 2217f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite .step = 1, 222228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .default_value = 0, 2237f9e9e8dc2d5b226819e486e13c9532f40a0fbdaAntonio Ospite }, 224228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .set_control = sethvflip 225189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine }, 226d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine[COLORS] = { 227d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine { 228d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine .id = V4L2_CID_SATURATION, 229d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine .type = V4L2_CTRL_TYPE_INTEGER, 230d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine .name = "Saturation", 231d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine .minimum = 0, 232d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine .maximum = 6, 233d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine .step = 1, 234d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine .default_value = 3, 235d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine }, 236d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine .set_control = setcolors 237d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine }, 238228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine[LIGHTFREQ] = { 2394b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi { 2404b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi .id = V4L2_CID_POWER_LINE_FREQUENCY, 2414b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi .type = V4L2_CTRL_TYPE_MENU, 2424b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi .name = "Light Frequency Filter", 2434b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi .minimum = 0, 2444b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi .maximum = 1, 2454b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi .step = 1, 246228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .default_value = 0, 2474b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi }, 248228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine .set_control = setlightfreq 2494b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi }, 250189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine}; 251fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 252569691a5a0fe844e36890e49833130e665868136Jean-Francois Moinestatic const struct v4l2_pix_format ov772x_mode[] = { 253189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {320, 240, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE, 254189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine .bytesperline = 320 * 2, 255189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine .sizeimage = 320 * 240 * 2, 256b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine .colorspace = V4L2_COLORSPACE_SRGB, 257189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine .priv = 1}, 258fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite {640, 480, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE, 259fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite .bytesperline = 640 * 2, 260fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite .sizeimage = 640 * 480 * 2, 261191d0e7fba43d79a73605adcf85441ebe0a2aff7Jean-Francois Moine .colorspace = V4L2_COLORSPACE_SRGB, 262191d0e7fba43d79a73605adcf85441ebe0a2aff7Jean-Francois Moine .priv = 0}, 263191d0e7fba43d79a73605adcf85441ebe0a2aff7Jean-Francois Moine}; 264458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const struct v4l2_pix_format ov767x_mode[] = { 265458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 266458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine .bytesperline = 320, 267458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine .sizeimage = 320 * 240 * 3 / 8 + 590, 268458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine .colorspace = V4L2_COLORSPACE_JPEG}, 269458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 270458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine .bytesperline = 640, 271458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine .sizeimage = 640 * 480 * 3 / 8 + 590, 272458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine .colorspace = V4L2_COLORSPACE_JPEG}, 273458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine}; 274191d0e7fba43d79a73605adcf85441ebe0a2aff7Jean-Francois Moine 27529b87f045552910f964972b7a45e9be054401a0bAntonio Ospitestatic const u8 qvga_rates[] = {125, 100, 75, 60, 50, 40, 30}; 27629b87f045552910f964972b7a45e9be054401a0bAntonio Ospitestatic const u8 vga_rates[] = {60, 50, 40, 30, 15}; 27729b87f045552910f964972b7a45e9be054401a0bAntonio Ospite 27829b87f045552910f964972b7a45e9be054401a0bAntonio Ospitestatic const struct framerates ov772x_framerates[] = { 27929b87f045552910f964972b7a45e9be054401a0bAntonio Ospite { /* 320x240 */ 28029b87f045552910f964972b7a45e9be054401a0bAntonio Ospite .rates = qvga_rates, 28129b87f045552910f964972b7a45e9be054401a0bAntonio Ospite .nrates = ARRAY_SIZE(qvga_rates), 28229b87f045552910f964972b7a45e9be054401a0bAntonio Ospite }, 28329b87f045552910f964972b7a45e9be054401a0bAntonio Ospite { /* 640x480 */ 28429b87f045552910f964972b7a45e9be054401a0bAntonio Ospite .rates = vga_rates, 28529b87f045552910f964972b7a45e9be054401a0bAntonio Ospite .nrates = ARRAY_SIZE(vga_rates), 28629b87f045552910f964972b7a45e9be054401a0bAntonio Ospite }, 28729b87f045552910f964972b7a45e9be054401a0bAntonio Ospite}; 28829b87f045552910f964972b7a45e9be054401a0bAntonio Ospite 289458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestruct reg_array { 290458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine const u8 (*val)[2]; 291458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine int len; 292458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine}; 293458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine 294458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 bridge_init_767x[][2] = { 295458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine/* comments from the ms-win file apollo7670.set */ 296458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine/* str1 */ 297458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xf1, 0x42}, 298458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x88, 0xf8}, 299458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x89, 0xff}, 300458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x76, 0x03}, 301458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x92, 0x03}, 302458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x95, 0x10}, 303458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xe2, 0x00}, 304458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xe7, 0x3e}, 305458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x8d, 0x1c}, 306458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x8e, 0x00}, 307458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x8f, 0x00}, 308458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1f, 0x00}, 309458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc3, 0xf9}, 310458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x89, 0xff}, 311458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x88, 0xf8}, 312458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x76, 0x03}, 313458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x92, 0x01}, 314458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x93, 0x18}, 315458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1c, 0x00}, 316458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1d, 0x48}, 317458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1d, 0x00}, 318458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1d, 0xff}, 319458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1d, 0x02}, 320458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1d, 0x58}, 321458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1d, 0x00}, 322458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1c, 0x0a}, 323458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1d, 0x0a}, 324458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1d, 0x0e}, 325458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc0, 0x50}, /* HSize 640 */ 326458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc1, 0x3c}, /* VSize 480 */ 327458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x34, 0x05}, /* enable Audio Suspend mode */ 328458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc2, 0x0c}, /* Input YUV */ 329458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc3, 0xf9}, /* enable PRE */ 330458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x34, 0x05}, /* enable Audio Suspend mode */ 331458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xe7, 0x2e}, /* this solves failure of "SuspendResumeTest" */ 332458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x31, 0xf9}, /* enable 1.8V Suspend */ 333458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x35, 0x02}, /* turn on JPEG */ 334458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xd9, 0x10}, 335458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x25, 0x42}, /* GPIO[8]:Input */ 336458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x94, 0x11}, /* If the default setting is loaded when 337458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine * system boots up, this flag is closed here */ 338458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine}; 339458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 sensor_init_767x[][2] = { 340458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x12, 0x80}, 341458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x11, 0x03}, 342458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x3a, 0x04}, 343458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x12, 0x00}, 344458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x17, 0x13}, 345458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x18, 0x01}, 346458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x32, 0xb6}, 347458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x19, 0x02}, 348458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1a, 0x7a}, 349458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x03, 0x0a}, 350458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x0c, 0x00}, 351458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x3e, 0x00}, 352458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x70, 0x3a}, 353458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x71, 0x35}, 354458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x72, 0x11}, 355458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x73, 0xf0}, 356458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xa2, 0x02}, 357458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x7a, 0x2a}, /* set Gamma=1.6 below */ 358458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x7b, 0x12}, 359458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x7c, 0x1d}, 360458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x7d, 0x2d}, 361458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x7e, 0x45}, 362458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x7f, 0x50}, 363458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x80, 0x59}, 364458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x81, 0x62}, 365458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x82, 0x6b}, 366458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x83, 0x73}, 367458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x84, 0x7b}, 368458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x85, 0x8a}, 369458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x86, 0x98}, 370458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x87, 0xb2}, 371458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x88, 0xca}, 372458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x89, 0xe0}, 373458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x13, 0xe0}, 374458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x00, 0x00}, 375458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x10, 0x00}, 376458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x0d, 0x40}, 377458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x14, 0x38}, /* gain max 16x */ 378458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xa5, 0x05}, 379458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xab, 0x07}, 380458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x24, 0x95}, 381458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x25, 0x33}, 382458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x26, 0xe3}, 383458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x9f, 0x78}, 384458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xa0, 0x68}, 385458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xa1, 0x03}, 386458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xa6, 0xd8}, 387458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xa7, 0xd8}, 388458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xa8, 0xf0}, 389458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xa9, 0x90}, 390458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xaa, 0x94}, 391458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x13, 0xe5}, 392458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x0e, 0x61}, 393458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x0f, 0x4b}, 394458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x16, 0x02}, 395458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x21, 0x02}, 396458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x22, 0x91}, 397458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x29, 0x07}, 398458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x33, 0x0b}, 399458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x35, 0x0b}, 400458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x37, 0x1d}, 401458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x38, 0x71}, 402458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x39, 0x2a}, 403458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x3c, 0x78}, 404458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x4d, 0x40}, 405458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x4e, 0x20}, 406458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x69, 0x00}, 407458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x6b, 0x4a}, 408458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x74, 0x10}, 409458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x8d, 0x4f}, 410458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x8e, 0x00}, 411458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x8f, 0x00}, 412458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x90, 0x00}, 413458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x91, 0x00}, 414458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x96, 0x00}, 415458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x9a, 0x80}, 416458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xb0, 0x84}, 417458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xb1, 0x0c}, 418458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xb2, 0x0e}, 419458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xb3, 0x82}, 420458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xb8, 0x0a}, 421458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x43, 0x0a}, 422458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x44, 0xf0}, 423458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x45, 0x34}, 424458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x46, 0x58}, 425458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x47, 0x28}, 426458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x48, 0x3a}, 427458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x59, 0x88}, 428458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x5a, 0x88}, 429458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x5b, 0x44}, 430458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x5c, 0x67}, 431458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x5d, 0x49}, 432458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x5e, 0x0e}, 433458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x6c, 0x0a}, 434458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x6d, 0x55}, 435458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x6e, 0x11}, 436458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x6f, 0x9f}, 437458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x6a, 0x40}, 438458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x01, 0x40}, 439458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x02, 0x40}, 440458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x13, 0xe7}, 441458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x4f, 0x80}, 442458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x50, 0x80}, 443458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x51, 0x00}, 444458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x52, 0x22}, 445458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x53, 0x5e}, 446458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x54, 0x80}, 447458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x58, 0x9e}, 448458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x41, 0x08}, 449458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x3f, 0x00}, 450458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x75, 0x04}, 451458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x76, 0xe1}, 452458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x4c, 0x00}, 453458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x77, 0x01}, 454458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x3d, 0xc2}, 455458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x4b, 0x09}, 456458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc9, 0x60}, 457458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x41, 0x38}, /* jfm: auto sharpness + auto de-noise */ 458458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x56, 0x40}, 459458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x34, 0x11}, 460458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x3b, 0xc2}, 461458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xa4, 0x8a}, /* Night mode trigger point */ 462458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x96, 0x00}, 463458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x97, 0x30}, 464458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x98, 0x20}, 465458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x99, 0x20}, 466458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x9a, 0x84}, 467458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x9b, 0x29}, 468458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x9c, 0x03}, 469458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x9d, 0x4c}, 470458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x9e, 0x3f}, 471458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x78, 0x04}, 472458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x79, 0x01}, 473458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc8, 0xf0}, 474458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x79, 0x0f}, 475458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc8, 0x00}, 476458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x79, 0x10}, 477458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc8, 0x7e}, 478458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x79, 0x0a}, 479458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc8, 0x80}, 480458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x79, 0x0b}, 481458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc8, 0x01}, 482458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x79, 0x0c}, 483458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc8, 0x0f}, 484458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x79, 0x0d}, 485458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc8, 0x20}, 486458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x79, 0x09}, 487458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc8, 0x80}, 488458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x79, 0x02}, 489458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc8, 0xc0}, 490458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x79, 0x03}, 491458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc8, 0x20}, 492458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x79, 0x26}, 493458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine}; 494458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 bridge_start_vga_767x[][2] = { 495458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine/* str59 JPG */ 496458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x94, 0xaa}, 497458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xf1, 0x42}, 498458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xe5, 0x04}, 499458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc0, 0x50}, 500458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc1, 0x3c}, 501458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc2, 0x0c}, 502458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x35, 0x02}, /* turn on JPEG */ 503458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xd9, 0x10}, 504458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xda, 0x00}, /* for higher clock rate(30fps) */ 505458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x34, 0x05}, /* enable Audio Suspend mode */ 506458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc3, 0xf9}, /* enable PRE */ 507458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x8c, 0x00}, /* CIF VSize LSB[2:0] */ 508458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x8d, 0x1c}, /* output YUV */ 509458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine/* {0x34, 0x05}, * enable Audio Suspend mode (?) */ 510458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x50, 0x00}, /* H/V divider=0 */ 511458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x51, 0xa0}, /* input H=640/4 */ 512458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x52, 0x3c}, /* input V=480/4 */ 513458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x53, 0x00}, /* offset X=0 */ 514458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x54, 0x00}, /* offset Y=0 */ 515458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x55, 0x00}, /* H/V size[8]=0 */ 516458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x57, 0x00}, /* H-size[9]=0 */ 517458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x5c, 0x00}, /* output size[9:8]=0 */ 518458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x5a, 0xa0}, /* output H=640/4 */ 519458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x5b, 0x78}, /* output V=480/4 */ 520458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1c, 0x0a}, 521458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1d, 0x0a}, 522458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x94, 0x11}, 523458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine}; 524458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 sensor_start_vga_767x[][2] = { 525458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x11, 0x01}, 526458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1e, 0x04}, 527458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x19, 0x02}, 528458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1a, 0x7a}, 529458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine}; 530458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 bridge_start_qvga_767x[][2] = { 531458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine/* str86 JPG */ 532458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x94, 0xaa}, 533458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xf1, 0x42}, 534458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xe5, 0x04}, 535458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc0, 0x80}, 536458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc1, 0x60}, 537458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc2, 0x0c}, 538458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x35, 0x02}, /* turn on JPEG */ 539458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xd9, 0x10}, 540458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc0, 0x50}, /* CIF HSize 640 */ 541458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc1, 0x3c}, /* CIF VSize 480 */ 542458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x8c, 0x00}, /* CIF VSize LSB[2:0] */ 543458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x8d, 0x1c}, /* output YUV */ 544458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x34, 0x05}, /* enable Audio Suspend mode */ 545458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc2, 0x4c}, /* output YUV and Enable DCW */ 546458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0xc3, 0xf9}, /* enable PRE */ 547458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1c, 0x00}, /* indirect addressing */ 548458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1d, 0x48}, /* output YUV422 */ 549458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x50, 0x89}, /* H/V divider=/2; plus DCW AVG */ 550458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x51, 0xa0}, /* DCW input H=640/4 */ 551458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x52, 0x78}, /* DCW input V=480/4 */ 552458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x53, 0x00}, /* offset X=0 */ 553458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x54, 0x00}, /* offset Y=0 */ 554458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x55, 0x00}, /* H/V size[8]=0 */ 555458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x57, 0x00}, /* H-size[9]=0 */ 556458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x5c, 0x00}, /* DCW output size[9:8]=0 */ 557458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x5a, 0x50}, /* DCW output H=320/4 */ 558458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x5b, 0x3c}, /* DCW output V=240/4 */ 559458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1c, 0x0a}, 560458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1d, 0x0a}, 561458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x94, 0x11}, 562458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine}; 563458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 sensor_start_qvga_767x[][2] = { 564458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x11, 0x01}, 565458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1e, 0x04}, 566458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x19, 0x02}, 567458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {0x1a, 0x7a}, 568458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine}; 569458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine 570458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 bridge_init_772x[][2] = { 57147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0xc2, 0x0c }, 57247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x88, 0xf8 }, 57347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0xc3, 0x69 }, 57447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x89, 0xff }, 57547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x76, 0x03 }, 57647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x92, 0x01 }, 57747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x93, 0x18 }, 57847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x94, 0x10 }, 57947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x95, 0x10 }, 58047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0xe2, 0x00 }, 58147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0xe7, 0x3e }, 58247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris 58347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x96, 0x00 }, 58447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris 58547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x97, 0x20 }, 58647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x97, 0x20 }, 58747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x97, 0x20 }, 58847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x97, 0x0a }, 58947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x97, 0x3f }, 59047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x97, 0x4a }, 59147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x97, 0x20 }, 59247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x97, 0x15 }, 59347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x97, 0x0b }, 59447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris 59547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x8e, 0x40 }, 59647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x1f, 0x81 }, 59747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x34, 0x05 }, 59847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0xe3, 0x04 }, 59947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x88, 0x00 }, 60047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x89, 0x00 }, 60147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x76, 0x00 }, 60247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0xe7, 0x2e }, 60347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x31, 0xf9 }, 60447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x25, 0x42 }, 60547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x21, 0xf0 }, 60647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris 60747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x1c, 0x00 }, 60847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x1d, 0x40 }, 6090f7a50b29dd9c8603d5ce15c11fd1a1d731e1a6dJim Paris { 0x1d, 0x02 }, /* payload size 0x0200 * 4 = 2048 bytes */ 6100f7a50b29dd9c8603d5ce15c11fd1a1d731e1a6dJim Paris { 0x1d, 0x00 }, /* payload size */ 611189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 6125ea9c4def8154a5be836dd31cbd97f49fd34ea8fJim Paris { 0x1d, 0x02 }, /* frame size 0x025800 * 4 = 614400 */ 6135ea9c4def8154a5be836dd31cbd97f49fd34ea8fJim Paris { 0x1d, 0x58 }, /* frame size */ 6145ea9c4def8154a5be836dd31cbd97f49fd34ea8fJim Paris { 0x1d, 0x00 }, /* frame size */ 61547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris 616c06eb61941459b1981817fb675d0104ac0cd6df8Jim Paris { 0x1c, 0x0a }, 617c06eb61941459b1981817fb675d0104ac0cd6df8Jim Paris { 0x1d, 0x08 }, /* turn on UVC header */ 618c06eb61941459b1981817fb675d0104ac0cd6df8Jim Paris { 0x1d, 0x0e }, /* .. */ 619c06eb61941459b1981817fb675d0104ac0cd6df8Jim Paris 62047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x8d, 0x1c }, 62147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x8e, 0x80 }, 62247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0xe5, 0x04 }, 62347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris 62447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0xc0, 0x50 }, 62547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0xc1, 0x3c }, 62647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0xc2, 0x0c }, 62747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris}; 628458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 sensor_init_772x[][2] = { 62947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x12, 0x80 }, 63047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x11, 0x01 }, 631189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine/*fixme: better have a delay?*/ 632189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine { 0x11, 0x01 }, 633189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine { 0x11, 0x01 }, 634189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine { 0x11, 0x01 }, 635189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine { 0x11, 0x01 }, 636189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine { 0x11, 0x01 }, 637189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine { 0x11, 0x01 }, 638189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine { 0x11, 0x01 }, 639189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine { 0x11, 0x01 }, 640189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine { 0x11, 0x01 }, 641189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine { 0x11, 0x01 }, 64247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris 64347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x3d, 0x03 }, 64447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x17, 0x26 }, 64547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x18, 0xa0 }, 64647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x19, 0x07 }, 64747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x1a, 0xf0 }, 64847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x32, 0x00 }, 64947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x29, 0xa0 }, 65047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x2c, 0xf0 }, 65147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x65, 0x20 }, 65247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x11, 0x01 }, 65347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x42, 0x7f }, 654b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine { 0x63, 0xaa }, /* AWB - was e0 */ 65547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x64, 0xff }, 65647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x66, 0x00 }, 657b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine { 0x13, 0xf0 }, /* com8 */ 65847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x0d, 0x41 }, 65947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x0f, 0xc5 }, 66047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x14, 0x11 }, 66147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris 66247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x22, 0x7f }, 66347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x23, 0x03 }, 66447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x24, 0x40 }, 66547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x25, 0x30 }, 66647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x26, 0xa1 }, 66747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x2a, 0x00 }, 66847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x2b, 0x00 }, 66947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x6b, 0xaa }, 670b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine { 0x13, 0xff }, /* AWB */ 67147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris 67247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x90, 0x05 }, 67347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x91, 0x01 }, 67447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x92, 0x03 }, 67547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x93, 0x00 }, 67647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x94, 0x60 }, 67747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x95, 0x3c }, 67847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x96, 0x24 }, 67947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x97, 0x1e }, 68047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x98, 0x62 }, 68147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x99, 0x80 }, 68247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x9a, 0x1e }, 68347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x9b, 0x08 }, 68447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x9c, 0x20 }, 68547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x9e, 0x81 }, 68647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris 68747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0xa6, 0x04 }, 68847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x7e, 0x0c }, 68947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x7f, 0x16 }, 69047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x80, 0x2a }, 69147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x81, 0x4e }, 69247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x82, 0x61 }, 69347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x83, 0x6f }, 69447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x84, 0x7b }, 69547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x85, 0x86 }, 69647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x86, 0x8e }, 69747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x87, 0x97 }, 69847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x88, 0xa4 }, 69947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x89, 0xaf }, 70047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x8a, 0xc5 }, 70147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x8b, 0xd7 }, 70247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x8c, 0xe8 }, 70347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x8d, 0x20 }, 70447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris 70547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x0c, 0x90 }, 70647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris 70747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x2b, 0x00 }, 70847dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x22, 0x7f }, 70947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x23, 0x03 }, 71047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x11, 0x01 }, 71147dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x0c, 0xd0 }, 71247dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x64, 0xff }, 71347dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x0d, 0x41 }, 71447dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris 71547dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x14, 0x41 }, 71647dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x0e, 0xcd }, 71747dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0xac, 0xbf }, 718b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine { 0x8e, 0x00 }, /* De-noise threshold */ 71947dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris { 0x0c, 0xd0 } 72047dfd21fbf4ba303b5fdfad6f4e110e57990803cJim Paris}; 721458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 bridge_start_vga_772x[][2] = { 722189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x1c, 0x00}, 723189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x1d, 0x40}, 724189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x1d, 0x02}, 725189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x1d, 0x00}, 726189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x1d, 0x02}, 727189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x1d, 0x58}, 728189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x1d, 0x00}, 729189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0xc0, 0x50}, 730189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0xc1, 0x3c}, 731189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine}; 732458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 sensor_start_vga_772x[][2] = { 733189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x12, 0x00}, 734189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x17, 0x26}, 735189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x18, 0xa0}, 736189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x19, 0x07}, 737189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x1a, 0xf0}, 738189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x29, 0xa0}, 739189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x2c, 0xf0}, 740b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine {0x65, 0x20}, 741189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine}; 742458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 bridge_start_qvga_772x[][2] = { 743189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x1c, 0x00}, 744189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x1d, 0x40}, 745189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x1d, 0x02}, 746189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x1d, 0x00}, 747189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x1d, 0x01}, 748189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x1d, 0x4b}, 749189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x1d, 0x00}, 750189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0xc0, 0x28}, 751189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0xc1, 0x1e}, 752189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine}; 753458efe2d558b51fff38026e8ede9374899340e60Jean-François Moinestatic const u8 sensor_start_qvga_772x[][2] = { 754189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x12, 0x40}, 755189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x17, 0x3f}, 756189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x18, 0x50}, 757189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x19, 0x03}, 758189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x1a, 0x78}, 759189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x29, 0x50}, 760189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {0x2c, 0x78}, 761b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine {0x65, 0x2f}, 762189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine}; 763fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 7642ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moinestatic void ov534_reg_write(struct gspca_dev *gspca_dev, u16 reg, u8 val) 7652ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine{ 7662ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine struct usb_device *udev = gspca_dev->dev; 7672ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine int ret; 7682ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 76914b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine if (gspca_dev->usb_err < 0) 77014b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine return; 77114b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine 772ddffa49e257e2b28e23f1e2729c0560bcad89937Jean-François Moine PDEBUG(D_USBO, "SET 01 0000 %04x %02x", reg, val); 7732ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine gspca_dev->usb_buf[0] = val; 7742ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine ret = usb_control_msg(udev, 7752ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine usb_sndctrlpipe(udev, 0), 7762ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 0x01, 7772ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 7782ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 0x00, reg, gspca_dev->usb_buf, 1, CTRL_TIMEOUT); 77914b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine if (ret < 0) { 780133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches pr_err("write failed %d\n", ret); 78114b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine gspca_dev->usb_err = ret; 78214b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine } 7832ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine} 7842ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 7852ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moinestatic u8 ov534_reg_read(struct gspca_dev *gspca_dev, u16 reg) 7862ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine{ 7872ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine struct usb_device *udev = gspca_dev->dev; 7882ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine int ret; 7892ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 79014b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine if (gspca_dev->usb_err < 0) 79114b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine return 0; 7922ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine ret = usb_control_msg(udev, 7932ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine usb_rcvctrlpipe(udev, 0), 7942ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 0x01, 7952ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 7962ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 0x00, reg, gspca_dev->usb_buf, 1, CTRL_TIMEOUT); 797ddffa49e257e2b28e23f1e2729c0560bcad89937Jean-François Moine PDEBUG(D_USBI, "GET 01 0000 %04x %02x", reg, gspca_dev->usb_buf[0]); 79814b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine if (ret < 0) { 799133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches pr_err("read failed %d\n", ret); 80014b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine gspca_dev->usb_err = ret; 80114b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine } 8022ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine return gspca_dev->usb_buf[0]; 8032ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine} 8042ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 8052ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine/* Two bits control LED: 0x21 bit 7 and 0x23 bit 7. 8062ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine * (direction and output)? */ 8072ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moinestatic void ov534_set_led(struct gspca_dev *gspca_dev, int status) 8082ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine{ 8092ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine u8 data; 8102ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 8112ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine PDEBUG(D_CONF, "led status: %d", status); 8122ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 8132ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine data = ov534_reg_read(gspca_dev, 0x21); 8142ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine data |= 0x80; 8152ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine ov534_reg_write(gspca_dev, 0x21, data); 8162ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 8172ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine data = ov534_reg_read(gspca_dev, 0x23); 8182ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine if (status) 8192ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine data |= 0x80; 8202ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine else 8212ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine data &= ~0x80; 8222ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 8232ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine ov534_reg_write(gspca_dev, 0x23, data); 8242ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 8252ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine if (!status) { 8262ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine data = ov534_reg_read(gspca_dev, 0x21); 8272ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine data &= ~0x80; 8282ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine ov534_reg_write(gspca_dev, 0x21, data); 8292ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine } 8302ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine} 8312ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 8322ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moinestatic int sccb_check_status(struct gspca_dev *gspca_dev) 8332ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine{ 8342ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine u8 data; 8352ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine int i; 8362ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 8372ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine for (i = 0; i < 5; i++) { 8382ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine data = ov534_reg_read(gspca_dev, OV534_REG_STATUS); 8392ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 8402ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine switch (data) { 8412ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine case 0x00: 8422ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine return 1; 8432ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine case 0x04: 8442ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine return 0; 8452ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine case 0x03: 8462ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine break; 8472ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine default: 8482ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine PDEBUG(D_ERR, "sccb status 0x%02x, attempt %d/5", 8492ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine data, i + 1); 8502ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine } 8512ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine } 8522ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine return 0; 8532ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine} 8542ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 8552ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moinestatic void sccb_reg_write(struct gspca_dev *gspca_dev, u8 reg, u8 val) 8562ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine{ 857ddffa49e257e2b28e23f1e2729c0560bcad89937Jean-François Moine PDEBUG(D_USBO, "sccb write: %02x %02x", reg, val); 8582ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine ov534_reg_write(gspca_dev, OV534_REG_SUBADDR, reg); 8592ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine ov534_reg_write(gspca_dev, OV534_REG_WRITE, val); 8602ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine ov534_reg_write(gspca_dev, OV534_REG_OPERATION, OV534_OP_WRITE_3); 8612ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 86214b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine if (!sccb_check_status(gspca_dev)) { 863133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches pr_err("sccb_reg_write failed\n"); 86414b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine gspca_dev->usb_err = -EIO; 86514b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine } 8662ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine} 8672ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 8682ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moinestatic u8 sccb_reg_read(struct gspca_dev *gspca_dev, u16 reg) 8692ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine{ 8702ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine ov534_reg_write(gspca_dev, OV534_REG_SUBADDR, reg); 8712ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine ov534_reg_write(gspca_dev, OV534_REG_OPERATION, OV534_OP_WRITE_2); 8722ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine if (!sccb_check_status(gspca_dev)) 873133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches pr_err("sccb_reg_read failed 1\n"); 8742ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 8752ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine ov534_reg_write(gspca_dev, OV534_REG_OPERATION, OV534_OP_READ_2); 8762ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine if (!sccb_check_status(gspca_dev)) 877133a9fe949862d9ed8411fb423739f4cee08232dJoe Perches pr_err("sccb_reg_read failed 2\n"); 8782ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 8792ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine return ov534_reg_read(gspca_dev, OV534_REG_READ); 8802ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine} 8812ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 8822ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine/* output a bridge sequence (reg - val) */ 8832ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moinestatic void reg_w_array(struct gspca_dev *gspca_dev, 8842ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine const u8 (*data)[2], int len) 8852ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine{ 8862ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine while (--len >= 0) { 8872ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine ov534_reg_write(gspca_dev, (*data)[0], (*data)[1]); 8882ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine data++; 8892ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine } 8902ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine} 8912ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 8922ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine/* output a sensor sequence (reg - val) */ 8932ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moinestatic void sccb_w_array(struct gspca_dev *gspca_dev, 8942ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine const u8 (*data)[2], int len) 8952ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine{ 8962ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine while (--len >= 0) { 8972ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine if ((*data)[0] != 0xff) { 8982ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine sccb_reg_write(gspca_dev, (*data)[0], (*data)[1]); 8992ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine } else { 9002ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine sccb_reg_read(gspca_dev, (*data)[1]); 9012ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine sccb_reg_write(gspca_dev, 0xff, 0x00); 9022ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine } 9032ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine data++; 9042ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine } 9052ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine} 9062ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 90769f1fe28f08000a123b3d71fac88564109da09fdJean-Francois Moine/* ov772x specific controls */ 90869f1fe28f08000a123b3d71fac88564109da09fdJean-Francois Moinestatic void set_frame_rate(struct gspca_dev *gspca_dev) 90911d9f25da89523d19dba3608d51a86af2954fc0dJim Paris{ 91011d9f25da89523d19dba3608d51a86af2954fc0dJim Paris struct sd *sd = (struct sd *) gspca_dev; 911189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine int i; 912189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine struct rate_s { 913189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine u8 fps; 914189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine u8 r11; 915189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine u8 r0d; 916189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine u8 re5; 917189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine }; 918189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine const struct rate_s *r; 919189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine static const struct rate_s rate_0[] = { /* 640x480 */ 920189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {60, 0x01, 0xc1, 0x04}, 921189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {50, 0x01, 0x41, 0x02}, 922189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {40, 0x02, 0xc1, 0x04}, 923189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {30, 0x04, 0x81, 0x02}, 924189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {15, 0x03, 0x41, 0x04}, 925189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine }; 926189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine static const struct rate_s rate_1[] = { /* 320x240 */ 927189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {125, 0x02, 0x81, 0x02}, 928189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {100, 0x02, 0xc1, 0x04}, 929189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {75, 0x03, 0xc1, 0x04}, 930189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {60, 0x04, 0xc1, 0x04}, 931189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {50, 0x02, 0x41, 0x04}, 932189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {40, 0x03, 0x41, 0x04}, 933189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine {30, 0x04, 0x41, 0x04}, 934189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine }; 935189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 936458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (sd->sensor != SENSOR_OV772x) 937458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine return; 938189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine if (gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv == 0) { 939189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine r = rate_0; 940189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine i = ARRAY_SIZE(rate_0); 941189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine } else { 942189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine r = rate_1; 943189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine i = ARRAY_SIZE(rate_1); 944189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine } 945189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine while (--i > 0) { 946189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine if (sd->frame_rate >= r->fps) 947189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine break; 948189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine r++; 949189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine } 950189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 951189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine sccb_reg_write(gspca_dev, 0x11, r->r11); 952189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine sccb_reg_write(gspca_dev, 0x0d, r->r0d); 953189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine ov534_reg_write(gspca_dev, 0xe5, r->re5); 954189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 955189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine PDEBUG(D_PROBE, "frame_rate: %d", r->fps); 956189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine} 957189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 958c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setbrightness(struct gspca_dev *gspca_dev) 959b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine{ 960b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 961458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine int val; 962b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine 963458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine val = sd->ctrls[BRIGHTNESS].val; 964458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (sd->sensor == SENSOR_OV767x) { 965458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (val < 0) 966458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine val = 0x80 - val; 967458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_reg_write(gspca_dev, 0x55, val); /* bright */ 968458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine } else { 969458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_reg_write(gspca_dev, 0x9b, val); 970458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine } 971b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine} 972b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine 973c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setcontrast(struct gspca_dev *gspca_dev) 974b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine{ 975b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 976458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine u8 val; 977b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine 978458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine val = sd->ctrls[CONTRAST].val; 979458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (sd->sensor == SENSOR_OV767x) 980458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_reg_write(gspca_dev, 0x56, val); /* contras */ 981458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine else 982458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_reg_write(gspca_dev, 0x9c, val); 983b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine} 984b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine 985189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moinestatic void setgain(struct gspca_dev *gspca_dev) 986189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine{ 987189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 988189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine u8 val; 98911d9f25da89523d19dba3608d51a86af2954fc0dJim Paris 990228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine if (sd->ctrls[AGC].val) 9918b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun return; 9928b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun 993228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine val = sd->ctrls[GAIN].val; 994189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine switch (val & 0x30) { 995189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine case 0x00: 996189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine val &= 0x0f; 99711d9f25da89523d19dba3608d51a86af2954fc0dJim Paris break; 998189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine case 0x10: 999189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine val &= 0x0f; 1000189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine val |= 0x30; 100111d9f25da89523d19dba3608d51a86af2954fc0dJim Paris break; 1002189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine case 0x20: 1003189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine val &= 0x0f; 1004189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine val |= 0x70; 100511d9f25da89523d19dba3608d51a86af2954fc0dJim Paris break; 1006189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine default: 1007189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine/* case 0x30: */ 1008189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine val &= 0x0f; 1009189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine val |= 0xf0; 101011d9f25da89523d19dba3608d51a86af2954fc0dJim Paris break; 101111d9f25da89523d19dba3608d51a86af2954fc0dJim Paris } 1012189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine sccb_reg_write(gspca_dev, 0x00, val); 1013189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine} 1014189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 1015c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setexposure(struct gspca_dev *gspca_dev) 1016189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine{ 1017189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 1018189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine u8 val; 1019189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 1020228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine if (sd->ctrls[AEC].val) 102118cf8c91ad558f8d2d0177656df493f81949cfe6Antonio Ospite return; 102218cf8c91ad558f8d2d0177656df493f81949cfe6Antonio Ospite 1023228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine val = sd->ctrls[EXPOSURE].val; 1024458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (sd->sensor == SENSOR_OV767x) { 1025458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine 1026458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine /* set only aec[9:2] */ 1027458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_reg_write(gspca_dev, 0x10, val); /* aech */ 1028458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine } else { 1029458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine 1030458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine /* 'val' is one byte and represents half of the exposure value 1031458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine * we are going to set into registers, a two bytes value: 1032458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine * 1033458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine * MSB: ((u16) val << 1) >> 8 == val >> 7 1034458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine * LSB: ((u16) val << 1) & 0xff == val << 1 1035458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine */ 1036458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_reg_write(gspca_dev, 0x08, val >> 7); 1037458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_reg_write(gspca_dev, 0x10, val << 1); 1038458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine } 1039189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine} 1040189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 10418b7fbda484176b46a7760fd474d605ca5152c86dMax Thrunstatic void setagc(struct gspca_dev *gspca_dev) 1042189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine{ 1043189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 1044189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 1045228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine if (sd->ctrls[AGC].val) { 10468b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun sccb_reg_write(gspca_dev, 0x13, 10478b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun sccb_reg_read(gspca_dev, 0x13) | 0x04); 1048189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine sccb_reg_write(gspca_dev, 0x64, 1049189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine sccb_reg_read(gspca_dev, 0x64) | 0x03); 1050189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine } else { 10518b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun sccb_reg_write(gspca_dev, 0x13, 10528b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun sccb_reg_read(gspca_dev, 0x13) & ~0x04); 1053189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine sccb_reg_write(gspca_dev, 0x64, 10548b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun sccb_reg_read(gspca_dev, 0x64) & ~0x03); 10558b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun 10568b7fbda484176b46a7760fd474d605ca5152c86dMax Thrun setgain(gspca_dev); 1057189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine } 1058189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine} 1059189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 1060b014f94b28713e169a438131a5ce2752068068adJean-Francois Moinestatic void setawb(struct gspca_dev *gspca_dev) 1061b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine{ 1062b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 1063b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine 1064228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine if (sd->ctrls[AWB].val) { 10658fef9d962237e29b3d84243387b1f3487b3caaf4Max Thrun sccb_reg_write(gspca_dev, 0x13, 10668fef9d962237e29b3d84243387b1f3487b3caaf4Max Thrun sccb_reg_read(gspca_dev, 0x13) | 0x02); 1067458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (sd->sensor == SENSOR_OV772x) 1068458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_reg_write(gspca_dev, 0x63, 10698fef9d962237e29b3d84243387b1f3487b3caaf4Max Thrun sccb_reg_read(gspca_dev, 0x63) | 0xc0); 10708fef9d962237e29b3d84243387b1f3487b3caaf4Max Thrun } else { 10718fef9d962237e29b3d84243387b1f3487b3caaf4Max Thrun sccb_reg_write(gspca_dev, 0x13, 10728fef9d962237e29b3d84243387b1f3487b3caaf4Max Thrun sccb_reg_read(gspca_dev, 0x13) & ~0x02); 1073458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (sd->sensor == SENSOR_OV772x) 1074458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_reg_write(gspca_dev, 0x63, 10758fef9d962237e29b3d84243387b1f3487b3caaf4Max Thrun sccb_reg_read(gspca_dev, 0x63) & ~0xc0); 10768fef9d962237e29b3d84243387b1f3487b3caaf4Max Thrun } 1077b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine} 1078b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine 1079f2938822523739e99a39fd634943865a432e9c00Max Thrunstatic void setaec(struct gspca_dev *gspca_dev) 1080f2938822523739e99a39fd634943865a432e9c00Max Thrun{ 1081f2938822523739e99a39fd634943865a432e9c00Max Thrun struct sd *sd = (struct sd *) gspca_dev; 1082458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine u8 data; 1083f2938822523739e99a39fd634943865a432e9c00Max Thrun 1084458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine data = sd->sensor == SENSOR_OV767x ? 1085458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine 0x05 : /* agc + aec */ 1086458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine 0x01; /* agc */ 1087228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine if (sd->ctrls[AEC].val) 1088f2938822523739e99a39fd634943865a432e9c00Max Thrun sccb_reg_write(gspca_dev, 0x13, 1089458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_reg_read(gspca_dev, 0x13) | data); 1090f2938822523739e99a39fd634943865a432e9c00Max Thrun else { 1091f2938822523739e99a39fd634943865a432e9c00Max Thrun sccb_reg_write(gspca_dev, 0x13, 1092458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_reg_read(gspca_dev, 0x13) & ~data); 1093458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (sd->sensor == SENSOR_OV767x) 1094458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sd->ctrls[EXPOSURE].val = 1095458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_reg_read(gspca_dev, 10); /* aech */ 1096458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine else 1097458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine setexposure(gspca_dev); 1098f2938822523739e99a39fd634943865a432e9c00Max Thrun } 1099f2938822523739e99a39fd634943865a432e9c00Max Thrun} 1100f2938822523739e99a39fd634943865a432e9c00Max Thrun 1101c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void setsharpness(struct gspca_dev *gspca_dev) 1102189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine{ 1103189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 1104189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine u8 val; 1105189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 1106228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine val = sd->ctrls[SHARPNESS].val; 11073149cfbfaca7912995a32d72ddd2381e66ca845eMax Thrun sccb_reg_write(gspca_dev, 0x91, val); /* Auto de-noise threshold */ 11083149cfbfaca7912995a32d72ddd2381e66ca845eMax Thrun sccb_reg_write(gspca_dev, 0x8e, val); /* De-noise threshold */ 1109189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine} 1110189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 1111228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void sethvflip(struct gspca_dev *gspca_dev) 1112189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine{ 1113189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 1114228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine u8 val; 1115189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 1116458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (sd->sensor == SENSOR_OV767x) { 1117458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine val = sccb_reg_read(gspca_dev, 0x1e); /* mvfp */ 1118458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine val &= ~0x30; 1119458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (sd->ctrls[HFLIP].val) 1120458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine val |= 0x20; 1121458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (sd->ctrls[VFLIP].val) 1122458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine val |= 0x10; 1123458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_reg_write(gspca_dev, 0x1e, val); 1124458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine } else { 1125458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine val = sccb_reg_read(gspca_dev, 0x0c); 1126458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine val &= ~0xc0; 1127458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (sd->ctrls[HFLIP].val == 0) 1128458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine val |= 0x40; 1129458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (sd->ctrls[VFLIP].val == 0) 1130458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine val |= 0x80; 1131458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_reg_write(gspca_dev, 0x0c, val); 1132458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine } 113311d9f25da89523d19dba3608d51a86af2954fc0dJim Paris} 1134fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 1135d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moinestatic void setcolors(struct gspca_dev *gspca_dev) 1136d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine{ 1137d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine struct sd *sd = (struct sd *) gspca_dev; 1138d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine u8 val; 1139d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine int i; 1140d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine static u8 color_tb[][6] = { 1141d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine {0x42, 0x42, 0x00, 0x11, 0x30, 0x41}, 1142d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine {0x52, 0x52, 0x00, 0x16, 0x3c, 0x52}, 1143d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine {0x66, 0x66, 0x00, 0x1b, 0x4b, 0x66}, 1144d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine {0x80, 0x80, 0x00, 0x22, 0x5e, 0x80}, 1145d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine {0x9a, 0x9a, 0x00, 0x29, 0x71, 0x9a}, 1146d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine {0xb8, 0xb8, 0x00, 0x31, 0x87, 0xb8}, 1147d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine {0xdd, 0xdd, 0x00, 0x3b, 0xa2, 0xdd}, 1148d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine }; 1149d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine 1150d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine val = sd->ctrls[COLORS].val; 1151d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine for (i = 0; i < ARRAY_SIZE(color_tb[0]); i++) 1152d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine sccb_reg_write(gspca_dev, 0x4f + i, color_tb[val][i]); 1153d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine} 1154d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine 1155228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moinestatic void setlightfreq(struct gspca_dev *gspca_dev) 11564b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi{ 11574b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi struct sd *sd = (struct sd *) gspca_dev; 1158458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine u8 val; 11594b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi 1160458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine val = sd->ctrls[LIGHTFREQ].val ? 0x9e : 0x00; 1161458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (sd->sensor == SENSOR_OV767x) { 1162458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_reg_write(gspca_dev, 0x2a, 0x00); 1163458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (val) 1164458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine val = 0x9d; /* insert dummy to 25fps for 50Hz */ 1165458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine } 1166458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_reg_write(gspca_dev, 0x2b, val); 11674b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi} 11684b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi 11694b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi 1170fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite/* this function is called at probe time */ 1171fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospitestatic int sd_config(struct gspca_dev *gspca_dev, 1172fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite const struct usb_device_id *id) 1173fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite{ 11742ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 1175fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite struct cam *cam; 1176fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 1177fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite cam = &gspca_dev->cam; 1178fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 1179228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine cam->ctrls = sd->ctrls; 1180228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine 1181228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine /* the auto white balance control works only when auto gain is set */ 1182228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine if (sd_ctrls[AGC].qctrl.default_value == 0) 1183228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine gspca_dev->ctrl_inac |= (1 << AWB); 1184228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine 1185c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine cam->cam_mode = ov772x_mode; 1186c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine cam->nmodes = ARRAY_SIZE(ov772x_mode); 1187fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 1188189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine sd->frame_rate = 30; 1189b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine 1190fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite return 0; 1191fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite} 1192fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 1193fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite/* this function is called at probe and resume time */ 1194fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospitestatic int sd_init(struct gspca_dev *gspca_dev) 1195fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite{ 1196458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine struct sd *sd = (struct sd *) gspca_dev; 11972ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine u16 sensor_id; 1198458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine static const struct reg_array bridge_init[NSENSORS] = { 1199458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine [SENSOR_OV767x] = {bridge_init_767x, ARRAY_SIZE(bridge_init_767x)}, 1200458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine [SENSOR_OV772x] = {bridge_init_772x, ARRAY_SIZE(bridge_init_772x)}, 1201458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine }; 1202458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine static const struct reg_array sensor_init[NSENSORS] = { 1203458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine [SENSOR_OV767x] = {sensor_init_767x, ARRAY_SIZE(sensor_init_767x)}, 1204458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine [SENSOR_OV772x] = {sensor_init_772x, ARRAY_SIZE(sensor_init_772x)}, 1205458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine }; 12062ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 12072ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine /* reset bridge */ 12082ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine ov534_reg_write(gspca_dev, 0xe7, 0x3a); 12092ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine ov534_reg_write(gspca_dev, 0xe0, 0x08); 12102ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine msleep(100); 12112ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 12122ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine /* initialize the sensor address */ 1213c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine ov534_reg_write(gspca_dev, OV534_REG_ADDRESS, 0x42); 12142ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 12152ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine /* reset sensor */ 12162ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine sccb_reg_write(gspca_dev, 0x12, 0x80); 12172ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine msleep(10); 12182ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 12192ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine /* probe the sensor */ 12202ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine sccb_reg_read(gspca_dev, 0x0a); 12212ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine sensor_id = sccb_reg_read(gspca_dev, 0x0a) << 8; 12222ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine sccb_reg_read(gspca_dev, 0x0b); 12232ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine sensor_id |= sccb_reg_read(gspca_dev, 0x0b); 12242ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine PDEBUG(D_PROBE, "Sensor ID: %04x", sensor_id); 12252ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine 1226458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if ((sensor_id & 0xfff0) == 0x7670) { 1227458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sd->sensor = SENSOR_OV767x; 1228458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine gspca_dev->ctrl_dis = (1 << GAIN) | 1229458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine (1 << AGC) | 1230458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine (1 << SHARPNESS); /* auto */ 1231458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sd->ctrls[BRIGHTNESS].min = -127; 1232458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sd->ctrls[BRIGHTNESS].max = 127; 1233458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sd->ctrls[BRIGHTNESS].def = 0; 1234458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sd->ctrls[CONTRAST].max = 0x80; 1235458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sd->ctrls[CONTRAST].def = 0x40; 1236458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sd->ctrls[EXPOSURE].min = 0x08; 1237458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sd->ctrls[EXPOSURE].max = 0x60; 1238458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sd->ctrls[EXPOSURE].def = 0x13; 1239458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sd->ctrls[SHARPNESS].max = 9; 1240458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sd->ctrls[SHARPNESS].def = 4; 1241458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sd->ctrls[HFLIP].def = 1; 1242458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine gspca_dev->cam.cam_mode = ov767x_mode; 1243458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine gspca_dev->cam.nmodes = ARRAY_SIZE(ov767x_mode); 1244458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine } else { 1245458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sd->sensor = SENSOR_OV772x; 1246d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine gspca_dev->ctrl_dis = (1 << COLORS); 1247458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine gspca_dev->cam.bulk = 1; 1248458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine gspca_dev->cam.bulk_size = 16384; 1249458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine gspca_dev->cam.bulk_nurbs = 2; 1250458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine gspca_dev->cam.mode_framerates = ov772x_framerates; 1251458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine } 1252458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine 12532ce949ec661efe1e9747ae1419932a4b6fb1e24bJean-Francois Moine /* initialize */ 1254458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine reg_w_array(gspca_dev, bridge_init[sd->sensor].val, 1255458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine bridge_init[sd->sensor].len); 1256c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine ov534_set_led(gspca_dev, 1); 1257458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_w_array(gspca_dev, sensor_init[sd->sensor].val, 1258458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sensor_init[sd->sensor].len); 1259458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (sd->sensor == SENSOR_OV767x) 1260458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sd_start(gspca_dev); 1261458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sd_stopN(gspca_dev); 1262458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine/* set_frame_rate(gspca_dev); */ 1263fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 126414b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine return gspca_dev->usb_err; 1265fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite} 1266fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 1267c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic int sd_start(struct gspca_dev *gspca_dev) 1268fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite{ 1269458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine struct sd *sd = (struct sd *) gspca_dev; 1270191d0e7fba43d79a73605adcf85441ebe0a2aff7Jean-Francois Moine int mode; 1271458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine static const struct reg_array bridge_start[NSENSORS][2] = { 1272458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine [SENSOR_OV767x] = {{bridge_start_qvga_767x, 1273458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine ARRAY_SIZE(bridge_start_qvga_767x)}, 1274458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {bridge_start_vga_767x, 1275458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine ARRAY_SIZE(bridge_start_vga_767x)}}, 1276458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine [SENSOR_OV772x] = {{bridge_start_qvga_772x, 1277458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine ARRAY_SIZE(bridge_start_qvga_772x)}, 1278458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {bridge_start_vga_772x, 1279458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine ARRAY_SIZE(bridge_start_vga_772x)}}, 1280458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine }; 1281458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine static const struct reg_array sensor_start[NSENSORS][2] = { 1282458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine [SENSOR_OV767x] = {{sensor_start_qvga_767x, 1283458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine ARRAY_SIZE(sensor_start_qvga_767x)}, 1284458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {sensor_start_vga_767x, 1285458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine ARRAY_SIZE(sensor_start_vga_767x)}}, 1286458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine [SENSOR_OV772x] = {{sensor_start_qvga_772x, 1287458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine ARRAY_SIZE(sensor_start_qvga_772x)}, 1288458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {sensor_start_vga_772x, 1289458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine ARRAY_SIZE(sensor_start_vga_772x)}}, 1290458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine }; 1291458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine 1292458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine /* (from ms-win trace) */ 1293458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (sd->sensor == SENSOR_OV767x) 1294458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_reg_write(gspca_dev, 0x1e, 0x04); 1295458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine /* black sun enable ? */ 1296458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine 1297458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine mode = gspca_dev->curr_mode; /* 0: 320x240, 1: 640x480 */ 1298458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine reg_w_array(gspca_dev, bridge_start[sd->sensor][mode].val, 1299458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine bridge_start[sd->sensor][mode].len); 1300458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sccb_w_array(gspca_dev, sensor_start[sd->sensor][mode].val, 1301458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine sensor_start[sd->sensor][mode].len); 1302fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 130369f1fe28f08000a123b3d71fac88564109da09fdJean-Francois Moine set_frame_rate(gspca_dev); 1304189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 1305228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine if (!(gspca_dev->ctrl_dis & (1 << AGC))) 1306228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine setagc(gspca_dev); 1307b014f94b28713e169a438131a5ce2752068068adJean-Francois Moine setawb(gspca_dev); 1308f2938822523739e99a39fd634943865a432e9c00Max Thrun setaec(gspca_dev); 1309228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine if (!(gspca_dev->ctrl_dis & (1 << GAIN))) 1310228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine setgain(gspca_dev); 1311c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine setexposure(gspca_dev); 1312c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine setbrightness(gspca_dev); 1313c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine setcontrast(gspca_dev); 1314228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine if (!(gspca_dev->ctrl_dis & (1 << SHARPNESS))) 1315228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine setsharpness(gspca_dev); 1316228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine sethvflip(gspca_dev); 1317d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine if (!(gspca_dev->ctrl_dis & (1 << COLORS))) 1318d57747f1e738cf1aa4a743ea10e0fb640b502c7dJean-François Moine setcolors(gspca_dev); 1319228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine setlightfreq(gspca_dev); 1320189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 1321189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine ov534_set_led(gspca_dev, 1); 1322189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine ov534_reg_write(gspca_dev, 0xe0, 0x00); 132314b67c2969ebf50bd5534b2a0c441f8569a9361eJean-François Moine return gspca_dev->usb_err; 1324fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite} 1325fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 1326c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic void sd_stopN(struct gspca_dev *gspca_dev) 1327189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine{ 1328189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine ov534_reg_write(gspca_dev, 0xe0, 0x09); 1329189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine ov534_set_led(gspca_dev, 0); 1330189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine} 1331189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 1332fb139224aea3b56237542690516eb9d6d671b135Jim Paris/* Values for bmHeaderInfo (Video and Still Image Payload Headers, 2.4.3.3) */ 1333fb139224aea3b56237542690516eb9d6d671b135Jim Paris#define UVC_STREAM_EOH (1 << 7) 1334fb139224aea3b56237542690516eb9d6d671b135Jim Paris#define UVC_STREAM_ERR (1 << 6) 1335fb139224aea3b56237542690516eb9d6d671b135Jim Paris#define UVC_STREAM_STI (1 << 5) 1336fb139224aea3b56237542690516eb9d6d671b135Jim Paris#define UVC_STREAM_RES (1 << 4) 1337fb139224aea3b56237542690516eb9d6d671b135Jim Paris#define UVC_STREAM_SCR (1 << 3) 1338fb139224aea3b56237542690516eb9d6d671b135Jim Paris#define UVC_STREAM_PTS (1 << 2) 1339fb139224aea3b56237542690516eb9d6d671b135Jim Paris#define UVC_STREAM_EOF (1 << 1) 1340fb139224aea3b56237542690516eb9d6d671b135Jim Paris#define UVC_STREAM_FID (1 << 0) 1341fb139224aea3b56237542690516eb9d6d671b135Jim Paris 134276dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moinestatic void sd_pkt_scan(struct gspca_dev *gspca_dev, 134376dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine u8 *data, int len) 1344fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite{ 13458c252050146fc6f54e9bf5ef8276b25f3dd67a1cJean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 1346fb139224aea3b56237542690516eb9d6d671b135Jim Paris __u32 this_pts; 134784fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine u16 this_fid; 13480f7a50b29dd9c8603d5ce15c11fd1a1d731e1a6dJim Paris int remaining_len = len; 1349458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine int payload_len; 13500f7a50b29dd9c8603d5ce15c11fd1a1d731e1a6dJim Paris 1351458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine payload_len = gspca_dev->cam.bulk ? 2048 : 2040; 135284fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine do { 1353458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine len = min(remaining_len, payload_len); 1354fb139224aea3b56237542690516eb9d6d671b135Jim Paris 135584fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine /* Payloads are prefixed with a UVC-style header. We 135684fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine consider a frame to start when the FID toggles, or the PTS 135784fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine changes. A frame ends when EOF is set, and we've received 135884fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine the correct number of bytes. */ 1359fb139224aea3b56237542690516eb9d6d671b135Jim Paris 136084fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine /* Verify UVC header. Header length is always 12 */ 136184fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine if (data[0] != 12 || len < 12) { 136284fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine PDEBUG(D_PACK, "bad header"); 136384fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine goto discard; 136484fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine } 1365fb139224aea3b56237542690516eb9d6d671b135Jim Paris 136684fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine /* Check errors */ 136784fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine if (data[1] & UVC_STREAM_ERR) { 136884fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine PDEBUG(D_PACK, "payload error"); 136984fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine goto discard; 137084fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine } 1371fb139224aea3b56237542690516eb9d6d671b135Jim Paris 137284fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine /* Extract PTS and FID */ 137384fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine if (!(data[1] & UVC_STREAM_PTS)) { 137484fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine PDEBUG(D_PACK, "PTS not present"); 1375fb139224aea3b56237542690516eb9d6d671b135Jim Paris goto discard; 1376fb139224aea3b56237542690516eb9d6d671b135Jim Paris } 137784fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine this_pts = (data[5] << 24) | (data[4] << 16) 137884fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine | (data[3] << 8) | data[2]; 137984fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine this_fid = (data[1] & UVC_STREAM_FID) ? 1 : 0; 1380fb139224aea3b56237542690516eb9d6d671b135Jim Paris 138184fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine /* If PTS or FID has changed, start a new frame. */ 138284fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine if (this_pts != sd->last_pts || this_fid != sd->last_fid) { 1383ed47119fb7c7890605379b23180d1b09717b6b5dJean-Francois Moine if (gspca_dev->last_packet_type == INTER_PACKET) 138476dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine gspca_frame_add(gspca_dev, LAST_PACKET, 138576dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine NULL, 0); 138684fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine sd->last_pts = this_pts; 138784fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine sd->last_fid = this_fid; 138876dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine gspca_frame_add(gspca_dev, FIRST_PACKET, 138984fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine data + 12, len - 12); 139084fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine /* If this packet is marked as EOF, end the frame */ 1391ed47119fb7c7890605379b23180d1b09717b6b5dJean-Francois Moine } else if (data[1] & UVC_STREAM_EOF) { 139284fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine sd->last_pts = 0; 1393458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine if (gspca_dev->pixfmt == V4L2_PIX_FMT_YUYV 1394458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine && gspca_dev->image_len + len - 12 != 1395458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine gspca_dev->width * gspca_dev->height * 2) { 139611edebc264f14d3f9e05525f238b91da7f5fa81fAntonio Ospite PDEBUG(D_PACK, "wrong sized frame"); 1397c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine goto discard; 1398c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine } 139976dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine gspca_frame_add(gspca_dev, LAST_PACKET, 140076dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine data + 12, len - 12); 1401ed47119fb7c7890605379b23180d1b09717b6b5dJean-Francois Moine } else { 1402ed47119fb7c7890605379b23180d1b09717b6b5dJean-Francois Moine 1403ed47119fb7c7890605379b23180d1b09717b6b5dJean-Francois Moine /* Add the data from this payload */ 140476dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine gspca_frame_add(gspca_dev, INTER_PACKET, 140576dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine data + 12, len - 12); 14063481c19854cdb1de1842c6ea6d558006ac0b3b7dJean-Francois Moine } 1407fb139224aea3b56237542690516eb9d6d671b135Jim Paris 140884fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine /* Done this payload */ 140984fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine goto scan_next; 1410fb139224aea3b56237542690516eb9d6d671b135Jim Paris 1411fb139224aea3b56237542690516eb9d6d671b135Jim Parisdiscard: 141284fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine /* Discard data until a new frame starts. */ 141376dd272b56cd1c7fa013ef5d7eb28c4d319e322bJean-Francois Moine gspca_dev->last_packet_type = DISCARD_PACKET; 141484fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine 141584fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moinescan_next: 141684fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine remaining_len -= len; 141784fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine data += len; 141884fbdf87ab8eaa4eaefb317a7eb437cd4d3d0ebfJean-Francois Moine } while (remaining_len > 0); 1419fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite} 1420fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 14218b7fbda484176b46a7760fd474d605ca5152c86dMax Thrunstatic int sd_setagc(struct gspca_dev *gspca_dev, __s32 val) 1422189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine{ 1423189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 1424189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 1425228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine sd->ctrls[AGC].val = val; 1426c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine 1427228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine /* the auto white balance control works only 1428228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine * when auto gain is set */ 1429228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine if (val) { 1430228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine gspca_dev->ctrl_inac &= ~(1 << AWB); 1431228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine } else { 1432228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine gspca_dev->ctrl_inac |= (1 << AWB); 1433228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine if (sd->ctrls[AWB].val) { 1434228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine sd->ctrls[AWB].val = 0; 1435228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine if (gspca_dev->streaming) 1436228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine setawb(gspca_dev); 1437228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine } 1438c22c4a20a6ac7b10e43eab6963f941795c5e92aaJean-Francois Moine } 1439f2938822523739e99a39fd634943865a432e9c00Max Thrun if (gspca_dev->streaming) 1440228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine setagc(gspca_dev); 1441228dd2660c4cee10fda47aa105b0152f8de7a766Jean-François Moine return gspca_dev->usb_err; 14424b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi} 14434b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi 14444b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimistatic int sd_querymenu(struct gspca_dev *gspca_dev, 14454b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi struct v4l2_querymenu *menu) 14464b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi{ 14474b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi switch (menu->id) { 14484b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi case V4L2_CID_POWER_LINE_FREQUENCY: 14494b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi switch (menu->index) { 14504b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi case 0: /* V4L2_CID_POWER_LINE_FREQUENCY_DISABLED */ 14514b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi strcpy((char *) menu->name, "Disabled"); 14524b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi return 0; 14534b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi case 1: /* V4L2_CID_POWER_LINE_FREQUENCY_50HZ */ 14544b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi strcpy((char *) menu->name, "50 Hz"); 14554b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi return 0; 14564b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi } 14574b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi break; 14584b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi } 14594b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi 14604b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi return -EINVAL; 14614b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi} 14624b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi 146311d9f25da89523d19dba3608d51a86af2954fc0dJim Paris/* get stream parameters (framerate) */ 1464668f44a603dd4b3468cecd7d8d6dc525207db94eJean-François Moinestatic void sd_get_streamparm(struct gspca_dev *gspca_dev, 14655c1a15a149504496b25ee3f681893cbe1647ba39Jean-Francois Moine struct v4l2_streamparm *parm) 146611d9f25da89523d19dba3608d51a86af2954fc0dJim Paris{ 146711d9f25da89523d19dba3608d51a86af2954fc0dJim Paris struct v4l2_captureparm *cp = &parm->parm.capture; 146811d9f25da89523d19dba3608d51a86af2954fc0dJim Paris struct v4l2_fract *tpf = &cp->timeperframe; 146911d9f25da89523d19dba3608d51a86af2954fc0dJim Paris struct sd *sd = (struct sd *) gspca_dev; 147011d9f25da89523d19dba3608d51a86af2954fc0dJim Paris 147111d9f25da89523d19dba3608d51a86af2954fc0dJim Paris cp->capability |= V4L2_CAP_TIMEPERFRAME; 147211d9f25da89523d19dba3608d51a86af2954fc0dJim Paris tpf->numerator = 1; 147311d9f25da89523d19dba3608d51a86af2954fc0dJim Paris tpf->denominator = sd->frame_rate; 147411d9f25da89523d19dba3608d51a86af2954fc0dJim Paris} 147511d9f25da89523d19dba3608d51a86af2954fc0dJim Paris 147611d9f25da89523d19dba3608d51a86af2954fc0dJim Paris/* set stream parameters (framerate) */ 1477668f44a603dd4b3468cecd7d8d6dc525207db94eJean-François Moinestatic void sd_set_streamparm(struct gspca_dev *gspca_dev, 14785c1a15a149504496b25ee3f681893cbe1647ba39Jean-Francois Moine struct v4l2_streamparm *parm) 147911d9f25da89523d19dba3608d51a86af2954fc0dJim Paris{ 148011d9f25da89523d19dba3608d51a86af2954fc0dJim Paris struct v4l2_captureparm *cp = &parm->parm.capture; 148111d9f25da89523d19dba3608d51a86af2954fc0dJim Paris struct v4l2_fract *tpf = &cp->timeperframe; 148211d9f25da89523d19dba3608d51a86af2954fc0dJim Paris struct sd *sd = (struct sd *) gspca_dev; 148311d9f25da89523d19dba3608d51a86af2954fc0dJim Paris 148411d9f25da89523d19dba3608d51a86af2954fc0dJim Paris /* Set requested framerate */ 148511d9f25da89523d19dba3608d51a86af2954fc0dJim Paris sd->frame_rate = tpf->denominator / tpf->numerator; 1486c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine if (gspca_dev->streaming) 148769f1fe28f08000a123b3d71fac88564109da09fdJean-Francois Moine set_frame_rate(gspca_dev); 148811d9f25da89523d19dba3608d51a86af2954fc0dJim Paris 148911d9f25da89523d19dba3608d51a86af2954fc0dJim Paris /* Return the actual framerate */ 149011d9f25da89523d19dba3608d51a86af2954fc0dJim Paris tpf->numerator = 1; 149111d9f25da89523d19dba3608d51a86af2954fc0dJim Paris tpf->denominator = sd->frame_rate; 149211d9f25da89523d19dba3608d51a86af2954fc0dJim Paris} 149311d9f25da89523d19dba3608d51a86af2954fc0dJim Paris 1494fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite/* sub-driver description */ 1495c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moinestatic const struct sd_desc sd_desc = { 1496fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite .name = MODULE_NAME, 1497c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .ctrls = sd_ctrls, 1498c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .nctrls = ARRAY_SIZE(sd_ctrls), 1499fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite .config = sd_config, 1500fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite .init = sd_init, 1501c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .start = sd_start, 1502c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine .stopN = sd_stopN, 1503189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine .pkt_scan = sd_pkt_scan, 15044b7875407b2fb56433586877ca0a564b8d999f4eMosalam Ebrahimi .querymenu = sd_querymenu, 1505189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine .get_streamparm = sd_get_streamparm, 1506189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine .set_streamparm = sd_set_streamparm, 1507189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine}; 1508189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine 1509fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite/* -- module initialisation -- */ 151095c967c167785eb991cf6b22fb854dd8d61d0ff8Jean-François Moinestatic const struct usb_device_id device_table[] = { 1511c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine {USB_DEVICE(0x1415, 0x2000)}, 1512458efe2d558b51fff38026e8ede9374899340e60Jean-François Moine {USB_DEVICE(0x06f8, 0x3002)}, 1513fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite {} 1514fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite}; 1515fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 1516fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio OspiteMODULE_DEVICE_TABLE(usb, device_table); 1517fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 1518fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite/* -- device connect -- */ 1519fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospitestatic int sd_probe(struct usb_interface *intf, const struct usb_device_id *id) 1520fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite{ 1521c52af79916028f9d15638519b54a80ed1c10bce5Jean-Francois Moine return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd), 1522189d92af707ead6aa4a3e14511662462e8e956e2Jean-Francois Moine THIS_MODULE); 1523fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite} 1524fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 1525fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospitestatic struct usb_driver sd_driver = { 1526fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite .name = MODULE_NAME, 1527fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite .id_table = device_table, 1528fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite .probe = sd_probe, 1529fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite .disconnect = gspca_disconnect, 1530fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#ifdef CONFIG_PM 1531fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite .suspend = gspca_suspend, 1532fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite .resume = gspca_resume, 1533fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite#endif 1534fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite}; 1535fbb4c6d20f29f2b10daad31cc6238d91f93d70d4Antonio Ospite 1536ecb3b2b35db49778b6d89e3ffd0c400776c20735Greg Kroah-Hartmanmodule_usb_driver(sd_driver); 1537