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

📄 lcd.c

📁 嵌入式开发ads下面lcd液 晶屏驱动。嵌入式开发ads下面lcd液晶屏驱动。晶屏驱动。
💻 C
📖 第 1 页 / 共 5 页
字号:
//====================================================================
// File Name : LCD.c
// Function  : S3C2440 LCD test code
//====================================================================

#include <string.h>
#include "def.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "lcdlib.h"
#include "glib.h"
#include "lcd.h"
#include "DEMO256.h"

#define CARLING  		(1)

void Lcd_Port_Init(void);
void Lcd_Port_Return(void);
void Lcd_Palette1Bit_Init(void);
void Lcd_Palette8Bit_Init(void);
void __irq Lcd_Int_Frame(void);
void __irq Lcd_Int_Fifo(void);
void __irq Lcd_Int_Fifo_640480(void);
void Select_Tcon(void);

void Test_Lcd_Palette_Ram(void);
void Test_Lcd_Underrun(void);
void Test_Lcd_Tft_16Bit_800600(void);
void Test_Lcd_Tft_16Bit_800600_On(void);
void Test_Lcd_carling(void);


unsigned save_rGPCUP,save_rGPCDAT,save_rGPCCON;
unsigned save_rGPDUP,save_rGPDDAT,save_rGPDCON; 
unsigned lcd_count;


void * func_lcd_test[][2]=
{	
//									    "0123456789012345" max 15磊 肺茄沥窍咯 comment窍技夸.
//LCD 	
	(void *)Test_Lcd_Palette_Ram, 			"LCD Palette RAM",
	
	(void *)Test_Lcd_Stn_1Bit,				"STN 1Bit       ",
	(void *)Test_Lcd_Stn_2Bit,				"STN 2Bit       ",
	(void *)Test_Lcd_Stn_4Bit,				"STN 4Bit       ", 	 

	(void *)Test_Lcd_Cstn_8Bit, 			"CSTN 8Bit      ",
	(void *)Test_Lcd_Cstn_8Bit_On,			"CSTN 8Bit On   ", 	 
	(void *)Test_Lcd_Cstn_12Bit,			"CSTN 12Bit     ",
	(void *)Test_Lcd_Cstn_16Bit,			"CSTN 16Bit     ",

	(void *)Test_Lcd_Tft_8Bit_240320, 		"TFT240320 8Bit ",
	(void *)Test_Lcd_Tft_8Bit_240320_On,	"TFT240320 8 On ", 	 
	(void *)Test_Lcd_Tft_16Bit_240320,		"TFT240320 16Bit",
	(void *)Test_Lcd_Tft_8Bit_240320_Bmp, 	"TFT240320 Bmp  ",
	(void *)Test_Lcd_Tft_8Bit_240320_IntFr, "TFT240320 FrINT",
	(void *)Test_Lcd_Tft_8Bit_240320_IntFi, "TFT240320 FiINT",

	(void *)Test_Lcd_Tft_1Bit_640480, 		"TFT640480 1Bit ",
	(void *)Test_Lcd_Tft_8Bit_640480, 		"TFT640480 8Bit ",
	(void *)Test_Lcd_Tft_16Bit_640480,		"TFT640480 16Bit",

	(void *)Test_Lcd_Tft_8Bit_640480_Bswp,		"TFT640480 BSWP ",
	(void *)Test_Lcd_Tft_8Bit_640480_Palette,	"TFT640480 Palet",  
	(void *)Test_Lcd_Tft_16Bit_640480_Hwswp,	"TFT640480 HWSWP",

	(void *)Test_Lcd_Tft_1Bit_800600, 		"TFT800600 1Bit ",
	(void *)Test_Lcd_Tft_8Bit_800600, 		"TFT800600 8Bit ",
	(void *)Test_Lcd_Tft_16Bit_800600, 		"TFT800600 16Bit",
	
	(void *)Test_Lcd_Underrun,				"LCD Underrun   ",
	(void *)Test_Lcd_carling,				"LCD carling test ",

	0,0
};

#ifdef CARLING

void delay(unsigned int msDelay);
void TMR350_LCD_CONTROLER_SetUP16(void);
void InitSPI(void);
// int FPModuleInitial( void );	// cjl ToDo: 060922
void RGB_Start_PATTERN16(void);
void SPI_Write(unsigned char Index,unsigned short REG_DATA);

