📄 csi.c
字号:
if(pal==0)
{
//insert dummy pixel for NTSC
// Write8_I2C(0x2A,0x00);Delay();
// Write8_I2C(0x2B,0x5E);Delay(); //Delay 94 pixels
// Write8_I2C(0x2A,0x00);Delay();
// Write8_I2C(0x2B,0x64);Delay(); //Delay 100 pixels
// Write8_I2C(0x2A,0x00);Delay();
// Write8_I2C(0x2B,0x50);Delay(); //Delay 80 pixels
// Write8_I2C(0x2D,0x10);Delay(); //Delay 32 lines
Write8_I2C(0x2D,0x40);Delay(); //Delay 32 lines
}
else
{
//insert dummy pixel for PAL
Write8_I2C(0x2A,0x00);Delay();
Write8_I2C(0x2B,0x64);Delay(); //Delay 100 pixels
Write8_I2C(0x2D,0x32);Delay(); //Delay 50 lines
}
}
void init_ov7660_qvga(int pal)
{
unsigned int a;
// *I2CCVR=30;
*P_I2CCVR=60;
*P_I2CID=0x42;//for OV7660
// Reset All Register for Default Value
Write8_I2C(0x12,0x80);Delay();
Write8_I2C(0x12,0x80);Delay();
a=Read8_I2C(0x0A);
if(a!=0x76) while(1);
a=Read8_I2C(0x0B);
if(a!=0x60) while(1);
// Write8_I2C(0x11,0x81);Delay(); //Use 27/2 = 13.5 MHz
Write8_I2C(0x11,0x80);Delay(); //Use 27/1 = 27.0 MHz
Write8_I2C(0x92,0x00);Delay();
Write8_I2C(0x93,0x00);Delay();
Write8_I2C(0x9D,0x62);Delay(); // Band Filter For 50 Hz
Write8_I2C(0x9E,0x52);Delay(); // Band Filter For 60 Hz
Write8_I2C(0x3B,0x02);Delay(); // 02 => 60 Hz, 00 => 50 Hz
Write8_I2C(0x13,0xF2);Delay(); // Enable Band Filter, AWB, Fast AG
Write8_I2C(0x10,0x00);Delay(); // Reset AEC
Write8_I2C(0x00,0x00);Delay(); // Reset AGC
Write8_I2C(0x01,0x80);Delay(); // Reset BLUE Gain
Write8_I2C(0x02,0x80);Delay(); // Reset RED Gain
Write8_I2C(0x13,0xF7);Delay(); // Enable AGC/AEC, Fast Algorithm
// Write8_I2C(0x13,0x77);Delay(); // Enable AGC/AEC, Slow Algorithm
if (YUVIN_TEST)
{
Write8_I2C(0x12,0x10);Delay(); //QVGA YUV output
}
else
{
Write8_I2C(0x12,0x14);Delay(); //QVGA RGB output
}
Write8_I2C(0x04,0x40);Delay(); //enable CCIR656
if (YUVIN_TEST)
{
Write8_I2C(0x18,0x4B);Delay(); // HSTOP ??
Write8_I2C(0x17,0x23);Delay(); // HSTART ??
Write8_I2C(0x32,0xBF);Delay(); // HSTART/HSTOP ??
}
else
{
Write8_I2C(0x18,0x4B);Delay(); // HSTOP ??
Write8_I2C(0x17,0x23);Delay(); // HSTART ??
Write8_I2C(0x32,0xBF);Delay(); // HSTART/HSTOP ??
}
Write8_I2C(0x19,0x02);Delay(); // VSTART
Write8_I2C(0x1A,0x7A);Delay(); // VEND
Write8_I2C(0x03,0x00);Delay(); // VSTART/VEND Low 2 bits
Write8_I2C(0x0E,0x84);Delay(); // High Frame Rate ??
Write8_I2C(0x0F,0x62);Delay(); // Enable BLC
Write8_I2C(0x15,0x40);Delay(); // HSYNC Output
Write8_I2C(0x16,0x02);Delay(); // ??
Write8_I2C(0x1B,0x01);Delay(); // Delay Pixel
Write8_I2C(0x1E,0x31);Delay(); // Vertical Flip, Mirror + ??
Write8_I2C(0x29,0x3C);Delay(); // 3C => External REG, Internal REG
Write8_I2C(0x33,0x00);Delay(); // ??
Write8_I2C(0x34,0x07);Delay(); // ??
Write8_I2C(0x35,0x84);Delay(); // ??
Write8_I2C(0x36,0x00);Delay(); // ??
Write8_I2C(0x38,0x13);Delay(); // ??
Write8_I2C(0x39,0x43);Delay(); // ??
Write8_I2C(0x3A,0x0C);Delay(); // UYVY Output
Write8_I2C(0x3C,0xEC);Delay(); // Always has HREF
Write8_I2C(0x3D,0x90);Delay(); // Important!!
Write8_I2C(0x3F,0x29);Delay(); // Edge Enchance
Write8_I2C(0x40,0x81);Delay(); // Output 01 ~ FE
Write8_I2C(0x41,0x20);Delay(); // Enable Edge Enchancement
Write8_I2C(0x6B,0x0A);Delay(); // ??
Write8_I2C(0xA1,0xC8);Delay(); // De-noise, Erase White Pixel
Write8_I2C(0x69,0x80);Delay(); // B Channel Pre-Gain
Write8_I2C(0x43,0xF0);Delay(); // ??
Write8_I2C(0x44,0x10);Delay(); // ??
Write8_I2C(0x45,0x78);Delay(); // ??
Write8_I2C(0x46,0xA8);Delay(); // ??
Write8_I2C(0x47,0x60);Delay(); // ??
Write8_I2C(0x48,0x80);Delay(); // ??
Write8_I2C(0x59,0xBA);Delay(); // ??
Write8_I2C(0x5A,0x9A);Delay(); // ??
Write8_I2C(0x5B,0x22);Delay(); // ??
Write8_I2C(0x5C,0xB9);Delay(); // ??
Write8_I2C(0x5D,0x9B);Delay(); // ??
Write8_I2C(0x5E,0x10);Delay(); // ??
Write8_I2C(0x5F,0xE0);Delay(); // ??
Write8_I2C(0x60,0x85);Delay(); // 05 is advance AWB
Write8_I2C(0x61,0x60);Delay(); // ??
Write8_I2C(0x9F,0x9D);Delay(); // ??
Write8_I2C(0xA0,0xA0);Delay(); // ??
if (YUVIN_TEST)
{
// Matrix Coefficient
Write8_I2C(0x4F,0x66);Delay(); // ??
Write8_I2C(0x50,0x6B);Delay(); // ??
Write8_I2C(0x51,0x05);Delay(); // ??
Write8_I2C(0x52,0x19);Delay(); // ??
Write8_I2C(0x53,0x40);Delay(); // ??
Write8_I2C(0x54,0x59);Delay(); // ??
Write8_I2C(0x55,0x40);Delay(); // ??
Write8_I2C(0x56,0x40);Delay(); // ??
Write8_I2C(0x57,0x40);Delay(); // ??
Write8_I2C(0x58,0x0D);Delay(); // ??
}
else
{
// Matrix Coefficient
Write8_I2C(0x4F,0xAE);Delay(); // ??
Write8_I2C(0x50,0x26);Delay(); // ??
Write8_I2C(0x51,0x07);Delay(); // ??
Write8_I2C(0x52,0x1A);Delay(); // ??
Write8_I2C(0x53,0xA9);Delay(); // ??
Write8_I2C(0x54,0x0F);Delay(); // ??
Write8_I2C(0x55,0x05);Delay(); // ??
Write8_I2C(0x56,0x46);Delay(); // ??
Write8_I2C(0x57,0xCB);Delay(); // ??
Write8_I2C(0x58,0x77);Delay(); // ??
}
Write8_I2C(0x8B,0xCC);Delay(); // ??
Write8_I2C(0x8C,0xCC);Delay(); // ??
Write8_I2C(0x8D,0xCF);Delay(); // ??
// Gamma Curve
Write8_I2C(0x6C,0x40);Delay();
Write8_I2C(0x6D,0x30);Delay();
Write8_I2C(0x6E,0x4B);Delay();
Write8_I2C(0x6F,0x60);Delay();
Write8_I2C(0x70,0x70);Delay();
Write8_I2C(0x71,0x70);Delay();
Write8_I2C(0x72,0x70);Delay();
Write8_I2C(0x73,0x70);Delay();
Write8_I2C(0x74,0x60);Delay();
Write8_I2C(0x75,0x60);Delay();
Write8_I2C(0x76,0x50);Delay();
Write8_I2C(0x77,0x48);Delay();
Write8_I2C(0x78,0x3A);Delay();
Write8_I2C(0x79,0x2E);Delay();
Write8_I2C(0x7A,0x28);Delay();
Write8_I2C(0x7B,0x22);Delay();
Write8_I2C(0x7C,0x04);Delay();
Write8_I2C(0x7D,0x07);Delay();
Write8_I2C(0x7E,0x10);Delay();
Write8_I2C(0x7F,0x28);Delay();
Write8_I2C(0x80,0x36);Delay();
Write8_I2C(0x81,0x44);Delay();
Write8_I2C(0x82,0x52);Delay();
Write8_I2C(0x83,0x60);Delay();
Write8_I2C(0x84,0x6C);Delay();
Write8_I2C(0x85,0x78);Delay();
Write8_I2C(0x86,0x8C);Delay();
Write8_I2C(0x87,0x9E);Delay();
Write8_I2C(0x88,0xBB);Delay();
Write8_I2C(0x89,0xD2);Delay();
Write8_I2C(0x8A,0xE6);Delay();
//Write8_I2C(0x14,0x2E);Delay(); // Enable Fram Drop
Write8_I2C(0x14,0x28);Delay(); // Disable Frame Drop
// Write8_I2C(0x24,0x68);Delay(); // AEW
// Write8_I2C(0x25,0x5C);Delay(); // AEB
Write8_I2C(0x24,0x88);Delay(); // AEW
Write8_I2C(0x25,0x78);Delay(); // AEB
// Lens Correction
Write8_I2C(0x62,0x20);Delay(); // AEB
if(pal==0)
{
//insert dummy pixel for NTSC
// Write8_I2C(0x2A,0x00);Delay();
// Write8_I2C(0x2B,0x5E);Delay(); //Delay 94 pixels
// Write8_I2C(0x2A,0x00);Delay();
// Write8_I2C(0x2B,0x64);Delay(); //Delay 100 pixels
// Write8_I2C(0x2A,0x00);Delay();
// Write8_I2C(0x2B,0x50);Delay(); //Delay 80 pixels
Write8_I2C(0x2D,0x2D);Delay(); //Delay 64 lines
}
else
{
//insert dummy pixel for PAL
Write8_I2C(0x2A,0x00);Delay();
Write8_I2C(0x2B,0x64);Delay(); //Delay 100 pixels
Write8_I2C(0x2D,0x32);Delay(); //Delay 50 lines
}
}
void ov7648_vga(void)
{
*P_CSI_IRQEN = FRAME_END|TG_OF;
*P_CSI_TG_CR = CSIEN|YUV_TYPE|VGAEN|FGET_FALL|FIELDSEL|CSICLKOINV|(CCIR656_TEST<<8)|VADD_FALL|VRST_FALL|HRST_FALL|D_TYPE4|(CSIINTL<<15); //|RESIZE;--this parameter is used for LCD
// Use I2C to initial QV7648
init_ov7648(0, PAL_TEST);
}
void ov7648_qvga(void)
{
*P_CSI_IRQEN = FRAME_END|TG_OF;
*P_CSI_TG_CR = CSIEN|YUV_TYPE|CSICLKOINV|(CCIR656_TEST<<8);
if(CSIINTL)
*P_CSI_TG_CR |=(VADD_FALL|VRST_FALL|HRST_FALL|D_TYPE5);
else
*P_CSI_TG_CR |=(VADD_RISE|VRST_FALL|HRST_RISE|D_TYPE7);
init_ov7648(1, PAL_TEST);
// Enable TV Encoder
if(YUVOUT_TEST)
*P_TV_CONTROL = TVEN|TVINTL|TVLPF1|Y4U4V4|(PAL_TEST<<1);
else
*P_TV_CONTROL = TVEN|TVINTL|TVLPF1|TVRGB2YUV|(PAL_TEST<<1);
}
void init_ov7648(int qvga, int pal)
{
unsigned int a;
*P_I2CCVR=60;
*P_I2CID=0x42; //for OV7648
Write8_I2C(0x12,0x80); // OV7648 software reset
for(a=0;a<1000;a++); // Delay for reset
if (YUVIN_TEST)
Write8_I2C(0x12,0x14); //YUV/YCbCr + no mirror
// Write8_I2C(0x12,0x54); //YUV/YCbCr + mirror
else
Write8_I2C(0x12,0x1C); //RGB (not YUV/YCbCr) + no mirror
// Write8_I2C(0x12,0x5c); //RGB (not YUV/YCbCr) + mirror
Write8_I2C(0x13,0xB3); //enable CCIR656
if(qvga==1)
Write8_I2C(0x14,0x24); //QVGA
else
Write8_I2C(0x14,0x04); //VGA
Write8_I2C(0x15,0x01); //BGRG seq
if (CSIINTL)
Write8_I2C(0x28,0x00); //interlace
else
Write8_I2C(0x28,0x20); //prograssive
Write8_I2C(0x75,0x82); //vertical flip
Write8_I2C(0x71,0x20); //HSYNC in HREF pin
Write8_I2C(0x67,0x10); //UV filter enable
if(pal==0)
{
//insert dummy pixel for NTSC
Write8_I2C(0x2A,0x80);
Write8_I2C(0x2B,0x5E); //Delay 94 pixels
}
else
{
//insert dummy pixel for PAL
Write8_I2C(0x2A,0x80);
Write8_I2C(0x2B,0x64); //Delay 100 pixels
Write8_I2C(0x16,0x32); //Delay 50 lines
}
}
/*
void CA202QVGA(void)
{
*P_CSI_IRQEN = FRAME_END|TG_OF|FRAME_LOSS;
*P_CSI_TG_CR = CSIEN|MASEN|CSICLKINV;
// Enable TV Encoder
if(YUVOUT_TEST)
{
*P_CSI_TG_CR |= (YUVOUT|Y4U4Y4V4);
*P_TV_CONTROL = TVEN|TVINTL|TVLPF1|Y4U4V4|(PAL_TEST<<1);
}
else
*P_TV_CONTROL = TVEN|TVINTL|TVLPF1|TVRGB2YUV|(PAL_TEST<<1);
CA202Init(PAL_TEST);
}
void CA202Init(int TVMode)
{
*P_I2CCVR=20;
*P_I2CID=0x30;//for 202
Write8_I2C(0x00,0xc3); // reg:0x00
Write8_I2C(0x00,0xc3); // reg:0x00
if(TVMode==0)
Write8_I2C(0x01,0x84); // reg:0x01 NTSC
else
Write8_I2C(0x01,0x80); // reg:0x01 PAL
Write8_I2C(0x02,0x8c); // reg:0x02
Write8_I2C(0x03,0x00); // reg:0x03
Write8_I2C(0x04,0x03); // reg:0x04
Write8_I2C(0x05,0x15); // reg:0x05
Write8_I2C(0x06,0xe0); // reg:0x06
Write8_I2C(0x07,0x40); // reg:0x07
Write8_I2C(0x08,0xa0); // reg:0x08
Write8_I2C(0x09,0x4f); // reg:0x09
Write8_I2C(0x0a,0xaa); // reg:0x0a
Write8_I2C(0x0b,0x00); // reg:0x0b
if(TVMode==0)
Write8_I2C(0x0c,0xe9); // reg:0x0c NTSC
else
Write8_I2C(0x0c,0xa9); // reg:0x0c PAL
Write8_I2C(0x0d,0x20); // reg:0x0d
Write8_I2C(0x0e,0x00); // reg:0x0e
Write8_I2C(0x0f,0x00); // reg:0x0f
Write8_I2C(0x10,0xfd); // reg:0x10
Write8_I2C(0x11,0x00); // reg:0x11
Write8_I2C(0x12,0x42); // reg:0x12
Write8_I2C(0x13,0x40); // reg:0x13
Write8_I2C(0x14,0x4e); // reg:0x14
Write8_I2C(0x15,0x40); // reg:0x15
Write8_I2C(0x16,0x52); // reg:0x16
Write8_I2C(0x17,0x98); // reg:0x17
Write8_I2C(0x18,0xd0); // reg:0x18
Write8_I2C(0x19,0x8a); // reg:0x19
Write8_I2C(0x1a,0x00); // reg:0x1a
Write8_I2C(0x1b,0x00); // reg:0x1b
Write8_I2C(0x1c,0x00); // reg:0x1c
Write8_I2C(0x1d,0x00); // reg:0x1d
Write8_I2C(0x1e,0x00); // reg:0x1e
Write8_I2C(0x1f,0xff); // reg:0x1f
Write8_I2C(0x20,0x00); // reg:0x20
}
void s201_qcif(void)
{
unsigned int cr_set;
unsigned int *csibuf;
unsigned int *tvbuf;
unsigned int y_temp, y0, y1, y2, y3;
unsigned int i, j, k;
// Use I2C to initial QV7660
init_201();
// Use Software Mode
*P_PTR_SETTING = 0;
*P_C2P_SETTING = 0;
*P_CSI_TG_FBSADDR0 = 0x00100000;
*P_TV_START_ADR1 = 0x00200000;
*P_CSI_IRQEN = FRAME_END|TG_OF|FRAME_LOSS;
cr_set = CSIEN|S201MODE|YUVIN;
*P_CSI_TG_LSTART = ((0x00)<<20)|((0x05)<<10)|0x110;
*P_CSI_TG_CR = cr_set;
// Use I2C to initial QV7660
//init_201();
// Enable TV Encoder
*P_TV_CONTROL = TVEN;
i=0xA0100000;
csibuf = (unsigned int *)i;
j=0xA0200000;
tvbuf = (unsigned int *)j;
while (1)
{
// while (framecnt == 0);
// framecnt =0;
// for (i=0;i<120;i++) {
for (i=0;i<4800;i=i+40)
{
for (j=0;j<40;j++)
{
y_temp = csibuf[i+j]; // i*160+j
y0 = y_temp&0xff;
y1 = ((y_temp&0xff00)<<8);
y2 = ((y_temp&0xff0000)>>16);
y3 = ((y_temp&0xff000000)>>8);
k = (i<<2) + (j<<1) + 9640; // (i+60)*160 + j*2 + 40
tvbuf[k++] = y1+y0;
tvbuf[k] = y3+y2;
}
}
}
while (1);
}
void init_201(void)
{
*P_I2CCVR=120;
*P_I2CID=0x30;//for 201
Write8_I2C(0x00,0xfe);Delay(); // reg:0x00
Write8_I2C(0x01,0xe0);Delay(); //
Write8_I2C(0x02,0x20);Delay(); //
Write8_I2C(0x03,0x90);Delay(); //
Write8_I2C(0x04,0xac);Delay(); //
Write8_I2C(0x05,0x00);Delay(); //
Write8_I2C(0x06,0x80);Delay(); //
Write8_I2C(0x07,0x80);Delay(); //
Write8_I2C(0x08,0x02);Delay(); //
Write8_I2C(0x10,0x80);Delay(); //
}
*/
void Delay()
{
int i;
for(i=0;i<2000;i++);
}
void Enable_TV_Encoder(int PAL_ENABLE,int VGA_ENABLE,int YUV_ENABLE)
{
unsigned int YUV_STATUS;
if(YUV_ENABLE!=0)YUV_STATUS=(unsigned int)Y4U4V4;
else YUV_STATUS=(unsigned int)TVRGB2YUV;
*P_TV_CONTROL =TVEN|TVINTL|TVLPF1|YUV_STATUS|(VGA_ENABLE<<2)|(PAL_ENABLE<<1);
}
/*
void SetBlendingLevel(S32 nText, S32 nBlend, S32 nLevel)
{
U32 *control, *blend;
control = P_PPU_TX1_Control + nText * 7;
*control |= nBlend;
blend = P_PPU_TX1_Blending + nText * 7;
*blend = nLevel;
}
void SetBlueScreen(S32 enable, S32 nUp, S32 nLow)
{
// Blue Screen Test Pattern
*P_CSI_TG_BSUPPER = nUp;
*P_CSI_TG_BSLOWER = nLow;
// *P_CSI_TG_TRANSP = 0x000000;
*P_CSI_TG_CR = *P_CSI_TG_CR|enable;
// while (1);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -