Chinaunix首页 | 论坛 | 博客
  • 博客访问: 274463
  • 博文数量: 55
  • 博客积分: 3030
  • 博客等级: 中校
  • 技术积分: 682
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-30 11:33
文章分类

全部博文(55)

文章存档

2011年(1)

2010年(12)

2009年(42)

我的朋友

分类: LINUX

2009-10-03 14:43:26

1.1 功能描述

  1.1.1 2410 LCD接口功能描述

  1)、2410 LCD支持以下功能的LCD:

 一、 STN 显示

1、 支持三种类型的STN LCD Panel 4位双扫描、4位单扫描和8位单扫描。

2、 支持单色、4级灰度和16级灰度。

3、 支持256色和4096色的彩色STN

4、 支持多种分辨率的屏幕:640*480,320*240,240*320,160*160等。虚拟的屏幕分辨率可以达到4096×10242048×20481024×4096

二、TFT 显示:

1、 支持1248 bpp(每象素编码位)的palettizedLCD TFT

2、 支持16bpp(5:5:5:1或者5:6:5(RGB))24bpp的非 palettized的真彩色TFT LCD

3、 支持多种LCD屏幕分辨率:800×600640×480320×240160×160等,虚拟的屏幕分辨率可以参考STN

22410的外部接口基本介绍

 VFRAME(FRM)/VSYNC/STV: 场同步信号(STN/TFT)帧同步信号LCD控制器和LCD驱动器之间的帧同步信号。该信号告诉LCD屏的新的一帧开始了。LCD控制器在一个完整帧显示完成后立即插入一个VFRAME信号,开始新一帧的显示;

VLINE(LOAD)/HSYNC/CPVLCD控制器和LCD驱动器之间的线同步脉冲信号,该信号用于LCD驱动器将水平线(行)移位寄存器的内容传送给LCD屏显示。LCD控制器在整个水平线(整行)数据移入LCD驱动器后,插入一个VLINE信号;

VCLK/LCD_HCLK: 象素时钟/数据偏移时钟 (STN/TFT)LCD控制器和LCD驱动器之间的像素时钟信号,由LCD控制器送出的数据在VCLK的上升沿处送出,在VCLK的下降沿处被LCD驱动器采样;


VD[230]: LCD象素数据总线,也就是我们说的RGB信号线,不过需要与硬件工程是配合的是他采用了哪种接线方法,2416位或其它。对于16TFT屏又有两种方式,在写驱动前你要清楚是565还是555I,这些与驱动的编写都有关系

VM/VDEN/TP: AC 转向信号(STN)/数据使能信号(TFT)VMLCD驱动器的AC信号。VM信号被LCD驱动器用于改变行和列的电压极性,从而控制像素点的显示或熄灭。VM信号可以与每个帧同步,也可以与可变数量的VLINE信号同步。

LEND/STH:  行结束信号(TFT)

LCD_PWREN: LCDpanel 电源使能信控制号(可以用它来控制电源的开关)