//******************************** TFT CONTROLER SETUP***********************************
//设置16位色
void TMR350_LCD_CONTROLER_SetUP16(void)
{    
	frameBuffer16BitTft240320=(U32 (*)[SCR_XSIZE_TFT_240320/4])LCDFRAMEBUFFER;

    delay(2000);

    rLCDCON1   =  (6           <<  8) |       /* VCLK = HCLK / ((CLKVAL + 1) * 2) -> About 7 Mhz  */
                           (0			<<  7)  |       /* 0 : Each Frame                                   */
                           (3           <<  5) |       /* TFT LCD Pannel                                   */
                           (12          <<  1) |       /* 16bpp Mode                                       */
                           (0           <<  0) ;       /* Disable LCD Output                               */
	rLCDCON2	=  (6           << 24) |   /* VBPD          :   3                              */
						   (239		    << 14) |   /* Virtical Size : 320 - 1                          */
						   (6           <<  6) |   /* VFPD          :   4                              */
						   (1           <<  0) ;   /* VSPW          :   2                              */
    rLCDCON3	=  (9           << 19) |   /* HBPD          :   6                              */ 
						   (319		    <<  8) |   /* HOZVAL_TFT    : 240 - 1                          */
						   (9           <<  0) ;   /* HFPD          :   6                              */
	         
	rLCDCON4	=  (0          <<  8) |    /* MVAL         :  13                              */
						   (6           <<  0) ;    /* HSPW         :   4                              */
	
	rLCDCON5	=  (0           << 12) |   /* BPP24BL       : LSB valid                        */
						   (1           << 11) |   /* FRM565 MODE   : 5:6:5 Format                     */
						   (1           << 10) |   /* INVVCLK       : VCLK Falling Edge                */
						   (1           <<  9) |   /* INVVLINE      : Inverted Polarity                */
						   (1           <<  8) |   /* INVVFRAME     : Inverted Polarity                */
						   (0           <<  7) |   /* INVVD         : Normal                           */
						   (0           <<  6) |   /* INVVDEN       : Inverted                         */
						   (0           <<  5) |   /* INVPWREN      : Normal                           */
						   (1           <<  4) |   /* INVENDLINE    : Normal                           */
						   (1           <<  3) |   /* PWREN         : Disable PWREN                    */
						   (1           <<  2) |   /* ENLEND        : Disable LEND signal              */
						   (0           <<  1) |   /* BSWP          : Swap Disable                     */
						   (1           <<  0) ;   /* HWSWP         : Swap Enable                      */

    rLCDSADDR1 = (((U32)frameBuffer16BitTft240320 >> 22)     << 21) | 
                          ((M5D((U32)frameBuffer16BitTft240320 >> 1)) <<  0);

    rLCDSADDR2 = M5D(((U32)frameBuffer16BitTft240320 + (LCD_XSIZE_TFT_240320 * LCD_YSIZE_TFT_240320 * 2)) >> 1);

    rLCDSADDR3 = (((LCD_XSIZE_TFT_240320 - LCD_XSIZE_TFT_240320) / 1) << 11) | (LCD_XSIZE_TFT_240320 / 1);        

    rTCONSEL   |= 0x0;
	rLCDINTMSK |= 0x3;
	rTPAL       = 0x0;        
    rLCDCON1   |= 1;
}

#if 0
void RGB_Start_PATTERN16(void)
{
    int x, y;
    unsigned int raw;
	unsigned short * frameptr16;
    frameptr16 =(unsigned short *) IMAGE_FRAMEBUFFER_UA_BASE;
    for( y = 0; y < 320; y++ ) {
    	if(y < 64)
    		raw = (0x1f<<11);	//RED
    	else if(y < 128)
    		raw = 0x0000;		//Black
    	else if(y < 192)
    		raw = 0xffff;		//White
    	else if(y < 256)
    		raw = (0x3f<<5);	//Green
    	else 
    		raw = (0x1f<<0);	//Blue
    	
    	for( x = 0; x < 240; x++ ) {
    		*frameptr16 = raw;
    		frameptr16++;
    		
    	}
    }
}
#endif
       
void InitSPI(void)
{
    //SPICLK,SPIMO,nCPU_RGB
    rGPECON = (rGPECON & ~(0x3f<<22)) | (0x2A<<22);//GPE13,12;SPICLK,SPIMOSI
                                                   //GPE11 setup to CS(output)
    rGPEUP |= (0x7<<11) | (1<<13);		//pull up disable register for port E (P9-14)

    
    rSPPRE0=0x30;						//Baud rate = PCLK/2/(Prescaler value+1) 
    rSPPIN0=(0<<2)|(1<<1)|(0<<0);       //set the SPI pin control register(P22-9)
    rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0); //set the SPI control register(P22-7) 

    delay(10);
    

    rGPBDAT &= ~(1<<10);		// Reset low active
    delay(2);					//2
    rGPBDAT |= (1<<10);			// Reset low active
  
	delay(150);

    SPI_Write(0x07,0x0000);        
    delay(500);
    
    SPI_Write(0x12,0x1618); 
    SPI_Write(0x11,0x2225);		//37.5khz 111b
    SPI_Write(0x13,0x40CA);
    SPI_Write(0x10,0x310C);		//310c 511c
    delay(1000);  
    SPI_Write(0x12,0x1658);
    delay(500);

    //Initializing Sequence
    SPI_Write(0x01,0x2B1D);
    SPI_Write(0x02,0x0300);
    SPI_Write(0x03,0xD000);
    SPI_Write(0x08,0x0008); 
    SPI_Write(0x09,0x0009); 
    SPI_Write(0x76,0x2213);
    SPI_Write(0x0B,0x33E0); 
    SPI_Write(0x0C,0x0020);
    SPI_Write(0x76,0x0000);
    SPI_Write(0x0D,0x0000);
    SPI_Write(0x0E,0x0000); 
    SPI_Write(0x14,0x0000); 
    SPI_Write(0x15,0x0803); 
    SPI_Write(0x16,0x0000); //pre-driving function avaliable-->disable 8
    SPI_Write(0x30,0x0209);
    SPI_Write(0x31,0x0404);  
    SPI_Write(0x32,0x0E07);
    SPI_Write(0x33,0x0602);  
    SPI_Write(0x34,0x0707);
    SPI_Write(0x35,0x0707);
    SPI_Write(0x36,0x0707);
    SPI_Write(0x37,0x0206); 
    SPI_Write(0x38,0x0F06);
    SPI_Write(0x39,0x0611);  
    delay(500);//2---->10
    SPI_Write(0x07,0x0001);
    delay(500);
    SPI_Write(0x07,0x0101);
    delay(500);
    SPI_Write(0x76,0x2213);
    SPI_Write(0x1C,0x7777);
    SPI_Write(0x0B,0x33E0);
    SPI_Write(0x76,0x0000);
   
    SPI_Write(0x07,0x0103);
}


void SPI_Write(unsigned char Index,unsigned short REG_DATA)
{
    unsigned char DeviceID = 0x74;	        
    unsigned char lcd_Index = (unsigned char)(Index & 0xff);
    unsigned char  lcd_data0 = (unsigned char)((REG_DATA >> 8)& 0xff);
    unsigned char  lcd_data1 = (unsigned char)( REG_DATA & 0xff);
     
    rGPGDAT   &=~(1<<2);              
    while(!(rSPSTA0&0x1));    //Check for Trasfer ready Flag high
    rSPTDAT0 = (DeviceID | 0x0);      //Send Device ID code
    while(!(rSPSTA0&0x1));    //Check for Trasfer ready Flag high
    rSPTDAT0 = 0x00;	     //Write register 8 bit
    while(!(rSPSTA0&0x1));    //Check for Trasfer ready Flag high
    rSPTDAT0 = lcd_Index;     //Write register 8 bit
    while(!(rSPSTA0&0x1));    //Check for Trasfer ready Flag high
    rGPGDAT  |= (1<<2);        //nLCD_CS high
    delay(1);
    
    rGPGDAT   &=~(1<<2);         
    while(!(rSPSTA0&0x1));    //Check for Trasfer ready Flag high
    rSPTDAT0 = (DeviceID | 0x2);      //Send Device ID code
    while(!(rSPSTA0&0x1));    //Check for Trasfer ready Flag high
    rSPTDAT0 = lcd_data0;     //Write the data first 8 bit
    while(!(rSPSTA0&0x1));    //Check for Trasfer ready Flag high
    rSPTDAT0 = lcd_data1;     //Write the data second 8 bit
    while(!(rSPSTA0&0x1));  
    rGPGDAT  |= (1<<2);        //nLCD_CS high
    //rGPCDAT  |=(1<<6);         //nLCD_CS high
    delay(1);                 //need to delay 50us
}

//int FPModuleInitial( void )	// cjl ToDo: 060922
void InitDisplay( void )
{
    // Follow the configuration order for setting the ports. 
	// 1) setting value(GPnDAT) 
	// 2) setting control register  (GPnCON)
	// 3) configure pull-up resistor(GPnUP)  

    rGPBDAT   |=(1<<0);
    rGPBUP    |= (1<<0);
    rGPBCON   &= ~(3<<0);
    rGPBCON   |= (1<<0);


    //GPD15~GPD11[31:22] ->set function pin VD[23]~VD[19]:10 10 10 10 10
    //GPD7~GPD2  [15: 4] ->set function pin VD[15]~VD[10]:10 10 10 10 10 10
    rGPDCON = 0xaaaaaaaa;
    rGPDUP  = 0xffffffff;  //pull up disable register for port D

    
    //GPC15~GPC11[31:22] ->set function pin VD[7]~VD[3]:10 10 10 10 10
    //GPC7[15:14] ->Set function pin LCDVF2:10
    //GPC6[13:12] ->Set Output pin:01(CS)
    //GPC5[11:10] ->Set Output pin:01(Reset)
    //GPC4[ 9: 8] ->Set function pin VM:10
    //GPC3[ 7: 6] ->Set function pin VFRAME:10
    //GPC2[ 5: 4] ->Set function pin VLINE:10
    //GPC1[ 3: 2] ->Set function pin VCLK:10
    //GPC0[ 1: 0] ->Set Output pin:01(backlight)
	rGPCCON = 0xaaaa56aa; //Initialize VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND    
	rGPCUP  = 0xffffffff; // Disable Pull-up register

    //****************************** LMS350QV_TEST_START *********************************
    TMR350_LCD_CONTROLER_SetUP16();
   // while(1)
    InitSPI();
    
    delay(10); 
}


#pragma optimize ("",off)
void delay(unsigned int msDelay)
{
	unsigned int i;
	unsigned int tick;
	tick=msDelay*60000;
	for(i=0;i<tick;i++);	
}
#pragma optimize ("",on)


#endif 

void Test_Lcd_carling(void)
{
	int i,j,k = 0;
	
	InitDisplay();	//屏初始化	
	
	for(j = 0; j < 320; j++){
		
		for(i = 0; i < 240; i++){
			_PutTft16Bit_320240(i, j, 0x5555);
   	    }
   	}
              	
	while(1);	
}

void Lcd_Test(void)
{
	int i;
	
	Uart_Printf("\n======  LCD Test program start ======\n");
		
	while(1)
	{
		i=0;
		Uart_Printf("\n\n");
		while(1)
		{   //display menu
			Uart_Printf("%2d:%s",i,func_lcd_test[i][1]);
			i++;
			if((int)(func_lcd_test[i][0])==0)
			{
				Uart_Printf("\n");
				break;
			}
			if((i%4)==0)
			Uart_Printf("\n");
		}

		Uart_Printf("\nPress only Enter key to exit : ");
		i = Uart_GetIntNum();
		if(i==-1) break;		// return.
		if(i>=0 && (i<((sizeof(func_lcd_test)-1)/8)) )	// select and execute...
			( (void (*)(void)) (func_lcd_test[i][0]) )();
	}
	
	Uart_Printf("\n====== LCD Test program end ======\n");
}


void Lcd_Port_Init(void)
{
    save_rGPCCON = rGPCCON;
    save_rGPCDAT = rGPCDAT;
    save_rGPCUP	 = rGPCUP;
    save_rGPDCON = rGPDCON;
    save_rGPDDAT = rGPDDAT;
    save_rGPDUP	 = rGPDUP;
    
    rGPCUP	=0xffffffff; // Disable Pull-up register
    rGPCCON	=0xaaaaaaaa; //Initialize VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND 
    rGPDUP	=0xffffffff; // Disable Pull-up register
    rGPDCON	=0xaaaaaaaa; //Initialize VD[23:8]
   
    Uart_Printf("Initializing GPIO ports..........\n");
}

void Lcd_Port_Return(void)
{
    rGPCCON	= save_rGPCCON;
    rGPCDAT	= save_rGPCDAT;
    rGPCUP	= save_rGPCUP;
    rGPDCON	= save_rGPDCON;
    rGPDDAT	= save_rGPDDAT;
    rGPDUP	= save_rGPDUP;
}

void Lcd_Palette1Bit_Init(void)
{
    U32* palette;
    
    palette		= (U32*)PALETTE;
    *palette++	= 0x0;		// Black
    *palette	= 0xffff;	// White
}

void Lcd_Palette8Bit_Init(void)
{
    int i;	
    U32 *palette;

	palette=(U32 *)PALETTE;
	
	if (rLCDCON5&(1<<11)){	// if 5:6:5 format
		for(i=0;i<256;i++){

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -