#include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <linux/fb.h> #include <sys/mman.h>#define fb_write16(b,addr) (*(volatile unsigned short int *) (addr) = (b))
unsigned short int color_lut[16] = {0x0000,
/* 0x0000, 0 oúé«*/0x0015,
/* 0x0015, 1 à¶é«*/0x07f5,
/* 0x07F5, 2*/0xfb40,
/* 0xFB40, 3*/0x0661,
/* 0x0661, 4*/0xd45f,
/* 0xD45F, 5*/0x6af3,
/* 0x6A3F, 6*/0xdefb,
/* 0xDEFB, 7*/0x2570,
/* 0x2570, 8*/0x057f,
/* 0x057F, 9*/0x57ea,
/* 0x57EA, 10*/0x57ff,
/* 0x57FF, 11*/0xf800,
/* 0xF800, 12*/0xfabf,
/* 0xFABF, 13*/0xffea,
/* 0xFFEA, 14*/0xffff,
/* 0xFFFF 15*/};
int fbfd = 0;char *fbp = 0;long int location = 0;struct fb_var_screeninfo vinfo;struct fb_fix_screeninfo finfo;void draw_rect();
int main(){ int i = 0; long int screensize = 0; // Open the file for reading and writing fbfd = open("/dev/fb0", O_RDWR); if (!fbfd) { printf("Error: cannot open framebuffer device.\n"); exit(1); } printf("The framebuffer device was opened successfully.\n");
// Get fixed screen information if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) { printf("Error reading fixed information.\n"); exit(2); }
// Get variable screen information if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) { printf("Error reading variable information.\n"); exit(3); }
printf("%dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);
// Figure out the size of the screen in bytes screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
// Map the device to memory fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0); if ((int)fbp == -1) { printf("Error: failed to map framebuffer device to memory.\n"); exit(4); } printf("The framebuffer device was mapped to memory successfully.\n");draw_rect();
munmap(fbp, screensize); close(fbfd); return 0; }void draw_rect(){unsigned char *dst;unsigned int location;int x, y;printf("line length %d,xoffset %d\n",finfo.line_length,vinfo.xoffset);
for( y = 0; y < vinfo.yres; y++ ) {for( x = 0; x < vinfo.xres; x++ ){location=y*finfo.line_length+(x+vinfo.xoffset)*(vinfo.bits_per_pixel/8);dst=fbp+location; fb_write16(color_lut[x/40], dst);}
}return;}