framebuffer的测试程序.docx
- 文档编号:27116226
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:21
- 大小:24.32KB
framebuffer的测试程序.docx
《framebuffer的测试程序.docx》由会员分享,可在线阅读,更多相关《framebuffer的测试程序.docx(21页珍藏版)》请在冰豆网上搜索。
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.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- framebuffer 测试 程序