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

📄 mobile_demo.c

📁 三星s3c2460开发板完整功能测试代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************

 Filename:	mobile_demo.c

 Descriptions		
 - MPEG4 ME block routines

 History
 -19.Dec.2003
  draft
 
 Copyright (c) 2003 SAMSUNG Electronics.
 # However, Anybody can use this code without our permission.  

 ******************************************************************************/
#include "def.h"
#include "2460addr.h"
#include "2460lib.h"
#include "fim20_def.h"
#include "memc_test.h"
#include "dctq_test.h"
#include "vlx_test.h"
#include "deblock.h"
#include "mobile_demo.h"
#include "camif.h"
#include "lcdlib.h"
#include "post.h"
#include "camproset.h"
#include "pll.h"


#define CAM_ENABLE  (1)

#if (FIMV_DEMO_IMAGE_SIZE == QCIF)
	#define FIMV_IMAGE_WIDTH	(176)
	#define FIMV_IMAGE_HEIGHT	(144)
	
#elif (FIMV_DEMO_IMAGE_SIZE == CIF)
	#define FIMV_IMAGE_WIDTH	(352)
	#define FIMV_IMAGE_HEIGHT	(288)
	
#elif (FIMV_DEMO_IMAGE_SIZE == VGA)
	#define FIMV_IMAGE_WIDTH	(640)
	#define FIMV_IMAGE_HEIGHT	(480)

#elif (FIMV_DEMO_IMAGE_SIZE == MPIXEL)
	#define FIMV_IMAGE_WIDTH	(1152)
	#define FIMV_IMAGE_HEIGHT	(864)
	
#endif


#define FIMV_MBLK_NUM			((FIMV_IMAGE_WIDTH/16)*(FIMV_IMAGE_HEIGHT/16))

volatile unsigned int d_dctqDone, d_meDone, d_mcDone, d_vlxDone, d_camDone;
volatile unsigned int c_dctqDone, c_meDone, c_mcDone, c_vlxDone, c_camDone;
volatile unsigned int c_dctqCnt, c_meCnt, c_mcCnt, c_vlxCnt, c_camCnt;
volatile unsigned int _DCTQ_FLAG,_ME_FLAG,_MC_FLAG, _CAMIF_FLAG, _POSTLCD_FLAG;
volatile unsigned int prevImageNum, frameNum;


static IMAGE420 currImage;	//no-padded image YCbCr420
static IMAGE420 currImage2[4];	//no-padded image YCbCr420
static IMAGE420 refImage[4];	//padded image YCbCr420
static IMAGE420 dctqCoeff[4];   //no-padded, the size is twice than currImage.
static ME_VECTOR meVector[4][(FIMV_IMAGE_WIDTH/16)*(FIMV_IMAGE_HEIGHT/16)];
static unsigned int meVector2[4];
static PQINFO pQInfo;


void * mp4_function[][2]=
{
    	//(void *)TestDctq_Encoder,        			"DCTQ                 ",
    	//(void *)TestDctq_2048X2048,        			"2048*2048 Test   ",		
    	//(void *)TestVLC_CoeffMem,        			"VLC <-Coeff Mem      ",		    
    	//(void *)TestVLC_fromDCTQ,        			"VLC <-DCTQ       ",		        
    	//(void *)TestVLD_DCTQ,        				"VLD ->DCTQ           ",		     
    	(void *)TestVlx,							"Vlx test	",
    	(void *)TestMeMc,						"ME MC Test	",
    	(void *)Test_Post_CIF_16,					"post test	",

    	(void *)Mobile_Image_Demo,			       "Mobile Demo	",
    	//(void *)S5X532_Iic_Test,					"camera preview	",
    	(void *)Mpeg4_camera_image,			"Mpeg4 <-camera	",
    	//(void *)AHB_I_Bus_Test,					"AHB-I arbitration test ",
  	0,0
};

void Ch22_mpeg4_test(void)
{
	int i;

	while(1)
	{
       	i = 0;
      
		printf("\n\nS3C2460A MPEG4 Test Program \n\n");
        
		while(1)
		{   //display menu
			printf("%2d:%s",i,mp4_function[i][1]);
			i++;
			if((int)(mp4_function[i][0])==0)
			{
				printf("\n");
				break;
			}
			if((i%4)==0)
			printf("\n");
		}
        
		printf("\nSelect the function to test : ");
		i = GetIntNum();
		printf("\n");
     
		if(i==-1) break;

		if(i>=0 && (i<(sizeof(mp4_function)/8)) ) 
		( (void (*)(void)) (mp4_function[i][0]) )();            
	}


}




