Quiero mover muy rápidamente un rectángulo sobre un framebuffer en una aplicación de Linux embebida. He encontrado que la función cfb_copyarea
puede ser útil. Pero no puedo encontrar ninguna ioctl sobre el dispositivo/dev/fb para llamar a la función. ¿O puede llamarse directamente a esta función?Acceso directo a linux framebuffer - copyarea
6
A
Respuesta
1
Por lo que yo sé después de unos días de investigación, no hay ioctl para invocar esta función. Tengo que escribir mi propia llamada al sistema preferiblemente en un módulo kernel. O copie el algoritmo del origen del kernel y úselo en el espacio de usuario a través de la memoria nmaped.
7
Aquí es un código para inicializar y cerca 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
Tenga en cuenta que este código no es del todo correcto, aunque funcionará en muchos dispositivos Linux, en algunos no lo hará. Para calcular el tamaño uso de este dispositivo, no haga esto:
iFrameBufferSize = m_FixInfo.line_length * m_VarInfo.yres;
su lugar, haga lo siguiente:
iFrameBufferSize = m_FixInfo.smem_len;
y su código será más portátil.
Cuestiones relacionadas
- 1. Acceso directo a memoria en Linux
- 2. Google Chrome sobre Linux FrameBuffer
- 3. Acceso directo e icono de escritorio Linux desde la instalación
- 4. ReSharper acceso directo string.format
- 5. ¿Cómo acceder a Linux Framebuffer en Mono (Mono.Cairo/GTK #)?
- 6. Localizar en solución acceso directo a ReSharper
- 7. Acceso directo a los problemas JNLP
- 8. ¿Cómo escribir directamente en linux framebuffer?
- 9. Acceso de cliente directo SimpleDB
- 10. Teclas de acceso directo Resharper
- 11. Acceso directo nulo en Delphi
- 12. izpack: crear acceso directo en Windows
- 13. mac os x acceso datos en bruto de framebuffer
- 14. cómo detectar cuando una tecla de acceso directo (tecla de acceso directo) se presiona
- 15. (htaccess) ¿Cómo prevenir un archivo de ACCESO DIRECTO a URL?
- 16. Acceso directo a VS2008 o ReSharper para eliminar la línea
- 17. Acceso directo/Enlace a otra carpeta en TFS
- 18. Asignar tecla de acceso directo a un botón en WPF
- 19. denegar el acceso directo a presentar en S3
- 20. ¿Cómo protegerse contra el acceso directo a las imágenes?
- 21. Acceso directo a Eclipse para ejecutar archivos de inicio
- 22. Acceso directo para agregar a la Lista en un HashMap
- 23. Impedir el acceso directo a una página PHP
- 24. Acceso directo a eventos de teclado en OSX
- 25. Restringir el acceso directo a las páginas de error
- 26. Teclas de acceso directo a nivel de aplicación en WPF
- 27. ¿Xcode tiene un acceso directo a archivo/clase?
- 28. Denegando el acceso directo a las páginas jsp
- 29. Acceso directo a valores de diccionario anidados en Objective-C
- 30. Restringir Acceso Directo a archivo llamado por el Ajax Función
Gracias por su respuesta. Pero esto no es lo que pedí. No quiero mover los píxeles yo mismo en la memoria nmaped. Quiero usar la función kernel cfb_copyarea para esto. – danatel
Me gusta esta respuesta. Creé un programa de prueba basado en esto aquí: https://gist.github.com/1482697 –
@RafalRusin, me alegro de que te haya ayudado. – SunnyShah