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