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

📄 post.c

📁 三星s3c2460开发板完整功能测试代码
💻 C
📖 第 1 页 / 共 4 页
字号:
 /*****************************************
  NAME: Post.c
  DESC: Post Processor test codes
  HISTORY:  2004.01.31:draft ver 0.0
 *****************************************/
 
#include <string.h>
#include "2460addr.h"
#include "2460lib.h"
#include "def.h"
#include "post.h"
#include "lcdlib.h"
#include "imagedef.h"
#include "flash.h"



extern unsigned int downloadAddress; 
volatile unsigned int postProcessingDone;
unsigned int ADDRStartY[4], ADDREndY[4];
unsigned int ADDRStartCb[4], ADDREndCb[4];
unsigned int ADDRStartCr[4], ADDREndCr[4];
unsigned int ADDRStartRGB[4], ADDREndRGB[4];

void Test_Post_Allfunc(void);

void Test_SoftwareConver_420(void);

void * post_function[][2]=
{
	(void *)PostDownloadImage,							"Image Downloading   ",
//	(void *)Test_Post_QCIF_YCbCr420_PQVGA_16B,			"QCIF YCbCr420 to PQVGA 16bpp ",
//	(void *)Test_Post_QCIF_YCbCr420_PQVGA_24B,			"QCIF YCbCr420 to PQVGA 24bpp ",
//	(void *)Test_Post_QCIF_YCbCr420_PQVGA_16B_Offset,	"QCIF YCbCr420 to PQVGA 16bpp with offset ",
//	(void *)Test_Post_PQVGA_YCbCr420_PQVGA_16B,		"PQVGA YCbCr420 to PQVGA 16bpp ",
//	(void *)Test_Post_PQVGA_YCbCr420_PQVGA_24B,		"PQVGA YCbCr420 to PQVGA 24bpp ",
//	(void *)Test_Post_CIF_YCbCr420_PQVGA_16B,			"CIF YCbCr420 to PQVGA 16bpp ",
//	(void *)Test_Post_CIF_YCbCr420_PQVGA_24B,			"CIF YCbCr420 to PQVGA 24bpp ",
//	(void *)Test_Post_CIF_YCbCr420_PQVGA_16B_Offset,	"CIF YCbCr420 to PQVGA 16bpp with offset   ",
//	(void *)Test_Post_YCbCr420_PQVGA_Padded,			"Post Test with Padded Image    ",
//	(void *)Test_Post_YCbCr420_PQVGA_Offset,			"Post Test with Input/Out Offset ",
//	(void *)Test_Post_RGB_RGB_PQVGA,					"Post Test RGB to RGB              ",
	(void *)Test_Post_Allfunc,							"Test for Serial LCD	",

	0,0
};

void PostDisplayFunction(void)
{
	int i;
	
	i=0;	
	printf("\n\n");
	while(1)	{   //display menu
	    printf("%2d:%s",i,post_function[i][1]);
	    i++;
	    if((int)(post_function[i][0])==0) {
			printf("\n");
			break;
	    }
	    if((i%2)==0) printf("\n");
	}
}

void Ch27_POST(void)
{
	int i;

	printf("\n----Test of Post Processor----\n");

	//LCD Initializtion

	printf("If you want to test Post Processor, then you must download image to memory before testing\n");
	
	while(1) {
		PostDisplayFunction();
		printf("\nSelect(-1 to exit): ");
		i = GetIntNum();
		if(i==-1) break;
		
		if(i>=0 && (i<(sizeof(post_function)/8)) ) 
	    	( (void (*)(void)) (post_function[i][0]) )();	// execute selected function.
	}

}


