微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2410之LCD

S3C2410之LCD

时间:11-11 来源:互联网 点击:
1、打开LCD背光

将LCD背光对应的GPIO设置为禁止上拉(GPxUP相应位写入1),选择output类型(GPxCON相应位写入01),输出为高电平(GPxDAT相应位写入1)。
2、打开LCD电源

可以将GPG4选择为LCD_PWREN(GPGCON:9-8写入11),这时候LCD电源的打开/关闭可以通过LCDCON5:3来控制。
也可以自定义其他GPIO用作LCD电源开关,只需将此GPIO设置为禁止上拉(GPxUP相应位写入1),选择output类型(GPxCON相应位写入01),输出为高电平(GPxDAT相应位写入1)打开LCD电源。
3、设置其他信号线

其他信号线包括VD0-VD23和VFRAME、VLINE、VCLK等,分别在GPCCON,GPDCON中选择相应功能。
4、设置LCD的频率(VCLK)

LCD的Datasheet上一般会写有一个推荐的频率,比如我使用的屏幕推荐频率为6.4M,我需要通过一些计算选择一个合适的CLKVAL以产生这个频率:

对于TFT LCD,S3C2440提供的VCLK的计算公式为:
VCLK = HCLK / ((CLKVAL+1)*2)

可以得出:
CLKVAL = HCLK / (VCLK * 2) - 1

我的HCLK是100Mhz(CPU运行在400Mhz, CLKdiv_VAL设置为5,Fclk:Hclk:Pclk = 1:4:8),VCLK使用屏幕推荐的6.4M,得到:
CLKVAL = 100000000 / (6400000 * 2) - 1 = 6.8

选择最接近的整数值7,写入LCDCON1:17-8。

(VCLK其实就是根据 每秒帧数*帧行数*行像素 计算出来的,帧行数和行像素需要包含空白数和同步数)
5、设置其他相关参数

LCD相关的参数主要还有这几个:
LINEVAL: LCD水平像素-1,如320-1 = 319
HOZVAL: LCD垂直像素-1,如240-1 = 239
HFPD: 行开始前的VCLK时钟数(LCD屏幕的Datasheet一般有推荐值)
HBPD: 行结束后的VCLK时钟数(LCD屏幕的Datasheet一般有推荐值)
HSPW: 行之间水平同步的无效VCLK时钟数(LCD屏幕的Datasheet一般有推荐值)
VFPD: 帧数据开始前的空白行数(LCD屏幕的Datasheet一般有推荐值)
VBPD: 帧数据结束后的空白行数(LCD屏幕的Datasheet一般有推荐值)
VSPW: 帧之间垂直同步的无效行数(LCD屏幕的Datasheet一般有推荐值)

(相关寄存器LCDCON2, LCDCON3, LCDCON4)
6、设置视频缓冲区的地址

2440支持虚拟屏幕,可以通过改变LCD寄存器实现屏幕快速移动

PAGEWIDTH:虚拟屏幕一行的字节数,如果不使用虚拟屏幕,设置为实际屏幕的行字节数,如16位宽320像素,设为320 * 2
OFFSIZE:虚拟屏幕左侧偏移的字节数,如果不使用虚拟屏幕,设置为0

LCDBANK: 视频帧缓冲区内存地址30-22位
LCDBASEU: 视频帧缓冲区的开始地址21-1位
LCDBASEL: 视频帧缓冲区的结束地址21-1位

(相关寄存器LCDSADDR1,LCDSADDR2,LCDSADDR3)
7、确定信号的极性

2440的LCD控制器允许设置VCLK、VLINE、VFRAME等信号的极性(上升沿有效还是下降沿有效),需要对照LCD的Datasheet一一确认。

(相关寄存器LCDCON5)
8、禁止LPC3600/LCC3600模式!

如果不是使用三星LPC3600/LCC3600 LCD,必须禁止LPC3600/LCC3600模式(写入0到TCONSEL)!
9、打开视频输出

ENVID设为1 (LCDCON1:0写入1)

void Test_Lcd_Tft_8Bit_640480(void)
{
int i,j,k;
Lcd_Palette8Bit_Init();//调色板初始化,格式为 5:6:5 并赋值调色板的初始地址

void Lcd_Palette8Bit_Init(void)
{
int i;
U32 *palette;
rLCDCON5|=(1<11); // 5:6:5 Palette Setting
palette=(U32 *)PALETTE;
for(i=0;i<256;i++)
*palette++=DEMO256pal[i];
}
Lcd_Port_Init(); //LCD端口引脚初始化,包括第二功能,数据线及控制信号线等设置, Disable Pull-up registe
static 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]
}

Lcd_Init(MODE_TFT_8BIT_640480);//针对各模式下对帧缓冲起始地址及各控制寄存器rLCDCONn等进行相应设置等进行设置
void Lcd_Init(int type)
{
switch(type)
{......
case MODE_TFT_1BIT_640480:
frameBuffer1BitTft640480=(U32 (*)[SCR_XSIZE_TFT_640480/32])LCDFRAMEBUFFER;

/*//定义一个行数组指针extern U32 (*frameBuffer1BitTft640480)[SCR_XSIZE_TFT_640480/32],每行包括320个U32单元指针LCDFRAMEBUFFER进行强制类型转换后赋给frameBuffer8BitTft240320,即frameBuffer8BitTft240320指向LCDFRAMEBUFFER*/
rLCDCON1=(CLKVAL_TFT_640480<8)|(MVAL_USED<7)|(3<5)|(8<1)|0;
/*//#define CLKVAL_TFT_640480 (1)
//53.5hz @90Mhz
//VSYNC,HSYNC should be inverted
//HBPD=47VCLK,HFPD=15VCLK,HSPW=95VCLK
//VBPD=32HSYNC,VFPD=9HSYNC,VSPW=1HSYNC
// TFT LCD panel,8bpp TFT,ENVID=off 显示模式为TFT, VM速率为每帧一次,bpp为8bpp,禁止输出LCD视频数据及控制信号*/
rLCDCON2=(VBPD_640480<24)|(LINEVAL_TFT_640480<14)|(VFPD_640480<6)|(VSPW_640480);
rLCDCON3=(HBPD_640480<19)|(HOZVAL_TFT_640480<8)|(HFPD_640480);
rLCDCON4=(MVAL<8)|(HSPW_640480);
rLCDCON5=(1<11)|(1<9)|(1<8);//FRM5:6:5,HSYNC and VSYNC are inverted
rLCDSADDR1=(((U32)frameBuffer1BitTft640480>>22)<21)|M5D((U32)frameBuffer1BitTft640480>>1);
rLCDSADDR2=M5D( ((U32)frameBuffer1BitTft640480+(SCR_XSIZE_TFT_640480*LCD_YSIZE_TFT_640480/8))>>1 );
rLCDSADDR3=(((SCR_XSIZE_TFT_640480-LCD_XSIZE_TFT_640480)/16)<11)|(LCD_XSIZE_TFT_640480/16);
rLCDINTMSK|=(3);// MASK LCD Sub Interrupt
rLPCSEL&=(~7);// Disable LPC3600
rTPAL=0;// Disable Temp Palette
break;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top