2013-02-25 2 views
3

Я пытаюсь создать приложение для linux, которое напрямую записывается в framebuffer/dev/fb0. Чтобы сделать его двойной буферизацией, я пытаюсь сделать виртуальный экран вдвое большим по размеру экрана. Это программа, которую я написал:ошибка неправильного аргумента при установке yres_virtual в fb_var_screeninfo

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

Программа failes на ioctl(fb0, FBIOPUT_VSCREENINFO, &screeninfo_var) сообщающий об ошибке недопустимый аргумент. При удалении строки screeninfo_var.yres_virtual = screeninfo_var.yres * 2; он работает нормально (но без двойной буферизации).

Кто-нибудь видит, что я делаю неправильно здесь?

+1

вы когда-нибудь понять это? У меня в настоящее время есть аналогичная проблема. –

ответ

0

Это распространенный вопрос, и это связано с ограничением видеодрайвера. Например, чипсет Intel 810 разрешает только разрешение 640x480, а Broadcom ограничивает ширину не более 1200 (http://www.raspberrypi.org/phpBB3/viewtopic.php?f=66&t=29968).

Здесь вы не можете ничего сделать, если только вы не измените драйвер или видеокамеру (если возможно).

EDIT: если вы находитесь на ПК, попробуйте использовать vesafb, а не драйвер intel.

Там намек здесь: http://www.mail-archive.com/[email protected]/msg27725.html

+1

Кажется нелогичным, что Nvidea Quadro 200M не может обрабатывать более крупный фреймбуфер. Экран, который я использую - 1600x900, виртуальный размер экрана 1600x901 уже дает ошибку. Есть ли способ посмотреть максимальный размер виртуального экрана? – STS