nDISP_OFF LCD数据显示开关使能信号(H: ON/LOFF

注意一下:LCD的电源电压,对于手持设备来说一般都为5V3.3V,如果LCD的需要的电源电压是5V,那就要注意,电压只有3.3V的电压需要提高到5V,否则你可能能将屏点亮.

32410 LCD 功能模块图

从上可以看出,9个控制信号由LCD的 5个控制寄存器 LCDCON1,2,3,4,5确定,数据由LCDCDMA数据发送,采取内存读写方式(DMA)。因此2410LCD占用了内存的读写时钟和刷新率,并且处于最高级别的内存读写和中断(除了nRESET)。详细的数据传输方式可以参考《2410datasheet.pdf》第370页。

4STN控制器功能描述

 STN控制器主要产生这几个控制信号:VMVCLKVFRAMEVLINELCD_PWRENnDISP_OFF。各自的计算公式如下:

  1VM信号是STN信号的行列极性转换控制信号,主要用于控制象素显示的开关,对于有的STN LCD panel可能并不需要这个AC bias 信号,而直接由VLINEVFRAME信号来确定极性,它的计算方式: 

           VM rate = VLINE rate/2*(MVAL)

它的计算由LCDCON1寄存器中的MMODE位和LCDCON4MVAL位确定,其中MVAL[7:0]可以参考2410手册。

2VLINEVFRAME信号主要由LCDCON2/3寄存器中的HOZVALLINEVAL的值来确定。而HOZVALLINEVAL分别和屏幕的实际分辨率有关系他们的计算公式如下:

     HOZVAL = (水平显示尺寸/输出VD数据线数量 -1)(对于单色屏)而对于彩色屏:

     HOZVAL = (水平显示尺寸×3)/输出VD数据线数量。

     比如对于四位双和单扫描,那么输出VD的数据线数量=4,而对于8位单扫描,那么VD的数据线数量=8

     LINEVAL = (垂直显示尺寸):对于单扫描格式。

     LINEVAL = (垂直显示尺寸/2)-1:对于双扫描格式。

3、 VCLK的信号由LCDCON1寄存器里面的CLKVAL值确定,它的计算公式如下:

VCLK = (系统总线时钟/CLKVAL×2),其中CLKVAL的值最小是2

4、 场同步信号VFRAME主要由下面公式确定:  

其中WLH [7:0] = 待设计LCD panel的数据手册里面要求的行同步信号VLINE(LOAD)的脉冲(高电平)的宽度(大于最小脉冲宽度同时小于最大脉冲宽度),一般的它的值由下面确定

WLH[72]的值是保留的,而WLH[10]的值可以参考LCD panel的数据手册。一般地:

00 = 16HCLK, 01 = 32HCLK

10= 48HCLK, 11 = 64HCLK

WDLY = 待设计LCD Panel的数据手册里面规定的前一个行同步信号下降沿后和后一个行同步信号的第一个象素时钟VCLK的上升沿之间的距离。一般的它的值由下面确定

WDLY [72]的值是保留的,而WDLY[10]的值可以参考LCD panel的数据手册。一般地:

00 = 16HCLK, 01 = 32HCLK

10= 48HCLK, 11 = 64HCLK

LINEBLANK:表示行同步信号之间插入的空象素时钟(不采集象素数据)。LINEBLANK = HCLK ×8

STN设计中,

WLH + WDLY + LINEBLANK >=(14+12×Tmax).

Tmax 表示最慢的内存访问周期。

 

5) STN 数据线控制:

 STN数据线一般根据扫描格式来:

  如果是4位单扫描,那么VD[3:0]直接和LCDDATA[3:0]相连接。

  如果是4位双扫描,那么VD[7:0]直接和LCDDATA[7:0]相连接。

  如果是8位单扫描,那么和4位双扫描一样。

 6TFT LCD 控制信号功能描述:

TFT LCD的控制信号主要由HSYNCVSYNCVCLKVMVDENLCD_PWRENnDISP_OFF确定。他们各自描述如下:

1、 VCLKTFT LCD的象素采集时钟由控制寄存器LCDCON1中的CLKVAL的值确定,计算公式如下:

VCLK = HCLK/ [(CLKVAL+1)*2]

CLKVAL的值最小是0

2、 HSYNCVSYNC/场同步信号由LCDCON2/3寄存器中的HOZVALLINEVAL值确定,计算公式如下:

HOZVAL = (水平显示尺寸)1

LINEVAL = (垂直显示尺寸)-1

3、 而场频确由下面公式确定:  

   其中参数如下(这些参数都有LCD panel的数据手册规定):

   VSPW:场同步信号脉冲宽度。

   VBPD:行同步信号周期(Vertical Back Porch Delay)。

   VFPD:场同步信号上升沿触发值钱和最后一个行同步信号下降沿之间的距离

          (Vertical Front Porch Delay)

   HSPW:行同步信号脉冲宽度。 

   HBPD:行同步信号下降沿到VDEN有效之间的延时(Hozival Back Porch Delay)。

   HFPD:前一个行同步信号结束信号LEND信号无效到下一个行同步信号有效之间的延时(Hozival Front Porch Delay)。

7TFT LCD的数据总线的RGB格式划分:

TFT LCD的数据线一般和显示模式有关,比如选择16bpp的,那么有两种显示

方式:RGB = 5:5:5:1,也有RGB = 5:6:5的,如果选择5:6:5那么,数据总线只要

16位就够了,具体如下:

其他的参考2410手册。

1.1.2 LCD Panel功能描述

  考虑到不同的LCD屏具有不同的参数设置,每个厂家,不同分辨率的屏都具

不同的参数设置,因此这里不一一列出,只是简单的罗列几个比较重要的参数需

特别注意

1、 显示方式

 到底是STN/TFT,还是其他,是彩色的STN还是单色的STN,都需要注意。

2、 外部接口

 如果是STN,那么要看清楚外部接口线路。如果是TFT,那么要看RGB比例和控制线路。

