framebuffer的测试程序

  • 格式:docx
  • 大小:35.38 KB
  • 文档页数:13

framebuffer帧缓冲

framebuffer简介

帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。framebuffer是LCD对应的一中HAL(硬件抽象层),提供抽象的,统一的接口操作,用户不必关心硬件层是怎么实施的。这些都是由Framebuffer设备驱动来完成的。

帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达32个,分别为/dev/fb0到 /dev/fb31,而/dev/fb则为当前缺省的帧缓冲设备,通常指向/dev/fb0,在嵌入式系统中支持一个显示设备就够了。帧缓冲设备为标准字符设备,主设备号为29,次设备号则从0到31。分别对应/dev/fb0-/dev/fb31。

通过/dev/fb,应用程序的操作主要有这几种:

1. 读/写(read/write)/dev/fb:相当于读/写屏幕缓冲区。

2. 映射(map)操作:由于Linux工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的。而帧缓冲设备可以通过mmap()映射操作将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址上,然后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。

3. I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,屏幕大小等相关参数。ioctl的操作是由底层的驱动程序来完成的。

在应用程序中,操作/dev/fb的一般步骤如下:

1. 打开/dev/fb设备文件。

2. 用ioctl操作取得当前显示屏幕的参数,根据屏幕参数可计算屏幕缓冲区的大小。

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

4. 映射后即可直接读写屏幕缓冲区,进行绘图和图片显示。 图二 用户空间访问帧缓冲设备流程

framebuffer相关数据结构介绍

1. fb_info结构体:帧缓冲设备中最重要的数据结构体,包括了帧缓冲设备属性和操作的完整性属性。

2. fb_ops结构体:fb_info结构体的成员变量,fb_ops为指向底层操作的函数的指针。

3.fb_var_screen和fb_fix_screen结构体:fb_var_screen记录用户可以修改的显示控制器参数,fb_fix_screen记录用户不能修改的显示控制器参数。

具体的结构体参数还有其他相关结构体在这就不做赘述了。

帧缓冲设备驱动的程序结构

图一 帧缓冲设备驱动的程序结构

上图为Linux帧缓冲设备驱动的主要结构,上层为用户空间,中间为内核空间,下面为硬件层。帧缓冲设备的提供给用户空间的file_operations结构体有fbmem.c中的file_operations提供(帧缓冲设备驱动的文件操作已经在femem.c中被用以实现,一般不需要有驱动工程师再编写)。而特定帧缓冲设备fb_info结构体的注册、注销以及其他操作由对应的***fb.c文件实现。fb_ops中的成员函数最终会操作LCD控制器硬件寄存器。编写驱动的主要工作也是实现针对设备fb_info中的fb_ops的成员函数。

framebuffer测试程序

背光检测

测试步骤:LCD背光灯关闭,持续5秒,然后再打开背光灯。观察液晶屏背光亮灭变化,亮–灭—亮表示背光正常,否则不合格。

大概思路:本次测试的板子分辨率为240*320,在/dev/目录下面有个backlight设备,只要将其值修改为0,背光灯就会关闭,改为1背光灯就打开。测试时先打开背光灯,持续5秒,再打开背光灯,观察测试结果。

坏点检测 测试步骤:全黑屏状态,持续5秒,恢复全白屏。若液晶屏全黑、全白条件下,若黑点个数≤3个为良品,否则不合格。

大概思路:先打开帧缓冲设备,然后获取屏幕参数,计算缓冲区大小,将缓冲区填充成黑色,映射到用户空间,显示五秒,接着将缓冲区填充成白色,在映射到用户空间,显示五秒,观察LCD显示的结果。

关键代码:

#include

int main()

{

int fb = 0;

struct fb_var_screeninfo vinfo;

struct fb_fix_screeninfo finfo;

long int screensize = 0;

char *fb_mem=0;

/*打开设备文件*/

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

/*取得屏幕相关参数*/

ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo);

ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo);

/*计算屏幕缓冲区大小*/

screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;

/*通过mmap函数映射屏幕缓冲区到用户地址空间*/

fb_mem=(char*)mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED,

fbfd, 0);

/*下面可通过fbmem指针读写显示设备缓冲区*/

……

/*可用munmap函数删除显存区的数据*//*关闭设备*/

close(fb);

}

mmap()函数:void * mmap(void *start, size_t length, int prot ,

int flags, int fd, off_t offset);

mmap()函数将一个文件或者其它对象映射进内存。mmap()函数有六个参数,第一个start指定记忆体位置,通常为NULL,第二个是映射的内存大小,第三个声明我们将共享内存进行读和写,第四个表示这段内存将和其他进程共享,第五个为打开设备的文件描述,第六个表示被映射对象内容的起点。在framebuffer上面建一个MAP_PRIVATE是不可能的。 通常这意味着你需要中断控制台的切换去备份和恢复屏幕内容,而且不在自己没有权利的时候向屏幕内存写东西。若映射成功则返回映射区的内存起始地址,否则返回MAP_FAILED(-1),错误原因存于errno 中。

munmap()函数:int munmap(void *start, size_t length);

munmap()函数执行和mmap()相反的操作,删除特定地址区域的对象映射。 第一个参数为映射区的开始地址,第二个表示映射区的长度。

颜色检测

测试步骤:让LCD显示常见的颜色,黑、白、红、绿、蓝等等,然后再显示一些颜色渐变,例如黑白渐变,彩色渐变。查看液晶屏渐变色,查看是否缺色、少色。颜色过渡自然平稳为良品,否则不合格。

大概思路:先打开帧缓冲设备,然后获取屏幕参数,计算缓冲区大小,将缓冲区填充为常见的颜色,接着将缓冲区填充成彩色渐变,每次显示停留5秒,观察LCD显示的结果。

关键代码:省略。

注意:上面的换点检测主要在显存区域填充相同的颜色,比较简单,这里的颜色检测涉及到渐变,要注意显示缓冲区与显示点的对应关系,与色彩模式有关。在本机测试时bits_per_pixel=16,用的是RGB565模式。

测试完毕后,调用munmap()函数会删除物理内存和用户空间的对象映射,但是屏幕会停留在最后显示的一帧图像上,没有还原到测试前显示的帧数据。这里我们在测试前,先开辟一段内存空间保存测试前显示的帧数据,等到测试完毕后接着把它填充到帧缓冲区在LCD上显示出来,最后调用munmap()。

Linux framebuffer显示bmp图片

分类: Linux 2012-06-01 12:36 3854人阅读 评论(5) 收藏 举报

linuxfpstruct数据结构headerbyte

framebuffer简介

帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。framebuffer是LCD对应的一中HAL(硬件抽象层),提供抽象的,统一的接口操作,用户不必关心硬件层是怎么实施的。这些都是由Framebuffer设备驱动来完成的。

帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达32个,分别为/dev/fb0到 /dev/fb31,而/dev/fb则为当前缺省的帧缓冲设备,通常指向/dev/fb0,在嵌入式系统中支持一个显示设备就够了。帧缓冲设备为标准字符设备,主设备号为29,次设备号则从0到31。分别对应/dev/fb0-/dev/fb31。

通过/dev/fb,应用程序的操作主要有这几种:

1. 读/写(read/write)/dev/fb:相当于读/写屏幕缓冲区。

2. 映射(map)操作:由于Linux工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的。而帧缓冲设备可以通过mmap()映射操作将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址上,然后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。

3. I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,屏幕大小等相关参数。ioctl的操作是由底层的驱动程序来完成的。

在应用程序中,操作/dev/fb的一般步骤如下:

1. 打开/dev/fb设备文件。

2. 用ioctl操作取得当前显示屏幕的参数,根据屏幕参数可计算屏幕缓冲区的大小。

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

4. 映射后即可直接读写屏幕缓冲区,进行绘图和图片显示。

framebuffer相关数据结构介绍

1. fb_info结构体:帧缓冲设备中最重要的数据结构体,包括了帧缓冲设备属性和操作的完整性属性。

2. fb_ops结构体:fb_info结构体的成员变量,fb_ops为指向底层操作的函数的指针。