CQ出版 Interface記事用サンプル。 トラ技カメラ+FIFOからデータを得て、 エリア判定後、デバイスに保存
Dependencies: SDFileSystem mbed
ov7670.h@4:ed062dc75c52, 2014-02-04 (annotated)
- Committer:
- TETSUYA
- Date:
- Tue Feb 04 05:42:17 2014 +0000
- Revision:
- 4:ed062dc75c52
- Parent:
- 0:1648bb4e70e5
???????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TETSUYA | 0:1648bb4e70e5 | 1 | #include "mbed.h" |
TETSUYA | 0:1648bb4e70e5 | 2 | #include "ov7670reg.h" |
TETSUYA | 0:1648bb4e70e5 | 3 | |
TETSUYA | 0:1648bb4e70e5 | 4 | #define OV7670_WRITE (0x42) |
TETSUYA | 0:1648bb4e70e5 | 5 | #define OV7670_READ (0x43) |
TETSUYA | 0:1648bb4e70e5 | 6 | #define OV7670_WRITEWAIT (20) |
TETSUYA | 0:1648bb4e70e5 | 7 | #define OV7670_NOACK (0) |
TETSUYA | 0:1648bb4e70e5 | 8 | #define OV7670_REGMAX (201) |
TETSUYA | 0:1648bb4e70e5 | 9 | #define OV7670_I2CFREQ (50000) |
TETSUYA | 0:1648bb4e70e5 | 10 | |
TETSUYA | 0:1648bb4e70e5 | 11 | // |
TETSUYA | 0:1648bb4e70e5 | 12 | // OV7670 + FIFO AL422B camera board test |
TETSUYA | 0:1648bb4e70e5 | 13 | // |
TETSUYA | 0:1648bb4e70e5 | 14 | class OV7670 |
TETSUYA | 0:1648bb4e70e5 | 15 | { |
TETSUYA | 0:1648bb4e70e5 | 16 | public: |
TETSUYA | 0:1648bb4e70e5 | 17 | I2C camera; |
TETSUYA | 0:1648bb4e70e5 | 18 | InterruptIn vsync,href; |
TETSUYA | 0:1648bb4e70e5 | 19 | DigitalOut wen; |
TETSUYA | 0:1648bb4e70e5 | 20 | BusIn data; |
TETSUYA | 0:1648bb4e70e5 | 21 | DigitalOut rrst,oe,rclk; |
TETSUYA | 0:1648bb4e70e5 | 22 | volatile int LineCounter; |
TETSUYA | 0:1648bb4e70e5 | 23 | volatile int LastLines; |
TETSUYA | 0:1648bb4e70e5 | 24 | volatile bool CaptureReq; |
TETSUYA | 0:1648bb4e70e5 | 25 | volatile bool Busy; |
TETSUYA | 0:1648bb4e70e5 | 26 | volatile bool Done; |
TETSUYA | 0:1648bb4e70e5 | 27 | |
TETSUYA | 0:1648bb4e70e5 | 28 | OV7670( |
TETSUYA | 0:1648bb4e70e5 | 29 | PinName sda,// Camera I2C port |
TETSUYA | 0:1648bb4e70e5 | 30 | PinName scl,// Camera I2C port |
TETSUYA | 0:1648bb4e70e5 | 31 | PinName vs, // VSYNC |
TETSUYA | 0:1648bb4e70e5 | 32 | PinName hr, // HREF |
TETSUYA | 0:1648bb4e70e5 | 33 | PinName we, // WEN |
TETSUYA | 0:1648bb4e70e5 | 34 | PinName d7, // D7 |
TETSUYA | 0:1648bb4e70e5 | 35 | PinName d6, // D6 |
TETSUYA | 0:1648bb4e70e5 | 36 | PinName d5, // D5 |
TETSUYA | 0:1648bb4e70e5 | 37 | PinName d4, // D4 |
TETSUYA | 0:1648bb4e70e5 | 38 | PinName d3, // D3 |
TETSUYA | 0:1648bb4e70e5 | 39 | PinName d2, // D2 |
TETSUYA | 0:1648bb4e70e5 | 40 | PinName d1, // D1 |
TETSUYA | 0:1648bb4e70e5 | 41 | PinName d0, // D0 |
TETSUYA | 0:1648bb4e70e5 | 42 | PinName rt, // /RRST |
TETSUYA | 0:1648bb4e70e5 | 43 | PinName o, // /OE |
TETSUYA | 0:1648bb4e70e5 | 44 | PinName rc // RCLK |
TETSUYA | 0:1648bb4e70e5 | 45 | ) : camera(sda,scl),vsync(vs),href(hr),wen(we),data(d0,d1,d2,d3,d4,d5,d6,d7),rrst(rt),oe(o),rclk(rc) |
TETSUYA | 0:1648bb4e70e5 | 46 | { |
TETSUYA | 0:1648bb4e70e5 | 47 | camera.stop(); |
TETSUYA | 0:1648bb4e70e5 | 48 | camera.frequency(OV7670_I2CFREQ); |
TETSUYA | 0:1648bb4e70e5 | 49 | vsync.fall(this,&OV7670::VsyncHandler); |
TETSUYA | 0:1648bb4e70e5 | 50 | href.rise(this,&OV7670::HrefHandler); |
TETSUYA | 0:1648bb4e70e5 | 51 | CaptureReq = false; |
TETSUYA | 0:1648bb4e70e5 | 52 | Busy = false; |
TETSUYA | 0:1648bb4e70e5 | 53 | Done = false; |
TETSUYA | 0:1648bb4e70e5 | 54 | LineCounter = 0; |
TETSUYA | 0:1648bb4e70e5 | 55 | rrst = 1; |
TETSUYA | 0:1648bb4e70e5 | 56 | oe = 1; |
TETSUYA | 0:1648bb4e70e5 | 57 | rclk = 1; |
TETSUYA | 0:1648bb4e70e5 | 58 | wen = 0; |
TETSUYA | 0:1648bb4e70e5 | 59 | } |
TETSUYA | 0:1648bb4e70e5 | 60 | |
TETSUYA | 0:1648bb4e70e5 | 61 | // capture request |
TETSUYA | 0:1648bb4e70e5 | 62 | void CaptureNext(void) |
TETSUYA | 0:1648bb4e70e5 | 63 | { |
TETSUYA | 0:1648bb4e70e5 | 64 | CaptureReq = true; |
TETSUYA | 0:1648bb4e70e5 | 65 | Busy = true; |
TETSUYA | 0:1648bb4e70e5 | 66 | } |
TETSUYA | 0:1648bb4e70e5 | 67 | |
TETSUYA | 0:1648bb4e70e5 | 68 | // capture done? (with clear) |
TETSUYA | 0:1648bb4e70e5 | 69 | bool CaptureDone(void) |
TETSUYA | 0:1648bb4e70e5 | 70 | { |
TETSUYA | 0:1648bb4e70e5 | 71 | bool result; |
TETSUYA | 0:1648bb4e70e5 | 72 | if (Busy) { |
TETSUYA | 0:1648bb4e70e5 | 73 | result = false; |
TETSUYA | 0:1648bb4e70e5 | 74 | } else { |
TETSUYA | 0:1648bb4e70e5 | 75 | result = Done; |
TETSUYA | 0:1648bb4e70e5 | 76 | Done = false; |
TETSUYA | 0:1648bb4e70e5 | 77 | } |
TETSUYA | 0:1648bb4e70e5 | 78 | return result; |
TETSUYA | 0:1648bb4e70e5 | 79 | } |
TETSUYA | 0:1648bb4e70e5 | 80 | |
TETSUYA | 0:1648bb4e70e5 | 81 | // write to camera |
TETSUYA | 0:1648bb4e70e5 | 82 | void WriteReg(int addr,int data) |
TETSUYA | 0:1648bb4e70e5 | 83 | { |
TETSUYA | 0:1648bb4e70e5 | 84 | // WRITE 0x42,ADDR,DATA |
TETSUYA | 0:1648bb4e70e5 | 85 | camera.start(); |
TETSUYA | 0:1648bb4e70e5 | 86 | camera.write(OV7670_WRITE); |
TETSUYA | 0:1648bb4e70e5 | 87 | wait_us(OV7670_WRITEWAIT); |
TETSUYA | 0:1648bb4e70e5 | 88 | camera.write(addr); |
TETSUYA | 0:1648bb4e70e5 | 89 | wait_us(OV7670_WRITEWAIT); |
TETSUYA | 0:1648bb4e70e5 | 90 | camera.write(data); |
TETSUYA | 0:1648bb4e70e5 | 91 | camera.stop(); |
TETSUYA | 0:1648bb4e70e5 | 92 | } |
TETSUYA | 0:1648bb4e70e5 | 93 | |
TETSUYA | 0:1648bb4e70e5 | 94 | // read from camera |
TETSUYA | 0:1648bb4e70e5 | 95 | int ReadReg(int addr) |
TETSUYA | 0:1648bb4e70e5 | 96 | { |
TETSUYA | 0:1648bb4e70e5 | 97 | int data; |
TETSUYA | 0:1648bb4e70e5 | 98 | |
TETSUYA | 0:1648bb4e70e5 | 99 | // WRITE 0x42,ADDR |
TETSUYA | 0:1648bb4e70e5 | 100 | camera.start(); |
TETSUYA | 0:1648bb4e70e5 | 101 | camera.write(OV7670_WRITE); |
TETSUYA | 0:1648bb4e70e5 | 102 | wait_us(OV7670_WRITEWAIT); |
TETSUYA | 0:1648bb4e70e5 | 103 | camera.write(addr); |
TETSUYA | 0:1648bb4e70e5 | 104 | camera.stop(); |
TETSUYA | 0:1648bb4e70e5 | 105 | wait_us(OV7670_WRITEWAIT); |
TETSUYA | 0:1648bb4e70e5 | 106 | |
TETSUYA | 0:1648bb4e70e5 | 107 | // WRITE 0x43,READ |
TETSUYA | 0:1648bb4e70e5 | 108 | camera.start(); |
TETSUYA | 0:1648bb4e70e5 | 109 | camera.write(OV7670_READ); |
TETSUYA | 0:1648bb4e70e5 | 110 | wait_us(OV7670_WRITEWAIT); |
TETSUYA | 0:1648bb4e70e5 | 111 | data = camera.read(OV7670_NOACK); |
TETSUYA | 0:1648bb4e70e5 | 112 | camera.stop(); |
TETSUYA | 0:1648bb4e70e5 | 113 | |
TETSUYA | 0:1648bb4e70e5 | 114 | return data; |
TETSUYA | 0:1648bb4e70e5 | 115 | } |
TETSUYA | 0:1648bb4e70e5 | 116 | |
TETSUYA | 0:1648bb4e70e5 | 117 | // print register |
TETSUYA | 0:1648bb4e70e5 | 118 | void PrintRegister(void) { |
TETSUYA | 0:1648bb4e70e5 | 119 | printf("AD : +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F"); |
TETSUYA | 0:1648bb4e70e5 | 120 | for (int i=0;i<OV7670_REGMAX;i++) { |
TETSUYA | 0:1648bb4e70e5 | 121 | int data; |
TETSUYA | 0:1648bb4e70e5 | 122 | data = ReadReg(i); // READ REG |
TETSUYA | 0:1648bb4e70e5 | 123 | if ((i & 0x0F) == 0) { |
TETSUYA | 0:1648bb4e70e5 | 124 | printf("\r\n%02X : ",i); |
TETSUYA | 0:1648bb4e70e5 | 125 | } |
TETSUYA | 0:1648bb4e70e5 | 126 | printf("%02X ",data); |
TETSUYA | 0:1648bb4e70e5 | 127 | } |
TETSUYA | 0:1648bb4e70e5 | 128 | printf("\r\n"); |
TETSUYA | 0:1648bb4e70e5 | 129 | } |
TETSUYA | 0:1648bb4e70e5 | 130 | |
TETSUYA | 0:1648bb4e70e5 | 131 | void Reset(void) { |
TETSUYA | 0:1648bb4e70e5 | 132 | WriteReg(REG_COM7,COM7_RESET); // RESET CAMERA |
TETSUYA | 0:1648bb4e70e5 | 133 | wait_ms(200); |
TETSUYA | 0:1648bb4e70e5 | 134 | } |
TETSUYA | 0:1648bb4e70e5 | 135 | |
TETSUYA | 0:1648bb4e70e5 | 136 | void InitForFIFOWriteReset(void) { |
TETSUYA | 0:1648bb4e70e5 | 137 | WriteReg(REG_COM10, COM10_VS_NEG); |
TETSUYA | 0:1648bb4e70e5 | 138 | } |
TETSUYA | 0:1648bb4e70e5 | 139 | |
TETSUYA | 0:1648bb4e70e5 | 140 | void InitSetColorbar(void) { |
TETSUYA | 0:1648bb4e70e5 | 141 | int reg_com7 = ReadReg(REG_COM7); |
TETSUYA | 0:1648bb4e70e5 | 142 | // color bar |
TETSUYA | 0:1648bb4e70e5 | 143 | WriteReg(REG_COM17, reg_com7|COM17_CBAR); |
TETSUYA | 0:1648bb4e70e5 | 144 | } |
TETSUYA | 0:1648bb4e70e5 | 145 | |
TETSUYA | 0:1648bb4e70e5 | 146 | void InitDefaultReg(bool flipv,bool fliph) { |
TETSUYA | 0:1648bb4e70e5 | 147 | // Gamma curve values |
TETSUYA | 0:1648bb4e70e5 | 148 | WriteReg(0x7a, 0x20); |
TETSUYA | 0:1648bb4e70e5 | 149 | WriteReg(0x7b, 0x10); |
TETSUYA | 0:1648bb4e70e5 | 150 | WriteReg(0x7c, 0x1e); |
TETSUYA | 0:1648bb4e70e5 | 151 | WriteReg(0x7d, 0x35); |
TETSUYA | 0:1648bb4e70e5 | 152 | WriteReg(0x7e, 0x5a); |
TETSUYA | 0:1648bb4e70e5 | 153 | WriteReg(0x7f, 0x69); |
TETSUYA | 0:1648bb4e70e5 | 154 | WriteReg(0x80, 0x76); |
TETSUYA | 0:1648bb4e70e5 | 155 | WriteReg(0x81, 0x80); |
TETSUYA | 0:1648bb4e70e5 | 156 | WriteReg(0x82, 0x88); |
TETSUYA | 0:1648bb4e70e5 | 157 | WriteReg(0x83, 0x8f); |
TETSUYA | 0:1648bb4e70e5 | 158 | WriteReg(0x84, 0x96); |
TETSUYA | 0:1648bb4e70e5 | 159 | WriteReg(0x85, 0xa3); |
TETSUYA | 0:1648bb4e70e5 | 160 | WriteReg(0x86, 0xaf); |
TETSUYA | 0:1648bb4e70e5 | 161 | WriteReg(0x87, 0xc4); |
TETSUYA | 0:1648bb4e70e5 | 162 | WriteReg(0x88, 0xd7); |
TETSUYA | 0:1648bb4e70e5 | 163 | WriteReg(0x89, 0xe8); |
TETSUYA | 0:1648bb4e70e5 | 164 | |
TETSUYA | 0:1648bb4e70e5 | 165 | // AGC and AEC parameters. Note we start by disabling those features, |
TETSUYA | 0:1648bb4e70e5 | 166 | //then turn them only after tweaking the values. |
TETSUYA | 0:1648bb4e70e5 | 167 | //WriteReg(REG_COM8, COM8_FASTAEC | COM8_AECSTEP | COM8_BFILT); |
TETSUYA | 0:1648bb4e70e5 | 168 | //WriteReg(REG_COM8, COM8_AECSTEP | COM8_BFILT | COM8_AWB | COM8_AEC ); |
TETSUYA | 0:1648bb4e70e5 | 169 | WriteReg(REG_COM8, COM8_AECSTEP | COM8_BFILT | COM8_AGC | COM8_AEC ); |
TETSUYA | 0:1648bb4e70e5 | 170 | //WriteReg(REG_COM8, COM8_AECSTEP | COM8_BFILT | COM8_AGC | COM8_AWB ); |
TETSUYA | 0:1648bb4e70e5 | 171 | |
TETSUYA | 0:1648bb4e70e5 | 172 | WriteReg(REG_GAIN, 0); |
TETSUYA | 0:1648bb4e70e5 | 173 | WriteReg(REG_AECH, 0); |
TETSUYA | 0:1648bb4e70e5 | 174 | WriteReg(REG_COM4, 0x40); |
TETSUYA | 0:1648bb4e70e5 | 175 | // magic reserved bit |
TETSUYA | 0:1648bb4e70e5 | 176 | WriteReg(REG_COM9, 0x18); |
TETSUYA | 0:1648bb4e70e5 | 177 | // 4x gain + magic rsvd bit |
TETSUYA | 0:1648bb4e70e5 | 178 | WriteReg(REG_BD50MAX, 0x05); |
TETSUYA | 0:1648bb4e70e5 | 179 | WriteReg(REG_BD60MAX, 0x07); |
TETSUYA | 0:1648bb4e70e5 | 180 | WriteReg(REG_AEW, 0x95); |
TETSUYA | 0:1648bb4e70e5 | 181 | WriteReg(REG_AEB, 0x33); |
TETSUYA | 0:1648bb4e70e5 | 182 | WriteReg(REG_VPT, 0xe3); |
TETSUYA | 0:1648bb4e70e5 | 183 | WriteReg(REG_HAECC1, 0x78); |
TETSUYA | 0:1648bb4e70e5 | 184 | WriteReg(REG_HAECC2, 0x68); |
TETSUYA | 0:1648bb4e70e5 | 185 | WriteReg(0xa1, 0x03); |
TETSUYA | 0:1648bb4e70e5 | 186 | // magic |
TETSUYA | 0:1648bb4e70e5 | 187 | WriteReg(REG_HAECC3, 0xd8); |
TETSUYA | 0:1648bb4e70e5 | 188 | WriteReg(REG_HAECC4, 0xd8); |
TETSUYA | 0:1648bb4e70e5 | 189 | WriteReg(REG_HAECC5, 0xf0); |
TETSUYA | 0:1648bb4e70e5 | 190 | WriteReg(REG_HAECC6, 0x90); |
TETSUYA | 0:1648bb4e70e5 | 191 | WriteReg(REG_HAECC7, 0x94); |
TETSUYA | 0:1648bb4e70e5 | 192 | WriteReg(REG_COM8, COM8_FASTAEC|COM8_AECSTEP|COM8_BFILT|COM8_AGC|COM8_AEC); |
TETSUYA | 0:1648bb4e70e5 | 193 | |
TETSUYA | 0:1648bb4e70e5 | 194 | // Almost all of these are magic "reserved" values. |
TETSUYA | 0:1648bb4e70e5 | 195 | WriteReg(REG_COM5, 0x61); |
TETSUYA | 0:1648bb4e70e5 | 196 | WriteReg(REG_COM6, 0x4b); |
TETSUYA | 0:1648bb4e70e5 | 197 | WriteReg(0x16, 0x02); |
TETSUYA | 0:1648bb4e70e5 | 198 | WriteReg(REG_MVFP, 0x07 | (flipv ? 0x10:0) | (fliph ? 0x20:0)); |
TETSUYA | 0:1648bb4e70e5 | 199 | WriteReg(0x21, 0x02); |
TETSUYA | 0:1648bb4e70e5 | 200 | WriteReg(0x22, 0x91); |
TETSUYA | 0:1648bb4e70e5 | 201 | WriteReg(0x29, 0x07); |
TETSUYA | 0:1648bb4e70e5 | 202 | WriteReg(0x33, 0x0b); |
TETSUYA | 0:1648bb4e70e5 | 203 | WriteReg(0x35, 0x0b); |
TETSUYA | 0:1648bb4e70e5 | 204 | WriteReg(0x37, 0x1d); |
TETSUYA | 0:1648bb4e70e5 | 205 | WriteReg(0x38, 0x71); |
TETSUYA | 0:1648bb4e70e5 | 206 | WriteReg(0x39, 0x2a); |
TETSUYA | 0:1648bb4e70e5 | 207 | WriteReg(REG_COM12, 0x78); |
TETSUYA | 0:1648bb4e70e5 | 208 | WriteReg(0x4d, 0x40); |
TETSUYA | 0:1648bb4e70e5 | 209 | WriteReg(0x4e, 0x20); |
TETSUYA | 0:1648bb4e70e5 | 210 | WriteReg(REG_GFIX, 0); |
TETSUYA | 0:1648bb4e70e5 | 211 | WriteReg(0x6b, 0x0a); |
TETSUYA | 0:1648bb4e70e5 | 212 | WriteReg(0x74, 0x10); |
TETSUYA | 0:1648bb4e70e5 | 213 | WriteReg(0x8d, 0x4f); |
TETSUYA | 0:1648bb4e70e5 | 214 | WriteReg(0x8e, 0); |
TETSUYA | 0:1648bb4e70e5 | 215 | WriteReg(0x8f, 0); |
TETSUYA | 0:1648bb4e70e5 | 216 | WriteReg(0x90, 0); |
TETSUYA | 0:1648bb4e70e5 | 217 | WriteReg(0x91, 0); |
TETSUYA | 0:1648bb4e70e5 | 218 | WriteReg(0x96, 0); |
TETSUYA | 0:1648bb4e70e5 | 219 | WriteReg(0x9a, 0); |
TETSUYA | 0:1648bb4e70e5 | 220 | WriteReg(0xb0, 0x84); |
TETSUYA | 0:1648bb4e70e5 | 221 | WriteReg(0xb1, 0x0c); |
TETSUYA | 0:1648bb4e70e5 | 222 | WriteReg(0xb2, 0x0e); |
TETSUYA | 0:1648bb4e70e5 | 223 | WriteReg(0xb3, 0x82); |
TETSUYA | 0:1648bb4e70e5 | 224 | WriteReg(0xb8, 0x0a); |
TETSUYA | 0:1648bb4e70e5 | 225 | |
TETSUYA | 0:1648bb4e70e5 | 226 | // More reserved magic, some of which tweaks white balance |
TETSUYA | 0:1648bb4e70e5 | 227 | WriteReg(0x43, 0x0a); |
TETSUYA | 0:1648bb4e70e5 | 228 | WriteReg(0x44, 0xf0); |
TETSUYA | 0:1648bb4e70e5 | 229 | WriteReg(0x45, 0x34); |
TETSUYA | 0:1648bb4e70e5 | 230 | WriteReg(0x46, 0x58); |
TETSUYA | 0:1648bb4e70e5 | 231 | WriteReg(0x47, 0x28); |
TETSUYA | 0:1648bb4e70e5 | 232 | WriteReg(0x48, 0x3a); |
TETSUYA | 0:1648bb4e70e5 | 233 | WriteReg(0x59, 0x88); |
TETSUYA | 0:1648bb4e70e5 | 234 | WriteReg(0x5a, 0x88); |
TETSUYA | 0:1648bb4e70e5 | 235 | WriteReg(0x5b, 0x44); |
TETSUYA | 0:1648bb4e70e5 | 236 | WriteReg(0x5c, 0x67); |
TETSUYA | 0:1648bb4e70e5 | 237 | WriteReg(0x5d, 0x49); |
TETSUYA | 0:1648bb4e70e5 | 238 | WriteReg(0x5e, 0x0e); |
TETSUYA | 0:1648bb4e70e5 | 239 | WriteReg(0x6c, 0x0a); |
TETSUYA | 0:1648bb4e70e5 | 240 | WriteReg(0x6d, 0x55); |
TETSUYA | 0:1648bb4e70e5 | 241 | WriteReg(0x6e, 0x11); |
TETSUYA | 0:1648bb4e70e5 | 242 | WriteReg(0x6f, 0x9f); |
TETSUYA | 0:1648bb4e70e5 | 243 | // "9e for advance AWB" |
TETSUYA | 0:1648bb4e70e5 | 244 | WriteReg(0x6a, 0x40); |
TETSUYA | 0:1648bb4e70e5 | 245 | WriteReg(REG_BLUE, 0x40); |
TETSUYA | 0:1648bb4e70e5 | 246 | WriteReg(REG_RED, 0x60); |
TETSUYA | 0:1648bb4e70e5 | 247 | WriteReg(REG_COM8, COM8_FASTAEC|COM8_AECSTEP|COM8_BFILT|COM8_AGC|COM8_AEC|COM8_AWB); |
TETSUYA | 0:1648bb4e70e5 | 248 | |
TETSUYA | 0:1648bb4e70e5 | 249 | // Matrix coefficients |
TETSUYA | 0:1648bb4e70e5 | 250 | WriteReg(0x4f, 0x80); |
TETSUYA | 0:1648bb4e70e5 | 251 | WriteReg(0x50, 0x80); |
TETSUYA | 0:1648bb4e70e5 | 252 | WriteReg(0x51, 0); |
TETSUYA | 0:1648bb4e70e5 | 253 | WriteReg(0x52, 0x22); |
TETSUYA | 0:1648bb4e70e5 | 254 | WriteReg(0x53, 0x5e); |
TETSUYA | 0:1648bb4e70e5 | 255 | WriteReg(0x54, 0x80); |
TETSUYA | 0:1648bb4e70e5 | 256 | WriteReg(0x58, 0x9e); |
TETSUYA | 0:1648bb4e70e5 | 257 | |
TETSUYA | 0:1648bb4e70e5 | 258 | WriteReg(REG_COM16, COM16_AWBGAIN); |
TETSUYA | 0:1648bb4e70e5 | 259 | WriteReg(REG_EDGE, 0); |
TETSUYA | 0:1648bb4e70e5 | 260 | WriteReg(0x75, 0x05); |
TETSUYA | 0:1648bb4e70e5 | 261 | WriteReg(0x76, 0xe1); |
TETSUYA | 0:1648bb4e70e5 | 262 | WriteReg(0x4c, 0); |
TETSUYA | 0:1648bb4e70e5 | 263 | WriteReg(0x77, 0x01); |
TETSUYA | 0:1648bb4e70e5 | 264 | WriteReg(0x4b, 0x09); |
TETSUYA | 0:1648bb4e70e5 | 265 | WriteReg(0xc9, 0x60); |
TETSUYA | 0:1648bb4e70e5 | 266 | WriteReg(REG_COM16, 0x38); |
TETSUYA | 0:1648bb4e70e5 | 267 | WriteReg(0x56, 0x40); |
TETSUYA | 0:1648bb4e70e5 | 268 | |
TETSUYA | 0:1648bb4e70e5 | 269 | WriteReg(0x34, 0x11); |
TETSUYA | 0:1648bb4e70e5 | 270 | WriteReg(REG_COM11, COM11_EXP|COM11_HZAUTO_ON); |
TETSUYA | 0:1648bb4e70e5 | 271 | WriteReg(0xa4, 0x88); |
TETSUYA | 0:1648bb4e70e5 | 272 | WriteReg(0x96, 0); |
TETSUYA | 0:1648bb4e70e5 | 273 | WriteReg(0x97, 0x30); |
TETSUYA | 0:1648bb4e70e5 | 274 | WriteReg(0x98, 0x20); |
TETSUYA | 0:1648bb4e70e5 | 275 | WriteReg(0x99, 0x30); |
TETSUYA | 0:1648bb4e70e5 | 276 | WriteReg(0x9a, 0x84); |
TETSUYA | 0:1648bb4e70e5 | 277 | WriteReg(0x9b, 0x29); |
TETSUYA | 0:1648bb4e70e5 | 278 | WriteReg(0x9c, 0x03); |
TETSUYA | 0:1648bb4e70e5 | 279 | WriteReg(0x9d, 0x4c); |
TETSUYA | 0:1648bb4e70e5 | 280 | WriteReg(0x9e, 0x3f); |
TETSUYA | 0:1648bb4e70e5 | 281 | WriteReg(0x78, 0x04); |
TETSUYA | 0:1648bb4e70e5 | 282 | |
TETSUYA | 0:1648bb4e70e5 | 283 | // Extra-weird stuff. Some sort of multiplexor register |
TETSUYA | 0:1648bb4e70e5 | 284 | WriteReg(0x79, 0x01); |
TETSUYA | 0:1648bb4e70e5 | 285 | WriteReg(0xc8, 0xf0); |
TETSUYA | 0:1648bb4e70e5 | 286 | WriteReg(0x79, 0x0f); |
TETSUYA | 0:1648bb4e70e5 | 287 | WriteReg(0xc8, 0x00); |
TETSUYA | 0:1648bb4e70e5 | 288 | WriteReg(0x79, 0x10); |
TETSUYA | 0:1648bb4e70e5 | 289 | WriteReg(0xc8, 0x7e); |
TETSUYA | 0:1648bb4e70e5 | 290 | WriteReg(0x79, 0x0a); |
TETSUYA | 0:1648bb4e70e5 | 291 | WriteReg(0xc8, 0x80); |
TETSUYA | 0:1648bb4e70e5 | 292 | WriteReg(0x79, 0x0b); |
TETSUYA | 0:1648bb4e70e5 | 293 | WriteReg(0xc8, 0x01); |
TETSUYA | 0:1648bb4e70e5 | 294 | WriteReg(0x79, 0x0c); |
TETSUYA | 0:1648bb4e70e5 | 295 | WriteReg(0xc8, 0x0f); |
TETSUYA | 0:1648bb4e70e5 | 296 | WriteReg(0x79, 0x0d); |
TETSUYA | 0:1648bb4e70e5 | 297 | WriteReg(0xc8, 0x20); |
TETSUYA | 0:1648bb4e70e5 | 298 | WriteReg(0x79, 0x09); |
TETSUYA | 0:1648bb4e70e5 | 299 | WriteReg(0xc8, 0x80); |
TETSUYA | 0:1648bb4e70e5 | 300 | WriteReg(0x79, 0x02); |
TETSUYA | 0:1648bb4e70e5 | 301 | WriteReg(0xc8, 0xc0); |
TETSUYA | 0:1648bb4e70e5 | 302 | WriteReg(0x79, 0x03); |
TETSUYA | 0:1648bb4e70e5 | 303 | WriteReg(0xc8, 0x40); |
TETSUYA | 0:1648bb4e70e5 | 304 | WriteReg(0x79, 0x05); |
TETSUYA | 0:1648bb4e70e5 | 305 | WriteReg(0xc8, 0x30); |
TETSUYA | 0:1648bb4e70e5 | 306 | WriteReg(0x79, 0x26); |
TETSUYA | 0:1648bb4e70e5 | 307 | } |
TETSUYA | 0:1648bb4e70e5 | 308 | |
TETSUYA | 0:1648bb4e70e5 | 309 | void InitRGB444(void){ |
TETSUYA | 0:1648bb4e70e5 | 310 | int reg_com7 = ReadReg(REG_COM7); |
TETSUYA | 0:1648bb4e70e5 | 311 | |
TETSUYA | 0:1648bb4e70e5 | 312 | WriteReg(REG_COM7, reg_com7|COM7_RGB); |
TETSUYA | 0:1648bb4e70e5 | 313 | WriteReg(REG_RGB444, RGB444_ENABLE|RGB444_XBGR); |
TETSUYA | 0:1648bb4e70e5 | 314 | WriteReg(REG_COM15, COM15_R01FE|COM15_RGB444); |
TETSUYA | 0:1648bb4e70e5 | 315 | |
TETSUYA | 0:1648bb4e70e5 | 316 | WriteReg(REG_COM1, 0x40); // Magic reserved bit |
TETSUYA | 0:1648bb4e70e5 | 317 | WriteReg(REG_COM9, 0x38); // 16x gain ceiling; 0x8 is reserved bit |
TETSUYA | 0:1648bb4e70e5 | 318 | WriteReg(0x4f, 0xb3); // "matrix coefficient 1" |
TETSUYA | 0:1648bb4e70e5 | 319 | WriteReg(0x50, 0xb3); // "matrix coefficient 2" |
TETSUYA | 0:1648bb4e70e5 | 320 | WriteReg(0x51, 0x00); // vb |
TETSUYA | 0:1648bb4e70e5 | 321 | WriteReg(0x52, 0x3d); // "matrix coefficient 4" |
TETSUYA | 0:1648bb4e70e5 | 322 | WriteReg(0x53, 0xa7); // "matrix coefficient 5" |
TETSUYA | 0:1648bb4e70e5 | 323 | WriteReg(0x54, 0xe4); // "matrix coefficient 6" |
TETSUYA | 0:1648bb4e70e5 | 324 | WriteReg(REG_COM13, COM13_GAMMA|COM13_UVSAT|0x2); // Magic rsvd bit |
TETSUYA | 0:1648bb4e70e5 | 325 | |
TETSUYA | 0:1648bb4e70e5 | 326 | WriteReg(REG_TSLB, 0x04); |
TETSUYA | 0:1648bb4e70e5 | 327 | } |
TETSUYA | 0:1648bb4e70e5 | 328 | |
TETSUYA | 0:1648bb4e70e5 | 329 | void InitRGB555(void){ |
TETSUYA | 0:1648bb4e70e5 | 330 | int reg_com7 = ReadReg(REG_COM7); |
TETSUYA | 0:1648bb4e70e5 | 331 | |
TETSUYA | 0:1648bb4e70e5 | 332 | WriteReg(REG_COM7, reg_com7|COM7_RGB); |
TETSUYA | 0:1648bb4e70e5 | 333 | WriteReg(REG_RGB444, RGB444_DISABLE); |
TETSUYA | 0:1648bb4e70e5 | 334 | WriteReg(REG_COM15, COM15_RGB555|COM15_R00FF); |
TETSUYA | 0:1648bb4e70e5 | 335 | |
TETSUYA | 0:1648bb4e70e5 | 336 | WriteReg(REG_TSLB, 0x04); |
TETSUYA | 0:1648bb4e70e5 | 337 | |
TETSUYA | 0:1648bb4e70e5 | 338 | WriteReg(REG_COM1, 0x00); |
TETSUYA | 0:1648bb4e70e5 | 339 | WriteReg(REG_COM9, 0x38); // 16x gain ceiling; 0x8 is reserved bit |
TETSUYA | 0:1648bb4e70e5 | 340 | WriteReg(0x4f, 0xb3); // "matrix coefficient 1" |
TETSUYA | 0:1648bb4e70e5 | 341 | WriteReg(0x50, 0xb3); // "matrix coefficient 2" |
TETSUYA | 0:1648bb4e70e5 | 342 | WriteReg(0x51, 0x00); // vb |
TETSUYA | 0:1648bb4e70e5 | 343 | WriteReg(0x52, 0x3d); // "matrix coefficient 4" |
TETSUYA | 0:1648bb4e70e5 | 344 | WriteReg(0x53, 0xa7); // "matrix coefficient 5" |
TETSUYA | 0:1648bb4e70e5 | 345 | WriteReg(0x54, 0xe4); // "matrix coefficient 6" |
TETSUYA | 0:1648bb4e70e5 | 346 | WriteReg(REG_COM13, COM13_GAMMA|COM13_UVSAT); |
TETSUYA | 0:1648bb4e70e5 | 347 | } |
TETSUYA | 0:1648bb4e70e5 | 348 | |
TETSUYA | 0:1648bb4e70e5 | 349 | void InitRGB565(void){ |
TETSUYA | 0:1648bb4e70e5 | 350 | int reg_com7 = ReadReg(REG_COM7); |
TETSUYA | 0:1648bb4e70e5 | 351 | |
TETSUYA | 0:1648bb4e70e5 | 352 | WriteReg(REG_COM7, reg_com7|COM7_RGB); |
TETSUYA | 0:1648bb4e70e5 | 353 | WriteReg(REG_RGB444, RGB444_DISABLE); |
TETSUYA | 0:1648bb4e70e5 | 354 | WriteReg(REG_COM15, COM15_R00FF|COM15_RGB565); |
TETSUYA | 0:1648bb4e70e5 | 355 | |
TETSUYA | 0:1648bb4e70e5 | 356 | WriteReg(REG_TSLB, 0x04); |
TETSUYA | 0:1648bb4e70e5 | 357 | |
TETSUYA | 0:1648bb4e70e5 | 358 | WriteReg(REG_COM1, 0x00); |
TETSUYA | 0:1648bb4e70e5 | 359 | WriteReg(REG_COM9, 0x38); // 16x gain ceiling; 0x8 is reserved bit |
TETSUYA | 0:1648bb4e70e5 | 360 | WriteReg(0x4f, 0xb3); // "matrix coefficient 1" |
TETSUYA | 0:1648bb4e70e5 | 361 | WriteReg(0x50, 0xb3); // "matrix coefficient 2" |
TETSUYA | 0:1648bb4e70e5 | 362 | WriteReg(0x51, 0x00); // vb |
TETSUYA | 0:1648bb4e70e5 | 363 | WriteReg(0x52, 0x3d); // "matrix coefficient 4" |
TETSUYA | 0:1648bb4e70e5 | 364 | WriteReg(0x53, 0xa7); // "matrix coefficient 5" |
TETSUYA | 0:1648bb4e70e5 | 365 | WriteReg(0x54, 0xe4); // "matrix coefficient 6" |
TETSUYA | 0:1648bb4e70e5 | 366 | WriteReg(REG_COM13, COM13_GAMMA|COM13_UVSAT); |
TETSUYA | 0:1648bb4e70e5 | 367 | } |
TETSUYA | 0:1648bb4e70e5 | 368 | |
TETSUYA | 0:1648bb4e70e5 | 369 | void InitYUV(void){ |
TETSUYA | 0:1648bb4e70e5 | 370 | int reg_com7 = ReadReg(REG_COM7); |
TETSUYA | 0:1648bb4e70e5 | 371 | |
TETSUYA | 0:1648bb4e70e5 | 372 | WriteReg(REG_COM7, reg_com7|COM7_YUV); |
TETSUYA | 0:1648bb4e70e5 | 373 | WriteReg(REG_RGB444, RGB444_DISABLE); |
TETSUYA | 0:1648bb4e70e5 | 374 | WriteReg(REG_COM15, COM15_R00FF); |
TETSUYA | 0:1648bb4e70e5 | 375 | |
TETSUYA | 0:1648bb4e70e5 | 376 | WriteReg(REG_TSLB, 0x04); |
TETSUYA | 0:1648bb4e70e5 | 377 | // WriteReg(REG_TSLB, 0x14); |
TETSUYA | 0:1648bb4e70e5 | 378 | // WriteReg(REG_MANU, 0x00); |
TETSUYA | 0:1648bb4e70e5 | 379 | // WriteReg(REG_MANV, 0x00); |
TETSUYA | 0:1648bb4e70e5 | 380 | |
TETSUYA | 0:1648bb4e70e5 | 381 | WriteReg(REG_COM1, 0x00); |
TETSUYA | 0:1648bb4e70e5 | 382 | WriteReg(REG_COM9, 0x18); // 4x gain ceiling; 0x8 is reserved bit |
TETSUYA | 0:1648bb4e70e5 | 383 | WriteReg(0x4f, 0x80); // "matrix coefficient 1" |
TETSUYA | 0:1648bb4e70e5 | 384 | WriteReg(0x50, 0x80); // "matrix coefficient 2" |
TETSUYA | 0:1648bb4e70e5 | 385 | WriteReg(0x51, 0x00); // vb |
TETSUYA | 0:1648bb4e70e5 | 386 | WriteReg(0x52, 0x22); // "matrix coefficient 4" |
TETSUYA | 0:1648bb4e70e5 | 387 | WriteReg(0x53, 0x5e); // "matrix coefficient 5" |
TETSUYA | 0:1648bb4e70e5 | 388 | WriteReg(0x54, 0x80); // "matrix coefficient 6" |
TETSUYA | 0:1648bb4e70e5 | 389 | WriteReg(REG_COM13, COM13_GAMMA|COM13_UVSAT|COM13_UVSWAP); |
TETSUYA | 0:1648bb4e70e5 | 390 | } |
TETSUYA | 0:1648bb4e70e5 | 391 | |
TETSUYA | 0:1648bb4e70e5 | 392 | void InitBayerRGB(void){ |
TETSUYA | 0:1648bb4e70e5 | 393 | int reg_com7 = ReadReg(REG_COM7); |
TETSUYA | 0:1648bb4e70e5 | 394 | |
TETSUYA | 0:1648bb4e70e5 | 395 | // odd line BGBG... even line GRGR... |
TETSUYA | 0:1648bb4e70e5 | 396 | WriteReg(REG_COM7, reg_com7|COM7_BAYER); |
TETSUYA | 0:1648bb4e70e5 | 397 | // odd line GBGB... even line RGRG... |
TETSUYA | 0:1648bb4e70e5 | 398 | //WriteReg(REG_COM7, reg_com7|COM7_PBAYER); |
TETSUYA | 0:1648bb4e70e5 | 399 | |
TETSUYA | 0:1648bb4e70e5 | 400 | WriteReg(REG_RGB444, RGB444_DISABLE); |
TETSUYA | 0:1648bb4e70e5 | 401 | WriteReg(REG_COM15, COM15_R00FF); |
TETSUYA | 0:1648bb4e70e5 | 402 | |
TETSUYA | 0:1648bb4e70e5 | 403 | WriteReg(REG_COM13, 0x08); /* No gamma, magic rsvd bit */ |
TETSUYA | 0:1648bb4e70e5 | 404 | WriteReg(REG_COM16, 0x3d); /* Edge enhancement, denoise */ |
TETSUYA | 0:1648bb4e70e5 | 405 | WriteReg(REG_REG76, 0xe1); /* Pix correction, magic rsvd */ |
TETSUYA | 0:1648bb4e70e5 | 406 | |
TETSUYA | 0:1648bb4e70e5 | 407 | WriteReg(REG_TSLB, 0x04); |
TETSUYA | 0:1648bb4e70e5 | 408 | } |
TETSUYA | 0:1648bb4e70e5 | 409 | |
TETSUYA | 0:1648bb4e70e5 | 410 | void InitVGA(void) { |
TETSUYA | 0:1648bb4e70e5 | 411 | // VGA |
TETSUYA | 0:1648bb4e70e5 | 412 | int reg_com7 = ReadReg(REG_COM7); |
TETSUYA | 0:1648bb4e70e5 | 413 | |
TETSUYA | 0:1648bb4e70e5 | 414 | WriteReg(REG_COM7,reg_com7|COM7_VGA); |
TETSUYA | 0:1648bb4e70e5 | 415 | |
TETSUYA | 0:1648bb4e70e5 | 416 | WriteReg(REG_HSTART,HSTART_VGA); |
TETSUYA | 0:1648bb4e70e5 | 417 | WriteReg(REG_HSTOP,HSTOP_VGA); |
TETSUYA | 0:1648bb4e70e5 | 418 | WriteReg(REG_HREF,HREF_VGA); |
TETSUYA | 0:1648bb4e70e5 | 419 | WriteReg(REG_VSTART,VSTART_VGA); |
TETSUYA | 0:1648bb4e70e5 | 420 | WriteReg(REG_VSTOP,VSTOP_VGA); |
TETSUYA | 0:1648bb4e70e5 | 421 | WriteReg(REG_VREF,VREF_VGA); |
TETSUYA | 0:1648bb4e70e5 | 422 | WriteReg(REG_COM3, COM3_VGA); |
TETSUYA | 0:1648bb4e70e5 | 423 | WriteReg(REG_COM14, COM14_VGA); |
TETSUYA | 0:1648bb4e70e5 | 424 | WriteReg(REG_SCALING_XSC, SCALING_XSC_VGA); |
TETSUYA | 0:1648bb4e70e5 | 425 | WriteReg(REG_SCALING_YSC, SCALING_YSC_VGA); |
TETSUYA | 0:1648bb4e70e5 | 426 | WriteReg(REG_SCALING_DCWCTR, SCALING_DCWCTR_VGA); |
TETSUYA | 0:1648bb4e70e5 | 427 | WriteReg(REG_SCALING_PCLK_DIV, SCALING_PCLK_DIV_VGA); |
TETSUYA | 0:1648bb4e70e5 | 428 | WriteReg(REG_SCALING_PCLK_DELAY, SCALING_PCLK_DELAY_VGA); |
TETSUYA | 0:1648bb4e70e5 | 429 | } |
TETSUYA | 0:1648bb4e70e5 | 430 | |
TETSUYA | 0:1648bb4e70e5 | 431 | void InitFIFO_2bytes_color_nealy_limit_size(void) { |
TETSUYA | 0:1648bb4e70e5 | 432 | // nealy FIFO limit 544x360 |
TETSUYA | 0:1648bb4e70e5 | 433 | int reg_com7 = ReadReg(REG_COM7); |
TETSUYA | 0:1648bb4e70e5 | 434 | |
TETSUYA | 0:1648bb4e70e5 | 435 | WriteReg(REG_COM7,reg_com7|COM7_VGA); |
TETSUYA | 0:1648bb4e70e5 | 436 | |
TETSUYA | 0:1648bb4e70e5 | 437 | WriteReg(REG_HSTART,HSTART_VGA); |
TETSUYA | 0:1648bb4e70e5 | 438 | WriteReg(REG_HSTOP,HSTOP_VGA); |
TETSUYA | 0:1648bb4e70e5 | 439 | WriteReg(REG_HREF,HREF_VGA); |
TETSUYA | 0:1648bb4e70e5 | 440 | WriteReg(REG_VSTART,VSTART_VGA); |
TETSUYA | 0:1648bb4e70e5 | 441 | WriteReg(REG_VSTOP,VSTOP_VGA); |
TETSUYA | 0:1648bb4e70e5 | 442 | WriteReg(REG_VREF,VREF_VGA); |
TETSUYA | 0:1648bb4e70e5 | 443 | WriteReg(REG_COM3, COM3_VGA); |
TETSUYA | 0:1648bb4e70e5 | 444 | WriteReg(REG_COM14, COM14_VGA); |
TETSUYA | 0:1648bb4e70e5 | 445 | WriteReg(REG_SCALING_XSC, SCALING_XSC_VGA); |
TETSUYA | 0:1648bb4e70e5 | 446 | WriteReg(REG_SCALING_YSC, SCALING_YSC_VGA); |
TETSUYA | 0:1648bb4e70e5 | 447 | WriteReg(REG_SCALING_DCWCTR, SCALING_DCWCTR_VGA); |
TETSUYA | 0:1648bb4e70e5 | 448 | WriteReg(REG_SCALING_PCLK_DIV, SCALING_PCLK_DIV_VGA); |
TETSUYA | 0:1648bb4e70e5 | 449 | WriteReg(REG_SCALING_PCLK_DELAY, SCALING_PCLK_DELAY_VGA); |
TETSUYA | 0:1648bb4e70e5 | 450 | |
TETSUYA | 0:1648bb4e70e5 | 451 | WriteReg(REG_HSTART, 0x17); |
TETSUYA | 0:1648bb4e70e5 | 452 | WriteReg(REG_HSTOP, 0x5b); |
TETSUYA | 0:1648bb4e70e5 | 453 | WriteReg(REG_VSTART, 0x12); |
TETSUYA | 0:1648bb4e70e5 | 454 | WriteReg(REG_VSTOP, 0x6c); |
TETSUYA | 0:1648bb4e70e5 | 455 | } |
TETSUYA | 0:1648bb4e70e5 | 456 | |
TETSUYA | 0:1648bb4e70e5 | 457 | void InitVGA_3_4(void) { |
TETSUYA | 0:1648bb4e70e5 | 458 | // VGA 3/4 -> 480x360 |
TETSUYA | 0:1648bb4e70e5 | 459 | int reg_com7 = ReadReg(REG_COM7); |
TETSUYA | 0:1648bb4e70e5 | 460 | |
TETSUYA | 0:1648bb4e70e5 | 461 | WriteReg(REG_COM7,reg_com7|COM7_VGA); |
TETSUYA | 0:1648bb4e70e5 | 462 | |
TETSUYA | 0:1648bb4e70e5 | 463 | WriteReg(REG_HSTART,HSTART_VGA); |
TETSUYA | 0:1648bb4e70e5 | 464 | WriteReg(REG_HSTOP,HSTOP_VGA); |
TETSUYA | 0:1648bb4e70e5 | 465 | WriteReg(REG_HREF,HREF_VGA); |
TETSUYA | 0:1648bb4e70e5 | 466 | WriteReg(REG_VSTART,VSTART_VGA); |
TETSUYA | 0:1648bb4e70e5 | 467 | WriteReg(REG_VSTOP,VSTOP_VGA); |
TETSUYA | 0:1648bb4e70e5 | 468 | WriteReg(REG_VREF,VREF_VGA); |
TETSUYA | 0:1648bb4e70e5 | 469 | WriteReg(REG_COM3, COM3_VGA); |
TETSUYA | 0:1648bb4e70e5 | 470 | WriteReg(REG_COM14, COM14_VGA); |
TETSUYA | 0:1648bb4e70e5 | 471 | WriteReg(REG_SCALING_XSC, SCALING_XSC_VGA); |
TETSUYA | 0:1648bb4e70e5 | 472 | WriteReg(REG_SCALING_YSC, SCALING_YSC_VGA); |
TETSUYA | 0:1648bb4e70e5 | 473 | WriteReg(REG_SCALING_DCWCTR, SCALING_DCWCTR_VGA); |
TETSUYA | 0:1648bb4e70e5 | 474 | WriteReg(REG_SCALING_PCLK_DIV, SCALING_PCLK_DIV_VGA); |
TETSUYA | 0:1648bb4e70e5 | 475 | WriteReg(REG_SCALING_PCLK_DELAY, SCALING_PCLK_DELAY_VGA); |
TETSUYA | 0:1648bb4e70e5 | 476 | |
TETSUYA | 0:1648bb4e70e5 | 477 | WriteReg(REG_HSTART, 0x1b); |
TETSUYA | 0:1648bb4e70e5 | 478 | WriteReg(REG_HSTOP, 0x57); |
TETSUYA | 0:1648bb4e70e5 | 479 | WriteReg(REG_VSTART, 0x12); |
TETSUYA | 0:1648bb4e70e5 | 480 | WriteReg(REG_VSTOP, 0x6c); |
TETSUYA | 0:1648bb4e70e5 | 481 | } |
TETSUYA | 0:1648bb4e70e5 | 482 | |
TETSUYA | 0:1648bb4e70e5 | 483 | void InitQVGA(void) { |
TETSUYA | 0:1648bb4e70e5 | 484 | // QQVGA |
TETSUYA | 0:1648bb4e70e5 | 485 | int reg_com7 = ReadReg(REG_COM7); |
TETSUYA | 0:1648bb4e70e5 | 486 | |
TETSUYA | 0:1648bb4e70e5 | 487 | WriteReg(REG_COM7,reg_com7|COM7_QVGA); |
TETSUYA | 0:1648bb4e70e5 | 488 | |
TETSUYA | 0:1648bb4e70e5 | 489 | WriteReg(REG_HSTART,HSTART_QVGA); |
TETSUYA | 0:1648bb4e70e5 | 490 | WriteReg(REG_HSTOP,HSTOP_QVGA); |
TETSUYA | 0:1648bb4e70e5 | 491 | WriteReg(REG_HREF,HREF_QVGA); |
TETSUYA | 0:1648bb4e70e5 | 492 | WriteReg(REG_VSTART,VSTART_QVGA); |
TETSUYA | 0:1648bb4e70e5 | 493 | WriteReg(REG_VSTOP,VSTOP_QVGA); |
TETSUYA | 0:1648bb4e70e5 | 494 | WriteReg(REG_VREF,VREF_QVGA); |
TETSUYA | 0:1648bb4e70e5 | 495 | WriteReg(REG_COM3, COM3_QVGA); |
TETSUYA | 0:1648bb4e70e5 | 496 | WriteReg(REG_COM14, COM14_QVGA); |
TETSUYA | 0:1648bb4e70e5 | 497 | WriteReg(REG_SCALING_XSC, SCALING_XSC_QVGA); |
TETSUYA | 0:1648bb4e70e5 | 498 | WriteReg(REG_SCALING_YSC, SCALING_YSC_QVGA); |
TETSUYA | 0:1648bb4e70e5 | 499 | WriteReg(REG_SCALING_DCWCTR, SCALING_DCWCTR_QVGA); |
TETSUYA | 0:1648bb4e70e5 | 500 | WriteReg(REG_SCALING_PCLK_DIV, SCALING_PCLK_DIV_QVGA); |
TETSUYA | 0:1648bb4e70e5 | 501 | WriteReg(REG_SCALING_PCLK_DELAY, SCALING_PCLK_DELAY_QVGA); |
TETSUYA | 0:1648bb4e70e5 | 502 | } |
TETSUYA | 0:1648bb4e70e5 | 503 | |
TETSUYA | 0:1648bb4e70e5 | 504 | void InitQQVGA(void) { |
TETSUYA | 0:1648bb4e70e5 | 505 | // QQVGA |
TETSUYA | 0:1648bb4e70e5 | 506 | int reg_com7 = ReadReg(REG_COM7); |
TETSUYA | 0:1648bb4e70e5 | 507 | |
TETSUYA | 0:1648bb4e70e5 | 508 | WriteReg(REG_COM7,reg_com7|COM7_QQVGA); |
TETSUYA | 0:1648bb4e70e5 | 509 | |
TETSUYA | 0:1648bb4e70e5 | 510 | WriteReg(REG_HSTART,HSTART_QQVGA); |
TETSUYA | 0:1648bb4e70e5 | 511 | WriteReg(REG_HSTOP,HSTOP_QQVGA); |
TETSUYA | 0:1648bb4e70e5 | 512 | WriteReg(REG_HREF,HREF_QQVGA); |
TETSUYA | 0:1648bb4e70e5 | 513 | WriteReg(REG_VSTART,VSTART_QQVGA); |
TETSUYA | 0:1648bb4e70e5 | 514 | WriteReg(REG_VSTOP,VSTOP_QQVGA); |
TETSUYA | 0:1648bb4e70e5 | 515 | WriteReg(REG_VREF,VREF_QQVGA); |
TETSUYA | 0:1648bb4e70e5 | 516 | WriteReg(REG_COM3, COM3_QQVGA); |
TETSUYA | 0:1648bb4e70e5 | 517 | WriteReg(REG_COM14, COM14_QQVGA); |
TETSUYA | 0:1648bb4e70e5 | 518 | WriteReg(REG_SCALING_XSC, SCALING_XSC_QQVGA); |
TETSUYA | 0:1648bb4e70e5 | 519 | WriteReg(REG_SCALING_YSC, SCALING_YSC_QQVGA); |
TETSUYA | 0:1648bb4e70e5 | 520 | WriteReg(REG_SCALING_DCWCTR, SCALING_DCWCTR_QQVGA); |
TETSUYA | 0:1648bb4e70e5 | 521 | WriteReg(REG_SCALING_PCLK_DIV, SCALING_PCLK_DIV_QQVGA); |
TETSUYA | 0:1648bb4e70e5 | 522 | WriteReg(REG_SCALING_PCLK_DELAY, SCALING_PCLK_DELAY_QQVGA); |
TETSUYA | 0:1648bb4e70e5 | 523 | } |
TETSUYA | 0:1648bb4e70e5 | 524 | |
TETSUYA | 0:1648bb4e70e5 | 525 | // vsync handler |
TETSUYA | 0:1648bb4e70e5 | 526 | void VsyncHandler(void) |
TETSUYA | 0:1648bb4e70e5 | 527 | { |
TETSUYA | 0:1648bb4e70e5 | 528 | // Capture Enable |
TETSUYA | 0:1648bb4e70e5 | 529 | if (CaptureReq) { |
TETSUYA | 0:1648bb4e70e5 | 530 | wen = 1; |
TETSUYA | 0:1648bb4e70e5 | 531 | Done = false; |
TETSUYA | 0:1648bb4e70e5 | 532 | CaptureReq = false; |
TETSUYA | 0:1648bb4e70e5 | 533 | } else { |
TETSUYA | 0:1648bb4e70e5 | 534 | wen = 0; |
TETSUYA | 0:1648bb4e70e5 | 535 | if (Busy) { |
TETSUYA | 0:1648bb4e70e5 | 536 | Busy = false; |
TETSUYA | 0:1648bb4e70e5 | 537 | Done = true; |
TETSUYA | 0:1648bb4e70e5 | 538 | } |
TETSUYA | 0:1648bb4e70e5 | 539 | } |
TETSUYA | 0:1648bb4e70e5 | 540 | |
TETSUYA | 0:1648bb4e70e5 | 541 | // Hline Counter |
TETSUYA | 0:1648bb4e70e5 | 542 | LastLines = LineCounter; |
TETSUYA | 0:1648bb4e70e5 | 543 | LineCounter = 0; |
TETSUYA | 0:1648bb4e70e5 | 544 | } |
TETSUYA | 0:1648bb4e70e5 | 545 | |
TETSUYA | 0:1648bb4e70e5 | 546 | // href handler |
TETSUYA | 0:1648bb4e70e5 | 547 | void HrefHandler(void) |
TETSUYA | 0:1648bb4e70e5 | 548 | { |
TETSUYA | 0:1648bb4e70e5 | 549 | LineCounter++; |
TETSUYA | 0:1648bb4e70e5 | 550 | } |
TETSUYA | 0:1648bb4e70e5 | 551 | |
TETSUYA | 0:1648bb4e70e5 | 552 | // Data Read |
TETSUYA | 0:1648bb4e70e5 | 553 | int ReadOneByte(void) |
TETSUYA | 0:1648bb4e70e5 | 554 | { |
TETSUYA | 0:1648bb4e70e5 | 555 | int result; |
TETSUYA | 0:1648bb4e70e5 | 556 | rclk = 1; |
TETSUYA | 0:1648bb4e70e5 | 557 | // wait_us(1); |
TETSUYA | 0:1648bb4e70e5 | 558 | result = data; |
TETSUYA | 0:1648bb4e70e5 | 559 | rclk = 0; |
TETSUYA | 0:1648bb4e70e5 | 560 | return result; |
TETSUYA | 0:1648bb4e70e5 | 561 | } |
TETSUYA | 0:1648bb4e70e5 | 562 | |
TETSUYA | 0:1648bb4e70e5 | 563 | // Data Start |
TETSUYA | 0:1648bb4e70e5 | 564 | void ReadStart(void) |
TETSUYA | 0:1648bb4e70e5 | 565 | { |
TETSUYA | 0:1648bb4e70e5 | 566 | rrst = 0; |
TETSUYA | 0:1648bb4e70e5 | 567 | oe = 0; |
TETSUYA | 0:1648bb4e70e5 | 568 | wait_us(1); |
TETSUYA | 0:1648bb4e70e5 | 569 | rclk = 0; |
TETSUYA | 0:1648bb4e70e5 | 570 | wait_us(1); |
TETSUYA | 0:1648bb4e70e5 | 571 | rclk = 1; |
TETSUYA | 0:1648bb4e70e5 | 572 | wait_us(1); |
TETSUYA | 0:1648bb4e70e5 | 573 | rrst = 1; |
TETSUYA | 0:1648bb4e70e5 | 574 | } |
TETSUYA | 0:1648bb4e70e5 | 575 | |
TETSUYA | 0:1648bb4e70e5 | 576 | // Data Stop |
TETSUYA | 0:1648bb4e70e5 | 577 | void ReadStop(void) |
TETSUYA | 0:1648bb4e70e5 | 578 | { |
TETSUYA | 0:1648bb4e70e5 | 579 | oe = 1; |
TETSUYA | 0:1648bb4e70e5 | 580 | ReadOneByte(); |
TETSUYA | 0:1648bb4e70e5 | 581 | rclk = 1; |
TETSUYA | 0:1648bb4e70e5 | 582 | } |
TETSUYA | 0:1648bb4e70e5 | 583 | }; |