📄 lcdlib.c
字号:
/*****************************************
NAME: lcdlib.c
DESC: lcd configuration low-level codes
HISTORY:
2002.03.13:draft ver 0.0
*****************************************/
#include <string.h>
#include "24a0addr.h"
#include "24a0lib.h"
#include "def.h"
#include "lcdlib.h"
#include "..\bmp\demo256.h"
//volatile U32 DisplayType;
//volatile U32 WhichFrameBuffer;
//041231
#define LCD_DEN (1<<6)
#define LCD_DSERI (1<<4)
#define LCD_DCLK (1<<5)
#define LCD_RESET (0)
//041231
#define LCD_DEN_Lo (rGPDAT&= ~LCD_DEN)
#define LCD_DEN_Hi (rGPDAT |= LCD_DEN)
#define LCD_DCLK_Lo (rGPDAT &= ~LCD_DCLK)
#define LCD_DCLK_Hi (rGPDAT |= LCD_DCLK)
#define LCD_DSERI_Lo (rGPDAT &= ~LCD_DSERI)
#define LCD_DSERI_Hi (rGPDAT |= 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)
#define SET_CONFIG_PORT (rGPCON_L=(rGPCON_L&~(0x3f<<8))|(0x15<<8))
U32 mpegframebuffer;
void LcdBGInit(U32 displaytype)
{
U32 pagewidth, offsize, bytefactor;
U32 clkval, pnrmode, bppmode;
U32 vbpd, vfpd, vspw, hbpd, hfpd, hspw;
U32 lineval, hozval;
U32 hwswp;
U32 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_18BPP;
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 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 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) {
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=LCDFRAMEBUFFERBG1;
rLCDEADDRB1=LCDBASEL(LCDFRAMEBUFFERBG1+(pagewidth+offsize)*(lineval+1));
rLCDVSCRB1=(offsize<<13)|(pagewidth);
rLCDSADDRB2=LCDFRAMEBUFFERBG2;
rLCDEADDRB2=LCDBASEL(LCDFRAMEBUFFERBG2+(pagewidth+offsize)*(lineval+1));
rLCDVSCRB2=(offsize<<13)|(pagewidth);
}
/* Version before Feb 18
void LcdBGInit(U32 displaytype)
{
U32 pagewidth, offsize, bytefactor;
U32 clkval, pnrmode, bppmode;
U32 vbpd, vfpd, vspw, hbpd, hfpd, hspw;
U32 lineval, hozval;
U32 hwswp;
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_18BPP;
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 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 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;
}
hwswp=0;
if(displaytype&MODE_POST_DISPLAY_16B || displaytype&MODE_CAMERA_DISPLAY_16B) {
offsize=0;
hwswp=1;
}
if(displaytype&MODE_POST_DISPLAY_24B || displaytype&MODE_CAMERA_DISPLAY_24B) {
offsize=0;
hwswp=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=LCDFRAMEBUFFERBG1;
rLCDEADDRB1=LCDBASEL(LCDFRAMEBUFFERBG1+(pagewidth+offsize)*(lineval+1));
rLCDVSCRB1=(offsize<<13)|(pagewidth);
rLCDSADDRB2=LCDFRAMEBUFFERBG2;
rLCDEADDRB2=LCDBASEL(LCDFRAMEBUFFERBG2+(pagewidth+offsize)*(lineval+1));
rLCDVSCRB2=(offsize<<13)|(pagewidth);
}
*/
void LcdFGInit(U32 displaytype)
{
U32 pagewidth, offsize, bytefactor;
U32 bppmode;
U32 lefttopx, lefttopy, rightbotx, rightboty;
U32 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_18BPP;
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(U32 type)
{
U32 *palette;
U32 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=(U32 *)PALETTEBG;
*palette++=0x0; //black
*palette=0x3ffff; //white
break;
case PAL_666_2BPP:
rLCDCON2|=(1<<9);
palette=(U32 *)PALETTEBG;
*palette++=0x3f000; // red
*palette++=0xfc0; //green
*palette++=0x3f; // blue
*palette=0x3ffff; // white
break;
case PAL_666_4BPP:
rLCDCON2|=(1<<9);
palette=(U32 *)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=(U32 *)PALETTEBG;
for(i=0;i<256;i++)
*palette++=DEMO256pal[i]; // correction is needed
break;
case PAL_666_8BPPFG:
rLCDCON2|=(1<<9);
palette=(U32 *)PALETTEFG;
for(i=0;i<256;i++)
*palette++=DEMO256pal[i];// correction is needed
break;
case PAL_565_1BPP:
rLCDCON2|=(2<<9);
palette=(U32 *)PALETTEBG;
*palette++=0x0;//black
*palette=0xffff;//white
break;
case PAL_565_2BPP:
rLCDCON2|=(2<<9);
palette=(U32 *)PALETTEBG;
*palette++=0xf800; // red
*palette++=0x7e0; //green
*palette++=0x1f; // blue
*palette=0xffff; // white
break;
case PAL_565_4BPP:
rLCDCON2|=(2<<9);
palette=(U32 *)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=(U32 *)PALETTEBG;
for(i=0;i<256;i++)
*palette++=DEMO256pal[i];// correction is needed
break;
case PAL_565_8BPPFG:
rLCDCON2|=(2<<9);
palette=(U32 *)PALETTEFG;
for(i=0;i<256;i++)
*palette++=DEMO256pal[i];// correction is needed
break;
case PAL_5551_1BPP:
rLCDCON2|=(3<<9);
palette=(U32 *)PALETTEBG;
*palette++=0x0;//black
*palette=0xffff;//white
break;
case PAL_5551_2BPP:
rLCDCON2|=(3<<9);
palette=(U32 *)PALETTEBG;
*palette++=0xf801; // red
*palette++=0x7c1; //green
*palette++=0x3f; // blue
*palette=0xffff; // white
break;
case PAL_5551_4BPP:
rLCDCON2|=(3<<9);
palette=(U32 *)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=(U32 *)PALETTEBG;
for(i=0;i<256;i++)
*palette++=DEMO256pal[i];// correction is needed
break;
case PAL_5551_8BPPFG:
rLCDCON2|=(3<<9);
palette=(U32 *)PALETTEFG;
for(i=0;i<256;i++)
*palette++=DEMO256pal[i];// correction is needed
break;
default:
break;
}
}
/*
void Lcd_Palette_Init(void)
{
unsigned char cdata, p_red, p_green, p_blue;
U32 *palette;
palette=(U32 *)PALETTE;
*palette++=0; //black
for(cdata=1;cdata<255;cdata++)
{
p_red=(cdata & 0xe0);
p_green=(cdata & 0x1c);
p_blue=(cdata & 0x03);
*palette++=((U32)((p_red<<8)|(p_green<<6)|(p_blue<<3)));
}
*palette=0xffff; //white
}
*/
void LcdEnvidOnOff(U32 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(U32 onoff)
{
#if 1
if(onoff==1)
// rLCDCON1 = (rLCDCON1 & ~(3))|(1<<1); // ENVID On using Direct method
rLCDCON1 |= (1<<1);
else
rLCDCON1 &= ~(1<<1);
// 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(U32 whichbuffer)
{
//WhichFrameBuffer=whichbuffer;
switch(whichbuffer) {
case BGBUFFER1:
rLCDCON1=(rLCDCON1&~(1<<21))|(0<<21);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -