Fix 62B3 to use correct format decoding routines
[microdia.git] / ov7670.c
blobaf2be17a7b5592f6b23609ae052f8505c2cf6b0f
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 buf[0] = 0x80;
52 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
53 OV7670_CTL_CLKRC, dev->sensor_flags, buf);
54 buf[0] = 0x04;
55 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
56 OV7670_CTL_TSLB, dev->sensor_flags, buf);
57 buf[0] = 0x00;
58 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
59 OV7670_CTL_COM7, dev->sensor_flags, buf);
60 buf[0] = 0xb6;
61 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
62 OV7670_CTL_HREF, dev->sensor_flags, buf);
63 buf[0] = 0x0a;
64 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
65 OV7670_CTL_VREF, dev->sensor_flags, buf);
66 buf[0] = 0x00;
67 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
68 OV7670_CTL_COM3, dev->sensor_flags, buf);
69 buf[0] = 0x00;
70 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
71 OV7670_CTL_COM14, dev->sensor_flags, buf);
72 buf[0] = 0x3a;
73 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
74 OV7670_CTL_SCALING_XSC, dev->sensor_flags, buf);
75 buf[0] = 0x35;
76 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
77 OV7670_CTL_SCALING_YSC, dev->sensor_flags, buf);
78 buf[0] = 0x11;
79 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
80 OV7670_CTL_SCALING_DCWCTR, dev->sensor_flags, buf);
81 buf[0] = 0xf0;
82 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
83 OV7670_CTL_SCALING_PCLK_DIV, dev->sensor_flags, buf);
84 buf[0] = 0x02;
85 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
86 OV7670_CTL_SCALING_PCLK_DELAY, dev->sensor_flags, buf);
87 buf[0] = 0xe0;
88 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
89 OV7670_CTL_COM8, dev->sensor_flags, buf);
90 buf[0] = 0x00;
91 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
92 OV7670_CTL_GAIN, dev->sensor_flags, buf);
93 buf[0] = 0x00;
94 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
95 OV7670_CTL_AECH, dev->sensor_flags, buf);
96 buf[0] = 0x40;
97 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
98 OV7670_CTL_COM4, dev->sensor_flags, buf);
99 buf[0] = 0x08;
100 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
101 OV7670_CTL_COM9, dev->sensor_flags, buf);
102 buf[0] = 0x05;
103 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
104 OV7670_CTL_BD50MAX, dev->sensor_flags, buf);
105 buf[0] = 0x07;
106 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
107 OV7670_CTL_BD60MAX, dev->sensor_flags, buf);
108 buf[0] = 0x95;
109 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
110 OV7670_CTL_AEW, dev->sensor_flags, buf);
111 buf[0] = 0x33;
112 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
113 OV7670_CTL_AEB, dev->sensor_flags, buf);
114 buf[0] = 0xe3;
115 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
116 OV7670_CTL_VPT, dev->sensor_flags, buf);
117 buf[0] = 0x75;
118 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
119 OV7670_CTL_HAECC1, dev->sensor_flags, buf);
120 buf[0] = 0x65;
121 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
122 OV7670_CTL_HAECC2, dev->sensor_flags, buf);
123 buf[0] = 0x0b;
124 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
125 0xa1, dev->sensor_flags, buf);
126 buf[0] = 0xd8;
127 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
128 OV7670_CTL_HAECC3, dev->sensor_flags, buf);
129 buf[0] = 0xd8;
130 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
131 OV7670_CTL_HAECC4, dev->sensor_flags, buf);
132 buf[0] = 0xf0;
133 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
134 OV7670_CTL_HAECC5, dev->sensor_flags, buf);
135 buf[0] = 0x90;
136 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
137 OV7670_CTL_HAECC6, dev->sensor_flags, buf);
138 buf[0] = 0x94;
139 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
140 OV7670_CTL_HAECC7, dev->sensor_flags, buf);
141 buf[0] = 0xe5;
142 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
143 OV7670_CTL_COM8, dev->sensor_flags, buf);
144 buf[0] = 0x61;
145 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
146 OV7670_CTL_COM5, dev->sensor_flags, buf);
147 buf[0] = 0x4b;
148 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
149 OV7670_CTL_COM6, dev->sensor_flags, buf);
150 buf[0] = 0x02;
151 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
152 0x16, dev->sensor_flags, buf);
153 buf[0] = 0x27;
154 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
155 OV7670_CTL_MVFP, dev->sensor_flags, buf);
156 buf[0] = 0x02;
157 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
158 OV7670_CTL_ADCCTR1, dev->sensor_flags, buf);
159 buf[0] = 0x91;
160 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
161 OV7670_CTL_ADCCTR2, dev->sensor_flags, buf);
162 buf[0] = 0x07;
163 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
164 0x29, dev->sensor_flags, buf);
165 buf[0] = 0x0b;
166 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
167 OV7670_CTL_CHLF, dev->sensor_flags, buf);
168 buf[0] = 0x0b;
169 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
170 0x35, dev->sensor_flags, buf);
171 buf[0] = 0x1d;
172 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
173 OV7670_CTL_ADC, dev->sensor_flags, buf);
174 buf[0] = 0x71;
175 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
176 OV7670_CTL_ACOM, dev->sensor_flags, buf);
177 buf[0] = 0x2a;
178 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
179 OV7670_CTL_OFON, dev->sensor_flags, buf);
180 buf[0] = 0x78;
181 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
182 OV7670_CTL_COM12, dev->sensor_flags, buf);
183 buf[0] = 0x40;
184 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
185 0x4d, dev->sensor_flags, buf);
186 buf[0] = 0x20;
187 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
188 0x4e, dev->sensor_flags, buf);
189 buf[0] = 0x00;
190 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
191 OV7670_CTL_GFIX, dev->sensor_flags, buf);
192 buf[0] = 0x19;
193 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
194 OV7670_CTL_REG74, dev->sensor_flags, buf);
195 buf[0] = 0x4f;
196 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
197 0x8d, dev->sensor_flags, buf);
198 buf[0] = 0x00;
199 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
200 0x8e, dev->sensor_flags, buf);
201 buf[0] = 0x00;
202 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
203 0x8f, dev->sensor_flags, buf);
204 buf[0] = 0x00;
205 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
206 0x90, dev->sensor_flags, buf);
207 buf[0] = 0x00;
208 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
209 0x91, dev->sensor_flags, buf);
210 buf[0] = 0x00;
211 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
212 0x96, dev->sensor_flags, buf);
213 buf[0] = 0x80;
214 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
215 0x9a, dev->sensor_flags, buf);
216 buf[0] = 0x84;
217 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
218 0xb0, dev->sensor_flags, buf);
219 buf[0] = 0x0c;
220 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
221 OV7670_CTL_ABLC1, dev->sensor_flags, buf);
222 buf[0] = 0x0e;
223 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
224 0xb2, dev->sensor_flags, buf);
225 buf[0] = 0x82;
226 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
227 OV7670_CTL_THL_ST, dev->sensor_flags, buf);
228 buf[0] = 0x0a;
229 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
230 0xb8, dev->sensor_flags, buf);
231 buf[0] = 0x0a;
232 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
233 OV7670_CTL_AWBC1, dev->sensor_flags, buf);
234 buf[0] = 0xf0;
235 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
236 OV7670_CTL_AWBC2, dev->sensor_flags, buf);
237 buf[0] = 0x20;
238 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
239 OV7670_CTL_AWBC3, dev->sensor_flags, buf);
240 buf[0] = 0x7d;
241 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
242 OV7670_CTL_AWBC4, dev->sensor_flags, buf);
243 buf[0] = 0x29;
244 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
245 OV7670_CTL_AWBC5, dev->sensor_flags, buf);
246 buf[0] = 0x4a;
247 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
248 OV7670_CTL_AWBC6, dev->sensor_flags, buf);
249 buf[0] = 0x8c;
250 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
251 0x59, dev->sensor_flags, buf);
252 buf[0] = 0xa5;
253 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
254 0x5a, dev->sensor_flags, buf);
255 buf[0] = 0xde;
256 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
257 0x5b, dev->sensor_flags, buf);
258 buf[0] = 0x96;
259 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
260 0x5c, dev->sensor_flags, buf);
261 buf[0] = 0x66;
262 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
263 0x5d, dev->sensor_flags, buf);
264 buf[0] = 0x10;
265 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
266 0x5e, dev->sensor_flags, buf);
267 buf[0] = 0x0a;
268 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
269 OV7670_CTL_AWBCTR3, dev->sensor_flags, buf);
270 buf[0] = 0x55;
271 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
272 OV7670_CTL_AWBCTR2, dev->sensor_flags, buf);
273 buf[0] = 0x11;
274 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
275 OV7670_CTL_AWBCTR1, dev->sensor_flags, buf);
276 buf[0] = 0x9e;
277 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
278 OV7670_CTL_AWBCTR0, dev->sensor_flags, buf);
279 buf[0] = 0x40;
280 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
281 OV7670_CTL_GGAIN, dev->sensor_flags, buf);
282 buf[0] = 0x40;
283 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
284 OV7670_CTL_BLUE, dev->sensor_flags, buf);
285 buf[0] = 0x40;
286 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
287 OV7670_CTL_RED, dev->sensor_flags, buf);
288 buf[0] = 0xe7;
289 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
290 OV7670_CTL_COM8, dev->sensor_flags, buf);
291 buf[0] = 0x6e;
292 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
293 OV7670_CTL_MTX1, dev->sensor_flags, buf);
294 buf[0] = 0x70;
295 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
296 OV7670_CTL_MTX2, dev->sensor_flags, buf);
297 buf[0] = 0x02;
298 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
299 OV7670_CTL_MTX3, dev->sensor_flags, buf);
300 buf[0] = 0x1d;
301 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
302 OV7670_CTL_MTX4, dev->sensor_flags, buf);
303 buf[0] = 0x56;
304 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
305 OV7670_CTL_MTX5, dev->sensor_flags, buf);
306 buf[0] = 0x73;
307 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
308 OV7670_CTL_MTX6, dev->sensor_flags, buf);
309 buf[0] = 0x0a;
310 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
311 OV7670_CTL_BRIGHT, dev->sensor_flags, buf);
312 buf[0] = 0x55;
313 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
314 OV7670_CTL_CONTRAS, dev->sensor_flags, buf);
315 buf[0] = 0x80;
316 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
317 OV7670_CTL_CONTRAS_CENTER, dev->sensor_flags, buf);
318 buf[0] = 0x9e;
319 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
320 OV7670_CTL_MTXS, dev->sensor_flags, buf);
321 buf[0] = 0x08;
322 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
323 OV7670_CTL_COM16, dev->sensor_flags, buf);
324 buf[0] = 0x02;
325 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
326 OV7670_CTL_EDGE, dev->sensor_flags, buf);
327 buf[0] = 0x03;
328 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
329 OV7670_CTL_REG75, dev->sensor_flags, buf);
330 buf[0] = 0x63;
331 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
332 OV7670_CTL_REG76, dev->sensor_flags, buf);
333 buf[0] = 0x04;
334 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
335 OV7670_CTL_DNSTH, dev->sensor_flags, buf);
336 buf[0] = 0x06;
337 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
338 OV7670_CTL_REG77, dev->sensor_flags, buf);
339 buf[0] = 0xc2;
340 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
341 OV7670_CTL_COM13, dev->sensor_flags, buf);
342 buf[0] = 0x09;
343 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
344 OV7670_CTL_REG4B, dev->sensor_flags, buf);
345 buf[0] = 0x30;
346 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
347 OV7670_CTL_SATCTR, dev->sensor_flags, buf);
348 buf[0] = 0x08;
349 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
350 OV7670_CTL_COM16, dev->sensor_flags, buf);
351 buf[0] = 0x48;
352 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
353 OV7670_CTL_CONTRAS, dev->sensor_flags, buf);
354 buf[0] = 0x11;
355 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
356 OV7670_CTL_ARBLM, dev->sensor_flags, buf);
357 buf[0] = 0xc2;
358 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
359 OV7670_CTL_COM11, dev->sensor_flags, buf);
360 buf[0] = 0x88;
361 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
362 OV7670_CTL_NT_CTRL, dev->sensor_flags, buf);
363 buf[0] = 0x00;
364 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
365 0x96, dev->sensor_flags, buf);
366 buf[0] = 0x30;
367 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
368 0x97, dev->sensor_flags, buf);
369 buf[0] = 0x20;
370 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
371 0x98, dev->sensor_flags, buf);
372 buf[0] = 0x30;
373 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
374 0x99, dev->sensor_flags, buf);
375 buf[0] = 0x84;
376 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
377 0x9a, dev->sensor_flags, buf);
378 buf[0] = 0x29;
379 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
380 0x9b, dev->sensor_flags, buf);
381 buf[0] = 0x03;
382 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
383 0x9c, dev->sensor_flags, buf);
384 buf[0] = 0x99;
385 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
386 OV7670_CTL_BD50ST, dev->sensor_flags, buf);
387 buf[0] = 0x7f;
388 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
389 OV7670_CTL_BD60ST, dev->sensor_flags, buf);
390 buf[0] = 0x04;
391 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
392 0x78, dev->sensor_flags, buf);
393 buf[0] = 0x01;
394 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
395 0x79, dev->sensor_flags, buf);
396 buf[0] = 0xf0;
397 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
398 0xc8, dev->sensor_flags, buf);
399 buf[0] = 0x0f;
400 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
401 0x79, dev->sensor_flags, buf);
402 buf[0] = 0x00;
403 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
404 0xc8, dev->sensor_flags, buf);
405 buf[0] = 0x10;
406 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
407 0x79, dev->sensor_flags, buf);
408 buf[0] = 0x7e;
409 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
410 0xc8, dev->sensor_flags, buf);
411 buf[0] = 0x0a;
412 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
413 0x79, dev->sensor_flags, buf);
414 buf[0] = 0x80;
415 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
416 0xc8, dev->sensor_flags, buf);
417 buf[0] = 0x0b;
418 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
419 0x79, dev->sensor_flags, buf);
420 buf[0] = 0x01;
421 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
422 0xc8, dev->sensor_flags, buf);
423 buf[0] = 0x0c;
424 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
425 0x79, dev->sensor_flags, buf);
426 buf[0] = 0x0f;
427 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
428 0xc8, dev->sensor_flags, buf);
429 buf[0] = 0x0d;
430 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
431 0x79, dev->sensor_flags, buf);
432 buf[0] = 0x20;
433 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
434 0xc8, dev->sensor_flags, buf);
435 buf[0] = 0x09;
436 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
437 0x79, dev->sensor_flags, buf);
438 buf[0] = 0x80;
439 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
440 0xc8, dev->sensor_flags, buf);
441 buf[0] = 0x02;
442 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
443 0x79, dev->sensor_flags, buf);
444 buf[0] = 0xc0;
445 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
446 0xc8, dev->sensor_flags, buf);
447 buf[0] = 0x03;
448 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
449 0x79, dev->sensor_flags, buf);
450 buf[0] = 0x40;
451 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
452 0xc8, dev->sensor_flags, buf);
453 buf[0] = 0x05;
454 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
455 0x79, dev->sensor_flags, buf);
456 buf[0] = 0x30;
457 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
458 0xc8, dev->sensor_flags, buf);
459 buf[0] = 0x26;
460 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
461 0x79, dev->sensor_flags, buf);
462 buf[0] = 0x20;
463 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
464 OV7670_CTL_LCC1, dev->sensor_flags, buf);
465 buf[0] = 0x00;
466 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
467 OV7670_CTL_LCC2, dev->sensor_flags, buf);
468 buf[0] = 0x06;
469 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
470 OV7670_CTL_LCC3, dev->sensor_flags, buf);
471 buf[0] = 0x00;
472 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
473 OV7670_CTL_LCC4, dev->sensor_flags, buf);
474 buf[0] = 0x05;
475 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
476 OV7670_CTL_LCC5, dev->sensor_flags, buf);
477 buf[0] = 0x05;
478 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
479 OV7670_CTL_LCC6, dev->sensor_flags, buf);
480 buf[0] = 0x0a;
481 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
482 OV7670_CTL_LCC7, dev->sensor_flags, buf);
483 buf[0] = 0x13;
484 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
485 OV7670_CTL_HSTART, dev->sensor_flags, buf);
486 buf[0] = 0x01;
487 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
488 OV7670_CTL_HSTOP, dev->sensor_flags, buf);
489 buf[0] = 0x02;
490 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
491 OV7670_CTL_VSTRT, dev->sensor_flags, buf);
492 buf[0] = 0x7a;
493 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
494 OV7670_CTL_VSTOP, dev->sensor_flags, buf);
495 buf[0] = 0x59;
496 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
497 OV7670_CTL_AWBC4, dev->sensor_flags, buf);
498 buf[0] = 0x30;
499 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
500 OV7670_CTL_AWBC5, dev->sensor_flags, buf);
501 buf[0] = 0x9a;
502 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
503 OV7670_CTL_MTXS, dev->sensor_flags, buf);
504 buf[0] = 0x84;
505 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
506 0x59, dev->sensor_flags, buf);
507 buf[0] = 0x91;
508 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
509 0x5a, dev->sensor_flags, buf);
510 buf[0] = 0x57;
511 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
512 0x5b, dev->sensor_flags, buf);
513 buf[0] = 0x75;
514 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
515 0x5c, dev->sensor_flags, buf);
516 buf[0] = 0x6d;
517 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
518 0x5d, dev->sensor_flags, buf);
519 buf[0] = 0x13;
520 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
521 0x5e, dev->sensor_flags, buf);
522 buf[0] = 0x07;
523 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
524 OV7670_CTL_LCC3, dev->sensor_flags, buf);
525 buf[0] = 0x07;
526 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
527 OV7670_CTL_LCC6, dev->sensor_flags, buf);
528 buf[0] = 0x0d;
529 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
530 OV7670_CTL_LCC7, dev->sensor_flags, buf);
531 buf[0] = 0xdf;
532 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
533 OV7670_CTL_HAECC3, dev->sensor_flags, buf);
534 buf[0] = 0xdf;
535 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
536 OV7670_CTL_HAECC4, dev->sensor_flags, buf);
537 buf[0] = 0x4d;
538 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
539 OV7670_CTL_AWBC6, dev->sensor_flags, buf);
540 buf[0] = 0x00;
541 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
542 OV7670_CTL_MTX3, dev->sensor_flags, buf);
544 * Phase 2
546 buf[0] = 0x0a;
547 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
548 OV7670_CTL_DBLV, dev->sensor_flags, buf);
549 buf[0] = 0x80;
550 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
551 OV7670_CTL_CLKRC, dev->sensor_flags, buf);
552 buf[0] = 0x00;
553 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
554 OV7670_CTL_EXHCH, dev->sensor_flags, buf);
555 buf[0] = 0x00;
556 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
557 OV7670_CTL_EXHCL, dev->sensor_flags, buf);
558 buf[0] = 0x00;
559 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
560 OV7670_CTL_DM_LNL, dev->sensor_flags, buf);
561 buf[0] = 0x00;
562 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
563 OV7670_CTL_DM_LNH, dev->sensor_flags, buf);
564 buf[0] = 0xc2;
565 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
566 OV7670_CTL_COM11, dev->sensor_flags, buf);
567 buf[0] = 0x0a;
568 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
569 OV7670_CTL_BRIGHT, dev->sensor_flags, buf);
570 buf[0] = 0x60;
571 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
572 OV7670_CTL_CONTRAS, dev->sensor_flags, buf);
573 buf[0] = 0x6e;
574 buf[1] = 0x70;
575 buf[2] = 0x00;
576 buf[3] = 0x1d;
577 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 4,
578 OV7670_CTL_MTX1, dev->sensor_flags, buf);
579 buf[0] = 0x56;
580 buf[1] = 0x73;
581 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 2,
582 OV7670_CTL_MTX5, dev->sensor_flags, buf);
583 buf[0] = 0x9a;
584 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
585 OV7670_CTL_MTXS, dev->sensor_flags, buf);
586 buf[0] = 0x6e;
587 buf[1] = 0x70;
588 buf[2] = 0x00;
589 buf[3] = 0x1d;
590 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 4,
591 OV7670_CTL_MTX1, dev->sensor_flags, buf);
592 buf[0] = 0x56;
593 buf[1] = 0x73;
594 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 2,
595 OV7670_CTL_MTX5, dev->sensor_flags, buf);
596 buf[0] = 0x9a;
597 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
598 OV7670_CTL_MTXS, dev->sensor_flags, buf);
599 buf[0] = 0x01;
600 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
601 OV7670_CTL_EDGE, dev->sensor_flags, buf);
602 buf[0] = 0x03;
603 buf[1] = 0x09;
604 buf[2] = 0x16;
605 buf[3] = 0x38;
606 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 4,
607 OV7670_CTL_GAM1, dev->sensor_flags, buf);
608 buf[0] = 0x47;
609 buf[1] = 0x53;
610 buf[2] = 0x5e;
611 buf[3] = 0x6a;
612 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 4,
613 OV7670_CTL_GAM5, dev->sensor_flags, buf);
614 buf[0] = 0x74;
615 buf[1] = 0x80;
616 buf[2] = 0x8c;
617 buf[3] = 0x9b;
618 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 4,
619 OV7670_CTL_GAM9, dev->sensor_flags, buf);
620 buf[0] = 0xb2;
621 buf[1] = 0xcc;
622 buf[2] = 0xe5;
623 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 3,
624 OV7670_CTL_GAM13, dev->sensor_flags, buf);
625 buf[0] = 0x24;
626 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
627 OV7670_CTL_SLOP, dev->sensor_flags, buf);
628 buf[0] = 0xc0;
629 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
630 OV7670_CTL_COM11, dev->sensor_flags, buf);
631 buf[0] = 0xc0;
632 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
633 OV7670_CTL_COM11, dev->sensor_flags, buf);
634 buf[0] = 0x76;
635 buf[1] = 0x65;
636 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 2,
637 OV7670_CTL_HAECC1, dev->sensor_flags, buf);
638 buf[0] = 0xe7;
639 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
640 OV7670_CTL_COM8, dev->sensor_flags, buf);
642 * Phase 3
644 buf[0] = 0x0a;
645 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
646 OV7670_CTL_DBLV, dev->sensor_flags, buf);
647 buf[0] = 0x80;
648 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
649 OV7670_CTL_CLKRC, dev->sensor_flags, buf);
650 buf[0] = 0x00;
651 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
652 OV7670_CTL_EXHCH, dev->sensor_flags, buf);
653 buf[0] = 0x00;
654 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
655 OV7670_CTL_EXHCL, dev->sensor_flags, buf);
656 buf[0] = 0x00;
657 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
658 OV7670_CTL_DM_LNL, dev->sensor_flags, buf);
659 buf[0] = 0x00;
660 ret = sn9c20x_write_i2c_data(dev, dev->sensor_slave_address, 1,
661 OV7670_CTL_DM_LNH, dev->sensor_flags, buf);
663 return ret;
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)
677 int ret;
678 __u8 buf[2];
680 ret = sn9c20x_read_i2c_data(dev, dev->sensor_slave_address, 1,
681 OV7670_CTL_MVFP, dev->sensor_flags, buf);
682 if (ret < 0)
683 return ret;
685 if (vflip == 0)
686 buf[0] = buf[0] & (0xff ^ OV7670_VFLIP_BIT);
687 else
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);
692 return ret;