I am trying to create a linux application that is written directly to framebuffer / dev / fb0. To make it double-buffered, I try to make the virtual screen double the size of the screen. This is the program I wrote:
struct fb_var_screeninfo screeninfo_var; struct fb_fix_screeninfo screeninfo_fixed; unsigned int* screenbuffer; void gfx_init() { fb0 = open("/dev/fb0", O_RDWR); if(fb0 == 0) error("Could not open framebuffer located in /dev/fb0!"); if (ioctl(fb0, FBIOGET_FSCREENINFO, &screeninfo_fixed) == -1) error("Could not retrive fixed screen info!"); if (ioctl(fb0, FBIOGET_VSCREENINFO, &screeninfo_var) == -1) error("Could not retrive variable screen info!"); screeninfo_var.xres_virtual = screeninfo_var.xres; screeninfo_var.yres_virtual = screeninfo_var.yres * 2; screeninfo_var.width = screeninfo_var.xres; screeninfo_var.height = screeninfo_var.yres; screeninfo_var.xoffset = 0; screeninfo_var.yoffset = 0; if (ioctl(fb0, FBIOPUT_VSCREENINFO, &screeninfo_var) == -1) error("Could not set variable screen info!"); info("Detected monitor of %ix%i pixels using %i bit colors.",screeninfo_var.xres, screeninfo_var.yres, screeninfo_var.bits_per_pixel); screenbuffersize = screeninfo_var.xres_virtual * screeninfo_var.yres_virtual * screeninfo_var.bits_per_pixel/8; screenbuffer = (unsigned int *)mmap(0, screenbuffersize, PROT_READ | PROT_WRITE, MAP_SHARED, fb0, 0); if( (long)screenbuffer == 0 || (long)screenbuffer == -1 ) error("Failed to map framebuffer to device memory!"); }
The program does not execute ioctl(fb0, FBIOPUT_VSCREENINFO, &screeninfo_var) error messages with an invalid argument. When deleting the line screeninfo_var.yres_virtual = screeninfo_var.yres * 2; it works fine (but without double buffering).
Does anyone see what I'm doing wrong here?
source share