2009-09-12 15 views
6

Quiero mover muy rápidamente un rectángulo sobre un framebuffer en una aplicación de Linux embebida. He encontrado que la función cfb_copyarea puede ser útil. Pero no puedo encontrar ninguna ioctl sobre el dispositivo/dev/fb para llamar a la función. ¿O puede llamarse directamente a esta función?Acceso directo a linux framebuffer - copyarea

Respuesta

1

Por lo que yo sé después de unos días de investigación, no hay ioctl para invocar esta función. Tengo que escribir mi propia llamada al sistema preferiblemente en un módulo kernel. O copie el algoritmo del origen del kernel y úselo en el espacio de usuario a través de la memoria nmaped.

7

Aquí es un código para inicializar y cerca FrameBuffer

class CFrameBuffer 
{ 

void* m_FrameBuffer; 
struct fb_fix_screeninfo m_FixInfo; 
struct fb_var_screeninfo m_VarInfo; 
int  m_FBFD; 

int InitFB() 
{ 
    int iFrameBufferSize; 
    /* Open the framebuffer device in read write */ 
    m_FBFD = open(FB_NAME, O_RDWR); 
    if (m_FBFD < 0) { 
     printf("Unable to open %s.\n", FB_NAME); 
     return 1; 
    } 
    /* Do Ioctl. Retrieve fixed screen info. */ 
    if (ioctl(m_FBFD, FBIOGET_FSCREENINFO, &m_FixInfo) < 0) { 
     printf("get fixed screen info failed: %s\n", 
       strerror(errno)); 
     close(m_FBFD); 
     return 1; 
    } 
    /* Do Ioctl. Get the variable screen info. */ 
    if (ioctl(m_FBFD, FBIOGET_VSCREENINFO, &m_VarInfo) < 0) { 
     printf("Unable to retrieve variable screen info: %s\n", 
       strerror(errno)); 
     close(m_FBFD); 
     return 1; 
    } 

    /* Calculate the size to mmap */ 
    iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres; 
    printf("Line length %d\n", m_FixInfo.line_length); 
    /* Now mmap the framebuffer. */ 
    m_FrameBuffer = mmap(NULL, iFrameBufferSize, PROT_READ | PROT_WRITE, 
        MAP_SHARED, m_FBFD,0); 
    if (m_FrameBuffer == NULL) { 
     printf("mmap failed:\n"); 
     close(m_FBFD); 
     return 1; 
    } 
    return 0; 
} 

void CloseFB() 
{ 
    munmap(m_FrameBuffer,0); 
    close(m_FBFD); 
} 

}; 
+0

Gracias por su respuesta. Pero esto no es lo que pedí. No quiero mover los píxeles yo mismo en la memoria nmaped. Quiero usar la función kernel cfb_copyarea para esto. – danatel

+2

Me gusta esta respuesta. Creé un programa de prueba basado en esto aquí: https://gist.github.com/1482697 –

+0

@RafalRusin, me alegro de que te haya ayudado. – SunnyShah

2

Tenga en cuenta que este código no es del todo correcto, aunque funcionará en muchos dispositivos Linux, en algunos no lo hará. Para calcular el tamaño uso de este dispositivo, no haga esto:

iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres; 

su lugar, haga lo siguiente:

iFrameBufferSize = m_FixInfo.smem_len; 

y su código será más portátil.

Cuestiones relacionadas