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

📄 post.c

📁 s3c24a0固件测试代码 ? ? ? ? ?啊 
💻 C
📖 第 1 页 / 共 3 页
字号:
	SrcStartX=SrcStartY=0;
	OrgDstWidth=DstWidth=PQVGA_XSIZE; //no destination offset
	OrgDstHeight=DstHeight=PQVGA_YSIZE; //no destination offset
	DstStartX=DstStartY=0;
	InFrameBuffer=downloadAddress;
	OutFrameBuffer=LCDFRAMEBUFFERBG1;
	

	PostInit(OrgSrcWidth, OrgSrcHeight, SrcWidth, SrcHeight, SrcStartX, SrcStartY, 
			OrgDstWidth, OrgDstHeight, DstWidth, DstHeight, DstStartX, DstStartY, 
			InFrameBuffer, OutFrameBuffer, mode);

	pISR_LCD_POST=(unsigned)PostIsr;
	rINTMSK &= ~(BIT_LCD_POST);
	rINTSUBMSK &= ~(BIT_SUB_POST);

	PostStartProcessing(0);

	while(!postProcessingDone); //waiting for post-processing done 
	postProcessingDone=0;
	
	LcdEnvidOnOff(1); //LCD Envid On

	Uart_Printf("Test of Zoom In/Out, PIP Operation\n");
	Uart_Printf("w.z.s.a for Zoom in/out\n");	
	Uart_Printf("r.c.f.d for Coordination of zoomed image\n");
	Uart_Printf("y.b.h.g for PIP\n");	
	Uart_Printf("i.m.k.j for Coordination of PIP image\n");

	SrcStartX=SrcStartY=0;
	DstStartX=DstStartY=0;
	while(1) {
		switch(Uart_Getch()) {
			case 'w':
				SrcHeight+=8;
				if(SrcHeight>OrgSrcHeight)
					SrcHeight=OrgSrcHeight;
				break;
			case 'z':
				SrcHeight-=8;
				if(SrcHeight<8)
					SrcHeight=8;
				break;
			case 's':
				SrcWidth+=8;
				if(SrcWidth>OrgSrcWidth)
					SrcWidth=OrgSrcWidth;
				break;
			case 'a':
				SrcWidth-=8;
				if(SrcWidth<8)
					SrcWidth=8;
				break;
			case 'r':
				SrcStartY+=8;
				if((SrcStartY-1)>(OrgSrcHeight-SrcHeight))
					SrcStartY=OrgSrcHeight-SrcHeight;
				break;
			case 'c':
				SrcStartY-=8;
				if(SrcStartY<0)
					SrcStartY=0;
				break;
			case 'f':
				SrcStartX+=8;
				if((SrcStartX-1)>(OrgSrcWidth-SrcWidth))
					SrcStartX=OrgSrcWidth-SrcWidth;
				break;
			case 'd':
				SrcStartX-=8;
				if(SrcStartX<0)
					SrcStartX=0;
				break;				
			case 'y':
				DstHeight+=4;
				if(DstHeight>OrgDstHeight)
					DstHeight=OrgDstHeight;
				break;
			case 'b':
				DstHeight-=4;
				if(DstHeight<12)
					DstHeight=12;
				break;
			case 'h':
				DstWidth+=4;
				if(DstWidth>OrgDstWidth)
					DstWidth=OrgDstWidth;
				break;
			case 'g':
				DstWidth-=4;
				if(DstWidth<12)
					DstWidth=12;
				break;
			case 'i':
				DstStartY+=8;
				if((DstStartY-1)>(OrgDstHeight-DstHeight))
					DstStartY=OrgDstHeight-DstHeight;
				break;
			case 'm':
				DstStartY-=8;
				if(DstStartY<0)
					DstStartY=0;
				break;
			case 'k':
				DstStartX+=8;
				if((DstStartX-1)>(OrgDstWidth-DstWidth))
					DstStartX=OrgDstWidth-DstWidth;
				break;
			case 'j':
				DstStartX-=8;
				if(DstStartX<0)
					DstStartX=0;
				break;	 				
			case '\r':
				return;
			default:
				break;
		}		
		Uart_Printf("SrcWidth:0x%x, SrcHeight:0x%x, DstWidth:0x%x, DstHeight:0x%x\n", SrcWidth, SrcHeight, DstWidth, DstHeight);
		Uart_Printf("SrcStartX:0x%x, SrcStartY:0x%x, DstStartX:0x%x, DstStartY:0x%x\n\n", SrcStartX, SrcStartY, DstStartX, DstStartY);
		PostInit((U32)OrgSrcWidth, (U32)OrgSrcHeight, (U32)SrcWidth, (U32)SrcHeight, (U32)SrcStartX, (U32)SrcStartY, 
				(U32)OrgDstWidth, (U32)OrgDstHeight, (U32)DstWidth, (U32)DstHeight, (U32)DstStartX, (U32)DstStartY, 
				InFrameBuffer, OutFrameBuffer, mode);		
		PostStartProcessing(0);
		while(!postProcessingDone);
		postProcessingDone=0;//redundant;
	}

	rINTSUBMSK |= BIT_SUB_POST;
	rINTMSK |= BIT_LCD_POST;

	
}