void PostSetFimv16B(unsigned int SrcWidth, unsigned int SrcHeight, unsigned int DstWidth, unsigned int DstHeight, unsigned int InFrameBuffer, unsigned int 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(unsigned int SrcWidth, unsigned int SrcHeight, unsigned int DstWidth, unsigned int DstHeight, unsigned int InFrameBuffer, unsigned int 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)
{
	//printf("You can download image to memory\n");
	DownloadBinary();	
}



void __irq PostIsr(void)
{
	rINTSUBMSK2 |= BIT_SUB_POST;
	   
	rMODE &= ~(1<<6);//Clear Source in POST Processor
	rSUBSRCPND2 = BIT_SUB_POST; //Clear SUB Interrupt Source Pending.
	ClearPending(BIT_CAMIF_BLOCK_POST);//Clear Source Pending, Interrupt Pending	   
	
	postProcessingDone=1;
	rINTSUBMSK2 &= ~(BIT_SUB_POST);
}


void PostStartProcessing(unsigned int 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 CalculatePrescalerRShift(unsigned int SrcSize, unsigned int DstSize, unsigned int *ratio,unsigned int *shift)
{
	if(SrcSize>=64*DstSize) {
		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;
	}    	
}


void PostInit(unsigned int OrgSrcWidth, unsigned int OrgSrcHeight, unsigned int SrcWidth, unsigned int SrcHeight, unsigned int SrcStartX, unsigned int SrcStartY,
			unsigned int OrgDstWidth, unsigned int OrgDstHeight, unsigned int DstWidth, unsigned int DstHeight, unsigned int DstStartX, unsigned int DstStartY, 
			unsigned int InFrameBuffer,unsigned int OutFrameBuffer, unsigned int mode)
{
	unsigned int src420, inrgb, interleave, inrgbformat, inycformat;
	unsigned int outrgb;	
	unsigned int H_Shift, V_Shift, PreHorRatio, PreVerRatio;
	unsigned int inmultiplier, outmultiplier;
	unsigned int 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:
			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 
		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);

	CalculatePrescalerRShift(SrcWidth, DstWidth, &PreHorRatio, &H_Shift);
	CalculatePrescalerRShift(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;

}

/*
void Test_Post_QCIF_YCbCr420_176220_16B(void)
{

	unsigned int OrgSrcWidth, OrgSrcHeight, SrcWidth, SrcHeight, SrcStartX, SrcStartY;
	unsigned int OrgDstWidth, OrgDstHeight, DstWidth, DstHeight, DstStartX, DstStartY;
	unsigned int InFrameBuffer, OutFrameBuffer;
	unsigned int mode;

	OrgSrcWidth=SrcWidth=QCIF_XSIZE; //no source offset
	OrgSrcHeight=SrcHeight=QCIF_YSIZE; //no source offset
	SrcStartX=SrcStartY=0;
	OrgDstWidth=DstWidth=176; //no destination offset
	OrgDstHeight=DstHeight=220; //no destination offset
	DstStartX=DstStartY=0;
	InFrameBuffer=downloadAddress;
	OutFrameBuffer=LCDFRAMEBUFFERBG1;
	mode=POST_IN_YCBYCR420|POST_OUT_RGB16B;
	
	//LCD Initialization 
	LcdBGInit(MODE_SER_16BIT565_176220|MODE_NO_VIRTUAL_16B);	


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

	pISR_CAMIF_BLOCK_POST=(unsigned)PostIsr;
	rINTMSK &= ~(BIT_CAMIF_BLOCK_POST);
	rINTSUBMSK2 &= ~(BIT_SUB_POST);


	PostStartProcessing(0);


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

	rINTSUBMSK2 |= BIT_SUB_POST;
	rINTMSK |= BIT_CAMIF_BLOCK_POST;
	
}

void Test_Post_QCIF_YCbCr420_176220_24B(void)
{

	unsigned int OrgSrcWidth, OrgSrcHeight, SrcWidth, SrcHeight, SrcStartX, SrcStartY;
	unsigned int OrgDstWidth, OrgDstHeight, DstWidth, DstHeight, DstStartX, DstStartY;
	unsigned int InFrameBuffer, OutFrameBuffer;
	unsigned int mode;

	OrgSrcWidth=SrcWidth=QCIF_XSIZE; //no source offset
	OrgSrcHeight=SrcHeight=QCIF_YSIZE; //no source offset
	SrcStartX=SrcStartY=0;
	OrgDstWidth=DstWidth=176; //no destination offset
	OrgDstHeight=DstHeight=220; //no destination offset
	DstStartX=DstStartY=0;
	InFrameBuffer=downloadAddress;
	OutFrameBuffer=LCDFRAMEBUFFERBG1;
	mode=POST_IN_YCBYCR420|POST_OUT_RGB24B;
	
	//LCD Initialization 
	LcdBGInit(MODE_SER_24BIT_176220|MODE_NO_VIRTUAL_24B);	


	PostInit(OrgSrcWidth, OrgSrcHeight, SrcWidth, SrcHeight, SrcStartX, SrcStartY, 
			OrgDstWidth, OrgDstHeight, DstWidth, DstHeight, DstStartX, DstStartY, 

⌨️ 快捷键说明

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