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

📄 lcdlib.c

📁 s3c24a0固件测试代码 ? ? ? ? ?啊 
💻 C
📖 第 1 页 / 共 3 页
字号:
/*****************************************
  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 + -