framebuffer小程序显示3个矩形 测试

  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 (= 0; y < height; ++y)
  92.      {
  93.          for (= 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) >> (+ 2);
  108.      const int blue = (color & 0xff) >> 3;
  109.      const short color16 = blue | (green << 5) | (red << (+ 6));


  110.      short *dest = (short *) (frameBuffer)
  111.          + (y0 + vinfo.yoffset) * stride + (x0 + vinfo.xoffset);


  112.      int x, y;
  113.      for (= 0; y < height; ++y)
  114.      {
  115.          for (= 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) >> (+ 3);
  129.      const int blue = (color & 0xff) >> 3;
  130.     const short color15 = blue | (green << 5) | (red << (+ 5)) | 0x8000;


  131.      short *dest = (short *) (frameBuffer)
  132.          + (y0 + vinfo.yoffset) * stride + (x0 + vinfo.xoffset);


  133.      int x, y;
  134.      for (= 0; y < height; ++y)
  135.      {
  136.          for (= 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 (= 0; i < (int) (fbSize / sizeof (int)); ++i)
  183.          {
  184.              testImage[i] = randData[j];
  185.              j++;
  186.              if (>= 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 (= 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./ (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. }


显示效果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值