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

📄 g2d.c

📁 samsung 最新芯片2450 的测试程序.
💻 C
📖 第 1 页 / 共 5 页
字号:
}

void G2D_IntDisSelectable(u32 uWhichInt)
{

	rG2D_INTEN&=~(uWhichInt);//Disable Interrupt
}

void G2D_WaitForInterrupt(void)
{
	while(!bG2dDone);
	bG2dDone=0;
}		

void __irq Isr_G2d(void)
//void Isr_G2d(void)
{
	bG2dDone=1;	
	rINTMSK2|=BIT_2D;
	

	rG2D_INTC_PEND= ((1<<31)|(1<<10));
	rG2D_INTC_PEND= (u32)(1<<31); // Victor gave us a guidance such this line to clear pending.

	ClearPending2(BIT_2D);
	rINTMSK2&=~BIT_2D;
	
}
void __irq Isr_G2dProfile(void)
//void Isr_G2dProfile(void)
{
#ifdef PROFILE
	volatile float uSpendTime; //msec
	PWM_ReadTime(&uSpendTime);
	//printf("%6f %10.6f\n", (float)(uSpendTime/1000000.), (float)(1/(uSpendTime/1000000.)));
	printf("%10.6f\n", uSpendTime);
#endif
	bG2dDone=1;
	rG2D_INTC_PEND= ((1<<31)|(1<<9));
	rG2D_INTC_PEND= (u32)(1<<31); // Victor gave us a guidance such this line to clear pending.
	printf("done\n");
//	INTC_ClearVectAddr();  // jcs
}

void Isr_G2dDe(void)
{
	bG2dDone=1;	
	rINTMSK2|=BIT_2D;
	
	rG2D_INTC_PEND= ((1<<31)|(7<<8)|(1<<0));
	rG2D_INTC_PEND= (u32)(1<<31); // Victor gave us a guidance such this line to clear pending.

	printf("Int\n");
	ClearPending2(BIT_2D);
	rINTMSK2|=BIT_2D;
}

void G2D_SetEndian(bool bEndian)
{
	rG2D_ENDIAN=(rG2D_ENDIAN & ~(1<<4))|(bEndian<<4);
}



void G2D_DrawImage(CSPACE eBpp)
{
	u32 i,j,k;
	if(eBpp==RGB16) {
		k=0;
		for(j=0; j<320; j++)
			for(i=0; i<240; i++)
// boaz.kim 070903
//				G2D_PutPixel(i, j, sun320240_16bpp[k++]);
				G2D_PutPixel(i, j, sun240320_16bpp[k++]);

	}
	else if(eBpp==RGB24) {
		k=0;
		for(j=0; j<320; j++)
			for(i=0; i<240; i++)
// boaz.kim 070903				
//				G2D_PutPixel(i, j, sun320240_24bpp[k++]);
				G2D_PutPixel(i, j, sun240320_24bpp[k++]);

	} else;


}

void G2D_RopOperation(bool bSrcData, bool bDstData, bool bThirdData, u8 ucRopVal, bool *bOut)
{
	if((bSrcData==0) && (bDstData==0) && (bThirdData ==0)) *bOut=(bool)((ucRopVal>>0)&0x1);
	else if((bSrcData==0 )&& (bDstData==0) && (bThirdData ==1)) *bOut=(bool)((ucRopVal>>1)&0x1);
	else if((bSrcData==0) && (bDstData==1) && (bThirdData ==0)) *bOut=(bool)((ucRopVal>>2)&0x1);
	else if((bSrcData==0) && (bDstData==1) && (bThirdData ==1)) *bOut=(bool)((ucRopVal>>3)&0x1);
	else if((bSrcData==1) && (bDstData==0) && (bThirdData ==0)) *bOut=(bool)((ucRopVal>>4)&0x1);
	else if((bSrcData==1) && (bDstData==0) && (bThirdData ==1)) *bOut=(bool)((ucRopVal>>5)&0x1);
	else if((bSrcData==1) && (bDstData==1) && (bThirdData ==0)) *bOut=(bool)((ucRopVal>>6)&0x1);
	else if((bSrcData==1) && (bDstData==1) && (bThirdData ==1)) *bOut=(bool)((ucRopVal>>7)&0x1);
	else	; 
//	Assert(0);
}