void Test_Post_RGB_RGB_PQVGA(void)
{

	U32 i,j,k;
	U32 OrgSrcWidth, OrgSrcHeight, SrcWidth, SrcHeight, SrcStartX, SrcStartY;
	U32 OrgDstWidth, OrgDstHeight, DstWidth, DstHeight, DstStartX, DstStartY;
	U32 InFrameBuffer, OutFrameBuffer;
	U32 mode;
	
	U32 temp;

	U32 *postframebuffer;
	U32 *lcdframebuffer;

	OrgSrcWidth=SrcWidth=PQVGA_XSIZE; //no source offset
	OrgSrcHeight=SrcHeight=PQVGA_YSIZE; //no source offset
	SrcStartX=SrcStartY=0;
	OrgDstWidth=DstWidth=PQVGA_XSIZE; //no destination offset
	OrgDstHeight=DstHeight=PQVGA_YSIZE; //no destination offset
	DstStartX=DstStartY=0;
	InFrameBuffer=downloadAddress;
	OutFrameBuffer=LCDFRAMEBUFFERBG1;

	mode=0;
	
	k=0;
	temp=0;

	postframebuffer=(U32 *)downloadAddress;
	lcdframebuffer=(U32 *)LCDFRAMEBUFFERBG1;
	Uart_Printf("Select Input format of Post Processor\n");
	Uart_Printf("0:16bpp, 1:24bpp\n");
	i=Uart_GetIntNum();
	switch(i) {
		case 0:			
			mode|=POST_IN_RGB16B;
			for(j=0; j<PQVGA_YSIZE; j++)
				for(i=0; i<PQVGA_XSIZE; i+=2) {
					*(lcdframebuffer++)=*(postframebuffer++);
				}
			LcdBGInit(MODE_PAR_16BIT565_240320|MODE_NO_VIRTUAL_16B);				
			break;
		case 1:			
			mode|=POST_IN_RGB24B;
			for(j=0; j<PQVGA_YSIZE; j++)				
				for(i=0; i<PQVGA_XSIZE; i++) {
					*(lcdframebuffer++)=*(postframebuffer++);
				}	
			LcdBGInit(MODE_PAR_18BIT_240320|MODE_NO_VIRTUAL_24B);				
			break;
		default:				
			mode|=POST_IN_RGB16B;
			for(j=0; j<PQVGA_YSIZE; j++)
				for(i=0; i<PQVGA_XSIZE; i+=2) {
					*(lcdframebuffer++)=*(postframebuffer++);
				}
			LcdBGInit(MODE_PAR_16BIT565_240320|MODE_NO_VIRTUAL_16B);				
			break;
	}	

	
	LcdEnvidOnOffDirect(1);
	Uart_Printf("Original Image before post processing!!!!\n");
	Uart_Printf("Press any key to process POST\n");
	Uart_Getch();
	LcdEnvidOnOffDirect(0);
	
	//mode=POST_IN_YCBYCR420|POST_OUT_RGB16B;
	
	//LCD Initialization 
	//LcdBGInit(MODE_PAR_16BIT565_240320|MODE_NO_VIRTUAL_16B);	

	Uart_Printf("Select Output format of Post Processor\n");
	Uart_Printf("0:RG16, 1:RGB24\n");
	i=Uart_GetIntNum();
	switch(i) {
		case 0:
			mode|=POST_OUT_RGB16B;
			LcdBGInit(MODE_PAR_16BIT565_240320|MODE_NO_VIRTUAL_16B);
			break;
		case 1:
			mode|=POST_OUT_RGB24B;
			LcdBGInit(MODE_PAR_18BIT_240320|MODE_NO_VIRTUAL_24B);
			break;
		default:			
			mode|=POST_OUT_RGB16B;
			LcdBGInit(MODE_PAR_16BIT565_240320|MODE_NO_VIRTUAL_16B);
			break;
	}


	PostInit(OrgSrcWidth, OrgSrcHeight, SrcWidth, SrcHeight, SrcStartX, SrcStartY, 
			OrgDstWidth, OrgDstHeight, DstWidth, DstHeight, DstStartX, DstStartY, 
			InFrameBuffer, OutFrameBuffer, mode);

	pISR_LCD_POST=(unsigned)PostIsr;
	rINTMSK &= ~(BIT_LCD_POST);
	rINTSUBMSK &= ~(BIT_SUB_POST);

	Uart_Printf("rMODE:0x%x\n", rMODE);

#if 1
	PostStartProcessing(0);
#else
	if(mode&POST_IN_YCBYCR420)
		amount=OrgSrcWidth*OrgSrcHeight*3/2;

	if(mode&POST_OUT_RGB16B)
		amount+=OrgDstWidth*OrgDstHeight*2;
	else if(mode&POST_OUT_RGB24B)
		amount+=OrgDstWidth*OrgDstHeight*4;
	PostStartProcessing(amount, 0);
#endif

	while(!postProcessingDone); //waiting for post-processing done 
	postProcessingDone=0;

	LcdEnvidOnOffDirect(1); //LCD Envid On
	Uart_Printf("Processed Image!!!\n");
	Uart_Printf("Press any key to continue\n");
	Uart_Getch();
	LcdEnvidOnOffDirect(0); //LCD Envid Off	

	rINTSUBMSK |= BIT_SUB_POST;
	rINTMSK |= BIT_LCD_POST;
	
}


