Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of ov7670 by
ov7670.cpp
00001 #include "ov7670.h" 00002 00003 00004 OV7670::OV7670(PinName sda, PinName scl, PinName vs, PinName hr, PinName we, Name port, int mask, PinName rt, PinName o, PinName rc) : _i2c(sda,scl),vsync(vs),href(hr),wen(we),data(port,mask),rrst(rt),oe(o),rclk(rc) 00005 { 00006 _i2c.stop(); 00007 _i2c.frequency(OV7670_I2CFREQ); 00008 vsync.fall(this,&OV7670::VsyncHandler); // interrupt fall edge 00009 CaptureReq = false; 00010 Busy = false; 00011 Done = false; 00012 LineCounter = 0; 00013 rrst = 1; 00014 oe = 1; 00015 rclk = 1; 00016 wen = 0; 00017 } 00018 00019 00020 OV7670::~OV7670() 00021 { 00022 00023 } 00024 00025 00026 // capture request 00027 void OV7670::CaptureNext(void) 00028 { 00029 CaptureReq = true; 00030 Busy = true; 00031 } 00032 00033 00034 // capture done? (with clear) 00035 bool OV7670::CaptureDone(void) 00036 { 00037 bool result; 00038 if (Busy) 00039 { 00040 result = false; 00041 }else 00042 { 00043 result = Done; 00044 Done = false; 00045 } 00046 return result; 00047 } 00048 00049 00050 // vsync handler 00051 void OV7670::VsyncHandler(void) 00052 { 00053 // Capture Enable 00054 if (CaptureReq) 00055 { 00056 wen = 1; 00057 Done = false; 00058 CaptureReq = false; 00059 }else 00060 { 00061 wen = 0; 00062 if (Busy) 00063 { 00064 Busy = false; 00065 Done = true; 00066 } 00067 } 00068 } 00069 00070 00071 // Data Read 00072 int OV7670::ReadOnebyte(void) 00073 { 00074 int B1; 00075 rclk = 1; 00076 B1 = (((data&0x07800000)>>19)|((data&0x078000)>>15)); 00077 rclk = 0; 00078 return B1; 00079 } 00080 00081 00082 // Data Start read from FIFO 00083 void OV7670::ReadStart(void) 00084 { 00085 rrst = 0; 00086 oe = 0; 00087 wait_us(1); 00088 rclk = 0; 00089 wait_us(1); 00090 rclk = 1; 00091 wait_us(1); 00092 rrst = 1; 00093 } 00094 00095 00096 // Data Stop read from FIFO 00097 void OV7670::ReadStop(void) 00098 { 00099 oe = 1; 00100 ReadOnebyte(); 00101 rclk = 1; 00102 } 00103 00104 00105 void OV7670::Reset(void) 00106 { 00107 WriteReg(0x12, 0x80); // RESET CAMERA 00108 wait_ms(200); 00109 } 00110 00111 00112 int OV7670::Init(char c, int n) 00113 { 00114 if(c == 'b' || c == 'y') // YUV 00115 { 00116 format_temp = "BAW"; 00117 } 00118 else 00119 if(c == 'r') // RGB565 00120 { 00121 format_temp = "RGB"; 00122 } 00123 return Init(format_temp, n); 00124 } 00125 00126 00127 int OV7670::Init(char *format, int n) 00128 { 00129 00130 if (ReadReg(REG_PID) != 0x76) // check id camera 00131 { 00132 return 0; 00133 } 00134 00135 Reset(); // Resets all registers to default values 00136 Reset(); // Resets all registers to default values 00137 00138 WriteReg(REG_RGB444, 0x00); // Disable RGB444 00139 WriteReg(REG_COM10, 0x02); // 0x02 VSYNC negative (http://nasulica.homelinux.org/?p=959) 00140 WriteReg(REG_MVFP, 0x27); // mirror image 00141 00142 WriteReg(REG_CLKRC, 0x80); // prescaler x1 00143 WriteReg(DBLV, 0x0a); // bypass PLL 00144 00145 WriteReg(REG_COM11, 0x0A) ; 00146 WriteReg(REG_TSLB, 0x04); // 0D = UYVY 04 = YUYV 00147 WriteReg(REG_COM13, 0x88); // connect to REG_TSLB 00148 00149 00150 if((strcmp("BAW", format) == 0) || (strcmp("YUV", format) == 0)|| (strcmp("RAW", format) == 0)) // YUV 00151 { 00152 WriteReg(REG_COM7, 0x00); // YUV 00153 WriteReg(REG_COM17, 0x00); // color bar disable 00154 WriteReg(REG_COM3, 0x04); 00155 WriteReg(REG_COM15, 0xC0); // Set normal rgb with Full range 00156 00157 }else 00158 if((strcmp("RGB", format) == 0)) // RGB565 00159 { 00160 WriteReg(REG_COM7, 0x04); // RGB + color bar disable 00161 WriteReg(REG_RGB444, 0x00); // Disable RGB444 00162 WriteReg(REG_COM15, 0x10); // Set rgb565 with Full range 0xD0 00163 WriteReg(REG_COM3, 0x04); 00164 WriteReg(REG_CLKRC, 0x80); // prescaler x1 00165 } 00166 00167 WriteReg(0x70, 0x3A); // Scaling Xsc 00168 WriteReg(0x71, 0x35); // Scaling Ysc 00169 WriteReg(0xA2, 0x02); // pixel clock delay 00170 00171 if(n == 19200) // 160*120 00172 { 00173 WriteReg(REG_COM14, 0x1a); // divide by 4 00174 WriteReg(0x72, 0x22); // downsample by 4 00175 WriteReg(0x73, 0xf2); // divide by 4 00176 WriteReg(REG_HREF, 0xa4); 00177 WriteReg(REG_HSTART, 0x16); 00178 WriteReg(REG_HSTOP, 0x04); 00179 WriteReg(REG_VREF, 0x0a); 00180 WriteReg(REG_VSTART, 0x02); 00181 WriteReg(REG_VSTOP, 0x7a); 00182 00183 WriteReg(0x7a, 0x20); 00184 WriteReg(0x7b, 0x1c); 00185 WriteReg(0x7c, 0x28); 00186 WriteReg(0x7d, 0x3c); 00187 WriteReg(0x7e, 0x5a); 00188 WriteReg(0x7f, 0x68); 00189 WriteReg(0x80, 0x76); 00190 WriteReg(0x81, 0x80); 00191 WriteReg(0x82, 0x88); 00192 WriteReg(0x83, 0x8f); 00193 WriteReg(0x84, 0x96); 00194 WriteReg(0x85, 0xa3); 00195 WriteReg(0x86, 0xaf); 00196 WriteReg(0x87, 0xc4); 00197 WriteReg(0x88, 0xd7); 00198 WriteReg(0x89, 0xe8); 00199 00200 WriteReg(0x13, 0xe0); 00201 WriteReg(0x00, 0x00); 00202 WriteReg(0x10, 0x00); 00203 WriteReg(0x0d, 0x40); 00204 WriteReg(0x14, 0x18); 00205 WriteReg(0xa5, 0x05); 00206 WriteReg(0xab, 0x07); 00207 WriteReg(0x24, 0x95); 00208 WriteReg(0x25, 0x33); 00209 WriteReg(0x26, 0xe3); 00210 WriteReg(0x9f, 0x78); 00211 WriteReg(0xa0, 0x68); 00212 WriteReg(0xa1, 0x03); 00213 WriteReg(0xa6, 0xd8); 00214 WriteReg(0xa7, 0xd8); 00215 WriteReg(0xa8, 0xf0); 00216 WriteReg(0xa9, 0x90); 00217 WriteReg(0xaa, 0x94); 00218 WriteReg(0x13, 0xe5); 00219 00220 WriteReg(0x0e, 0x61); 00221 WriteReg(0x0f, 0x4b); 00222 WriteReg(0x16, 0x02); 00223 00224 WriteReg(0x21, 0x02); 00225 WriteReg(0x22, 0x91); 00226 WriteReg(0x29, 0x07); 00227 WriteReg(0x33, 0x0b); 00228 WriteReg(0x35, 0x0b); 00229 WriteReg(0x37, 0x1d); 00230 WriteReg(0x38, 0x71); 00231 WriteReg(0x39, 0x2a); 00232 WriteReg(0x3c, 0x78); 00233 WriteReg(0x4d, 0x40); 00234 WriteReg(0x4e, 0x20); 00235 WriteReg(0x69, 0x00); 00236 00237 WriteReg(0x74, 0x10); 00238 WriteReg(0x8d, 0x4f); 00239 WriteReg(0x8e, 0x00); 00240 WriteReg(0x8f, 0x00); 00241 WriteReg(0x90, 0x00); 00242 WriteReg(0x91, 0x00); 00243 WriteReg(0x92, 0x00); 00244 00245 WriteReg(0x96, 0x00); 00246 WriteReg(0x9a, 0x80); 00247 WriteReg(0xb0, 0x84); 00248 WriteReg(0xb1, 0x0c); 00249 WriteReg(0xb2, 0x0e); 00250 WriteReg(0xb3, 0x82); 00251 WriteReg(0xb8, 0x0a); 00252 00253 WriteReg(0x43, 0x0a); 00254 WriteReg(0x44, 0xf0); 00255 WriteReg(0x45, 0x34); 00256 WriteReg(0x46, 0x58); 00257 WriteReg(0x47, 0x28); 00258 WriteReg(0x48, 0x3a); 00259 WriteReg(0x59, 0x88); 00260 WriteReg(0x5a, 0x88); 00261 WriteReg(0x5b, 0x44); 00262 WriteReg(0x5c, 0x67); 00263 WriteReg(0x5d, 0x49); 00264 WriteReg(0x5e, 0x0e); 00265 WriteReg(0x64, 0x04); 00266 WriteReg(0x65, 0x20); 00267 WriteReg(0x66, 0x05); 00268 WriteReg(0x94, 0x04); 00269 WriteReg(0x95, 0x08); 00270 00271 WriteReg(0x6c, 0x0a); 00272 WriteReg(0x6d, 0x55); 00273 WriteReg(0x6e, 0x11); 00274 WriteReg(0x6f, 0x9f); 00275 WriteReg(0x6a, 0x40); 00276 WriteReg(0x01, 0x40); 00277 WriteReg(0x02, 0x40); 00278 WriteReg(0x13, 0xe7); 00279 WriteReg(0x15, 0x02); 00280 00281 WriteReg(0x4f, 0x80); 00282 WriteReg(0x50, 0x80); 00283 WriteReg(0x51, 0x00); 00284 WriteReg(0x52, 0x22); 00285 WriteReg(0x53, 0x5e); 00286 WriteReg(0x54, 0x80); 00287 WriteReg(0x58, 0x9e); 00288 00289 WriteReg(0x41, 0x08); 00290 WriteReg(0x3f, 0x00); 00291 WriteReg(0x75, 0x05); 00292 WriteReg(0x76, 0xe1); 00293 WriteReg(0x4c, 0x00); 00294 WriteReg(0x77, 0x01); 00295 WriteReg(0x3d, 0xc1); 00296 WriteReg(0x4b, 0x09); 00297 WriteReg(0xc9, 0x60); 00298 WriteReg(0x41, 0x38); 00299 WriteReg(0x56, 0x40); 00300 00301 WriteReg(0x34, 0x11); 00302 WriteReg(0x3b, 0x02); 00303 WriteReg(0xa4, 0x88); 00304 WriteReg(0x96, 0x00); 00305 WriteReg(0x97, 0x30); 00306 WriteReg(0x98, 0x20); 00307 WriteReg(0x99, 0x30); 00308 WriteReg(0x9a, 0x84); 00309 WriteReg(0x9b, 0x29); 00310 WriteReg(0x9c, 0x03); 00311 WriteReg(0x9d, 0x4c); 00312 WriteReg(0x9e, 0x3f); 00313 WriteReg(0x78, 0x04); 00314 00315 WriteReg(0x79, 0x01); 00316 WriteReg(0xc8, 0xf0); 00317 WriteReg(0x79, 0x0f); 00318 WriteReg(0xc8, 0x00); 00319 WriteReg(0x79, 0x10); 00320 WriteReg(0xc8, 0x7e); 00321 WriteReg(0x79, 0x0a); 00322 WriteReg(0xc8, 0x80); 00323 WriteReg(0x79, 0x0b); 00324 WriteReg(0xc8, 0x01); 00325 WriteReg(0x79, 0x0c); 00326 WriteReg(0xc8, 0x0f); 00327 WriteReg(0x79, 0x0d); 00328 WriteReg(0xc8, 0x20); 00329 WriteReg(0x79, 0x09); 00330 WriteReg(0xc8, 0x80); 00331 WriteReg(0x79, 0x02); 00332 WriteReg(0xc8, 0xc0); 00333 WriteReg(0x79, 0x03); 00334 WriteReg(0xc8, 0x40); 00335 WriteReg(0x79, 0x05); 00336 WriteReg(0xc8, 0x30); 00337 WriteReg(0x79, 0x26); 00338 WriteReg(0x09, 0x03); 00339 WriteReg(0x3b, 0x42); 00340 00341 WriteReg(0xff, 0xff); /* END MARKER */ 00342 00343 } 00344 if(n == 76800) // 320*240 00345 { 00346 WriteReg(REG_COM14, 0x19); 00347 WriteReg(0x72, 0x11); 00348 WriteReg(0x73, 0xf1); 00349 WriteReg(REG_HREF, 0x24); 00350 WriteReg(REG_HSTART, 0x16); 00351 WriteReg(REG_HSTOP, 0x04); 00352 WriteReg(REG_VREF, 0x0a); 00353 WriteReg(REG_VSTART,0x02); 00354 WriteReg(REG_VSTOP, 0x7a); 00355 00356 WriteReg(0x7a, 0x20); 00357 WriteReg(0x7b, 0x1c); 00358 WriteReg(0x7c, 0x28); 00359 WriteReg(0x7d, 0x3c); 00360 WriteReg(0x7e, 0x55); 00361 WriteReg(0x7f, 0x68); 00362 WriteReg(0x80, 0x76); 00363 WriteReg(0x81, 0x80); 00364 WriteReg(0x82, 0x88); 00365 WriteReg(0x83, 0x8f); 00366 WriteReg(0x84, 0x96); 00367 WriteReg(0x85, 0xa3); 00368 WriteReg(0x86, 0xaf); 00369 WriteReg(0x87, 0xc4); 00370 WriteReg(0x88, 0xd7); 00371 WriteReg(0x89, 0xe8); 00372 00373 WriteReg(0x13, 0xe0); 00374 WriteReg(0x00, 0x00); 00375 WriteReg(0x10, 0x00); 00376 WriteReg(0x0d, 0x00); 00377 WriteReg(0x14, 0x28); 00378 WriteReg(0xa5, 0x05); 00379 WriteReg(0xab, 0x07); 00380 WriteReg(0x24, 0x75); 00381 WriteReg(0x25, 0x63); 00382 WriteReg(0x26, 0xA5); 00383 WriteReg(0x9f, 0x78); 00384 WriteReg(0xa0, 0x68); 00385 WriteReg(0xa1, 0x03); 00386 WriteReg(0xa6, 0xdf); 00387 WriteReg(0xa7, 0xdf); 00388 WriteReg(0xa8, 0xf0); 00389 WriteReg(0xa9, 0x90); 00390 WriteReg(0xaa, 0x94); 00391 WriteReg(0x13, 0xe5); 00392 00393 WriteReg(0x0e, 0x61); 00394 WriteReg(0x0f, 0x4b); 00395 WriteReg(0x16, 0x02); 00396 WriteReg(0x21, 0x02); 00397 WriteReg(0x22, 0x91); 00398 WriteReg(0x29, 0x07); 00399 WriteReg(0x33, 0x0b); 00400 WriteReg(0x35, 0x0b); 00401 WriteReg(0x37, 0x1d); 00402 WriteReg(0x38, 0x71); 00403 WriteReg(0x39, 0x2a); 00404 WriteReg(0x3c, 0x78); 00405 WriteReg(0x4d, 0x40); 00406 WriteReg(0x4e, 0x20); 00407 WriteReg(0x69, 0x00); 00408 WriteReg(0x6b, 0x00); 00409 WriteReg(0x74, 0x19); 00410 WriteReg(0x8d, 0x4f); 00411 WriteReg(0x8e, 0x00); 00412 WriteReg(0x8f, 0x00); 00413 WriteReg(0x90, 0x00); 00414 WriteReg(0x91, 0x00); 00415 WriteReg(0x92, 0x00); 00416 WriteReg(0x96, 0x00); 00417 WriteReg(0x9a, 0x80); 00418 WriteReg(0xb0, 0x84); 00419 WriteReg(0xb1, 0x0c); 00420 WriteReg(0xb2, 0x0e); 00421 WriteReg(0xb3, 0x82); 00422 WriteReg(0xb8, 0x0a); 00423 WriteReg(0x43, 0x14); 00424 WriteReg(0x44, 0xf0); 00425 WriteReg(0x45, 0x34); 00426 WriteReg(0x46, 0x58); 00427 WriteReg(0x47, 0x28); 00428 WriteReg(0x48, 0x3a); 00429 WriteReg(0x59, 0x88); 00430 WriteReg(0x5a, 0x88); 00431 WriteReg(0x5b, 0x44); 00432 WriteReg(0x5c, 0x67); 00433 WriteReg(0x5d, 0x49); 00434 WriteReg(0x5e, 0x0e); 00435 WriteReg(0x64, 0x04); 00436 WriteReg(0x65, 0x20); 00437 WriteReg(0x66, 0x05); 00438 WriteReg(0x94, 0x04); 00439 WriteReg(0x95, 0x08); 00440 WriteReg(0x6c, 0x0a); 00441 WriteReg(0x6d, 0x55); 00442 WriteReg(0x6e, 0x11); 00443 WriteReg(0x6f, 0x9f); 00444 WriteReg(0x6a, 0x40); 00445 WriteReg(0x01, 0x40); 00446 WriteReg(0x02, 0x40); 00447 WriteReg(0x13, 0xe7); 00448 WriteReg(0x15, 0x02); 00449 WriteReg(0x4f, 0x80); 00450 WriteReg(0x50, 0x80); 00451 WriteReg(0x51, 0x00); 00452 WriteReg(0x52, 0x22); 00453 WriteReg(0x53, 0x5e); 00454 WriteReg(0x54, 0x80); 00455 WriteReg(0x58, 0x9e); 00456 WriteReg(0x41, 0x08); 00457 WriteReg(0x3f, 0x00); 00458 WriteReg(0x75, 0x05); 00459 WriteReg(0x76, 0xe1); 00460 WriteReg(0x4c, 0x00); 00461 WriteReg(0x77, 0x01); 00462 WriteReg(0x3d, 0xc2); 00463 WriteReg(0x4b, 0x09); 00464 WriteReg(0xc9, 0x60); 00465 WriteReg(0x41, 0x38); 00466 WriteReg(0x56, 0x40); 00467 WriteReg(0x34, 0x11); 00468 WriteReg(0x3b, 0x02); 00469 WriteReg(0xa4, 0x89); 00470 WriteReg(0x96, 0x00); 00471 WriteReg(0x97, 0x30); 00472 WriteReg(0x98, 0x20); 00473 WriteReg(0x99, 0x30); 00474 WriteReg(0x9a, 0x84); 00475 WriteReg(0x9b, 0x29); 00476 WriteReg(0x9c, 0x03); 00477 WriteReg(0x9d, 0x4c); 00478 WriteReg(0x9e, 0x3f); 00479 WriteReg(0x78, 0x04); 00480 WriteReg(0x79, 0x01); 00481 WriteReg(0xc8, 0xf0); 00482 WriteReg(0x79, 0x0f); 00483 WriteReg(0xc8, 0x00); 00484 WriteReg(0x79, 0x10); 00485 WriteReg(0xc8, 0x7e); 00486 WriteReg(0x79, 0x0a); 00487 WriteReg(0xc8, 0x80); 00488 WriteReg(0x79, 0x0b); 00489 WriteReg(0xc8, 0x01); 00490 WriteReg(0x79, 0x0c); 00491 WriteReg(0xc8, 0x0f); 00492 WriteReg(0x79, 0x0d); 00493 WriteReg(0xc8, 0x20); 00494 WriteReg(0x79, 0x09); 00495 WriteReg(0xc8, 0x80); 00496 WriteReg(0x79, 0x02); 00497 WriteReg(0xc8, 0xc0); 00498 WriteReg(0x79, 0x03); 00499 WriteReg(0xc8, 0x40); 00500 WriteReg(0x79, 0x05); 00501 WriteReg(0xc8, 0x30); 00502 WriteReg(0x79, 0x26); 00503 WriteReg(0x09, 0x03); 00504 WriteReg(0x3b, 0x42); 00505 00506 WriteReg(0xff, 0xff); /* END MARKER */ 00507 00508 } 00509 if(n == 307200) // 640*480 00510 { 00511 WriteReg(REG_CLKRC, 0x01); 00512 WriteReg(REG_TSLB, 0x04); 00513 WriteReg(REG_COM7, 0x01); 00514 WriteReg(DBLV, 0x4a); 00515 WriteReg(REG_COM3, 0); 00516 WriteReg(REG_COM14, 0); 00517 00518 WriteReg(REG_HSTART, 0x13); 00519 WriteReg(REG_HSTOP, 0x01); 00520 WriteReg(REG_HREF, 0xb6); 00521 WriteReg(REG_VSTART, 0x02); 00522 WriteReg(REG_VSTOP, 0x7a); 00523 WriteReg(REG_VREF, 0x0a); 00524 WriteReg(0x72, 0x11); 00525 WriteReg(0x73, 0xf0); 00526 00527 /* Gamma curve values */ 00528 WriteReg(0x7a, 0x20); 00529 WriteReg(0x7b, 0x10); 00530 WriteReg(0x7c, 0x1e); 00531 WriteReg(0x7d, 0x35); 00532 WriteReg(0x7e, 0x5a); 00533 WriteReg(0x7f, 0x69); 00534 WriteReg(0x80, 0x76); 00535 WriteReg(0x81, 0x80); 00536 WriteReg(0x82, 0x88); 00537 WriteReg(0x83, 0x8f); 00538 WriteReg(0x84, 0x96); 00539 WriteReg(0x85, 0xa3); 00540 WriteReg(0x86, 0xaf); 00541 WriteReg(0x87, 0xc4); 00542 WriteReg(0x88, 0xd7); 00543 WriteReg(0x89, 0xe8); 00544 00545 /* AGC and AEC parameters. Note we start by disabling those features, 00546 then turn them only after tweaking the values. */ 00547 WriteReg(0x13, COM8_FASTAEC | COM8_AECSTEP | COM8_BFILT); 00548 WriteReg(0x00, 0); 00549 WriteReg(0x10, 0); 00550 WriteReg(0x0d, 0x40); 00551 WriteReg(0x14, 0x18); 00552 WriteReg(0xa5, 0x05); 00553 WriteReg(0xab, 0x07); 00554 WriteReg(0x24, 0x95); 00555 WriteReg(0x25, 0x33); 00556 WriteReg(0x26, 0xe3); 00557 WriteReg(0x9f, 0x78); 00558 WriteReg(0xa0, 0x68); 00559 WriteReg(0xa1, 0x03); 00560 WriteReg(0xa6, 0xd8); 00561 WriteReg(0xa7, 0xd8); 00562 WriteReg(0xa8, 0xf0); 00563 WriteReg(0xa9, 0x90); 00564 WriteReg(0xaa, 0x94); 00565 WriteReg(0x13, COM8_FASTAEC|COM8_AECSTEP|COM8_BFILT|COM8_AGC|COM8_AEC); 00566 00567 /* Almost all of these are magic "reserved" values. */ 00568 WriteReg(0x0e, 0x61); 00569 WriteReg(0x0f, 0x4b); 00570 WriteReg(0x16, 0x02); 00571 WriteReg(0x1e, 0x27); 00572 WriteReg(0x21, 0x02); 00573 WriteReg(0x22, 0x91); 00574 WriteReg(0x29, 0x07); 00575 WriteReg(0x33, 0x0b); 00576 WriteReg(0x35, 0x0b); 00577 WriteReg(0x37, 0x1d); 00578 WriteReg(0x38, 0x71); 00579 WriteReg(0x39, 0x2a); 00580 WriteReg(0x3c, 0x78); 00581 WriteReg(0x4d, 0x40); 00582 WriteReg(0x4e, 0x20); 00583 WriteReg(0x69, 0); 00584 WriteReg(0x6b, 0x0a); 00585 WriteReg(0x74, 0x10); 00586 WriteReg(0x8d, 0x4f); 00587 WriteReg(0x8e, 0); 00588 WriteReg(0x8f, 0); 00589 WriteReg(0x90, 0); 00590 WriteReg(0x91, 0); 00591 WriteReg(0x96, 0); 00592 WriteReg(0x9a, 0); 00593 WriteReg(0xb0, 0x84); 00594 WriteReg(0xb1, 0x0c); 00595 WriteReg(0xb2, 0x0e); 00596 WriteReg(0xb3, 0x82); 00597 WriteReg(0xb8, 0x0a); 00598 00599 /* More reserved magic, some of which tweaks white balance */ 00600 WriteReg(0x43, 0x0a); 00601 WriteReg(0x44, 0xf0); 00602 WriteReg(0x45, 0x34); 00603 WriteReg(0x46, 0x58); 00604 WriteReg(0x47, 0x28); 00605 WriteReg(0x48, 0x3a); 00606 WriteReg(0x59, 0x88); 00607 WriteReg(0x5a, 0x88); 00608 WriteReg(0x5b, 0x44); 00609 WriteReg(0x5c, 0x67); 00610 WriteReg(0x5d, 0x49); 00611 WriteReg(0x5e, 0x0e); 00612 WriteReg(0x6c, 0x0a); 00613 WriteReg(0x6d, 0x55); 00614 WriteReg(0x6e, 0x11); 00615 WriteReg(0x6f, 0x9f); 00616 WriteReg(0x6a, 0x40); 00617 WriteReg(0x01, 0x40); 00618 WriteReg(0x02, 0x60); 00619 WriteReg(0x13, COM8_FASTAEC|COM8_AECSTEP|COM8_BFILT|COM8_AGC|COM8_AEC|COM8_AWB); 00620 00621 /* Matrix coefficients */ 00622 WriteReg(0x4f, 0x80); 00623 WriteReg(0x50, 0x80); 00624 WriteReg(0x51, 0); 00625 WriteReg(0x52, 0x22); 00626 WriteReg(0x53, 0x5e); 00627 WriteReg(0x54, 0x80); 00628 WriteReg(0x58, 0x9e); 00629 00630 WriteReg(0x41, 0x08); 00631 WriteReg(0x3f, 0); 00632 WriteReg(0x75, 0x05); 00633 WriteReg(0x76, 0xe1); 00634 WriteReg(0x4c, 0); 00635 WriteReg(0x77, 0x01); 00636 WriteReg(0x3d, 0xc3); 00637 WriteReg(0x4b, 0x09); 00638 WriteReg(0xc9, 0x60); 00639 WriteReg(0x41, 0x38); 00640 WriteReg(0x56, 0x40); 00641 00642 WriteReg(0x34, 0x11); 00643 WriteReg(0x3b, COM11_EXP|COM11_HZAUTO); 00644 WriteReg(0xa4, 0x88); 00645 WriteReg(0x96, 0); 00646 WriteReg(0x97, 0x30); 00647 WriteReg(0x98, 0x20); 00648 WriteReg(0x99, 0x30); 00649 WriteReg(0x9a, 0x84); 00650 WriteReg(0x9b, 0x29); 00651 WriteReg(0x9c, 0x03); 00652 WriteReg(0x9d, 0x4c); 00653 WriteReg(0x9e, 0x3f); 00654 WriteReg(0x78, 0x04); 00655 00656 /* Extra-weird stuff. Some sort of multiplexor register */ 00657 WriteReg(0x79, 0x01); 00658 WriteReg(0xc8, 0xf0); 00659 WriteReg(0x79, 0x0f); 00660 WriteReg(0xc8, 0x00); 00661 WriteReg(0x79, 0x10); 00662 WriteReg(0xc8, 0x7e); 00663 WriteReg(0x79, 0x0a); 00664 WriteReg(0xc8, 0x80); 00665 WriteReg(0x79, 0x0b); 00666 WriteReg(0xc8, 0x01); 00667 WriteReg(0x79, 0x0c); 00668 WriteReg(0xc8, 0x0f); 00669 WriteReg(0x79, 0x0d); 00670 WriteReg(0xc8, 0x20); 00671 WriteReg(0x79, 0x09); 00672 WriteReg(0xc8, 0x80); 00673 WriteReg(0x79, 0x02); 00674 WriteReg(0xc8, 0xc0); 00675 WriteReg(0x79, 0x03); 00676 WriteReg(0xc8, 0x40); 00677 WriteReg(0x79, 0x05); 00678 WriteReg(0xc8, 0x30); 00679 WriteReg(0x79, 0x26); 00680 00681 WriteReg(0xff, 0xff); /* END MARKER */ 00682 } 00683 00684 return 1; 00685 } 00686 00687 00688 00689 00690 // write to camera 00691 void OV7670::WriteReg(int addr,int data) 00692 { 00693 _i2c.start(); 00694 _i2c.write(OV7670_WRITE); 00695 wait_us(OV7670_WRITEWAIT); 00696 _i2c.write(addr); 00697 wait_us(OV7670_WRITEWAIT); 00698 _i2c.write(data); 00699 _i2c.stop(); 00700 } 00701 00702 // read from camera 00703 int OV7670::ReadReg(int addr) 00704 { 00705 int data; 00706 00707 _i2c.start(); 00708 _i2c.write(OV7670_WRITE); 00709 wait_us(OV7670_WRITEWAIT); 00710 _i2c.write(addr); 00711 _i2c.stop(); 00712 wait_us(OV7670_WRITEWAIT); 00713 00714 _i2c.start(); 00715 _i2c.write(OV7670_READ); 00716 wait_us(OV7670_WRITEWAIT); 00717 data = _i2c.read(OV7670_NOACK); 00718 _i2c.stop(); 00719 00720 return data; 00721 }
Generated on Fri Jul 15 2022 05:03:45 by
1.7.2
