2009-09-12 11 views
6

Je veux déplacer très rapidement un rectangle sur un framebuffer dans une application Linux embarquée. J'ai trouvé que la fonction cfb_copyarea peut être utile. Mais je ne trouve aucun ioctl sur le périphérique/dev/fb pour appeler la fonction. Ou cette fonction peut-elle être appelée directement?Accès direct au framebuffer linux - copyarea

Répondre

1

Pour autant que je sais, après quelques jours de recherche, il n'y a pas ioctl pour invoquer cette fonction. Je dois écrire mon propre appel système de préférence dans un module du noyau. Ou copiez l'algorithme depuis la source du noyau et utilisez-le dans l'espace utilisateur via la mémoire nmaped.

7

Voici un code à init et à proximité 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

Que vous pour votre réponse. Mais ce n'est pas ce que j'ai demandé. Je ne veux pas déplacer les pixels moi-même dans la mémoire nmaped - je veux utiliser la fonction noyau cfb_copyarea pour cela. – danatel

+2

J'aime cette réponse. J'ai créé un programme d'essai basé sur ceci ici: https://gist.github.com/1482697 –

+0

@RafalRusin, heureux que cela vous ait aidé. – SunnyShah

2

Notez que ce code n'est pas entièrement correct, bien qu'il fonctionne sur de nombreux périphériques Linux, sur certains autres. Pour calculer la taille de framebuffer, ne pas le faire:

iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres; 

Au lieu de cela, faites ceci:

iFrameBufferSize = m_FixInfo.smem_len; 

Et votre code sera plus facile à transporter.