⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 camif.c

📁 三星s3c2460开发板完整功能测试代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		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 + -