分类: LINUX
2012-04-05 12:12:34
1.2.5 TFT(Thin Film Transistor)型... 3
4.2 SPI接口的12232图形点阵液晶的测试... 14
4.3 TTL接口的TFT液晶(群创3.5)的测试... 15
4.3.2 TFT液晶(群创3.5)与S3C2440的连接... 17
液晶显示器件在中国已有20多年的发展历史。这期间,液晶显示器件从实验室走向大规模生产,形成了独立的产业部门。液晶显示器件独具的低电压、微功耗、体积小、显示内容丰富、超薄轻巧的优点,使他可以直接与大规模集成电路结合开发出一系列具有便携显示功能的产品。这些产品不仅改变了人类生活甚至也改变了社会。例如,液晶显示的电子表、电子计算器、家用电器等等已经成为人们生活的必需品;液晶显示的移动通讯设备和笔记本电脑等已经成为人类经济活动的必备工具;液晶显示的仪器仪表、电器设备等几乎取代了传统的指针式或发光二极管显示的同类产品。也就是说,液晶显示几乎已经应用于生产、生活的各个领域。
1 常见的液晶模块液晶显示模块(LED MODULE,简称LCM)是一种将LCD显示器件及其驱动电路通过各种形式组合在一起的一种电气部件,对外提供简单的接口,使得各个行业的工程设计人员不需要了解复杂液晶驱动电路原理也可以方便的使用液晶显示器件。
1.1根据显示图形的不同分为以下几种 1.1.1段式显示模块段式显示模块主要用于显示数字,或围绕数字显示。在形式上总是围绕数字“8”的结构变化。例如电话的来电显示功能,只需要显示电话号码,这时,使用段式的显示模块就已经足够。段式显示被广泛应用于便携、袖珍设备上,例如各种数字仪表、计时器、计数器等。目前,该类模块的应用已经相当普及,基本上取代了8段LED数码管。
1.1.2字符型显示模块字符型液晶显示模块是一类专用于显示字母、数字、符号等的点阵型液晶显示模块。用于显示5×7点阵字符。液晶模块内部具有字符发生存储器(CGROM),他存储了两百多个不同的点阵字符图形,根据所带的字库的不同,CGROM可以包含里面的字符可以是:阿拉伯数字、英文字母的大小写,也可以是常用符号、日文片假名或者其他各国的字母。每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(4lH),显示时控制IC自动将4l H对应的CGROM中的点阵字符图形显示出来,就能在显示屏上看到字母“A”了。这类模块主要应用于比较高级的家用电器、仪器仪表以及便携设备,提供简单的信息
显示,实现人机交互功能。常见的有0801、0802、1601、1602等。
1.1.3图形点阵显示模块图形点阵显示模块常用于显示图形和文字。该类模块已经广泛应用于手机、MP3、PDA、数码相机等高端消费类电子产品,实现复杂的图形显示功能和汉字显示功能。使得人机界面变得越来越直观,尤其对于国内大多数需要有汉字和图形显示的用户来说,显示界面的友好与否,将直接影响到其产品的形象和市场竞争力。
1.2根据液晶类型的原理的不同分为以下几种 1.2.1 TN(Twist Nematic)型即扭曲向列型液晶。将涂有透明导电层的两片玻璃基板间夹上一层正介电异向性液晶,液晶分子沿玻璃表面平行排列,排列方向在上下玻璃之间连续扭转90°。然后上下各加一偏光片,底面加上反光片,基本就构成了TN型液晶。
1.2.2 STN(Super TN)型和TN型结构大体相同,只不过液晶分子扭曲180°,还可以扭曲210°或270°等,特点是电光响应曲线更好,可以适应更多的行列驱动。
1.2.3 TN或STN型TN或STN型液晶,一般是对液晶盒施加电压,达到一定电压值,对行和列进行选择,出现“显示”现象,所以行列数越多,要求驱动电压越高,因此往往TN或STN型液晶要求有较高的正极性驱动电压或较低的副极性电压,也因为如此,TN和STN型液晶难以做成高分辨率的液晶模块。
1.2.4 DSTN(Double STN) 型DSTN(Double STN) 型液晶,上下屏分别由两个数据通道传送数据,由于很多液晶屏内部增加了驱动电源的变换部分,所以无需外部输入高驱动电压,通常可以实现单电源供电。STN(DSTN)液晶只可以实现伪彩色(一般人眼可以分辨218色即262144色,所以达到218色和超过218色的被称之为真彩色,否则称之为伪彩色)显示,可以实现VGA、SVGA等一些较高的分辨率,但由于构成它们的矩阵方式是无源矩阵,每个像素实际上是个无极电容,容易出现串扰现象,从而不能显示真正的活动图像。
1.2.5 TFT(Thin Film Transistor)型TFT(Thin Film Transistor)型为薄膜晶体管有源矩阵液晶显示器件,在每个像素点上设计一个场效应开关管,这样就容易实现真彩色、高分辨率的液晶显示器件。现在的TFT型液晶一般都实现了18bit以上的彩色(218色),在分辨率上,已经实现VGA(640×480)、SVGA(800×600)、XGA(1024×768)、SXGA(1280×1024)甚至UXGA(1600×1200)。
液晶显示模块(LCDModule)简称“LCM”,是一种将液晶显示器件、连接件、集成电路、PCB线路板、背光源、结构件装配在一起的组件。
2液晶显示模块的接口在嵌入式的主流 LCD屏中主要支持两大类的硬件接口,一种是常见的RGB接口,另外一种是MCU接口.后面因为最早是针对单片机的领域在使用,因此得名.后在中低端手机大量使用,其主要特点是价格便宜的.MCU-LCD接口的标准术语是Intel提出的8080总线标准,因此在很多文档中用I80 来指MCU-LCD屏。其他的硬件借口还有SPI模式,VSYNC模式,MDDI模式等。
MCU-LCD屏它与RGB-LCD屏主要区别在于显存的位置.RGB-LCD的显存是由系统内存充当的,因此其大小只受限于系统内存的大小,这样RGB-LCD可以做出较大尺寸,象现在4.3"只能算入门级,而MID中7",10"的屏都开始大量使用.而MCU-LCD的设计之初只要考虑单片机的内存较小,因此都是把显存内置在LCD模块内部.然后软件通过专门显示命令来更新显存,因此MCU屏往往不能做得很大.同时显示更新速度也比RGB-LCD慢。显示数据传输模式也有差别。RGB屏只需显存组织好数据。启动显示后,LCD-DMA会自动把显存通过RGB接口送到LCM。而MCU屏则需要发送画点的命令来修改MCU内部RAM。(即不能直接MCU屏RAM)所以RGB显示速度明显比MCU快,而且播放视频方面,MCU-LCD也比较慢。
主要又可以分为8080模式和6800模式,这个主要是时序的区别。
2.1.1 M6800模式M6800模式支持可选择的总线宽度8/9/16/18-bit(默认为8位),其实际设计思想是与I80的思想是一样的,主要区别就是给模式的总线控制读写信号组合在一个引脚上(/WR),而增加了一个锁存信号(E)数据位传输有8位,9位,16位和18位。
2.1.2 I8080模式I80模式连线分为:CS/,RS(寄存器选择),RD/,WR/,再就是数据线了。优点是:控制简单方便,无需时钟和同步信号。缺点是:要耗费GRAM,所以难以做到大屏(QVGA以上)。
MCU接口标准名称是I80,管脚的控制脚有5个:
彩色TFT液晶屏主要有2种接口:TTL接口(RGB颜色接口), LVDS接口(将RGB颜色打包成差分信号传输)。TTL接口主要用于12.1寸一下的小尺寸TFT屏,LVDS接口主要用于8寸以上的大尺寸TFT屏。TTL接口线多,传输距离短;LVDS接口传输距离长,线的数量少。
大屏采用较多的模式,控制脚是VSYNC,HSYNC,VDEN,VCLK, S3C2440最高支持24个数据脚,数据脚是VD[23-0]。
CPU或显卡发出的图像数据是TTL信号(0-5V、0-3.3V、0-2.5V、或0-1.8V),LCD本身接收的也是TTL信号,由于TTL信号在高速率的长距离传输时性能不佳,抗干扰能力比较差,后来又提出了多种传输模式,比如LVDS、TDMS、GVIF、P&D、DVI和DFP等。他们实际上只是将CPU或显卡发出的TTL信号编码成各种信号以传输,在LCD那边将接收到的信号进行解码得到TTL信号。
但是不管采用何种传输模式,本质的TTL信号是一样的。
2.2.1 TTLTTL(Transistor Transistor Logic)即晶体管-晶体管逻辑,TTL电平信号由TTL器件产生。TTL器件是数字集成电路之一大门类,它采用双极型工艺制造,具有高速度、低功耗和品种多等特点。
TTL接口属于并行方式传输数据之接口,采用这种接口时,不必在液晶显示器之驱动板端和液晶面板端使用专用之接口电路,而是由驱动板主控芯片输出之TTL数据信号经电缆线直接传送到液晶面板之输人接口。由于TTL接口信号电压高、连线多、传输电缆长,因此,电路之抗干扰能力比较差,而且容易产生电磁干扰(EMI)。
在实际应用中,TTL接口电路多用来驱动小尺寸(15in以下)或低分辨率之液晶面板。另外,在笔记本电脑中也常使用1TL接口形式。
TTL输出接口之分类
TTL输出接口可分为以下几类:
(1)单路(或单通道)6bit TTL输出接口
这种接口电路中,采用单路方式传输,每个基色信号采用6bit数据(R0~R5,CO~G5,B0~B5)。由于基色RGB数据为18bit,因此,也称18位或18bit TTL接口。
(2)双路6bit TTL输出接口
这种接口电路中,采用双路方式传输,每个基色信号采用6bit数据(奇路为0RO~OR5,OG0~OG5,OB0~OB5;偶路为BRO~ER5,EC0~EG5,EB0~EB5)。由于基色ROB数据为36bit,因此,也称36位或36bit rrL接口。
(3)单路8bit TTL输出接口
这种接口电路中,采用单路方式传输,每个基色信号采用8bit数据(R0~R7,G0~G7,B0~B7)。由于基色RGB数据为24bit,因此,也称24位或24bit 1TL接口。
(4)双路8bit TTL输出位接口
这种接口电路中,采用双路方式传输,每个基色信号采用8bit数据(奇路为OR0~OR7,OG0~0G7,OB0~OB7;偶路为ER0~ER7,EC0~EG7,EB0~EB7),由于基色RGB数据为48bit,因此,也称48位或48bit TTL接口。
TLL输出接口中之信号
驱动板TTL输出接口中一般包含RGB数据信号、时钟信号和控制信号这三大类信号。
(1)RGB数据信号
对于6bit单路TTL输出接口,共有18条RGB数据线,分别是R0~R5红基色数据6条,C0~C5绿基色数据6条,B0~B5蓝基色数据6条。
对于8bit单路TTI,输出接口,共有24条RGB数据线,分别是R0~R7红基色数据8条,B0~B7绿基色数据8条,BO~B7蓝基色数据8条。
对于6bit双路TTL,输出接口,共有36条RGB数据线,分别是奇路RGB数据线18条,偶路RGB数据线18条。
对于8bit双路TTL输出接口,共有48条RGB数据线,分别是奇路RGB数据线24条,偶路RGB数据线24条。
(2)时钟信号
时钟信号是指像素时钟信号,是传输数据和对数据信号进行读取之基准。像素时钟常用DCLK表示。在使用奇/偶像素双路方式传输RGB数据时,不同之输出接口使用像素时钟之方法有所不同。有之输出接口奇/偶像素双路数据共用一个像素时钟信号,有之输出接口奇/偶两路分别设置奇数像素数据时钟和偶数像素两个时钟信号,以适应不同液晶面板之需要。
(3)控制信号
控制信号包括数据使能信号(或有效显示数据选通信号)DE、行同步信号HS、场同步信号VS。
2.2.2LVDS输出接口
液晶显示器驱动板输出之数字信号中,除了包括RGB数据信号外,还包括行同步、场同步、像素时钟等信号,其中像素时钟信号之最高频率可超过28MHz。采用TTL接口,数据传输速率不高,传输距离较短,且抗电磁干扰(EMI)能力也比较差,会对RGB数据造成一定之影响;另外,TTL多路数据信号采用排线之方式来传送,整个排线数量达几十路,不但连接不便,而且不适合超薄化之趋势。采用LVDS输出接口传输数据,可以使这些问题迎刃而解,实现数据之高速率、低噪声、远距离、高准确度之传输。
LVDS,即Low Voltage Differential Signaling,是一种低压差分信号技术接口。它是美国NS公司(美国国家半导体公司)为克服以TTL电平方式传输宽带高码率数据时功耗大、EMI电磁干扰大等缺点而研制之一种数字视频信号传输方式。
LVDS输出接口利用非常低之电压摆幅(约350mV)在两条PCB走线或一对平衡电缆上通过差分进行数据之传输,即低压差分信号传输。采用LVDS输出接口,可以使得信号在差分PCB线或平衡电缆上以几百Mbit/s之速率传输,由于采用低压和低电流驱动方式,因此,实现了低噪声和低功耗。目前,LVDS输出接口在17in及以上液晶显示器中得到了广泛之应用。
2.3VSYNC模式该模式是在MCU模式下增加了一根VSYNC(帧同步)信号线而已,应用于运动画面更新。
2.4 SPI模式采用较少,连线为CS/,SLK,SDI,SDO四根线,连线少但是软件控制比较复杂。
2.5 MDDI模式高通公司于2004年提出的接口MDDI(Mobile Display Digital Interface),通过减少连线可提高移动电话的可靠性并降低功耗,这将取代SPI模式而成为移动领域的高速串行接口。连线主要是host_data,host_strobe,client_data,client_strobe,power,GND几根线。
3控制芯片的选型为了更方便的测试各种液晶显示屏(M6800接口的1602字符型液晶、SPI接口的12232图形点阵液晶、TTL接口的TFT液晶),选用S3C2440作为控制芯片。S3C2440内部资源非常丰富:有117个GPIO(可模拟M6800总线时序来控制1602字符型液晶),SPI 接口可直接与具有SPI接口的12232图形点阵液晶通信,LCD控制器支持TTL接口的液晶显示屏。
4测试方案 4.1 M6800接口的1602字符型液晶的测试1602液晶是字符液晶,只能显示字符,通过自定义字符功能(CGRAM)可显示简单的汉字。
4.1.1 接口信号 4.1.2 RAM地址映射控制器内部带有80*8位(80B)的RAM缓冲区,对应关系如下图:
当我们向上图的00-0F、40-4F地址中任一处写入数据时,液晶都可以立即显示出来,当写入10-27或50-67地址处时,必须通过移屏指令将他们移入可显示区域方可正常显示。
4.1.3 指令说明(附件) 4.1.4 1602与S3C2440的连接LCD1602共有16根管脚,控制信号3根RS,RW,RE,数据线8根DB0~DB7,可以支持8位数据格式和4位数据格式。
RS:寄存器选择1:数据;0:指令【由GPB8控制】
R/W:读、写操作选择1:读;0:写【由GPB9控制】
RE:使能信号【由GPB10控制】
数据线DB0~DB7,分别连接8根GPIO口(GPB0- GPB7)。
4.1.5 linux下的驱动程序首先内核注册驱动函数:
static unsigned long lcddata_table [] =
{
S3C2410_GPB0,
S3C2410_GPB1,
S3C2410_GPB2,
S3C2410_GPB3,
S3C2410_GPB4,
S3C2410_GPB5,
S3C2410_GPB6,
S3C2410_GPB7,
};
static unsigned long lcdctl_table [] =
{
S3C2410_GPB8,
S3C2410_GPB9,
S3C2410_GPB10,
};
static unsigned int lcddata _cfg_table [] =
{
S3C2410_GPB0_OUTP,
S3C2410_GPB1_OUTP,
S3C2410_GPB2_OUTP,
S3C2410_GPB3_OUTP,
S3C2410_GPB4_OUTP,
S3C2410_GPB5_OUTP,
S3C2410_GPB6_OUTP,
S3C2410_GPB7_OUTP,
};
static unsigned int lcdctl _cfg_table [] =
{
S3C2410_GPB8_OUTP,
S3C2410_GPB9_OUTP,
S3C2410_GPB10_OUTP,
};
static int__init mylcd_init(void)
{
int i;
int ret = 0;
for(i = 0;i < 8;i++){
s3c2410_gpio_cfgpin(lcddata_table[i], lcddata _cfg_table [i]);
}
for(i = 0;i < 3;i++){
s3c2410_gpio_cfgpin(lcdctl_table [i],lcdctl _cfg_table [i]);
}
//初始化GPIO为输出
ret=register_chrdev(LCD_MAJOR,DEVICE_NAME,&mylcd_fops);
if(ret <0){
printk(KERN_WARNING"Cannot register driver of mylcd\n");
return ret;
}
printk(DEVICE_NAME" Init Is Ok\n");
return 0;
}
驱动注销函数
static void__exit mylcd_exit(void)
{
unregister_chrdev(LCD_MAJOR,DEVICE_NAME);
printk(KERN_INFO " remove driver ofmyLCD\n");
}
module_init(mylcd_init);
module_exit(mylcd_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ce123");
MODULE_DESCRIPTION("mylcddriver for s3c2440");
驱动文件操作结构体,对外提供IOCTL接口:
staticstruct file_operations mylcd_fops = {
.owner = THIS_MODULE,
.ioctl = mylcd_ioctl,
.open = mylcd_open,
.release = mylcd_release
};
驱动的open和release函数的实现:
static intmylcd_open(struct inode *inode,struct file *file)
{
return 0;
}
static intmylcd_release(struct inode *inode,struct file *file)
{
return 0;
}
ioctl函数的实现:
static intmylcd_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned intarg)
{
if(_IOC_TYPE(cmd) != GPIO_IOF_MAGIC)
{
return -ENOTTY;
}
if(_IOC_NR(cmd) >= GPIO_MAXNR)
{
return -ENOTTY;
}
switch(cmd)
{
caseLCD_INIT: //初始化
myLcd_port_init();
break;
case LCD_SCREEN_CLEAR: //清屏
myLcd_Screen_Clear();
break;
case LCD_CURSOR_RETURN: //归位
myLcd_Cursor_Home();
break;
case LCD_DDRAM_AD_SET: //设置DDRAM地址
myLcd_ddram_ad_set(arg);
break;
caseLCD_DATA_WRITE: //写数据
myLcd_data_write(arg);
break;
default:
break;
}
return 0;
}
这里只列出发送数据驱动函数,其他的函数根据M6800的时序设计相应GPIO的即可。
void myLcd_data_write (unsigned char data)
{
s3c2410_gpio_setpin(S3C2410_GPB0, (data>>0)&0x1);
s3c2410_gpio_setpin(S3C2410_GP B1, (data>>1)&0x1);
s3c2410_gpio_setpin(S3C2410_GP B2, (data>>2)&0x1);
s3c2410_gpio_setpin(S3C2410_GP B3, (data>>3)&0x1);
s3c2410_gpio_setpin(S3C2410_GP B4, (data>>4)&0x1);
s3c2410_gpio_setpin(S3C2410_GP B5, (data>>5)&0x1);
s3c2410_gpio_setpin(S3C2410_GP B6, (data>>6)&0x1);
s3c2410_gpio_setpin(S3C2410_GP B7, (data>>7)&0x1);
}
因为对LCD的功能要求比较简单,所以只是提供了上面这些功能,当然,LCD1602还有很多接口可以对外提供:比如自定义字符等。
另外,附上针对这个LCD写的上层接口函数:
intOpenLcd(const char *lcd_name)
{
int Lcd_fd;
if(access(lcd_name,F_OK) == 0){
printf("%s Can Beopened!\n",lcd_name);
}else{
system("mknod /dev/myLcd c204 0");
}
Lcd_fd = open(lcd_name,O_RDWR);
if(Lcd_fd < 0){
printf("Open %s IsFailed!\n");
return 0;
}
printf("Open The Screen!\n");
return Lcd_fd;
}
voidCloseLcd(int Lcd_fd)
{
printf("Close The Screen!\n");
close(Lcd_fd);
}
voidInitLcd(int Lcd_fd)
{
printf("Init The Screen!\n");
ioctl(Lcd_fd,LCD_INIT,0);
}
voidClearLcd(int Lcd_fd)
{
printf("Clear The Screen!\n");
ioctl(Lcd_fd,LCD_SCREEN_CLEAR,0);
ioctl(Lcd_fd,LCD_CURSOR_RETURN,0);
}
voidPrintfLcd(int Lcd_fd,const char *src,unsigned int pos)
{
int src_len = 0;
int i;
src_len = strlen(src);
if((pos >= 0)&&(pos <= 32)){
if(src_len <= (32-pos)){
ioctl(Lcd_fd,LCD_DDRAM_AD_SET,pos);
for(i = 0;i ioctl(Lcd_fd,LCD_DATA_WRITE,src[i]); } }else{ printf("The Lcd Is Not Enough Length\n"); } }else{ printf("ThePos Is Out Size Of Address\n"); } } 以下是测试应用程序: int main(intargc, char *argv[]) { int Lcd_fd; Lcd_fd = OpenLcd(DEV_NAME); InitLcd(Lcd_fd); PrintfLcd(Lcd_fd,"AAAABBB",0); PrintfLcd(Lcd_fd,"FFFFFFFFFFF",16); sleep(10); ClearLcd(Lcd_fd); PrintfLcd(Lcd_fd,"AAAABBB",0); PrintfLcd(Lcd_fd,"DDDDDDDD",16); CloseLcd(Lcd_fd); } 12232液晶与1602液晶的原理基本一致,12232液晶属于图形液晶,能显示汉字。 1.Vss 电源地 2.Vdd 电源正极 3.VO 液晶显示对比度调节端 4.SCLK 串行同步时钟,上升沿读取SDI数据 5.SID 串行数据输入端 6.CS 片选,高电平有效 7.BLA 背光电源正极 8.BLK 背光电源负极 这里没有加入背光,3端的对比度端接一10K欧的电位器的滑动端,电位器另两端分别接Vcc(5V)和GND,Vss端接地,SCLK与S3c2440的SPICLK0(或者SPICLK1,S3c2440有两个SPI接口)相连,SID与S3c2440的SPIMIO0(或者SPIMIO1,S3c2440有两个SPI接口)相连,CS与S3c2440的SS0(或者SS1,S3c2440有两个SPI接口)相连。 要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多的MCU内部都集成了LCD控制器,如S3C2410/2440等。通过LCD控制器就可以产生LCD驱动器所需要的控制信号来控制STN/TFT屏了。 S3C2440内部LCD控制器结构图: 我们根据数据手册来描述一下这个集成在S3C2440内部的LCD控制器: a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器组成; b:REGBANK由17个可编程的寄存器组和一块256*16的调色板内存组成,它们用来配置LCD控制器的; c:LCDCDMA是一个专用的DMA,它能自动地把在侦内存中的视频数据传送到LCD驱动器,通过使用这个DMA通道,视频数据在不需要CPU的干预的情况下显示在LCD屏上; d:VIDPRCS接收来自LCDCDMA的数据,将数据转换为合适的数据格式,比如说4/8位单扫,4位双扫显示模式,然后通过数据端口VD[23:0]传送视频数据到LCD驱动器; e:TIMEGEN由可编程的逻辑组成,他生成LCD驱动器需要的控制信号,比如VSYNC、HSYNC、VCLK和LEND等等,而这些控制信号又与REGBANK寄存器组中的LCDCON1/2/3/4/5的配置密切相关,通过不同的配置,TIMEGEN就能产生这些信号的不同形态,从而支持不同的LCD驱动器(即不同的STN/TFT屏)。 LCD提供的外部接口信号: VSYNC/VFRAME/STV:垂直同步信号(TFT)/帧同步信号(STN)/SEC TFT信号; 所有显示器显示图像的原理都是从上到下,从左到右的。一副图像可以看做是一个矩形,由很多排列整齐的点一行一行组成,这些点称之为像素。那么这幅图在LCD上的显示原理就是: A:显示指针从矩形左上角的第一行第一个点开始,一个点一个点的在LCD上显示,在上面的时序图上用时间线表示就为VCLK,我们称之为像素时钟信号; 上面时序图上各时钟延时参数的含义如下:(这些参数的值,LCD产生厂商会提供相应的数据手册) VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数,对应驱动中的upper_margin; 对于以上这些参数的值将分别保存到REGBANK寄存器组中的LCDCON1/2/3/4/5寄存器中:(对寄存器的操作请查看S3c2440数据手册LCD部分)。 帧缓冲是Linux为显示设备提供的一个接口,它把一些显示设备描述成一个缓冲区,允许应用程序通过FrameBuffer定义好的接口访问这些图形设备,从而不用去关心具体的硬件细节。对于帧缓冲设备而言,只要在显示缓冲区与显示点对应的区域写入颜色值,对应的颜色就会自动的在屏幕上显示。LCDSADDR1- LCDSADDR3用于设置帧内存的地址。 本实例从串口输出一个菜单,从中选择各种方法进行测试,比如画线、画圆、显示单色、使用调色板等。与LCD相关的代码有3个文件:lcddrv.c、framebuffer.c和lcdlib.c(以及相应的头文件)。 lcddrv.c封装了对LCD控制器、调色板的访问函数,可设置LCD的显示模式、开启/关闭LCD、设置调色板等。 framebuffer.c直接操作帧缓存区,实现了画点、画线、话画同心圆、清屏等函数。 lcdlib.c调用前两个文件提供的函数在LCD上进行各种操作。 程序的机构如下图:
HSYNC/VLINE/CPV:水平同步信号(TFT)/行同步脉冲信号(STN)/SEC TFT信号;
VCLK/LCD_HCLK:象素时钟信号(TFT/STN)/SEC TFT信号;
VD[23:0]:LCD像素数据输出端口(TFT/STN/SEC TFT);
VDEN/VM/TP:数据使能信号(TFT)/LCD驱动交流偏置信号(STN)/SEC TFT 信号;
LEND/STH:行结束信号(TFT)/SEC TFT信号;
LCD_LPCOE:SEC TFT OE信号;
LCD_LPCREV:SEC TFT REV信号;
LCD_LPCREVB:SEC TFT REVB信号。
B:当显示指针一直显示到矩形的右边就结束这一行,那么这一行的动作在上面的时序图中就称之为1 Line;
C:接下来显示指针又回到矩形的左边从第二行开始显示,注意,显示指针在从第一行的右边回到第二行的左边是需要一定的时间的,我们称之为行切换;
D:如此类推,显示指针就这样一行一行的显示至矩形的右下角才把一副图显示完成。因此,这一行一行的显示在时间线上看,就是时序图上的HSYNC;
E:然而,LCD的显示并不是对一副图像快速的显示一下,为了持续和稳定的在LCD上显示,就需要切换到另一幅图上(另一幅图可以和上一副图一样或者不一样,目的只是为了将图像持续的显示在LCD上)。那么这一副一副的图像就称之为帧,在时序图上就表示为1 Frame,因此从时序图上可以看出1 Line只是1 Frame中的一行;
F:同样的,在帧与帧切换之间也是需要一定的时间的,我们称之为帧切换,那么LCD整个显示的过程在时间线上看,就可表示为时序图上的VSYNC。
VFBD(vertical front porch):表示在一帧图像结束后,垂直同步信号以前的无效的行数,对应驱动中的lower_margin;
VSPW(vertical sync pulse width):表示垂直同步脉冲的宽度,用行数计算,对应驱动中的vsync_len;
HBPD(horizontal back porch):表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数,对应驱动中的left_margin;
HFPD(horizontal front porth):表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数,对应驱动中的right_margin;
HSPW(horizontal sync pulse width):表示水平同步信号的宽度,用VCLK计算,对应驱动中的hsync_len;