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

📄 g2d.c

📁 samsung 最新芯片2450 的测试程序.
💻 C
📖 第 1 页 / 共 5 页
字号:
/**************************************************************************************
* 
*	Project Name : S3C6400 Validation
*
*	Copyright 2006 by Samsung Electronics, Inc.
*	All rights reserved.
*
*	Project Description :
*		This software is only for validating functions of the S3C6400.
*		Anybody can use this software without our permission.
*  
*--------------------------------------------------------------------------------------
* 
*	File Name : g2d.c
*  
*	File Description : This file includes the API functions for 2D.
*
*	Author : Sekwang Kim
*	Dept. : AP Development Team
*	Created Date : 2007/01/25
*	Version : 0.1a 
* 
*	History
*	- Created by Jang JiHyun, Lee YunSoo
* 	- Modified by Sekwang Kim(2007/01/25)
*  
**************************************************************************************/


#include "system.h"
//#include "vicint.h"
//#include "lcd.h"  //jcs
#include "display.h" //jcs
#include "glib.h"
#include "glib_font.h"
#include "g2d.h"


// Header file for text drawing
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
//#include <timer.h>

// boaz.kim 070903
//#include "sun320240_16bpp.h"
//#include "sun320240_24bpp.h"
#include "sun240320_16bpp.h"
#include "sun240320_24bpp.h"


//////////////////////////////////////
// Put this into system library or erase every 'Assert'. This is not necessary function.

//#define Assert(b) (!(b) ? printf("\n %s(line %d)\n", __FILE__, __LINE__), Stop() : 0)
	 	
//////////////////////////////////////


/*
#define G2D_BASE_TEMP			0x73000000 //temporarily used for the IP verfication of 2D v2.0

#define	rG2D_CONTROL             	(G2D_BASE_TEMP+0x00)
#define	rG2D_INTEN                   (G2D_BASE_TEMP+0x04)
#define	rG2D_FIFO_INTC      (G2D_BASE_TEMP+0x08)
#define	rG2D_INTC_PEND		(G2D_BASE_TEMP+0x0c)
#define	rG2D_FIFO_STAT           (G2D_BASE_TEMP+0x10)

//#define	rG2D_FB_BA                   (G2D_BASE_TEMP+0x20)		//Spec out in V2.0

#define	rG2D_CMDR0                  (G2D_BASE_TEMP+0x100)
#define	rG2D_CMDR1                   (G2D_BASE_TEMP+0x104)
#define	rG2D_CMDR2                   (G2D_BASE_TEMP+0x108)
#define	rG2D_CMDR3                   (G2D_BASE_TEMP+0x10c)
#define	rG2D_CMDR4                   (G2D_BASE_TEMP+0x110)
#define	rG2D_CMDR5                   (G2D_BASE_TEMP+0x114)
#define	rG2D_CMDR6                   (G2D_BASE_TEMP+0x118)	//Reserved
#define	rG2D_CMDR7                   (G2D_BASE_TEMP+0x11c)

//#define	rG2D_COLOR_MODE          (G2D_BASE_TEMP+0x200) //changed in v2.0

//#define	rG2D_HORI_RES               (G2D_BASE_TEMP+0x204)

//newly in v2.0
#define	rG2D_SRC_RES				(G2D_BASE_TEMP+0x200)
#define	rG2D_SRC_HORI_RES			(G2D_BASE_TEMP+0x204)
#define	rG2D_SRC_VERT_RES			(G2D_BASE_TEMP+0x208)

#define	rG2D_SC_RES					(G2D_BASE_TEMP+0x210)		//SC_RES_REG
#define	rG2D_SC_HORI_RES			(G2D_BASE_TEMP+0x214)		//SC_HORI_RES _REG
#define	rG2D_SC_VERT_RES			(G2D_BASE_TEMP+0x218) 	//SC_VERT_RES _REG

//----------
#define	rG2D_CW_LT					(G2D_BASE_TEMP+0x220)
#define	rG2D_CW_LT_X	    	   	(G2D_BASE_TEMP+0x224)
#define	rG2D_CW_LT_Y   		    	(G2D_BASE_TEMP+0x228)
#define	rG2D_CW_RB   		    	(G2D_BASE_TEMP+0x230)
#define	rG2D_CW_RB_X   				(G2D_BASE_TEMP+0x234)
#define	rG2D_CW_RB_Y   				(G2D_BASE_TEMP+0x238)

#define	rG2D_COORD0              	(G2D_BASE_TEMP+0x300)
#define	rG2D_COORD0_X               (G2D_BASE_TEMP+0x304)
#define	rG2D_COORD0_Y               (G2D_BASE_TEMP+0x308)
#define	rG2D_COORD1              	(G2D_BASE_TEMP+0x310)
#define	rG2D_COORD1_X               (G2D_BASE_TEMP+0x314)
#define	rG2D_COORD1_Y               (G2D_BASE_TEMP+0x318)
#define	rG2D_COORD2              	(G2D_BASE_TEMP+0x320)
#define	rG2D_COORD2_X               (G2D_BASE_TEMP+0x324)
#define	rG2D_COORD2_Y               (G2D_BASE_TEMP+0x328)
#define	rG2D_COORD3              	(G2D_BASE_TEMP+0x330)
#define	rG2D_COORD3_X               (G2D_BASE_TEMP+0x334)
#define	rG2D_COORD3_Y               (G2D_BASE_TEMP+0x338)

#define	rG2D_ROT_OC              	(G2D_BASE_TEMP+0x340)
#define	rG2D_ROT_OC_X                (G2D_BASE_TEMP+0x344)
#define	rG2D_ROT_OC_Y                (G2D_BASE_TEMP+0x348)
#define	rG2D_ROTATE             	  (G2D_BASE_TEMP+0x34c)

#define	rG2D_ENDIAN    			 	(G2D_BASE_TEMP+0x350)

#define	rG2D_X_INCR                  (G2D_BASE_TEMP+0x400)
#define	rG2D_Y_INCR                  (G2D_BASE_TEMP+0x404)

#define	rG2D_ROP                 	(G2D_BASE_TEMP+0x410)
#define	rG2D_ALPHA                   (*(volatile unsigned *) (G2D_BASE_TEMP+0x420)) 
 

#define	rG2D_FG_COLOR                (G2D_BASE_TEMP+0x500)
#define	rG2D_BG_COLOR                (G2D_BASE_TEMP+0x504)
#define	rG2D_BS_COLOR                (G2D_BASE_TEMP+0x508)

//newly in v2.0
#define	rG2D_SRC_COLOR_MODE                (G2D_BASE_TEMP+0x510)
#define	rG2D_DEST_COLOR_MODE                (G2D_BASE_TEMP+0x514)

#define	rG2D_PATTERN_ADDR            (G2D_BASE_TEMP+0x600)
#define	rG2D_PATOFF		          	(G2D_BASE_TEMP+0x700)
#define	rG2D_PATOFF_X               (G2D_BASE_TEMP+0x704)
#define	rG2D_PATOFF_Y               (G2D_BASE_TEMP+0x708)                                      																																								
#define	rG2D_COLORKEY_CNTL           (G2D_BASE_TEMP+0x720)	//STENCIL_CNTL_REG	
#define	rG2D_COLORKEY_DR_MIN         (G2D_BASE_TEMP+0x724)	//STENCIL_DR_MIN_REG
#define	rG2D_COLORKEY_DR_MAX         (G2D_BASE_TEMP+0x728)	//STENCIL_DR_MAX_REG

//Newly added
#define	rG2D_SRC_BASE_ADDR         (G2D_BASE_TEMP+0x730)
#define	rG2D_DEST_BASE_ADDR       (G2D_BASE_TEMP+0x734) //mostly frame buffer address
*/

volatile bool bG2dDone;
volatile unsigned uIntCnt;

G2D oG2d;



void G2D_DrawPattern(void)
{
	G2D_DrawPattern1(0, 0, oG2d.m_uMaxDx+1, oG2d.m_uMaxDy+1);
}

