📄 g2d.c
字号:
if (uspPattern != (u16*)0)
{
for(i=0; i<32; i++)
{
// Outp32( rG2D_PATTERN_ADDR+(i*4), (uspPattern[2*i+1]<<16) | uspPattern[2*i+0]);
(*(volatile u32 *)(0x4D408600+(i*4)))=(uspPattern[2*i+1]<<16) | (uspPattern[2*i+0]);
}
}
else
// Assert(0); // There is no pattern.
;
}
void G2D_Set3rdOperand(G2D_OPERAND3 e3rdOp)
{
u32 u3rdOpSel =
(e3rdOp == G2D_OPERAND3_PAT) ? G2D_OPERAND3_PAT_BIT :
(e3rdOp == G2D_OPERAND3_FG) ? G2D_OPERAND3_FG_BIT : 0xffffffff;
if (u3rdOpSel == 0xffffffff)
// Assert(0); // UnSupported Third Operand!
;
G2D_CheckFifo(17);
// Outp32(rG2D_ROP, (Inp32_0(rG2D_ROP) &= ~(0x1<<13)) | u3rdOpSel);
rG2D_ROP=(rG2D_ROP&~(0x1<<13))| u3rdOpSel;
}
void G2D_SetRotationMode(u32 uRotationType)
{
G2D_CheckFifo(17);
rG2D_ROTATE= rG2D_ROTATE & ~(0x3f)|(uRotationType);
}
void G2D_SetRotationOrg(u16 usRotOrgX, u16 usRotOrgY)
{
G2D_CheckFifo(17);
rG2D_ROT_OC_X= usRotOrgX;
rG2D_ROT_OC_Y= usRotOrgY;
}
void G2D_SetScreenSize(u32 uMaxX, u32 uMaxY)
{
G2D_CheckFifo(17);
rG2D_SC_HORI_RES= (uMaxX&0x3ff);
rG2D_SC_VERT_RES= (uMaxY&0x3ff);
}
void G2D_SetSourceSize(u32 uHori, u32 uVert)
{
G2D_CheckFifo(17);
rG2D_SRC_HORI_RES= (uHori&0x3ff);
rG2D_SRC_VERT_RES= (uVert&0x3ff);
}
void G2D_SetClippingWindow(u32 uLeftTopX, u32 uLeftTopY, u32 uRightBottomX, u32 uRightBottomY)
{
G2D_CheckFifo(17);
rG2D_CW_LT_X= uLeftTopX;
rG2D_CW_LT_Y= uLeftTopY;
rG2D_CW_RB_X= uRightBottomX;
rG2D_CW_RB_Y= uRightBottomY;
}
void G2D_SetPatternMemory(u32 uCoordX, u32 uCoordY, u16 usColor)
{
u32 uOffsetAddress;
u32 uData;
G2D_CheckFifo(17);
// Assert(uCoordX <= 7);
// Assert(uCoordY <= 7);
uOffsetAddress = uCoordY*8*2 + (uCoordX/2)*4;
uData=(*(volatile unsigned *)(G2D_BASE_TEMP+0x600+uOffsetAddress));
uData = (uData&~(0xffff<<(16*(uCoordX%2))))|(usColor<<(16*(uCoordX%2)));
(*(volatile unsigned *)(G2D_BASE_TEMP+0x600+uOffsetAddress))=uData;
}
void G2D_GetPatternMemory(u32 uCoordX, u32 uCoordY, u16 *usColor)
{
u32 uOffsetAddress;
u32 uData;
G2D_CheckFifo(17);
// Assert(uCoordX <= 7);
// Assert(uCoordY <= 7);
uOffsetAddress = uCoordY*8*2 + (uCoordX/2)*4;
uData=(*(volatile unsigned *)(G2D_BASE_TEMP+0x600+uOffsetAddress));
if((uCoordX%2)==0) *usColor= (u16)(uData&0xffff);
else *usColor= (u16)((uData&0xffff0000)>>16);
}
void G2D_SetPatternOffset(u8 ucPatOffsetX, u8 ucPatOffsetY)
{
// Assert(ucPatOffsetX<=7);
// Assert(ucPatOffsetY<=7);
G2D_CheckFifo(17);
rG2D_PATOFF_X= ucPatOffsetX;
rG2D_PATOFF_Y= ucPatOffsetY;
}
void G2D_SetCoordinateDrawingText(u32 uStartX, u32 uStartY, u32 uEndX, u32 uEndY)
{
G2D_CheckFifo(17);
rG2D_COORD0_X= uStartX;
rG2D_COORD0_Y= uStartY;
rG2D_COORD1_X= uEndX;
rG2D_COORD1_Y= uEndY;
}
void G2D_SetFirstText(u32 uFirstText)
{
G2D_CheckFifo(17);
rG2D_CMDR4= uFirstText;
}
void G2D_SetNextText(u32 uNextText)
{
G2D_CheckFifo(17);
rG2D_CMDR5= uNextText;
}
void G2D_SetCMDR7(u32 uTestDrawingFbAddr)
{
G2D_CheckFifo(17);
rG2D_CMDR7= uTestDrawingFbAddr;
}
void G2D_SetFontType(u32 uFontType, u32 *uFontWidth, u32 *uFontHeight)
{
switch(uFontType)
{
case 0:
oG2d.m_upFontType = (u8 *)chr_font8X8;
oG2d.m_uFontWidth = 8;
oG2d.m_uFontHeight = 8;
*uFontWidth=8;
*uFontHeight=8;
break;
case 1:
oG2d.m_upFontType = (u8 *)font8x15;
oG2d.m_uFontWidth = 8;
oG2d.m_uFontHeight = 15;
*uFontWidth=8;
*uFontHeight=15;
break;
case 2:
oG2d.m_upFontType = (u8 *)chr_font8X16T;
oG2d.m_uFontWidth = 8;
oG2d.m_uFontHeight = 15;
*uFontWidth=8;
*uFontHeight=15;
break;
case 3:
oG2d.m_upFontType = (u8 *)chr_font8X16;
oG2d.m_uFontWidth = 8;
oG2d.m_uFontHeight = 16;
*uFontWidth=8;
*uFontHeight=16;
break;
default:
oG2d.m_upFontType = (u8 *)chr_font8X8;
oG2d.m_uFontWidth = 8;
oG2d.m_uFontHeight = 8;
*uFontWidth=8;
*uFontHeight=8;
break;
}
}
void G2D_FillMemoryForTextDrawing(u32 uFontType, u32 uTextDrawingFbAddr)
{
u8* ucOneLetter;
u32 uHostData = 0x0;
u32 uTempData = 0x0;
u32 i,j,k;
u32 uTotalSizeOfFont;
u32 uAddressOffset;
switch(uFontType) {
case 0:
oG2d.m_upFontType = (u8 *)chr_font8X8;
oG2d.m_uFontWidth = 8;
oG2d.m_uFontHeight = 8;
uTotalSizeOfFont=sizeof(chr_font8X8);
break;
case 1:
oG2d.m_upFontType = (u8 *)font8x15;
oG2d.m_uFontWidth = 8;
oG2d.m_uFontHeight = 15;
uTotalSizeOfFont=sizeof(font8x15);
break;
case 2:
oG2d.m_upFontType = (u8 *)chr_font8X16T;
oG2d.m_uFontWidth = 8;
oG2d.m_uFontHeight = 15;
uTotalSizeOfFont=sizeof(chr_font8X16T);
break;
case 3:
oG2d.m_upFontType = (u8 *)chr_font8X16;
oG2d.m_uFontWidth = 8;
oG2d.m_uFontHeight = 16;
uTotalSizeOfFont=sizeof(chr_font8X16);
break;
default:
oG2d.m_upFontType = (u8 *)chr_font8X8;
oG2d.m_uFontWidth = 8;
oG2d.m_uFontHeight = 8;
uTotalSizeOfFont=sizeof(chr_font8X8);
break;
}
// *uFontSize = oG2d.m_uFontHeight;
/*
for(i=0; i< uTotalSizeOfFont/4; i++) {
ucOneLetter = oG2d.m_upFontType + i*4; // get start address of chosen letter in font8x15
for (j=0; j<4; j++) // Generate 1-word of data!!
{
uTempData = (u32)ucOneLetter[j];
uHostData |= (uTempData << (24 - 8*j));
}
*(unsigned int *)(uTextDrawingFbAddr+i*4)=uHostData;
uHostData=0;
}
*/
// oG2d.m_ufontWidth might be multiple of 8.
uAddressOffset=((oG2d.m_uFontWidth/8*oG2d.m_uFontHeight+3)/4)*4;
for(i=0; i< (uTotalSizeOfFont)/(oG2d.m_uFontWidth/8*oG2d.m_uFontHeight); i++) {
ucOneLetter = oG2d.m_upFontType + i*oG2d.m_uFontWidth/8*oG2d.m_uFontHeight;
for (j=0; j<(oG2d.m_uFontWidth/8*oG2d.m_uFontHeight+3)/4; j++) // Generate 1-word of data!!
{
for (k=0; k<4; k++) // Generate 1-word of data!!
{
uTempData = (u32)ucOneLetter[j*4+k];
uHostData |= (uTempData << (24 - 8*k));
}
*(unsigned int *)(uTextDrawingFbAddr+i*uAddressOffset+j*4)=uHostData;
uHostData=0;
}
}
}
void G2D_SetCoordinateSrcBlock(u32 uStartX, u32 uStartY, u32 uEndX, u32 uEndY)
{
G2D_CheckFifo(17);
rG2D_COORD0_X= uStartX;
rG2D_COORD0_Y= uStartY;
rG2D_COORD1_X= uEndX;
rG2D_COORD1_Y= uEndY;
}
void G2D_SetCoordinateDstBlock(u32 uStartX, u32 uStartY, u32 uEndX, u32 uEndY)
{
G2D_CheckFifo(17);
rG2D_COORD2_X= uStartX;
rG2D_COORD2_Y= uStartY;
rG2D_COORD3_X= uEndX;
rG2D_COORD3_Y= uEndY;
}
void G2D_SetFirstBitBLTData(u32 uFirstData)
{
G2D_CheckFifo(17);
rG2D_CMDR2= uFirstData;
}
void G2D_SetNextBitBLTData(u32 uNextData)
{
G2D_CheckFifo(17);
rG2D_CMDR3= uNextData;
}
void G2D_SetFirstBitBLTEData(G2D_COLOR eFirstData)
{
G2D_SetFirstBitBLTData(oG2d.m_uColorVal[eFirstData]);
}
void G2D_SetNextBitBLTEData(G2D_COLOR eNextData)
{
G2D_SetNextBitBLTData(oG2d.m_uColorVal[eNextData]);
}
void G2D_SetStencilKey(u32 uIsInvOn, u32 uIsAOn, u32 uIsROn, u32 uIsGOn, u32 uIsBOn)
{
rG2D_COLORKEY_CNTL= ((uIsInvOn&1)<<4)|((uIsROn&1)<<3)|((uIsGOn&1)<<2)|((uIsBOn&1)<<1)|(uIsAOn&1);
}
void G2D_SetStencilMinMax(u32 uAMin, u32 uAMax, u32 uRMin, u32 uRMax, u32 uGMin, u32 uGMax, u32 uBMin, u32 uBMax, CSPACE eBpp)
{
switch(eBpp)
{
case RGB16:
rG2D_COLORKEY_DR_MIN= ((uRMin<<3)<<16)|((uGMin<<2)<<8)|(uBMin<<3);
rG2D_COLORKEY_DR_MAX= ((uRMax<<3)<<16)|((uGMax<<2)<<8)|(uBMax<<3);
break;
case RGBA16:
rG2D_COLORKEY_DR_MIN= ((uAMin&0xff)<<24)|((uRMin&0xff)<<16)|((uGMin&0xff)<<8)|(uBMin&0xff);
rG2D_COLORKEY_DR_MAX= ((uAMax&0xff)<<24)|((uRMax&0xff)<<16)|((uGMax&0xff)<<8)|(uBMax&0xff);
break;
case ARGB16:
rG2D_COLORKEY_DR_MIN= ((uAMin&0xff)<<24)|((uRMin&0xff)<<16)|((uGMin&0xff)<<8)|(uBMin&0xff);
rG2D_COLORKEY_DR_MAX= ((uAMax&0xff)<<24)|((uRMax&0xff)<<16)|((uGMax&0xff)<<8)|(uBMax&0xff);
break;
case RGB24:
case RGBX24:
rG2D_COLORKEY_DR_MIN= ((uRMin&0xff)<<16)|((uGMin&0xff)<<8)|(uBMin&0xff);
rG2D_COLORKEY_DR_MAX= ((uRMax&0xff)<<16)|((uGMax&0xff)<<8)|(uBMax&0xff);
break;
case RGBA24:
case ARGB24:
rG2D_COLORKEY_DR_MIN= ((uAMin&0xff)<<24)|((uRMin&0xff)<<16)|((uGMin&0xff)<<8)|(uBMin&0xff);
rG2D_COLORKEY_DR_MAX= ((uAMax&0xff)<<24)|((uRMax&0xff)<<16)|((uGMax&0xff)<<8)|(uBMax&0xff);
break;
default:
// Assert(0);
break;
}
}
void G2D_GetFrmSz(u32 *uG2dWidth, u32 *uG2dHeight)
{
u32 uMaxScreenVal;
uMaxScreenVal=rG2D_SC_RES;
//*uG2dWidth = (uMaxScreenVal&0x7ff)+1;
//*uG2dHeight = ((uMaxScreenVal>>16)&0x7ff)+1;
*uG2dWidth = (uMaxScreenVal&0x7ff);
*uG2dHeight = ((uMaxScreenVal>>16)&0x7ff);
}
void G2D_GetFbAddr(u32 *uG2dFbAddr)
{
//*uG2dFbAddr= Inp32_0(rG2D_FB_BA);
//G2dFbAddr = oG2d.m_uFbStAddr;
*uG2dFbAddr= rG2D_DEST_BASE_ADDR;
}
/*
void G2D_GetBppMode(CSPACE *eBpp)
{
u32 uBppVal;
uBppVal=Inp32_0(rG2D_COLOR_MODE);
switch(uBppVal&0xf) {
case 1:
*eBpp=ARGB8; //15-bpp
break;
case 2:
*eBpp=RGB16; //16-bpp
break;
case 4:
*eBpp=RGB18; // 18-bpp
break;
case 8:
*eBpp=RGB24; // 24-bpp
break;
default:
*eBpp=RGB16; //16-bpp
break;
}
}
*/
void G2D_GetSrcBppMode(CSPACE *eBpp)
{
u32 uBppVal;
uBppVal=rG2D_SRC_COLOR_MODE;
if (!(uBppVal&G2D_COLOR_YUV_MODE)) //means RGB mode
{
switch(uBppVal&0x7) {
case 0:
*eBpp=RGB16; //16-bpp
break;
case 1:
*eBpp=RGBA16; //16-bpp
break;
case 2:
*eBpp=ARGB16; //16-bpp
break;
case 3:
*eBpp=RGBA24; // 24-bpp
break;
case 4:
*eBpp=ARGB24; // 24-bpp
break;
case 5:
*eBpp=RGB24; // 24-bpp
break;
case 6:
*eBpp=RGBX24; // 24-bpp
break;
default:
*eBpp=RGB24; //24-bpp
break;
}
}
}
void G2D_GetDestBppMode(CSPACE *eBpp)
{
u32 uBppVal;
uBppVal=rG2D_DEST_COLOR_MODE;
switch(uBppVal&0x7) {
case 0:
*eBpp=RGB16; //16-bpp
break;
case 1:
*eBpp=RGBA16; //16-bpp
break;
case 2:
*eBpp=ARGB16; //16-bpp
break;
case 3:
*eBpp=RGBA24; // 24-bpp
break;
case 4:
*eBpp=ARGB24; // 24-bpp
break;
case 5:
*eBpp=RGB24; // 24-bpp
break;
case 6:
*eBpp=RGBX24; // 24-bpp
break;
default:
*eBpp=RGB24; //24-bpp
break;
}
}
void G2D_SetColorExpansionMethod(bool bIsScr2Scr)
{
oG2d.m_bIsScr2Scr = (bIsScr2Scr) ? 1 : 0;
}
void G2D_SetFontAddr(u32 uFontAddr)
{
oG2d.m_uFontAddr= uFontAddr;
}
void G2D_InterruptEnable(void)
{
//Outp32(rG2D_INTEN, 0x1<<9);//Enable Interrupt
rG2D_INTEN= (0x1<<10);//Enable Interrupt
rG2D_INTC_PEND= 0x80000000;
bG2dDone=0;
}
void G2D_InterruptDisable(void)
{
//Outp32(rG2D_INTEN, (Inp32_0(rG2D_INTEN)&~(1<<9)));//Disable Interrupt
rG2D_INTEN&= ~(1<<10);//Disable Interrupt
}
void G2D_IntEnSelectable(u32 uWhichInt)
{
rG2D_INTEN= uWhichInt;//Enable Interrupt
rG2D_INTC_PEND= 0x80000000;
bG2dDone=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -