📄 lcdlib.c
字号:
/*****************************************
NAME: lcdlib.c
DESC: lcd configuration low-level codes
HISTORY:
2002.03.13:draft ver 0.0
*****************************************/
#include <string.h>
#include "2460addr.h"
#include "2460lib.h"
#include "2460slib.h"
#include "def.h"
#include "lcdlib.h"
#include "..\bmp\demo256.h"
//volatile unsigned int DisplayType;
//volatile unsigned int WhichFrameBuffer;
//040616
#define LCD_DEN (1<<7)
#define LCD_DCLK (1<<6)
#define LCD_DSERI (1<<5) // edited by junon 040721
#define LCD_RESET (0)
//040616
#define LCD_DEN_Lo (rGPHDAT &= ~LCD_DEN)
#define LCD_DEN_Hi (rGPHDAT |= LCD_DEN)
#define LCD_DCLK_Lo (rGPHDAT &= ~LCD_DCLK)
#define LCD_DCLK_Hi (rGPHDAT |= LCD_DCLK)
#define LCD_DSERI_Lo (rGPHDAT &= ~LCD_DSERI)
#define LCD_DSERI_Hi (rGPHDAT |= LCD_DSERI)
//#define LCD_RESET_Lo (rGPHDAT &= ~LCD_RESET)
//#define LCD_RESET_Hi (rGPHDAT |= LCD_RESET)
#define LCD_RESET_Lo (0)
#define LCD_RESET_Hi (1)
//040616
#define SET_LCD_DATA (rGPHCON=(rGPHCON&~(0xff<<8))|(0x55<<8))
unsigned int mpegframebuffer;
void LcdBGInit(unsigned int displaytype)
{
unsigned int pagewidth, offsize, bytefactor;
unsigned int clkval, pnrmode, bppmode;
unsigned int vbpd, vfpd, vspw, hbpd, hfpd, hspw;
unsigned int lineval, hozval;
unsigned int hwswp;
unsigned int framebuffer1, framebuffer2;
if(displaytype&0x1000)
pnrmode=PNRMODE_SER_RGB;
else
pnrmode=PNRMODE_PAR_RGB;
switch(displaytype&0xf) {
case 0x0:
bytefactor=1;
bppmode=BPPMODE_1BPP;
break;
case 0x1:
bytefactor=2;
bppmode=BPPMODE_2BPP;
break;
case 0x2:
bytefactor=4;
bppmode=BPPMODE_4BPP;
break;
case 0x3:
bytefactor=8;
bppmode=BPPMODE_8BPP;
break;
case 0x4:
bytefactor=8;
bppmode=BPPMODE_8BPPNP;
break;
case 0x5:
bytefactor=16;
bppmode=BPPMODE_16BPP565;
break;
case 0x6:
bytefactor=16;
bppmode=BPPMODE_16BPP5551;
break;
case 0x7:
bytefactor=32;
bppmode=BPPMODE_24BPP;
break;
default:
break;
}
switch(displaytype&0xff00) {
case 0x1100:
clkval=CLKVAL_SER_176220;
vbpd=VBPD_176220;
vfpd=VFPD_176220;
vspw=VSPW_176220;
hbpd=HBPD_176220;
hfpd=HFPD_176220;
hspw=HSPW_176220;
lineval=LINEVAL_176220;
hozval=HOZVAL_176220;
pagewidth=BG_XSIZE_176220*bytefactor/8;
offsize=(BG_VXSIZE_176220-BG_XSIZE_176220)*bytefactor/8;
break;
case 0x1200:
clkval=CLKVAL_SER_240320;
vbpd=VBPD_SER_240320;
vfpd=VFPD_SER_240320;
vspw=VSPW_SER_240320;
hbpd=HBPD_SER_240320;
hfpd=HFPD_SER_240320;
hspw=HSPW_SER_240320;
lineval=LINEVAL_240320;
hozval=HOZVAL_240320;
pagewidth=BG_XSIZE_240320*bytefactor/8;
offsize=(BG_VXSIZE_240320-BG_XSIZE_240320)*bytefactor/8;
break;
case 0x2100:
clkval=CLKVAL_PAR_176220;
vbpd=VBPD_176220;
vfpd=VFPD_176220;
vspw=VSPW_176220;
hbpd=HBPD_176220;
hfpd=HFPD_176220;
hspw=HSPW_176220;
lineval=LINEVAL_176220;
hozval=HOZVAL_176220;
pagewidth=BG_XSIZE_176220*bytefactor/8;
offsize=(BG_VXSIZE_176220-BG_XSIZE_176220)*bytefactor/8;
break;
case 0x2200:
clkval=CLKVAL_PAR_240320;
vbpd=VBPD_240320;
vfpd=VFPD_240320;
vspw=VSPW_240320;
hbpd=HBPD_240320;
hfpd=HFPD_240320;
hspw=HSPW_240320;
lineval=LINEVAL_240320;
hozval=HOZVAL_240320;
pagewidth=BG_XSIZE_240320*bytefactor/8;
offsize=(BG_VXSIZE_240320-BG_XSIZE_240320)*bytefactor/8;
break;
case 0x2300:
clkval=CLKVAL_PAR_320240;
vbpd=VBPD_320240;
vfpd=VFPD_320240;
vspw=VSPW_320240;
hbpd=HBPD_320240;
hfpd=HFPD_320240;
hspw=HSPW_320240;
lineval=LINEVAL_320240;
hozval=HOZVAL_320240;
pagewidth=BG_XSIZE_320240*bytefactor/8;
offsize=(BG_VXSIZE_320240-BG_XSIZE_320240)*bytefactor/8;
break;
case 0x2400:
clkval=CLKVAL_PAR_640480;
vbpd=VBPD_640480;
vfpd=VFPD_640480;
vspw=VSPW_640480;
hbpd=HBPD_640480;
hfpd=HFPD_640480;
hspw=HSPW_640480;
lineval=LINEVAL_640480;
hozval=HOZVAL_640480;
pagewidth=BG_XSIZE_640480*bytefactor/8;
offsize=(BG_VXSIZE_640480-BG_XSIZE_640480)*bytefactor/8;
break;
case 0x2800:
clkval=CLKVAL_PAR_800600;
vbpd=VBPD_800600;
vfpd=VFPD_800600;
vspw=VSPW_800600;
hbpd=HBPD_800600;
hfpd=HFPD_800600;
hspw=HSPW_800600;
lineval=LINEVAL_800600;
hozval=HOZVAL_800600;
pagewidth=BG_XSIZE_800600*bytefactor/8;
offsize=(BG_VXSIZE_800600-BG_XSIZE_800600)*bytefactor/8;
break;
default:
break;
}
framebuffer1=LCDFRAMEBUFFERBG1;
framebuffer2=LCDFRAMEBUFFERBG2;
#if 1
hwswp=0;
if(displaytype&MODE_NO_VIRTUAL_16B) {
offsize=0;
hwswp=1;
}
if(displaytype&MODE_NO_VIRTUAL_24B) {
offsize=0;
hwswp=0;
}
if(displaytype&MODE_MPEG_DISPLAY_16B) { //2004.06.16 for MPEG
offsize=0;
hwswp=1;
framebuffer1=mpegframebuffer;
}
if(displaytype&MODE_MPEG_DISPLAY_24B) {
offsize=0;
hwswp=0;
framebuffer1=mpegframebuffer;
}
#endif
rLCDCON1=(rLCDCON1&((1<<20)|(7<<6)))|(0<<21)|(1<<19)|(clkval<<13)|(1<<12)|(pnrmode<<9)|(bppmode<<2)|0;
//rLCDCON1=(0<<21)|(1<<19)|(clkval<<13)|(1<<12)|(pnrmode<<9)|(bppmode<<2)|0;
rLCDCON2=(2<<9)|(1<<6)|(1<<5)|(hwswp);
rLCDTCON1=(vbpd<<16)|(vfpd<<8)|(vspw);
rLCDTCON2=(hbpd<<16)|(hfpd<<8)|(hspw);
rLCDTCON3=(lineval<<11)|(hozval);
rLCDSADDRB1=framebuffer1; //2004.06.16 for MPEG
rLCDEADDRB1=LCDBASEL(framebuffer1+(pagewidth+offsize)*(lineval+1)); //2004.06.16 for MPEG
rLCDVSCRB1=(offsize<<13)|(pagewidth);
rLCDSADDRB2=framebuffer2; //2004.06.16 for MPEG
rLCDEADDRB2=LCDBASEL(framebuffer2+(pagewidth+offsize)*(lineval+1)); //2004.06.16 for MPEG
rLCDVSCRB2=(offsize<<13)|(pagewidth);
}
void LcdFGInit(unsigned int displaytype)
{
unsigned int pagewidth, offsize, bytefactor;
unsigned int bppmode;
unsigned int lefttopx, lefttopy, rightbotx, rightboty;
unsigned int lineval;
switch(displaytype&0xf) {
case 0x3:
bytefactor=8;
bppmode=BPPMODE_8BPP;
break;
case 0x4:
bytefactor=8;
bppmode=BPPMODE_8BPPNP;
break;
case 0x5:
bytefactor=16;
bppmode=BPPMODE_16BPP565;
break;
case 0x6:
bytefactor=16;
bppmode=BPPMODE_16BPP5551;
break;
case 0x7:
bytefactor=32;
bppmode=BPPMODE_24BPP;
break;
default:
break;
}
switch(displaytype&0xff00) {
case 0x4100:
lefttopx=lefttopy=0;
rightbotx=lefttopx+FG_XSIZE_176220-1;
rightboty=lefttopy+FG_YSIZE_176220-1;
lineval=FG_YSIZE_176220-1;
pagewidth=FG_XSIZE_176220*bytefactor/8;
offsize=(FG_VXSIZE_176220-FG_XSIZE_176220)*bytefactor/8;
break;
case 0x4200:
lefttopx=lefttopy=0;
rightbotx=lefttopx+FG_XSIZE_240320-1;
rightboty=lefttopy+FG_YSIZE_240320-1;
lineval=FG_YSIZE_240320-1;
pagewidth=FG_XSIZE_240320*bytefactor/8;
offsize=(FG_VXSIZE_240320-FG_XSIZE_240320)*bytefactor/8;
break;
case 0x4400:
lefttopx=lefttopy=0;
rightbotx=lefttopx+FG_XSIZE_640480-1;
rightboty=lefttopy+FG_YSIZE_640480-1;
lineval=FG_YSIZE_640480-1;
pagewidth=FG_XSIZE_640480*bytefactor/8;
offsize=(FG_VXSIZE_640480-FG_XSIZE_640480)*bytefactor/8;
break;
case 0x4800:
lefttopx=lefttopy=0;
rightbotx=lefttopx+FG_XSIZE_800600-1;
rightboty=lefttopy+FG_YSIZE_800600-1;
lineval=FG_YSIZE_800600-1;
pagewidth=FG_XSIZE_800600*bytefactor/8;
offsize=(FG_VXSIZE_800600-FG_XSIZE_800600)*bytefactor/8;
break;
default:
break;
}
if((displaytype&MODE_NO_VIRTUAL_16B)||(displaytype&MODE_NO_VIRTUAL_24B))
offsize=0;
rLCDCON1=(rLCDCON1&~((1<<20)|(7<<6)))|(bppmode<<6);
rLCDOSD1=(0<<9)|(0<<8)|(0xff);
rLCDOSD2=(lefttopx<<11)|(lefttopy);
rLCDOSD3=(rightbotx<<11)|(rightboty);
rLCDSADDRF1=LCDFRAMEBUFFERFG1;
rLCDEADDRF1=LCDBASEL(LCDFRAMEBUFFERFG1+(pagewidth+offsize)*(lineval+1));
rLCDVSCRF1=(offsize<<13)|(pagewidth);
rLCDSADDRF2=LCDFRAMEBUFFERFG2;
rLCDEADDRF2=LCDBASEL(LCDFRAMEBUFFERFG2+(pagewidth+offsize)*(lineval+1));
rLCDVSCRF2=(offsize<<13)|(pagewidth);
}
void PaletteInit(unsigned int type)
{
unsigned int *palette;
unsigned int i;
LcdEnvidOnOff (0); // Envid Off for updating palette ram.
while(((rLCDCON2>>15)&0x3ff)); //waiting for line-end
switch(type) {
case PAL_666_1BPP:
rLCDCON2|=(1<<9);
palette=(unsigned int *)PALETTEBG;
*palette++=0x0; //black
*palette=0x3ffff; //white
break;
case PAL_666_2BPP:
rLCDCON2|=(1<<9);
palette=(unsigned int *)PALETTEBG;
*palette++=0x3f000; // red
*palette++=0xfc0; //green
*palette++=0x3f; // blue
*palette=0x3ffff; // white
break;
case PAL_666_4BPP:
rLCDCON2|=(1<<9);
palette=(unsigned int *)PALETTEBG;
*palette++=0x0; //black
for(i=0; i<14; i++)
*palette++=17476*i;
*palette=0x3ffff; //white
break;
case PAL_666_8BPPBG:
rLCDCON2|=(1<<9);
palette=(unsigned int *)PALETTEBG;
for(i=0;i<256;i++)
*palette++=DEMO256pal[i]; // correction is needed
break;
case PAL_666_8BPPFG:
rLCDCON2|=(1<<9);
palette=(unsigned int *)PALETTEFG;
for(i=0;i<256;i++)
*palette++=DEMO256pal[i];// correction is needed
break;
case PAL_565_1BPP:
rLCDCON2|=(2<<9);
palette=(unsigned int *)PALETTEBG;
*palette++=0x0;//black
*palette=0xffff;//white
break;
case PAL_565_2BPP:
rLCDCON2|=(2<<9);
palette=(unsigned int *)PALETTEBG;
*palette++=0xf800; // red
*palette++=0x7e0; //green
*palette++=0x1f; // blue
*palette=0xffff; // white
break;
case PAL_565_4BPP:
rLCDCON2|=(2<<9);
palette=(unsigned int *)PALETTEBG;
*palette++=0x0; //black
for(i=0; i<14; i++)
*palette++=4369*i;
*palette=0xffff; //white
break;
case PAL_565_8BPPBG:
rLCDCON2|=(2<<9);
palette=(unsigned int *)PALETTEBG;
for(i=0;i<256;i++)
*palette++=DEMO256pal[i];// correction is needed
break;
case PAL_565_8BPPFG:
rLCDCON2|=(2<<9);
palette=(unsigned int *)PALETTEFG;
for(i=0;i<256;i++)
*palette++=DEMO256pal[i];// correction is needed
break;
case PAL_5551_1BPP:
rLCDCON2|=(3<<9);
palette=(unsigned int *)PALETTEBG;
*palette++=0x0;//black
*palette=0xffff;//white
break;
case PAL_5551_2BPP:
rLCDCON2|=(3<<9);
palette=(unsigned int *)PALETTEBG;
*palette++=0xf801; // red
*palette++=0x7c1; //green
*palette++=0x3f; // blue
*palette=0xffff; // white
break;
case PAL_5551_4BPP:
rLCDCON2|=(3<<9);
palette=(unsigned int *)PALETTEBG;
*palette++=0x0; //black
for(i=0; i<14; i++)
*palette++=4369*i;
*palette=0xffff; //white
break;
case PAL_5551_8BPPBG:
rLCDCON2|=(3<<9);
palette=(unsigned int *)PALETTEBG;
for(i=0;i<256;i++)
*palette++=DEMO256pal[i];// correction is needed
break;
case PAL_5551_8BPPFG:
rLCDCON2|=(3<<9);
palette=(unsigned int *)PALETTEFG;
for(i=0;i<256;i++)
*palette++=DEMO256pal[i];// correction is needed
break;
default:
break;
}
}
void LcdEnvidOnOff(unsigned int onoff)
{
#if 1
if(onoff==1)
rLCDCON1 = rLCDCON1|(3); // ENVID On using Per Frame method
else
rLCDCON1 &= (~3); // ENVID Off using Per Frame method
#else
if(onoff==1) {
rLCDCON1 = rLCDCON1|(3); // ENVID On using Per Frame method
LcdSetFrameInterrupt(FRAMESEL0_VSYNC, FRAMESEL1_NONE);
}
else {
rLCDCON1 &= (~3); // ENVID Off using Per Frame method
rLCDINTCON &= ~((1<<7)|(3));
}
#endif
}
void LcdEnvidOnOffDirect(unsigned int onoff)
{
#if 1
if(onoff==1)
rLCDCON1 = (rLCDCON1 & ~(3))|(1<<1); // ENVID On using Direct method
else
rLCDCON1 &= (~3); // ENVID Off for using Direct method
#else
if(onoff==1) {
rLCDCON1 = (rLCDCON1 & ~(3))|(1<<1); // ENVID On using Direct method
LcdSetFrameInterrupt(FRAMESEL0_VSYNC, FRAMESEL1_NONE);
}
else {
rLCDCON1 &= (~3); // ENVID Off for using Direct method
rLCDINTCON &= ~((1<<7)|(3));
}
#endif
}
void LcdSelectBuffer(unsigned int whichbuffer)
{
//WhichFrameBuffer=whichbuffer;
switch(whichbuffer) {
case BGBUFFER1:
rLCDCON1=(rLCDCON1&~(1<<21))|(0<<21);
break;
case BGBUFFER2:
rLCDCON1=(rLCDCON1&~(1<<21))|(1<<21);
break;
case FGBUFFER1:
rLCDCON1=(rLCDCON1&~(1<<20))|(0<<20);
break;
case FGBUFFER2:
rLCDCON1=(rLCDCON1&~(1<<20))|(1<<20);
break;
default:
break;
}
}
void LcdSetFrameInterrupt(unsigned int framesel0, unsigned int framesel1)
{
rLCDINTCON=(rLCDINTCON&~(0xf<<8))|((0x3&framesel0)<<10)|((0x3&framesel1)<<8)|(1<<7)|(1);
}
void LcdEnableFrameInterrupt(unsigned int framesel0, unsigned int framesel1)
{
rLCDCON1 &= (~3); // ENVID Off
while(((rLCDCON2>>15)&0x3ff)); //waiting for end of current frame.
rLCDCON1 = rLCDCON1|(3); // ENVID On using Per Frame method
rLCDINTCON=(rLCDINTCON&~(0xf<<8))|((0x3&framesel0)<<10)|((0x3&framesel1)<<8)|(1<<7)|(1);
}
void LcdDisableFrameInterrupt(void)
{
rLCDINTCON &=~((1<<7)|1);
rLCDCON1 &= (~3); // ENVID Off
}
void LcdEnableFifoInterrupt(unsigned int fifosel, unsigned int fifolevel)
{
rLCDCON1 &= (~3); // ENVID Off
while(((rLCDCON2>>15)&0x3ff)); //waiting for end of current frame.
rLCDCON1 = rLCDCON1|(3); // ENVID On using Per Frame method
rLCDINTCON=(rLCDINTCON&~(0x7f))|((0x3&fifosel)<<5)|((0x7&fifolevel)<<2)|(1<<1)|(1);
}
void LcdDisableFifoInterrupt(void)
{
rLCDINTCON &=~(3);
rLCDCON1 &= (~3); // ENVID Off
}
void LcdSetFifoInterrupt(unsigned int fifosel, unsigned int fifolevel)
{
rLCDINTCON=(rLCDINTCON&~(0x1f<<2))|((0x3&fifosel)<<10)|((0x7&fifolevel)<<8)|(1<<1)|(1);
}
void LcdOsdEnDiable(unsigned int endisable)
{
if(endisable==1)
rLCDOSD1 |= (1<<9);
else
rLCDOSD1 &= (~(1<<9));
}
void LcdOsdSetAlpha(unsigned int alpha)
{
rLCDOSD1 = (rLCDOSD1 & ~(0xff))|(alpha & 0xff);
}
void LcdOsdSelectFunction(unsigned int function)
{
if(function==OSD_COLORKEY)
rLCDKEYCON|=(1<<25);
else if(function==OSD_BLENDING)
rLCDKEYCON&=(~(1<<25));
}
void LcdOsdChangeCoordination(unsigned int topx, unsigned int topy, unsigned int botx, unsigned int boty)
{
rLCDOSD2=(rLCDOSD2&~(0x3fffff))|((0x3ff&topx)<<11)|(0x3ff&topy);
rLCDOSD3=(rLCDOSD3&~(0x3fffff))|((0x3ff&botx)<<11)|(0x3ff&boty);
}
void LcdDitheringEnDisable(unsigned int endisable)
{
if(endisable==1)
rLCDDITHCON|=1;
else
rLCDDITHCON&=(~1);
}
void LcdBGColorMap(unsigned int endisable, unsigned int bgcolor)
{
rLCDBGCON=(rLCDBGCON&~(0xffffff))|(0xffffff&bgcolor);
if(endisable==1)
rLCDBGCON=(1<<24)|(rLCDBGCON&~(0xffffff))|(0xffffff&bgcolor);
else
rLCDBGCON&=(~(1<<24));
}
void LcdFGColorMap(unsigned int endisable, unsigned int fgcolor)
{
rLCDFGCON=(rLCDFGCON&~(0xffffff))|(0xffffff&fgcolor);
if(endisable==1)
rLCDFGCON=(1<<24)|(rLCDFGCON&~(0xffffff))|(0xffffff&fgcolor);
else
rLCDFGCON&=(~(1<<24));
}
void LcdColorKeyInit(unsigned int displaytype)
{
unsigned int redkey, greenkey, bluekey;
unsigned int redcol, greencol, bluecol;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -