OV7670 without FIFO, SCCB protocol rewritten.

Dependents:   mycame wd_camera

Committer:
sylvainkritter
Date:
Tue Feb 16 14:37:26 2016 +0000
Revision:
1:6fde2d3aea7b
Parent:
0:2530e24fafa1
clean up

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sylvainkritter 0:2530e24fafa1 1 #include "mbed.h"
sylvainkritter 0:2530e24fafa1 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
sylvainkritter 0:2530e24fafa1 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 }
sylvainkritter 0:2530e24fafa1 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 }