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