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
6
A
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);
}
};
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.
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
J'aime cette réponse. J'ai créé un programme d'essai basé sur ceci ici: https://gist.github.com/1482697 –
@RafalRusin, heureux que cela vous ait aidé. – SunnyShah