Fork of Edoardo De Marchi's ov7670 library. Works very similar, only few modification were made to support other boards.
Dependents: OV7670 application over USB with KL25Z
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, PortName 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(int mask1, int offset1, int mask2, int offset2) 00073 { 00074 int B1; 00075 rclk = 1; 00076 B1 = (((data & mask1) >> offset1) | ((data & mask2) >> offset2)); 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(0x00,0,0x00,0); //dummy 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 Thu Jul 21 2022 13:36:02 by 1.7.2