www.pudn.com > ADS_s3c2440a.rar > camif.c
/************************************************************ File Name : camif.c Descriptions -S3C2440 camera test routines & basic libraries History - July 23, 2003. Draft Version 0.0 by purnnamu - Janualy 15, 2004. Modifed by Boaz Copyright (c) 2004 SAMSUNG Electronics. # However, Anybody can use this code without our permission. *************************************************************/ #include#include "def.h" #include "2440addr.h" #include "2440lib.h" #include "camif.h" #include "lcdlib.h" #include "glib.h" #include "camproset.h" // for camera setting //#include ".\bmp\pqvga16bsm5.h" #include ".\bmp\422jpeg.h" #include ".\bmp\420jpeg.h" #include ".\bmp\foreman_cif_420.H" volatile U32 camTestMode; volatile U32 camCodecCaptureCount; volatile U32 camPviewCaptureCount; volatile U32 camCodecStatus; volatile U32 camPviewStatus; volatile U32 amount; U32 save_GPJCON, save_GPJDAT, save_GPJUP; U8 flagCaptured_P = 0; U8 flagCaptured_C = 0; void * func_camera_test[][2]= { (void *)Test_CamPreview, "Preview Test ", (void *)Test_CamCodec, "Codec Test ", (void *)Camera_Iic_Test, "IIC interface test ", (void *)Test_YCbCr_to_RGB, "YCbCr2RGB test", 0,0 }; void Camera_Test(void) { int i; Uart_Printf("\n====== Camera Interface Test Start ======\n"); CamReset(); // Initializing camif rCLKCON |= (1<<19); // enable camclk CamPortSet(); ChangeUPllValue(60, 4, 1); // UPLL clock = 96MHz, PLL input 16.9344MHz rCLKDIVN|=(1<<3); // UCLK 48MHz setting for UPLL 96MHz // 0:48MHz, 1:24MHz, 2:16MHz, 3:12MHz... // Camera clock = UPLL/[(CAMCLK_DIV+1)X2] Uart_Printf("1...\n"); switch(USED_CAM_TYPE) { case CAM_AU70H : if (AU70H_VIDEO_SIZE==1152) SetCAMClockDivider(CAMCLK24000000); //Set Camera Clock for SXGA if (AU70H_VIDEO_SIZE==640) SetCAMClockDivider(CAMCLK16000000); //Set Camera Clock for VGA break; case CAM_S5X3A1 : SetCAMClockDivider(CAMCLK24000000); //Set Camera Clock for SXGA break; default : // 24MHz SetCAMClockDivider(CAMCLK24000000); //Set Camera Clock 24MHz s5x532, ov7620 break; } Uart_Printf("2...\n"); // Initializing camera module CamModuleReset(); // s5x532 must do this.. Delay(500); // ready time of s5x433, s5x532 IIC interface. needed... CameraModuleSetting(); Uart_Printf("Initializing end...\n"); while(1) { i=0; Uart_Printf("\n\n"); while(1) { //display menu Uart_Printf("%2d:%s\n",i,func_camera_test[i][1]); i++; if((int)(func_camera_test[i][0])==0) { Uart_Printf("\n"); break; } if((i%4)==0) Uart_Printf("\n"); } Uart_Printf("\nPress only Enter key to exit : "); i = Uart_GetIntNum(); if(i==-1) break; // return. if(i>=0 && (i<((sizeof(func_camera_test)-1)/8)) ) // select and execute... ( (void (*)(void)) (func_camera_test[i][0]) )(); } Uart_Printf("\n====== Camera IF Test program end ======\n"); // CamModuleReset(); // s5x532 must do this.. rCLKCON &= ~(1<<19); // disable camclk } void CamPortSet(void) { save_GPJCON = rGPJCON; save_GPJDAT = rGPJDAT; save_GPJUP = rGPJUP; rGPJCON = 0x2aaaaaa; rGPJDAT = 0; rGPJUP = 0; } void CamPortReturn(void) { rGPJCON = save_GPJCON; rGPJDAT = save_GPJDAT; rGPJUP = save_GPJUP; } void CamPreviewIntUnmask(void) { rINTSUBMSK &= ~(BIT_SUB_CAM_P);//INT CAMERA Port A ENABLE rINTMSK &= ~(BIT_CAM); } void CamCodecIntUnmask(void) { rINTSUBMSK &= ~(BIT_SUB_CAM_C);//INT CAMERA Port B ENABLE rINTMSK &= ~(BIT_CAM); } void CamPreviewIntMask(void) { rINTSUBMSK |= BIT_SUB_CAM_P;//INT CAMERA Port A ENABLE rINTMSK |= (BIT_CAM); } void CamCodecIntMask(void) { rINTSUBMSK |= BIT_SUB_CAM_C;//INT CAMERA Port B ENABLE rINTMSK |= (BIT_CAM); } /****************************************************** * * * camera interface initialization * * * *******************************************************/ void CamReset(void) { rCIGCTRL |= (1<<31); //camera I/F soft reset Delay(10); rCIGCTRL &= ~(1<<31); } void CamModuleReset(void) { switch(USED_CAM_TYPE) { case CAM_OV7620 : // reset - active high case CAM_S5X532 : // reset - active low, but H/W inverted.. so, in this case active high case CAM_S5X433 : // reset - active low, but H/W inverted.. so, in this case active high case CAM_S5X3A1 : // reset - active low, but H/W inverted.. so, in this case active high rCIGCTRL |= (1<<30); //external camera reset high Delay(30); rCIGCTRL &= ~(1<<30); //external camera reset low break; case CAM_AU70H : // reset - active low default : rCIGCTRL &= ~(1<<30); //external camera reset low Delay(10); rCIGCTRL |= (1<<30); //external camera reset high break; } } // 0:48MHz, 1:24MHz, 2:16MHz, 3:12MHz... // Camera clock = UPLL/[(CAMCLK_DIV+1)X2] void SetCAMClockDivider(int divn) { rCAMDIVN = (rCAMDIVN & ~(0xf))|(1<<4)|(divn); // CAMCLK is divided.. } /* Description of Parameters CoDstWidth: Destination Width of Codec Path CoDstHeight: Destination Height of Codec Path PrDstWidth: Destination Width of Preview Path PrDstHeight: Destination Height of Preview Path WinHorOffset: Size of Window Offset for Horizontal Direction WinVerOffset: Size of Window Offset for Vertical Direction CoFrameBuffer: Start Address for Codec DMA PrFrameBuffer: Start Address for Previe DMA */ void CamInit(U32 CoDstWidth, U32 CoDstHeight, U32 PrDstWidth, U32 PrDstHeight, U32 WinHorOffset, U32 WinVerOffset, U32 CoFrameBuffer, U32 PrFrameBuffer) { U32 WinOfsEn; U32 divisor, multiplier; U32 MainBurstSizeY, RemainedBurstSizeY, MainBurstSizeC, RemainedBurstSizeC, MainBurstSizeRGB, RemainedBurstSizeRGB; U32 H_Shift, V_Shift, PreHorRatio, PreVerRatio, MainHorRatio, MainVerRatio; U32 SrcWidth, SrcHeight; U32 ScaleUp_H_Co, ScaleUp_V_Co, ScaleUp_H_Pr, ScaleUp_V_Pr; //constant for calculating codec dma address if(CAM_CODEC_OUTPUT) divisor=2; //CCIR-422 else divisor=4; //CCIR-420 //constant for calculating preview dma address if(CAM_PVIEW_OUTPUT) multiplier=4; else multiplier=2; if(WinHorOffset==0 && WinVerOffset==0) WinOfsEn=0; else WinOfsEn=1; SrcWidth=CAM_SRC_HSIZE-WinHorOffset*2; SrcHeight=CAM_SRC_VSIZE-WinVerOffset*2; if(SrcWidth>=CoDstWidth) ScaleUp_H_Co=0; //down else ScaleUp_H_Co=1; //up if(SrcHeight>=CoDstHeight) ScaleUp_V_Co=0; else ScaleUp_V_Co=1; if(SrcWidth>=PrDstWidth) ScaleUp_H_Pr=0; //down else ScaleUp_H_Pr=1; //up if(SrcHeight>=PrDstHeight) ScaleUp_V_Pr=0; // edited 040225 else ScaleUp_V_Pr=1; ////////////////// common control setting rCIGCTRL |= (1<<26)|(0<<27); // inverse PCLK, test pattern rCIWDOFST = (1<<30)|(0xf<<12); // clear overflow rCIWDOFST = 0; rCIWDOFST=(WinOfsEn<<31)|(WinHorOffset<<16)|(WinVerOffset); rCISRCFMT=(CAM_ITU601<<31)|(0<<30)|(0<<29)|(CAM_SRC_HSIZE<<16)|(CAM_ORDER_YCBYCR<<14)|(CAM_SRC_VSIZE); ////////////////// codec port setting if (CAM_CODEC_4PP) { rCICOYSA1=CoFrameBuffer; rCICOYSA2=rCICOYSA1+CoDstWidth*CoDstHeight+2*CoDstWidth*CoDstHeight/divisor; rCICOYSA3=rCICOYSA2+CoDstWidth*CoDstHeight+2*CoDstWidth*CoDstHeight/divisor; rCICOYSA4=rCICOYSA3+CoDstWidth*CoDstHeight+2*CoDstWidth*CoDstHeight/divisor; rCICOCBSA1=rCICOYSA1+CoDstWidth*CoDstHeight; rCICOCBSA2=rCICOYSA2+CoDstWidth*CoDstHeight; rCICOCBSA3=rCICOYSA3+CoDstWidth*CoDstHeight; rCICOCBSA4=rCICOYSA4+CoDstWidth*CoDstHeight; rCICOCRSA1=rCICOCBSA1+CoDstWidth*CoDstHeight/divisor; rCICOCRSA2=rCICOCBSA2+CoDstWidth*CoDstHeight/divisor; rCICOCRSA3=rCICOCBSA3+CoDstWidth*CoDstHeight/divisor; rCICOCRSA4=rCICOCBSA4+CoDstWidth*CoDstHeight/divisor; } else { rCICOYSA1=CoFrameBuffer; rCICOYSA2=rCICOYSA1; rCICOYSA3=rCICOYSA1; rCICOYSA4=rCICOYSA1; rCICOCBSA1=rCICOYSA1+CoDstWidth*CoDstHeight; rCICOCBSA2=rCICOCBSA1; rCICOCBSA3=rCICOCBSA1; rCICOCBSA4=rCICOCBSA1; rCICOCRSA1=rCICOCBSA1+CoDstWidth*CoDstHeight/divisor; rCICOCRSA2=rCICOCRSA1; rCICOCRSA3=rCICOCRSA1; rCICOCRSA4=rCICOCRSA1; } rCICOTRGFMT=(CAM_CODEC_IN_422<<31)|(CAM_CODEC_OUTPUT<<30)|(CoDstWidth<<16)|(CAM_FLIP_NORMAL<<14)|(CoDstHeight); CalculateBurstSize(CoDstWidth, &MainBurstSizeY, &RemainedBurstSizeY); CalculateBurstSize(CoDstWidth/2, &MainBurstSizeC, &RemainedBurstSizeC); rCICOCTRL=(MainBurstSizeY<<19)|(RemainedBurstSizeY<<14)|(MainBurstSizeC<<9)|(RemainedBurstSizeC<<4); CalculatePrescalerRatioShift(SrcWidth, CoDstWidth, &PreHorRatio, &H_Shift); CalculatePrescalerRatioShift(SrcHeight, CoDstHeight, &PreVerRatio, &V_Shift); MainHorRatio=(SrcWidth<<8)/(CoDstWidth< =64*DstSize) { Uart_Printf("ERROR: out of the prescaler range: SrcSize/DstSize = %d(< 64)\n",SrcSize/DstSize); while(1); } else if(SrcSize>=32*DstSize) { *ratio=32; *shift=5; } else if(SrcSize>=16*DstSize) { *ratio=16; *shift=4; } else if(SrcSize>=8*DstSize) { *ratio=8; *shift=3; } else if(SrcSize>=4*DstSize) { *ratio=4; *shift=2; } else if(SrcSize>=2*DstSize) { *ratio=2; *shift=1; } else { *ratio=1; *shift=0; } } /******************************************************** CamCaptureStart - Start camera capture operation. Description: - mode= CAM_CODEC_CAPTURE_ENABLE_BIT or CAM_PVIEW_CAPTURE_ENABLE_BIT or both */ void CamCaptureStart(U32 mode) { if(mode&CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT) { camCodecStatus=CAM_STARTED; rCICOSCCTRL|=CAM_CODEC_SACLER_START_BIT; } if(mode&CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT) { camPviewStatus=CAM_STARTED; rCIPRSCCTRL|=CAM_PVIEW_SACLER_START_BIT; } if(mode&CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT) { camCodecStatus=CAM_STARTED; rCICOSCCTRL|=CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT; } rCIIMGCPT|=CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT|mode; } void CamCaptureStop(void) { camCodecStatus=CAM_STOP_ISSUED; camPviewStatus=CAM_STOP_ISSUED; } void _CamCodecStopHw(void) { rCICOSCCTRL &= ~CAM_CODEC_SACLER_START_BIT; //stop codec scaler. rCIIMGCPT &= ~CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT; //stop capturing for codec scaler. if(!(rCIIMGCPT & CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT)) rCIIMGCPT &= ~CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT; //stop capturing for preview scaler if needed. rCICOCTRL |= (1<<2); //Enable last IRQ at the end of frame capture. //NOTE:LastIrqEn bit should be set after clearing CAPTURE_ENABLE_BIT & SCALER_START_BIT } void _CamPviewStopHw(void) { rCIPRSCCTRL &= ~CAM_PVIEW_SACLER_START_BIT; //stop preview scaler. rCIIMGCPT &= ~CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT; //stop capturing for preview scaler. if(!(rCIIMGCPT&CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT)) rCIIMGCPT &= ~CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT; //stop capturing for codec scaler if needed. rCIPRCTRL |= (1<<2); //Enable last IRQ at the end of frame capture. //NOTE:LastIrqEn bit should be set after clearing CAPTURE_ENABLE_BIT & SCALER_START_BIT } void __irq CamIsr(void) { U32 completedFrameIndex; if (rSUBSRCPND&BIT_SUB_CAM_C) { Uart_Printf("[C]"); CamCodecIntMask(); rSUBSRCPND |= BIT_SUB_CAM_C; ClearPending(BIT_CAM); switch(camCodecStatus) { case CAM_STOP_ISSUED: _CamCodecStopHw(); camCodecStatus=CAM_LAST_CAPTURING; Uart_Printf("cr=%x\n", rCICOCTRL); //Uart_Printf("cS1\n"); break; case CAM_LAST_CAPTURING: camCodecStatus=CAM_STOPPED; CamCodecIntMask(); //Uart_Printf("cS2\n"); return; case CAM_STARTED: flagCaptured_C = 1; // _CamCodecStopHw(); if(camTestMode&CAM_TEST_MODE_CODEC) { if(camCodecCaptureCount>0) completedFrameIndex=(((rCICOSTATUS>>26)&0x3)+4-2)%4; //Uart_Printf("FrameIndex:%d\n",completedFrameIndex); } else { //Uart_Printf("Just Capturing without display"); } break; case CAM_CODEC_SCALER_BYPASS_STATE: //Uart_Printf("cBP\n"); break; default: break; } CamCodecIntUnmask(); camCodecCaptureCount++; } else { Uart_Printf("[P]"); CamPreviewIntMask(); rSUBSRCPND |= BIT_SUB_CAM_P; ClearPending(BIT_CAM) switch(camPviewStatus) { case CAM_STOP_ISSUED: _CamPviewStopHw(); camPviewStatus=CAM_LAST_CAPTURING; Uart_Printf("pr=%x\n", rCIPRCTRL); //Uart_Printf("pS1\n"); break; case CAM_LAST_CAPTURING: camPviewStatus=CAM_STOPPED; CamPreviewIntMask(); //Uart_Printf("pS2\n"); return; case CAM_STARTED: flagCaptured_P = 1; if(camTestMode&CAM_TEST_MODE_PVIEW) { if(camPviewCaptureCount >0) completedFrameIndex=(((rCIPRSTATUS>>26)&0x3)+4-2)%4; //Uart_Printf("FrameIndex:%d\n",completedFrameIndex); } else { //Uart_Printf("Preview Image Captured\n"); } default: break; } CamPreviewIntUnmask(); camPviewCaptureCount++; } } /****************************************************************************** * * * camera interface interrupts & controls * * * ******************************************************************************/ U32 Conv_YCbCr_Rgb(U8 y0, U8 y1, U8 cb0, U8 cr0) // second solution... by junon { // 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 // 4 frames/s @192MHz, 12MHz ; 6 frames/s @450MHz, 12MHz 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; U8 y0,y1,cb0,cr0; int r0,r1,g0,g1,b0,b1; U32 rgb_data0, rgb_data1; U32 x, y; int temp; if (CAM_CODEC_4PP) temp = (((rCICOSTATUS>>26)&0x3)+4-2)%4; // current frame memory block else temp = 4; //Uart_Printf("Current Frame memory %d\n", temp); 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; } //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 CAM_CODEC_OUTPUT==CAM_CCIR420 for (y=0;y EINT19 #endif } #if 0 void Display_Cam_Image(int offset_x, int offset_y, int size_x, int size_y) { U8* CamFrameAddr, LcdFrameAddr; int i, temp; Lcd_MoveViewPort(offset_x, offset_y, USED_LCD_TYPE); switch(camPviewCaptureCount%4) { case 2 : temp = rCIPRCLRSA1; break; case 3 : temp = rCIPRCLRSA2; break; case 0 : temp = rCIPRCLRSA3; break; case 1 : default: temp = rCIPRCLRSA4; break; } *CamFrameAddr = temp; *LcdFrameAddr = LCDFRAMEBUFFER; for(i=0;i Camera data is halfword swap type, 24bit rLCDSADDR3 &= ~(0x7ff<<11); // offset size 0 rLCDSADDR2=M5D( (LCDFRAMEBUFFER+(LCD_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*4))>>1 ); Lcd_EnvidOnOff(1); data = (U32 *)LCDFRAMEBUFFER; for (i=0;i<240*320;i++) // 24bpp test { if (i<240*80) *data++ = 0x000000ff; // blue else if ((i<240*160)&&(i>=240*80)) *data++ = 0x0000ff00; //green else if ((i<240*240)&&(i>=240*160)) *data++ = 0x00ff0000; //red else if (i>=240*240) *data++ = 0xff000000; // black } #else // RGB16B Lcd_Start(MODE_TFT_16BIT_240320); Lcd_EnvidOnOff(0); // for 240x320 16bit haltword swap type setting rLCDCON5 |= 1; // halfword swap enable -> Camera data is halfword swap type, 16bit rLCDSADDR3 &= ~(0x7ff<<11); // offset size 0 rLCDSADDR2=M5D( (LCDFRAMEBUFFER+(LCD_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*2))>>1 ); Lcd_EnvidOnOff(1); data = (U32 *)LCDFRAMEBUFFER; for (i=0;i<240*160;i++) // 16bpp test { if (i<240*40) *data++ = 0x001f001f; // blue else if ((i<240*80)&&(i>=240*40)) *data++ = 0x07e007e0; //green else if ((i<240*120)&&(i>=240*80)) *data++ = 0xf800f800; //red else if (i>=240*120) *data++ = 0xf800001f; // blue & red } #endif Uart_Printf("\nTFT 64K color mode test 1. Press any key!\n"); Uart_Getch(); Uart_Printf(" preview sc control = %x\n", rCIPRSCCTRL); // Initialize Camera interface switch(USED_CAM_TYPE) { case CAM_S5X532 : // defualt for test : data-falling edge, ITU601, YCbCr CamInit(640, 480, 240, 320, 112, 20, CAM_FRAMEBUFFER_C, CAM_FRAMEBUFFER_P); break; case CAM_S5X3A1 : // defualt for test : data-falling edge, YCbCr CamInit(640, 480, 240, 320, 120, 100, CAM_FRAMEBUFFER_C, CAM_FRAMEBUFFER_P); rCISRCFMT = rCISRCFMT & ~(1<<31); // ITU656 // rCIGCTRL &= ~(1<<26); // inverse PCLK, test pattern break; default : CamInit(640, 480, 240, 320, 0, 0, CAM_FRAMEBUFFER_C, CAM_FRAMEBUFFER_P); break; } Uart_Printf(" preview sc control = %x\n", rCIPRSCCTRL); // Start Capture rSUBSRCPND |= BIT_SUB_CAM_C|BIT_SUB_CAM_P; ClearPending(BIT_CAM); pISR_CAM = (U32)CamIsr; CamPreviewIntUnmask(); CamCaptureStart(CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT); Uart_Printf("Press Enter key to exit!\n"); while (1) { if (flagCaptured_P) { flagCaptured_P = 0; // Uart_Printf("Enter Cam A port, count = %d\n",camCodecCaptureCount); } if (Uart_GetKey()== '\r') break; } CamCaptureStop(); Uart_Printf("\nWait until the current frame capture is completed.\n"); while(camPviewStatus!=CAM_STOPPED) if (Uart_GetKey()== '\r') break; Uart_Printf(" CIS format = %x\n", rCISRCFMT); Uart_Printf(" image cap = %x\n", rCIIMGCPT); Uart_Printf(" preview sc control = %x\n", rCIPRSCCTRL); Uart_Printf(" preview control = %x\n", rCIPRCTRL); Uart_Printf(" codec sc control = %x\n", rCICOSCCTRL); Uart_Printf(" codec control = %x\n", rCICOCTRL); Uart_Printf(" pr addr1 = %x\n", rCIPRCLRSA1); Uart_Printf(" pr addr2 = %x\n", rCIPRCLRSA2); Uart_Printf("camCodecCaptureCount=%d\n",camCodecCaptureCount); Uart_Printf("camPviewCaptureCount=%d\n",camPviewCaptureCount); // CamPreviewIntMask(); } void Test_CamCodec(void) { U8 flag, fBypass='1'; U32 i,j,k,value, *data; Uart_Printf("\n[ Camera Codec Test ]\n"); //camera global variables camTestMode=CAM_TEST_MODE_CODEC; camCodecCaptureCount=0; camPviewCaptureCount=0; camPviewStatus=CAM_STOPPED; camCodecStatus=CAM_STOPPED; flagCaptured_C=0; //Initialize LCD Lcd_Start(MODE_TFT_16BIT_240320); Glib_FilledRectangle(0,0,239,79,0x001f); // B Glib_FilledRectangle(0,80,239,159,0x07e0); // G Glib_FilledRectangle(0,160,239,239,0xf800); // R Glib_FilledRectangle(0,240,239,319,0xffff); Uart_Printf("\nTFT 64K color mode test 1. Press any key!\n"); Uart_Getch(); // Initialize Camera interface switch(USED_CAM_TYPE) { case CAM_S5X532 : // defualt for test : data-falling edge, ITU601, YCbCr CamInit(240, 320, 240, 320, 112, 20, CAM_FRAMEBUFFER_C, CAM_FRAMEBUFFER_P); break; case CAM_S5X3A1 : // defualt for test : data-falling edge, ITU601, YCbCr CamInit(240, 320, 240, 320, 0, 0, CAM_FRAMEBUFFER_C, CAM_FRAMEBUFFER_P); rCISRCFMT &= ~(1<<31); // ITU656 break; default : CamInit(240, 320, 240, 320, 0, 0, CAM_FRAMEBUFFER_C, CAM_FRAMEBUFFER_P); break; } // Start Capture rSUBSRCPND |= BIT_SUB_CAM_C|BIT_SUB_CAM_P; ClearPending(BIT_CAM); pISR_CAM = (U32)CamIsr; CamCodecIntUnmask(); Uart_Printf("Select Code mode : 1. Scaler mode(D) 2. Bypass mode\n"); fBypass = Uart_Getch(); if (fBypass=='2'){ CamInit(CAM_SRC_HSIZE, CAM_SRC_VSIZE, 240, 320, 0, 0, CAM_FRAMEBUFFER_C, CAM_FRAMEBUFFER_P); CamCaptureStart(CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT); //bypass } else CamCaptureStart(CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT); //scaler // for test simultanious // rCIIMGCPT |= CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT; // rCIPRSCCTRL |= CAM_PVIEW_SACLER_START_BIT; Uart_Printf("Press Enter key to exit!\n"); while (1) { if (flagCaptured_C) { flagCaptured_C = 0; if (fBypass=='2') Display_Cam_Image(CAM_SRC_HSIZE, CAM_SRC_VSIZE); else Display_Cam_Image(240, 320); // Uart_Printf("Enter Cam B port, count = %d\n",camPviewCaptureCount); } // if (camCodecCaptureCount>=1) // { // Uart_Printf("cnt = %d\n", camCodecCaptureCount); // break; // } if (Uart_GetKey()== '\r') break; } CamCaptureStop(); Uart_Printf("\nWait until the current frame capture is completed.\n"); while(camCodecStatus!=CAM_STOPPED) if (Uart_GetKey()== '\r') break; Uart_Printf(" CIS format = %x\n", rCISRCFMT); Uart_Printf(" image cap = %x\n", rCIIMGCPT); Uart_Printf(" preview sc control = %x\n", rCIPRSCCTRL); Uart_Printf(" preview control = %x\n", rCIPRCTRL); Uart_Printf(" codec sc control = %x\n", rCICOSCCTRL); Uart_Printf(" codec control = %x\n", rCICOCTRL); Uart_Printf(" codec status = %x\n", rCICOSTATUS); Uart_Printf("camCodecCaptureCount=%d\n",camCodecCaptureCount); Uart_Printf("camPviewCaptureCount=%d\n",camPviewCaptureCount); // CamCodecIntMask(); } void Test_YCbCr_to_RGB(void) { U8 *buffer_y, *buffer_cb, *buffer_cr; int size_x, size_y, R, G, B, rgb_data; int x, y; int pos_x = 0; int pos_y = 0; U8 cSelType = 0; U8 *cBuffer; Lcd_Start(MODE_TFT_16BIT_240320); size_x = PQVGA_XSIZE; size_y = PQVGA_YSIZE; Uart_Printf("Select 1. 420[D] PQVGA 2. 422 PQVGA 3. 420 CIF : \n"); cSelType = Uart_Getch(); if (cSelType == '\r') cSelType = '1'; switch (cSelType) { case '1' : cBuffer = (U8 *)c420jpeg; break; case '2' : cBuffer = (U8 *)c422jpeg; break; case '3' : cBuffer = (U8 *)foreman_cif_420; size_x = CIF_XSIZE; size_y = CIF_YSIZE; break; } buffer_y = (U8 *)(cBuffer); buffer_cb = (U8 *)(cBuffer + size_x*size_y); // add y size buffer_cr = (U8 *)(buffer_cb + size_x*size_y/4); // add y,cb size if (cSelType == '2') buffer_cr = (U8 *)(buffer_cb + size_x*size_y/2); // add y,cb size Uart_Printf("End setting : Y-0x%x, Cb-0x%x, Cr-0x%x\n", buffer_y, buffer_cb, buffer_cr); Uart_Printf("Address : Y-0x%x, foreman-0x%x, fa-0x%x\n", *buffer_y, cBuffer, *cBuffer); Glib_FilledRectangle(0,0,239,159,0xaaaa); Glib_FilledRectangle(0,160,239,320,0xf800); Uart_Printf("\nTFT 64K color mode test 1. Press any key!\n"); Uart_Getch(); for (y=0;y 255 ) R = 255; if (G>255 ) G = 255; if (B>255 ) B = 255; if (R<0 ) R = 0; if (G<0 ) G = 0; if (B<0 ) B = 0; // 5:6:5 16bit format rgb_data =(R&0xf8)<<8; // R 5bits rgb_data|=(G&0xfc)<<3; // G 6bits rgb_data|=(B&0xf8)>>3; // B 5bits PutPixel(pos_x+x, pos_y+y, rgb_data); // next usable bits.. buffer_y++; if (x%2) // when x is odd number { buffer_cb++; buffer_cr++; } if (cSelType != '2') if ( (x==(size_x-1)) && ((y%2)==0) ) // when x is last pixel & y is even number { buffer_cb -= size_x/2; buffer_cr -= size_x/2; } } Uart_Printf("Virtual Screen Test(TFT 64K color). Press any key[ijkm\\r]!\n"); MoveViewPort(MODE_TFT_16BIT_240320); // user can adjust screen.. Lcd_MoveViewPort(0,0,MODE_TFT_16BIT_240320); // return 0,0 Glib_ClearScr(0, MODE_TFT_16BIT_240320); Lcd_EnvidOnOff(0); Lcd_PowerEnable(0, 0); Lcd_Port_Return(); }