dheak ahi va un ejemplo:
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <asm/page.h>
int PutPixel (unsigned char R, unsigned char G, unsigned char B, int x, int y);
struct fb_var_screeninfo vinfo; //informacion sobre la pantalla
struct fb_fix_screeninfo finfo;
unsigned char *screen=NULL;
int main(int argc, char *argv[])
{
int fbfd;
long int screensize; //variables para hacer el mapeado en memoria del "fichero"
/* Abrimos el dispositivo frame buffer en modo lectura/escritura */
if (!(fbfd=open("/dev/fb0", O_RDWR)))
{
printf("Error al abrir el framebuffer.n");
return -1;
}
/* Obtenemos información fija de la pantalla */
if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo))
{
printf("Error al leer información fija.n");
return -2);
}
/* Leemos información variable de la pantalla */
if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo))
{
printf("Error al leer informacion variablen");
return -3;
}
// Mapeo el framebuffer en memoria.
// Lo que hace la funcion map es mapear todo el archivo en memoria con lo que
// es mas facil trabajar con el. A partir de aqui imagina que screen apunta a
// A000:0000 y solo tienes que tener en cuenta que ahora son 3 bytes para cada pixel(24 bits de color, en el orden Azul verde rojo)
// o 4 bytes (32 bits de color, Azul Verde Rojo Transparencia). Es decir, escribes directamente
// la combinacion que forma el color, no das un indice dentro de la paleta como con el modo 13h.
screensize= ((unsigned long)finfo.smem_len) + ((unsigned long)(finfo.smem_start) & (~PAGE_MASK));
screen=mmap(NULL, screensize, PROT_WRITE, MAP_SHARED, fbfd, 0);
if(screen == NULL)
{
printf("Error al mapear el archivo en memorian.");
return -4;
}
// en vinfo y finfo tienes informacion sobre la pantalla
//ancho = vinfo.xres;
//alto = vinfo.yres;
//bits de color = vinfo.bits_per_pixel;
//pinto un pixel de color blanco en (100,100)
PutPixel(255,255,255, 100, 100);
// Libero los recursos
munmap(screen, screensize);
close(fbfd);
return 0;
}
int PutPixel (unsigned char R, unsigned char G, unsigned char B, int x, int y)
{
unsigned char *fb;
int offy, offx;
//offset debido al valor de x. Depende de los bytes que ocupe cada pixel.
offx=x*vinfo->bpp/8;
//offset debido al valor de y. Entre linea y linea no siempre hay una diferencia
//igual a la resolucion horizontal(al menos en mi ordena no:P) asi que mejor utiliza
//el campo Lenline para ello.
offy=y*finfo->lenLine;
//me situo en la posicion indicada
fb=screen+offy+offx;
//escribo el color... al reves.
fb[0]=B;
fb[1]=G;
fb[2]=R;
return 0;
}