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

📄 g2d.c

📁 s3c6400 ADS下官方测试程序
💻 C
📖 第 1 页 / 共 4 页
字号:
/**************************************************************************************
* 
*	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 "intc.h"
#include "lcd.h"
#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>

#include "sun320240_16bpp.h"
#include "sun320240_24bpp.h"



#define	rG2D_CONTROL             	(G2D_BASE+0x00)
#define	rG2D_INTEN                   (G2D_BASE+0x04)
#define	rG2D_FIFO_INT_CON      (G2D_BASE+0x08)
#define	rG2D_INT_PEND_REG		(G2D_BASE+0x0c)
#define	rG2D_DE_STATUS           (G2D_BASE+0x10)
#define	rG2D_FB_BA                   (G2D_BASE+0x20)
#define	rG2D_CMDR0                  (G2D_BASE+0x100)
#define	rG2D_CMDR1                   (G2D_BASE+0x104)
#define	rG2D_CMDR2                   (G2D_BASE+0x108)
#define	rG2D_CMDR3                   (G2D_BASE+0x10c)
#define	rG2D_CMDR4                   (G2D_BASE+0x110)
#define	rG2D_CMDR5                   (G2D_BASE+0x114)
#define	rG2D_CMDR6                   (G2D_BASE+0x118)
#define	rG2D_CMDR7                   (G2D_BASE+0x11c)
#define	rG2D_COLOR_MODE          (G2D_BASE+0x200)
#define	rG2D_HORI_RES               (G2D_BASE+0x204)
#define	rG2D_SC_WINDOW           (G2D_BASE+0x210)
#define	rG2D_SC_WINDOW_X       (G2D_BASE+0x214)
#define	rG2D_SC_WINDOW_Y         	(G2D_BASE+0x218)
#define	rG2D_CW_LEFT_TOP             (G2D_BASE+0x220)
#define	rG2D_CW_LEFT_TOP_X       	(G2D_BASE+0x224)
#define	rG2D_CW_LEFT_TOP_Y       	(G2D_BASE+0x228)
#define	rG2D_CW_RIGHT_BOTTOM         (G2D_BASE+0x230)
#define	rG2D_CW_RIGHT_BOTTOM_X   	(G2D_BASE+0x234)
#define	rG2D_CW_RIGHT_BOTTOM_Y   	(G2D_BASE+0x238)
#define	rG2D_COORD0              	(G2D_BASE+0x300)
#define	rG2D_COORD0_X               (G2D_BASE+0x304)
#define	rG2D_COORD0_Y               (G2D_BASE+0x308)
#define	rG2D_COORD1              	(G2D_BASE+0x310)
#define	rG2D_COORD1_X               (G2D_BASE+0x314)
#define	rG2D_COORD1_Y               (G2D_BASE+0x318)
#define	rG2D_COORD2              	(G2D_BASE+0x320)
#define	rG2D_COORD2_X               (G2D_BASE+0x324)
#define	rG2D_COORD2_Y               (G2D_BASE+0x328)
#define	rG2D_COORD3              	(G2D_BASE+0x330)
#define	rG2D_COORD3_X               (G2D_BASE+0x334)
#define	rG2D_COORD3_Y               (G2D_BASE+0x338)
#define	rG2D_ROT_OC              	(G2D_BASE+0x340)
#define	rG2D_ROT_OC_X                (G2D_BASE+0x344)
#define	rG2D_ROT_OC_Y                (G2D_BASE+0x348)
#define	rG2D_ROT_MODE               (G2D_BASE+0x34c)
#define	rG2D_ENDIAN_READSIZE     	(G2D_BASE+0x350)
#define	rG2D_X_INCR                  (G2D_BASE+0x400)
#define	rG2D_Y_INCR                  (G2D_BASE+0x404)
#define	rG2D_ROP                 	(G2D_BASE+0x410)
#define	rG2D_ALPHA                   (G2D_BASE+0x420)
#define	rG2D_FG_COLOR                (G2D_BASE+0x500)
#define	rG2D_BG_COLOR                (G2D_BASE+0x504)
#define	rG2D_BS_COLOR                (G2D_BASE+0x508)
#define	rG2D_PATTERN_ADDR            (G2D_BASE+0x600)
#define	rG2D_PAT_OFF_XY          	(G2D_BASE+0x700)
#define	rG2D_PAT_OFF_X               (G2D_BASE+0x704)
#define	rG2D_PAT_OFF_Y               (G2D_BASE+0x708)                                      																																								
#define	rG2D_COLORKEY_CNTL           (G2D_BASE+0x720)	
#define	rG2D_COLORKEY_DR_MIN         (G2D_BASE+0x724)
#define	rG2D_COLORKEY_DR_MAX         (G2D_BASE+0x728)


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_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 == ARGB8) ? G2D_COLOR_15BPP_BIT :
				(eBpp == RGB16) ? G2D_COLOR_16BPP_BIT :
				(eBpp == RGB18) ? G2D_COLOR_18BPP_BIT :
				(eBpp == RGB24) ? G2D_COLOR_24BPP_BIT :	G2D_COLOR_24BPP_BIT;

	Outp32(rG2D_COLOR_MODE, uBppMode);
	Outp32(rG2D_FB_BA, oG2d.m_uFbStAddr);

	Outp32(rG2D_HORI_RES, oG2d.m_uHoriRes);	//lcdX should be 4n

	Outp32(rG2D_SC_WINDOW_X, oG2d.m_uMaxDx);
	Outp32(rG2D_SC_WINDOW_Y, oG2d.m_uMaxDy);
	Outp32(rG2D_CW_LEFT_TOP_X, oG2d.m_uCwX1);
	Outp32(rG2D_CW_LEFT_TOP_Y, oG2d.m_uCwY1);
	Outp32(rG2D_CW_RIGHT_BOTTOM_X, oG2d.m_uCwX2);
	Outp32(rG2D_CW_RIGHT_BOTTOM_Y, oG2d.m_uCwY2);

	Outp32(rG2D_ALPHA, FADING_OFFSET_DISABLE | ALPHA_VALUE_DISABLE);

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

	Outp32(rG2D_ROP, G2D_OPERAND3_FG_BIT | G2D_NO_ALPHA_BIT | OPAQUE_ENABLE | G2D_ROP_SRC_ONLY);

	Outp32(rG2D_ROT_OC_X, 0);
	Outp32(rG2D_ROT_OC_Y, 0);
	Outp32(rG2D_ROT_MODE, G2D_ROTATION_0_DEG_BIT);
	Outp32(rG2D_ALPHA, 0);
}

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

void G2D_WaitForIdleStatus(void)
{
	while(!(Inp32(rG2D_DE_STATUS) & G2D_DE_STATUS_FA_BIT));
}

void G2D_CheckFifo(u32 uEmptyFifo)
{
	while( (Inp32(rG2D_DE_STATUS)&0x3f) > (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(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(rG2D_ROP) &= ~(0x7<<10)) | uAlphaBlend);
}

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

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

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

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


	// Set Alpha Value
	Outp32(rG2D_ALPHA, (Inp32(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(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(rG2D_ROP) &= ~(0x7<<10)) | G2D_FADING_BIT);

	// Set Fadding Value	
	Outp32(rG2D_ALPHA, (Inp32(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);
}

void G2D_SetRotationOrgY(u16 usRotOrgY)
{
	Outp16(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.
	Assert( (usSrcEndX <= oG2d.m_uCwX2)&&(usDstEndX <= oG2d.m_uCwX2) );

	// Check boundary of Y coordinate
	Assert( (usSrcStY >= oG2d.m_uCwY1)&&(usSrcEndY >= oG2d.m_uCwY1) );
	// Coordinate Y of source image or destination image should be less than that of clipping window.
	Assert( (usSrcEndY <= oG2d.m_uCwY2)&&(usDstEndY <= oG2d.m_uCwY2) );

	G2D_CheckFifo(17);

    Outp32(rG2D_COORD0_X, usSrcStX);
    Outp32(rG2D_COORD0_Y, usSrcStY);
    Outp32(rG2D_COORD1_X, usSrcEndX);
    Outp32(rG2D_COORD1_Y, usSrcEndY);

    Outp32(rG2D_COORD2_X, usDstStX);
    Outp32(rG2D_COORD2_Y, usDstStY);
    Outp32(rG2D_COORD3_X, usDstEndX);
    Outp32(rG2D_COORD3_Y, usDstEndY);

	if(bIsStretch==true) {
		usSrcWidth=ABS(usSrcStX-usSrcEndX);
		usDstWidth=ABS(usDstStX-usDstEndX);
		usSrcHeight=ABS(usSrcStY-usSrcEndY);
		usDstHeight=ABS(usDstStY-usDstEndY);

		G2D_SetXYIncrFormat(usSrcWidth, usDstWidth, &uXYIncr);
		Outp32(rG2D_X_INCR, uXYIncr);

		G2D_SetXYIncrFormat(usSrcHeight, usDstHeight, &uXYIncr);
		Outp32(rG2D_Y_INCR, uXYIncr);
    	}

		uCmdRegVal=Inp32(rG2D_CMDR1);
		uCmdRegVal = ~(0x3<<0);
		uCmdRegVal |= (bIsStretch == true) ? G2D_STRETCH_BITBLT_BIT : G2D_NORMAL_BITBLT_BIT;
		Outp32(rG2D_CMDR1, uCmdRegVal);
#ifdef PROFILE
		StartTimer(0);
#endif
		while(!bG2dDone);
		bG2dDone=0;
	
}

// Get Original Coordinate (X,Y) to rotate window
// usDestStX, usDesStY : Target Destination after rotation
// (usSrcX1, usSrcY1), (usSrcX2, usSrcY2) : Coordinate (X1,Y1), (X2, Y2) before rotation
// usRotDegree : support only 90/180/270 degrees
// usOrigX, usOrigY : Rotation Coordinate. the register value for rG2D_ROT_OC_X and rG2D_ROT_OC_Y

// formula to get usOrigX, usOrigY
// | usDestX - usOrigX |   | cosA -sinA | | usSRCX - usOrigX |
// |                   | = |            | |                  |
// | usDestY - usOrigY |   | sinA  cosA | | usSRCY - usOrigY |
//
//
//( if A == 90 degrees, usSRCX = usSrcX1 and usSRCY = usSrcY2
// else if A == 180 degrees, usSRCX = usSrcX2 and usSRCY = usSrcY2
// else if A == 270 degrees, usSRCX = usSrcX1 and usSRCY = usSrcY2 )

⌨️ 快捷键说明

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