Question

Je souhaite déplacer très rapidement un rectangle sur un framebuffer dans une application Linux intégré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?

Était-ce utile?

La solution 3

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

Autres conseils

Voici un code pour initier et fermer 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);
}

};

Notez que ce code n’est pas tout à fait correct, même s’il fonctionnera sur de nombreux périphériques Linux, mais pas sur certains. Pour calculer la taille du framebuffer, ne faites pas ceci:

iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres;

Au lieu de cela, procédez comme suit:

iFrameBufferSize = m_FixInfo.smem_len;

Et votre code sera plus portable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top