Chinaunix首页 | 论坛 | 博客
  • 博客访问: 971569
  • 博文数量: 261
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 3420
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-24 12:10
个人简介

https://smart888.taobao.com/ 立观智能监控

文章分类

全部博文(261)

文章存档

2011年(1)

2010年(4)

2009年(256)

我的朋友

分类: LINUX

2009-05-15 09:51:43

TFT LCD系统基本上由三部分构成:TFT主控制器、LCD驱动电路和单片LCD。其中TFT控制器产生符合TFT接口格式的控制信号。但是,市面上的LCD 种类太多,而且各自的时序都不一样,所以我们一般需要一个LCD驱动电路将TFT接口的信号转化到符合目标LCD的特定的LCD接口信号。这就是我们所看到了LCD背后总会有一块PCB板的原因之一。LCD驱动电路除了充当时序转换的角色外,还负责提供LCD正常工作所需要的各种电压,包括:
背光电压:分为两种,LED型(21.6V左右);CCFL型(360~500V交流)
Gate电压:一般为正负15V
Commom电压:一般为2V左右的交流电压
Analog Vcc:一般为5V
Digital Vcc:一般为3.3V
Gray level reference Voltage:我最近在好几块屏上都发现需要这个电压。这是一组电压,一般有V0~V10,每个电压的值都在0~5V之间,而且是交流电压,要求随行同步信号一起变化。这个我不知道怎么驱动,明白的朋友烦请告诉我一声!

二. TFT接口时序说明
很多朋友对得S3C2410 TFT液晶接口的时序比较烦,其实解剖开来非常简单。先来看TFT接口的信号线,我们以16bit为例,信号线共5组20根:
¢ VD[23:19]、VD[15:10]、VD[7:3]:分别对应R、G、B分色信息,一个16bit的组合代表了一个象素的信息。
¢ VCLK:数据传输时钟,在数据有效的情况下(VM),每个周期传输一个象素的信息。
¢ HSYNC:行同步信号,持续若干个时钟周期,表示新的一行传输即将开始。
¢ VSYNC:帧同步信号,持续若干个行周期,表示新的一帧传输将开始。
¢ VDEN:数据有效指示,该信号有效下的数据长度刚好为1行。
另外,S3C2410还提供了LEND信号表示一行结束,该信号大可不必理会。
现在我们来讨论时序,有一点我们明白:那就是一个VCLK周期传输一组VD信号,从而给一个pixel着了色。

从这里开始展开,以240X320的屏为例,现在要点亮一行,那么肯定要有240个VCLK周期将240个pixel的VD值输出,而且这240个周期内 VDEN应该一直是有效的。现在我们的思路从点扩展到了行,理想情况下,两行之间不需要间隔,也就是说这一行结束马上传输下一行的第一个pixel的 VD。但是这样做并不好,因为一个点的偏差会造成满盘皆输。因此我们引入了行同步HSYNC信号,也就是说在传输完一行的数据后,先歇一会儿,等待若干个时钟(我们称之为后插入等待周期);然后我们送一个行同步信号,当然这个信号的有效周期数我们也能控制(我们称之为同步周期);之后呢,我们在等一会,让 LCD驱动电路准备好接收,我们在把一行的数据发下去(这个等待时间我们称之为前插入等待周期)。好了,有了这个说明后我们可以把行显示的时序给出来了:(S3C2410 datasheet, Figure 15-6)

从图中我们可以看到:HSPW+1、HBPD+1、HFPD+1就是我们分别定义了同步周期、前插入等待周期、后插入等待周期。而HOZVAL+1则是一行的有效象素数目。这些都可以在寄存器里面进行设置。

说完行与行之间的显示,我们就可以扩展到帧与帧之间的显示。我们很容易想到,在帧的领域里面也应该是类似于行的结构,同样包含了同步周期、前插入等待周期、后插入等待周期,给出时序图:S3C2410 datasheet, Figure 15-6

需要注意的是:在帧的领域里,我们所说的周期单位是一行;而在行的时候,我们所说的周期单位是VCLK时钟周期。
经过上述的分析,我们可以把TFT LCD的接口归纳到8个参数上:HSPW、HBPD、HFPD、HOZVAL、VSPW、VBPD、VFPD、LINEVAL。另外,通过上述分析,我们可以看到,显示一帧图像总共需要的VCLK周期为:(HSPW+HBPD+HFPD+HOZVAL+4)X(VSPW+VBPD+VFPD+ LINEVAL+4),VCLK是可调的,因此通过选择适当的分频比保证帧率在60Hz左右就可保证液晶的正常工作了。

三. 数据buffer和Scrolling实现说明
很多人可能都会问驱动LCD的数据应该放在什么地方,是怎么被搬运过去的。其实很简单,S3C2410的LCD控制模块自带了DMA控制器,我们只要在SDRAM里面开一块空间,然后设定要DMA的起始地址(LCDSADDR1寄存器)和结束地址(LCDSADDR2)
就OK了。
不过S3C2410的寄存器提供了一种滚动的显示模式,这个主要是靠LCDSADDR3寄存器实现的。理解起来可能有些麻烦,我们可以这样想象:滚动显示的含义就好比是我们拿着一个放大镜在大地图上移动,而放大镜下方的图像就是我们应该显示的东西。假设LCD的大小还是240X320的,我们在SDRAM 中开了一个480X640个象素的缓冲区,相当于四倍图像的大小。那么如果我们要截取一块240X320方形画面,就要在取完一行的数据(PAGEWIDTH=240)以后跳过OFFSIZE(此处240)个象素(对于16bit)再取数据,得到的才是大画面里对应的下一行数据。总而言之,滚动显示是一种用空间来换取软件效率的方法。需要注意的是,OFFSIZE和PAGEWIDTH的值必须和LCD的大小已经缓冲区的实际尺寸对应上,不然屏幕就乱闪了;另外,LCDSADDR2指向的是整个大缓冲区之后的第一个地址。

四. 调试经过
这两天新板子还没有到,所以有点闷。看到老板那里有一块液晶,就拿过来先玩起来。该LCD是华恒S3C2410的配套产品,型号为sharp的LQ035Q7DB02,3.5寸,240X320,16bit TFT,带触摸屏。

由于接口不兼容的,所以只好把一端的插槽剪掉,一根根线直接往我的板子焊,这种脏活干多了也没什么感觉了。弄好之后就开始跑2410test软件了,因为原先看过TFT接口了,知道有几个参数是肯定要改的,也就是我前面说的。但是奇怪的是无论我怎么改,屏幕的中间总是有一条黑带无法显示。我尝试着全屏显示一种颜色(0xf800),但是还是有好几个区域是黑色的。这个问题一直从昨天下午开始纠缠到晚上,很郁闷。对于弄惯硬件的我来说,忍不住想看看2410 输出的时序是不是正确的。行好板子上有FPGA,因此我就借助quarters的SignalTap抓TFT的几个输出信号。不看不知道,一看吓一跳,信号完全不对,HSYNC和VSYNC的输出极性是反的,而且前后的插入周期也和我配置的大不相同。奇怪的是不管我怎么改,输出基本上都是那个样子, HSYNC和VSYNC的输出极性始终是反的。我开始怀疑这块S3C2410出了问题。

一个晚上也在郁闷中过去了,带了一本S3C2410的Datasheet爬上床,想在睡觉前在把LCD控制模块好好读读。翻了几页,我又看到 LPC3600这个东西,前几次也看到过,但是不知道是什么东西,网上搜了一下网友们也大多说不明白,所以就没深究。但是直觉告诉我,肯定和它有关。我细细看了一下,终于明白这个家伙是干什么的了。实际上是三星在3C2410里面直接包含了一个LCD控制器,就相当于我们前面说的LCD驱动电路的时序转换部分,该控制器LPC3600就是面向他们自己的LCD LTS350Q1-PD1/2的。三星这么做应该说出于两个目的:1,节省自身的系统开发成本,他们用2410做产品的时候就不用外加芯片完成时序转换功能了;2,推销自己的LCD产品。但是对我们使用其它公司的LCD产品时,这个模块显然是没有用的。而我在读2410test代码的时候,记得是将它使能的。可以说,我的直觉越来越强烈,可惜要睡觉了,只能把结
果留到第二天。
今天一大早就起来了,我隐约记得这一个念头甚至在梦里都出现了。我的想法立刻得到了验证,图像已经能全屏显示了,除了顶底一两行的不正常之外,别的都OK了,时序一抓也正常。

总结得到两点:1,当外接其它显示屏的时候,LPCSEL寄存器一定要清零。
2,调试不能蛮干,一时的灵感胜过一天的苦力。

接下来的事情就简单了,我开始调整参数以确保全屏的正常显示。要指出的是,垂直方向的问题并不一定是V类的参数出了问题,也可能是H方向上的参数没有调整对产生的。

接下来,要在WINCE和Linux上进行LCD参数的设置,烦请wince下做过LCD驱动的朋友告诉我该如何做修改,不甚感激!
阅读(1467) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~