3、 逻辑供应电压

 2410输入输出的LCD的电压供给是3.3V,因此如果外部LCD的逻辑需要5V,那么需要外加电平转换芯片来进行电平转换。

4、 背景灯光点亮方式:一般分为两种方式:电压驱动比如CCFLCCFI等,这种方式要特别注意电压供给Vrms的值和输出电流大小,我们一般购买专有的变压器来完成设计。另外一种是电流驱动,比如EL,这种要特别注意电流的大小,比如60mA,这样只要背景灯光驱动电路输出给LCD一个60mA的电流就能够驱动或者点亮LCD

5、 如果是STN的,那么尤其要注意VCON的值,需要调整这个VCON来达到最佳显示比例,一般VCON同时还要注意是否有AC bias转换

1.程序分析

1.2.1让我们首先看一下RGB数据结构的定义
static struct lcd_rgb ***_lcd_rgb_16 = {
red: //-- offset:11 length:5
green: //-- offset:5 length:6
blue: //-- offset:0 length:5
transp: //-- offset:0 length:0
};
这是对16位色的RGB颜色进行定义,RGBI = 5650,即我们常说的565显示方式。
随便写一个16位数据的颜色数据(为了分析的方便,我把它写成二进制)
RGB = 10101101 10111001根据上面的结构定义我们来分析一下RGB各是多少(因为没有透明色,我们不去分析)
a) blue: {offset: 0, length: 5}偏移量为0,长度为5,我们从那个RGB中提取出来便是“11001”
b) green:{offset: 5, length: 6}偏移量为5,长度为6,我们从那个RGB中提取出来便是101101
c) red: {offset: 11, length: 5 }偏移量为11,长度为5,我们从那个RGB中提取出来便是10101
我们得到了一个RGB值为214525,就是这个颜色那么反过来,有了RGB的值我们该如何,因为RGB的有效位数都不足一个字节(8位),那我们只能忍痛割爱了,舍弃掉低位数据,代码如下:
r = R & 0xF8;
g = G & 0xFC;
b = B & 0xF8;
high = r | (g<<5);
low = (g<<3) | (b>>3);
color= (high << 8) | low;
记住,这段代码在GUI程序中是有用的


1.2.2 很重要的
a)颜色位数,bpp16如果你的LCD屏是TFT的,那一般都可以达到16位色或24位色,这也要看硬件怎么连接了,根据情况进行设置即可;
b) LCD屏的宽度和高度xres: 240,yres: 320这个就不用多说了,你的屏的分辨率是多少就设置成多少呗。
寄存器的设置,这些也不困难。下面就让我们一起一口一口的将S3C2410LCD寄存器统统吃掉!首先介绍一下我这块屏,这是日立的一块TFT屏,大小为640X240,可以支持到16位色。
看一下LCD寄存器1的设置
LINECNT--- 这是一个只读的数据,我们当然没有必要理它
CLKVAL--- 这可是一个很有用的参数,其实没必要管它后面的计算,我们可以通过实际的测试来得出一个有效的值
PNRMODE--- 这个应该不用多做解释,大家一看都明白了,对于TFT屏,只能设置成11,而对于CSTN屏,可能需要根据实际屏的信息去设置,我遇到的屏都设置成10,即8bit单扫描模式。

BPPMODE--- 这个参数更不用多说了吧,就是设置屏的颜色位数喽。

LCD控制器2,对于TFT屏必须要填
看一下图二LCD屏资料,对比一下得出如下信息:
LCD2_VBPD:
Vertical back po
LCD2_VFPD
Vertical front porc
LCD2_VSPW
Vsync Valid width
经过分析,我们知道了如何设置LCD2


LCD控制器3
对于TFT屏,很容易将HBPDHFPD找出来,如下
porch典型值为37
porch典型值为32
此处暂时不管
LCD3_HBPD:
Horizontal back
LCD3_HFBD:
Horizontal back
对于HOZVAL同样会在后面提到,
经过分析,我们知道了如何设置LCD3
LCD控制器4
对于TFT屏,需要设置HSPW的值,这个在LCD手册上也很容易_HSPW
典型值为5意思,有什么作用,我从来不动它,只取它最初的那个值13经过分析,我们知道了如何设置LCD4
LCD控制器5
这个寄存器的看起来比较复杂,但是无外乎这几类:
a.只读信息:VSTATUSHSTATUS只读的东东