void G2D_InitIp(u32 uFbStAddr, CSPACE eBpp)
{
	G2D_InitIp2(uFbStAddr, eBpp, 240, 320, 0, 0, 240, 320);
}

void G2D_InitIp1(u32 uFbStAddr, CSPACE eBpp, u32 uCwMaxHSz, u32 uCwMaxVSz)
{
	G2D_InitIp2(uFbStAddr, eBpp, uCwMaxHSz, uCwMaxVSz, 0, 0, 240, 320);
}

void G2D_InitIp2(u32 uFbStAddr, CSPACE eBpp, u32 uCwMaxHSz, u32 uCwMaxVSz,
                                                  u32 uX1_Cw, u32 uY1_Cw, u32 uX2_Cw, u32 uY2_Cw)
{
//	Assert(uCwMaxHSz <= 2048); // Max horizontal size of clipping window should be 2048.
//	Assert(uCwMaxVSz <= 2048); // Max vertical size of clipping window should be 2048.

	G2D_Reset(); // SW reset

	// Initialize color
	if (eBpp == RGB16)
	{
		oG2d.m_uColorVal[G2D_BLACK] = 0x0;
		oG2d.m_uColorVal[G2D_RED]   = 0x1f<<11;
		oG2d.m_uColorVal[G2D_GREEN] = 0x3f<<5;
		oG2d.m_uColorVal[G2D_BLUE]  = 0x1f<<0;
		oG2d.m_uColorVal[G2D_WHITE] = 0xffff;
	}
	else if (eBpp == RGB24)
	{
		oG2d.m_uColorVal[G2D_BLACK] = 0x0;
		oG2d.m_uColorVal[G2D_RED]   = 0xff0000;
		oG2d.m_uColorVal[G2D_GREEN] = 0xff00;
		oG2d.m_uColorVal[G2D_BLUE]  = 0xff;
		oG2d.m_uColorVal[G2D_WHITE] = 0xffffff;
	}
	else	;
	//	Assert(0);


	oG2d.m_uFbStAddr = uFbStAddr;

	oG2d.m_uColorVal[G2D_YELLOW] = (oG2d.m_uColorVal[G2D_RED] | oG2d.m_uColorVal[G2D_GREEN]);
	oG2d.m_uColorVal[G2D_CYAN] = (oG2d.m_uColorVal[G2D_GREEN] | oG2d.m_uColorVal[G2D_BLUE]);
	oG2d.m_uColorVal[G2D_MAGENTA] = (oG2d.m_uColorVal[G2D_RED] | oG2d.m_uColorVal[G2D_BLUE]);

	oG2d.m_uHoriRes = uCwMaxHSz;

	//oG2d.m_uMaxDx = uCwMaxHSz - 1;
	//oG2d.m_uMaxDy = uCwMaxVSz - 1;

	oG2d.m_uMaxDx = uCwMaxHSz; //in v2.0
	oG2d.m_uMaxDy = uCwMaxVSz;
	

	oG2d.m_uCwX1 = uX1_Cw;
	oG2d.m_uCwY1 = uY1_Cw;

	oG2d.m_uCwX2 = uX2_Cw;
	oG2d.m_uCwY2 = uY2_Cw;

	oG2d.m_uBytes = (eBpp == RGB16) ? 2 : 4;

	oG2d.m_upFontType = (u8 *)font8x15;
	oG2d.m_uFontWidth = 8;
	oG2d.m_uFontHeight = 15;

	oG2d.m_eBpp = eBpp;

	oG2d.m_bIsBitBlt = false;

	G2D_DisableEffect(); // Disable per-pixel/per-plane alpha blending and fading
	G2D_SetColorKeyOff();
	G2D_InitRegs(eBpp);
}

void G2D_InitRegs(CSPACE eBpp)
{
	u32 uBppMode;

	G2D_CheckFifo(17);

	uBppMode = 	(eBpp == RGB16) ? G2D_COLOR_RGB_565:
				(eBpp == RGBA16) ? G2D_COLOR_RGBA_5551 :
				(eBpp == ARGB16) ? G2D_COLOR_ARGB_1555 :
				(eBpp == RGBA24) ? G2D_COLOR_RGBA_8888 :
				(eBpp == ARGB24) ? G2D_COLOR_ARGB_8888 :
				(eBpp == RGB24) ? G2D_COLOR_XRGB_8888 :
				(eBpp == RGBX24) ? G2D_COLOR_RGBX_8888 : G2D_COLOR_XRGB_8888;


    rG2D_SRC_COLOR_MODE= uBppMode;		//put same in src and dest this time
	rG2D_DEST_COLOR_MODE= uBppMode;
	
	rG2D_DEST_BASE_ADDR= oG2d.m_uFbStAddr; //v2.0	
	rG2D_SRC_BASE_ADDR= oG2d.m_uFbStAddr; //v2.0	

	rG2D_SRC_HORI_RES= oG2d.m_uHoriRes;	//new in v2.0
	rG2D_SRC_VERT_RES= oG2d.m_uVertRes;	//new in v2.0

	rG2D_SC_HORI_RES= oG2d.m_uMaxDx;
	rG2D_SC_VERT_RES= oG2d.m_uMaxDy;
	
	rG2D_CW_LT_X= oG2d.m_uCwX1;
	rG2D_CW_LT_Y= oG2d.m_uCwY1;
	rG2D_CW_RB_X= oG2d.m_uCwX2;
	rG2D_CW_RB_Y= oG2d.m_uCwY2;
	
	
	

	rG2D_ALPHA=(FADING_OFFSET_DISABLE | ALPHA_VALUE_DISABLE);

	rG2D_FG_COLOR= oG2d.m_uColorVal[G2D_WHITE]; // set color to both font and foreground color
	rG2D_BG_COLOR= oG2d.m_uColorVal[G2D_BLACK];
	rG2D_BS_COLOR= oG2d.m_uColorVal[G2D_BLUE]; // Set blue color to blue screen color

	rG2D_ROP= (G2D_OPERAND3_FG_BIT | G2D_NO_ALPHA_BIT | OPAQUE_ENABLE | G2D_ROP_SRC_ONLY);

	rG2D_ROT_OC_X= 0;
	rG2D_ROT_OC_Y= 0;
	rG2D_ROTATE= G2D_ROTATION_0_DEG_BIT;
	rG2D_ALPHA= 0;
}

void G2D_Reset(void)
{
    rG2D_CONTROL= 1;  //assert G2D reset
    rG2D_CONTROL= 0;  //deassert G2D reset
}

void G2D_WaitForIdleStatus(void)
{
	while(!(rG2D_FIFO_STAT & G2D_DE_STATUS_FA_BIT));
}

void G2D_CheckFifo(u32 uEmptyFifo)
{
	while( ((rG2D_FIFO_STAT&0x7e)>>1) > (FIFO_NUM - uEmptyFifo) );
}

// Set Ternary raster operation
// Support 256 raster operation
// Refer to ternary raster operation table if you know 256 ROP

// Set Alpha Value
void G2D_SetAlphaValue(u8 ucAlphaVal)
{
	ucAlphaVal &= 0xff;
//	Outp32(rG2D_ALPHA, (Inp32_0(rG2D_ALPHA)&=~0xff) | ucAlphaVal);
	rG2D_ALPHA=(rG2D_ALPHA&~(0xff))|ucAlphaVal;
	
}

// Set alpha blending mode
void G2D_SetAlphaMode(G2D_ALPHA_BLENDING_MODE eMode)
{
	u32 uAlphaBlend;

	uAlphaBlend =
		(eMode == G2D_NO_ALPHA_MODE) ? G2D_NO_ALPHA_BIT :
		(eMode == G2D_PP_ALPHA_SOURCE_MODE) ? G2D_PP_ALPHA_SOURCE_BIT :
		(eMode == G2D_ALPHA_MODE) ? G2D_ALPHA_BIT : 
		(eMode == G2D_FADING_MODE) ? G2D_FADING_BIT : G2D_NO_ALPHA_BIT;

//	Outp32(rG2D_ROP, (Inp32_0(rG2D_ROP) &= ~(0x7<<10)) | uAlphaBlend);
	rG2D_ROP=(rG2D_ROP&~(0x7<<10))|uAlphaBlend;
}

// Set fade value
void G2D_SetFadingValue(u8 ucFadeVal)
{
	ucFadeVal &= 0xff;
//	Outp32(rG2D_ALPHA, (Inp32_0(rG2D_ALPHA)&= ~(0xff<<8)) | (ucFadeVal<<8));
	rG2D_ALPHA=(rG2D_ALPHA&~(0xff<<8))|(ucFadeVal<<8);
}

void G2D_DisableEffect(void)
{
//	Outp32(rG2D_ROP, (Inp32_0(rG2D_ROP)&~(0x7<<10)));
	rG2D_ROP&=~(0x7<<10);
}

void G2D_EnablePlaneAlphaBlending(u8 ucAlphaVal)
{
	ucAlphaVal &= 0xff;

	// Set Alpha Blending Mode
//	Outp32(rG2D_ROP, (Inp32_0(rG2D_ROP) &= ~(0x7<<10)) | G2D_ALPHA_BIT);
	rG2D_ROP=(rG2D_ROP&~(0x7<<10))|G2D_ALPHA_BIT;


	// Set Alpha Value
//	Outp32(rG2D_ALPHA, (Inp32_0(rG2D_ALPHA) &= ~(0xff)) | ucAlphaVal);
	rG2D_ALPHA=(rG2D_ALPHA&~(0xff))|ucAlphaVal;
	

	oG2d.m_ucAlphaVal = ucAlphaVal;
	oG2d.m_bIsAlphaCall = true;
}

void G2D_DisablePlaneAlphaBlending(void)
{
	G2D_DisableEffect();
}

void G2D_EnablePixelAlphaBlending(void) // Only Support 24bpp and Only used in BitBlt
{

//	Assert(oG2d.m_eBpp == RGB24);

//	Outp32(rG2D_ROP, (Inp32_0(rG2D_ROP) &= ~(0x7<<10)) | G2D_PP_ALPHA_SOURCE_BIT);
	rG2D_ROP=(rG2D_ROP&~(0x7<<10))|G2D_PP_ALPHA_SOURCE_BIT;
	
}

void G2D_DisablePixelAlphaBlending(void) // Only Support 24bpp and only used in BitBlt
{
//	Assert(oG2d.m_eBpp == RGB24);
	G2D_DisableEffect();
}

void G2D_EnableFadding(u8 ucFadingVal)
{
	u8 ucAlphaVal;

	ucAlphaVal = (oG2d.m_bIsAlphaCall == true) ? oG2d.m_ucAlphaVal : 255;

	ucFadingVal &= 0xff;

	// Set Fadding Mode	
//	Outp32(rG2D_ROP, (Inp32_0(rG2D_ROP) &= ~(0x7<<10)) | G2D_FADING_BIT);
	rG2D_ROP=(rG2D_ROP&~(0x7<<10))|G2D_FADING_BIT;

	// Set Fadding Value	
//	Outp32(rG2D_ALPHA, (Inp32_0(rG2D_ALPHA) &= ~(0xff<<8)) | (ucFadingVal<<8) | (ucAlphaVal<<0));
	rG2D_ALPHA=(rG2D_ALPHA&~(0xff<<8))|(ucFadingVal<<8) | (ucAlphaVal<<0);
}

void G2D_DisableFadding(void)
{
	G2D_DisableEffect();
}

void G2D_SetRotationOrgX(u16 usRotOrgX)
{
//	Outp16(rG2D_ROT_OC_X, usRotOrgX);
	rG2D_ROT_OC_X|=usRotOrgX;
}

void G2D_SetRotationOrgY(u16 usRotOrgY)
{
//	Outp16(rG2D_ROT_OC_Y, usRotOrgY);
	rG2D_ROT_OC_Y|=usRotOrgY;
}

// Clear Frame irrelevant to clipping window size


// Draw Pixel







