OV7670 without FIFO, SCCB protocol rewritten.
Fork of ov7670s by
ov7670s.cpp@2:7fa4be5a4952, 2017-09-26 (annotated)
- Committer:
- josephjins11
- Date:
- Tue Sep 26 09:17:55 2017 +0000
- Revision:
- 2:7fa4be5a4952
- Parent:
- 1:6fde2d3aea7b
hi
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sylvainkritter | 0:2530e24fafa1 | 1 | #include "mbed.h" |
josephjins11 | 2:7fa4be5a4952 | 2 | //#include "global.h" |
sylvainkritter | 0:2530e24fafa1 | 3 | #include "math.h" |
sylvainkritter | 0:2530e24fafa1 | 4 | #include "ov7670sreg.h" |
sylvainkritter | 0:2530e24fafa1 | 5 | #include "ov7670s.h" |
sylvainkritter | 0:2530e24fafa1 | 6 | #include "FastPWM.h" |
sylvainkritter | 0:2530e24fafa1 | 7 | #include "SPI_TFT_ILI9341.h" |
sylvainkritter | 0:2530e24fafa1 | 8 | |
sylvainkritter | 0:2530e24fafa1 | 9 | OV7670::OV7670( |
sylvainkritter | 0:2530e24fafa1 | 10 | PinName siod, // Camera I2C port data |
sylvainkritter | 0:2530e24fafa1 | 11 | PinName sioc, // Camera I2C port clock |
sylvainkritter | 0:2530e24fafa1 | 12 | PinName xclk, // Pixelclock |
sylvainkritter | 0:2530e24fafa1 | 13 | |
sylvainkritter | 0:2530e24fafa1 | 14 | PortName port, |
sylvainkritter | 0:2530e24fafa1 | 15 | int mask, |
sylvainkritter | 0:2530e24fafa1 | 16 | /* |
sylvainkritter | 0:2530e24fafa1 | 17 | XCLK |
sylvainkritter | 0:2530e24fafa1 | 18 | VSYNC |
sylvainkritter | 0:2530e24fafa1 | 19 | HREF |
sylvainkritter | 0:2530e24fafa1 | 20 | PinName d7, // D7 |
sylvainkritter | 0:2530e24fafa1 | 21 | PinName d6, // D6 |
sylvainkritter | 0:2530e24fafa1 | 22 | PinName d5, // D5 |
sylvainkritter | 0:2530e24fafa1 | 23 | PinName d4, // D4 |
sylvainkritter | 0:2530e24fafa1 | 24 | PinName d3, // D3 |
sylvainkritter | 0:2530e24fafa1 | 25 | PinName d2, // D2 |
sylvainkritter | 0:2530e24fafa1 | 26 | PinName d1, // D1 |
sylvainkritter | 0:2530e24fafa1 | 27 | PinName d0, // D0 |
sylvainkritter | 0:2530e24fafa1 | 28 | */ |
sylvainkritter | 0:2530e24fafa1 | 29 | PinName rst // /RESET |
sylvainkritter | 0:2530e24fafa1 | 30 | ):_siod(siod),_sioc(sioc),_xclk(xclk),data(port,mask),_rst(rst) |
sylvainkritter | 0:2530e24fafa1 | 31 | { |
sylvainkritter | 0:2530e24fafa1 | 32 | } |
sylvainkritter | 0:2530e24fafa1 | 33 | |
sylvainkritter | 0:2530e24fafa1 | 34 | //DigitalOut str(PB_3); // internal strobe for debug |
sylvainkritter | 0:2530e24fafa1 | 35 | //DigitalOut str1(PC_8); // internal strobe for debug |
sylvainkritter | 0:2530e24fafa1 | 36 | |
sylvainkritter | 0:2530e24fafa1 | 37 | void OV7670::Start() |
sylvainkritter | 0:2530e24fafa1 | 38 | { |
sylvainkritter | 0:2530e24fafa1 | 39 | _sioc=1; |
sylvainkritter | 0:2530e24fafa1 | 40 | _siod.output(); |
sylvainkritter | 0:2530e24fafa1 | 41 | _siod=1; |
sylvainkritter | 0:2530e24fafa1 | 42 | wait_us(OV7670_I2CFREQ); |
sylvainkritter | 0:2530e24fafa1 | 43 | _siod=0; |
sylvainkritter | 0:2530e24fafa1 | 44 | wait_us(OV7670_I2CFREQ); |
sylvainkritter | 0:2530e24fafa1 | 45 | _sioc=0; |
sylvainkritter | 0:2530e24fafa1 | 46 | wait_us(OV7670_I2CFREQ); |
sylvainkritter | 0:2530e24fafa1 | 47 | |
sylvainkritter | 0:2530e24fafa1 | 48 | } |
sylvainkritter | 0:2530e24fafa1 | 49 | void OV7670::End() |
sylvainkritter | 0:2530e24fafa1 | 50 | { |
sylvainkritter | 0:2530e24fafa1 | 51 | _sioc=0; |
sylvainkritter | 0:2530e24fafa1 | 52 | _siod.output(); |
sylvainkritter | 0:2530e24fafa1 | 53 | _siod=0; |
sylvainkritter | 0:2530e24fafa1 | 54 | wait_us(OV7670_I2CFREQ); |
sylvainkritter | 0:2530e24fafa1 | 55 | _sioc=1; |
sylvainkritter | 0:2530e24fafa1 | 56 | wait_us(OV7670_I2CFREQ); |
sylvainkritter | 0:2530e24fafa1 | 57 | _siod=1; |
sylvainkritter | 0:2530e24fafa1 | 58 | wait_us(OV7670_I2CFREQ); |
sylvainkritter | 0:2530e24fafa1 | 59 | _siod.input(); |
sylvainkritter | 0:2530e24fafa1 | 60 | wait_us(OV7670_I2CFREQ); |
sylvainkritter | 0:2530e24fafa1 | 61 | } |
sylvainkritter | 0:2530e24fafa1 | 62 | |
sylvainkritter | 0:2530e24fafa1 | 63 | void OV7670::Reset() |
sylvainkritter | 0:2530e24fafa1 | 64 | { |
sylvainkritter | 0:2530e24fafa1 | 65 | _sioc=1; |
sylvainkritter | 0:2530e24fafa1 | 66 | //str=0; |
sylvainkritter | 0:2530e24fafa1 | 67 | //str1=0; |
sylvainkritter | 0:2530e24fafa1 | 68 | _siod.input(); |
sylvainkritter | 0:2530e24fafa1 | 69 | _xclk.period_us(CAMERA_CLK_PERIOD); |
sylvainkritter | 0:2530e24fafa1 | 70 | _xclk.write(0.5); |
sylvainkritter | 0:2530e24fafa1 | 71 | _rst=1; |
sylvainkritter | 0:2530e24fafa1 | 72 | wait_us(1000); |
sylvainkritter | 0:2530e24fafa1 | 73 | _rst=0; |
sylvainkritter | 0:2530e24fafa1 | 74 | wait_us(1000); |
sylvainkritter | 0:2530e24fafa1 | 75 | _rst=1; |
sylvainkritter | 0:2530e24fafa1 | 76 | wait_us(1000); |
sylvainkritter | 0:2530e24fafa1 | 77 | WriteReg(0x12,0x80) ; // RESET CAMERA |
sylvainkritter | 0:2530e24fafa1 | 78 | wait_ms(300) ; |
sylvainkritter | 0:2530e24fafa1 | 79 | WriteReg(0x12,0x00); |
sylvainkritter | 0:2530e24fafa1 | 80 | wait_ms(300) ; |
sylvainkritter | 0:2530e24fafa1 | 81 | } |
sylvainkritter | 0:2530e24fafa1 | 82 | void OV7670::WriteBy(int addr) |
sylvainkritter | 0:2530e24fafa1 | 83 | { |
sylvainkritter | 0:2530e24fafa1 | 84 | int tempo=0; |
sylvainkritter | 0:2530e24fafa1 | 85 | _siod.output(); |
sylvainkritter | 0:2530e24fafa1 | 86 | wait_us(1); |
sylvainkritter | 0:2530e24fafa1 | 87 | _sioc=0; |
sylvainkritter | 0:2530e24fafa1 | 88 | _siod=1; |
sylvainkritter | 0:2530e24fafa1 | 89 | for (int i=0; i<8; i++) { |
sylvainkritter | 0:2530e24fafa1 | 90 | tempo=addr>>7-i; |
sylvainkritter | 0:2530e24fafa1 | 91 | tempo=tempo&0x01; |
sylvainkritter | 0:2530e24fafa1 | 92 | _sioc=0; |
sylvainkritter | 0:2530e24fafa1 | 93 | _siod=tempo;; |
sylvainkritter | 0:2530e24fafa1 | 94 | wait_us(OV7670_I2CFREQ); |
sylvainkritter | 0:2530e24fafa1 | 95 | _sioc=1; |
sylvainkritter | 0:2530e24fafa1 | 96 | wait_us(OV7670_I2CFREQ); |
sylvainkritter | 0:2530e24fafa1 | 97 | } |
sylvainkritter | 0:2530e24fafa1 | 98 | _sioc=0; |
sylvainkritter | 0:2530e24fafa1 | 99 | _siod=1; |
sylvainkritter | 0:2530e24fafa1 | 100 | _siod.input(); |
sylvainkritter | 0:2530e24fafa1 | 101 | wait_us(OV7670_I2CFREQ); |
sylvainkritter | 0:2530e24fafa1 | 102 | _sioc=1; |
sylvainkritter | 0:2530e24fafa1 | 103 | wait_us(OV7670_I2CFREQ); |
sylvainkritter | 0:2530e24fafa1 | 104 | _sioc=0; |
sylvainkritter | 0:2530e24fafa1 | 105 | } |
sylvainkritter | 0:2530e24fafa1 | 106 | |
sylvainkritter | 0:2530e24fafa1 | 107 | int OV7670::ReadBy() |
sylvainkritter | 0:2530e24fafa1 | 108 | { |
sylvainkritter | 0:2530e24fafa1 | 109 | unsigned char data[8]; |
sylvainkritter | 0:2530e24fafa1 | 110 | int tt=0; |
sylvainkritter | 0:2530e24fafa1 | 111 | _siod.input(); |
sylvainkritter | 0:2530e24fafa1 | 112 | _sioc=0; |
sylvainkritter | 0:2530e24fafa1 | 113 | for (int i=0; i<8; i++) { |
sylvainkritter | 0:2530e24fafa1 | 114 | _sioc=0; |
sylvainkritter | 0:2530e24fafa1 | 115 | wait_us(OV7670_I2CFREQ); |
sylvainkritter | 0:2530e24fafa1 | 116 | _sioc=1; |
sylvainkritter | 0:2530e24fafa1 | 117 | data[7-i]=_siod; |
sylvainkritter | 0:2530e24fafa1 | 118 | wait_us(OV7670_I2CFREQ); |
sylvainkritter | 0:2530e24fafa1 | 119 | } |
sylvainkritter | 0:2530e24fafa1 | 120 | _sioc=0; |
sylvainkritter | 0:2530e24fafa1 | 121 | for (int i=0; i<8; i++) { |
sylvainkritter | 0:2530e24fafa1 | 122 | tt=tt|data[7-i]; |
sylvainkritter | 0:2530e24fafa1 | 123 | if (i<7) { |
sylvainkritter | 0:2530e24fafa1 | 124 | tt=tt<<1; |
sylvainkritter | 0:2530e24fafa1 | 125 | } |
sylvainkritter | 0:2530e24fafa1 | 126 | } |
sylvainkritter | 0:2530e24fafa1 | 127 | _siod.output(); |
sylvainkritter | 0:2530e24fafa1 | 128 | _siod=1; |
sylvainkritter | 0:2530e24fafa1 | 129 | wait_us(OV7670_I2CFREQ); |
sylvainkritter | 0:2530e24fafa1 | 130 | _sioc=1; |
sylvainkritter | 0:2530e24fafa1 | 131 | wait_us(OV7670_I2CFREQ); |
sylvainkritter | 0:2530e24fafa1 | 132 | _sioc=0; |
sylvainkritter | 0:2530e24fafa1 | 133 | return tt; |
sylvainkritter | 0:2530e24fafa1 | 134 | } |
sylvainkritter | 0:2530e24fafa1 | 135 | |
sylvainkritter | 0:2530e24fafa1 | 136 | void OV7670::WriteReg2(int data) |
sylvainkritter | 0:2530e24fafa1 | 137 | { |
sylvainkritter | 0:2530e24fafa1 | 138 | Start(); |
sylvainkritter | 0:2530e24fafa1 | 139 | WriteBy(OV7670_WRITE); |
sylvainkritter | 0:2530e24fafa1 | 140 | WriteBy(data); |
sylvainkritter | 0:2530e24fafa1 | 141 | End(); |
sylvainkritter | 0:2530e24fafa1 | 142 | } |
sylvainkritter | 0:2530e24fafa1 | 143 | void OV7670::WriteReg(int subad,int data) |
sylvainkritter | 0:2530e24fafa1 | 144 | { |
sylvainkritter | 0:2530e24fafa1 | 145 | Start(); |
sylvainkritter | 0:2530e24fafa1 | 146 | WriteBy(OV7670_WRITE); |
sylvainkritter | 0:2530e24fafa1 | 147 | WriteBy(subad); |
sylvainkritter | 0:2530e24fafa1 | 148 | WriteBy(data); |
sylvainkritter | 0:2530e24fafa1 | 149 | End(); |
sylvainkritter | 0:2530e24fafa1 | 150 | } |
sylvainkritter | 0:2530e24fafa1 | 151 | void OV7670::capture(void) |
sylvainkritter | 0:2530e24fafa1 | 152 | { |
sylvainkritter | 0:2530e24fafa1 | 153 | pc.printf("capture requested \r\n"); |
sylvainkritter | 0:2530e24fafa1 | 154 | fp = fopen(desfile, "w"); |
sylvainkritter | 0:2530e24fafa1 | 155 | for (int i=0; i<38400; i++) { |
sylvainkritter | 0:2530e24fafa1 | 156 | fputc(bank[i], fp); |
sylvainkritter | 0:2530e24fafa1 | 157 | } |
sylvainkritter | 0:2530e24fafa1 | 158 | pc.printf("captured done \r\n"); |
sylvainkritter | 0:2530e24fafa1 | 159 | TFT.foreground(Green); |
sylvainkritter | 0:2530e24fafa1 | 160 | TFT.locate(0,0); |
sylvainkritter | 0:2530e24fafa1 | 161 | printf(" capture done"); |
sylvainkritter | 0:2530e24fafa1 | 162 | fclose(fp); |
sylvainkritter | 0:2530e24fafa1 | 163 | captur=false; |
sylvainkritter | 0:2530e24fafa1 | 164 | } |
sylvainkritter | 0:2530e24fafa1 | 165 | |
sylvainkritter | 0:2530e24fafa1 | 166 | int OV7670::ReadReg(int subad) |
sylvainkritter | 0:2530e24fafa1 | 167 | { |
sylvainkritter | 0:2530e24fafa1 | 168 | int dr=0; |
sylvainkritter | 0:2530e24fafa1 | 169 | WriteReg2(subad); |
sylvainkritter | 0:2530e24fafa1 | 170 | Start(); |
sylvainkritter | 0:2530e24fafa1 | 171 | WriteBy(OV7670_READ); |
sylvainkritter | 0:2530e24fafa1 | 172 | dr = ReadBy(); |
sylvainkritter | 0:2530e24fafa1 | 173 | End(); |
sylvainkritter | 0:2530e24fafa1 | 174 | return dr; |
sylvainkritter | 0:2530e24fafa1 | 175 | } |
sylvainkritter | 0:2530e24fafa1 | 176 | |
josephjins11 | 2:7fa4be5a4952 | 177 | /*void OV7670::exrgbf(int j) |
sylvainkritter | 0:2530e24fafa1 | 178 | { |
sylvainkritter | 0:2530e24fafa1 | 179 | |
sylvainkritter | 0:2530e24fafa1 | 180 | int ncl = nc*2; |
sylvainkritter | 0:2530e24fafa1 | 181 | int jn,jn1,d1,d2,d3; |
sylvainkritter | 0:2530e24fafa1 | 182 | jn =j*ncl/2; |
sylvainkritter | 0:2530e24fafa1 | 183 | jn1=(j/2)*ncl*nl/2; |
sylvainkritter | 0:2530e24fafa1 | 184 | |
sylvainkritter | 0:2530e24fafa1 | 185 | |
sylvainkritter | 0:2530e24fafa1 | 186 | |
sylvainkritter | 0:2530e24fafa1 | 187 | for(int k=0; k <nl/2; k++) { |
sylvainkritter | 0:2530e24fafa1 | 188 | |
sylvainkritter | 0:2530e24fafa1 | 189 | for (int i = jn; i< (j+1)*ncl/2; i=i+2) { |
sylvainkritter | 0:2530e24fafa1 | 190 | d1=2*(i-jn)+ncl*2*k; |
sylvainkritter | 0:2530e24fafa1 | 191 | d2=i+ncl*k+jn1; |
sylvainkritter | 0:2530e24fafa1 | 192 | d3=(2*(i-jn))+ ncl*(2*k+1); |
sylvainkritter | 0:2530e24fafa1 | 193 | bankf[d1]=bank[d2]; |
sylvainkritter | 0:2530e24fafa1 | 194 | bankf[d1+2]=bank[d2]; |
sylvainkritter | 0:2530e24fafa1 | 195 | bankf[d1+1]=bank[d2+1]; |
sylvainkritter | 0:2530e24fafa1 | 196 | bankf[d1+3]=bank[d2+1]; |
sylvainkritter | 0:2530e24fafa1 | 197 | |
sylvainkritter | 0:2530e24fafa1 | 198 | bankf[d3]=bank[d2]; |
sylvainkritter | 0:2530e24fafa1 | 199 | bankf[d3+2]=bank[d2]; |
sylvainkritter | 0:2530e24fafa1 | 200 | bankf[d3+1]=bank[d2+1]; |
sylvainkritter | 0:2530e24fafa1 | 201 | bankf[d3+3]=bank[d2+1]; |
sylvainkritter | 0:2530e24fafa1 | 202 | |
sylvainkritter | 0:2530e24fafa1 | 203 | } |
sylvainkritter | 0:2530e24fafa1 | 204 | |
sylvainkritter | 0:2530e24fafa1 | 205 | } |
josephjins11 | 2:7fa4be5a4952 | 206 | }*/ |
sylvainkritter | 0:2530e24fafa1 | 207 | |
sylvainkritter | 0:2530e24fafa1 | 208 | |
sylvainkritter | 0:2530e24fafa1 | 209 | // capture request |
sylvainkritter | 0:2530e24fafa1 | 210 | void OV7670::CaptureNext(void) |
sylvainkritter | 0:2530e24fafa1 | 211 | { |
sylvainkritter | 0:2530e24fafa1 | 212 | __disable_irq(); // Disable Interrupts |
sylvainkritter | 0:2530e24fafa1 | 213 | |
sylvainkritter | 0:2530e24fafa1 | 214 | bool cc=true; |
sylvainkritter | 0:2530e24fafa1 | 215 | bool h,c,v; |
sylvainkritter | 0:2530e24fafa1 | 216 | bool cpr=false; |
sylvainkritter | 0:2530e24fafa1 | 217 | int w; |
sylvainkritter | 0:2530e24fafa1 | 218 | w=data.read(); |
sylvainkritter | 0:2530e24fafa1 | 219 | v=w>>12; |
sylvainkritter | 0:2530e24fafa1 | 220 | // waitnegedge(v); |
sylvainkritter | 0:2530e24fafa1 | 221 | while(!v) { |
sylvainkritter | 0:2530e24fafa1 | 222 | w=data.read(); |
sylvainkritter | 0:2530e24fafa1 | 223 | v=w>>12; |
sylvainkritter | 0:2530e24fafa1 | 224 | }; |
sylvainkritter | 0:2530e24fafa1 | 225 | while(v) { |
sylvainkritter | 0:2530e24fafa1 | 226 | w=data.read(); |
sylvainkritter | 0:2530e24fafa1 | 227 | v=w>>12; |
sylvainkritter | 0:2530e24fafa1 | 228 | }; |
sylvainkritter | 0:2530e24fafa1 | 229 | if (captur) { |
sylvainkritter | 0:2530e24fafa1 | 230 | cpr=true; |
sylvainkritter | 0:2530e24fafa1 | 231 | captur=false; |
sylvainkritter | 0:2530e24fafa1 | 232 | } |
sylvainkritter | 0:2530e24fafa1 | 233 | //waitposedge(v); |
sylvainkritter | 0:2530e24fafa1 | 234 | while(v) { |
sylvainkritter | 0:2530e24fafa1 | 235 | w=data.read(); |
sylvainkritter | 0:2530e24fafa1 | 236 | v=w>>12; |
sylvainkritter | 0:2530e24fafa1 | 237 | }; |
sylvainkritter | 0:2530e24fafa1 | 238 | while(!v) { |
sylvainkritter | 0:2530e24fafa1 | 239 | w=data.read(); |
sylvainkritter | 0:2530e24fafa1 | 240 | v=w>>12; |
sylvainkritter | 0:2530e24fafa1 | 241 | }; |
sylvainkritter | 0:2530e24fafa1 | 242 | PixelCounter=0; |
sylvainkritter | 0:2530e24fafa1 | 243 | //Time.start(); |
sylvainkritter | 0:2530e24fafa1 | 244 | while (v) { |
sylvainkritter | 0:2530e24fafa1 | 245 | w=data.read(); |
sylvainkritter | 0:2530e24fafa1 | 246 | v=w>>12; |
sylvainkritter | 0:2530e24fafa1 | 247 | h=w>>11&0x01; |
sylvainkritter | 0:2530e24fafa1 | 248 | c=w>>10&0x01; |
sylvainkritter | 0:2530e24fafa1 | 249 | |
sylvainkritter | 0:2530e24fafa1 | 250 | if (!c && h ) { |
sylvainkritter | 0:2530e24fafa1 | 251 | cc=true; |
sylvainkritter | 0:2530e24fafa1 | 252 | } |
sylvainkritter | 0:2530e24fafa1 | 253 | if (cc && c && h) { |
sylvainkritter | 0:2530e24fafa1 | 254 | bank[PixelCounter]=w>>2; |
sylvainkritter | 0:2530e24fafa1 | 255 | PixelCounter++; |
sylvainkritter | 0:2530e24fafa1 | 256 | cc=false; |
sylvainkritter | 0:2530e24fafa1 | 257 | |
sylvainkritter | 0:2530e24fafa1 | 258 | } |
sylvainkritter | 0:2530e24fafa1 | 259 | } |
sylvainkritter | 0:2530e24fafa1 | 260 | |
sylvainkritter | 0:2530e24fafa1 | 261 | __enable_irq(); // Enable Interrupts |
sylvainkritter | 0:2530e24fafa1 | 262 | if (cpr) { |
sylvainkritter | 0:2530e24fafa1 | 263 | capture(); |
sylvainkritter | 0:2530e24fafa1 | 264 | cpr=false; |
sylvainkritter | 0:2530e24fafa1 | 265 | } |
sylvainkritter | 0:2530e24fafa1 | 266 | } |
sylvainkritter | 0:2530e24fafa1 | 267 | |
sylvainkritter | 0:2530e24fafa1 | 268 | unsigned char OV7670::reverse(unsigned char b) |
sylvainkritter | 0:2530e24fafa1 | 269 | { |
sylvainkritter | 0:2530e24fafa1 | 270 | b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; |
sylvainkritter | 0:2530e24fafa1 | 271 | b = (b & 0xCC) >> 2 | (b & 0x33) << 2; |
sylvainkritter | 0:2530e24fafa1 | 272 | b = (b & 0xAA) >> 1 | (b & 0x55) << 1; |
sylvainkritter | 0:2530e24fafa1 | 273 | return b; |
sylvainkritter | 0:2530e24fafa1 | 274 | } |
sylvainkritter | 0:2530e24fafa1 | 275 | |
sylvainkritter | 0:2530e24fafa1 | 276 | |
sylvainkritter | 0:2530e24fafa1 | 277 | |
sylvainkritter | 0:2530e24fafa1 | 278 | |
sylvainkritter | 0:2530e24fafa1 | 279 | int OV7670::Init(char *format, int n) |
sylvainkritter | 0:2530e24fafa1 | 280 | { |
sylvainkritter | 0:2530e24fafa1 | 281 | |
sylvainkritter | 0:2530e24fafa1 | 282 | if (ReadReg(REG_PID) != 0x76) { // check id camera |
sylvainkritter | 0:2530e24fafa1 | 283 | return 0; |
sylvainkritter | 0:2530e24fafa1 | 284 | } |
sylvainkritter | 0:2530e24fafa1 | 285 | |
sylvainkritter | 0:2530e24fafa1 | 286 | Reset(); // Resets all registers to default values |
sylvainkritter | 0:2530e24fafa1 | 287 | Reset(); // Resets all registers to default values |
sylvainkritter | 0:2530e24fafa1 | 288 | |
sylvainkritter | 0:2530e24fafa1 | 289 | WriteReg(REG_RGB444, 0x00); // Disable RGB444 |
sylvainkritter | 0:2530e24fafa1 | 290 | WriteReg(REG_COM10, 0x22); // 0x02 VSYNC negative (http://nasulica.homelinux.org/?p=959) |
sylvainkritter | 0:2530e24fafa1 | 291 | WriteReg(REG_MVFP, 0x27); // mirror image |
sylvainkritter | 0:2530e24fafa1 | 292 | |
sylvainkritter | 0:2530e24fafa1 | 293 | WriteReg(REG_CLKRC, 0x80); // prescaler x1 |
sylvainkritter | 0:2530e24fafa1 | 294 | WriteReg(DBLV, 0x0a); // bypass PLL |
sylvainkritter | 0:2530e24fafa1 | 295 | |
sylvainkritter | 0:2530e24fafa1 | 296 | WriteReg(REG_COM11, 0x0A) ; |
sylvainkritter | 0:2530e24fafa1 | 297 | WriteReg(REG_TSLB, 0x0D); // 0D = UYVY 04 = YUYV |
sylvainkritter | 0:2530e24fafa1 | 298 | WriteReg(REG_COM13, 0x88); // connect to REG_TSLB |
sylvainkritter | 0:2530e24fafa1 | 299 | |
sylvainkritter | 0:2530e24fafa1 | 300 | |
sylvainkritter | 0:2530e24fafa1 | 301 | if((strcmp("BAW", format) == 0) || (strcmp("YUV", format) == 0)|| (strcmp("RAW", format) == 0)) { // YUV |
sylvainkritter | 0:2530e24fafa1 | 302 | WriteReg(REG_COM7, 0x00); // YUV |
sylvainkritter | 0:2530e24fafa1 | 303 | WriteReg(REG_COM17, 0x00); // color bar disable |
sylvainkritter | 0:2530e24fafa1 | 304 | WriteReg(REG_COM3, 0x04); |
sylvainkritter | 0:2530e24fafa1 | 305 | WriteReg(REG_COM15, 0xC0); // Set normal rgb with Full range |
sylvainkritter | 0:2530e24fafa1 | 306 | |
sylvainkritter | 0:2530e24fafa1 | 307 | } else if((strcmp("RGB", format) == 0)) { // RGB565 |
sylvainkritter | 0:2530e24fafa1 | 308 | WriteReg(REG_COM7, 0x04); // RGB + color bar disable |
sylvainkritter | 0:2530e24fafa1 | 309 | WriteReg(REG_RGB444, 0x00); // Disable RGB444 |
sylvainkritter | 0:2530e24fafa1 | 310 | WriteReg(REG_COM15, 0x10); // Set rgb565 with Full range 0xD0 |
sylvainkritter | 0:2530e24fafa1 | 311 | WriteReg(REG_COM3, 0x04);//0x44 |
sylvainkritter | 0:2530e24fafa1 | 312 | //WriteReg(REG_COM1, 0x40); |
sylvainkritter | 0:2530e24fafa1 | 313 | WriteReg(REG_CLKRC, 0x80); // prescaler x1 |
sylvainkritter | 0:2530e24fafa1 | 314 | } |
sylvainkritter | 0:2530e24fafa1 | 315 | |
sylvainkritter | 0:2530e24fafa1 | 316 | WriteReg(0x70, 0x3A); // Scaling Xsc |
sylvainkritter | 0:2530e24fafa1 | 317 | WriteReg(0x71, 0x35); // Scaling Ysc |
sylvainkritter | 0:2530e24fafa1 | 318 | WriteReg(0xA2, 0x02); // pixel clock delay |
sylvainkritter | 0:2530e24fafa1 | 319 | |
sylvainkritter | 0:2530e24fafa1 | 320 | if(n == 19200) { // 160*120 |
sylvainkritter | 0:2530e24fafa1 | 321 | WriteReg(REG_COM14, 0x1a); // divide by 4 |
sylvainkritter | 0:2530e24fafa1 | 322 | WriteReg(0x72, 0x22); // downsample by 4 |
sylvainkritter | 0:2530e24fafa1 | 323 | WriteReg(0x73, 0xf2); // divide by 4 |
sylvainkritter | 0:2530e24fafa1 | 324 | WriteReg(REG_HREF, 0x24);//a4 |
sylvainkritter | 0:2530e24fafa1 | 325 | WriteReg(REG_HSTART, 0x16); |
sylvainkritter | 0:2530e24fafa1 | 326 | WriteReg(REG_HSTOP, 0x04); |
sylvainkritter | 0:2530e24fafa1 | 327 | WriteReg(REG_VREF, 0x0a);//0a |
sylvainkritter | 0:2530e24fafa1 | 328 | WriteReg(REG_VSTART, 0x02); |
sylvainkritter | 0:2530e24fafa1 | 329 | WriteReg(REG_VSTOP, 0x7a); |
sylvainkritter | 0:2530e24fafa1 | 330 | |
sylvainkritter | 0:2530e24fafa1 | 331 | |
sylvainkritter | 0:2530e24fafa1 | 332 | WriteReg(0x7a, 0x20); |
sylvainkritter | 0:2530e24fafa1 | 333 | WriteReg(0x7b, 0x1c); |
sylvainkritter | 0:2530e24fafa1 | 334 | WriteReg(0x7c, 0x28); |
sylvainkritter | 0:2530e24fafa1 | 335 | WriteReg(0x7d, 0x3c); |
sylvainkritter | 0:2530e24fafa1 | 336 | WriteReg(0x7e, 0x5a); |
sylvainkritter | 0:2530e24fafa1 | 337 | WriteReg(0x7f, 0x68); |
sylvainkritter | 0:2530e24fafa1 | 338 | WriteReg(0x80, 0x76); |
sylvainkritter | 0:2530e24fafa1 | 339 | WriteReg(0x81, 0x80); |
sylvainkritter | 0:2530e24fafa1 | 340 | WriteReg(0x82, 0x88); |
sylvainkritter | 0:2530e24fafa1 | 341 | WriteReg(0x83, 0x8f); |
sylvainkritter | 0:2530e24fafa1 | 342 | WriteReg(0x84, 0x96); |
sylvainkritter | 0:2530e24fafa1 | 343 | WriteReg(0x85, 0xa3); |
sylvainkritter | 0:2530e24fafa1 | 344 | WriteReg(0x86, 0xaf); |
sylvainkritter | 0:2530e24fafa1 | 345 | WriteReg(0x87, 0xc4); |
sylvainkritter | 0:2530e24fafa1 | 346 | WriteReg(0x88, 0xd7); |
sylvainkritter | 0:2530e24fafa1 | 347 | WriteReg(0x89, 0xe8); |
sylvainkritter | 0:2530e24fafa1 | 348 | |
sylvainkritter | 0:2530e24fafa1 | 349 | WriteReg(0x13, 0xe0); |
sylvainkritter | 0:2530e24fafa1 | 350 | WriteReg(0x00, 0x00); |
sylvainkritter | 0:2530e24fafa1 | 351 | WriteReg(0x10, 0x00); |
sylvainkritter | 0:2530e24fafa1 | 352 | WriteReg(0x0d, 0x40); |
sylvainkritter | 0:2530e24fafa1 | 353 | WriteReg(0x14, 0x18); |
sylvainkritter | 0:2530e24fafa1 | 354 | WriteReg(0xa5, 0x05); |
sylvainkritter | 0:2530e24fafa1 | 355 | WriteReg(0xab, 0x07); |
sylvainkritter | 0:2530e24fafa1 | 356 | WriteReg(0x24, 0x95); |
sylvainkritter | 0:2530e24fafa1 | 357 | WriteReg(0x25, 0x33); |
sylvainkritter | 0:2530e24fafa1 | 358 | WriteReg(0x26, 0xe3); |
sylvainkritter | 0:2530e24fafa1 | 359 | WriteReg(0x9f, 0x78); |
sylvainkritter | 0:2530e24fafa1 | 360 | WriteReg(0xa0, 0x68); |
sylvainkritter | 0:2530e24fafa1 | 361 | WriteReg(0xa1, 0x03); |
sylvainkritter | 0:2530e24fafa1 | 362 | WriteReg(0xa6, 0xd8); |
sylvainkritter | 0:2530e24fafa1 | 363 | WriteReg(0xa7, 0xd8); |
sylvainkritter | 0:2530e24fafa1 | 364 | WriteReg(0xa8, 0xf0); |
sylvainkritter | 0:2530e24fafa1 | 365 | WriteReg(0xa9, 0x90); |
sylvainkritter | 0:2530e24fafa1 | 366 | WriteReg(0xaa, 0x94); |
sylvainkritter | 0:2530e24fafa1 | 367 | WriteReg(0x13, 0xe5); |
sylvainkritter | 0:2530e24fafa1 | 368 | |
sylvainkritter | 0:2530e24fafa1 | 369 | WriteReg(0x0e, 0x61); |
sylvainkritter | 0:2530e24fafa1 | 370 | WriteReg(0x0f, 0x4b); |
sylvainkritter | 0:2530e24fafa1 | 371 | WriteReg(0x16, 0x02); |
sylvainkritter | 0:2530e24fafa1 | 372 | |
sylvainkritter | 0:2530e24fafa1 | 373 | WriteReg(0x21, 0x02); |
sylvainkritter | 0:2530e24fafa1 | 374 | WriteReg(0x22, 0x91); |
sylvainkritter | 0:2530e24fafa1 | 375 | WriteReg(0x29, 0x07); |
sylvainkritter | 0:2530e24fafa1 | 376 | WriteReg(0x33, 0x0b); |
sylvainkritter | 0:2530e24fafa1 | 377 | WriteReg(0x35, 0x0b); |
sylvainkritter | 0:2530e24fafa1 | 378 | WriteReg(0x37, 0x1d); |
sylvainkritter | 0:2530e24fafa1 | 379 | WriteReg(0x38, 0x71); |
sylvainkritter | 0:2530e24fafa1 | 380 | WriteReg(0x39, 0x2a); |
sylvainkritter | 0:2530e24fafa1 | 381 | WriteReg(0x3c, 0x78); |
sylvainkritter | 0:2530e24fafa1 | 382 | WriteReg(0x4d, 0x40); |
sylvainkritter | 0:2530e24fafa1 | 383 | WriteReg(0x4e, 0x20); |
sylvainkritter | 0:2530e24fafa1 | 384 | WriteReg(0x69, 0x00); |
sylvainkritter | 0:2530e24fafa1 | 385 | |
sylvainkritter | 0:2530e24fafa1 | 386 | WriteReg(0x74, 0x10); |
sylvainkritter | 0:2530e24fafa1 | 387 | WriteReg(0x8d, 0x4f); |
sylvainkritter | 0:2530e24fafa1 | 388 | WriteReg(0x8e, 0x00); |
sylvainkritter | 0:2530e24fafa1 | 389 | WriteReg(0x8f, 0x00); |
sylvainkritter | 0:2530e24fafa1 | 390 | WriteReg(0x90, 0x00); |
sylvainkritter | 0:2530e24fafa1 | 391 | WriteReg(0x91, 0x00); |
sylvainkritter | 0:2530e24fafa1 | 392 | WriteReg(0x92, 0x00); |
sylvainkritter | 0:2530e24fafa1 | 393 | |
sylvainkritter | 0:2530e24fafa1 | 394 | WriteReg(0x96, 0x00); |
sylvainkritter | 0:2530e24fafa1 | 395 | WriteReg(0x9a, 0x80); |
sylvainkritter | 0:2530e24fafa1 | 396 | WriteReg(0xb0, 0x84); |
sylvainkritter | 0:2530e24fafa1 | 397 | WriteReg(0xb1, 0x0c); |
sylvainkritter | 0:2530e24fafa1 | 398 | WriteReg(0xb2, 0x0e); |
sylvainkritter | 0:2530e24fafa1 | 399 | WriteReg(0xb3, 0x82); |
sylvainkritter | 0:2530e24fafa1 | 400 | WriteReg(0xb8, 0x0a); |
sylvainkritter | 0:2530e24fafa1 | 401 | |
sylvainkritter | 0:2530e24fafa1 | 402 | WriteReg(0x43, 0x0a); |
sylvainkritter | 0:2530e24fafa1 | 403 | WriteReg(0x44, 0xf0); |
sylvainkritter | 0:2530e24fafa1 | 404 | WriteReg(0x45, 0x34); |
sylvainkritter | 0:2530e24fafa1 | 405 | WriteReg(0x46, 0x58); |
sylvainkritter | 0:2530e24fafa1 | 406 | WriteReg(0x47, 0x28); |
sylvainkritter | 0:2530e24fafa1 | 407 | WriteReg(0x48, 0x3a); |
sylvainkritter | 0:2530e24fafa1 | 408 | WriteReg(0x59, 0x88); |
sylvainkritter | 0:2530e24fafa1 | 409 | WriteReg(0x5a, 0x88); |
sylvainkritter | 0:2530e24fafa1 | 410 | WriteReg(0x5b, 0x44); |
sylvainkritter | 0:2530e24fafa1 | 411 | WriteReg(0x5c, 0x67); |
sylvainkritter | 0:2530e24fafa1 | 412 | WriteReg(0x5d, 0x49); |
sylvainkritter | 0:2530e24fafa1 | 413 | WriteReg(0x5e, 0x0e); |
sylvainkritter | 0:2530e24fafa1 | 414 | WriteReg(0x64, 0x04); |
sylvainkritter | 0:2530e24fafa1 | 415 | WriteReg(0x65, 0x20); |
sylvainkritter | 0:2530e24fafa1 | 416 | WriteReg(0x66, 0x05); |
sylvainkritter | 0:2530e24fafa1 | 417 | WriteReg(0x94, 0x04); |
sylvainkritter | 0:2530e24fafa1 | 418 | WriteReg(0x95, 0x08); |
sylvainkritter | 0:2530e24fafa1 | 419 | |
sylvainkritter | 0:2530e24fafa1 | 420 | WriteReg(0x6c, 0x0a); |
sylvainkritter | 0:2530e24fafa1 | 421 | WriteReg(0x6d, 0x55); |
sylvainkritter | 0:2530e24fafa1 | 422 | WriteReg(0x6e, 0x11); |
sylvainkritter | 0:2530e24fafa1 | 423 | WriteReg(0x6f, 0x9f); |
sylvainkritter | 0:2530e24fafa1 | 424 | WriteReg(0x6a, 0x40); |
sylvainkritter | 0:2530e24fafa1 | 425 | WriteReg(0x01, 0x40); |
sylvainkritter | 0:2530e24fafa1 | 426 | WriteReg(0x02, 0x40); |
sylvainkritter | 0:2530e24fafa1 | 427 | WriteReg(0x13, 0xe7); |
sylvainkritter | 0:2530e24fafa1 | 428 | WriteReg(0x15, 0x02); |
sylvainkritter | 0:2530e24fafa1 | 429 | |
sylvainkritter | 0:2530e24fafa1 | 430 | WriteReg(0x4f, 0x80); |
sylvainkritter | 0:2530e24fafa1 | 431 | WriteReg(0x50, 0x80); |
sylvainkritter | 0:2530e24fafa1 | 432 | WriteReg(0x51, 0x00); |
sylvainkritter | 0:2530e24fafa1 | 433 | WriteReg(0x52, 0x22); |
sylvainkritter | 0:2530e24fafa1 | 434 | WriteReg(0x53, 0x5e); |
sylvainkritter | 0:2530e24fafa1 | 435 | WriteReg(0x54, 0x80); |
sylvainkritter | 0:2530e24fafa1 | 436 | WriteReg(0x58, 0x9e); |
sylvainkritter | 0:2530e24fafa1 | 437 | |
sylvainkritter | 0:2530e24fafa1 | 438 | WriteReg(0x41, 0x08); |
sylvainkritter | 0:2530e24fafa1 | 439 | WriteReg(0x3f, 0x00); |
sylvainkritter | 0:2530e24fafa1 | 440 | WriteReg(0x75, 0x05); |
sylvainkritter | 0:2530e24fafa1 | 441 | WriteReg(0x76, 0xe1); |
sylvainkritter | 0:2530e24fafa1 | 442 | WriteReg(0x4c, 0x00); |
sylvainkritter | 0:2530e24fafa1 | 443 | WriteReg(0x77, 0x01); |
sylvainkritter | 0:2530e24fafa1 | 444 | WriteReg(0x3d, 0xc1); |
sylvainkritter | 0:2530e24fafa1 | 445 | WriteReg(0x4b, 0x09); |
sylvainkritter | 0:2530e24fafa1 | 446 | WriteReg(0xc9, 0x60); |
sylvainkritter | 0:2530e24fafa1 | 447 | WriteReg(0x41, 0x38); |
sylvainkritter | 0:2530e24fafa1 | 448 | WriteReg(0x56, 0x40); |
sylvainkritter | 0:2530e24fafa1 | 449 | |
sylvainkritter | 0:2530e24fafa1 | 450 | WriteReg(0x34, 0x11); |
sylvainkritter | 0:2530e24fafa1 | 451 | WriteReg(0x3b, 0x02); |
sylvainkritter | 0:2530e24fafa1 | 452 | WriteReg(0xa4, 0x88); |
sylvainkritter | 0:2530e24fafa1 | 453 | WriteReg(0x96, 0x00); |
sylvainkritter | 0:2530e24fafa1 | 454 | WriteReg(0x97, 0x30); |
sylvainkritter | 0:2530e24fafa1 | 455 | WriteReg(0x98, 0x20); |
sylvainkritter | 0:2530e24fafa1 | 456 | WriteReg(0x99, 0x30); |
sylvainkritter | 0:2530e24fafa1 | 457 | WriteReg(0x9a, 0x84); |
sylvainkritter | 0:2530e24fafa1 | 458 | WriteReg(0x9b, 0x29); |
sylvainkritter | 0:2530e24fafa1 | 459 | WriteReg(0x9c, 0x03); |
sylvainkritter | 0:2530e24fafa1 | 460 | WriteReg(0x9d, 0x4c); |
sylvainkritter | 0:2530e24fafa1 | 461 | WriteReg(0x9e, 0x3f); |
sylvainkritter | 0:2530e24fafa1 | 462 | WriteReg(0x78, 0x04); |
sylvainkritter | 0:2530e24fafa1 | 463 | |
sylvainkritter | 0:2530e24fafa1 | 464 | WriteReg(0x79, 0x01); |
sylvainkritter | 0:2530e24fafa1 | 465 | WriteReg(0xc8, 0xf0); |
sylvainkritter | 0:2530e24fafa1 | 466 | WriteReg(0x79, 0x0f); |
sylvainkritter | 0:2530e24fafa1 | 467 | WriteReg(0xc8, 0x00); |
sylvainkritter | 0:2530e24fafa1 | 468 | WriteReg(0x79, 0x10); |
sylvainkritter | 0:2530e24fafa1 | 469 | WriteReg(0xc8, 0x7e); |
sylvainkritter | 0:2530e24fafa1 | 470 | WriteReg(0x79, 0x0a); |
sylvainkritter | 0:2530e24fafa1 | 471 | WriteReg(0xc8, 0x80); |
sylvainkritter | 0:2530e24fafa1 | 472 | WriteReg(0x79, 0x0b); |
sylvainkritter | 0:2530e24fafa1 | 473 | WriteReg(0xc8, 0x01); |
sylvainkritter | 0:2530e24fafa1 | 474 | WriteReg(0x79, 0x0c); |
sylvainkritter | 0:2530e24fafa1 | 475 | WriteReg(0xc8, 0x0f); |
sylvainkritter | 0:2530e24fafa1 | 476 | WriteReg(0x79, 0x0d); |
sylvainkritter | 0:2530e24fafa1 | 477 | WriteReg(0xc8, 0x20); |
sylvainkritter | 0:2530e24fafa1 | 478 | WriteReg(0x79, 0x09); |
sylvainkritter | 0:2530e24fafa1 | 479 | WriteReg(0xc8, 0x80); |
sylvainkritter | 0:2530e24fafa1 | 480 | WriteReg(0x79, 0x02); |
sylvainkritter | 0:2530e24fafa1 | 481 | WriteReg(0xc8, 0xc0); |
sylvainkritter | 0:2530e24fafa1 | 482 | WriteReg(0x79, 0x03); |
sylvainkritter | 0:2530e24fafa1 | 483 | WriteReg(0xc8, 0x40); |
sylvainkritter | 0:2530e24fafa1 | 484 | WriteReg(0x79, 0x05); |
sylvainkritter | 0:2530e24fafa1 | 485 | WriteReg(0xc8, 0x30); |
sylvainkritter | 0:2530e24fafa1 | 486 | WriteReg(0x79, 0x26); |
sylvainkritter | 0:2530e24fafa1 | 487 | WriteReg(0x09, 0x03); |
sylvainkritter | 0:2530e24fafa1 | 488 | WriteReg(0x3b, 0x42); |
sylvainkritter | 0:2530e24fafa1 | 489 | |
sylvainkritter | 0:2530e24fafa1 | 490 | WriteReg(0xff, 0xff); /* END MARKER */ |
sylvainkritter | 0:2530e24fafa1 | 491 | WriteReg(DBLV, 0x4a); // clock multiplication by 4 4a |
sylvainkritter | 0:2530e24fafa1 | 492 | //WriteReg(REG_CLKRC, 0x80); // prescaler x1 |
sylvainkritter | 0:2530e24fafa1 | 493 | WriteReg(REG_CLKRC, 0x03); // prescaler x2 |
sylvainkritter | 0:2530e24fafa1 | 494 | } |
sylvainkritter | 0:2530e24fafa1 | 495 | if(n == 76800) { // 320*240 |
sylvainkritter | 0:2530e24fafa1 | 496 | |
sylvainkritter | 0:2530e24fafa1 | 497 | |
sylvainkritter | 0:2530e24fafa1 | 498 | } |
sylvainkritter | 0:2530e24fafa1 | 499 | if(n == 307200) { // 640*480 |
sylvainkritter | 0:2530e24fafa1 | 500 | |
sylvainkritter | 0:2530e24fafa1 | 501 | } |
sylvainkritter | 0:2530e24fafa1 | 502 | |
sylvainkritter | 0:2530e24fafa1 | 503 | return 1; |
sylvainkritter | 1:6fde2d3aea7b | 504 | } |