b.TFT屏的颜色信息:BPP24BLFRM565TFT屏的颜色信息,这个我们在LCD的硬件连接时已经提到了,根据具体的接线方式,设置信息。
c.控制信号的极性这些信息主要是使S3C2410的信号输出极性与LCD屏的输入极性题,需要根据具体的硬件进行设置,较为常见的是vline/hsyncVFRAME/VSYNC脉冲的极性。
d.颜色信息的字节交换控制位:BSWPHWSWP
这两位用来控制字节交换和半字交换,主要用来大小头的问题,如果
输出到屏上的汉字左右互换了,或者输出到屏上的图花屏了,可以更改这个选项。


在此我给出12位色CSTN屏和16位色TFT的设置代码:
RGB Loopup Table Register
这三个寄存器的在驱动256CSTN屏的时候需要使用,我在别的芯片上使用过,因为这颗芯片支持12位色,所以没有去调试,我给出两组可能的值:
S3C44B0上的
rREDLUT = 0xFCA86420;
rGREENLUT = 0xFCA86420;
rBLUELUT = 0xFFFFFA50;
Jupiter上的
rREDLUT = 0xFEC85310
rGREENLUT = 0xFEC85310
rBLUELUT = 0xFB40
好了,各个寄存器的设置完成了,最后在驱动CSTN屏的时候需要提醒大家一句,CSTN的信号引脚中有一个叫VM/DISP的信号线,这个信号线的作用就是打开LCD的显示开关,让其进行显示,它可以接到任何一个GPIO口上。S3C2410中提供了一个VM信号,可以将LCD的这个信号与S3C2410VM信号相接即可,然后在驱动中一定要加上如下语句(蓝色选中部分)否则你的LCD可能没有任何显示哦(对于TFT屏不需要这个语句)驱动写好了,重新Make,下载就可以了。如果一切顺利,在TFT屏或256色的CSTN屏上会有一个漂亮的小蜻蜓(应该是蜻蜓吧)出现。注意,并不是蜻蜓出现了就代表你的驱动OK了,还要用GUI程序做进一步的测试,因为某一个或几个参数虽然不正确,但是仍然能够看到小蜻蜓的,但显示图形的时候就有问题了。另外,在驱动CSTN12位色的时候,我们在屏上看不到小蜻蜓(我的NCSTN屏上都没见到小蜻蜓),我想,可能是armLinux本身不支持12位色显示,或者我们某些地方没搞对的原因吧,但这不代表你的驱动有问题,用GUI程序写FrameBuffer,看看能否的到正确的结果。

1.GUI程序的编写
其实要在LCD上显示图像,说白了就是把数据(包含颜色)写到FrameBuffer中对应的位置就可以了用mmap函数使用户空间的一段地址关联到设备内存(FrameBuffer)上。无论何时,只要程序在分配的地址范围内进行读取或者写入,实际上就是对设备的访问,使用mmap可以既快速又简单地访问显示卡的内
存。对于象这样的性能要求比较严格的应用来说,直接访问能给我们提供很大不同。不过我曾将帮一个网友调试了一个S3C44B0上的GUI程序,在他的GUImmap函数总会出错,因为没有拿到他的硬件和驱动源码,没有分析出其中的原因,所以只得用write函数,直接向fb0写入数据,奇怪的是只写入一部分数据好像都不起任何作用,只得整屏数据写入才搞定了。这可就比较痛苦了,不过好在他只是写入的黑白数据,数据量还不是很大,要是彩色的那可真的痛苦了另外,我还想多啰嗦两句,FrameBuffer的像素点与LCD屏上的像素点的对应关系 ,深入了解一下对程序的理解可能会更清楚一点。我们知道黑白(2色)颜色用01就可以表示了,也就是1位数据就可以了,那1个字节就可以表示8位数据,假如这个字节是10101010FrameBuffer的偏移地址为0,则在LCD屏上便会显示出4个黑点,黑点中间会有4个白点出现(假如1是黑色);对于4色则用00011011就可以表示出四种颜色,即用两位数据可以表示一位数据,那同样是10101010,则对应于LCD屏上则显示的是颜色值为10,长度为48/2)的一条直线;同理,对于8位色(256色),则8位数据才能表示出一个点的颜色值,10101010LCD屏上就只能显示为颜色值为10101010的点了。
有了上面的基础我们就可以很好的理解这个语句了:即FrameBuffer的大小=LCD屏的宽度* LCD屏的高度*每像素的位数/每字节的位数
例如,一个320*240的黑白平,FrameBuffer的大小为
320 * 240 * 1 / 8 = 9600(字节)
而一个320 * 24016位色LCDFrameBuffer的大小则为

阅读(1940) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~