欢迎来到天天文库
浏览记录
ID:30930440
大小:35.38 KB
页数:13页
时间:2019-01-04
《framebuffer的测试程序》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、framebuffer帧缓冲framebuffer简介 帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。framebuffer是LCD对应的一中HAL(硬件抽象层),提供抽象的,统一的接口操作,用户不必关心硬件层是怎么实施的。这些都是由Framebuffer设备驱动来完成的。 帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲
2、设备,最多可达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工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序
3、中是不能直接访问物理缓冲区地址的。而帧缓冲设备可以通过mmap()映射操作将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址上,然后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。3.I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,屏幕大小等相关参数。ioctl的操作是由底层的驱动程序来完成的。在应用程序中,操作/dev/fb的一般步骤如下:1.打开/dev/fb设备文件。2.用ioctl操作取得当前显示屏幕的参数,根据屏幕参数可计算屏
4、幕缓冲区的大小。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_
5、screen记录用户不能修改的显示控制器参数。具体的结构体参数还有其他相关结构体在这就不做赘述了。帧缓冲设备驱动的程序结构 图一帧缓冲设备驱动的程序结构 上图为Linux帧缓冲设备驱动的主要结构,上层为用户空间,中间为内核空间,下面为硬件层。帧缓冲设备的提供给用户空间的file_operations结构体有fbmem.c中的file_operations提供(帧缓冲设备驱动的文件操作已经在femem.c中被用以实现,一般不需要有驱动工程师再编写)。而特定帧缓冲设备fb_info结构体的
6、注册、注销以及其他操作由对应的***fb.c文件实现。fb_ops中的成员函数最终会操作LCD控制器硬件寄存器。编写驱动的主要工作也是实现针对设备fb_info中的fb_ops的成员函数。framebuffer测试程序背光检测测试步骤:LCD背光灯关闭,持续5秒,然后再打开背光灯。观察液晶屏背光亮灭变化,亮–灭—亮表示背光正常,否则不合格。大概思路:本次测试的板子分辨率为240*320,在/dev/目录下面有个backlight设备,只要将其值修改为0,背光灯就会关闭,改为1背光灯就打开。测试时先打
7、开背光灯,持续5秒,再打开背光灯,观察测试结果。坏点检测测试步骤:全黑屏状态,持续5秒,恢复全白屏。若液晶屏全黑、全白条件下,若黑点个数≤3个为良品,否则不合格。大概思路:先打开帧缓冲设备,然后获取屏幕参数,计算缓冲区大小,将缓冲区填充成黑色,映射到用户空间,显示五秒,接着将缓冲区填充成白色,在映射到用户空间,显示五秒,观察LCD显示的结果。关键代码:#includeintmain(){ intfb=0; structfb_var_screeninfovinfo;
8、 structfb_fix_screeninfofinfo; longintscreensize=0; char*fb_mem=0; /*打开设备文件*/ fb=open("/dev/fb0",O_RDWR); /*取得屏幕相关参数*/ ioctl(fbfd,FBIOGET_FSCREENINFO,&finfo); ioctl(fbfd,FBIOGET_VSCREENINFO,&vinfo); /*计算屏幕缓冲区大
此文档下载收益归作者所有