《07显示设备接口与帧缓冲》由会员分享,可在线阅读,更多相关《07显示设备接口与帧缓冲(42页珍藏版)》请在金锄头文库上搜索。
1、显示设备接口与帧缓冲,1,LCD接口设计,LCD显示模块 液晶显示是一种被动的显示,它不能发光,只能使用周围环境的光。它显示图案或字符只需很小能量。液晶显示所用的液晶材料是一种兼有液态和固体双重性质的有机物,它的棒状结构在液晶盒内一般平行排列,但在电场作用下能改变其排列方向。 LCD的背光: EL(场致发光):2000-3000小时 LED光源:50000小时 新CCFL:60000小时,2,LCD的显示方式,反射型LCD:底偏光片后面加了一块反射板,它一般在户外和光线良好的办公室使用。 透射型LCD:底偏光片是透射偏光片,它需要连续使用背光源,一般在光线差的环境使用。 透反射型LCD:是处于
2、以上两者之间,底偏光片能部分反光,一般也带背光源,光线好的时候,可关掉背光源;光线差时,可点亮背光源使用LCD。,3,常见的液晶显示器物理结构,扭曲向列型(TNTwisted Nematic) 超扭曲向列型(STNSuper TN) 双层超扭曲向列型(DSTNDual Scan Tortuosity Nomograph) 薄膜晶体管型(TFTThin Film Transistor) 其中TNLCD、STNLCD和DSYNLCD的基本显示原理都相同,只是液晶分子的扭曲角度不同而已。而TFTLCD则采用截然不同的显示方式。,4,LCD通常由两种方式 一种是带有LCD扫描芯片的LCD模块 一种是通
3、过LCD控制器,直接扫描LCD屏。 比如:S3C2410处理器,带有LCD控制器,显示缓存和系统内存公用。可以支持STN(彩色/灰度)和TFT两种模式的LCD。 TFT模式下最多支持24位色,800 x600分辨率。,LCD的驱动方式,5,嵌入式处理器与LCD的连接,6,片外的LCD控制器,7,集成了LCD控制器的嵌入式处理器体系结构,8,典型的LCD模式信号线,LDD,数据线 L_PCLK,点时钟 L_LCLK,行频 L_FCLK,帧频 L_BIAS,CSTN的AC信号,TFT的开启信号,9,S3C2410的LCD扫描模式,4/8位,单/双扫描模式,CSTN 最多256级灰度 显示缓冲区支持
4、15、16、24位TFT模式 支持RGB格式,10,4位单扫描STN模式,11,4位单扫描显示缓冲的对应关系,1个字节存储两个点的信息 16级灰度,12,8位CSTN屏幕点阵:320 x240,13,8位单扫描CSTN模式,14,8位单扫描显示缓冲的对应关系,1个字节存储1个点的信息 可以是用调色板,标准映射:,15,16位单扫描TFT模式,16,16/15位显示缓冲的对应关系,17,Linux系统下Framebuffer设备,帧缓冲(framebuffer)是 Linux 为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是
5、抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer 设备驱动来完成的。 嵌入式系统下大多采用Framebuffer设备来实现显示设备LCD驱动。,18,Linux系统下Framebuffer设备,Framebuffer在系统中的位置,19,Linux系统下Framebuffer设备,帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux 下还可支持多个帧缓冲设备,最多可达 32 个,分别为/dev/fb0 到/dev/fb31,而/dev/fb 则为当前缺省的帧缓冲设备,通常指向/dev/fb0。 当然在嵌入式系统中支持一个
6、显示设备就够了。帧缓冲设备为标准字符设备,主设备号为29,次设备号则从0到31。分别对应/dev/fb0到/dev/fb31。,20,Framebuffer驱动结构,FrameBuffer设备驱动基于如下两个文件:linux/include/linux/fb.hlinux/drivers/video/fbmem.c 与平台相关的设备驱动文件: linux/drivers/video/s3c-fb.c,21,Framebuffer驱动结构,FrameBuffer帧缓冲的重要数据结构: fb_info fb_var_screeninfo fb_fix_screeninfo fb_cmap fb_o
7、ps 在fb.h中定义,22,Framebuffer驱动结构,struct fb_info int node; int flags; struct fb_var_screeninfo var; /* Current var */ struct fb_fix_screeninfo fix; /* Current fix */ struct fb_monspecs monspecs; /* Current Monitor specs */ ; 该结构是LINUX系统定义的framebuffer设备驱动接口。定义了当前显卡framebuffer设备状态,一个显卡可能有两个framebuffer,在这
8、种情况下,就需要两个fb_info结构。这个结构是唯一在内核空间可见的。在这个结构中有一个fb_ops指针,指向驱动设备工作所需的函数集。,23,Framebuffer驱动结构,struct fb_fix_screeninfo char id16; /* identification string eg TT Builtin */ unsigned long smem_start; /* Start of frame buffer mem */ /* (physical address) */ _u32 smem_len; /* Length of frame buffer mem */ _u
9、32 type; /* see FB_TYPE_* */ _u32 visual; /* see FB_VISUAL_* */ ; 该结构用来描述设备无关,不可变更的信息。可以使用FBIOGET_FSCREENINFO 命令来获取该结构相应信息。,24,Framebuffer驱动结构,struct fb_var_screeninfo _u32 xres; /* visible resolution */ _u32 yres; _u32 xres_virtual; /* virtual resolution */ _u32 yres_virtual; _u32 xoffset; /* offse
10、t from virtual to visible */ _u32 yoffset; ; 该结构用来描述设备无关,用户可变更的信息。可以使用FBIOGET_VSCREENINFO 命令来获取该结构相应信息,使用FBIOPUT_VSCREENINFO 命令来设置该结构相应信息。,25,Framebuffer驱动结构,struct fb_cmap _u32 start; /* First entry */ _u32 len; /* Number of entries */ _u16 *red; /* Red values */ _u16 *green; _u16 *blue; _u16 *tran
11、sp; /* transparency, can be NULL */ ; 该结构描述设备无关的颜色映射信息。可以通过FBIOGETCMAP和FBIOPUTCMAP 对应的ioctl操作设定或获取颜色映射信息.,26,Framebuffer驱动API,Linux系统中对帧缓冲设备的操作是通过,fb_ops结构来完成和定义的。用户可以通过ioctl接口来完成对fb_ops结构中定义的功能函数的调用。 帧缓冲驱动程序的主要工作就是编写fb_ops结构中的接口函数。,27,Framebuffer驱动API,struct fb_ops /* open/release and usage marking
12、 */ struct module *owner; int (*fb_open)(struct fb_info *info, int user); int (*fb_release)(struct fb_info *info, int user); ssize_t (*fb_read)(struct fb_info *info, char _user *buf, size_t count, loff_t *ppos); ssize_t (*fb_write)(struct fb_info *info, const char _user *buf, size_t count, loff_t *p
13、pos); int (*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma); int (*fb_ioctl)(struct fb_info *info, unsigned int cmd,unsigned long arg); ;,28,Framebuffer驱动API,fb_ops结构中常见的接口函数: fb_open:打开帧缓冲设备 fb_release:关闭帧缓冲设备 fb_read:帧缓冲设备的读操作 fb_write:帧缓冲设备的写操作 fb_mmap:帧缓冲设备的内存映射操作 fb_ioctl:帧缓冲设备的ioctl
14、操作,29,Framebuffer帧缓冲内核驱动核心,fbmem.c 实现了如下函数. register_framebuffer(struct fb_info *fb_info); unregister_framebuffer(struct fb_info *fb_info); 这两个是提供给下层FrameBuffer设备驱动的接口,设备驱动通过这两函数向系统注册或注销自己。几乎底层设备驱动所要做的所有事情就是填充fb_info结构然后向系统注册或注销它。,30,Framebuffer帧缓冲设备驱动程序分析,内核源码目录(driver/video/)下的s3c-fb.c文件是S5PV210处理
15、器帧缓冲设备硬件相关的驱动程序。 s3c-fb.c驱动程序主要完成以下工作: 初始化LCD控制器、设置显示模式、分配显示缓存。 分配并初始化fb_info结构,填充其成员函数。 调用 register_framebuffer(struct fb_info *fb_info),函数向系统注册帧缓冲设备驱动程序。,31,Linux内核对framebuffer帧缓冲的支持,Linux内核对framebuffer帧缓冲设备有着良好的支持。 make menuconfig配置菜单: - Device Drivers - Graphics support - Support for frame buffer devices (FB =y),32,Linux内核对framebuffer帧缓冲的支持, Support for frame buffer devices -,33,Linux内核对framebuffer帧缓冲的支持, Samsung S3C framebuffer support,34,Framebuffer帧缓冲设备的操作,应用程序对framebuffer帧缓冲设备的操作有以下几种: 读/写 读/写(read/write)/dev/fb:相当于读/写屏幕缓冲区。 例如: 用 cp /dev/fb0 tmp 命令可将当前屏幕的内容拷贝到一个文件中,