LCD驱动编写小结

推荐文章
S3C2410LCD驱动程序的移植及GUI程序.pdf

3.1
背光:对于大部分的彩色LCD一定要接背光,我们才能看到屏上的内容;
3.2
控制信号:不同的LCD厂商对于控制信号有不同的叫法,
VFRAME
LCD控制器和LCD驱动器之间的帧同步信号。该信号告诉LCD屏的新的一帧开始了。LCD控制器在一

个完整帧显示完成后立即插入一个VFRAME信号,开始新一帧的显示;
VLINE
LCD控制器和LCD驱动器之间的线同步脉冲信号,该信号用于LCD驱动器将水平线(行)移位寄存器

的内容传送给LCD屏显示。LCD控制器在整个水平线(整行)数据移入LCD驱动器后,插入一个VLINE信号;
VCLK
LCD控制器和LCD驱动器之间的像素时钟信号,由LCD控制器送出的数据在VCLK的上升沿处送出,在

VCLK
的下降沿处被LCD驱动器采样;
VM
LCD驱动器的AC信号。VM信号被LCD驱动器用于改变行和列的电压极性,从而控制像素点的显示或熄

灭。VM信号可以与每个帧同步,也可以与可变数量的VLINE信号同步。

3.3
数据线:也就是我们说的RGB信号线,不过需要与硬件工程是配合的是他采用了哪种接线方法,24

16位或其它。对于16TFT屏又有两种方式,在写驱动前你要清楚是565还是555I,这些与驱


动的编写都有关系
3.4
要注意一下LCD的电源电压,对于手持设备来说一般都为5V3.3V,如果LCD的需要的电源电压是5V

,那就要注意,电压只有3.3V的电压需要提高到5V,否则你可能能将屏点亮,但显示的图像要等到太阳从


西边出来的那一天才能正常,呵呵,我可吃过苦头的哦!
3.5 3.3V
逻辑电压转变成5V逻辑电压电路图
3.6
最后还有一个问题,有些LCD屏还需要一颗伴侣芯片,就是S 3C 2410手册中的那颗LPC3600。这可能在

LCD
的手册中都有论述吧,我没有遇到过这样的屏,所以也不是很清楚,不过现在的大部分LCD屏应该都不

需要这个讨厌的家伙了
3.7
还得提醒大家一下,S 3C 2410LCD屏的连线千万千万别超过 0.5 ,否则会给你带来麻烦,我也是

吃过苦头的,LCD屏上面的部分显示任何信息都是正确的,而只有屏的底部会有时正确有时错误,折腾了

好一阵,才知道是连线太长的缘故!
3.8
好了,在硬件工程师的帮助下,硬件接好了,那就该我们做软件的干活了,编写驱动吧
3.9
让我们首先看一下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
};
3.10
这是对16位色的RGB颜色进行定义,RGBI = 5650,即我们常说的565显示方式。
3.11
随便写一个16位数据的颜色数据(为了分析的方便,我把它写成二进制)
RGB = 10101101 10111001
根据上面的结构定义我们来分析一下RGB各是多少(因为没有透明色,我们不

去分析)
a) blue: {offset: 0, length: 5}
偏移量为0,长度为5,我们从那个RGB中提取出来便是

“11001”
b) green:{offset: 5, length: 6}
偏移量为5,长度为6,我们从那个RGB中提取出来便是
101

101
c ) red: {offset: 11, length: 5 }
偏移量为11,长度为5,我们从那个RGB中提取出来便是

10101
d)
我们得到了一个RGB值为214525,就是这个颜色

e)
那么反过来,有了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程序中是有用的

3.12
很重要的:
a)
颜色位数,bpp16如果你的LCD屏是TFT的,那一般都可以达到16位色或24位色,这也要看硬

件怎么连接了,根据情况进行设置即可;
b) LCD
屏的宽度和高度xres: 240,yres: 320这个就不用多说了,你的屏的分辨率是多少就设置


成多少呗。
3.12
寄存器的设置,这些也不困难。下面就让我们一起一口一口的将S 3C 2410LCD寄存器统统吃掉!

首先介绍一下我这块屏,这是日立的一块TFT屏,大小为640X240,可以支持到16位色。

与驱动有关的一张表
,
3.13
看一下LCD寄存器1的设置。

LINECNT
--- 这是一个只读的数据,我们当然没有必要理它
CLKVAL
--- 这可是一个很有用的参数,其实没必要管它后面的计算,我们可以通过实际的测

试来得出一个有效的值,对于
PNRMODE
--- 这个应该不用多做解释,大家一看都明白了,对于TFT屏,只能设置成11,而对

CSTN屏,可能需要根据实际屏的信息去设置,我遇到的屏都设置成10,即8bit单扫描模式。对于4bit

扫描、4bit双扫描、8bit单扫描的
BPPMODE
--- 这个参数更不用多说了吧,就是设置屏的颜色位数喽。
3.14 LCD
控制器 2,对于 TFT 屏必须要填
看一下图二 LCD屏资料,对比一下得出如下信息:
LCD2_VBPD:
Vertical back po
LCD2_VFPD

Vertical front porc
LCD2_VSPW

Vsync Valid width
关于LINEVAL在程序的后面将
经过分析,我们知道了如何设置LCD2
3.15 LCD
控制器 3
对于 TFT 屏,很容易将 HBPD HFPD 找出来,如下

porch
典型值为 37
porch
典型值为
32
此处暂时不管

LCD3_HBPD:
Horizontal back
LCD3_HFBD:
Horizontal back
对于HOZVAL同样会在后面提到,
经过分析,我们知道了如何设置LCD3

3.16 LCD
控制器
4
对于 TFT 屏,需要设置 HSPW 的值,这个在 LCD 手册上也很容易

_HSPW

典型值为 5
意思,有什么作用,我从来不动它,只取它最初的那个值
13
经过分析,我们知道了如 何设置 LCD4

3.17 LCD
控制器 5
这个寄存器的看起来比较复杂,但是无外乎这几类:

a.
只读信息:VSTATUSHSTATUS只读的东东,设置它也没
b.TFT
屏的颜色信息:BPP24BLFRM565TFT屏的颜色信息,这个我们在LCD的硬件连接时已经提到了,根据


具体的接线方式,设置信息。
c.
控制信号的极性,这些信息主要是使S 3C 2410的信号输出极性与LCD屏的输入极性
题,需要根据具体的硬件进行设置,较为常见的是vline/hsync VFRAME/VSYNC脉冲的极性。
d.
颜色信息的字节交换控制位:BSWPHWSWP
这两位用来控制字节交换和半字交换,主要用来大小头的问题,如果

输出到屏上的汉字左右互换了,或者输出到屏上的图花屏了,可以更改这个选项。
e.
我的这块TFT的信息设置如下:lcdcon5,一块 CSTN 屏的信息:lcdcon 5
f .FrameBuffer
起始寄存器 2 FrameBuffer 起始寄存器 3
这两个寄存器的设置比较重要,在此我给出12位色CSTN屏和16位色TFT的设置代码:


g.RGB Loopup Table Register
这三个寄存器的在驱动256CSTN屏的时候需要使用,我在别的芯片上使用过,因为这颗芯片支持12位色

,所以没有去调试,我给出两组可能的值:
S 3C 44B0
上的
rREDLUT = 0xFCA86420;
rGREENLUT = 0xFCA86420;
rBLUELUT = 0xFFFFFA50;
Jupiter
上的
rREDLUT = 0xFEC85310
rGREENLUT = 0xFEC85310
rBLUELUT = 0xFB40
3.18
好了,各个寄存器的设置完成了,最后在驱动CSTN屏的时候需要提醒大家一句,CSTN的信号引脚

中有一个叫VM/DISP的信号线,这个信号线的作用就是打开LCD的显示开关,让其进行显示,它可以接到任

何一个GPIO口上。S 3C 2410中提供了一个VM信号,可以将LCD的这个信号与S 3C 2410VM信号相接即可,然

后在驱动中一定要加上如下语句(蓝色选中部分):
否则你的LCD可能没有任何显示哦(对于TFT屏不需要这个语句)
3.19.
驱动写好了,重新Make,下载就可以了。如果一切顺利,在TFT屏或256色的CSTN屏上会有一个漂

亮的小蜻蜓(应该是蜻蜓吧)出现。注意,并不是蜻蜓出现了就代表你的驱动OK了,还要用GUI程序做进

一步的测试,因为某一个或几个参数虽然不正确,但是仍然能够看到小蜻蜓的,但显示图形的时候就有问

题了。另外,在驱动CSTN12位色的时候,我们在屏上看不到小蜻蜓(我的NCSTN屏上都没见到小蜻蜓

),我想,可能是armLinux本身不支持12位色显示,或者我们某些地方没搞对的原因吧,但这不代表你的

驱动有问题,用GUI程序写FrameBuffer,看看能否的到正确的结果。
3.20. GUI
程序的编写
3.21
其实要在LCD上显示图像,说白了就是把数据(包含颜色)写到FrameBuffer中对应的位置就可以了
mmap函数使用户空间的一段地址关联到设备内存(FrameBuffer)上。无论何时,只要程序在分配的地

址范围内进行读取或者写入,实际上就是对设备的访问,使用 mmap 可以既快速又简单地访问显示卡的内

存。对于象这样的性能要求比较严格的应用来说,直接访问能给我们提供很大不同。
3.22
不过我曾将帮一个网友调试了一个S 3C 44B0上的GUI程序,在他的GUImmap函数总会出错,因为没

有拿到他的硬件和驱动源码,没有分析出其中的原因,所以只得用write函数,直接向fb0写入数据,奇怪

的是只写入一部分数据好像都不起任何作用,只得整屏数据写入才搞定了。这可就比较痛苦了,不过好在

他只是写入的黑白数据,数据量还不是很大,要是彩色的那可真的痛苦了
3.23
另外,我还想多啰嗦两句,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的点了。

3.24
有了上面的基础我们就可以很好的理解这个语句了:
FrameBuffer的大小=LCD屏的宽度 * LCD屏的高度 * 每像素的位数 / 每字节的位数
例如,一个320*240的黑白平,FrameBuffer的大小为
320 * 240 * 1 / 8 = 9600
(字节)
而一个320 * 24016位色LCDFrameBuffer的大小则为

3.25 TFT
16位色的画点函数
3.26 5
TFT16位色下显示24色位图函数

320 * 240 * 16 / 8 = 153600
(字节)

 
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值