📄 camif.c
字号:
Uart_Printf("camPviewCaptureCount=%d\n",camPviewCaptureCount);
rINTMSK|=(BIT_CAMIF_PREVIEW);
}
void Test_CamCodecPostTestQVGADisplay(void)
{
U32 mode;
camTestMode=CAM_TEST_MODE_CODEC_POST;
camCodecCaptureCount=0;
camPviewCaptureCount=0;
camPviewStatus=CAM_STOPPED;
camCodecStatus=CAM_STOPPED;
mode=0;
InitLDI();
#if TEST_DETAIL_EN
Uart_Printf("Select input format of Camera Scler\n");
Uart_Printf("0:420, 1:422\n");
Uart_Printf("Select one:");
i=Uart_GetIntNum();
switch(i) {
case 0:
camCodecInput=CAM_CCIR420;
break;
case 1:
camCodecInput=CAM_CCIR422;
break;
default:
camCodecInput=CAM_CCIR420;
break;
}
Uart_Printf("Select output format of Camera Scler\n");
Uart_Printf("0:420, 1:422\n");
Uart_Printf("Select one:");
i=Uart_GetIntNum();
switch(i) {
case 0:
camCodecOutput=CAM_CCIR420;
mode|=POST_IN_YCBYCR420;
break;
case 1:
camCodecOutput=CAM_CCIR422;
mode|=POST_IN_YCBYCR422;
break;
default:
camCodecOutput=CAM_CCIR420;
mode|=POST_IN_YCBYCR420;
break;
}
#else
camCodecInput=CAM_CCIR420;
camCodecOutput=CAM_CCIR420;
mode|=POST_IN_YCBYCR420;
#endif
#if TEST_DETAIL_EN
Uart_Printf("Select bpp of post processor output\n");
Uart_Printf("Note:If you want to test YCBCR 422, you should choose 16bpp\n");
Uart_Printf("0: 16bpp, 1:24bpp\n");
Uart_Printf("Select one:");
i=Uart_GetIntNum();
switch(i) {
case 0:
LcdBGInit(MODE_PAR_16BIT565_240320|MODE_NO_VIRTUAL_16B);
GlibInit(MODE_PAR_16BIT565_240320|MODE_NO_VIRTUAL_16B, BGBUFFER1);
mode|=POST_OUT_RGB16B;
LcdEnvidOnOff(1); // Enable ENVID Bit
break;
case 1:
LcdBGInit(MODE_PAR_18BIT_240320|MODE_NO_VIRTUAL_24B);
GlibInit(MODE_PAR_18BIT_240320|MODE_NO_VIRTUAL_24B, BGBUFFER1);
mode|=POST_OUT_RGB24B;
LcdEnvidOnOff(1); // Enable ENVID Bit
break;
default:
LcdBGInit(MODE_PAR_16BIT565_240320|MODE_NO_VIRTUAL_16B);
GlibInit(MODE_PAR_16BIT565_240320|MODE_NO_VIRTUAL_16B, BGBUFFER1);
mode|=POST_OUT_RGB16B;
LcdEnvidOnOff(1); // Enable ENVID Bit
break;
}
#else
LcdBGInit(MODE_PAR_16BIT565_240320|MODE_NO_VIRTUAL_16B);
GlibInit(MODE_PAR_16BIT565_240320|MODE_NO_VIRTUAL_16B, BGBUFFER1);
mode|=POST_OUT_RGB16B;
LcdEnvidOnOff(1); // Enable ENVID Bit
#endif
switch(CAMTYPE) {
case CAM_S5X532:
if(camCodecOutput==CAM_CCIR422) {
CamInit(240, 320, 240, 320, 112, 40, 0x12000000, LCDFRAMEBUFFERBG1);
PostInit(240, 320, 240, 320, 0, 0,
240, 320, 240, 320, 0, 0,
0x12000000, LCDFRAMEBUFFERBG1, mode);
}
else {
CamInit(640, 480, 240, 320, 112, 40, 0x12000000, LCDFRAMEBUFFERBG1);
PostInit(640, 480, 640, 480, 0, 0,
240, 320, 240, 320, 0, 0,
0x12000000, LCDFRAMEBUFFERBG1, mode);
}
break;
case CAM_S5K3BAFX:
if(camCodecOutput==CAM_CCIR422) {
CamInit(240, 320, 240, 320, 112, 40, 0x12000000, LCDFRAMEBUFFERBG1);
PostInit(240, 320, 240, 320, 0, 0,
240, 320, 240, 320, 0, 0,
0x12000000, LCDFRAMEBUFFERBG1, mode);
}
else {
if(CAMSIZE==SVGA_XSIZE) {
CamInit(800, 600, 240, 320, 0, 0, 0x12000000, LCDFRAMEBUFFERBG1);
PostInit(800, 600, 800, 600, 0, 0,
240, 320, 240, 320, 0, 0,
0x12000000, LCDFRAMEBUFFERBG1, mode);
}
else if(CAMSIZE==MEGA2_XSIZE) {
CamInit(800, 600, 240, 320, 0, 0, 0x12000000, LCDFRAMEBUFFERBG1);
PostInit(800, 600, 800, 600, 0, 0,
240, 320, 240, 320, 0, 0,
0x12000000, LCDFRAMEBUFFERBG1, mode);
}
}
break;
case CAM_OV7620:
default:
if(camCodecOutput==CAM_CCIR422) {
CamInit(240, 320, 240, 320, 112, 40, 0x12000000, LCDFRAMEBUFFERBG1);
PostInit(240, 320, 240, 320, 0, 0,
240, 320, 240, 320, 0, 0,
0x12000000, LCDFRAMEBUFFERBG1, mode);
}
else {
CamInit(640, 480, 240, 320, 112, 40, 0x12000000, LCDFRAMEBUFFERBG1);
PostInit(640, 480, 640, 480, 0, 0,
240, 320, 240, 320, 0, 0,
0x12000000, LCDFRAMEBUFFERBG1, mode);
}
break;
}
rCIGCTRL|=(1<<26); // Signals of Synchronization are not inverted
//rCIGCTRL&=~(1<<26); // Signals of Synchronization are not inverted
#if TEST_DETAIL_EN
Uart_Printf("Select Shape of Test Pattern\n");
Uart_Printf("0:camera input, 1:color bar, 2:horizontal increment, 3:vertical increment\n");
Uart_Printf("Select One:");
i=Uart_GetIntNum();
rCIGCTRL&=~(0x3<<27);
switch(i) {
case 0:
rCIGCTRL|=(0<<27);
break;
case 1:
rCIGCTRL|=(1<<27);
break;
case 2:
rCIGCTRL|=(2<<27);
break;
case 3:
rCIGCTRL|=(3<<27);
break;
default:
break;
}
#else
rCIGCTRL&=~(0x3<<27);
#endif
#if TEST_DETAIL_EN
Uart_Printf("Select Flip mode\n");
Uart_Printf("0:normal, 1:X-axis mirror, 2:Y-axis mirror, 3:180 rotation\n");
Uart_Printf("Select One:");
i=Uart_GetIntNum();
rCICOTRGFMT&=~(0x3<<14);
switch(i) {
case 0:
rCICOTRGFMT|=(0<<14);
break;
case 1:
rCICOTRGFMT|=(1<<14);
break;
case 2:
rCICOTRGFMT|=(2<<14);
break;
case 3:
rCICOTRGFMT|=(3<<14);
break;
default:
break;
}
#endif
#if TEST_DETAIL_EN
Uart_Printf("Scaler ByPass mode\n");
Uart_Printf("0:ByPass Off, 1:ByPass On\n");
Uart_Printf("Select One:");
i=Uart_GetIntNum();
switch(i) {
case 0:
rCICOSCCTRL&=~(1<<31);
break;
case 1:
rCICOSCCTRL|=(1<<31);
break;
default:
rCICOSCCTRL&=~(1<<31);
break;
}
#endif
if(camCodecOutput==CAM_CCIR422) {
camTestMode=CAM_TEST_MODE_CODEC;
pISR_CAMIF_CODEC=(U32)CamCodecIsr;
rINTMSK&=~(BIT_CAMIF_CODEC);
}
else {
camTestMode=CAM_TEST_MODE_CODEC_POST;
pISR_CAMIF_CODEC=(U32)CamCodecIsr;
pISR_LCD_POST=(U32)PostIsr;
rINTMSK&=~(BIT_CAMIF_CODEC|BIT_LCD_POST);
rINTSUBMSK &= ~(BIT_SUB_POST);
}
Uart_Printf("Camera preview for codec will be started!\n");
Uart_Printf("Press Enter to continue!\n");
Uart_TxEmpty(0);
if(rCICOSTATUS&0xe0000000) {
rCIWDOFST|=(1<<30|1<<15|1<<14);
rCIWDOFST&=~(1<<30|1<<15|1<<14);
}
if(rCIPRSTATUS&0xc0000000) {
rCIWDOFST|=(0x3<<12);
rCIWDOFST&=~(0x3<<12);
}
CamCaptureStart(CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT);
if(camCodecOutput==CAM_CCIR422) {
while(1) {
if(camCodecDataValid==1) {
camCodecDataValid=0;
Display_Cam_Image(PQVGA_XSIZE, PQVGA_YSIZE);
}
if(Uart_GetKey()=='\r') break;
}
}
else Uart_Getch();
CamCaptureStop();
Uart_Printf("Wait until the current frame capture is completed.\n");
while(!( camCodecStatus==CAM_STOPPED));
Uart_TxEmpty(0);
Uart_Printf("camCodecCaptureCount:%d\n",camCodecCaptureCount);
Uart_Printf("codec Status register:0x%x\n", rCICOSTATUS);
Uart_Printf("preview Status register:0x%x\n", rCIPRSTATUS);
Uart_TxEmpty(0);
rINTSUBMSK|=BIT_SUB_POST;
rINTMSK|=BIT_CAMIF_CODEC|BIT_LCD_POST;
}
U32 Conv_YCbCr_Rgb(U8 y0, U8 y1, U8 cb0, U8 cr0)
{
// bit order is
// YCbCr = [Cr0 Y1 Cb0 Y0], RGB=[R1,G1,B1,R0,G0,B0].
int r0, g0, b0, r1, g1, b1;
U32 rgb0, rgb1, rgb;
#if 1
r0 = YCbCrtoR(y0, cb0, cr0);
g0 = YCbCrtoG(y0, cb0, cr0);
b0 = YCbCrtoB(y0, cb0, cr0);
r1 = YCbCrtoR(y1, cb0, cr0);
g1 = YCbCrtoG(y1, cb0, cr0);
b1 = YCbCrtoB(y1, cb0, cr0);
#endif
if (r0>255 ) r0 = 255;
if (r0<0) r0 = 0;
if (g0>255 ) g0 = 255;
if (g0<0) g0 = 0;
if (b0>255 ) b0 = 255;
if (b0<0) b0 = 0;
if (r1>255 ) r1 = 255;
if (r1<0) r1 = 0;
if (g1>255 ) g1 = 255;
if (g1<0) g1 = 0;
if (b1>255 ) b1 = 255;
if (b1<0) b1 = 0;
// 5:6:5 16bit format
rgb0 = (((U16)r0>>3)<<11) | (((U16)g0>>2)<<5) | (((U16)b0>>3)<<0); //RGB565.
rgb1 = (((U16)r1>>3)<<11) | (((U16)g1>>2)<<5) | (((U16)b1>>3)<<0); //RGB565.
rgb = (rgb1<<16) | rgb0;
return(rgb);
}
void Display_Cam_Image(U32 size_x, U32 size_y)
{
U8 *buffer_y, *buffer_cb, *buffer_cr;
U32 rgb_data0;
U32 x, y;
int temp;
U32 *lcdframebuffer;
temp = (((rCICOSTATUS>>26)&0x3)+4-2)%4; // current frame memory block
switch (temp) // current frame mem - 2
{
case 0:
buffer_y = (U8 *)rCICOYSA1;
buffer_cb = (U8 *)rCICOCBSA1;
buffer_cr = (U8 *)rCICOCRSA1;
break;
case 1:
buffer_y = (U8 *)rCICOYSA2;
buffer_cb = (U8 *)rCICOCBSA2;
buffer_cr = (U8 *)rCICOCRSA2;
break;
case 2:
buffer_y = (U8 *)rCICOYSA3;
buffer_cb = (U8 *)rCICOCBSA3;
buffer_cr = (U8 *)rCICOCRSA3;
break;
case 3:
buffer_y = (U8 *)rCICOYSA4;
buffer_cb = (U8 *)rCICOCBSA4;
buffer_cr = (U8 *)rCICOCRSA4;
break;
default :
buffer_y = (U8 *)rCICOYSA1;
buffer_cb = (U8 *)rCICOCBSA1;
buffer_cr = (U8 *)rCICOCRSA1;
break;
}
lcdframebuffer=(U32 *)LCDFRAMEBUFFERBG1;
//Uart_Printf("End setting : Y-0x%x, Cb-0x%x, Cr-0x%x\n", buffer_y, buffer_cb, buffer_cr);
#if 0
// for checking converting time
rGPGCON = (rGPGCON&~(1<<23))|(1<<22); //EINT19 -> GPG11 output
rGPGUP |= (1<<11);
rGPGDAT &= ~(1<<11);
Delay(90);
rGPGDAT |=(1<<11);
rgb_data0 = 0;
#endif
#if 0
for (y=0;y<size_y;y++) // YCbCr 4:2:0 format
{
for (x=0;x<size_x;x+=2)
{
rgb_data0 = Conv_YCbCr_Rgb(*buffer_y++, *buffer_y++, *buffer_cb++, *buffer_cr++);
frameBuffer16BitTft240320[y][x/2] = rgb_data0;
if ( (x==(size_x-2)) && ((y%2)==0) ) // when x is last pixel & y is even number
{
buffer_cb -= size_x/2;
buffer_cr -= size_x/2;
}
}
}
#else
for (y=0;y<size_y;y++) // YCbCr 4:2:2 format
{
for (x=0;x<size_x;x+=2)
{
rgb_data0 = Conv_YCbCr_Rgb(*buffer_y++, *buffer_y++, *buffer_cb++, *buffer_cr++);
*(lcdframebuffer++) = rgb_data0;
}
}
#endif
#if 0
rGPGDAT &= ~(1<<11);
Delay(30);
rGPGDAT |=(1<<11);
rGPGCON = (rGPGCON&~(1<<22))|(1<<23); // GPG11 output -> EINT19
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -