📄 cameratest.c
字号:
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;
// QVGA
/*
for(i=0; i<240*320*2*4; i++) {
*Codecframebuffer ++ = 0x0;
}
for(i=0; i<240*320*2*4; i++) {
*Previewframebuffer ++ = 0x0;
}
*/
// WVGA
for(i=0; i<480*800*2*4; i++) {
*Codecframebuffer ++ = 0x0;
}
for(i=0; i<480*800*2*4; i++) {
*Previewframebuffer ++ = 0x0;
}
SetCodecFormat( InFormat_YCBCR422, OutFormat_YCBCR422, INTERLEAVE_ON, ORDER_CRYCBY);
SetCodecScaler( CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, TargetHsize, TargetVsize);
SetCodecDMA( TargetHsize, TargetVsize, OutFormat_YCBCR422, INTERLEAVE_ON); // jcs
SetCodec_ScanLine_Bubffer(3);
// Use MSDMA Offset
SetPreviewPath( 320, 240, lcd_horizon_value, lcd_line_value, OutFormat);
// SetPreviewPath( 800, 480, lcd_horizon_value, lcd_line_value, OutFormat);
SetPreviewFrameBuffer( CameraPreviewFrameBuffer, lcd_horizon_value, lcd_line_value, OutFormat);
SetPreviewSource( PREVIEW_MSDMA);
SetMSDMAFormat( MSDMA_InFormat_YCBCR422, INTERLEAVE_ON, ORDER_CRYCBY);
/*
rCIIMGCPT |= (1<<24) | (0<<18) | (0x0<<19);
rCICOCPTSEQ = 0xa;
*/
CodecCaptureStart();
EnablePreviewScaler();
EnableImageCapturePreview();
printf("\nrCIMSCTRL = %x\n",rCIMSCTRL);
while (1) {
if (camCodecDataValid) {
camCodecDataValid = 0;
i = GetCodecFrameCount();
Return_ScanLine_BubfferAddr();
fb = GetCodecFrameBuffer((i-2)&0x3);
SetMSDMAFrameBuffer( fb, lcd_horizon_value, lcd_line_value, 0, MSDMA_InFormat_YCBCR422);
PreviewComplete=0;
StartMSDMA();
WaitMSDMA();
SetCodec_ScanLine_Bubffer(3);
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;
#endif
}
void Return_ScanLine_BubfferAddr()
{
rCICOYSA1 = (0x31000000+0x01800000);
rCICOYSA2 = rCICOYSA1+(320*240*2);
rCICOYSA3 = rCICOYSA2+(320*240*2);
rCICOYSA4 = rCICOYSA3+(320*240*2);
}
void SetCodecDstOffset(U32 uDisplayHSz, U32 uStartX, U32 uStartY)
{
/*
U32 InitOffset = uDisplayHSz*uStartY + uStartX;
U32 LineOffset = uDisplayHSz - 160;
if (InitOffset >= 0x1000)
{
printf("\nInitial Offset error\n");
return;
}
printf("\nInitial Offset = %x\n",InitOffset);
*/
rCICOSCOS = (160<<16) | (160<<0);
printf("\nrCICOSCOS = %x\n",rCICOSCOS);
}
void SetCodec_ScanLine_Bubffer(U32 FrameNumber)
{
switch(FrameNumber)
{
case 0:
//Frame 0
rCICOYSA1 = CameraCodecFrameBuffer;
rCICOYSA2 = rCICOYSA1+(lcd_horizon_value*lcd_line_value*2);
rCICOYSA3 = rCICOYSA2+(lcd_horizon_value*lcd_line_value*2);
rCICOYSA4 = rCICOYSA3+(lcd_horizon_value*lcd_line_value*2);
rCICOSCOS = (0<<16) | ((lcd_horizon_value -240) <<0);
break;
case 1:
//Frame 1
rCICOYSA1 = CameraCodecFrameBuffer;
rCICOYSA2 = rCICOYSA1+(lcd_horizon_value*lcd_line_value*2);
rCICOYSA3 = rCICOYSA2+(lcd_horizon_value*lcd_line_value*2);
rCICOYSA4 = rCICOYSA3+(lcd_horizon_value*lcd_line_value*2);
rCICOSCOS = (160<<16) | ((lcd_horizon_value -240) <<0);
break;
case 2:
//Frame 2
rCICOYSA1 = CameraCodecFrameBuffer + 320*120*2;
rCICOYSA2 = rCICOYSA1+(lcd_horizon_value*lcd_line_value*2);
rCICOYSA3 = rCICOYSA2+(lcd_horizon_value*lcd_line_value*2);
rCICOYSA4 = rCICOYSA3+(lcd_horizon_value*lcd_line_value*2);
rCICOSCOS = (0<<16) | ((lcd_horizon_value -240) <<0);
break;
case 3:
//Frame 3
rCICOYSA1 = CameraCodecFrameBuffer + 320*120*2;
rCICOYSA2 = rCICOYSA1+(lcd_horizon_value*lcd_line_value*2);
rCICOYSA3 = rCICOYSA2+(lcd_horizon_value*lcd_line_value*2);
rCICOYSA4 = rCICOYSA3+(lcd_horizon_value*lcd_line_value*2);
rCICOSCOS = (160<<16) | ((lcd_horizon_value -240) <<0);
case 4:
//Frame 3
rCICOYSA1 = CameraCodecFrameBuffer;
rCICOYSA2 = rCICOYSA1+(lcd_horizon_value*lcd_line_value*2);
rCICOYSA3 = rCICOYSA2+(lcd_horizon_value*lcd_line_value*2);
rCICOYSA4 = rCICOYSA3+(lcd_horizon_value*lcd_line_value*2);
rCICOSCOS = ((320*26)<<16) | ((lcd_horizon_value -240) <<0);
break;
}
}
//************************************************************************
//* Preview test
//************************************************************************
void StartPreviewCapture( void)
{
camPviewCaptureCount = 0;
camPviewStatus = CAPTURING;
EnablePreviewScaler();
EnableImageCapturePreview();
EnableImageCapture();
}
void PreviewCaptureStop(void)
{
camPviewStatus = CAPTURE_STOP_ISSUED;
}
void CameraIF_PreviewISR(void)
{
switch(camPviewStatus) {
case CAPTURE_STOPPED : // It will never happen.
break;
case CAPTURING :
break;
case CAPTURE_STOP_ISSUED :
EnablePreviewLastIRQ();
camPviewStatus = CAPTURE_LASTIRQ_ISSUED;
break;
case CAPTURE_LASTIRQ_ISSUED :
DisableImageCapture();
DisableImageCapturePreview();
DisablePreviewScaler();
camPviewStatus = CAPTURE_LAST_IRQ;
break;
case CAPTURE_LAST_IRQ :
camPviewStatus = CAPTURE_STOPPED;
break;
}
if (camPviewCaptureCount>0)
camPviewDataValid = 1;
camPviewCaptureCount++;
}
void CameraPreview( void)
{
unsigned int OutFormat=0;
unsigned int *Codecframebuffer, *Previewframebuffer;
int i, fb;
InitCameraModule();
switch(lcd_bpp)
{
case WINCONx_16BPP_565 :
OutFormat = OutFormat_RGB16B;
break;
case WINCONx_24BPP_888 :
OutFormat = OutFormat_RGB24B;
break;
}
Previewframebuffer = (U32 *)CameraPreviewFrameBuffer;
printf("Camera Preview path test.\n");
camPviewStatus=CAPTURE_STOPPED;
camPviewCaptureCount=0;
camPviewDataValid=0;
pISR_CAM = (unsigned int)CameraISR;
rSUBSRCPND = BIT_SUB_CAM_P|BIT_SUB_CAM_C;
ClearPending(BIT_CAM);
rINTSUBMSK &= ~BIT_SUB_CAM_P;
rINTMSK &= ~BIT_CAM;
for(i=0; i<480*800*2*4; i++) {
*Previewframebuffer ++ = 0x0;
}
// SetCameraWindowOffset(WINDOWOFFSET_ENABLE,0,0,1200,720); // jcs for offset test
rCIPRSCOS=(rCIPRSCOS& ~(0x1fff<<0))|(400<<0);
// SetPreviewPath(CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, lcd_horizon_value, lcd_line_value, OutFormat); //org
SetPreviewPath(CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, 400, 480, OutFormat); // 400 x 480
// SetPreviewPath(400, lcd_line_value, 400, lcd_line_value, OutFormat); // jcs for offset test
SetPreviewFrameBuffer(CameraPreviewFrameBuffer, lcd_horizon_value, lcd_line_value, OutFormat); //org
// SetPreviewFlipMode(FLIPMODE);
// SetCameraTestPattern(TESTPATTERN);
SetPreviewSource(PREVIEW_CAMERA);
StartPreviewCapture();
while (1) {
if (camPviewDataValid) {
camPviewDataValid = 0;
i = (GetPreviewFrameCount()-2)&0x3;
fb = GetPreviewFrameBuffer(i);
*VIDWxADD0_Reg_Addr[0][0] = fb;
}
if (Uart_GetKey()== '\r') break;
}
PreviewCaptureStop();
while(!(camPviewStatus==CAPTURE_STOPPED ));
printf("\ncamPviewCaptureCount=%d\n",camPviewCaptureCount);
printf("preview Status register:0x%x\n", rCIPRSTATUS);
rINTMSK |= BIT_CAM;
rINTSUBMSK |= BIT_SUB_CAM_P;
}
void CameraPreview_ScanLine_Offset( void)
{
unsigned int OutFormat=0, InitOffset, LineOffset;
int i, fb;
unsigned int *Codecframebuffer, *Previewframebuffer;
unsigned int TargetHsize, TargetVsize;//, StartPixelNumber;
InitCameraModule();
Previewframebuffer = (U32 *)CameraPreviewFrameBuffer;
switch(lcd_bpp)
{
case WINCONx_16BPP_565 :
OutFormat = OutFormat_RGB16B;
break;
case WINCONx_24BPP_888 :
OutFormat = OutFormat_RGB24B;
break;
}
printf("Camera Preview scanline offset test.\n");
camPviewStatus=CAPTURE_STOPPED;
camPviewCaptureCount=0;
camPviewDataValid=0;
pISR_CAM = (unsigned int)CameraISR;
rSUBSRCPND = BIT_SUB_CAM_P|BIT_SUB_CAM_C;
ClearPending(BIT_CAM);
rINTSUBMSK &= ~BIT_SUB_CAM_P;
rINTMSK &= ~BIT_CAM;
for(i=0; i<480*800*2*4; i++) {
*Previewframebuffer ++ = 0x0;
}
InitOffset=480;
LineOffset=480;
// SetPreviewPath(CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, lcd_horizon_value, lcd_line_value, OutFormat);
SetPreviewPath(CameraModule[CAMTYPE].Hsize, CameraModule[CAMTYPE].Vsize, 320, 240, OutFormat);
// SetPreviewFrameBuffer(CameraPreviewFrameBuffer, lcd_horizon_value, lcd_line_value, OutFormat);
SetPreviewFrameBuffer_Scanline(CameraPreviewFrameBuffer, lcd_horizon_value, lcd_line_value, OutFormat, InitOffset, LineOffset);
SetPreviewSource(PREVIEW_CAMERA);
StartPreviewCapture();
while (1) {
if (camPviewDataValid) {
camPviewDataValid = 0;
i = (GetPreviewFrameCount()-2)&0x3;
fb = GetPreviewFrameBuffer(i);
*VIDWxADD0_Reg_Addr[0][0] = fb;
}
if (Uart_GetKey()== '\r') break;
}
PreviewCaptureStop();
while(!(camPviewStatus==CAPTURE_STOPPED ));
printf("\ncamPviewCaptureCount=%d\n",camPviewCaptureCount);
printf("preview Status register:0x%x\n", rCIPRSTATUS);
rINTMSK |= BIT_CAM;
rINTSUBMSK |= BIT_SUB_CAM_P;
}
//************************************************************************
//* MSDMA test
//************************************************************************
void MSDMAPreview( void)
{
unsigned int OutFormat=0;
unsigned int i,fb;
InitCameraModule();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -