南昌金域华府户型图:基于ARM S3C2410的LCD开发过程
来源:百度文库 编辑:偶看新闻 时间:2024/04/29 15:26:33
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驱动的朋友告诉我该如何做修改,不甚感激!
背光电压:分为两种,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驱动的朋友告诉我该如何做修改,不甚感激!
怎么学好基于arm 嵌入式的编程
基于ARM的数据采集系统设计??
基于ARM的数据采集系统设计??
有人知道ARM的深入开发吗?
基于ARM的嵌入式系统的Bootloader 该怎么设计
基于ARM的数据采集通信系统设计??
ARM开发板 购买
arm开发平台是什么
谁做过"基于手机编程的电子像册"的开发?
长沙有没有ARM嵌入式系统开发的书卖
熟悉ARM开发环境ADS的请进来帮帮忙!
自行开发与arm兼容的芯片会侵权么?
基于组件开发 的基本概念与内容
基于LOTES的OA系统开发
基于互联网的进销存用什么语言开发
用S3C2410的实验板做基于嵌入式LINUX系统下的USB1.1接口驱动,请问各位大侠该如何做啊?
ARM开发板是什么东东?
ARM开发需要什么基础!
谁有ARM开发套件
Ajax技术 寻做过或正在做基于Backbase开发包的项目的同行。交流一下工作经验。
数码相机LCD保护贴是ARM材质还是PET材质的好?
大家有什么好的免费的不要积分的ARM书下载,最好是基于arm 的C编程,留下qq 交流嵌入式
基于 struts 的MVC设计模式的web应用程序开发
为什么不开发基于公有DHT网络的网络电视?