📄 camif.c
字号:
case 0:
camCodecOutput=CAM_CCIR420;
postMode|=POST_IN_YCBYCR420;
break;
case 1:
camCodecOutput=CAM_CCIR422;
postMode|=POST_IN_YCBYCR422;
break;
default:
camCodecOutput=CAM_CCIR420;
postMode|=POST_IN_YCBYCR420;
break;
}
#else
camCodecInput=CAM_CCIR420;
camCodecOutput=CAM_CCIR420;
postMode|=POST_IN_YCBYCR420;
#endif
#if TEST_DETAIL_EN
printf("Select bpp of post processor output\n");
printf("Note:If you want to test YCBCR 422, you should choose 16bpp\n");
printf("0: 16bpp SLCD(D), 1:24bpp SLCD, 2:16bpp PLCD, 3:24bpp PLCD\n");
printf("Select one:");
i=GetIntNum();
switch(i) {
case 1:
Init_240X320_AMLCD();
LcdBGInit(MODE_SER_24BIT_240320|MODE_NO_VIRTUAL_24B);
GlibInit(MODE_SER_24BIT_240320, BGBUFFER1);
postMode |=POST_OUT_RGB24B;
break;
case 2:
LcdBGInit(MODE_PAR_16BIT565_240320|MODE_NO_VIRTUAL_16B);
GlibInit(MODE_PAR_16BIT565_240320, BGBUFFER1);
postMode |=POST_OUT_RGB16B;
break;
case 3:
LcdBGInit(MODE_PAR_24BIT_240320|MODE_NO_VIRTUAL_24B);
GlibInit(MODE_PAR_24BIT_240320, BGBUFFER1);
postMode|=POST_OUT_RGB24B;
break;
default: // 0
Init_240X320_AMLCD();
LcdBGInit(MODE_SER_16BIT565_240320|MODE_NO_VIRTUAL_16B);
GlibInit(MODE_SER_16BIT565_240320, BGBUFFER1);
postMode|=POST_OUT_RGB16B;
break;
}
LcdEnvidOnOff(1); // Enable ENVID Bit
#else
Init_240X320_AMLCD();
LcdBGInit(MODE_SER_16BIT565_240320|MODE_NO_VIRTUAL_16B);
GlibInit(MODE_SER_16BIT565_240320, BGBUFFER1);
postMode|=POST_OUT_RGB16B;
LcdEnvidOnOff(1); // Enable ENVID Bit
#endif
switch(CAMTYPE) {
case CAM_S5X532:
if(camCodecOutput==CAM_CCIR422) {
CamInit(camCodecDispX, camCodecDispY, 240, 320, 112, 40, (_NONCACHE_STARTADDRESS+0), (_NONCACHE_STARTADDRESS+0x00300000));
}
else {
CamInit(640, 480, 240, 320, 112, 40, (_NONCACHE_STARTADDRESS+0), (_NONCACHE_STARTADDRESS+0x00300000));
PostInit(640, 480, 640, 480, 0, 0,
240, 320, camCodecDispX, camCodecDispY, 0, 0,
(_NONCACHE_STARTADDRESS+0), LCDFRAMEBUFFERBG1, postMode);
}
break;
case CAM_OV7620:
default:
if(camCodecOutput==CAM_CCIR422) {
CamInit(camCodecDispX, camCodecDispY, 240, 320, 0, 0, (_NONCACHE_STARTADDRESS+0), (_NONCACHE_STARTADDRESS+0x00300000));
}
else {
CamInit(640, 480, 240, 320, 0, 0, (_NONCACHE_STARTADDRESS+0), (_NONCACHE_STARTADDRESS+0x00300000));
PostInit(640, 480, 640, 480, 0, 0,
240, 320, camCodecDispX, camCodecDispY, 0, 0,
(_NONCACHE_STARTADDRESS+0), LCDFRAMEBUFFERBG1, postMode);
}
break;
}
postStart1 = rADDRStart_RGB;
postEnd1 = rADDREnd_RGB;
postStart2 = rADDRStart_RGB + rLCDSADDRB2 - rLCDSADDRB1;
postEnd2 = rADDREnd_RGB + rLCDSADDRB2 - rLCDSADDRB1;
#if TEST_DETAIL_EN
printf("Select Shape of Test Pattern\n");
printf("0:camera input, 1:color bar, 2:horizontal increment, 3:vertical increment\n");
printf("Select One:");
i=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
printf("Select Flip mode\n");
printf("0:normal, 1:X-axis mirror, 2:Y-axis mirror, 3:180 rotation\n");
printf("Select One:");
i=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
printf("Scaler ByPass mode\n");
printf("0:ByPass Off, 1:ByPass On\n");
printf("Select One:");
i=GetIntNum();
switch(i) {
case 0:
rCICOSCCTRL&=~(1<<31);
break;
case 1:
rCICOSCCTRL|=(1<<31);
break;
default:
rCICOSCCTRL&=~(1<<31);
break;
}
#endif
rCIGCTRL |= (1<<26); // Signals of Synchronization are not inverted
// rCICOCTRL = (1<<23)|(1<<18)|(1<<13)|(1<<8);
pISR_CAMIF_BLOCK_POST=(unsigned int)Camif_Post_Isr;
rINTMSK &= ~(BIT_CAMIF_BLOCK_POST);
rINTSUBMSK2 &= ~(BIT_SUB_CAMIF_C);
printf("Camera preview for codec will be started!\n");
printf("Press Enter to continue!\n");
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) // 422 -> using Display function
{
camTestMode=CAM_TEST_MODE_CODEC;
rMODE &= ~(7<<5); // post envid off
rINTSUBMSK2 |= BIT_SUB_POST;
rSUBSRCPND2 = BIT_SUB_POST;
while(1)
{
if(camCodecDataValid==1)
{
camCodecDataValid=0;
Display_Cam_Image(camCodecDispX, camCodecDispY);
}
if(Uart_GetKey()=='\r') break;
}
}
else // 420 -> using post processor
{
camTestMode=CAM_TEST_MODE_CODEC_POST;
rINTSUBMSK2 &= ~BIT_SUB_POST;
getchar();
}
CamCaptureStop();
printf("Wait until the current frame capture is completed.\n");
while(!( camCodecStatus==CAM_STOPPED));
printf("camCodecCaptureCount:%d\n",camCodecCaptureCount);
printf("codec Status register:0x%x\n", rCICOSTATUS);
printf("preview Status register:0x%x\n", rCIPRSTATUS);
printf("Codec Y addr 2:0x%x\n", rCICOYSA2);
printf("Codec Cb addr 2:0x%x\n", rCICOCBSA2);
printf("Codec Cr addr 2:0x%x\n", rCICOCRSA2);
rINTSUBMSK2 |= BIT_SUB_CAMIF_C|BIT_SUB_POST;
rINTMSK |= BIT_CAMIF_BLOCK_POST;
}
unsigned int Conv_YCbCr_Rgb(unsigned char y0, unsigned char y1, unsigned char cb0, unsigned char cr0)
{
// bit order is
// YCbCr = [Cr0 Y1 Cb0 Y0], RGB=[R1,G1,B1,R0,G0,B0].
int r0, g0, b0, r1, g1, b1;
unsigned int 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 = (((unsigned short)r0>>3)<<11) | (((unsigned short)g0>>2)<<5) | (((unsigned short)b0>>3)<<0); //RGB565.
rgb1 = (((unsigned short)r1>>3)<<11) | (((unsigned short)g1>>2)<<5) | (((unsigned short)b1>>3)<<0); //RGB565.
rgb = (rgb1<<16) | rgb0;
return(rgb);
}
void Display_Cam_Image(unsigned int size_x, unsigned int size_y) // coded only for 16bpp mode
{
unsigned char *buffer_y, *buffer_cb, *buffer_cr;
unsigned int rgb_data0;
unsigned int x, y;
int temp;
unsigned int *lcdframebuffer;
temp = (((rCICOSTATUS>>26)&0x3)+4-2)%4; // current frame memory block
switch (temp) // current frame mem - 2
{
case 0:
buffer_y = (unsigned char *)rCICOYSA1;
buffer_cb = (unsigned char *)rCICOCBSA1;
buffer_cr = (unsigned char *)rCICOCRSA1;
break;
case 1:
buffer_y = (unsigned char *)rCICOYSA2;
buffer_cb = (unsigned char *)rCICOCBSA2;
buffer_cr = (unsigned char *)rCICOCRSA2;
break;
case 2:
buffer_y = (unsigned char *)rCICOYSA3;
buffer_cb = (unsigned char *)rCICOCBSA3;
buffer_cr = (unsigned char *)rCICOCRSA3;
break;
case 3:
buffer_y = (unsigned char *)rCICOYSA4;
buffer_cb = (unsigned char *)rCICOCBSA4;
buffer_cr = (unsigned char *)rCICOCRSA4;
break;
default :
buffer_y = (unsigned char *)rCICOYSA1;
buffer_cb = (unsigned char *)rCICOCBSA1;
buffer_cr = (unsigned char *)rCICOCRSA1;
break;
}
lcdframebuffer=(unsigned int *)LCDFRAMEBUFFERBG1;
//printf("End setting : Y-0x%x, Cb-0x%x, Cr-0x%x\n", buffer_y, buffer_cb, buffer_cr);
#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+1), *buffer_cb++, *buffer_cr++);
buffer_y = buffer_y + 2;
*(lcdframebuffer++) = rgb_data0;
if (x == (size_x-2)) lcdframebuffer += (LCD_XSIZE-size_x)/2;
}
}
#endif
}
void Display_Prv_Image(int size_x, int size_y)
{
unsigned char *CamFrameAddr;
unsigned char *LcdFrameAddr;
int i, temp, fRGB;
if (CAM_PVIEW_PINGPONG)
temp = (((rCIPRSTATUS>>26)&0x3)+4-2)%4; // current frame memory block
else
temp = 4;
switch (temp) // current frame mem - 2
{
case 0 :
temp = rCIPRCLRSA1;
break;
case 1 :
temp = rCIPRCLRSA2;
break;
case 2 :
temp = rCIPRCLRSA3;
break;
case 3 :
temp = rCIPRCLRSA4;
break;
default:
temp = rCIPRCLRSA1;
break;
}
CamFrameAddr = (unsigned char *)temp;
LcdFrameAddr = (unsigned char *)LCDFRAMEBUFFERBG1;
if (camPviewOutput==CAM_RGB24B)
fRGB = 4;
else fRGB = 2;
// Uart_Printf("Cam frame addr : 0x%x, LCD frame addr : 0x%x\n", CamFrameAddr, LcdFrameAddr);
for(i=0;i<size_y;i++)
{
memcpy(LcdFrameAddr, CamFrameAddr, size_x*fRGB);
LcdFrameAddr += LCD_XSIZE*fRGB;
CamFrameAddr += size_x*fRGB;
}
}
void CamDemoDisplay(void)
{
// Camif basic property setting
camCodecOutput=CAM_CCIR420;
camCodecInput=CAM_CCIR420;
camPviewOutput=CAM_RGB16B;
camTestMode=CAM_TEST_MODE_CODEC_POST;
camCodecCaptureCount=0;
camPviewCaptureCount=0;
camPviewStatus=CAM_STOPPED;
camCodecStatus=CAM_STOPPED;
CAMTYPE=CAM_S5X532;
CAMSIZE=VGA_XSIZE;
CAMIICID=0x5a;
// Camif port setting
SetCamifPort();
CamSelectPort(0); // port A
// Camif clock setting
rCLKSRCCON = (rCLKSRCCON & ~(1<<13))|(1<<5);
SetUPLL( 72, 3, 1); // 96MHz
SetCAMClockDivider(3); // UPLL/(CAMCLK_DIV+1) 3-24MHz
// Camif & external module reset
CamReset();
CameraModuleSetting();
// Camif register setting
CamInit(640, 480, 240, 320, 112, 40, (_NONCACHE_STARTADDRESS+0), LCDFRAMEBUFFERBG1);
rCIGCTRL|=(1<<26); // inverse polarity of Pixel Clock
// LCD, Post register setting
Init_240X320_AMLCD();
LcdBGInit(MODE_SER_16BIT565_240320|MODE_NO_VIRTUAL_16B);
GlibInit(MODE_SER_16BIT565_240320|MODE_NO_VIRTUAL_16B, BGBUFFER1);
LcdEnvidOnOff(1); // Enable ENVID Bit
PostInit(640, 480, 640, 480, 0, 0,
240, 320, 240, 320, 0, 0,
(_NONCACHE_STARTADDRESS+0), LCDFRAMEBUFFERBG1, POST_IN_YCBYCR420|POST_OUT_RGB16B);
// ISR setting
pISR_CAMIF_BLOCK_POST=(unsigned int)Camif_Post_Isr;
rINTMSK&=~(BIT_CAMIF_BLOCK_POST);
rINTSUBMSK2 &= ~(BIT_SUB_CAMIF_C|BIT_SUB_POST);
printf("Camera preview for codec will be started!\n");
printf("Press Enter to continue!\n");
// clear overflow input fifo
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);
}
// Capture start!
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 getchar();
// Capture stop!
CamCaptureStop();
printf("Wait until the current frame capture is completed.\n");
while(!( camCodecStatus==CAM_STOPPED));
printf("camCodecCaptureCount:%d\n",camCodecCaptureCount);
printf("codec Status register:0x%x\n", rCICOSTATUS);
printf("preview Status register:0x%x\n", rCIPRSTATUS);
rINTSUBMSK2 |= BIT_SUB_CAMIF_C|BIT_SUB_POST;
rINTMSK |= BIT_CAMIF_BLOCK_POST;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -