显示驱动和图形应用程序初步_第1页
显示驱动和图形应用程序初步_第2页
显示驱动和图形应用程序初步_第3页
显示驱动和图形应用程序初步_第4页
显示驱动和图形应用程序初步_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式Linux显示驱动

和图形应用程序初步电子信息工程学院 杨昕欣本讲主要内容LCD显示原理MX1的LCD接口初始化配置显示驱动原理及源代码分析基于帧缓冲设备的图形应用程序开发LCD硬件原理图LCD显示原理LCD是基于液晶光电效应的显示器件。液晶显示器的工作原理是利用液晶的物理特性,在通电时,液晶排列变得有秩序,使光线容易通过;不通电时,排列则变得混乱,阻止光线通过。即液晶工作时,使用的是外部的光线,自己本身并不发光,所以与CRT相比,液晶显示器的耗电量较低。

LCD分类LCD可由为液晶照明的方式分为:传送式和反射式传送式屏幕要使用外加光源照明,称为背光(backlight),照明光源要安装在LCD的背后。传送式LCD在正常光线及暗光线下,显示效果都很好,但在户外,尤其在日光下,很难辩清显示内容。反射式屏幕,则不需要外加照明电源,使用周围环境的光线(或在某些笔记本中,使用前部照明系统的光线)。这样,反射式屏幕就没有背光,所以,此种屏幕在户外或光线充足的室内,才会有出色的显示效果,但在一般室内光线下,这种显示屏的显示效果就不及背光传送式的。

LCD分类LCD可分为:主动式和被动式被动矩阵显示画面的原理:输入的信号依次去驱动每一排的电极,当某一排被选定的时候,列向上的电极将被触发打开位于排和列交叉上的那些像素。优点:比较简单,而且对液晶屏的成本增加也不多。缺点:如果有太大的电流通过某个单元,附近的单元都会受到影响,引起虚影。如果电流太小,单元的开和关就会变得迟缓,降低对比度和丢失移动画面的细节。

LCD分类主动矩阵LCD的原理:主动在每个单元中都加入了很小的晶体管:由晶体管来控制电流的开和断。晶体管电极是利用薄膜技术而做成的。薄膜晶体管LCD(TFT—LCD)也因此得名。

优点:晶体管可以迅速地控制每个单元,由于单元之间的电干扰很小,所以可使用大电流,而不会有虚影和拖尾现象更大的电流会提供更好的对比度、更锐利的和更明亮的图像。MX1对LCD的支持MX1LCDC(液晶显示控制器,LiquidCrystalDisplayController)提供了对单色,灰度,被动式彩色点阵液晶和主动式彩色点阵液晶屏的支持.主要特性如下:支持自刷新方式LCD最多16级灰度显示被动式与主动式彩色液晶屏接口可编程刷新率支持16/12/8/4/2/1位的数据总线宽度支持4/8bpp的被动式彩屏(CSTN)支持4/8/12/16bpp的主动式彩屏(TFT)

灰度显示原理LCD显示屏并不是设置成不同的亮度去驱动每一像素的。它对象素要么显示,要么关闭。LCD显示屏的一个常用指标是它的反应时间,反应时间指的是一个像素从显示到关闭所花费的时间,典型的是几十ms。LCD控制器内部有1个16周期计数器,用于产生16周期的间隔。16周期间隔里像素显示的次数决定了该像素的灰度彩色显示原理R、G、B三种灰度的叠加显示刷新率刷新率是一个重要的显示特性,指的是整个数据帧被重新写到显示屏的频率。如果数据写得太慢,将影响显示质量;太快则显示器的反应时间跟不上像素驱动状态的改变。大部分显示屏推荐的速率是70~80Hz。

MX1显示屏幕大小MX1显示屏幕大小实际屏幕宽度(XMAX)实际屏幕高度(YMAX)虚拟显示页宽(VPW)——规定最大页宽,用来计算每一行的起始地址。每一页的首行起始地址由SSA决定,第二行的起始地址为SSA+VPW,以此类推,第n行的起始地址为SSA+n*VPW。虚拟显示页高(VPH)——只受显式内存大小限制,对LCDC没有影响LCDC会扫描SSA寄存器指向的显示内存起始地址显示数据映射显示数据映射BigEndianvs.LittleEndianBigEndian:数据高位字节存在内存的低位地址上,低位字节保存在内存的高位地址上。LittleEndian:数据高位字节存在内存的高位地址上,低位字节保存在内存的低位地址上。举例:00000000000000000000010000000001显示数据映射显示数据映射MX1的LCDC寄存器简介灰度显示原理最多16种灰度级别,用2bit或4bit表示2bit最多表示4种灰度,4bit表示16种灰度某像素的灰度是用每16帧中,该像素显示的帧数来表示的,这种机制称为帧速率控制。通常灰度等级不是线形划分的,比如对于4级灰度,某种液晶需要按0,1/4,1/2,1的等级划分,这比按0,1/3,2/3,1的线形划分要有更好的效果灰度显示原理帧速率控制(非线性)彩色显示原理被动彩色矩阵显示原理:对于4bit和8bit模式,利用LCDC的颜色映射矩阵将4bit或8bit数据映射为12bit数据上述12bit数据分为3部分,每部分4bit,分别表示不同深度的红、绿、蓝三色,分别通过控制三个独立的FRC实现对于12bit模式,自身就分为3部分,每部分4bit,分别表示不同深度的红、绿、蓝三色,因此不需要通过颜色映射矩阵,可以直接控制相应的FRC对于MC9328,不支持超过12bit的被动彩色显示矩阵被动式彩色显示矩阵(颜色映射RAM)彩色显示原理主动彩色矩阵显示原理:对于4bit和8bit模式,利用LCDC的颜色映射矩阵将4bit或8bit数据映射为12bit数据上述12bit数据分为3部分,每部分4bit,分别表示不同深度的红、绿、蓝三色,对于主动模式,上述三个通道输出的红、绿、蓝控制量直接送给液晶,不需要经过MX1的LCDC的FRC(由LCD本身实现类似FRC的功能);被动式则需要用到MX1的FRC.对于MC9328,不支持超过16bit的主动彩色显示矩阵对于12bit/16bit的像素信息,直接送给液晶,不需要通过LCDC的颜色映射矩阵主动式彩色显示矩阵(颜色映射RAM)LCDC接口及时序接口:1.像素数据2.垂直同步信号3.水平同步信号4.移位时钟信号5.刷新信号6.对比度信号7.夏普屏专用信号SPL_SPR、CLS、SP、REV被动式矩阵液晶接口动作流程1.LSCLK将像素信号输入液晶驱动电路的内部寄存器2.LP标志当前一行像素的数据已经传送完成,并且将已传来的数据锁存到一个宽寄存器中3.FLM标志着当前所显示页的第一行4.LD表示具体的像素信号,在两个LP脉冲之间的LD表示一行的像素5.ACD每隔预定的若干帧之后就会翻转一次,对液晶进行一次刷新被动式矩阵液晶接口动作时序单色、4bit数据宽度液晶的动作时序(m为像素数)被动式彩色、8bit数据宽度液晶的动作时序(m为像素数)

主动式矩阵液晶接口动作流程1.在LSCLK的下降沿,将像素信号输入给液晶驱动电路的内部寄存器。也可以是上升沿,通过更改寄存器中相应标志位实现。2.HSYNC脉冲产生新的一行3.VSYNC脉冲产生新的一帧,每一个VSYNC脉冲内,至少产生一个HSYNC脉冲4.LD表示具体的像素信号,在两个LP脉冲之间的LD表示一行的像素5.OE为使能信号,OE为低电平时,数据无效,不显示TFT颜色通道分配在4bit、8bit和12bit模式: LD[15:12]定义红色,LD[10:7]定义绿色,LD[4:1]定义蓝色在16bit模式: LD[15:11]定义红色,LD[10:5]定义绿色,LD[4:0]定义蓝色LCDC原理框图显示的实现-帧缓冲帧缓冲(framebuffer)-显示缓冲区是Linux为显示设备提供的一个接口,是把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。

用户不需要对底层驱动有深入了解,也不必关心物理显存的位置、换页机制等细节Xwindow绘制窗口,显示汉字都是通过fb帧缓冲设备Linux可支持最多32个/dev/fb0~/dev/fb31缺省是/dev/fb0可以直接拷贝位图到fb来显示到屏幕cp/bitmap/penguin.bin/dev/fb0帧缓冲设备驱动原理帧缓冲设备属于字符设备,其目的就是通过配置MX1寄存器,在一段指定的内存与LCD之间建立一个自动传输的通道。这样,任何程序只要修改这段内存中的数据,就可以改变LCD上的显示内容。

MX1寄存器的初始化,特别是SSA帧缓冲设备驱动三个关键文件:1.fbmem.c2.xxfb.h3.xxfb.c一个模板文件:1.Skeleton.c相关头文件:1.fb.h帧缓冲设备驱动Fbmem.c功能一:注册所有显示驱动的信息帧缓冲设备驱动 功能二:提供上层驱动接口即给用户程序提供通用接口,从而使用户不必关心具体的显示硬件。帧缓冲设备的接口staticstructfile_operationsfb_fops={

owner:THIS_MODULE,

read:fb_read,/*读操作*/

write:fb_write,/*写操作*/

ioctl:fb_ioctl,/*控制操作*/

mmap:fb_mmap,/*映射操作*/

open:fb_open,/*打开操作*/

release:fb_release,/*关闭操作*/

};

其中的成员函数都在文件linux/driver/video/fbmem.c中定义

fb_readfb_read(structfile*file,char*buf,size_tcount,loff_t*ppos){ unsignedlongp=*ppos;

struct

inode*inode=file->f_dentry->d_inode;

int

fbidx=GET_FB_IDX(inode->i_rdev);

struct

fb_info*info=registered_fb[fbidx];

struct

fb_ops*fb=info->fbops;

struct

fb_fix_screeninfofix;

……….}帧缓冲设备驱动四个重要的结构体:1.fb_fix_screeninfo/include/linux/fb.h中定义,用于定义图形卡的信息,用户不能更改帧缓冲设备驱动2.fb_var_screeninfo在/include/linux/fb.h中定义,提供由用户设置的图形卡信息帧缓冲设备驱动3.xxfb_info

定义具体设备的底层接口,记录设备状态,每个帧缓冲设备都与一个xxfb_infor结构相对应。其中的display_switch结构在/include/video/fbcon.h中定义。帧缓冲设备驱动4.fb_info

1)Linux为帧缓冲设备定义的驱动层接口2)Fb_info中纪录了帧缓冲设备的全部信息,包括设备的设置参数,状态以及操作函数指针。每一个帧缓冲设备都必须对应一个fb_info结构。3)Fb_info包括下列成员modename——设备名称fontname——显示字体,fbops——指向底层操作的函数的指针fb_var_screeninfo——记录用户可修改的显示控制器参数,xres定义屏幕一行有多少个点,yres定义屏幕一列有多少个点,bits_per_pixel定义每个点用多少个字节表示fb_fix_screeninfo——记录用户不能修改的显示控制器的参数,如屏幕缓冲区的物理地址,长度。当对帧缓冲设备进行映射操作的时候,就是从fb_fix_screeninfo中取得缓冲区物理地址的4)上面所说的数据成员都是需要在驱动程序中初始化和设置的。帧缓冲设备驱动fb_info

定义帧缓冲设备驱动fb_ops

定义注意与fbmem.c中的fb_fops结构体有区别帧缓冲设备驱动模板:Skeleton.c核心是_initxxfb_init(void)Xxfb_init中调用的函数和结构体Xxfb_init中调用的函数和结构体(续)如何写fb设备驱动遵循设备驱动程序的结构,设备注册、定义file_operations接口、初始化LCDC寄存器初始化一个fb_info结构,填充其中的成员变量,并调用register_framebuffer(&fb_info),将fb_info登记入内核。

实现定义的各个接口函数设备驱动源代码mx1fb.h——定义LCDC寄存器mx1fb.c——初始化LCDC,fb_ops,填充fb_infoFbmem.c——实现file_operations接口,设备注册注销Fb.h——定义fb_var_screeninfo,fb_fix_screeninfo,fb_ops,fb_info设备驱动源代码设备驱动源代码

dbmx1fb_set_var流程帧缓冲设备的注册与注销在linux/driver/video/fbmem.c中定义

注册devfs_register_chrdev(FB_MAJOR,"fb",&fb_fops)fb_info->devfs_handle=

devfs_register(devfs_handle,name_buf,DEVFS_FL_DEFAULT, FB_MAJOR,i,S_IFCHR|S_IRUGO|S_IWUGO, &fb_fops,NULL);注销:devfs_unregister(fb_info->devfs_handle);Fb设备驱动Ioctl的主要操作通过以下CMD来传递控制命令FBIOGET_VSCREENINFOFBIOPUT_VSCREENINFOFBIOGET_FSCREENINFO如何写fb应用程序在应用程序中,操作/dev/fb的一般步骤如下

1.

打开/dev/fb设备文件。

2.

用ioctrl操作取得当前显示屏幕的参数,如屏幕分辨率,每个像素点的比特数。根据屏幕参数可计算屏幕缓冲区的大小。

3.

将屏幕缓冲区映射到用户空间。

4.

映射后就可以直接读写屏幕缓冲区,进行绘图和图片显示典型应用结构代码(一)intmain()

{

int

fbfd=0;

struct

fb_var_screeninfo

vinfo;

struct

fb_fix_screeninfo

finfo;

longint

screensize=0;

/*打开设备文件*/

fbfd=open("/dev/fb0",O_RDWR);

典型应用结构代码(二)/*取得屏幕相关参数*/

ioctl(fbfd,FBIOGET_FSCREENINFO,&finfo);

ioctl(fbfd,FBIOGET_VSCREENINFO,&vinfo);/*计算屏幕缓冲区大小*/

screensize=vinfo.xres*vinfo.yres*v

温馨提示

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

评论

0/150

提交评论