3 * @author Phil Mitchell
7 * @brief Common functions and data for the OmniVision OV7670 sensor.
9 * @note Copyright (C) Phil Mitchell
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
33 * @brief Initializes OV7670 Sensor Registers
35 * @param dev Pointer to the device
37 * @return Zero (success) or negative (USB-error value)
40 int ov7670_initialise(struct usb_microdia
*dev
)
49 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
50 OV7670_CTL_COM7
, dev
->sensor_flags
, buf
);
52 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
53 OV7670_CTL_CLKRC
, dev
->sensor_flags
, buf
);
55 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
56 OV7670_CTL_TSLB
, dev
->sensor_flags
, buf
);
58 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
59 OV7670_CTL_COM7
, dev
->sensor_flags
, buf
);
61 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
62 OV7670_CTL_HREF
, dev
->sensor_flags
, buf
);
64 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
65 OV7670_CTL_VREF
, dev
->sensor_flags
, buf
);
67 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
68 OV7670_CTL_COM3
, dev
->sensor_flags
, buf
);
70 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
71 OV7670_CTL_COM14
, dev
->sensor_flags
, buf
);
73 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
74 OV7670_CTL_SCALING_XSC
, dev
->sensor_flags
, buf
);
76 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
77 OV7670_CTL_SCALING_YSC
, dev
->sensor_flags
, buf
);
79 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
80 OV7670_CTL_SCALING_DCWCTR
, dev
->sensor_flags
, buf
);
82 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
83 OV7670_CTL_SCALING_PCLK_DIV
, dev
->sensor_flags
, buf
);
85 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
86 OV7670_CTL_SCALING_PCLK_DELAY
, dev
->sensor_flags
, buf
);
88 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
89 OV7670_CTL_COM8
, dev
->sensor_flags
, buf
);
91 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
92 OV7670_CTL_GAIN
, dev
->sensor_flags
, buf
);
94 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
95 OV7670_CTL_AECH
, dev
->sensor_flags
, buf
);
97 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
98 OV7670_CTL_COM4
, dev
->sensor_flags
, buf
);
100 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
101 OV7670_CTL_COM9
, dev
->sensor_flags
, buf
);
103 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
104 OV7670_CTL_BD50MAX
, dev
->sensor_flags
, buf
);
106 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
107 OV7670_CTL_BD60MAX
, dev
->sensor_flags
, buf
);
109 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
110 OV7670_CTL_AEW
, dev
->sensor_flags
, buf
);
112 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
113 OV7670_CTL_AEB
, dev
->sensor_flags
, buf
);
115 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
116 OV7670_CTL_VPT
, dev
->sensor_flags
, buf
);
118 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
119 OV7670_CTL_HAECC1
, dev
->sensor_flags
, buf
);
121 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
122 OV7670_CTL_HAECC2
, dev
->sensor_flags
, buf
);
124 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
125 0xa1, dev
->sensor_flags
, buf
);
127 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
128 OV7670_CTL_HAECC3
, dev
->sensor_flags
, buf
);
130 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
131 OV7670_CTL_HAECC4
, dev
->sensor_flags
, buf
);
133 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
134 OV7670_CTL_HAECC5
, dev
->sensor_flags
, buf
);
136 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
137 OV7670_CTL_HAECC6
, dev
->sensor_flags
, buf
);
139 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
140 OV7670_CTL_HAECC7
, dev
->sensor_flags
, buf
);
142 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
143 OV7670_CTL_COM8
, dev
->sensor_flags
, buf
);
145 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
146 OV7670_CTL_COM5
, dev
->sensor_flags
, buf
);
148 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
149 OV7670_CTL_COM6
, dev
->sensor_flags
, buf
);
151 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
152 0x16, dev
->sensor_flags
, buf
);
154 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
155 OV7670_CTL_MVFP
, dev
->sensor_flags
, buf
);
157 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
158 OV7670_CTL_ADCCTR1
, dev
->sensor_flags
, buf
);
160 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
161 OV7670_CTL_ADCCTR2
, dev
->sensor_flags
, buf
);
163 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
164 0x29, dev
->sensor_flags
, buf
);
166 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
167 OV7670_CTL_CHLF
, dev
->sensor_flags
, buf
);
169 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
170 0x35, dev
->sensor_flags
, buf
);
172 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
173 OV7670_CTL_ADC
, dev
->sensor_flags
, buf
);
175 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
176 OV7670_CTL_ACOM
, dev
->sensor_flags
, buf
);
178 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
179 OV7670_CTL_OFON
, dev
->sensor_flags
, buf
);
181 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
182 OV7670_CTL_COM12
, dev
->sensor_flags
, buf
);
184 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
185 0x4d, dev
->sensor_flags
, buf
);
187 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
188 0x4e, dev
->sensor_flags
, buf
);
190 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
191 OV7670_CTL_GFIX
, dev
->sensor_flags
, buf
);
193 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
194 OV7670_CTL_REG74
, dev
->sensor_flags
, buf
);
196 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
197 0x8d, dev
->sensor_flags
, buf
);
199 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
200 0x8e, dev
->sensor_flags
, buf
);
202 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
203 0x8f, dev
->sensor_flags
, buf
);
205 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
206 0x90, dev
->sensor_flags
, buf
);
208 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
209 0x91, dev
->sensor_flags
, buf
);
211 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
212 0x96, dev
->sensor_flags
, buf
);
214 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
215 0x9a, dev
->sensor_flags
, buf
);
217 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
218 0xb0, dev
->sensor_flags
, buf
);
220 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
221 OV7670_CTL_ABLC1
, dev
->sensor_flags
, buf
);
223 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
224 0xb2, dev
->sensor_flags
, buf
);
226 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
227 OV7670_CTL_THL_ST
, dev
->sensor_flags
, buf
);
229 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
230 0xb8, dev
->sensor_flags
, buf
);
232 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
233 OV7670_CTL_AWBC1
, dev
->sensor_flags
, buf
);
235 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
236 OV7670_CTL_AWBC2
, dev
->sensor_flags
, buf
);
238 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
239 OV7670_CTL_AWBC3
, dev
->sensor_flags
, buf
);
241 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
242 OV7670_CTL_AWBC4
, dev
->sensor_flags
, buf
);
244 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
245 OV7670_CTL_AWBC5
, dev
->sensor_flags
, buf
);
247 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
248 OV7670_CTL_AWBC6
, dev
->sensor_flags
, buf
);
250 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
251 0x59, dev
->sensor_flags
, buf
);
253 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
254 0x5a, dev
->sensor_flags
, buf
);
256 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
257 0x5b, dev
->sensor_flags
, buf
);
259 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
260 0x5c, dev
->sensor_flags
, buf
);
262 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
263 0x5d, dev
->sensor_flags
, buf
);
265 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
266 0x5e, dev
->sensor_flags
, buf
);
268 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
269 OV7670_CTL_AWBCTR3
, dev
->sensor_flags
, buf
);
271 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
272 OV7670_CTL_AWBCTR2
, dev
->sensor_flags
, buf
);
274 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
275 OV7670_CTL_AWBCTR1
, dev
->sensor_flags
, buf
);
277 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
278 OV7670_CTL_AWBCTR0
, dev
->sensor_flags
, buf
);
280 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
281 OV7670_CTL_GGAIN
, dev
->sensor_flags
, buf
);
283 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
284 OV7670_CTL_BLUE
, dev
->sensor_flags
, buf
);
286 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
287 OV7670_CTL_RED
, dev
->sensor_flags
, buf
);
289 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
290 OV7670_CTL_COM8
, dev
->sensor_flags
, buf
);
292 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
293 OV7670_CTL_MTX1
, dev
->sensor_flags
, buf
);
295 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
296 OV7670_CTL_MTX2
, dev
->sensor_flags
, buf
);
298 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
299 OV7670_CTL_MTX3
, dev
->sensor_flags
, buf
);
301 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
302 OV7670_CTL_MTX4
, dev
->sensor_flags
, buf
);
304 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
305 OV7670_CTL_MTX5
, dev
->sensor_flags
, buf
);
307 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
308 OV7670_CTL_MTX6
, dev
->sensor_flags
, buf
);
310 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
311 OV7670_CTL_BRIGHT
, dev
->sensor_flags
, buf
);
313 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
314 OV7670_CTL_CONTRAS
, dev
->sensor_flags
, buf
);
316 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
317 OV7670_CTL_CONTRAS_CENTER
, dev
->sensor_flags
, buf
);
319 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
320 OV7670_CTL_MTXS
, dev
->sensor_flags
, buf
);
322 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
323 OV7670_CTL_COM16
, dev
->sensor_flags
, buf
);
325 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
326 OV7670_CTL_EDGE
, dev
->sensor_flags
, buf
);
328 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
329 OV7670_CTL_REG75
, dev
->sensor_flags
, buf
);
331 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
332 OV7670_CTL_REG76
, dev
->sensor_flags
, buf
);
334 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
335 OV7670_CTL_DNSTH
, dev
->sensor_flags
, buf
);
337 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
338 OV7670_CTL_REG77
, dev
->sensor_flags
, buf
);
340 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
341 OV7670_CTL_COM13
, dev
->sensor_flags
, buf
);
343 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
344 OV7670_CTL_REG4B
, dev
->sensor_flags
, buf
);
346 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
347 OV7670_CTL_SATCTR
, dev
->sensor_flags
, buf
);
349 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
350 OV7670_CTL_COM16
, dev
->sensor_flags
, buf
);
352 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
353 OV7670_CTL_CONTRAS
, dev
->sensor_flags
, buf
);
355 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
356 OV7670_CTL_ARBLM
, dev
->sensor_flags
, buf
);
358 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
359 OV7670_CTL_COM11
, dev
->sensor_flags
, buf
);
361 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
362 OV7670_CTL_NT_CTRL
, dev
->sensor_flags
, buf
);
364 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
365 0x96, dev
->sensor_flags
, buf
);
367 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
368 0x97, dev
->sensor_flags
, buf
);
370 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
371 0x98, dev
->sensor_flags
, buf
);
373 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
374 0x99, dev
->sensor_flags
, buf
);
376 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
377 0x9a, dev
->sensor_flags
, buf
);
379 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
380 0x9b, dev
->sensor_flags
, buf
);
382 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
383 0x9c, dev
->sensor_flags
, buf
);
385 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
386 OV7670_CTL_BD50ST
, dev
->sensor_flags
, buf
);
388 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
389 OV7670_CTL_BD60ST
, dev
->sensor_flags
, buf
);
391 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
392 0x78, dev
->sensor_flags
, buf
);
394 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
395 0x79, dev
->sensor_flags
, buf
);
397 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
398 0xc8, dev
->sensor_flags
, buf
);
400 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
401 0x79, dev
->sensor_flags
, buf
);
403 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
404 0xc8, dev
->sensor_flags
, buf
);
406 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
407 0x79, dev
->sensor_flags
, buf
);
409 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
410 0xc8, dev
->sensor_flags
, buf
);
412 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
413 0x79, dev
->sensor_flags
, buf
);
415 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
416 0xc8, dev
->sensor_flags
, buf
);
418 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
419 0x79, dev
->sensor_flags
, buf
);
421 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
422 0xc8, dev
->sensor_flags
, buf
);
424 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
425 0x79, dev
->sensor_flags
, buf
);
427 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
428 0xc8, dev
->sensor_flags
, buf
);
430 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
431 0x79, dev
->sensor_flags
, buf
);
433 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
434 0xc8, dev
->sensor_flags
, buf
);
436 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
437 0x79, dev
->sensor_flags
, buf
);
439 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
440 0xc8, dev
->sensor_flags
, buf
);
442 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
443 0x79, dev
->sensor_flags
, buf
);
445 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
446 0xc8, dev
->sensor_flags
, buf
);
448 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
449 0x79, dev
->sensor_flags
, buf
);
451 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
452 0xc8, dev
->sensor_flags
, buf
);
454 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
455 0x79, dev
->sensor_flags
, buf
);
457 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
458 0xc8, dev
->sensor_flags
, buf
);
460 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
461 0x79, dev
->sensor_flags
, buf
);
463 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
464 OV7670_CTL_LCC1
, dev
->sensor_flags
, buf
);
466 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
467 OV7670_CTL_LCC2
, dev
->sensor_flags
, buf
);
469 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
470 OV7670_CTL_LCC3
, dev
->sensor_flags
, buf
);
472 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
473 OV7670_CTL_LCC4
, dev
->sensor_flags
, buf
);
475 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
476 OV7670_CTL_LCC5
, dev
->sensor_flags
, buf
);
478 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
479 OV7670_CTL_LCC6
, dev
->sensor_flags
, buf
);
481 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
482 OV7670_CTL_LCC7
, dev
->sensor_flags
, buf
);
484 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
485 OV7670_CTL_HSTART
, dev
->sensor_flags
, buf
);
487 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
488 OV7670_CTL_HSTOP
, dev
->sensor_flags
, buf
);
490 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
491 OV7670_CTL_VSTRT
, dev
->sensor_flags
, buf
);
493 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
494 OV7670_CTL_VSTOP
, dev
->sensor_flags
, buf
);
496 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
497 OV7670_CTL_AWBC4
, dev
->sensor_flags
, buf
);
499 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
500 OV7670_CTL_AWBC5
, dev
->sensor_flags
, buf
);
502 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
503 OV7670_CTL_MTXS
, dev
->sensor_flags
, buf
);
505 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
506 0x59, dev
->sensor_flags
, buf
);
508 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
509 0x5a, dev
->sensor_flags
, buf
);
511 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
512 0x5b, dev
->sensor_flags
, buf
);
514 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
515 0x5c, dev
->sensor_flags
, buf
);
517 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
518 0x5d, dev
->sensor_flags
, buf
);
520 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
521 0x5e, dev
->sensor_flags
, buf
);
523 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
524 OV7670_CTL_LCC3
, dev
->sensor_flags
, buf
);
526 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
527 OV7670_CTL_LCC6
, dev
->sensor_flags
, buf
);
529 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
530 OV7670_CTL_LCC7
, dev
->sensor_flags
, buf
);
532 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
533 OV7670_CTL_HAECC3
, dev
->sensor_flags
, buf
);
535 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
536 OV7670_CTL_HAECC4
, dev
->sensor_flags
, buf
);
538 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
539 OV7670_CTL_AWBC6
, dev
->sensor_flags
, buf
);
541 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
542 OV7670_CTL_MTX3
, dev
->sensor_flags
, buf
);
547 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
548 OV7670_CTL_DBLV
, dev
->sensor_flags
, buf
);
550 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
551 OV7670_CTL_CLKRC
, dev
->sensor_flags
, buf
);
553 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
554 OV7670_CTL_EXHCH
, dev
->sensor_flags
, buf
);
556 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
557 OV7670_CTL_EXHCL
, dev
->sensor_flags
, buf
);
559 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
560 OV7670_CTL_DM_LNL
, dev
->sensor_flags
, buf
);
562 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
563 OV7670_CTL_DM_LNH
, dev
->sensor_flags
, buf
);
565 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
566 OV7670_CTL_COM11
, dev
->sensor_flags
, buf
);
568 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
569 OV7670_CTL_BRIGHT
, dev
->sensor_flags
, buf
);
571 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
572 OV7670_CTL_CONTRAS
, dev
->sensor_flags
, buf
);
577 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 4,
578 OV7670_CTL_MTX1
, dev
->sensor_flags
, buf
);
581 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 2,
582 OV7670_CTL_MTX5
, dev
->sensor_flags
, buf
);
584 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
585 OV7670_CTL_MTXS
, dev
->sensor_flags
, buf
);
590 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 4,
591 OV7670_CTL_MTX1
, dev
->sensor_flags
, buf
);
594 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 2,
595 OV7670_CTL_MTX5
, dev
->sensor_flags
, buf
);
597 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
598 OV7670_CTL_MTXS
, dev
->sensor_flags
, buf
);
600 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
601 OV7670_CTL_EDGE
, dev
->sensor_flags
, buf
);
606 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 4,
607 OV7670_CTL_GAM1
, dev
->sensor_flags
, buf
);
612 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 4,
613 OV7670_CTL_GAM5
, dev
->sensor_flags
, buf
);
618 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 4,
619 OV7670_CTL_GAM9
, dev
->sensor_flags
, buf
);
623 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 3,
624 OV7670_CTL_GAM13
, dev
->sensor_flags
, buf
);
626 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
627 OV7670_CTL_SLOP
, dev
->sensor_flags
, buf
);
629 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
630 OV7670_CTL_COM11
, dev
->sensor_flags
, buf
);
632 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
633 OV7670_CTL_COM11
, dev
->sensor_flags
, buf
);
636 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 2,
637 OV7670_CTL_HAECC1
, dev
->sensor_flags
, buf
);
639 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
640 OV7670_CTL_COM8
, dev
->sensor_flags
, buf
);
645 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
646 OV7670_CTL_DBLV
, dev
->sensor_flags
, buf
);
648 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
649 OV7670_CTL_CLKRC
, dev
->sensor_flags
, buf
);
651 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
652 OV7670_CTL_EXHCH
, dev
->sensor_flags
, buf
);
654 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
655 OV7670_CTL_EXHCL
, dev
->sensor_flags
, buf
);
657 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
658 OV7670_CTL_DM_LNL
, dev
->sensor_flags
, buf
);
660 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
661 OV7670_CTL_DM_LNH
, dev
->sensor_flags
, buf
);
667 * @brief OV7670 Auto-Flip
669 * @param dev Pointer to the device
670 * @param vflip Flag to indicate whether or not Camera is currently flipped
672 * @return Zero (success) or negative (USB-error value)
675 int ov7670_auto_flip(struct usb_microdia
*dev
, __u8 vflip
)
680 ret
= sn9c20x_read_i2c_data(dev
, dev
->sensor_slave_address
, 1,
681 OV7670_CTL_MVFP
, dev
->sensor_flags
, buf
);
686 buf
[0] = buf
[0] & (0xff ^ OV7670_VFLIP_BIT
);
688 buf
[0] = buf
[0] | OV7670_VFLIP_BIT
;
689 ret
= sn9c20x_write_i2c_data(dev
, dev
->sensor_slave_address
, 1,
690 OV7670_CTL_MVFP
, dev
->sensor_flags
, buf
);