Kang mingyo / ov7670

Dependents:   OV7670_make

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ov7670.cpp Source File

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 }