LCD驱动编写小节

2024-04-07 01:32
文章标签 驱动 编写 小节 lcd

本文主要是介绍LCD驱动编写小节,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LCD驱动编写小节

magicchip 发表于 2007-7-11 8:11:00

0
推荐

推荐文章 :
《S3C2410下LCD驱动程序的移植及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位或其它。对于16位TFT屏又有两种方式,在写驱动前你要清楚是5:6:5还是5:5:5:I,这些与驱

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

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

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

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

需要这个讨厌的家伙了
3.7 还得提醒大家一下,S3C2410到LCD屏的连线千万千万别超过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颜色进行定义,R:G:B:I = 5:6:5:0,即我们常说的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值为21:45:25,就是这个颜色
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)颜色位数,bpp:16如果你的LCD屏是TFT的,那一般都可以达到16位色或24位色,这也要看硬

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

成多少呗。
3.12 寄存器的设置,这些也不困难。下面就让我们一起一口一口的将S3C2410的LCD寄存器统统吃掉!
首先介绍一下我这块屏,这是日立的一块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.只读信息:VSTATUS和HSTATUS只读的东东,设置它也没
b.TFT屏的颜色信息:BPP24BL、FRM565TFT屏的颜色信息,这个我们在LCD的硬件连接时已经提到了,根据

具体的接线方式,设置信息。
c.控制信号的极性,这些信息主要是使S3C2410的信号输出极性与LCD屏的输入极性
题,需要根据具体的硬件进行设置,较为常见的是vline/hsync 、VFRAME/VSYNC脉冲的极性。
d.颜色信息的字节交换控制位:BSWP、HWSWP
这两位用来控制字节交换和半字交换,主要用来大小头的问题,如果
输出到屏上的汉字左右互换了,或者输出到屏上的图花屏了,可以更改这个选项。
e.我的这块TFT的信息设置如下:lcdcon5,一块 CSTN 屏的信息:lcdcon5
f.FrameBuffer 起始寄存器 2 和 FrameBuffer 起始寄存器 3
这两个寄存器的设置比较重要,在此我给出12位色CSTN屏和16位色TFT的设置代码:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

他只是写入的黑白数据,数据量还不是很大,要是彩色的那可真的痛苦了
3.23 另外,我还想多啰嗦两句,FrameBuffer的像素点与LCD屏上的像素点的对应关系 ,深入了解一下

对程序的理解可能会更清楚一点。我们知道黑白(2色)颜色用0和1就可以表示了,也就是1位数据就可以

了,那1个字节就可以表示8位数据,假如这个字节是10101010,FrameBuffer的偏移地址为0,则在LCD屏

上便会显示出4个黑点,黑点中间会有4个白点出现(假如1是黑色);对于4色则用00、01、10、11就可以

表示出四种颜色,即用两位数据可以表示一位数据,那同样是10101010,则对应于LCD屏上则显示的是颜

色值为10,长度为4(8/2)的一条直线;同理,对于8位色(256色),则8位数据才能表示出一个点的颜

色值,10101010在LCD屏上就只能显示为颜色值为10101010的点了。

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

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

320 * 240 * 16 / 8 = 153600(字节)
日 本松下有一位高官曾说过:即使我们不去拜靖国神社韩国人也不会买我们的产品,但不管我们再怎样的去拜靖国神社,中国人照样会买我们的产品。这是一句让全中国人都应该感到羞愧的话!!!作为一个有良知的中国人,来和我和许多爱国人士一起并肩战斗吧!
如果你从本网页下载文件,请你支持国货,从你做起,以后不要再买日货,如果你是一个中国人就一定要做到这一点,并教育你身边的去这样做。
------芯行天下的博客

原文地址:http://blog.21ic.com/user1/3397/archives/2007/39771.html

这篇关于LCD驱动编写小节的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/881327

相关文章

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

Wondows dos下怎么编写bat批处理文件

最近搞php,在运行时,以Nginx+php-cgi.exe方式运行Wordpress项目 打开dos,先cd到php-cgi.exe文件当前目录下执行启动命令:php-cgi.exe -b 127.0.0.1:9001再打开一个dos,再cd到nginx.exe文件当前目录下执行启动命令:start nginx 大概过程要经过这些步骤,觉得很麻烦,就学下怎么编写一个bat文件,以双击运行代替

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

UMDF驱动安装

VS2013 + WDF8.1,UMDF驱动选择User Mode Driver,不要选User Mode Driver 2.0,否则Win7安装有问题,如图 另外,在驱动安装时不要忘记WUDFUpdate_<主版本号><次版本号>.dll文件,具体文件名在INF中查找。此文件可在WDF的安装目录中找到。注意:在WDF的安装目录中会有3个WUDFUpdate_xxx.dll文件,x86,x6

用Python编写倒计时程序:详细教程

目录 引言 环境准备 基本概念 代码实现 步骤一:导入必要的库 步骤二:获取用户输入 步骤三:实现倒计时逻辑 步骤四:整合代码 运行程序 高级功能 扩展功能示例:支持分钟和小时输入 扩展功能示例:图形用户界面 (GUI) 总结 引言 倒计时程序是一个非常常见的小工具,广泛用于各种应用场景中,例如考试时间提醒、烹饪计时器、会议倒计时等。Python 作为一种

电脑驱动分类

电脑驱动程序(驱动程序)是操作系统与硬件设备之间的桥梁,用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类: 1. 设备驱动程序 显示驱动程序:控制显卡和显示器的显示功能,负责图形渲染和屏幕显示。 示例:NVIDIA、AMD 显示驱动程序。打印机驱动程序:允许操作系统与打印机通信,控制打印任务。 示例:HP、Canon 打印机驱动程序。声卡驱动程序:管理音频输入和输出,与声卡硬件

麒麟系统安装GPU驱动

1.nvidia 1.1显卡驱动 本机显卡型号:nvidia rtx 3090 1.1.1下载驱动 打开 https://www.nvidia.cn/geforce/drivers/ 也可以直接使用下面这个地址下载 https://www.nvidia.com/download/driverResults.aspx/205464/en-us/ 1.1.3安装驱动 右击,

windows10 卸载网络驱动以及重新安装

右键桌面此电脑的图标,点击管理,设备管理器—网络适配器,找到下图中的驱动(不同的系统或者显卡会导致网卡驱动名称与下图不一样,多为Realtek开头),右键选择卸载设备,然后重启电脑,系统会自动重新安装驱动 新电脑首次安装驱动: 根据主板厂家,比如华硕,进入华硕官网,点击服务支持,点击下载中心,选择型号,点击右侧驱动程序和工具软件,选择windows版本,下载相应的驱动,下载完之后在对应文件中找