void G2D_RopOut(u32 uSrcData, u32 uDstData, u32 uThirdData, u8 ucRopVal, CSPACE eBpp, u32 *uRopOut)
{

	u32 i;
	u32 uDataMask;
	u32 uDataSize;
	bool bSrcData, bDstData, bThirdData, bOutData;
	
	if(eBpp==RGB16) {
		uDataMask=0xffff;	
		uDataSize=16;
	}
	else if(eBpp==RGB18) {
		uDataMask=0x3ffff;
		uDataSize=18;		
	}
	else if(eBpp==RGB24) {
		uDataMask=0xffffff;
		uDataSize=24;
	}
	else ;
//	Assert(0);

	*uRopOut = 0;
	for(i=0; i<uDataSize; i++) {
		bSrcData=(bool)(((uSrcData&uDataMask)>>i)&1);
		bDstData=(bool)(((uDstData&uDataMask)>>i)&1);
		bThirdData=(bool)(((uThirdData&uDataMask)>>i)&1);
		G2D_RopOperation(bSrcData, bDstData, bThirdData, ucRopVal, &bOutData);
		*uRopOut |= (bOutData << i);
	}
}

void G2D_ConvertEcolorToRaw(G2D_COLOR eColor, u32 *uRawColor) 
{
	*uRawColor=oG2d.m_uColorVal[eColor];
}

void G2D_GetFbData(u32 uX, u32 uY, u32 uG2dWidth, u32 uG2dFbAddr, CSPACE eBpp, u32 *uFbData)
{

	switch(eBpp)
	{
		case RGB16:
		case RGBA16:
		case ARGB16:
			*uFbData=(*(volatile unsigned short *)(uG2dFbAddr+(uY*uG2dWidth+uX)*2));		
			break;
		case ARGB24:
		case RGBA24:
		case RGB24:
		case RGBX24:
			*uFbData=(*(volatile unsigned *)(uG2dFbAddr+(uY*uG2dWidth+uX)*4));		
			break;
		default:
			*uFbData=(*(volatile unsigned *)(uG2dFbAddr+(uY*uG2dWidth+uX)*4));		
			break;
	}

}

void G2D_SetFbData(u32 uX, u32 uY, u32 uG2dWidth, u32 uG2dFbAddr, CSPACE eBpp, u32 uFbData)
	 
{

	switch(eBpp)
	{
		case RGB16:
		case RGBA16:
		case ARGB16:
			*(volatile unsigned short*)(uG2dFbAddr+(uY*uG2dWidth+uX)*2)= uFbData;
			break;
		case ARGB24:
		case RGBA24:
		case RGB24:
		case RGBX24:
			*(volatile unsigned *)(uG2dFbAddr+(uY*uG2dWidth+uX)*4)= uFbData;
			break;
		default:
			*(volatile unsigned *)(uG2dFbAddr+(uY*uG2dWidth+uX)*4)= uFbData;
			break;
	}

}


void G2D_GetPatternOffset(u8 *ucPatOffsetX, u8 *ucPatOffsetY)
{
	*ucPatOffsetX=rG2D_PATOFF_X;
	*ucPatOffsetY=rG2D_PATOFF_Y;
}

// It needs to be modified according to V2.0.
void G2D_ConvertPatternToRaw(u16 uThirdDataOrg, CSPACE eBpp, u32 *uThirdDataConverted)
{
	u32 uRed, uGreen, uBlue;
	switch(eBpp) {
		case RGB16:
			*uThirdDataConverted=uThirdDataOrg;
			break;
		case RGB18:
			uRed=(((uThirdDataOrg>>11)&0x1f)<<(12+1));
			uGreen=(((uThirdDataOrg>>5)&0x3f)<<6);
			uBlue=((uThirdDataOrg&0x1f)<<(0+1));
			*uThirdDataConverted=(uRed|uGreen|uBlue);
			if(*uThirdDataConverted&0x02000) *uThirdDataConverted|=0x01000;
			if(*uThirdDataConverted&0x00040) *uThirdDataConverted=*uThirdDataConverted;
			if(*uThirdDataConverted&0x00002) *uThirdDataConverted|=0x1;			
			break;
		case RGB24:
			uRed=(((uThirdDataOrg>>11)&0x1f)<<(16+3));
			uGreen=(((uThirdDataOrg>>5)&0x3f)<<(8+2));
			uBlue=((uThirdDataOrg&0x1f)<<(0+3));
			*uThirdDataConverted=(uRed|uGreen|uBlue);
			if(*uThirdDataConverted&0x00080000) *uThirdDataConverted|=0x00070000;
			if(*uThirdDataConverted&0x00000400) *uThirdDataConverted|=0x00000300;
			if(*uThirdDataConverted&0x00000008) *uThirdDataConverted|=0x00000007;			
			break;
		default:
			*uThirdDataConverted=uThirdDataOrg;
			break;

	}

}

#if 0
void G2D_BlendingOut(u32 uSrcData, u32 uDstData, u8 ucAlphaVal, bool bFading, u8 ucFadingOffset, u32 *uBlendingOut)
{

	u32 uSrcRed, uSrcGreen, uSrcBlue;
	u32 uDstRed, uDstGreen, uDstBlue;
	u32 uBldRed, uBldGreen, uBldBlue;	
	
	uSrcRed= (uSrcData & 0x00ff0000)>>16;  // Mask R
	uSrcGreen = (uSrcData & 0x0000ff00)>>8;	 // Mask G
	uSrcBlue = uSrcData & 0x000000ff;		 // Mask B

	uDstRed = (uDstData & 0x00ff0000)>>16; // Mask R
	uDstGreen = (uDstData & 0x0000ff00)>>8;  // Mask G
	uDstBlue = uDstData & 0x000000ff;		 // Mask B

	if(bFading) {
		uBldRed= ((uSrcRed*(ucAlphaVal+1))>>8) + ucFadingOffset; // R output
		uBldGreen= ((uSrcGreen*(ucAlphaVal+1))>>8) + ucFadingOffset; // G output
		uBldBlue= ((uSrcBlue*(ucAlphaVal+1)>>8)) + ucFadingOffset; // B output
		if(uBldRed>=256) uBldRed=255;
		if(uBldGreen>=256) uBldGreen=255;
		if(uBldBlue>=256) uBldBlue=255;
	}
	else {
		uBldRed= ((uSrcRed*(ucAlphaVal+1)) + (uDstRed*(256-ucAlphaVal)))>>8; // R output
		uBldGreen= ((uSrcGreen*(ucAlphaVal+1)) + (uDstGreen*(256-ucAlphaVal)))>>8; // G output
		uBldBlue= ((uSrcBlue*(ucAlphaVal+1)) + (uDstBlue*(256-ucAlphaVal)))>>8; // B output
	}

	*uBlendingOut = (uBldRed<<16) | (uBldGreen<<8) | uBldBlue;
}
#else
void G2D_BlendingOut(u32 uSrcData, u32 uDstData, u8 ucAlphaVal, bool bFading, u8 ucFadingOffset, u32 *uBlendingOut)
{

	u32 uSrcRed, uSrcGreen, uSrcBlue;
	u32 uDstRed, uDstGreen, uDstBlue;
	u32 uBldRed, uBldGreen, uBldBlue;	

	
/*
	uSrcRed= uSrcData & 0x0000f800;  // Mask R
	uSrcGreen = uSrcData & 0x000007e0;	 // Mask G
	uSrcBlue = uSrcData & 0x0000001f;	 // Mask B

	uDstRed = uSrcData & 0x0000f800; // Mask R
	uDstGreen = uSrcData & 0x000007e0; // Mask G
	uDstBlue = uSrcData & 0x0000001f;	 // Mask B
*/
	
	uSrcRed= (uSrcData & 0x00ff0000)>>16;  // Mask R
	uSrcGreen = (uSrcData & 0x0000ff00)>>8;	 // Mask G
	uSrcBlue = uSrcData & 0x000000ff;		 // Mask B

	uDstRed = (uDstData & 0x00ff0000)>>16; // Mask R
	uDstGreen = (uDstData & 0x0000ff00)>>8;  // Mask G
	uDstBlue = uDstData & 0x000000ff;		 // Mask B

	if(bFading) {
/*		uBldRed= ((uSrcRed*(ucAlphaVal+1))>>5) + ucFadingOffset; // R output
		uBldGreen= ((uSrcGreen*(ucAlphaVal+1))>>6) + ucFadingOffset; // G output
		uBldBlue= ((uSrcBlue*(ucAlphaVal+1)>>5)) + ucFadingOffset; // B output
*/		
		uBldRed= ((uSrcRed*(ucAlphaVal+1))>>8) + ucFadingOffset; // R output
		uBldGreen= ((uSrcGreen*(ucAlphaVal+1))>>8) + ucFadingOffset; // G output
		uBldBlue= ((uSrcBlue*(ucAlphaVal+1)>>8)) + ucFadingOffset; // B output
		
		if(uBldRed>=256) uBldRed=255;
		if(uBldGreen>=256) uBldGreen=255;
		if(uBldBlue>=256) uBldBlue=255;
	}
	else {
		uBldRed= ((uSrcRed*(ucAlphaVal+1)) + (uDstRed*(255-ucAlphaVal)))>>8; // R output
		uBldGreen= ((uSrcGreen*(ucAlphaVal+1)) + (uDstGreen*(255-ucAlphaVal)))>>8; // G output
		uBldBlue= ((uSrcBlue*(ucAlphaVal+1)) + (uDstBlue*(255-ucAlphaVal)))>>8; // B output

	}


//	*uBlendingOut = uBldRed<<8 | uBldGreen<<5 | uBldBlue<<3;
				
	*uBlendingOut = (uBldRed<<16) | (uBldGreen<<8) | uBldBlue;
	
}

