Frage

Ich mag sehr schnell ein Rechteck über einen Framebuffer in einer eingebetteten Linux-Anwendung bewegen. Ich habe festgestellt, dass die Funktion cfb_copyarea nützlich sein kann. Aber ich kann nicht jede ioctl über das / dev / fb-Gerät, um die Funktion aufzurufen. Oder kann diese Funktion direkt aufgerufen werden?

War es hilfreich?

Lösung 3

Soweit ich nach ein paar Tagen der Forschung wissen, gibt es keine ioctl ist diese Funktion für den Aufruf. Ich muß meinen eigenen Systemaufruf vorzugsweise in einem Kernel-Modul schreiben. Oder kopieren der Algorithmus die von Kernel-Quelle und verwenden Sie es im Benutzerraum über nmaped Speicher.

Andere Tipps

Hier ist ein Code init und schließen 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);
}

};

Beachten Sie, dass dieser Code nicht ganz korrekt ist, obwohl es auf vielen Linux-Geräte, auf einige funktioniert es nicht. Um die Bildpuffergröße zu berechnen, dies nicht tun:

iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres;

Stattdessen dies tun:

iFrameBufferSize = m_FixInfo.smem_len;

Und Ihr Code mehr tragbar sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top