⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcdlib.c

📁 三星s3c2460开发板完整功能测试代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*****************************************
  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 + -