framebuffer的测试程序.docx

上传人:b****5 文档编号:14776780 上传时间:2023-06-27 格式:DOCX 页数:21 大小:24.32KB
下载 相关 举报
framebuffer的测试程序.docx_第1页
第1页 / 共21页
framebuffer的测试程序.docx_第2页
第2页 / 共21页
framebuffer的测试程序.docx_第3页
第3页 / 共21页
framebuffer的测试程序.docx_第4页
第4页 / 共21页
framebuffer的测试程序.docx_第5页
第5页 / 共21页
framebuffer的测试程序.docx_第6页
第6页 / 共21页
framebuffer的测试程序.docx_第7页
第7页 / 共21页
framebuffer的测试程序.docx_第8页
第8页 / 共21页
framebuffer的测试程序.docx_第9页
第9页 / 共21页
framebuffer的测试程序.docx_第10页
第10页 / 共21页
framebuffer的测试程序.docx_第11页
第11页 / 共21页
framebuffer的测试程序.docx_第12页
第12页 / 共21页
framebuffer的测试程序.docx_第13页
第13页 / 共21页
framebuffer的测试程序.docx_第14页
第14页 / 共21页
framebuffer的测试程序.docx_第15页
第15页 / 共21页
framebuffer的测试程序.docx_第16页
第16页 / 共21页
framebuffer的测试程序.docx_第17页
第17页 / 共21页
framebuffer的测试程序.docx_第18页
第18页 / 共21页
framebuffer的测试程序.docx_第19页
第19页 / 共21页
framebuffer的测试程序.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

framebuffer的测试程序.docx

《framebuffer的测试程序.docx》由会员分享,可在线阅读,更多相关《framebuffer的测试程序.docx(21页珍藏版)》请在冰点文库上搜索。

framebuffer的测试程序.docx

framebuffer的测试程序

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

intmain()

{    intfb=0;    structfb_var_screeninfovinfo;    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);    /*计算屏幕缓冲区大小*/    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_tlength,intprot,intflags,intfd,off_toffset);

mmap()函数将一个文件或者其它对象映射进内存。

mmap()函数有六个参数,第一个start指定记忆体位置,通常为NULL,第二个是映射的内存大小,第三个声明我们将共享内存进展读和写,第四个表示这段内存将和其他进程共享,第五个为翻开设备的文件描述,第六个表示被映射对象内容的起点。

在framebuffer上面建一个MAP_PRIVATE是不可能的。

通常这意味着你需要中断控制台的切换去备份和恢复屏幕内容,而且不在自己没有权利的时候向屏幕内存写东西。

假设映射成功那么返回映射区的内存起始地址,否那么返回MAP_FAILED(-1),错误原因存于errno中。

         munmap()函数:

intmunmap(void*start,size_tlength);

munmap()函数执行和mmap()相反的操作,删除特定地址区域的对象映射。

第一个参数为映射区的开场地址,第二个表示映射区的长度。

颜色检测

测试步骤:

让LCD显示常见的颜色,黑、白、红、绿、蓝等等,然后再显示一些颜色渐变,例如黑白渐变,彩色渐变。

查看液晶屏渐变色,查看是否缺色、少色。

颜色过渡自然平稳为良品,否那么不合格。

大概思路:

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

关键代码:

省略。

注意:

上面的换点检测主要在显存区域填充一样的颜色,比拟简单,这里的颜色检测涉及到渐变,要注意显示缓冲区与显示点的对应关系,与色彩模式有关。

在本机测试时bits_per_pixel=16,用的是RGB565模式。

测试完毕后,调用munmap()函数会删除物理内存和用户空间的对象映射,但是屏幕会停留在最后显示的一帧图像上,没有复原到测试前显示的帧数据。

这里我们在测试前,先开辟一段内存空间保存测试前显示的帧数据,等到测试完毕后接着把它填充到帧缓冲区在LCD上显示出来,最后调用munmap()。

 

Linuxframebuffer显示bmp图片

分类:

Linux2012-06-0112:

363854人阅读评论(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为指向底层操作的函数的指针。

3.fb_var_screen和fb_fix_screen构造体:

fb_var_screen记录用户可以修改的显示控制器参数,fb_fix_screen记录用户不能修改的显示控制器参数。

以下代码使用framebuffer显示一张图片:

[cpp]viewplaincopyprint?

1.#include   

2.#include   

3.#include   

4.#include   

5.#include   

6.#include   

7.#include   

8.#include   

9.#include   

10.  

11.  

12.//14byte文件头  

13.typedef struct  

14.{  

15.    char cfType[2];//文件类型,"BM"(0x4D42)  

16.    long cfSize;//文件大小〔字节〕  

17.    long cfReserved;//保存,值为0  

18.    long cfoffBits;//数据区相对于文件头的偏移量〔字节〕  

19.}__attribute__((packed)) BITMAPFILEHEADER;  

20.//__attribute__((packed))的作用是告诉编译器取消构造在编译过程中的优化对齐  

21.  

22.//40byte信息头  

23.typedef struct  

24.{  

25.    char ciSize[4];//BITMAPFILEHEADER所占的字节数  

26.    long ciWidth;//宽度  

27.    long ciHeight;//高度  

28.    char ciPlanes[2];//目标设备的位平面数,值为1  

29.    int ciBitCount;//每个像素的位数  

30.    char cipress[4];//压缩说明  

31.    char ciSizeImage[4];//用字节表示的图像大小,该数据必须是4的倍数  

32.    char ciXPelsPerMeter[4];//目标设备的水平像素数/米  

33.    char ciYPelsPerMeter[4];//目标设备的垂直像素数/米  

34.    char ciClrUsed[4]; //位图使用调色板的颜色数  

35.    char ciClrImportant[4]; //指定重要的颜色数,当该域的值等于颜色数时〔或者等于0时〕,表示所有颜色都一样重要  

36.}__attribute__((packed)) BITMAPINFOHEADER;  

37.  

38.typedef struct  

39.{  

40.    unsigned short blue;  

41.    unsigned short green;  

42.    unsigned short red;  

43.    unsigned short reserved;  

44.}__attribute__((packed)) PIXEL;//颜色模式RGB  

45.  

46.BITMAPFILEHEADER FileHead;  

47.BITMAPINFOHEADER InfoHead;  

48.  

49.static char *fbp = 0;  

50.static int xres = 0;  

51.static int yres = 0;  

52.static int bits_per_pixel = 0;  

53.  

54.int show_bmp();  

55.  

56.int main ( int argc, char *argv[] )  

57.{  

58.    int fbfd = 0;  

59.    struct fb_var_screeninfo vinfo;  

60.    struct fb_fix_screeninfo finfo;  

61.    long int screensize = 0;  

62.    struct fb_bitfield red;  

63.    struct fb_bitfield green;  

64.    struct fb_bitfield blue;  

65.  

66.    //翻开显示设备  

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

68.    if (!

fbfd)  

69.    {  

70.        printf("Error:

 cannot open framebuffer device.\n");  

71.        exit

(1);  

72.    }  

73.  

74.    if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo))  

75.    {  

76.        printf("Error:

reading fixed information.\n");  

77.        exit

(2);  

78.    }  

79.  

80.    if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo))  

81.    {  

82.        printf("Error:

 reading variable information.\n");  

83.        exit(3);  

84.    }  

85.  

86.    printf("R:

%d,G:

%d,B:

%d \n", vinfo.red, vinfo.green, vinfo.blue );  

87.  

88.    printf("%dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel );  

89.    xres = vinfo.xres;  

90.    yres = vinfo.yres;  

91.    bits_per_pixel = vinfo.bits_per_pixel;  

92.  

93.    //计算屏幕的总大小〔字节〕  

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

95.    printf("screensize=%d byte\n",screensize);  

96.  

97.    //对象映射  

98.    fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);  

99.    if ((int)fbp == -1)  

100.    {  

101.        printf("Error:

 failed to map framebuffer device to memory.\n");  

102.        exit(4);  

103.    }  

104.  

105.    printf("sizeof file header=%d\n", sizeof(BITMAPFILEHEADER));  

106.  

107.    printf("into show_bmp function\n");  

108.  

109.    //显示图像  

110.    show_bmp();  

111.  

112.    //删除对象映射  

113.    munmap(fbp, screensize);  

114.    close(fbfd);  

115.    return 0;  

116.}  

117.  

118.int show_bmp()  

119.{  

120.    FILE *fp;  

121.    int rc;  

122.    int line_x, line_y;  

123.    long int location = 0, BytesPerLine = 0;  

124.    char tmp[1024*10];  

125.  

126.    fp = fopen( "./niu.bmp", "rb" );  

127.    if (fp == NULL)  

128.    {  

129.        return( -1 );  

130.    }  

131.  

132.    rc = fread( &FileHead, sizeof(BITMAPFILEHEADER),1, fp );  

133.    if ( rc !

= 1)  

134.    {  

135.        printf("read header error!

\n");  

136.        fclose( fp );  

137.        return( -2 );  

138.    }  

139.  

140.    //检测是否是bmp图像  

141.    if (memcmp(FileHead.cfType, "BM", 2) !

= 0)  

142.    {  

143.        printf("it's not a BMP file\n");  

144.        fclose( fp );  

145.        return( -3 );  

146.    }  

147.  

148.    rc = fread( (char *)&InfoHead, sizeof(BITMAPINFOHEADER),1, fp );  

149.    if ( rc !

= 1)  

150.    {  

151.        printf("read infoheader error!

\n");  

152.        fclose( fp );  

153.        return( -4 );  

154.    }  

155.  

156.    //跳转的数据区  

157.    fseek(fp, FileHead.cfoffBits, SEEK_SET);  

158.    //每行字节数  

159.    BytesPerLine = (InfoHead.ciWidth * InfoHead.ciBitCount + 31) / 32 * 4;  

160.  

161.    line_x = line_y = 0;  

162.    //向framebuffer中写BMP图片  

163.    while(!

feof(fp))  

164.    {  

165.        PIXEL pix;  

166.        unsigned short int tmp;  

167.        rc = fread( (char *)&pix, 1, sizeof(PIXEL), fp);  

168.        if (rc !

= sizeof(PIXEL))  

169.            break;  

170.        location = line_x * bits_per_pixel / 8 + (InfoHead.ciHeight - line_y - 1) * xres * bits_per_pixel / 8;  

171.  

172.        //显示每一个像素  

173.        *(fbp + location + 0)=pix.blue;  

174.        *(fbp + location + 1)=pix.green;  

175.        *(fbp + location + 2)=pix.red;  

176.        *(fbp + location + 3)=pix.reserved;  

177.  

178.        line_x++;  

179.        if (line_x == InfoHead.ciWidth )  

180.        {  

181.            line_x = 0;  

182.         

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2