📄 cameratest.c
字号:
switch(lcd_bpp)
{
case WINCONx_16BPP_565 :
OutFormat = OutFormat_RGB16B;
break;
case WINCONx_24BPP_888 :
OutFormat = OutFormat_RGB24B;
break;
}
printf("MSDMA test. (Get YCBCR data from camera with codec path. And put the image into MSDMA.)\n");
camCodecStatus=CAPTURE_STOPPED;
camCodecCaptureCount=0;
camCodecDataValid=0;
pISR_CAM = (unsigned int)MSDMAISR;
rSUBSRCPND = BIT_SUB_CAM_P|BIT_SUB_CAM_C;
ClearPending(BIT_CAM);
rINTSUBMSK &= ~(BIT_SUB_CAM_P|BIT_SUB_CAM_C);
rINTMSK &= ~BIT_CAM;
SetCodecFormat( InFormat_YCBCR422, OutFormat_YCBCR420, INTERLEAVE_OFF, ORDER_CRYCBY);
#if 0
SetCodecScaler( CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize);
SetCodecDMA( CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, OutFormat_YCBCR422, INTERLEAVE_ON);
#else if
SetCodecScaler( CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, 640, 480);
// SetCodecScaler( CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, 320, 240);
SetCodecDMA( 640, 480, OutFormat_YCBCR420, INTERLEAVE_OFF);
// SetCodecDMA( 320, 240, OutFormat_YCBCR422, INTERLEAVE_ON);
#endif
#if 0
SetCodecFrameBuffer( CameraCodecFrameBuffer, CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, OutFormat_YCBCR422, INTERLEAVE_ON);
#else if
SetCodecFrameBuffer( CameraCodecFrameBuffer, 640, 480, OutFormat_YCBCR420, INTERLEAVE_OFF);
// SetCodecFrameBuffer( CameraCodecFrameBuffer, 320, 240, OutFormat_YCBCR422, INTERLEAVE_ON);
#endif
// Use MSDMA Offset
#if 0
SetPreviewPath( CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, lcd_horizon_value, lcd_line_value, OutFormat);
#else if
SetPreviewPath( 640, 480, lcd_horizon_value, lcd_line_value, OutFormat);
// SetPreviewPath( 320, 240, lcd_horizon_value, lcd_line_value, OutFormat);
#endif
SetPreviewFrameBuffer( CameraPreviewFrameBuffer, lcd_horizon_value, lcd_line_value, OutFormat);
SetPreviewSource( PREVIEW_MSDMA);
SetMSDMAFormat( MSDMA_InFormat_YCBCR420, INTERLEAVE_OFF, ORDER_CRYCBY);
CodecCaptureStart();
EnablePreviewScaler();
EnableImageCapturePreview();
while (1) {
if (camCodecDataValid) {
camCodecDataValid = 0;
i = GetCodecFrameCount();
fb = GetCodecFrameBuffer((i-2)&0x3);
#if 0
SetMSDMAFrameBuffer( fb, CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, 0, MSDMA_InFormat_YCBCR422);
#else if
// SetMSDMAFrameBuffer( fb, lcd_horizon_value, lcd_line_value, 0, MSDMA_InFormat_YCBCR422);
SetMSDMAFrameBuffer( fb, 640, 480, 0, MSDMA_InFormat_YCBCR420);
#endif
PreviewComplete=0;
StartMSDMA();
WaitMSDMA();
while(PreviewComplete==0);
i = GetPreviewFrameCount();
fb = GetPreviewFrameBuffer((i-1)&0x3);
*VIDWxADD0_Reg_Addr[0][0] = fb;
}
if (Uart_GetKey()== '\r') break;
}
DisableImageCapturePreview();
DisablePreviewScaler();
CodecCaptureStop();
while(!(camCodecStatus==CAPTURE_STOPPED ));
printf("\ncamCodecCaptureCount=%d\n",camCodecCaptureCount);
printf("codec Status register:0x%x\n", rCICOSTATUS);
rINTMSK |= BIT_CAM;
rINTSUBMSK |= BIT_SUB_CAM_P|BIT_SUB_CAM_C;
}
void MSDMAPreview_ScanLine_Offset( void)
{
unsigned int OutFormat=0;
unsigned int *Codecframebuffer, *Previewframebuffer;
unsigned int i,fb;
InitCameraModule();
Previewframebuffer = (U32 *)CameraPreviewFrameBuffer;
switch(lcd_bpp)
{
case WINCONx_16BPP_565 :
OutFormat = OutFormat_RGB16B;
break;
case WINCONx_24BPP_888 :
OutFormat = OutFormat_RGB24B;
break;
}
printf("MSDMA test. (Get YCBCR data from camera with codec path. And put the image into MSDMA.)\n");
camCodecStatus=CAPTURE_STOPPED;
camCodecCaptureCount=0;
camCodecDataValid=0;
pISR_CAM = (unsigned int)MSDMAISR;
rSUBSRCPND = BIT_SUB_CAM_P|BIT_SUB_CAM_C;
ClearPending(BIT_CAM);
rINTSUBMSK &= ~(BIT_SUB_CAM_P|BIT_SUB_CAM_C);
rINTMSK &= ~BIT_CAM;
for(i=0; i<480*800*2*4; i++) {
*Previewframebuffer ++ = 0x0;
}
SetCodecFormat( InFormat_YCBCR422, OutFormat_YCBCR422, INTERLEAVE_ON, ORDER_CRYCBY);
#if 0
SetCodecScaler( CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize);
SetCodecDMA( CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, OutFormat_YCBCR422, INTERLEAVE_ON);
#else if
SetCodecScaler( CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, 640, 480);
// SetCodecScaler( CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, 320, 240);
SetCodecDMA( 640, 480, OutFormat_YCBCR422, INTERLEAVE_ON);
// SetCodecDMA( 320, 240, OutFormat_YCBCR422, INTERLEAVE_ON);
#endif
#if 0
SetCodecFrameBuffer( CameraCodecFrameBuffer, CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, OutFormat_YCBCR422, INTERLEAVE_ON);
#else if
SetCodecFrameBuffer( CameraCodecFrameBuffer, 800, 480, OutFormat_YCBCR422, INTERLEAVE_ON);
// SetCodecFrameBuffer( CameraCodecFrameBuffer, 320, 240, OutFormat_YCBCR422, INTERLEAVE_ON);
#endif
// Use MSDMA Offset
#if 0
SetPreviewPath( CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, lcd_horizon_value, lcd_line_value, OutFormat);
#else if
// SetPreviewPath( 640, 480, lcd_horizon_value, lcd_line_value, OutFormat);
SetPreviewPath( 640, 480, 320, 240, OutFormat);
#endif
SetPreviewFrameBuffer( CameraPreviewFrameBuffer,lcd_horizon_value, lcd_line_value, OutFormat);
rCIPRSCOS = rCIPRSCOS&~(0xffffffff)|(0<<16) |((480) <<0);
SetPreviewSource( PREVIEW_MSDMA);
SetMSDMAFormat( MSDMA_InFormat_YCBCR422, INTERLEAVE_ON, ORDER_CRYCBY);
CodecCaptureStart();
EnablePreviewScaler();
EnableImageCapturePreview();
while (1) {
if (camCodecDataValid) {
camCodecDataValid = 0;
i = GetCodecFrameCount();
fb = GetCodecFrameBuffer((i-2)&0x3);
#if 0
SetMSDMAFrameBuffer( fb, CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, 0, MSDMA_InFormat_YCBCR422);
#else if
// SetMSDMAFrameBuffer( fb, lcd_horizon_value, lcd_line_value, 0, MSDMA_InFormat_YCBCR422);
SetMSDMAFrameBuffer( fb, 640, 480, 0, MSDMA_InFormat_YCBCR422);
#endif
PreviewComplete=0;
StartMSDMA();
WaitMSDMA();
while(PreviewComplete==0);
i = GetPreviewFrameCount();
fb = GetPreviewFrameBuffer((i-1)&0x3);
*VIDWxADD0_Reg_Addr[0][0] = fb;
}
if (Uart_GetKey()== '\r') break;
}
DisableImageCapturePreview();
DisablePreviewScaler();
CodecCaptureStop();
while(!(camCodecStatus==CAPTURE_STOPPED ));
printf("\ncamCodecCaptureCount=%d\n",camCodecCaptureCount);
printf("codec Status register:0x%x\n", rCICOSTATUS);
rINTMSK |= BIT_CAM;
rINTSUBMSK |= BIT_SUB_CAM_P|BIT_SUB_CAM_C;
}
void Camera_Interlace( void)
{
unsigned int OutFormat = 0;
int i, fb;
rGPGCON=rGPGCON&~(0x3<<20)|(0x3<<20); // set FIELD A
rGPGUDP=rGPGUDP&~(0x3<<20); // Pull up/down disable
rCIGCTRL=rCIGCTRL&~(0x7<<0)|(0x1<<2)|(0x1<<1)|(0x1<<0); // Field mode enable, normal, interlace
ResetCameraModule();
ResetCameraInterface();
SetCameraSourceFormat(CAMERA_ITU601,UVOFFSET_0,ORDER_YCBYCR);
SetCameraSourceSize(800,480);
SetCameraInterfacePolarity(InvPolPCLK_INVERSE,InvPolVSYNC_NORMAL,InvPolHREF_NORMAL);
SetCameraWindowOffset(WINDOWOFFSET_DISABLE,0,0,0,0);
switch(lcd_bpp)
{
case WINCONx_16BPP_565 :
OutFormat = OutFormat_RGB16B;
break;
case WINCONx_24BPP_888 :
OutFormat = OutFormat_RGB24B;
break;
}
printf("Camera Codec path test.\n");
camCodecStatus=CAPTURE_STOPPED;
camCodecCaptureCount=0;
camCodecDataValid=0;
pISR_CAM = (unsigned int)CameraISR;
rSUBSRCPND = BIT_SUB_CAM_P|BIT_SUB_CAM_C;
ClearPending(BIT_CAM);
rINTSUBMSK &= ~BIT_SUB_CAM_C;
rINTMSK &= ~BIT_CAM;
rCICOSCOS = rCICOSCOS&~(0xffffffff)|(800<<0); //initial offset, line offset
SetCodecFormat( InFormat_YCBCR422, OutFormat, INTERLEAVE_ON, ORDER_YCBYCR);
SetCodecScaler( 800, 480, lcd_horizon_value, lcd_line_value); // org
SetCodecDMA( lcd_horizon_value, lcd_line_value, OutFormat, INTERLEAVE_ON); // org
SetCodecFrameBuffer( CameraCodecFrameBuffer, lcd_horizon_value, lcd_line_value, OutFormat, INTERLEAVE_ON);
CodecCaptureStart();
while (1) {
if (camCodecDataValid) {
camCodecDataValid = 0;
i = (GetCodecFrameCount()-2)&0x1;
fb = GetCodecFrameBuffer(i*2); //
*VIDWxADD0_Reg_Addr[0][0] = fb;
}
if (Uart_GetKey()== '\r') break;
}
CodecCaptureStop();
while(!(camCodecStatus==CAPTURE_STOPPED ));
printf("\ncamCodecCaptureCount=%d, %x\n",camCodecCaptureCount, rCIIMGCPT);
printf("codec Status register:0x%x\n", rCICOSTATUS);
rINTMSK |= BIT_CAM;
rINTSUBMSK |= BIT_SUB_CAM_C;
}
void TestPattern( void)
{
printf("Select Test Pattern : 0) No pattern (Camera) 1) Color Bar 2) Horizontal Increment 3) Vertical Increment\n");
TESTPATTERN = GetIntNum();
if ((TESTPATTERN<0)||(TESTPATTERN>3))
TESTPATTERN = 0;
}
void FlipTest( void)
{
printf("Select Flip mode : 0) Nomal 1) X-axis mirror 2) y-axis mirror 3) 180 deg rotation\n");
FLIPMODE = GetIntNum();
if ((FLIPMODE<0)||(FLIPMODE>3))
FLIPMODE = 0;
}
void CamGpio_Init(void)
{
rGPJCON = 0x2aaaaaa; // Camif enable [25:0]
rGPJUDP = 0x2aaaaaa; // Camif port pull-up disable [12:0]
}
void CamClk_Set(void)
{
int i;
printf("\nSelect camera source clock (1: EPLL, 2: HCLK): ");
i = GetIntNum();
printf("\n");
if ((i<1)||(i>2)) i=1;
if(i==1) { // Camera IF Clock divider setup
printf("EPLLOUT: 96MHz\n");
rLOCKCON1=rLOCKCON1 & ~(0xffff)|(0x800);
rEPLLCON=(0<<24)|(0x20<<16)|(0x1<<8)|(0x2); //96MHz
rCLKSRC&=~(1<<20); // CAM clock source: EPLL
rCLKSRC|=(1<<6); // EPLL Output
}
else if(i==2) rCLKSRC|=(1<<20); // CAM clock source: HCLK
printf("Select camera clock divider\n");
printf("Choose one [Input Clock/n, n=1~16, D=4]:");
i=GetIntNum();
if ((i<1)||(i>16)) i=4;
rCLKDIV1 = (rCLKDIV1 & ~(0xf<<26))|((i-1)<<26);
}
void * camera_function[][2]=
{
(void *)ReadCameraModuleStatus, "Read Camera Module Status ",
(void *)CameraCodec, "Codec mode Test ",
(void *)CameraPreview, "Preview mode Test ",
(void *)MSDMAPreview, "MSDMA test with Codec mode ",
(void *)CameraCodec_ScanLine_Offset, "Codec Scan Line Offset Test ",
(void *)CameraPreview_ScanLine_Offset, "Preview Scan Line Offset Test ",
(void *)MSDMAPreview_ScanLine_Offset, "MSDMA Scan Line Offset Test ",
(void *)Camera_Interlace, "Camera interlace Test ",
0,0
};
void Test_Camera(void)
{
int i;
CamGpio_Init();
CamClk_Set();
Setup_RgbIf();
// rHCLKCON&=~(1<<8); //CAMCLK disable (HCLK)
// rSCLKCON&=~(1<<11); // CAMCLK disable (EPLL)
while(1) {
i=0;
printf("\n\n");
while(1) {
printf("%2d:%s",i,camera_function[i][1]);
i++;
if((int)(camera_function[i][0])==0) {
printf("\n");
break;
}
if((i%2)==0) printf("\n");
}
printf("\nSelect(-1 to exit): ");
i = GetIntNum();
printf("\n");
if(i==-1) break;
if(i>=0 && (i<(sizeof(camera_function)/8)-1) )
( (void (*)(void)) (camera_function[i][0]) )();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -