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