void PostSetFimv16B(U32 SrcWidth, U32 SrcHeight, U32 DstWidth, U32 DstHeight, U32 InFrameBuffer, U32 OutFrameBuffer)
{

	PostInit(SrcWidth+32, SrcHeight+32, SrcWidth, SrcHeight, 16, 16, 
			DstWidth, DstHeight, DstWidth, DstHeight, 0, 0, 
			InFrameBuffer, OutFrameBuffer, POST_IN_YCBYCR420|POST_OUT_RGB16B);	



}

void PostSetFimv24B(U32 SrcWidth, U32 SrcHeight, U32 DstWidth, U32 DstHeight, U32 InFrameBuffer, U32 OutFrameBuffer)
{

	PostInit(SrcWidth+32, SrcHeight+32, SrcWidth, SrcHeight, 16, 16, 
			DstWidth, DstHeight, DstWidth, DstHeight, 0, 0, 
			InFrameBuffer, OutFrameBuffer, POST_IN_YCBYCR420|POST_OUT_RGB24B);


}

void PostDownloadImage(void)
{
	//Uart_Printf("You can download image to memory\n");
	DownloadBinary();	
}



void __irq PostIsr(void)
{
	rINTSUBMSK=BIT_SUB_DISP_FIFO|BIT_SUB_DISP_FRAME|BIT_SUB_POST;
	   
	rMODE &= ~(1<<6);//Clear Source in POST Processor
	rSUBSRCPND=BIT_SUB_POST; //Clear SUB Interrupt Source Pending.
	ClearPending(BIT_LCD_POST);//Clear Source Pending, Interrupt Pending	   
	
	postProcessingDone=1;
	rINTSUBMSK&= ~(BIT_SUB_POST);
}


