Change 624f to support bayer format
[microdia.git] / ov7670.c
blobb90aa1ae542ff5ab4341ef1f3b59e07b62aa27f2
1 /**
2 * @file ov7670.c
3 * @author Phil Mitchell
4 * @date 2008-05-09
6 * @brief Common functions and data for the OmniVision OV7670 sensor.
8 * @note Copyright (C) Phil Mitchell
10 * @par Licences
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include "microdia.h"
28 #include "sn9c20x.h"
29 #include "ov7670.h"
31 /**
32 * @brief Initializes OV7670 Sensor Registers
34 * @param dev Pointer to the device
36 * @return Zero (success) or negative (USB-error value)
39 int ov7670_initialise(struct usb_microdia *dev)
41 __u8 buf[32];
42 int ret;
45 * Phase 1
47 buf[0] = 0x80;
48 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
49 OV7670_CTL_COM7, dev->sensor_flags, buf);
50 if (ret < 0)
51 goto err;
52 buf[0] = 0x80;
53 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
54 OV7670_CTL_CLKRC, dev->sensor_flags, buf);
55 if (ret < 0)
56 goto err;
57 buf[0] = 0x04;
58 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
59 OV7670_CTL_TSLB, dev->sensor_flags, buf);
60 if (ret < 0)
61 goto err;
62 buf[0] = 0x00;
63 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
64 OV7670_CTL_COM7, dev->sensor_flags, buf);
65 if (ret < 0)
66 goto err;
67 buf[0] = 0xb6;
68 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
69 OV7670_CTL_HREF, dev->sensor_flags, buf);
70 if (ret < 0)
71 goto err;
72 buf[0] = 0x0a;
73 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
74 OV7670_CTL_VREF, dev->sensor_flags, buf);
75 if (ret < 0)
76 goto err;
77 buf[0] = 0x00;
78 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
79 OV7670_CTL_COM3, dev->sensor_flags, buf);
80 if (ret < 0)
81 goto err;
82 buf[0] = 0x00;
83 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
84 OV7670_CTL_COM14, dev->sensor_flags, buf);
85 if (ret < 0)
86 goto err;
87 buf[0] = 0x3a;
88 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
89 OV7670_CTL_SCALING_XSC, dev->sensor_flags, buf);
90 if (ret < 0)
91 goto err;
92 buf[0] = 0x35;
93 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
94 OV7670_CTL_SCALING_YSC, dev->sensor_flags, buf);
95 if (ret < 0)
96 goto err;
97 buf[0] = 0x11;
98 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
99 OV7670_CTL_SCALING_DCWCTR, dev->sensor_flags, buf);
100 if (ret < 0)
101 goto err;
102 buf[0] = 0xf0;
103 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
104 OV7670_CTL_SCALING_PCLK_DIV, dev->sensor_flags, buf);
105 if (ret < 0)
106 goto err;
107 buf[0] = 0x02;
108 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
109 OV7670_CTL_SCALING_PCLK_DELAY, dev->sensor_flags, buf);
110 if (ret < 0)
111 goto err;
112 buf[0] = 0xe0;
113 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
114 OV7670_CTL_COM8, dev->sensor_flags, buf);
115 if (ret < 0)
116 goto err;
117 buf[0] = 0x00;
118 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
119 OV7670_CTL_GAIN, dev->sensor_flags, buf);
120 if (ret < 0)
121 goto err;
122 buf[0] = 0x00;
123 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
124 OV7670_CTL_AECH, dev->sensor_flags, buf);
125 if (ret < 0)
126 goto err;
127 buf[0] = 0x40;
128 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
129 OV7670_CTL_COM4, dev->sensor_flags, buf);
130 if (ret < 0)
131 goto err;
132 buf[0] = 0x08;
133 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
134 OV7670_CTL_COM9, dev->sensor_flags, buf);
135 if (ret < 0)
136 goto err;
137 buf[0] = 0x05;
138 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
139 OV7670_CTL_BD50MAX, dev->sensor_flags, buf);
140 if (ret < 0)
141 goto err;
142 buf[0] = 0x07;
143 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
144 OV7670_CTL_BD60MAX, dev->sensor_flags, buf);
145 if (ret < 0)
146 goto err;
147 buf[0] = 0x95;
148 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
149 OV7670_CTL_AEW, dev->sensor_flags, buf);
150 if (ret < 0)
151 goto err;
152 buf[0] = 0x33;
153 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
154 OV7670_CTL_AEB, dev->sensor_flags, buf);
155 if (ret < 0)
156 goto err;
157 buf[0] = 0xe3;
158 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
159 OV7670_CTL_VPT, dev->sensor_flags, buf);
160 if (ret < 0)
161 goto err;
162 buf[0] = 0x75;
163 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
164 OV7670_CTL_HAECC1, dev->sensor_flags, buf);
165 if (ret < 0)
166 goto err;
167 buf[0] = 0x65;
168 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
169 OV7670_CTL_HAECC2, dev->sensor_flags, buf);
170 if (ret < 0)
171 goto err;
172 buf[0] = 0x0b;
173 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
174 0xa1, dev->sensor_flags, buf);
175 if (ret < 0)
176 goto err;
177 buf[0] = 0xd8;
178 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
179 OV7670_CTL_HAECC3, dev->sensor_flags, buf);
180 if (ret < 0)
181 goto err;
182 buf[0] = 0xd8;
183 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
184 OV7670_CTL_HAECC4, dev->sensor_flags, buf);
185 if (ret < 0)
186 goto err;
187 buf[0] = 0xf0;
188 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
189 OV7670_CTL_HAECC5, dev->sensor_flags, buf);
190 if (ret < 0)
191 goto err;
192 buf[0] = 0x90;
193 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
194 OV7670_CTL_HAECC6, dev->sensor_flags, buf);
195 if (ret < 0)
196 goto err;
197 buf[0] = 0x94;
198 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
199 OV7670_CTL_HAECC7, dev->sensor_flags, buf);
200 if (ret < 0)
201 goto err;
202 buf[0] = 0xe5;
203 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
204 OV7670_CTL_COM8, dev->sensor_flags, buf);
205 if (ret < 0)
206 goto err;
207 buf[0] = 0x61;
208 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
209 OV7670_CTL_COM5, dev->sensor_flags, buf);
210 if (ret < 0)
211 goto err;
212 buf[0] = 0x4b;
213 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
214 OV7670_CTL_COM6, dev->sensor_flags, buf);
215 if (ret < 0)
216 goto err;
217 buf[0] = 0x02;
218 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
219 0x16, dev->sensor_flags, buf);
220 if (ret < 0)
221 goto err;
222 buf[0] = 0x27;
223 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
224 OV7670_CTL_MVFP, dev->sensor_flags, buf);
225 if (ret < 0)
226 goto err;
227 buf[0] = 0x02;
228 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
229 OV7670_CTL_ADCCTR1, dev->sensor_flags, buf);
230 if (ret < 0)
231 goto err;
232 buf[0] = 0x91;
233 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
234 OV7670_CTL_ADCCTR2, dev->sensor_flags, buf);
235 if (ret < 0)
236 goto err;
237 buf[0] = 0x07;
238 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
239 0x29, dev->sensor_flags, buf);
240 if (ret < 0)
241 goto err;
242 buf[0] = 0x0b;
243 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
244 OV7670_CTL_CHLF, dev->sensor_flags, buf);
245 if (ret < 0)
246 goto err;
247 buf[0] = 0x0b;
248 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
249 0x35, dev->sensor_flags, buf);
250 if (ret < 0)
251 goto err;
252 buf[0] = 0x1d;
253 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
254 OV7670_CTL_ADC, dev->sensor_flags, buf);
255 if (ret < 0)
256 goto err;
257 buf[0] = 0x71;
258 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
259 OV7670_CTL_ACOM, dev->sensor_flags, buf);
260 if (ret < 0)
261 goto err;
262 buf[0] = 0x2a;
263 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
264 OV7670_CTL_OFON, dev->sensor_flags, buf);
265 if (ret < 0)
266 goto err;
267 buf[0] = 0x78;
268 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
269 OV7670_CTL_COM12, dev->sensor_flags, buf);
270 if (ret < 0)
271 goto err;
272 buf[0] = 0x40;
273 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
274 0x4d, dev->sensor_flags, buf);
275 if (ret < 0)
276 goto err;
277 buf[0] = 0x20;
278 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
279 0x4e, dev->sensor_flags, buf);
280 if (ret < 0)
281 goto err;
282 buf[0] = 0x00;
283 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
284 OV7670_CTL_GFIX, dev->sensor_flags, buf);
285 if (ret < 0)
286 goto err;
287 buf[0] = 0x19;
288 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
289 OV7670_CTL_REG74, dev->sensor_flags, buf);
290 if (ret < 0)
291 goto err;
292 buf[0] = 0x4f;
293 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
294 0x8d, dev->sensor_flags, buf);
295 if (ret < 0)
296 goto err;
297 buf[0] = 0x00;
298 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
299 0x8e, dev->sensor_flags, buf);
300 if (ret < 0)
301 goto err;
302 buf[0] = 0x00;
303 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
304 0x8f, dev->sensor_flags, buf);
305 if (ret < 0)
306 goto err;
307 buf[0] = 0x00;
308 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
309 0x90, dev->sensor_flags, buf);
310 if (ret < 0)
311 goto err;
312 buf[0] = 0x00;
313 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
314 0x91, dev->sensor_flags, buf);
315 if (ret < 0)
316 goto err;
317 buf[0] = 0x00;
318 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
319 0x96, dev->sensor_flags, buf);
320 if (ret < 0)
321 goto err;
322 buf[0] = 0x80;
323 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
324 0x9a, dev->sensor_flags, buf);
325 if (ret < 0)
326 goto err;
327 buf[0] = 0x84;
328 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
329 0xb0, dev->sensor_flags, buf);
330 if (ret < 0)
331 goto err;
332 buf[0] = 0x0c;
333 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
334 OV7670_CTL_ABLC1, dev->sensor_flags, buf);
335 if (ret < 0)
336 goto err;
337 buf[0] = 0x0e;
338 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
339 0xb2, dev->sensor_flags, buf);
340 if (ret < 0)
341 goto err;
342 buf[0] = 0x82;
343 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
344 OV7670_CTL_THL_ST, dev->sensor_flags, buf);
345 if (ret < 0)
346 goto err;
347 buf[0] = 0x0a;
348 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
349 0xb8, dev->sensor_flags, buf);
350 if (ret < 0)
351 goto err;
352 buf[0] = 0x0a;
353 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
354 OV7670_CTL_AWBC1, dev->sensor_flags, buf);
355 if (ret < 0)
356 goto err;
357 buf[0] = 0xf0;
358 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
359 OV7670_CTL_AWBC2, dev->sensor_flags, buf);
360 if (ret < 0)
361 goto err;
362 buf[0] = 0x20;
363 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
364 OV7670_CTL_AWBC3, dev->sensor_flags, buf);
365 if (ret < 0)
366 goto err;
367 buf[0] = 0x7d;
368 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
369 OV7670_CTL_AWBC4, dev->sensor_flags, buf);
370 if (ret < 0)
371 goto err;
372 buf[0] = 0x29;
373 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
374 OV7670_CTL_AWBC5, dev->sensor_flags, buf);
375 if (ret < 0)
376 goto err;
377 buf[0] = 0x4a;
378 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
379 OV7670_CTL_AWBC6, dev->sensor_flags, buf);
380 if (ret < 0)
381 goto err;
382 buf[0] = 0x8c;
383 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
384 0x59, dev->sensor_flags, buf);
385 if (ret < 0)
386 goto err;
387 buf[0] = 0xa5;
388 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
389 0x5a, dev->sensor_flags, buf);
390 if (ret < 0)
391 goto err;
392 buf[0] = 0xde;
393 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
394 0x5b, dev->sensor_flags, buf);
395 if (ret < 0)
396 goto err;
397 buf[0] = 0x96;
398 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
399 0x5c, dev->sensor_flags, buf);
400 if (ret < 0)
401 goto err;
402 buf[0] = 0x66;
403 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
404 0x5d, dev->sensor_flags, buf);
405 if (ret < 0)
406 goto err;
407 buf[0] = 0x10;
408 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
409 0x5e, dev->sensor_flags, buf);
410 if (ret < 0)
411 goto err;
412 buf[0] = 0x0a;
413 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
414 OV7670_CTL_AWBCTR3, dev->sensor_flags, buf);
415 if (ret < 0)
416 goto err;
417 buf[0] = 0x55;
418 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
419 OV7670_CTL_AWBCTR2, dev->sensor_flags, buf);
420 if (ret < 0)
421 goto err;
422 buf[0] = 0x11;
423 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
424 OV7670_CTL_AWBCTR1, dev->sensor_flags, buf);
425 if (ret < 0)
426 goto err;
427 buf[0] = 0x9e;
428 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
429 OV7670_CTL_AWBCTR0, dev->sensor_flags, buf);
430 if (ret < 0)
431 goto err;
432 buf[0] = 0x40;
433 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
434 OV7670_CTL_GGAIN, dev->sensor_flags, buf);
435 if (ret < 0)
436 goto err;
437 buf[0] = 0x40;
438 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
439 OV7670_CTL_BLUE, dev->sensor_flags, buf);
440 if (ret < 0)
441 goto err;
442 buf[0] = 0x40;
443 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
444 OV7670_CTL_RED, dev->sensor_flags, buf);
445 if (ret < 0)
446 goto err;
447 buf[0] = 0xe7;
448 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
449 OV7670_CTL_COM8, dev->sensor_flags, buf);
450 if (ret < 0)
451 goto err;
452 buf[0] = 0x6e;
453 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
454 OV7670_CTL_MTX1, dev->sensor_flags, buf);
455 if (ret < 0)
456 goto err;
457 buf[0] = 0x70;
458 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
459 OV7670_CTL_MTX2, dev->sensor_flags, buf);
460 if (ret < 0)
461 goto err;
462 buf[0] = 0x02;
463 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
464 OV7670_CTL_MTX3, dev->sensor_flags, buf);
465 if (ret < 0)
466 goto err;
467 buf[0] = 0x1d;
468 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
469 OV7670_CTL_MTX4, dev->sensor_flags, buf);
470 if (ret < 0)
471 goto err;
472 buf[0] = 0x56;
473 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
474 OV7670_CTL_MTX5, dev->sensor_flags, buf);
475 if (ret < 0)
476 goto err;
477 buf[0] = 0x73;
478 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
479 OV7670_CTL_MTX6, dev->sensor_flags, buf);
480 if (ret < 0)
481 goto err;
482 buf[0] = 0x0a;
483 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
484 OV7670_CTL_BRIGHT, dev->sensor_flags, buf);
485 if (ret < 0)
486 goto err;
487 buf[0] = 0x55;
488 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
489 OV7670_CTL_CONTRAS, dev->sensor_flags, buf);
490 if (ret < 0)
491 goto err;
492 buf[0] = 0x80;
493 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
494 OV7670_CTL_CONTRAS_CENTER, dev->sensor_flags, buf);
495 if (ret < 0)
496 goto err;
497 buf[0] = 0x9e;
498 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
499 OV7670_CTL_MTXS, dev->sensor_flags, buf);
500 if (ret < 0)
501 goto err;
502 buf[0] = 0x08;
503 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
504 OV7670_CTL_COM16, dev->sensor_flags, buf);
505 if (ret < 0)
506 goto err;
507 buf[0] = 0x02;
508 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
509 OV7670_CTL_EDGE, dev->sensor_flags, buf);
510 if (ret < 0)
511 goto err;
512 buf[0] = 0x03;
513 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
514 OV7670_CTL_REG75, dev->sensor_flags, buf);
515 if (ret < 0)
516 goto err;
517 buf[0] = 0x63;
518 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
519 OV7670_CTL_REG76, dev->sensor_flags, buf);
520 if (ret < 0)
521 goto err;
522 buf[0] = 0x04;
523 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
524 OV7670_CTL_DNSTH, dev->sensor_flags, buf);
525 if (ret < 0)
526 goto err;
527 buf[0] = 0x06;
528 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
529 OV7670_CTL_REG77, dev->sensor_flags, buf);
530 if (ret < 0)
531 goto err;
532 buf[0] = 0xc2;
533 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
534 OV7670_CTL_COM13, dev->sensor_flags, buf);
535 if (ret < 0)
536 goto err;
537 buf[0] = 0x09;
538 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
539 OV7670_CTL_REG4B, dev->sensor_flags, buf);
540 if (ret < 0)
541 goto err;
542 buf[0] = 0x30;
543 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
544 OV7670_CTL_SATCTR, dev->sensor_flags, buf);
545 if (ret < 0)
546 goto err;
547 buf[0] = 0x08;
548 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
549 OV7670_CTL_COM16, dev->sensor_flags, buf);
550 if (ret < 0)
551 goto err;
552 buf[0] = 0x48;
553 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
554 OV7670_CTL_CONTRAS, dev->sensor_flags, buf);
555 if (ret < 0)
556 goto err;
557 buf[0] = 0x11;
558 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
559 OV7670_CTL_ARBLM, dev->sensor_flags, buf);
560 if (ret < 0)
561 goto err;
562 buf[0] = 0xc2;
563 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
564 OV7670_CTL_COM11, dev->sensor_flags, buf);
565 if (ret < 0)
566 goto err;
567 buf[0] = 0x88;
568 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
569 OV7670_CTL_NT_CTRL, dev->sensor_flags, buf);
570 if (ret < 0)
571 goto err;
572 buf[0] = 0x00;
573 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
574 0x96, dev->sensor_flags, buf);
575 if (ret < 0)
576 goto err;
577 buf[0] = 0x30;
578 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
579 0x97, dev->sensor_flags, buf);
580 if (ret < 0)
581 goto err;
582 buf[0] = 0x20;
583 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
584 0x98, dev->sensor_flags, buf);
585 if (ret < 0)
586 goto err;
587 buf[0] = 0x30;
588 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
589 0x99, dev->sensor_flags, buf);
590 if (ret < 0)
591 goto err;
592 buf[0] = 0x84;
593 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
594 0x9a, dev->sensor_flags, buf);
595 if (ret < 0)
596 goto err;
597 buf[0] = 0x29;
598 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
599 0x9b, dev->sensor_flags, buf);
600 if (ret < 0)
601 goto err;
602 buf[0] = 0x03;
603 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
604 0x9c, dev->sensor_flags, buf);
605 if (ret < 0)
606 goto err;
607 buf[0] = 0x99;
608 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
609 OV7670_CTL_BD50ST, dev->sensor_flags, buf);
610 if (ret < 0)
611 goto err;
612 buf[0] = 0x7f;
613 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
614 OV7670_CTL_BD60ST, dev->sensor_flags, buf);
615 if (ret < 0)
616 goto err;
617 buf[0] = 0x04;
618 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
619 0x78, dev->sensor_flags, buf);
620 if (ret < 0)
621 goto err;
622 buf[0] = 0x01;
623 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
624 0x79, dev->sensor_flags, buf);
625 if (ret < 0)
626 goto err;
627 buf[0] = 0xf0;
628 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
629 0xc8, dev->sensor_flags, buf);
630 if (ret < 0)
631 goto err;
632 buf[0] = 0x0f;
633 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
634 0x79, dev->sensor_flags, buf);
635 if (ret < 0)
636 goto err;
637 buf[0] = 0x00;
638 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
639 0xc8, dev->sensor_flags, buf);
640 if (ret < 0)
641 goto err;
642 buf[0] = 0x10;
643 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
644 0x79, dev->sensor_flags, buf);
645 if (ret < 0)
646 goto err;
647 buf[0] = 0x7e;
648 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
649 0xc8, dev->sensor_flags, buf);
650 if (ret < 0)
651 goto err;
652 buf[0] = 0x0a;
653 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
654 0x79, dev->sensor_flags, buf);
655 if (ret < 0)
656 goto err;
657 buf[0] = 0x80;
658 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
659 0xc8, dev->sensor_flags, buf);
660 if (ret < 0)
661 goto err;
662 buf[0] = 0x0b;
663 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
664 0x79, dev->sensor_flags, buf);
665 if (ret < 0)
666 goto err;
667 buf[0] = 0x01;
668 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
669 0xc8, dev->sensor_flags, buf);
670 if (ret < 0)
671 goto err;
672 buf[0] = 0x0c;
673 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
674 0x79, dev->sensor_flags, buf);
675 if (ret < 0)
676 goto err;
677 buf[0] = 0x0f;
678 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
679 0xc8, dev->sensor_flags, buf);
680 if (ret < 0)
681 goto err;
682 buf[0] = 0x0d;
683 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
684 0x79, dev->sensor_flags, buf);
685 if (ret < 0)
686 goto err;
687 buf[0] = 0x20;
688 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
689 0xc8, dev->sensor_flags, buf);
690 if (ret < 0)
691 goto err;
692 buf[0] = 0x09;
693 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
694 0x79, dev->sensor_flags, buf);
695 if (ret < 0)
696 goto err;
697 buf[0] = 0x80;
698 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
699 0xc8, dev->sensor_flags, buf);
700 if (ret < 0)
701 goto err;
702 buf[0] = 0x02;
703 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
704 0x79, dev->sensor_flags, buf);
705 if (ret < 0)
706 goto err;
707 buf[0] = 0xc0;
708 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
709 0xc8, dev->sensor_flags, buf);
710 if (ret < 0)
711 goto err;
712 buf[0] = 0x03;
713 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
714 0x79, dev->sensor_flags, buf);
715 if (ret < 0)
716 goto err;
717 buf[0] = 0x40;
718 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
719 0xc8, dev->sensor_flags, buf);
720 if (ret < 0)
721 goto err;
722 buf[0] = 0x05;
723 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
724 0x79, dev->sensor_flags, buf);
725 if (ret < 0)
726 goto err;
727 buf[0] = 0x30;
728 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
729 0xc8, dev->sensor_flags, buf);
730 if (ret < 0)
731 goto err;
732 buf[0] = 0x26;
733 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
734 0x79, dev->sensor_flags, buf);
735 if (ret < 0)
736 goto err;
737 buf[0] = 0x20;
738 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
739 OV7670_CTL_LCC1, dev->sensor_flags, buf);
740 if (ret < 0)
741 goto err;
742 buf[0] = 0x00;
743 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
744 OV7670_CTL_LCC2, dev->sensor_flags, buf);
745 if (ret < 0)
746 goto err;
747 buf[0] = 0x06;
748 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
749 OV7670_CTL_LCC3, dev->sensor_flags, buf);
750 if (ret < 0)
751 goto err;
752 buf[0] = 0x00;
753 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
754 OV7670_CTL_LCC4, dev->sensor_flags, buf);
755 if (ret < 0)
756 goto err;
757 buf[0] = 0x05;
758 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
759 OV7670_CTL_LCC5, dev->sensor_flags, buf);
760 if (ret < 0)
761 goto err;
762 buf[0] = 0x05;
763 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
764 OV7670_CTL_LCC6, dev->sensor_flags, buf);
765 if (ret < 0)
766 goto err;
767 buf[0] = 0x0a;
768 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
769 OV7670_CTL_LCC7, dev->sensor_flags, buf);
770 if (ret < 0)
771 goto err;
772 buf[0] = 0x13;
773 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
774 OV7670_CTL_HSTART, dev->sensor_flags, buf);
775 if (ret < 0)
776 goto err;
777 buf[0] = 0x01;
778 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
779 OV7670_CTL_HSTOP, dev->sensor_flags, buf);
780 if (ret < 0)
781 goto err;
782 buf[0] = 0x02;
783 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
784 OV7670_CTL_VSTRT, dev->sensor_flags, buf);
785 if (ret < 0)
786 goto err;
787 buf[0] = 0x7a;
788 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
789 OV7670_CTL_VSTOP, dev->sensor_flags, buf);
790 if (ret < 0)
791 goto err;
792 buf[0] = 0x59;
793 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
794 OV7670_CTL_AWBC4, dev->sensor_flags, buf);
795 if (ret < 0)
796 goto err;
797 buf[0] = 0x30;
798 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
799 OV7670_CTL_AWBC5, dev->sensor_flags, buf);
800 if (ret < 0)
801 goto err;
802 buf[0] = 0x9a;
803 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
804 OV7670_CTL_MTXS, dev->sensor_flags, buf);
805 if (ret < 0)
806 goto err;
807 buf[0] = 0x84;
808 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
809 0x59, dev->sensor_flags, buf);
810 if (ret < 0)
811 goto err;
812 buf[0] = 0x91;
813 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
814 0x5a, dev->sensor_flags, buf);
815 if (ret < 0)
816 goto err;
817 buf[0] = 0x57;
818 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
819 0x5b, dev->sensor_flags, buf);
820 if (ret < 0)
821 goto err;
822 buf[0] = 0x75;
823 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
824 0x5c, dev->sensor_flags, buf);
825 if (ret < 0)
826 goto err;
827 buf[0] = 0x6d;
828 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
829 0x5d, dev->sensor_flags, buf);
830 if (ret < 0)
831 goto err;
832 buf[0] = 0x13;
833 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
834 0x5e, dev->sensor_flags, buf);
835 if (ret < 0)
836 goto err;
837 buf[0] = 0x07;
838 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
839 OV7670_CTL_LCC3, dev->sensor_flags, buf);
840 if (ret < 0)
841 goto err;
842 buf[0] = 0x07;
843 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
844 OV7670_CTL_LCC6, dev->sensor_flags, buf);
845 if (ret < 0)
846 goto err;
847 buf[0] = 0x0d;
848 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
849 OV7670_CTL_LCC7, dev->sensor_flags, buf);
850 if (ret < 0)
851 goto err;
852 buf[0] = 0xdf;
853 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
854 OV7670_CTL_HAECC3, dev->sensor_flags, buf);
855 if (ret < 0)
856 goto err;
857 buf[0] = 0xdf;
858 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
859 OV7670_CTL_HAECC4, dev->sensor_flags, buf);
860 if (ret < 0)
861 goto err;
862 buf[0] = 0x4d;
863 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
864 OV7670_CTL_AWBC6, dev->sensor_flags, buf);
865 if (ret < 0)
866 goto err;
867 buf[0] = 0x00;
868 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
869 OV7670_CTL_MTX3, dev->sensor_flags, buf);
870 if (ret < 0)
871 goto err;
873 * Phase 2
875 buf[0] = 0x0a;
876 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
877 OV7670_CTL_DBLV, dev->sensor_flags, buf);
878 if (ret < 0)
879 goto err;
880 buf[0] = 0x80;
881 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
882 OV7670_CTL_CLKRC, dev->sensor_flags, buf);
883 if (ret < 0)
884 goto err;
885 buf[0] = 0x00;
886 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
887 OV7670_CTL_EXHCH, dev->sensor_flags, buf);
888 if (ret < 0)
889 goto err;
890 buf[0] = 0x00;
891 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
892 OV7670_CTL_EXHCL, dev->sensor_flags, buf);
893 if (ret < 0)
894 goto err;
895 buf[0] = 0x00;
896 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
897 OV7670_CTL_DM_LNL, dev->sensor_flags, buf);
898 if (ret < 0)
899 goto err;
900 buf[0] = 0x00;
901 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
902 OV7670_CTL_DM_LNH, dev->sensor_flags, buf);
903 if (ret < 0)
904 goto err;
905 buf[0] = 0xc2;
906 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
907 OV7670_CTL_COM11, dev->sensor_flags, buf);
908 if (ret < 0)
909 goto err;
910 buf[0] = 0x0a;
911 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
912 OV7670_CTL_BRIGHT, dev->sensor_flags, buf);
913 if (ret < 0)
914 goto err;
915 buf[0] = 0x60;
916 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
917 OV7670_CTL_CONTRAS, dev->sensor_flags, buf);
918 if (ret < 0)
919 goto err;
920 buf[0] = 0x6e;
921 buf[1] = 0x70;
922 buf[2] = 0x00;
923 buf[3] = 0x1d;
924 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 4,
925 OV7670_CTL_MTX1, dev->sensor_flags, buf);
926 if (ret < 0)
927 goto err;
928 buf[0] = 0x56;
929 buf[1] = 0x73;
930 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 2,
931 OV7670_CTL_MTX5, dev->sensor_flags, buf);
932 if (ret < 0)
933 goto err;
934 buf[0] = 0x9a;
935 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
936 OV7670_CTL_MTXS, dev->sensor_flags, buf);
937 if (ret < 0)
938 goto err;
939 buf[0] = 0x6e;
940 buf[1] = 0x70;
941 buf[2] = 0x00;
942 buf[3] = 0x1d;
943 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 4,
944 OV7670_CTL_MTX1, dev->sensor_flags, buf);
945 if (ret < 0)
946 goto err;
947 buf[0] = 0x56;
948 buf[1] = 0x73;
949 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 2,
950 OV7670_CTL_MTX5, dev->sensor_flags, buf);
951 if (ret < 0)
952 goto err;
953 buf[0] = 0x9a;
954 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
955 OV7670_CTL_MTXS, dev->sensor_flags, buf);
956 if (ret < 0)
957 goto err;
958 buf[0] = 0x01;
959 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
960 OV7670_CTL_EDGE, dev->sensor_flags, buf);
961 if (ret < 0)
962 goto err;
963 buf[0] = 0x03;
964 buf[1] = 0x09;
965 buf[2] = 0x16;
966 buf[3] = 0x38;
967 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 4,
968 OV7670_CTL_GAM1, dev->sensor_flags, buf);
969 if (ret < 0)
970 goto err;
971 buf[0] = 0x47;
972 buf[1] = 0x53;
973 buf[2] = 0x5e;
974 buf[3] = 0x6a;
975 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 4,
976 OV7670_CTL_GAM5, dev->sensor_flags, buf);
977 if (ret < 0)
978 goto err;
979 buf[0] = 0x74;
980 buf[1] = 0x80;
981 buf[2] = 0x8c;
982 buf[3] = 0x9b;
983 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 4,
984 OV7670_CTL_GAM9, dev->sensor_flags, buf);
985 if (ret < 0)
986 goto err;
987 buf[0] = 0xb2;
988 buf[1] = 0xcc;
989 buf[2] = 0xe5;
990 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 3,
991 OV7670_CTL_GAM13, dev->sensor_flags, buf);
992 if (ret < 0)
993 goto err;
994 buf[0] = 0x24;
995 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
996 OV7670_CTL_SLOP, dev->sensor_flags, buf);
997 if (ret < 0)
998 goto err;
999 buf[0] = 0xc0;
1000 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
1001 OV7670_CTL_COM11, dev->sensor_flags, buf);
1002 if (ret < 0)
1003 goto err;
1004 buf[0] = 0xc0;
1005 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
1006 OV7670_CTL_COM11, dev->sensor_flags, buf);
1007 if (ret < 0)
1008 goto err;
1009 buf[0] = 0x76;
1010 buf[1] = 0x65;
1011 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 2,
1012 OV7670_CTL_HAECC1, dev->sensor_flags, buf);
1013 if (ret < 0)
1014 goto err;
1015 buf[0] = 0xe7;
1016 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
1017 OV7670_CTL_COM8, dev->sensor_flags, buf);
1018 if (ret < 0)
1019 goto err;
1021 * Phase 3
1023 buf[0] = 0x0a;
1024 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
1025 OV7670_CTL_DBLV, dev->sensor_flags, buf);
1026 if (ret < 0)
1027 goto err;
1028 buf[0] = 0x80;
1029 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
1030 OV7670_CTL_CLKRC, dev->sensor_flags, buf);
1031 if (ret < 0)
1032 goto err;
1033 buf[0] = 0x00;
1034 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
1035 OV7670_CTL_EXHCH, dev->sensor_flags, buf);
1036 if (ret < 0)
1037 goto err;
1038 buf[0] = 0x00;
1039 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
1040 OV7670_CTL_EXHCL, dev->sensor_flags, buf);
1041 if (ret < 0)
1042 goto err;
1043 buf[0] = 0x00;
1044 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
1045 OV7670_CTL_DM_LNL, dev->sensor_flags, buf);
1046 if (ret < 0)
1047 goto err;
1048 buf[0] = 0x00;
1049 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
1050 OV7670_CTL_DM_LNH, dev->sensor_flags, buf);
1051 if (ret < 0)
1052 goto err;
1054 return ret;
1056 * Error Handler
1058 err:
1059 UDIA_ERROR("R/W for sensor register failed. Ret code = %d\n", ret);
1060 return ret;
1064 * @brief OV7670 Auto-Flip
1066 * @param dev Pointer to the device
1067 * @param vflip Flag to indicate whether or not Camera is currently flipped
1069 * @return Zero (success) or negative (USB-error value)
1072 int ov7670_auto_flip(struct usb_microdia *dev, __u8 vflip)
1074 int ret;
1075 __u8 buf[2];
1077 ret = sn9c20x_read_i2c_data(dev, dev->sensor_slave_address, 1,
1078 OV7670_CTL_MVFP, dev->sensor_flags, buf);
1079 if (ret < 0)
1080 return ret;
1082 if (vflip == 0)
1083 buf[0] = buf[0] & (0xff ^ OV7670_VFLIP_BIT);
1084 else
1085 buf[0] = buf[0] | OV7670_VFLIP_BIT;
1086 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
1087 OV7670_CTL_MVFP, dev->sensor_flags, buf);
1089 return ret;