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