2009-09-12 5 views
6

Ich möchte sehr schnell ein Rechteck über einen Framebuffer in einer eingebetteten Linux-Anwendung verschieben. Ich habe festgestellt, dass die Funktion cfb_copyarea nützlich sein kann. Aber ich kann kein ioctl über das Gerät/dev/fb finden, um die Funktion aufzurufen. Oder kann diese Funktion direkt aufgerufen werden?Direkter Zugriff auf Linux Framebuffer - Copyarea

Antwort

1

Soweit ich weiß, nach ein paar Tagen der Forschung gibt es keine ioctl ist diese Funktion für den Aufruf. Ich muss meinen eigenen Systemaufruf vorzugsweise in einem Kernelmodul schreiben. Oder kopieren Sie den Algorithmus aus der Kernel-Quelle und verwenden Sie ihn im Benutzerbereich über den nmaped-Speicher.

7

Hier ist ein Code init und in der Nähe 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

Als Sie für Ihre Antwort. Aber darum habe ich nicht gebeten. Ich möchte die Pixel im nmaped-Speicher nicht selbst verschieben - dafür möchte ich die Kernelfunktion cfb_copyarea verwenden. – danatel

+2

Ich mag diese Antwort. Ich habe ein Testprogramm auf dieser Grundlage hier erstellt: https://gist.github.com/1482697 –

+0

@RafalRusin, Froh, dass es Ihnen geholfen hat. – SunnyShah

2

Beachten Sie, dass dieser Code nicht vollständig korrekt ist, obwohl es auf vielen Linux-Geräten funktioniert, auf einigen wird es nicht funktionieren. Um die Bildpuffergröße zu berechnen, dies nicht tun:

iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres; 

Stattdessen tun:

iFrameBufferSize = m_FixInfo.smem_len; 

Und Ihr Code mehr tragbar sein.