在fb_var_screeninfo中设置yres_virtual时,无效的参数错误

我试图做一个直接写入framebuffer / dev / fb0的Linux应用程序。 为了使它双缓冲,我尝试使虚拟屏幕的大小是屏幕的两倍。 这是我写的程序:

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!"); } 

程序在ioctl(fb0, FBIOPUT_VSCREENINFO, &screeninfo_var)报告错误无效参数。 删除行screeninfo_var.yres_virtual = screeninfo_var.yres * 2; 它运行良好(但没有双缓冲)。

有人看到我在这里做错了吗?

这是一个常见的问题,它是由视频驱动程序的限制造成的。 例如,英特尔的810芯片组只允许640×480的分辨率,Broadcom的宽度限制在1200以内( http://www.raspberrypi.org/phpBB3/viewtopic.php?f=66&t=29968 )。

除非您更换驱动程序或视频卡本身(如果可能的话),否则您可以在这里做的不多。

编辑:如果你在电脑上,尝试使用vesafb ,而不是英特尔的驱动程序。

这里有一个提示: http : //www.mail-archive.com/debian-russian@lists.debian.org/msg27725.html