Advertisement
Guest User

ov7670 raw bayer capture arduino uno

a guest
Apr 13th, 2013
1,455
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.03 KB | None | 0 0
  1. #include <Wire.h>
  2. #include <SdFat.h>
  3. #include <SdFatUtil.h>
  4. // file system
  5. uint8_t buf2[512];
  6. SdFat sd;
  7. //uint8_t* buf;
  8. // test file
  9. SdFile file;
  10. // SD chip select pin
  11. const uint8_t chipSelect = 9;
  12. uint8_t sensor_addr = 0x42;
  13. #define REG_COM1 0x04 /* Control 1 */
  14. #define REG_COM7 0x12 /* Control 7 */
  15. #define COM7_RESET 0x80 /* Register reset */
  16. #define COM7_FMT_MASK 0x38
  17. #define COM7_FMT_VGA 0x00
  18. #define COM7_FMT_CIF 0x20 /* CIF format */
  19. #define COM7_FMT_QVGA 0x10 /* QVGA format */
  20. #define COM7_FMT_QCIF 0x08 /* QCIF format */
  21. #define COM7_RGB 0x04 /* bits 0 and 2 - RGB format */
  22. #define COM7_YUV 0x00 /* YUV */
  23. #define COM7_BAYER 0x01 /* Bayer format */
  24. #define COM7_PBAYER 0x05 /* "Processed bayer" */
  25. #define REG_RGB444 0x8c /* RGB 444 control */
  26. #define R444_ENABLE 0x02 /* Turn on RGB444, overrides 5x5 */
  27. #define R444_RGBX 0x01 /* Empty nibble at end */
  28. #define REG_COM9 0x14 /* Control 9 - gain ceiling */
  29. #define REG_COM10 0x15 /* Control 10 */
  30. #define REG_COM13 0x3d /* Control 13 */
  31. #define COM13_GAMMA 0x80 /* Gamma enable */
  32. #define COM13_UVSAT 0x40 /* UV saturation auto adjustment */
  33. #define COM13_UVSWAP 0x01 /* V before U - w/TSLB */
  34. #define REG_COM15 0x40 /* Control 15 */
  35. #define COM15_R10F0 0x00 /* Data range 10 to F0 */
  36. #define COM15_R01FE 0x80 /* 01 to FE */
  37. #define COM15_R00FF 0xc0 /* 00 to FF */
  38. #define COM15_RGB565 0x10 /* RGB565 output */
  39. #define COM15_RGB555 0x30 /* RGB555 output */
  40. #define REG_COM11 0x3b /* Control 11 */
  41. #define COM11_NIGHT 0x80 /* NIght mode enable */
  42. #define COM11_NMFR 0x60 /* Two bit NM frame rate */
  43. #define COM11_HZAUTO 0x10 /* Auto detect 50/60 Hz */
  44. #define COM11_50HZ 0x08 /* Manual 50Hz select */
  45. #define COM11_EXP 0x02
  46. #define REG_COM16 0x41 /* Control 16 */
  47. #define COM16_AWBGAIN 0x08 /* AWB gain enable */
  48. #define REG_COM17 0x42 /* Control 17 */
  49. #define COM17_AECWIN 0xc0 /* AEC window - must match COM4 */
  50. #define COM17_CBAR 0x08 /* DSP Color bar */
  51. #define REG_TSLB 0x3a /* lots of stuff */
  52. #define TSLB_YLAST 0x04 /* UYVY or VYUY - see com13 */
  53. #define MTX1 0x4f /* Matrix Coefficient 1 */
  54. #define MTX2 0x50 /* Matrix Coefficient 2 */
  55. #define MTX3 0x51 /* Matrix Coefficient 3 */
  56. #define MTX4 0x52 /* Matrix Coefficient 4 */
  57. #define MTX5 0x53 /* Matrix Coefficient 5 */
  58. #define MTX6 0x54 /* Matrix Coefficient 6 */
  59. #define REG_CONTRAS 0x56 /* Contrast control */
  60. #define MTXS 0x58 /* Matrix Coefficient Sign */
  61. #define AWBC7 0x59 /* AWB Control 7 */
  62. #define AWBC8 0x5a /* AWB Control 8 */
  63. #define AWBC9 0x5b /* AWB Control 9 */
  64. #define AWBC10 0x5c /* AWB Control 10 */
  65. #define AWBC11 0x5d /* AWB Control 11 */
  66. #define AWBC12 0x5e /* AWB Control 12 */
  67. #define REG_GFIX 0x69 /* Fix gain control */
  68. #define GGAIN 0x6a /* G Channel AWB Gain */
  69. #define DBLV 0x6b
  70. #define AWBCTR3 0x6c /* AWB Control 3 */
  71. #define AWBCTR2 0x6d /* AWB Control 2 */
  72. #define AWBCTR1 0x6e /* AWB Control 1 */
  73. #define AWBCTR0 0x6f /* AWB Control 0 */
  74. #define REG_COM8 0x13 /* Control 8 */
  75. #define COM8_FASTAEC 0x80 /* Enable fast AGC/AEC */
  76. #define COM8_AECSTEP 0x40 /* Unlimited AEC step size */
  77. #define COM8_BFILT 0x20 /* Band filter enable */
  78. #define COM8_AGC 0x04 /* Auto gain enable */
  79. #define COM8_AWB 0x02 /* White balance enable */
  80. #define COM8_AEC 0x01 /* Auto exposure enable */
  81. #define REG_COM3 0x0c /* Control 3 */
  82. #define COM3_SWAP 0x40 /* Byte swap */
  83. #define COM3_SCALEEN 0x08 /* Enable scaling */
  84. #define COM3_DCWEN 0x04 /* Enable downsamp/crop/window */
  85. #define REG_BRIGHT 0x55 /* Brightness */
  86. // Serial output stream
  87. // store error strings in flash to save RAM
  88. uint32_t bgnBlock, endBlock;
  89. #define error(s) sd.errorHalt_P(PSTR(s))
  90. #define useSdCard PORTB|=4; PORTB&=~2
  91. #define UseFastWR
  92. #define useLed
  93. void setup()
  94. {
  95. Wire.begin();
  96. pinMode(10,OUTPUT);
  97. digitalWrite(10,HIGH);
  98. DDRB|=47;//clock as output and SPI pins as output except MISO
  99. PORTB|=6;//set both CS pins to high
  100. DDRC&=~15;//low d0-d3 camera
  101. DDRD&=~252;//d7-d4 and interupt pins
  102. #ifdef useLed
  103. DDRD|=1;//pin 0 as output
  104. PORTD&=~1;//turn off led
  105. //set pin 1 as input
  106. DDRD&=~2;
  107. PORTB|=2;//enable pullup
  108. #endif
  109. //DDRB&=~2;//href as input
  110. //EICRA=11;//int0 rising int1 falling
  111. //EIMSK=2;//disable int0 and enable int1
  112. //disable pin change interupt
  113. //PCICR=0;
  114. //PCMSK0=2;
  115.  
  116. //set up twi for 100khz
  117. TWSR&=~3;//disable prescaler for TWI
  118. TWBR=72;//set to 100khz
  119. //enable serial
  120. //UBRR0H = (unsigned char)(MYUBRR>>8);
  121. //UBRR0L = (unsigned char)MYUBRR&255;
  122. #ifndef useLed
  123. UBRR0H=0;
  124. UBRR0L=207;//3 = 0.5M 2M baud rate = 0 7 = 250k 207 is 9600 baud rate
  125. UCSR0A|=2;//double speed aysnc
  126. UCSR0B = (1<<RXEN0)|(1<<TXEN0);//Enable receiver and transmitter
  127. UCSR0C=6;//async 1 stop bit 8bit char no parity bits
  128. PgmPrintln("Setting up Camera Registers");
  129. #endif
  130. //set up camera
  131. wrReg(0x15,32);//pclk does not toggle on HBLANK COM10 vsync falling
  132. //wrReg(0x11,32);//using scaler for divider
  133. wrReg(REG_RGB444, 0x00); // Disable RGB444
  134. wrReg(REG_COM11,226);//enable nigh mode 1/8 frame rate COM11*/
  135. wrReg(REG_TSLB,0x04); // 0D = UYVY 04 = YUYV
  136. wrReg(REG_COM13,0x88); // connect to REG_TSLB
  137. //wrReg(REG_COM13,0x8); // connect to REG_TSLB disable gamma
  138. wrReg(REG_COM7, 0x01); // raw
  139. wrReg(REG_COM15, 0xC0); // Set Full range
  140. //wrReg(REG_COM3, 0x04);
  141. #if defined qqvga || defined qvga
  142. wrReg(REG_COM3,4); // REG_COM3
  143. #else
  144. wrReg(REG_COM3,0); // REG_COM3
  145. #endif
  146. //wrReg(0x3e,0x00); // REG_COM14
  147. // wrReg(0x72,0x11); //
  148. // wrReg(0x73,0xf0); //
  149. #ifdef qqvga
  150. wrReg(REG_COM14, 0x1a); // divide by 4
  151. wrReg(0x72, 0x22); // downsample by 4
  152. wrReg(0x73, 0xf2); // divide by 4
  153. wrReg(REG_HSTART,0x16);
  154. wrReg(REG_HSTOP,0x04);
  155. wrReg(REG_HREF,0xa4);
  156. wrReg(REG_VSTART,0x02);
  157. wrReg(REG_VSTOP,0x7a);
  158. wrReg(REG_VREF,0x0a);
  159. #endif
  160. #ifdef qvga
  161. wrReg(REG_COM14, 0x19);
  162. wrReg(0x72, 0x11);
  163. wrReg(0x73, 0xf1);
  164. wrReg(REG_HSTART,0x16);
  165. wrReg(REG_HSTOP,0x04);
  166. wrReg(REG_HREF,0x24);
  167. wrReg(REG_VSTART,0x02);
  168. wrReg(REG_VSTOP,0x7a);
  169. wrReg(REG_VREF,0x0a);
  170. #else
  171. wrReg(0x32,0xF6); // HREF was b6 F6 improves reliabilty
  172. wrReg(0x17,0x13); // HSTART
  173. wrReg(0x18,0x01); // HSTOP
  174. wrReg(0x19,0x02); // VSTART
  175. wrReg(0x1a,0x7a); // VSTOP
  176. wrReg(0x03,0x0a); // VREF
  177. #endif
  178. // wrReg(0x70, 0x3a); // Scaling Xsc
  179. //wrReg(0x71, 0x35); // Scaling Ysc
  180. //wrReg(0xA2, 0x02); // pixel clock delay
  181.  
  182. wrReg(REG_COM1, 0x00);
  183. // COLOR SETTING
  184.  
  185. wrReg(REG_COM8,0x8F); // AGC AWB AEC bading filter off
  186. wrReg(0xAA,0x14); // Average-based AEC algorithm
  187. wrReg(REG_BRIGHT,0x00); // 0x00(Brightness 0) - 0x18(Brightness +1) - 0x98(Brightness -1)
  188. wrReg(REG_CONTRAS,0x40); // 0x40(Contrast 0) - 0x50(Contrast +1) - 0x38(Contrast -1)
  189. // wrReg(0xB1,0xB1); // Automatic Black level Calibration
  190. wrReg(0xB1,4);//really enable auto black level calibration
  191. wrReg(MTX1,0x80);
  192. wrReg(MTX2,0x80);
  193. wrReg(MTX3,0x00);
  194. wrReg(MTX4,0x22);
  195. wrReg(MTX5,0x5e);
  196. wrReg(MTX6,0x80);
  197. wrReg(MTXS,0x9e);
  198. wrReg(AWBC7,0x88);
  199. wrReg(AWBC8,0x88);
  200. wrReg(AWBC9,0x44);
  201. wrReg(AWBC10,0x67);
  202. wrReg(AWBC11,0x49);
  203. wrReg(AWBC12,0x0e);
  204. wrReg(REG_GFIX,0x00);
  205. //wrReg(GGAIN,0x40);
  206. wrReg(AWBCTR3,0x0a);
  207. wrReg(AWBCTR2,0x55);
  208. wrReg(AWBCTR1,0x11);
  209. wrReg(AWBCTR0,0x9f);
  210.  
  211. wrReg(0xb0,0x84);//not sure what this does
  212. wrReg(REG_COM16,COM16_AWBGAIN);//disable auto denoise and edge enhancment
  213. //wrReg(REG_COM16,0);
  214. wrReg(0x4C,0);//disable denoise
  215. wrReg(0x76,0);//disable denoise
  216. wrReg(0x77,0);//disable denoise
  217. wrReg(0x7B,4);//brighten up shadows a bit end point 4
  218. wrReg(0x7C,8);//brighten up shadows a bit end point 8
  219. //wrReg(0x88,238);//darken highligts end point 176
  220. //wrReg(0x89,211);//try to get more highlight detail
  221. //wrReg(0x7A,60);//slope
  222. //wrReg(0x26,0xB4);//lower maxium stable operating range for AEC
  223. //hueSatMatrix(0,100);
  224. //ov7670_store_cmatrix();
  225. //wrReg(0x20,12);//set ADC range to 1.5x
  226. wrReg(REG_COM9,0x6A);//max gain to 128x
  227. wrReg(0x74,16);//disable digital gain
  228. wrReg(0x11,4);//using scaler for divider
  229. //cout << pstr("Free RAM: ") << FreeRam() << endl;
  230. //wrReg(0x31,0xFF);//HSYNC delay
  231. //wrReg(0x2A, 12);
  232. delay(100);//i2c uses interupts to write data wait for all bytes to be written
  233. cli();//disable interupts
  234.  
  235. useSdCard;
  236. #ifndef useLed
  237. PgmPrintln("About to Start SD card");
  238. #else
  239. PORTD|=1;//turn on led
  240. #endif
  241. if (!sd.begin(chipSelect, SPI_FULL_SPEED))
  242. sd.initErrorHalt("Error starting Sd card");
  243. //enable spi
  244. SPCR=80;//spi enable master
  245. SPSR=1;//double speed
  246. /*PgmPrintln("------sd1 root-------");
  247.  
  248. sd.ls();*/
  249. /* //enable spi
  250. SPCR=80;//spi enable master
  251. SPSR=1;//double speed*/
  252. spiCSt();
  253. spiWrB(1);
  254. spiWrB(64);//sequental mode
  255. spiCSt();
  256. spiWrB(2);//sequental write mode
  257. spiWrB(0);//24 bit address
  258. spiWrB(0);
  259. spiWrB(0);
  260. // useSDcard();
  261. #ifndef useLed
  262. PgmPrintln("Ready to Begin");
  263. #endif
  264. //sd.ls();
  265. //uint8_t* buf = (uint8_t*)sd.vol()->cacheClear();
  266. //while (1){}
  267. }
  268. void loop()
  269. {
  270. /* Note: One frame is broken down into 5 smaller captures this allows for a whole frame to be captured at 640x480 which is nice
  271. however it could mean that there could be slight differences between each frame capture
  272. I think the improvment of resolution outweights the cons of the slight changes per frame if any
  273. The image will take about 15 seconds to reach the computer per frame*/
  274. static uint16_t countFrames;
  275. #ifndef useLed
  276. PgmPrintln("Send One key to start image save");
  277. RdSerial();
  278.  
  279. for (uint16_t z=0;z<4;z++)
  280. {
  281. #else//do not use loop when using led
  282. if ((PIND&2)==0)//is the button on pin 1 pressed?
  283. {
  284. //if so blink led quickly
  285. sei();
  286. while (1)
  287. {
  288. PORTD^=1;
  289. delay(50);
  290. }
  291. }
  292. else
  293. PORTD&=~1;//led on when writing to files off when taking picture
  294. #endif
  295. //memset(buf,0,sizeof(buf));
  296. sprintf_P((char *)buf2,PSTR("f%d.yuv"),countFrames);
  297. #ifndef useLed
  298. PgmPrintln("Saving to:");
  299. StringRam((char *)buf2);
  300. serialWrB('\n');
  301. #else
  302. PORTD|=1;
  303. #endif
  304. sd.remove((char*)buf2);
  305. // create a contiguous file
  306. if (!file.createContiguous(sd.vwd(),(char *) buf2, 307200)) {
  307. error("createContiguous failed");
  308. }
  309. #ifndef useLed
  310. PgmPrintln("File created");
  311. #endif
  312. // get the location of the file's blocks
  313.  
  314. if (!file.contiguousRange(&bgnBlock, &endBlock)) {
  315. error("contiguousRange failed");
  316. }
  317. // tell card to setup for multiple block write with pre-erase
  318.  
  319. if (!sd.card()->erase(bgnBlock, endBlock)) error("card.erase failed");
  320. if (!sd.card()->writeStart(bgnBlock, 600)) {
  321. error("writeStart failed");
  322. }//1200 is the block count filesize/512
  323. // PgmPrintln("File prepared");
  324. //PgmPrintln("About to start Image Capture");
  325. captureImg(0,0,640,160);
  326. saveImg(200);
  327. captureImg(640,160,640,160);
  328. saveImg(200);
  329. captureImg(640,320,640,160);
  330. saveImg(200);
  331.  
  332. /*file.sync();
  333. file.rewind();
  334. readImgSerial(1280,480);*/
  335. if (!sd.card()->writeStop()) error("writeStop failed");
  336. if (file.close() == 0) {
  337. error("File close failed");
  338. }
  339. countFrames++;
  340. #ifndef useLed
  341. PgmPrintln("File closed");
  342. }
  343. #endif
  344.  
  345. }
  346. void fixPat(void)
  347. {
  348. spiCSt();
  349. spiWrB(2);//sequental write mode
  350. spiWrB(0);//24 bit address
  351. spiWrB(0);
  352. spiWrB(0);
  353. uint32_t x;
  354. uint8_t y=0;
  355.  
  356. for (x=0;x<122880;x++)
  357. {
  358. SPDR=y;
  359. y++;
  360. while(!(SPSR & (1<<SPIF))) {}
  361. }
  362. }
  363. byte wrReg(int regID, int regDat)
  364. {
  365. // Serial.println("Started");
  366. Wire.beginTransmission(sensor_addr >> 1);
  367. // Serial.println("Began");
  368. Wire.write(regID & 0x00FF);
  369. Wire.write(regDat & 0x00FF);
  370. if(Wire.endTransmission())
  371. {
  372. return 0;
  373. PORTB|=32;
  374. while (1) {}
  375. }
  376. // Serial.println("Done!");
  377. delay(1);
  378. return(1);
  379. }
  380.  
  381. void readImgSerial(uint16_t w,uint16_t h)
  382. {
  383. //_delay_ms(2000);
  384. uint16_t wl,hl;
  385. for (hl=0;hl<h;hl++)
  386. {
  387. StringPgm(PSTR("RDY"));
  388. for (wl=0;wl<w;wl++)
  389. {
  390. while ( !( UCSR0A & (1<<UDRE0)) ) {} //wait for byte to transmit
  391. //SPDR=0;//send dummy value to get byte back
  392. //while(!(SPSR & (1<<SPIF))) {}
  393. UDR0=file.read();
  394. }
  395. }
  396. while ( !( UCSR0A & (1<<UDRE0)) ) {} //wait for byte to transmit
  397. }
  398.  
  399. byte rdSensorReg8_8(uint8_t regID, uint8_t* regDat)
  400. {
  401. Wire.beginTransmission(sensor_addr >> 1);
  402. Wire.write(regID & 0x00FF);
  403. Wire.endTransmission();
  404. Wire.requestFrom((sensor_addr >> 1),1);
  405. if(Wire.available())
  406. *regDat = Wire.read();
  407. delay(1);
  408. return(1);
  409. }
  410. void captureImg(uint16_t ws,uint16_t hs,uint16_t wg,uint8_t hg)
  411. {//TODO: speed up this loop it misses one byte partway through the first line
  412. //right now I am correcting this in the image converter software it is just one byte and not very
  413. //noticable but it would still be nice to fix in my opion I do not have this issue when this loop is compiled with avr-gcc with a setting of -O2
  414. #ifdef useLed
  415. PORTD&=~1;//turn off led taking picture
  416. #endif
  417. uint16_t ls2,lg2;
  418. //skip 1 multiplies skip 2 same with get1 and get2
  419. //first wait for vsync it is on pin 3 (counting from 0) portD
  420. //start spi ram
  421. cli();//make sure interupts are off
  422. spiCSt();
  423. spiWrB(2);//sequental write mode
  424. spiWrB(0);//24 bit address
  425. spiWrB(0);
  426. spiWrB(0);
  427. while (!(PIND&8)) {}//wait for high
  428. while ((PIND&8)) {}//wait for low
  429. if (hs != 0)
  430. {
  431. //for (ls1=0;ls1<hs;ls1++)
  432. while (hs--)
  433. {
  434. //for (ls2=0;ls2<ws;ls2++)
  435. ls2=ws;
  436. while (ls2--)
  437. {
  438. while (!(PIND&4)) {}//wait for high
  439. while ((PIND&4)) {}//wait for low
  440. }
  441. }// while (--hs);
  442. }
  443. //for (lg1=0;lg1<hg;lg1++)
  444. while ((uint8_t)hg--)
  445. {
  446. //for (lg2=0;lg2<wg;lg2++)
  447. lg2=wg;
  448. while (lg2--)
  449. {
  450. while (!(PIND&4)) {}//wait for high
  451. SPDR=(uint8_t)(PINC&15)|(PIND&240);
  452. while ((PIND&4)) {}//wait for low
  453. }
  454. }
  455. }
  456. void sendRam(uint16_t w,uint16_t h)
  457. {
  458. spiCSt();
  459. spiWrB(3);//sequental read mode
  460. spiWrB(0);//24 bit address
  461. spiWrB(0);
  462. spiWrB(0);
  463. //_delay_ms(2000);
  464. uint16_t wl,hl;
  465. for (hl=0;hl<h;hl++)
  466. {
  467. StringPgm(PSTR("RDY"));
  468. for (wl=0;wl<w;wl++)
  469. {
  470. while ( !( UCSR0A & (1<<UDRE0)) ) {} //wait for byte to transmit
  471. SPDR=0;//send dummy value to get byte back
  472. while(!(SPSR & (1<<SPIF))) {}
  473. UDR0=SPDR;
  474. }
  475. }
  476. while ( !( UCSR0A & (1<<UDRE0)) ) {} //wait for byte to transmit
  477. //StringPgm(PSTR("RDY"));
  478. //_delay_ms(10);
  479. //UDR0=0xFF;
  480. }
  481. void spiCSt(void)
  482. {
  483. //toggles spi CS used for reseting sram
  484. PORTB|=6;//cs high
  485. //_delay_ms(1);
  486. PORTB&=~4;//cs low
  487. }
  488. void spiWrB(uint8_t dat)
  489. {
  490. SPDR = dat;
  491. // Wait for transmission complete
  492. while(!(SPSR & (1<<SPIF))) {}
  493. }
  494. uint8_t RdSerial(void)
  495. {
  496. /* Wait for data to be received */
  497. while ( !(UCSR0A & (1<<RXC0)) );
  498. /* Get and return received data from buffer */
  499. return UDR0;
  500. }
  501. void saveImg(uint16_t sizeSect)
  502. {
  503. //size is size in bytes/512 so for 1280x96 bytes it is 240
  504. //PgmPrintln("Saving part");
  505. #ifdef useLed
  506. PORTD|=1;//turn on led saving picture
  507. #endif
  508. uint32_t address=0;
  509. //PgmPrintln("About to Save Image");
  510. for (uint16_t x=0;x<sizeSect;x++)
  511. {
  512. spiCSt();
  513. spiWrB(3);//sequental read mode
  514. sramAddress(address);
  515. for (uint16_t y=0;y<512;y++)
  516. {
  517. SPDR=0;//send dummy value to get byte back
  518. while(!(SPSR & (1<<SPIF))) {}
  519. buf2[y]=SPDR;
  520. }
  521. useSdCard;
  522. if (!sd.card()->writeData(buf2)) error("writeData failed");
  523. address+=sizeof(buf2);
  524. //PgmPrintln("Done B");
  525. }
  526. //PgmPrintln("Done");
  527. }
  528. void sramAddress(uint32_t address)
  529. {
  530. spiWrB((uint8_t)(address >> 16) & 0xff);
  531. spiWrB((uint8_t)(address >> 8) & 0xff);
  532. spiWrB((uint8_t)address);
  533. }
  534. void serialWrB(uint8_t dat)
  535. {
  536. while ( !( UCSR0A & (1<<UDRE0)) ) {}
  537. UDR0=dat;
  538. while ( !( UCSR0A & (1<<UDRE0)) ) {} //wait for byte to transmit
  539. }
  540. void StringPgm(char * str)
  541. {
  542. do {
  543. serialWrB(pgm_read_byte_near(str));
  544. } while(pgm_read_byte_near(++str));
  545. }
  546. void StringRam(char * str)
  547. {
  548. do {
  549. serialWrB(*str);
  550. } while(*++str);
  551. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement