📄 csi.c
字号:
#include "Include/Csi.h"
#include "..\SysLib_Basic\Include\PPU_Texture.h"
#include "..\SysLib_Basic\Include\Temp.h"
#include "..\SysLib_Basic\Include\Sys_Define.h"
#include "..\SysLib_Basic\Include\Sys_Register.h"
#define CCIR656_TEST 1
#define PAL_TEST 0
#define YUVIN_TEST 0
#define YUVOUT_TEST 0
#define CSIINTL 0
#define RGB565_TEST 0 // For OV7660, Only RGB565 Output
#define Text1Index 0xa0140000
#define Text2Index 0xa0148000
#define Text3Index 0xa0150000
void ov7648_vga(void);
void ov7660_vga(void);
void ov7648_qvga(void);
void ov7660_qvga(void);
//void s201_qcif(void);
//void CA202QVGA(void);
void init_ov7648(int qvga, int pal);
void init_ov7660_vga(int pal);
void init_ov7660_qvga(int pal);
//void CA202Init(int pal);
//void init_201(void);
void Enable_TV_Encoder(int PAL_ENABLE,int VGA_ENABLE,int YUV_ENABLE);
void Delay();
extern int framecnt;
//====================================================================
//I2C application
//====================================================================
unsigned int Read8_I2C(int Addr)
{
unsigned int a;
*P_I2CADDR=Addr;
*P_I2CCR=0x41;
a=*P_I2CINTR;
while(a==0) a=*P_I2CINTR;
*P_I2CINTR=1;
a=*P_I2CCR&0x08;
a=*P_I2CRDATA;
return a;
}
void Write8_I2C(int Addr, unsigned int Value)
{
unsigned int a;
*P_I2CADDR=Addr;
*P_I2CWDATA=Value;
*P_I2CCR=1;
a=*P_I2CINTR;
while(a==0) a=*P_I2CINTR;
*P_I2CINTR=1;
a=*P_I2CCR&0x08;
}
void InitSensor(U32 CSI_Mode,U32 TV_Mode,U32 FB_Mode,U32 TextMode,U32 FB1_Addr,U32 FB2_Addr,U32 FB3_Addr)
{
// print1("SPG290 CSI Setting Start\n");
// Setup Sensor's FB Address
U32 *port;
S32 i;
*P_CSI_TG_FBSADDR0 = FB1_Addr;//0x25800
*P_CSI_TG_FBSADDR1 = FB2_Addr;
*P_CSI_TG_FBSADDR2 = FB3_Addr;
switch(FB_Mode)
{
case PPUFB:
// Setup PPU Buffer Start Address
switch(TextMode)
{
case TEXT1:
*P_PPU_TX1_START_ADR1 = FB1_Addr;
*P_PPU_TX1_START_ADR2 = FB2_Addr;
*P_PPU_TX1_START_ADR3 = FB3_Addr;
*P_PTR_SETTING |= (CSI_HARD |TVE_C2P_HARD|PPUT1_HARD);
break;
case TEXT2:
*P_PPU_TX2_START_ADR1 = FB1_Addr;
*P_PPU_TX2_START_ADR2 = FB2_Addr;
*P_PPU_TX2_START_ADR3 = FB3_Addr;
*P_PTR_SETTING |= (CSI_HARD |TVE_C2P_HARD|PPUT2_HARD);
break;
case TEXT3:
*P_PPU_TX3_START_ADR1 = FB1_Addr;
*P_PPU_TX3_START_ADR2 = FB2_Addr;
*P_PPU_TX3_START_ADR3 = FB3_Addr;
*P_PTR_SETTING |= (CSI_HARD |TVE_C2P_HARD|PPUT3_HARD);
break;
}
// *P_PTR_SETTING |= (CSI_HARD |TVE_C2P_HARD);
// *P_PTR_SETTING |= TVE_C2P_HARD;
*P_C2P_SETTING = C2PEN|TRIPLEBUF|CSI2PPU;
break;
/*case TVEFB:
// Setup TV Buffer Start Address
*P_TV_START_ADR1 = FB1_Addr;
*P_TV_START_ADR2 = FB2_Addr;
*P_TV_START_ADR3 = FB3_Addr;
*P_PTR_SETTING = CSI_HARD|TVE_C2P_HARD;
*P_C2P_SETTING = C2PEN|TRIPLEBUF|CSI2TVE;
break;
case LCDFB:
// Setup LCD Buffer Start Address
*P_LCD_START_ADR1 = FB1_Addr;
*P_LCD_START_ADR2 = FB2_Addr;
*P_LCD_START_ADR3 = FB3_Addr;
*P_PTR_SETTING |= CSI_HARD;
*P_C2P_SETTING = C2PEN|TRIPLEBUF|CSI2LCD;
break;*/
}
if (YUVIN_TEST == 1) { // For YUV => RGB Matrix
*P_CSI_Y2R_A1 = (0x100<<20)|(0x3FF<<10)|(0x15E);
*P_CSI_Y2R_A2 = (0x100<<20)|(0x3AA<<10)|(0x34D);
*P_CSI_Y2R_A3 = (0x100<<20)|(0x1BB<<10)|(0x3FE);
} else { // For RGB => YUV Matrix
*P_CSI_Y2R_A1 = (0x4D<<20)|(0x96<<10)|(0x1D);
*P_CSI_Y2R_A2 = (0x1D4<<20)|(0x1A9<<10)|(0x83);
*P_CSI_Y2R_A3 = (0x83<<20)|(0x192<<10)|(0x1EB);
}
switch(CSI_Mode)
{
case OV7648:
if(TV_Mode == 0)
ov7648_qvga();
else
ov7648_vga();
break;
case OV7660:
if(TV_Mode == 0)
ov7660_qvga();
else
ov7660_vga();
break;
// case CA201:
// s201_qcif();
// break;
// case CA202:
// CA202QVGA();
// break;
}
switch(FB_Mode)
{
case PPUFB:
switch(TextMode)
{
/*case TEXT1:
port = Text1Index;
for(i=0; i<480; i++)
{
*(port+i) = i*640;
}
*P_PPU_TX1_N_PTR = Text1Index;
*P_PPU_TX1_Attribute = TXDepth0;
*P_PPU_TX1_Control = TXEN|TXLINEAR|TXREGMODE|TXRGB565;
break;
case TEXT2:
port = Text2Index;
for(i=0; i<480; i++)
{
*(port+i) = i*640;
}
*P_PPU_TX2_N_PTR = Text2Index;
*P_PPU_TX2_Attribute = TXDepth1;
*P_PPU_TX2_Control = TXEN|TXLINEAR|TXREGMODE|TXRGB565;
break; */
case TEXT3:
port = Text3Index;
for(i=0; i<480; i++)
{
*(port+i) = i*640;
}
*P_PPU_TX3_N_PTR = Text3Index;
*P_PPU_TX3_Attribute = TXDepth3;
*P_PPU_TX3_Control = TXEN|TXLINEAR|TXREGMODE|TXRGB565|BLEND;
*P_PPU_TX3_Blending = 45;
break;
}
break;
}
}
void ov7660_vga(void)
{
unsigned int cr_set;
*P_CSI_IRQEN = FRAME_END|TG_OF|FRAME_LOSS;
// *P_CSI_IRQEN = FRAME_END|FRAME_LOSS;
if ((RGB565_TEST == 1) & (YUVIN_TEST == 0))
cr_set = CSIEN|VGAEN|CSICLKOINV|RGB565;
else
cr_set = CSIEN|VGAEN|CSICLKOINV;
if (CCIR656_TEST)
{
*P_CSI_TG_LSTART = ((0x00)<<20)|((0x08)<<10)|0x11A;
cr_set = cr_set|VADD_RISE|VRST_RISE|HRST_RISE|CCIR656;
}
else
{
//*P_CSI_TG_LSTART = ((0x00)<<20)|((0x00)<<10)|0xAE; // For 30 Hz
// *P_CSI_TG_LSTART = ((0x00)<<20)|((0x09)<<10)|0x7A; // For 33 Hz
*P_CSI_TG_LSTART = ((0x00)<<20)|((0x40)<<10)|0x7A; // For 33 Hz
cr_set = cr_set|VADD_RISE|VRST_RISE|HRST_RISE;
}
if (YUVIN_TEST)
{
if (CCIR656_TEST)
cr_set = cr_set|YUVIN|YUV_TYPE|D_TYPE4;
else
cr_set = cr_set|YUVIN|YUV_TYPE|D_TYPE6;
}
else
{
if (RGB565_TEST)
{
cr_set = cr_set|D_TYPE6;
}
else
{
if (CCIR656_TEST)
cr_set = cr_set|D_TYPE6;
else
cr_set = cr_set|D_TYPE5; // For GRB 4:2:2
// cr_set = cr_set|D_TYPE4; // For RGB Raw
}
}
if (YUVOUT_TEST)
{
cr_set = cr_set|YUVOUT|Y4U4Y4V4;
}
else;
*P_CSI_TG_CR = cr_set;
// Use I2C to initial QV7660
init_ov7660_vga(PAL_TEST);
// Enable TV Encoder
Enable_TV_Encoder(PAL_TEST,1,YUVOUT_TEST);
}
void ov7660_qvga(void)
{
unsigned int cr_set;
*P_CSI_IRQEN = FRAME_END|TG_OF|FRAME_LOSS;
cr_set = CSIEN|CSICLKOINV|INPUT27|CSICLKOINV;
// cr_set = CSIEN|YUV_TYPE|VGAEN;
if (CCIR656_TEST)
{
// *P_CSI_TG_LSTART = ((0x00)<<20)|((0x00)<<10)|0x30;
*P_CSI_TG_LSTART = ((0x00)<<20)|((0x34)<<10)|0x23A;
cr_set = cr_set|VADD_RISE|VRST_RISE|HRST_RISE|CCIR656;
}
else
{
*P_CSI_TG_LSTART = ((0x00)<<20)|((0x34)<<10)|0x180;
cr_set = cr_set|VADD_RISE|VRST_RISE|HRST_RISE;
}
if (YUVIN_TEST)
{
if (CCIR656_TEST)
cr_set = cr_set|YUVIN|YUV_TYPE|D_TYPE4;
else
cr_set = cr_set|YUVIN|YUV_TYPE|D_TYPE6;
}
else
{
if (CCIR656_TEST)
cr_set = cr_set|D_TYPE7;
else
cr_set = cr_set|D_TYPE5;
}
if (YUVOUT_TEST)
{
cr_set = cr_set|YUVOUT|Y4U4Y4V4;
}
else;
*P_CSI_TG_CR = cr_set;
// Use I2C to initial QV7660
init_ov7660_qvga(PAL_TEST);
// Enable TV Encoder
Enable_TV_Encoder(PAL_TEST,0,YUVOUT_TEST);
}
void init_ov7660_vga(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,0x80);Delay(); //Use external Clock Directly
Write8_I2C(0x92,0x00);Delay();
Write8_I2C(0x93,0x00);Delay();
Write8_I2C(0x9D,0x99);Delay(); // Band Filter For 50 Hz
Write8_I2C(0x9E,0x7F);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,0x00);Delay(); //VGA YUV output
} else {
Write8_I2C(0x12,0x04);Delay(); //VGA GRB422 output, Fail in OV7660
// Write8_I2C(0x12,0x05);Delay(); //VGA Raw RGB output
}
Write8_I2C(0x04,0x40);Delay(); //enable CCIR656
if (YUVIN_TEST) {
Write8_I2C(0x18,0x01);Delay(); // HSTOP ??
Write8_I2C(0x17,0x13);Delay(); // HSTART ??
Write8_I2C(0x32,0x92);Delay(); // HSTART/HSTOP ??
} else {
Write8_I2C(0x18,0x00);Delay(); // HSTOP ??
Write8_I2C(0x17,0x12);Delay(); // HSTART ??
Write8_I2C(0x32,0xA4);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
if ((RGB565_TEST == 1) & (YUVIN_TEST == 0)) {
Write8_I2C(0x40,0x91);Delay(); // Output 01 ~ FE
} else {
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -