完成帧缓冲后如何恢复控制台测试?

时间:2013-09-01 23:02:37

标签: c linux framebuffer ioctl

我正在使用ioctl写入Framebuffer,它工作得非常好。

然而,当我将其关闭时,图像仍然在屏幕上。我想在我写入缓冲区之前将控制台文本恢复到原来的状态。 有人知道怎么做吗? 下面的代码就是我正在使用的代码;

  struct fb_var_screeninfo vinfo;


  fbfd = open("/dev/fb0", O_RDWR);
  if (!fbfd) {
    printf("Error: cannot open framebuffer device.\n");
    return(1);
  }

  // Get variable screen information
  if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) {
    printf("Error reading variable information.\n");
  }
  printf("Original %dx%d, %dbpp\n", vinfo.xres, vinfo.yres, 
         vinfo.bits_per_pixel );


  // map fb to user mem 
  screensize = finfo.smem_len;
  fbp = (char*)mmap(0, 
                screensize, 
                PROT_READ | PROT_WRITE, 
                MAP_SHARED, 
                fbfd, 
                0);

  if ((int)fbp == -1) {
    printf("Failed to mmap.\n");
  }
  else {
// draw...some lines
    int x, y;
    unsigned int pix_offset;

    for (y = 0; y < (vinfo.yres / 2); y++) {
      for (x = 0; x < vinfo.xres; x++) {

        // calculate the pixel's byte offset inside the buffer
        // see the image above in the blog...
        pix_offset = x + y * finfo.line_length;

        // now this is about the same as fbp[pix_offset] = value
        *((char*)(fbp + pix_offset)) = 16 * x / vinfo.xres;

      }
    }

    sleep(5);
  }

  // cleanup
  munmap(fbp, screensize);
  if (ioctl(fbfd, FBIOPUT_VSCREENINFO, &orig_vinfo)) {
    printf("Error re-setting variable information.\n");
  }
  close(fbfd);

  return 0;

}

1 个答案:

答案 0 :(得分:0)

我知道这个问题很老了,但是我会为遇到这个问题的人提供解决方案(就像我一样)。

我通常做的是在写入之前获得屏幕截图:

cp /dev/fb0 /tmp/orig_screen

当我使用帧缓冲区完成后,我使用以下内容恢复上一个屏幕:

cp /tmp/orig_screen /dev/fb0