#endif


void G2d_Convert24bpp(u32 uSrcData, CSPACE eBpp, u8 bSwap, u32 *uConvertedData)
{

	u32 uRed, uGreen, uBlue;

#if 0
	switch(eBpp) {
		case RGB16 : // 16 bit color mode
			if(bSwap == 1) {
				uRed = uSrcData & 0x0000f800;
				uGreen = uSrcData & 0x000007e0;
				uBlue = uSrcData & 0x0000001f;

				*uConvertedData = uRed<<8 | uGreen<<5 | uBlue<<3;
			}
			else {
				uRed = uSrcData & 0xf8000000;
				uGreen = uSrcData & 0x07e00000;
				uBlue = uSrcData & 0x001f0000;

				*uConvertedData = uRed>>8 | uGreen>>11 | uBlue>>13;
			}
			break;	
		case  RGBA16: // 15 bit color mode
			uRed = uSrcData & 0x0000f800;  // R
			uGreen = uSrcData & 0x000007c0;  // G
			uBlue = uSrcData & 0x0000003e;  // B
			*uConvertedData = uRed<<8 | uGreen<<5 | uBlue<<2; // SUM
			break;
		case  ARGB16: // 15 bit color mode
			uRed = uSrcData & 0x00007c00;  // R
			uGreen = uSrcData & 0x000003e0;  // G
			uBlue = uSrcData & 0x0000001f;  // B
			*uConvertedData = uRed<<9 | uGreen<<6 | uBlue<<3; // SUM
			break;
		case RGBA24 :
		case ARGB24 :
		case RGB24  :
		case RGBX24 :
			*uConvertedData = uSrcData;
			break;
		default:
			*uConvertedData = uSrcData;
			break;				
	}
#elif 1
	switch(eBpp) {
		case RGB16 : // 16 bit color mode
			uRed = (uSrcData & 0x0000f800)>>8;
			uGreen = (uSrcData & 0x000007e0)>>3;
			uBlue = (uSrcData & 0x0000001f)<<3;
			uRed = uRed|((uRed&0xe0)>>5);
			uGreen = uGreen|((uGreen&0xc0)>>6);
			uBlue = uBlue|((uBlue&0xe0)>>5);
			*uConvertedData = uRed<<16 | uGreen<<8 | uBlue;
			break;	
		case  RGBA16: // 15 bit color mode
			uRed = uSrcData & 0x0000f800;  // R
			uGreen = uSrcData & 0x000007c0;  // G
			uBlue = uSrcData & 0x0000003e;  // B
			*uConvertedData = uRed<<8 | uGreen<<5 | uBlue<<2; // SUM
			break;
		case  ARGB16: // 15 bit color mode
			uRed = uSrcData & 0x00007c00;  // R
			uGreen = uSrcData & 0x000003e0;  // G
			uBlue = uSrcData & 0x0000001f;  // B
			*uConvertedData = uRed<<9 | uGreen<<6 | uBlue<<3; // SUM
			break;
		case RGBA24 :
		case ARGB24 :
		case RGB24  :
		case RGBX24 :
			*uConvertedData = uSrcData;
			break;
		default:
			*uConvertedData = uSrcData;
			break;				
	}
#else
switch(eBpp) {
	case RGB16 : // 16 bit color mode
		uRed = (uSrcData >> 11) & 0x1f;
		uGreen = (uSrcData >>5 ) & 0x3f;
		uBlue = uSrcData & 0x1f;
		uRed =  (uRed&0x1) ? ((uRed<<3)|0x7) : (uRed<<3);
		uGreen =  (uGreen&0x1) ? ((uGreen<<2)|0x3) : (uGreen<<2);
		uBlue =  (uBlue&0x1) ? ((uBlue<<3)|0x7) : (uBlue<<3);
		*uConvertedData = uRed<<16 | uGreen<<8 | uBlue;
		break;	
	case  RGBA16: // 15 bit color mode
		uRed = uSrcData & 0x0000f800;  // R
		uGreen = uSrcData & 0x000007c0;  // G
		uBlue = uSrcData & 0x0000003e;	// B
		*uConvertedData = uRed<<8 | uGreen<<5 | uBlue<<2; // SUM
		break;
	case  ARGB16: // 15 bit color mode
		uRed = uSrcData & 0x00007c00;  // R
		uGreen = uSrcData & 0x000003e0;  // G
		uBlue = uSrcData & 0x0000001f;	// B
		*uConvertedData = uRed<<9 | uGreen<<6 | uBlue<<3; // SUM
		break;
	case RGBA24 :
	case ARGB24 :
	case RGB24	:
	case RGBX24 :
		*uConvertedData = uSrcData;
		break;
	default:
		*uConvertedData = uSrcData;
		break;				
}


#endif	 
} 

