📄 lcd.c
字号:
//====================================================================
// 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 + -