void AHB_I_Bus_Test(void)
{
    	int i;
	unsigned int pVlcData;
		
	// step 1 : Initialize ISR 
	Fim20DemoIsrUnmask();
	// step 2 : Initialize memory map

	//Fim20DemoMem();
	// step 3 : start scheduler

	printf("ref[0] = %08x\n",refImage[0]);
	printf("cur[3] = %08x, pre[3]=%08x\n", currImage2[3],refImage[3]);

	printf("FC=%d\n", (rMODE&(0x3<<10))>>10);

	//printf("rpriority=%d, %d\n", rPRIORITY0, rPRIORITY1);
	//rPRIORITY0=rPRIORITY1 |= 0x1;
	//Fim20Scheduler();
//	Post_Envid_On();

//	printf("dkdkdkd\n");
//	printf("FC=%d\n", (rMODE&(0x3<<10))>>10);

	//Uart_TxEmpty(0);


	PostSetFimv16B(FIMV_IMAGE_WIDTH,FIMV_IMAGE_HEIGHT,240,320, refImage[0].frameStartAddr,mpegframebuffer);

	//LcdEnvidOnOff(1);


	Init_FIMV20_Isr();

	pVlcData=(_NONCACHE_STARTADDRESS+0x00a00000);
       VlcConfig4Dctq(352,(unsigned int)pVlcData,(352/16)*(284/16),0);
	//DctqEngine(&currImage,&prevImage,&dctqCoeff,pQInfo,DCTQ_WITH_VLC_COEFF_WRITE);


	//DctqEngine(&currImage, &refImage[prevImageNum], &dctqCoeff[frameNum], pQInfo, DCTQ_FRAME_START_MODE);
	DctqEngine(&currImage, &refImage[prevImageNum], &dctqCoeff[frameNum], pQInfo, DCTQ_WITH_VLC_COEFF_WRITE);
	MeEngine(&currImage, &refImage[prevImageNum], meVector[frameNum%4], 0);
	McEngine(&refImage[prevImageNum], &refImage[1 ], meVector[frameNum%4], 0);

//	PostStartProcessing(0, 0);


	while(1){
		//printf("1");
		}
	// step 4 : mask mpeg4 ISR
	//Fim20DemoIsrMask();



}

/*  
c:camera  r:reference	d:dctq_coeff


	C0	    C1		C2	    C3		C4     	    C5
	------------------------------------------------------------------------
	Cap:c0	    EC:c0r3-r0  Post1:r0 
		    Dc:c0r0-d0	
		    Post2:c0
		    
		    Cap:c1  	EC:c1r0-r1  Post1:r1
		  		Dc:c1r1-d1
		  		Post2:c1
		  		
		    		Cap:c2	    EC:c2r1-r2	Post1:r2
					    Dc:c2r2-d2	
					    Post2:c2
					    
		    			    Cap:c3	EC:c3r2-r3  Post1:r3		
							Dc:c3r3-d3  
							Post2:c3
							
		    			    		Cap:c0	    EC:c0r3-r0
	    	    						    Dc:c0r0-d0	
	    	    						    Post2:c0
	    	    						    
								    cap:c1
C0->C1->C2->C3->C4->C5
        +            |
        |            |
        +--<--<--<---+
*/        

unsigned int FimvImageWidth, FimvImageHeight, fpsNum;

void Image_Select(void)
{

	printf("[Camera Encoder Test]\n");

       printf("Select Image Size: \n 1. QCIF		2.CIF 	3.VGA \n");
	    
	switch(getchar())
	{
	    case '1':
	    		FimvImageWidth = QCIF_XSIZE;
			FimvImageHeight = QCIF_YSIZE;
	    	break;
	    case '2':
	    		FimvImageWidth = CIF_XSIZE;
			FimvImageHeight = CIF_YSIZE;
	    	break;
	    case '3':
	    		FimvImageWidth = VGA_XSIZE;
			FimvImageHeight = VGA_YSIZE;
	    default:
	    	break;
	}

}


void Mpeg4_camera_image(void)
{
	FimvImageWidth = CIF_XSIZE;
	FimvImageHeight = CIF_YSIZE;

	rGPJCON &= ~(0xf<<28); // GPJ14, 15 - input(reset value)
  	Camera_Open();  

	// step 1 : Initialize ISR 
	Fim20DemoIsrUnmask();

	// step 2 : Initialize memory map
	Fim20DemoMem();

  	Lcd_Init_Mpeg();

	// step 3 : start scheduler
	Fim20Scheduler();
	
	// step 4 : mask mpeg4 ISR
	Fim20DemoIsrMask();

	CamIIC_close();
	ReturnCamifPort();
	
}

#if CAM_ENABLE
extern volatile unsigned int amount;

void Camera_Open(void)
{
	SetCamifPort();
	CamSelectPort(0);
	if (rGPJDAT & (1<<14) ) // GPJ14
	{ // no pressing button
		CAMTYPE=CAM_S5X3A1;
		CAMSIZE=SXGA_XSIZE;
	}
	else 
	{ // pressed button
		CAMTYPE=CAM_S5X532;
		CAMSIZE=VGA_XSIZE;
	}
	CAMIICID=0x5a;
	rCLKSRCCON = (rCLKSRCCON & ~(1<<13))|(1<<5); // select UPLL
	SetUPLL( 72, 3, 1); // 96MHz
	SetCAMClockDivider(3); // UPLL/(CAMCLK_DIV+1)
	
	CamReset();		
	
	CameraModuleSetting();

	// Camera setting
	if (rGPJDAT & (1<<14) ) // GPJ14
		CamInit(FimvImageWidth, FimvImageHeight, 352, 288, 240, 0,  (_NONCACHE_STARTADDRESS+0), LCDFRAMEBUFFERFG2);
	else
		CamInit(FimvImageWidth, FimvImageHeight, 352, 288, 100, 0,  (_NONCACHE_STARTADDRESS+0), LCDFRAMEBUFFERFG2);
}

void Lcd_Init_Mpeg(void)
{
	if (rGPJDAT & (1<<15) ) // GPJ14
	{ // no pressing button
		Init_240X320_AMLCD();
		LcdBGInit(MODE_SER_16BIT565_240320|MODE_MPEG_DISPLAY_16B);
	}
	else 
	{ // pressed button
		LcdBGInit(MODE_PAR_16BIT565_240320|MODE_MPEG_DISPLAY_16B);
	}
}


void Fim20Scheduler(void)
{
	unsigned int camif_flag, dctq_flag, me_flag, mc_flag, post_flag;
	c_camDone=c_dctqDone=c_meDone=c_mcDone=0;
	c_dctqCnt= c_meCnt= c_mcCnt= c_vlxCnt= c_camCnt=0;
	_CAMIF_FLAG=_DCTQ_FLAG=_ME_FLAG=_MC_FLAG=_POSTLCD_FLAG=0;

	camTestMode=CAM_TEST_MODE_CODEC_POST;
	camCodecCaptureCount=0;
	camPviewCaptureCount=0;
	camPviewStatus=CAM_STOPPED;
	camCodecStatus=CAM_STOPPED;

	fpsNum=0;
	frameNum = 0;    
	//Timer_Start(2);

	calculate_FPS_WDT();
	
	CamCaptureStart(CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT);
	
	LcdEnvidOnOff(1);
	
	while(!Uart_GetKey()){
		camif_flag = _CAMIF_FLAG;
		dctq_flag  = _DCTQ_FLAG;
		me_flag    = _ME_FLAG;

		        		
		if(camif_flag==0x00000020) {
			if(dctq_flag==0x00000000) {
				//printf("s_d\n");
				_DCTQ_FLAG = 0x00000010;
	        		//printf("S : dctq_flag = 10-->");
				FdStartDctq(0);

			}
		}
		// process the 1st inter frame
		else if(camif_flag==0x00000030) {
			if(dctq_flag==0x00000011) {
				if(me_flag==0x00000000) {
					_ME_FLAG = 0x00000020;
	        			//printf("S : me_flag = 20-->");
					FdStartMe(1, 0);

				}
			}
		}
		// process the 2nd inter frame
		else if(camif_flag==0x00000040) {
			if(dctq_flag==0x00000021) {
				if(me_flag==0x00000021) {
					_ME_FLAG = 0x00000030;
	        			//printf("S : me_flag = 30-->");
					FdStartMe(2, 1);
				}
			}
		}
		// process the 3rd inter frame	
		else if(camif_flag==0x00000010) {
			if(dctq_flag==0x00000031) {
				if(me_flag==0x00000031) {
					_ME_FLAG = 0x00000040;
	        			//printf("S : me_flag = 40-->");
					FdStartMe(3, 2);
				}
			}
		}

		dctq_flag = _DCTQ_FLAG;
		post_flag = _POSTLCD_FLAG;

		
		if(dctq_flag==0x00000011) {
			if(post_flag==0x00000000) {
				_POSTLCD_FLAG = 0x00000010;
	        		//printf("S : post_flag = 10-->");
				//PostStartProcessing(0);
				PostStartFIMV20(refImage[0].frameStartAddr);

					
				//printf("cp1 = %d\n",camcnt);				
					
			}
		}
		else if(dctq_flag==0x00000021) {
			if(post_flag==0x00000011) {
				_POSTLCD_FLAG = 0x00000020;
	        		//printf("S : post_flag = 20-->");
				//PostStartProcessing(1);
				PostStartFIMV20(refImage[1].frameStartAddr);

					
				//printf("cp2 = %d\n",camcnt);				
			}
		}
		else if(dctq_flag==0x00000031) {
			if(post_flag==0x00000021) {
				_POSTLCD_FLAG = 0x00000030;
	        		//printf("S : post_flag = 30-->");
				//PostStartProcessing(2);
				PostStartFIMV20(refImage[2].frameStartAddr);
					
				//printf("cp3 = %d\n",camcnt);				
					
			}
		}
		else if(dctq_flag==0x00000041) {
			if(post_flag==0x00000031) {
				_POSTLCD_FLAG = 0x00000040;
	        		//printf("S : post_flag = 40-->");
				//PostStartProcessing(3);
				PostStartFIMV20(refImage[3].frameStartAddr);

			}
		}
		
		me_flag = _ME_FLAG;
		mc_flag = _MC_FLAG;

		if(me_flag==0x00000021) {
			if(mc_flag==0x00000000) {
				_MC_FLAG = 0x00000020;
	        		//printf("S : mc_flag = 20-->");
				FdStartMc(0,1);
				
			}
		}
		else if(me_flag==0x00000031) {
			if(mc_flag==0x00000021) {
				_MC_FLAG = 0x00000030;
				//printf("S : mc_flag = 30-->");
				FdStartMc(1,2);
			}
		}
		else if(me_flag==0x00000041) {
			if(mc_flag==0x00000031) {
				_MC_FLAG = 0x00000040;
	        		//printf("S : mc_flag = 40-->");
				FdStartMc(2,3);
				_ME_FLAG = 0x00000000;
	        		//printf("S : me_flag = 0-->");
			}
		}
			//Delay(70);

		//printf("c%d\n",camcnt);

		mc_flag = _MC_FLAG;
		dctq_flag = _DCTQ_FLAG;

		if(mc_flag==0x00000021) {
			if(dctq_flag==0x00000011) {
				_DCTQ_FLAG = 0x00000020;
	        		//printf("S : dctq_flag = 20-->");
				FdStartDctq(1);
		
			}
		}
		else if(mc_flag==0x00000031) {
			if(dctq_flag==0x00000021) {
				_DCTQ_FLAG = 0x00000030;
				FdStartDctq(2);
			}
		}
		else if(mc_flag==0x00000041) {
			if(dctq_flag==0x00000031) {
				_DCTQ_FLAG = 0x00000040;
	        		//printf("S : dctq_flag = 40-->");
				FdStartDctq(3);
				_MC_FLAG = 0x00000000;
	        		//printf("S : mc_flag = 0-->");
			}
		}
	}

	CamCaptureStop();
	while(!(camCodecStatus==CAM_STOPPED )); 
	rINTSUBMSK2 |= (BIT_SUB_CAMIF_C);
	rINTMSK |=(BIT_CAMIF_BLOCK_POST);

}
#endif

void FdStartDctq(unsigned int frameNum)
{
        //DctqEngine(&currImage2[frameNum],&refImage[frameNum],&dctqCoeff[frameNum],pQInfo,DCTQ_FRAME_START_MODE);
	//DctqEngine(&currImage,&prevImage,&dctqCoeff,pQInfo,DCTQ_WITH_VLC_COEFF_WRITE);

	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -