📄 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 "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 + -