void G2D_DrawPattern1(u32 uPosX, u32 uPosY, u32 uHsz, u32 uVsz)
{
	u32 uSubHsz, uSubVsz;

//	Assert( !((uHsz%8)  || (uVsz%8)) );
//	Assert( (uPosX+uHsz<=(oG2d.m_uMaxDx+1)) && (uPosY+uVsz<=(oG2d.m_uMaxDy+1)) );

	G2D_FillRectangleEcolor(uPosX, uPosY, uHsz, uVsz, G2D_WHITE);

	// Draw Color Bar
	uSubHsz = uHsz/8;
	uSubVsz = uVsz/2;

	G2D_FillRectangleEcolor(uPosX, uPosY, uSubHsz, uSubVsz, G2D_RED);
	G2D_FillRectangleEcolor(uSubHsz*1, uPosY, uSubHsz, uSubVsz, G2D_GREEN);
	G2D_FillRectangleEcolor(uSubHsz*2, uPosY, uSubHsz, uSubVsz, G2D_BLUE);
	G2D_FillRectangleEcolor(uSubHsz*3, uPosY, uSubHsz, uSubVsz, G2D_CYAN);
	G2D_FillRectangleEcolor(uSubHsz*4, uPosY, uSubHsz, uSubVsz, G2D_MAGENTA);
	G2D_FillRectangleEcolor(uSubHsz*5, uPosY, uSubHsz, uSubVsz, G2D_YELLOW);
	G2D_FillRectangleEcolor(uSubHsz*6, uPosY, uSubHsz, uSubVsz, G2D_WHITE);
	G2D_FillRectangleEcolor(uSubHsz*7, uPosY, uSubHsz, uSubVsz, G2D_BLACK);

	// Draw Pattern
	uSubHsz = uHsz/2;
	G2D_PutRectangleEcolor(uPosX, uSubVsz, uHsz, uSubVsz, G2D_RED);
	G2D_PutLineEcolor(uPosX, uSubVsz, uHsz-1, uVsz-1, G2D_BLACK, true);
	G2D_PutLineEcolor(uHsz, uSubVsz, uPosX, uVsz-1, G2D_MAGENTA, true);

	uSubHsz = uHsz/2;
	G2D_PutLineEcolor(uSubHsz, uSubVsz, uSubHsz-1, uVsz-1, G2D_GREEN, true);

	uSubVsz = uVsz*3/4;
	G2D_PutLineEcolor(uPosX, uSubVsz, uHsz-1, uSubVsz-1, G2D_BLUE, true);
	
}

void G2D_SetXYIncrFormat(u32 uDividend, u32 uDivisor, u32* uResult)
{
    int i;
    u32 uQuotient;
    u32 uUnderPoint=0;

//	Assert(uDivisor != 0);

    uQuotient = (u32)(uDividend/uDivisor);

//	Assert(uQuotient <= 2048); // Quotient should be less than 2048.

    uDividend-=(uQuotient*uDivisor);

    for (i=0; i<12; i++)
    {
		uDividend <<= 1;
		uUnderPoint <<= 1;
		if (uDividend >= uDivisor)
		{
		    uUnderPoint = uUnderPoint | 1;
		    uDividend -= uDivisor;
		}
    }

    uUnderPoint = (uUnderPoint + 1) >> 1;

	*uResult =  uUnderPoint|(uQuotient<<11);
}

void G2D_BitBlt(u16 usSrcStX, u16 usSrcStY, u16 usSrcEndX, u16 usSrcEndY,
  	                  u16 usDstStX, u16 usDstStY, u16 usDstEndX, u16 usDstEndY, bool bIsStretch)
{
	u16 usSrcWidth, usSrcHeight;
	u16 usDstWidth, usDstHeight;
	u32 uXYIncr;
	u32 uCmdRegVal;

	// Check boundary of X coordiante
//	Assert( (usSrcStX >= oG2d.m_uCwX1)&&(usSrcEndX >= oG2d.m_uCwX1) );
	// Coordinate X of source image or destination image should be less than that of clipping window.

⌨️ 快捷键说明

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