1. 本文的copyright归yuweixian4230@163.com 所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
    作者:yuweixian4230@163.com
    博客:yuweixian4230.blog.chinaunix.net

    网址 http://www.cnblogs.com/cute/archive/2011/04/20/2022114.html 有一程序关于 framebuffer,现在我对他进行测试,然后进行分析

  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <stdio.h>
  5. #include <fcntl.h>
  6. #include <linux/fb.h>
  7. #include <linux/kd.h>
  8. #include <sys/mman.h>
  9. #include <sys/ioctl.h>
  10. #include <sys/time.h>
  11. #include <string.h>
  12. #include <errno.h>
  13. struct fb_var_screeninfo vinfo;
  14. struct fb_fix_screeninfo finfo;
  15. char *frameBuffer = 0;
  16. //打印fb驱动中fix结构信息,注:在fb驱动加载后,fix结构不可被修改。
  17. void printFixedInfo ()
  18. {
  19. printf ("Fixed screen info:\n"
  20. "\tid: %s\n"
  21. "\tsmem_start: 0x%lx\n"
  22. "\tsmem_len: %d\n"
  23. "\ttype: %d\n"
  24. "\ttype_aux: %d\n"
  25. "\tvisual: %d\n"
  26. "\txpanstep: %d\n"
  27. "\typanstep: %d\n"
  28. "\tywrapstep: %d\n"
  29. "\tline_length: %d\n"
  30. "\tmmio_start: 0x%lx\n"
  31. "\tmmio_len: %d\n"
  32. "\taccel: %d\n"
  33. "\n",
  34. finfo.id, finfo.smem_start, finfo.smem_len, finfo.type,
  35. finfo.type_aux, finfo.visual, finfo.xpanstep, finfo.ypanstep,
  36. finfo.ywrapstep, finfo.line_length, finfo.mmio_start,
  37. finfo.mmio_len, finfo.accel);
  38. }
  39. //打印fb驱动中var结构信息,注:fb驱动加载后,var结构可根据实际需要被重置
  40. void printVariableInfo ()
  41. {
  42. printf ("Variable screen info:\n"
  43. "\txres: %d\n"
  44. "\tyres: %d\n"
  45. "\txres_virtual: %d\n"
  46. "\tyres_virtual: %d\n"
  47. "\tyoffset: %d\n"
  48. "\txoffset: %d\n"
  49. "\tbits_per_pixel: %d\n"
  50. "\tgrayscale: %d\n"
  51. "\tred: offset: %2d, length: %2d, msb_right: %2d\n"
  52. "\tgreen: offset: %2d, length: %2d, msb_right: %2d\n"
  53. "\tblue: offset: %2d, length: %2d, msb_right: %2d\n"
  54. "\ttransp: offset: %2d, length: %2d, msb_right: %2d\n"
  55. "\tnonstd: %d\n"
  56. "\tactivate: %d\n"
  57. "\theight: %d\n"
  58. "\twidth: %d\n"
  59. "\taccel_flags: 0x%x\n"
  60. "\tpixclock: %d\n"
  61. "\tleft_margin: %d\n"
  62. "\tright_margin: %d\n"
  63. "\tupper_margin: %d\n"
  64. "\tlower_margin: %d\n"
  65. "\thsync_len: %d\n"
  66. "\tvsync_len: %d\n"
  67. "\tsync: %d\n"
  68. "\tvmode: %d\n"
  69. "\n",
  70. vinfo.xres, vinfo.yres, vinfo.xres_virtual, vinfo.yres_virtual,
  71. vinfo.xoffset, vinfo.yoffset, vinfo.bits_per_pixel,
  72. vinfo.grayscale, vinfo.red.offset, vinfo.red.length,
  73. vinfo.red.msb_right, vinfo.green.offset, vinfo.green.length,
  74. vinfo.green.msb_right, vinfo.blue.offset, vinfo.blue.length,
  75. vinfo.blue.msb_right, vinfo.transp.offset, vinfo.transp.length,
  76. vinfo.transp.msb_right, vinfo.nonstd, vinfo.activate,
  77. vinfo.height, vinfo.width, vinfo.accel_flags, vinfo.pixclock,
  78. vinfo.left_margin, vinfo.right_margin, vinfo.upper_margin,
  79. vinfo.lower_margin, vinfo.hsync_len, vinfo.vsync_len,
  80. vinfo.sync, vinfo.vmode);
  81. }
  82. //画大小为width*height的同色矩阵,8alpha+8reds+8greens+8blues
  83. void
  84. drawRect_rgb32 (int x0, int y0, int width, int height, int color)
  85. {
  86. const int bytesPerPixel = 4;
  87. const int stride = finfo.line_length / bytesPerPixel;
  88. int *dest = (int *) (frameBuffer)
  89. + (y0 + vinfo.yoffset) * stride + (x0 + vinfo.xoffset);
  90. int x, y;
  91. for (y = 0; y < height; ++y)
  92. {
  93. for (x = 0; x < width; ++x)
  94. {
  95. dest[x] = color;
  96. }
  97. dest += stride;
  98. }
  99. }
  100. //画大小为width*height的同色矩阵,5reds+6greens+5blues
  101. void
  102. drawRect_rgb16 (int x0, int y0, int width, int height, int color)
  103. {
  104. const int bytesPerPixel = 2;
  105. const int stride = finfo.line_length / bytesPerPixel;
  106. const int red = (color & 0xff0000) >> (16 + 3);
  107. const int green = (color & 0xff00) >> (8 + 2);
  108. const int blue = (color & 0xff) >> 3;
  109. const short color16 = blue | (green << 5) | (red << (5 + 6));
  110. short *dest = (short *) (frameBuffer)
  111. + (y0 + vinfo.yoffset) * stride + (x0 + vinfo.xoffset);
  112. int x, y;
  113. for (y = 0; y < height; ++y)
  114. {
  115. for (x = 0; x < width; ++x)
  116. {
  117. dest[x] = color16;
  118. }
  119. dest += stride;
  120. }
  121. }
  122. //画大小为width*height的同色矩阵,5reds+5greens+5blues
  123. void drawRect_rgb15 (int x0, int y0, int width, int height, int color)
  124. {
  125. const int bytesPerPixel = 2;
  126. const int stride = finfo.line_length / bytesPerPixel;
  127. const int red = (color & 0xff0000) >> (16 + 3);
  128. const int green = (color & 0xff00) >> (8 + 3);
  129. const int blue = (color & 0xff) >> 3;
  130. const short color15 = blue | (green << 5) | (red << (5 + 5)) | 0x8000;
  131. short *dest = (short *) (frameBuffer)
  132. + (y0 + vinfo.yoffset) * stride + (x0 + vinfo.xoffset);
  133. int x, y;
  134. for (y = 0; y < height; ++y)
  135. {
  136. for (x = 0; x < width; ++x)
  137. {
  138. dest[x] = color15;
  139. }
  140. dest += stride;
  141. }
  142. }
  143. void drawRect (int x0, int y0, int width, int height, int color)
  144. {
  145. switch (vinfo.bits_per_pixel)
  146. {
  147. case 32:
  148. drawRect_rgb32 (x0, y0, width, height, color);
  149. break;
  150. case 16:
  151. drawRect_rgb16 (x0, y0, width, height, color);
  152. break;
  153. case 15:
  154. drawRect_rgb15 (x0, y0, width, height, color);
  155. break;
  156. default:
  157. printf ("Warning: drawRect() not implemented for color depth %i\n",
  158. vinfo.bits_per_pixel);
  159. break;
  160. }
  161. }
  162. #define PERFORMANCE_RUN_COUNT 5
  163. void performSpeedTest (void *fb, int fbSize)
  164. {
  165. int i, j, run;
  166. struct timeval startTime, endTime;
  167. unsigned long long results[PERFORMANCE_RUN_COUNT];
  168. unsigned long long average;
  169. unsigned int *testImage;
  170. unsigned int randData[17] = {
  171. 0x3A428472, 0x724B84D3, 0x26B898AB, 0x7D980E3C, 0x5345A084,
  172. 0x6779B66B, 0x791EE4B4, 0x6E8EE3CC, 0x63AF504A, 0x18A21B33,
  173. 0x0E26EB73, 0x022F708E, 0x1740F3B0, 0x7E2C699D, 0x0E8A570B,
  174. 0x5F2C22FB, 0x6A742130
  175. };
  176. printf ("Frame Buffer Performance test...\n");
  177. for (run = 0; run < PERFORMANCE_RUN_COUNT; ++run)
  178. {
  179. /* Generate test image with random(ish) data: */
  180. testImage = (unsigned int *) malloc (fbSize);
  181. j = run;
  182. for (i = 0; i < (int) (fbSize / sizeof (int)); ++i)
  183. {
  184. testImage[i] = randData[j];
  185. j++;
  186. if (j >= 17)
  187. j = 0;
  188. }
  189. gettimeofday (&startTime, NULL);
  190. memcpy (fb, testImage, fbSize);
  191. gettimeofday (&endTime, NULL);
  192. long secsDiff = endTime.tv_sec - startTime.tv_sec;
  193. results[run] =
  194. secsDiff * 1000000 + (endTime.tv_usec - startTime.tv_usec);
  195. free (testImage);
  196. }
  197. average = 0;
  198. for (i = 0; i < PERFORMANCE_RUN_COUNT; ++i)
  199. average += results[i];
  200. average = average / PERFORMANCE_RUN_COUNT;
  201. printf (" Average: %llu usecs\n", average);
  202. printf (" Bandwidth: %.03f MByte/Sec\n",
  203. (fbSize / 1048576.0) / ((double) average / 1000000.0));
  204. printf (" Max. FPS: %.03f fps\n\n",
  205. 1000000.0 / (double) average);
  206. /* Clear the framebuffer back to black again: */
  207. memset (fb, 0, fbSize);
  208. }
  209. int main (int argc, char **argv)
  210. {
  211. const char *devfile = "/dev/fb0";
  212. long int screensize = 0;
  213. int fbFd = 0;
  214. /* Open the file for reading and writing */
  215. fbFd = open (devfile, O_RDWR);
  216. if (fbFd == -1)
  217. {
  218. perror ("Error: cannot open framebuffer device");
  219. exit (1);
  220. }
  221. //获取finfo信息并显示
  222. if (ioctl (fbFd, FBIOGET_FSCREENINFO, &finfo) == -1)
  223. {
  224. perror ("Error reading fixed information");
  225. exit (2);
  226. }
  227. printFixedInfo ();
  228. //获取vinfo信息并显示
  229. if (ioctl (fbFd, FBIOGET_VSCREENINFO, &vinfo) == -1)
  230. {
  231. perror ("Error reading variable information");
  232. exit (3);
  233. }
  234. printVariableInfo ();
  235. /* Figure out the size of the screen in bytes */
  236. screensize = finfo.smem_len;
  237. /* Map the device to memory */
  238. frameBuffer =
  239. (char *) mmap (0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,
  240. fbFd, 0);
  241. if (frameBuffer == MAP_FAILED)
  242. {
  243. perror ("Error: Failed to map framebuffer device to memory");
  244. exit (4);
  245. }
  246. //测试virt fb的性能
  247. performSpeedTest (frameBuffer, screensize);
  248. printf ("Will draw 3 rectangles on the screen,\n"
  249. "they should be colored red, green and blue (in that order).\n");
  250. drawRect (vinfo.xres / 8, vinfo.yres / 8,
  251. vinfo.xres / 4, vinfo.yres / 4, 0xffff0000);
  252. drawRect (vinfo.xres * 3 / 8, vinfo.yres * 3 / 8,
  253. vinfo.xres / 4, vinfo.yres / 4, 0xff00ff00);
  254. drawRect (vinfo.xres * 5 / 8, vinfo.yres * 5 / 8,
  255. vinfo.xres / 4, vinfo.yres / 4, 0xff0000ff);
  256. sleep (5);
  257. printf (" Done.\n");
  258. munmap (frameBuffer, screensize); //解除内存映射,与mmap对应
  259. close (fbFd);
  260. return 0;
  261. }

显示效果

framebuffer小程序显示3个矩形 测试相关推荐

  1. 微信小程序显示分页列表

    目录 微信小程序创建项目配置底部导航栏 微信小程序滚动播放内容 微信小程序功能中心模块开发 微信小程序个人中心页面开发 微信小程序获取电话号码 微信小程序显示列表数据 微信小程序显示分页列表 微信小程 ...

  2. 【微信小程序】小程序显示弹窗时禁止下层的内容滚动|遮罩层滚动穿透

    小程序显示弹窗时禁止下层的内容滚动|遮罩层滚动穿透 第一种方式 页面上加catchtouchmove="consume" JS // 把这个事件给消耗掉,这是是必须写的, 不写是可 ...

  3. 小程序 显示细线_精心设计:高密度显示器上的细线

    小程序 显示细线 Despite the many benefits of Retina displays, there is one clear drawback that must be cons ...

  4. 微信小程序java中文乱码_如何解决微信小程序显示中文无法上传或者出现乱码的问题?...

    今天小编给大家讲解如何解决微信小程序显示中文无法上传或者出现乱码的问题?有需要或者有兴趣的朋友们可以看一看下文,相信对大家会有所帮助的. 在formData中对文字进行编码,使用encodeURI() ...

  5. 微信小程序显示cms里的html文章

    最近领导让我研究一下微信小程序,将cms里的文章显示到微信小程序里.本以为是个简单的功能,但看了微信的开发文档之后才发现小程序不能解析html文档,也不支持跳转到web页面.微信小程序我就不多介绍了官 ...

  6. 微信小程序:实用的智力测试智商提升

    这是一个考验智力,心里上面的一个测试游戏 支持多种测试方法比如有: 智商测试丨情商测试 性格测试丨爱情测试 抑郁症测试丨焦虑症测试 心理压力测试丨生活满意度测试 通过不同的测试,来检查你的智力,情商等 ...

  7. 导入微信小程序显示未选择环境或未指定环境,解决办法

    导入微信小程序显示未选择环境或未指定环境 如下图所示: 解决办法:重新导入,选择云开发(需删掉以前的导入记录) 1.点击云开发申请通过 2.右键cloudfuncrions, 3.点击同步云函数列表 ...

  8. 解决uniapp在微信小程序显示图片/数据,h5不显示图片/数据。

    配置跨域 首先在mainifest.json中的源码视图中配置跨域. "h5": {"devServer": {"port": 8080,& ...

  9. 微信小程序WIFI部分全部API测试以及踩的坑

    引言 首先在测试全部API之前,我一直认为老师留这个任务是为了让我们去"解决问题",而一直以来大学所有的实验课都是"解决问题"为目的,这就导致我在主观的过程中有 ...

最新文章

  1. JGG:口腔微生物组助力妊娠糖尿病识别
  2. React Native JSBundle拆包之原理篇
  3. earning Multi-Domain Convolutional Neural Networks for Visual Tracking
  4. Google protobuf使用技巧和经验
  5. 使用solr的完整流程
  6. 云在天之南——我的七天七夜(率性苍山洱海)
  7. 用VS2008做博客¥(^_^)¥
  8. python粘性拓展_Python拓展
  9. 英特尔边缘软件中心介绍
  10. 华为平均每天收入23.5亿元!重磅发布2019年年报!
  11. 香港黄金配角吴孟达去世,80后程序员以轮播图来悼念达叔,达叔一路走好!
  12. C++编译原理,O1 O2 O3编译优化
  13. 爬虫数据分析:上海旅游景点排名分析
  14. iOS和Android和H5交互WebViewJavascriptBridge
  15. 大尺寸共阴数码管驱动电路
  16. 2021年9月国产数据库排行榜-墨天轮:达梦奋起直追紧逼OceanBase,openGauss反超PolarDB再升一位
  17. Ubuntu安装Source Insight导入Android源码并设置仿IDEA主题Darcula
  18. redis清空所有数据 php
  19. java分析内存泄露工具_Eclipse Memory Analyzer(Java内存泄漏分析工具)
  20. ctfshow 图片篇(信息附加)

热门文章

  1. 如何使错误日志更加方便排查问题
  2. 2020 年 Java 面试常见 350 题
  3. Redis+分布式+设计模式+Spring全家桶+Dubbo阿里P8技术精选文档
  4. Spring Boot 2.x基础教程:使用Swagger2构建强大的API文档
  5. linux mysql5.6 编码_CentOS 7下修改MySQL5.6编码方式 解决网站中文显示问号
  6. 进栈顺序为abcd则出栈顺序为_线性表之顺序表示
  7. windows 安装cython-bbox
  8. python wget
  9. 图像去重imagededup
  10. 我的csdnmark