📄 g2d.c
字号:
/**************************************************************************************
*
* 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 + -