《基于ARM9的嵌入式Linux系统开发原理与实践》课件第11章_第1页
《基于ARM9的嵌入式Linux系统开发原理与实践》课件第11章_第2页
《基于ARM9的嵌入式Linux系统开发原理与实践》课件第11章_第3页
《基于ARM9的嵌入式Linux系统开发原理与实践》课件第11章_第4页
《基于ARM9的嵌入式Linux系统开发原理与实践》课件第11章_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第11章TFT-LCD驱动程序开发11.1TFT-LCD工作原理11.2LQ080V3DG01液晶屏11.3SC2410内部LCD控制器11.4Linux驱动程序接口——FrameBuffer11.5LCD驱动程序主要代码结构以及关键代码分析11.6LCD驱动程序开发实例本章小结

11.1TFT-LCD工作原理

11.1.1LCD概述

液晶最早是奥地利植物学家莱尼茨尔于1888年发现的,他发现某些有机物熔化后会经历一个不透明的呈白色浑浊液体状态。第二年,德国物理学家莱曼发现这类浑浊液体外观上虽然属于液体,但却显示出各向异性晶体特有的双折射性,于是莱曼将其命名为“液态晶体”,也就是“液晶”。11.1.2LCD显示原理

液晶是一种介于固体和液体之间,具有规则性分子排列的有机化合物,既有晶体所特有的各向异性造成的双折射性,又有液体所特有的流动性,如图11-1所示。图11-1液晶分子特性

1.液晶的光电特性

液晶分子结构为各向异性,所以液晶的光电特性因方向不同而有所差异,也就是液晶分子在介电系数及折射系数等光电特性都具有各向异性,利用这些性质可以改变入射光的强度,形成灰阶,制作显示器。液晶分子的电光效应最显著的是扭曲向列效应。在不同电流电场作用下,液晶分子会规则旋转90°排列。当偏振光通过液晶时,偏振角发生变化,这个变化的角度称为扭曲角,如图11-2所示。图11-2液晶的电光效应

2.液晶的显示原理

液晶显示器是将液晶置于两片导电玻璃之间,靠两个电极间电场的驱动引起液晶分子扭曲向列的电光效应。在电源的关开之间控制光源透射或遮蔽,产生明暗两种效果。如图11-2所示,在玻璃电极板上装有配向膜,所以液晶会沿着沟槽配向,由于玻璃基板配向膜沟槽偏离90°,所以液晶分子成为扭转型。11.1.3LCD驱动原理

1.直接驱动法

1)静态驱动

静态驱动是指在液晶像素前后电极上施加电压信号时呈显示状态,不施加电压时呈非显示状态。以图11-3所示笔段式LCD为例,11-3(a)是笔段式液晶的电极排列方式,11-3(b)是其中一个液晶像素的驱动电路原理图。图11-3笔段式LCD的静态驱动在COM端施加一个占空比为1/2的连续方波。当控制信号为高电平时,笔段波形与COM波形反向,液晶像素上施加了一个周期电压,液晶像素呈显示状态;当控制信号为低电平时,笔段波形与COM波形同向,液晶像素上无电压,呈非显示状态。控制时序如图11-4所示。图11-4笔段式LCD的静态驱动时序图

2)动态驱动

当LCD的像素数增多的,笔段式LCD的结构和驱动方法就变得都不合理了。对于多像素LCD,即点阵式LCD,采用矩阵式排列液晶像素的前后电极,行、列的交叉点为液晶像素,如图11-5所示。图11-5点阵式LCD的结构图

2.有源驱动法

为了进一步提高显示质量,TFT-LCD以其分辨率高、响应速度快和色彩丰富等优点正逐渐取代STN-LCD。如图11-6所示,TFT-LCD的每个像素上集成了一个有源器件——薄膜晶体管(TFT),对TFT-LCD的驱动实际上是对每个像素点上的TFT的驱动,而非直接驱动法将驱动信号直接施加到液晶像素上,因此,称TFT-LCD的驱动为有源驱动法。图11-6TFT-LCD像素结构11.1.4LCD的分类

1. TN-LCD与STN-LCD

STN-LCD是TN-LCD的升级产品,两者结构基本相同。TN-LCD的基本单元和显示原理如图11-2所示,液晶的扭曲角为90°,而STN-LCD的扭曲角达到180°~360°,提高了液晶的电光响应速度。如图11-7所示,由于STN-LCD的扫描行电极和寻址列电极直接连接在液晶像素上进行驱动,因而存在以下几个重要缺陷。图11-7STN-LCD结构图1)分辨率低

2)色彩少,无真彩显示

3)响应速度慢

2. TFT-LCD

TFT-LCD的响应速度取决于TFT的开关速度,与液晶像素的充放电速度无关,所以TFT-LCD的响应速度远快于STN-LCD,可以无拖影地显示动态图像。STN-LCD与TFT-LCD分属于LCD的低端和高端,性能比较如表11-1所示。

11.2LQ080V3DG01液晶屏

LQ080V3DG01芯片是由日本夏普公司生产的TFT-LCD,其外型尺寸为182mm × 140mm × 14mm,尺寸为8寸,分辨率为640 × 480,工作温度为0℃~+70℃,背光类型为1xccfl,显示颜色为262k,对比度为250∶1,亮度为380cd/m2, 接口类型为TTL,响应时间为

80ms,供压3.3V/5V,功耗6.2W。

11.3SC2410内部LCD控制器

11.3.1管脚

S3C2410LCD控制器用于传输视频数据和产生必要的控制信号,像VFRAME、VLINE、VCLK、VM等。除了控制信号,S3C2410还有输出视频数据的端口VD[23:0],如图11-8

所示。图11-8S3C2410LCD控制器的外部管脚图11.3.2寄存器介绍

1. LCDCON1

LCDCON1中需要设置以下几个域:

CLKVAL是时钟比值参数,它决定了VCLK信号的频率,对于TFT型模块要求CLKVAL≥0,VCLK和CLKVAL的关系为

VCLK(Hz) = HCLK / [(CLKVAL + 1) × 21]

2. LCDCON2

LCDCON2需要设置以下几个域:

VBPD:该域表示帧同步脉冲之后到一帧图像开始显示之间需要消隐的行数;

LINEVAL:该域表示每帧要显示的行数;

VFPD:该域表示一帧图像显示完成到帧同步脉冲到来之间需要消隐的行数;

VSPW:该域表示帧同步脉冲的宽度。

3. LCDCON3

LCDCON3中需要设置以下几个域:

HBPD:该域表示行同步脉冲之后到一行图像开始显示之间需要消隐的像素数;

HOZVAL:该域表示每行要显示的像素数;

HFPD:该域表示一行图像显示完成到行同步脉冲到来之间需要消隐的像素数。

4. LCDCON4

LCDCON4中只需要设置一个域:HSPW,该域表示行同步脉冲的宽度。

5. LCDCON5

LCDCON5中主要需要设置以下几个域:

BPP24BL决定24bpp视频存储器的大小端模式。

FRM565决定16bpp视频输出数据的格式。

INVVCLK、INVVLINE、INVVFRAME分别决定了VCLK、VLINE、VSYNC信号的极性。

INVVDEN、INVVD分别决定了VDEN、VD信号的极性。11.3.3控制流程

LCD控制器由REGBANK、LCDCDMA、VIDPRCS、TIMEGEN和LPC3600组成(如图11-9所示)。图11-9S3C2410内部LCD控制器方框图11.3.4TFT控制器操作

S3C2410支持STN-LCD和TFT-LCD,这里只介绍其对TFT-LCD的控制。

TIMEGEN产生LCD驱动器的控制信号,如VSYNC、HSYNC、VCLK、VDEN和LEND等。这些控制信号与REGBANK寄存器组中的LCDCON1/2/3/4/5寄存器的配置关系相当密切,基于LCD控制寄存器中的这些可编程配置,TIMEGEN产生可编程控制信号来支持不同类型的LCD驱动器。VSYNC和HSYNC脉冲的产生依赖于LCDCON2/3寄存器的HOZVAL域和LINEVAL域的配置。

HOZVAL和LINEVAL的值由LCD屏的尺寸决定,如下公式:

HOZVAL = 水平显示尺寸 - 1

LINEVAL = 垂直显示尺寸 - 1

VCLK信号的频率取决于LCDCON1寄存器中的CLKVAL域。VCLK和CLKVAL的关系如下:

VCLK(Hz) = HCLK / [(CLKVAL + 1) × 2]

11.4Linux驱动程序接口——

FrameBuffer

11.4.1FrameBuffer

在Linux2.2.xx之后内核版本中出现了一种驱动程序接口即FrameBuffer。这种接口为图像硬件设备提供了一种抽象化处理。它代表了一些视频硬件设备,允许应用软件通过定义明确的界面来访问图像硬件设备。图11-10Linux系统下FrameBuffer的主要结构11.4.2数据结构

1. LinuxFrameBuffer的数据结构

FrameBuffer的数据结构的定义在内核源码include/linux/

fb.h文件中。

在FrameBuffer中,fb_info可以说是最重要的一个结构体,它是Linux为帧缓冲设备定义的驱动层接口。它不仅包含了底层函数,而且还有记录设备状态的数据。每个帧缓冲设备都与一个fb_info结构相对应。图11-11LinuxFrameBuffer的总体结构图

2. S3C2410中LCD的数据结构

在S3C2410的LCD设备驱动中,定义了s3c2410fb_info(内核源码driver/video/s3c2410.h)文件中来标识一个LCD设备,结构体如下:图11-12S3C2410驱动的整体结构

11.5LCD驱动程序主要代码

结构以及关键代码分析

11.5.1FrameBuffer驱动的统一管理

fbmem.c实现了LinuxFrameBuffer的中间层,任何一个FrameBuffer驱动,在系统初始化时,必须向fbmem.c注册,即需要调用register_framebuffer()函数,在这个过程中,设备驱动的信息将会存入名称为registered_fb数组中,这个数组定义为:

structfb_info*registered_fb[FB_MAX];

intnum_registered_fb;11.5.2实现消息的分派

fbmem.c实现了对系统全部FrameBuffer设备的统一管理。当用户尝试使用一个特定的FrameBuffer时,fbmem.c怎么知道该调用哪个特定的设备驱动呢?

Linux是通过主设备号和次设备号对设备进行唯一标识。不同的FrameBuffer设备向fbmem.c注册时,程序分配给它们的主设备号是一样的,而次设备号是不一样的。于是就可以通过用户指明的次设备号,来具体该调用哪一个FrameBuffer驱动。图11-13LCD驱动的open()函数的调用流程图11.5.3开发板S3C2410LCD驱动的流程

1.定义了初始的LCD参数

在mach-smdk2410.c(在内核源码arch/arm/mach-s3c2410目录中)中,定义了初始的LCD参数。注意,这是个全局变量。

2. s3c2410fb_probe函数

内核初始化时候调用s3c2410fb_probe函数(内核源码driver/video/s3c2410fb.c文件中)。

首先动态分配s3c2410fb_info空间。

fbinfo=framebuffer_alloc(sizeof(structs3c2410fb_info),

&pdev->dev);

把域mach_info指向mach-smdk2410.c中的smdk2410_lcd

_cfg。

info->mach_info=pdev->dev.platform_data;

3. mmap()映射内存函数

当用户调用mmap()映射内存的时候,fbmem.c把刚才设置好的显存区域映射给用户。

start=info->fix.smem_start;

len=PAGE_ALIGN((start&~PAGE_MASK)+info->fix.smem_len);

io_remap_pfn_range(vma,vma->vm_start,off>>PAGE

_SHIFT,

vma->vm_end-vma->vm_start,vma->vm_page_prot);

11.6LCD驱动程序开发实例

11.6.1S3C2410与LCD模块的连接电路

博创开发板S3C2410与LCD模块的连接如图11-14所示。图11-14S3C2410与LQ080V3DG01连接图图11-15S3C241O与LQ080V3DG01连接原理图11.6.2修改代码(一)——LCD显示企鹅图像

1.修改mach-smdk2410.c文件

在第8章中成功的内核源代码中将/linux-2.6.14

.success20090807/arch/arm/mach-s3c2410目录下的mach-smdk2410.c文件打开:

[root@localhostlinux-2.6.14.success20090807]#viarch/arm/mach-s3c2410/mach-smdk2410.c

2.添加mxl.h文件

在 /linux-2.6.14.success20090807/include/asm-arm/arch-s3c2410目录下创建mxl.h文件:

[root@localhostlinux-2.6.14.success20090807]#viinclude/asm-arm/arch-s3c2410/mxl.h

mxl.h文件内容如下:

#include<asm-arm/arch-s3c2410/map.h>

#defineIRQ_RTL8019

IRQ_EINT4

#defineEXTINT_OFF(IRQ_EINT4-4)

/*RTL8019a,nGCS3*/

#definepRTL8019_BASE

S3C2410_PA_ISA_NET

#definevRTL8019_BASE

S3C2410_VA_ISA_NET

3.注释blank_screen_t函数内容

注释drivers\char\vt.c的blank_screen_t(unsignedlongdummy)的函数内容,否则lcd很快关掉显示。

4.重新配置内核

[root@localhostlinux-2.6.14.success20090807]#makemenuconfig

配置界面如图11-16所示。图11-16内核配置LCD驱动界面

5.重新编译内核

编译内核:

[root@localhostlinux-2.6.14.success20090807]#makezImage

将重新制作zImage烧写到博创开发板,再次启动linxu2.6.14以后就可以在LCD上看到一个小的企鹅,如图

11-17所示。图11-17博创开发板LCD显示企鹅图像11.6.3修改代码(二)——LCD显示小车图像

1.打开GIMP图像编辑器

点击开始菜单,选择图形,选择TheGIMP。

2.打开想要的图像文件

点击文件,选择图像文件所在目录,点击确定,就可显示图像文件,如图11-18所示。图11-18打开图像文件

3.修改图像索引颜色

将鼠标放在图像中,点击鼠标右键,依次选择图像→模式→索引颜色,将颜色改为224色。

4.保存图像

图片大小不要大于显示器分辨率就可以。最后将鼠标放在图像中,点击鼠标右键,将文件保存为ppm格式(ASCII码),文件名为:mxl1.ppm,如图11-19所示。图11-19保存图像

5.替换原有的企鹅图像

将mxl1.ppm拷贝到 /linux-2.6.14.succe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论