void G2d_Convert16bpp(u32 uSrcData, CSPACE eBpp, u8 bSwap, u32 *uConvertedData)
{

	u32 uRed, uGreen, uBlue;

	switch(eBpp) {
		case RGB16 : // 16 bit color mode
			uRed = (uSrcData & 0xff0000)>>16;
			uGreen = (uSrcData & 0xff00)>>8;
			uBlue = (uSrcData & 0xff);
			uRed = uRed >>3;
			uGreen = uGreen>>2;
			uBlue= uBlue>>3;
			*uConvertedData = uRed<<11 | uGreen<<5 | uBlue;
			break;	
		case  RGBA16: // 15 bit color mode
			uRed = uSrcData & 0x0000f800;  // R
			uGreen = uSrcData & 0x000007c0;  // G
			uBlue = uSrcData & 0x0000003e;  // B
			*uConvertedData = uRed<<8 | uGreen<<5 | uBlue<<2; // SUM
			break;
		case  ARGB16: // 15 bit color mode
			uRed = uSrcData & 0x00007c00;  // R
			uGreen = uSrcData & 0x000003e0;  // G
			uBlue = uSrcData & 0x0000001f;  // B
			*uConvertedData = uRed<<9 | uGreen<<6 | uBlue<<3; // SUM
			break;
		case RGBA24 :
		case ARGB24 :
		case RGB24  :
		case RGBX24 :
			*uConvertedData = uSrcData;
			break;
		default:
			*uConvertedData = uSrcData;
			break;				
	}
} 

void G2D_GetRotateCoordinate(u32 uDstX, u32 uDstY, u32 uOrgX, u32 uOrgY, u32 uRType, u32 *uRsltX, u32 *uRsltY) 
{

	switch(uRType) {
		case  1 : // No Rotate. bypass.
			*uRsltX = uDstX;
			*uRsltY = uDstY;
			break;
		case  2 : // 90 degree Rotation
			*uRsltX = uOrgX + uOrgY - uDstY;
			*uRsltY = uDstX - uOrgX + uOrgY;			
			break;
		case  4 : // 180 degree Rotation
			*uRsltX = 2*uOrgX - uDstX;
			*uRsltY = 2*uOrgY - uDstY;
			break;
		case  8 : // 270 degree Rotation
			*uRsltX = uDstY + uOrgX - uOrgY;
			*uRsltY = uOrgX + uOrgY - uDstX;
			break;
		case 16 : // X-flip
			*uRsltX = uDstX;
			*uRsltY = 2*uOrgY - uDstY;
			break;
		case 32 : // Y-flip
			*uRsltX = 2*uOrgX - uDstX;
			*uRsltY = uDstY;		
			break;

⌨️ 快捷键说明

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