基于ARM S3C2410的LCD开发过程

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驱动的朋友告诉我该如何做修改,不甚感激!
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书面向由传统51单片机转向ARM嵌入式开发的硬件工程师、由硬件转嵌入式软件开发的工程师、没有嵌入式开发经验的软件工程师。分9个部分: 1、开发环境建立 2、S3C2410功能部件介绍与实验(含实验代码) 3、bootloader vivi详细注释 4、linux移植 5、linux驱动 6、yaffs文件系统详解 7、调试工具 8、GUI开发简介 9、UC/OS移植 通过学习第二部分,即可了解基于ARM CPU的嵌入式开发所需要的外围器件及其接口。对应的实验代码实现了对这些接口的操作,这可以让硬件工程师形成一个嵌入式硬件开发的概念。这部分也可以当作S3C2410的数据手册来使用。 一个完整的嵌入式linux系统包含4部分内容:bootloader、parameters、kernel、root file system。3、4、5、6部分详细介绍了这4部分的内容,这是linux底层软件开发人员应该掌握的。通过学习这些章节,您可以详细了解到如何在一个裸板上裁减、移植linux,如何构造自己的根文件系统,如何编写适合客户需求的驱动程序——驱动程序这章将结合几个经典的驱动程序进行讲解。您还可以了解到在用在nand flash上的非常流行的yaffs文件系统是如何工作的,本书将结合yaffs代码详细介绍yaffs文件系统。 第7部分介绍了嵌入式linux开发中使用gdb进行调试的详细过程。 此文档目前完成了1、2、3部分,后面部分将陆续完成。希望能对各位在嵌入式开发方面献上棉力。 欢迎来信指出文中的不足与错误,欢迎来信探讨技术问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值