void PostStartProcessing(U32 FrameCnt)
{

	postProcessingDone=0;

	rADDRStart_Y=ADDRStartY[FrameCnt];
	rADDREnd_Y=ADDREndY[FrameCnt];
    
	rADDRStart_Cb=ADDRStartCb[FrameCnt];
	rADDREnd_Cb=ADDREndCb[FrameCnt];
	
	rADDRStart_Cr=ADDRStartCr[FrameCnt];
	rADDREnd_Cr=ADDREndCr[FrameCnt];
    
	rMODE|=(1<<5);
}



void PostInit(U32 OrgSrcWidth, U32 OrgSrcHeight, U32 SrcWidth, U32 SrcHeight, U32 SrcStartX, U32 SrcStartY,
			U32 OrgDstWidth, U32 OrgDstHeight, U32 DstWidth, U32 DstHeight, U32 DstStartX, U32 DstStartY, 
			U32 InFrameBuffer,U32 OutFrameBuffer, U32 mode)
{
	U32 src420, inrgb, interleave, inrgbformat, inycformat;
	U32 outrgb;	
	U32 H_Shift, V_Shift, PreHorRatio, PreVerRatio;
	U32 inmultiplier, outmultiplier;
	U32 OffsetY, OffsetC, OffsetRGB;

    
	switch(mode&POST_IN_MASK) {
		case POST_IN_YCBYCR420:
			src420=1;
			inrgb=0;
			interleave=0;
			inrgbformat=1;
			inycformat=0;
			inmultiplier=1;	
			break;
		case POST_IN_YCBYCR422:
			src420=0;
			inrgb=0;
			interleave=1;
			inrgbformat=1;
			inycformat=0;
			inmultiplier=2;
			break;
		case POST_IN_CBYCRY422:
			src420=0;
			inrgb=0;
			interleave=1;
			inrgbformat=1;
			inycformat=1;
			inmultiplier=2;			
			break;	
		case POST_IN_RGB16B:
			src420=0;
			inrgb=1;
			interleave=1;
			inrgbformat=0;
			inycformat=0;
			inmultiplier=2;			
			break;
		case POST_IN_RGB24B:
			src420=0;
			inrgb=1;
			interleave=1;
			inrgbformat=1;
			inycformat=0;
			inmultiplier=4;			
			break;
		default:
			Uart_Printf("ERROR:incorrect POST input format.\n");
	    		break;
		}
	
	if((mode&POST_OUT_MASK)==POST_OUT_RGB16B) {
		outrgb=0;
		outmultiplier=2;
		}
	else if((mode&POST_OUT_MASK)==POST_OUT_RGB24B) {
		outrgb=1;
		outmultiplier=4;
		}
	else 
		Uart_Printf("ERROR:incorrect POST output format.\n");

	OffsetC=(OrgSrcWidth-SrcWidth)*inmultiplier/2;

	//rMODE=(1<<9)|(src420<<8)|(POST_INTEN<<7)|(outrgb<<4)|(inrgb<<3)|(interleave<<2)|(inrgbformat<<1)|(inycformat);
	rMODE=(2<<10)|(1<<9)|(src420<<8)|(POST_INTEN<<7)|(outrgb<<4)|(inrgb<<3)|(interleave<<2)|(inrgbformat<<1)|(inycformat);

	CalculatePrescalerRatioShift(SrcWidth, DstWidth, &PreHorRatio, &H_Shift);
	CalculatePrescalerRatioShift(SrcHeight, DstHeight, &PreVerRatio, &V_Shift);
		
	rPreScale_Ratio=(PreVerRatio<<7)|(PreHorRatio);
	rPreScaleImgSize=((SrcHeight/PreVerRatio)<<12)|(SrcWidth/PreHorRatio);
	rSRCImgSize=(SrcHeight<<12)|(SrcWidth<<0);
	rMainScale_H_Ratio=(SrcWidth<<8)/(DstWidth<<H_Shift);
	rMainScale_V_Ratio=(SrcHeight<<8)/(DstHeight<<V_Shift);
	rDSTImgSize=(DstHeight<<12)|(DstWidth<<0);
	rPreScale_SHFactor=10-(H_Shift+V_Shift);

	OffsetY=(OrgSrcWidth-SrcWidth)*inmultiplier;
	OffsetC=((OrgSrcWidth-SrcWidth)/2)*1;

	ADDRStartY[0]=InFrameBuffer+(OrgSrcWidth*SrcStartY+SrcStartX)*inmultiplier;
	ADDREndY[0]=ADDRStartY[0]+SrcWidth*SrcHeight*inmultiplier+OffsetY*(SrcHeight-1);
	ADDRStartCb[0]=InFrameBuffer+OrgSrcWidth*OrgSrcHeight*1+(OrgSrcWidth/2*SrcStartY/2+SrcStartX/2)*1;
	ADDREndCb[0]=ADDRStartCb[0]+(SrcWidth/2*SrcHeight/2)*1+OffsetC*(SrcHeight/2-1);
	ADDRStartCr[0]=InFrameBuffer+OrgSrcWidth*OrgSrcHeight*1+(OrgSrcWidth/2*OrgSrcHeight/2)*1+(OrgSrcWidth/2*SrcStartY/2+SrcStartX/2)*1;
	ADDREndCr[0]=ADDRStartCr[0]+(SrcWidth/2*SrcHeight/2)*1+OffsetC*(SrcHeight/2-1);

	InFrameBuffer+=(OrgSrcWidth*OrgSrcHeight)*(2+inmultiplier)/2;
	ADDRStartY[1]=InFrameBuffer+(OrgSrcWidth*SrcStartY+SrcStartX)*inmultiplier;
	ADDREndY[1]=ADDRStartY[1]+SrcWidth*SrcHeight*inmultiplier+OffsetY*(SrcHeight-1);
	ADDRStartCb[1]=InFrameBuffer+OrgSrcWidth*OrgSrcHeight*1+(OrgSrcWidth/2*SrcStartY/2+SrcStartX/2)*1;
	ADDREndCb[1]=ADDRStartCb[1]+(SrcWidth/2*SrcHeight/2)*1+OffsetC*(SrcHeight/2-1);
	ADDRStartCr[1]=InFrameBuffer+OrgSrcWidth*OrgSrcHeight*1+(OrgSrcWidth/2*OrgSrcHeight/2)*1+(OrgSrcWidth/2*SrcStartY/2+SrcStartX/2)*1;
	ADDREndCr[1]=ADDRStartCr[1]+(SrcWidth/2*SrcHeight/2)*1+OffsetC*(SrcHeight/2-1);

	InFrameBuffer+=(OrgSrcWidth*OrgSrcHeight)*(2+inmultiplier)/2;
	ADDRStartY[2]=InFrameBuffer+(OrgSrcWidth*SrcStartY+SrcStartX)*inmultiplier;
	ADDREndY[2]=ADDRStartY[2]+SrcWidth*SrcHeight*inmultiplier+OffsetY*(SrcHeight-1);
	ADDRStartCb[2]=InFrameBuffer+OrgSrcWidth*OrgSrcHeight*1+(OrgSrcWidth/2*SrcStartY/2+SrcStartX/2)*1;
	ADDREndCb[2]=ADDRStartCb[2]+(SrcWidth/2*SrcHeight/2)*1+OffsetC*(SrcHeight/2-1);
	ADDRStartCr[2]=InFrameBuffer+OrgSrcWidth*OrgSrcHeight*1+(OrgSrcWidth/2*OrgSrcHeight/2)*1+(OrgSrcWidth/2*SrcStartY/2+SrcStartX/2)*1;
	ADDREndCr[2]=ADDRStartCr[2]+(SrcWidth/2*SrcHeight/2)*1+OffsetC*(SrcHeight/2-1);

	InFrameBuffer+=(OrgSrcWidth*OrgSrcHeight)*(2+inmultiplier)/2;
	ADDRStartY[3]=InFrameBuffer+(OrgSrcWidth*SrcStartY+SrcStartX)*inmultiplier;
	ADDREndY[3]=ADDRStartY[3]+SrcWidth*SrcHeight*inmultiplier+OffsetY*(SrcHeight-1);
	ADDRStartCb[3]=InFrameBuffer+OrgSrcWidth*OrgSrcHeight*1+(OrgSrcWidth/2*SrcStartY/2+SrcStartX/2)*1;
	ADDREndCb[3]=ADDRStartCb[3]+(SrcWidth/2*SrcHeight/2)*1+OffsetC*(SrcHeight/2-1);
	ADDRStartCr[3]=InFrameBuffer+OrgSrcWidth*OrgSrcHeight*1+(OrgSrcWidth/2*OrgSrcHeight/2)*1+(OrgSrcWidth/2*SrcStartY/2+SrcStartX/2)*1;
	ADDREndCr[3]=ADDRStartCr[3]+(SrcWidth/2*SrcHeight/2)*1+OffsetC*(SrcHeight/2-1);

	OffsetRGB=(OrgDstWidth-DstWidth)*outmultiplier;
	ADDRStartRGB[0]=OutFrameBuffer+(OrgDstWidth*DstStartY+DstStartX)*outmultiplier;
	ADDREndRGB[0]=ADDRStartRGB[0]+(DstWidth*DstHeight)*outmultiplier+OffsetRGB*(DstHeight-1);
	
	ADDRStartRGB[1]=ADDREndRGB[0]+(OrgDstWidth*DstStartY+DstStartX)*outmultiplier;
	ADDREndRGB[1]=ADDRStartRGB[1]+(DstWidth*DstHeight)*outmultiplier+OffsetRGB*(DstHeight-1);

	ADDRStartRGB[2]=ADDREndRGB[1]+(OrgDstWidth*DstStartY+DstStartX)*outmultiplier;
	ADDREndRGB[2]=ADDRStartRGB[2]+(DstWidth*DstHeight)*outmultiplier+OffsetRGB*(DstHeight-1);

	ADDRStartRGB[3]=ADDREndRGB[2]+(OrgDstWidth*DstStartY+DstStartX)*outmultiplier;
	ADDREndRGB[3]=ADDRStartRGB[3]+(DstWidth*DstHeight)*outmultiplier+OffsetRGB*(DstHeight-1);
		

	rADDRStart_Y=ADDRStartY[0];
	rADDREnd_Y=ADDREndY[0];
	rOffset_Y=OffsetY;
    
	if(src420) { //if .srcFormat420==1, .srcFormatInterleave should be 0.
		rADDRStart_Cb=ADDRStartCb[0];
		rADDREnd_Cb=ADDREndCb[0];
		rADDRStart_Cr=ADDRStartCr[0];
		rADDREnd_Cr=ADDREndCr[0];
		rOffset_Cb=OffsetC;
		rOffset_Cr=OffsetC;
	}

	rADDRStart_RGB=ADDRStartRGB[0];
	rADDREnd_RGB=ADDREndRGB[0];
	rOffset_RGB=OffsetRGB;

}

⌨️ 快捷键说明

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