代码
# include <unistd.h>
# include <stdio.h>
# include <fcntl.h>
# include <linux/fb.h>
# include <sys/mman.h>
# include <stdlib.h>
# include <string.h> # define RED 0xF800
# define YELLOW 0xFFE0
# define BLUE 0x001F
# define WHITE 0xFFFF
# define BLACK 0x0000 void fill_color16 ( short * fb_addr, short bit_map, int psize)
{ int i; for ( i= 0 ; i< psize; i++ ) { * fb_addr = bit_map; fb_addr++ ; }
} int main ( )
{ int fp= 0 ; struct fb_var_screeninfo vinfo; struct fb_fix_screeninfo finfo; long screensize= 0 ; char * fbp = NULL , * test_fbp= NULL ; int x = 0 , y = 0 ; long location = 0 ; int i; int num = 5 ; int pix_size= 0 ; fp = open ( "/dev/fb0" , O_RDWR) ; if ( fp < 0 ) { printf ( "Error : Can not open framebuffer device/n" ) ; exit ( 1 ) ; } if ( ioctl ( fp, FBIOGET_FSCREENINFO, & finfo) ) { printf ( "Error reading fixed information/n" ) ; exit ( 2 ) ; } if ( ioctl ( fp, FBIOGET_VSCREENINFO, & vinfo) ) { printf ( "Error reading variable information/n" ) ; exit ( 3 ) ; } screensize = vinfo. xres * vinfo. yres * vinfo. bits_per_pixel / 8 ; printf ( "The phy mem = 0x%x, total size = %d(byte)\n" , finfo. smem_start, finfo. smem_len) ; printf ( "xres = %d, yres = %d, bits_per_pixel = %d\n" , vinfo. xres, vinfo. yres, vinfo. bits_per_pixel) ; printf ( "So the screensize = %d(byte), using %d frame\n" , screensize, finfo. smem_len/ screensize) ; printf ( "vinfo.xoffset = %d, vinfo.yoffset = %d\n" , vinfo. xoffset, vinfo. yoffset) ; printf ( "vinfo.vmode is :%d\n" , vinfo. vmode) ; printf ( "finfo.ypanstep is :%d\n" , finfo. ypanstep) ; printf ( "vinfo.red.offset=0x%x\n" , vinfo. red. offset) ; printf ( "vinfo.red.length=0x%x\n" , vinfo. red. length) ; printf ( "vinfo.green.offset=0x%x\n" , vinfo. green. offset) ; printf ( "vinfo.green.length=0x%x\n" , vinfo. green. length) ; printf ( "vinfo.blue.offset=0x%x\n" , vinfo. blue. offset) ; printf ( "vinfo.blue.length=0x%x\n" , vinfo. blue. length) ; printf ( "vinfo.transp.offset=0x%x\n" , vinfo. transp. offset) ; printf ( "vinfo.transp.length=0x%x\n" , vinfo. transp. length) ; fbp = ( char * ) mmap ( 0 , screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fp, 0 ) ; if ( ( int ) fbp == - 1 ) { printf ( "Error: failed to map framebuffer device to memory./n" ) ; exit ( 4 ) ; } printf ( "Get virt mem = %p\n" , fbp) ; pix_size = vinfo. xres * vinfo. yres; vinfo. xoffset = 0 ; vinfo. yoffset = 0 ; while ( num-- ) { printf ( "\ndrawing YELLOW......\n" ) ; fill_color16 ( ( short * ) fbp, YELLOW, pix_size) ; sleep ( 3 ) ; printf ( "\ndrawing BLUE......\n" ) ; fill_color16 ( ( short * ) fbp, BLUE, pix_size) ; sleep ( 3 ) ; printf ( "\ndrawing RED......\n" ) ; fill_color16 ( ( short * ) fbp, RED, pix_size) ; sleep ( 3 ) ; }
# if 1 x = 10 ; y = 10 ; location = x * ( vinfo. bits_per_pixel / 8 ) + y * finfo. line_length; test_fbp = fbp + location; printf ( "draw line.......\n" ) ; for ( i = 0 ; i < ( vinfo. xres - x) ; i++ ) * test_fbp++ = i+ 30 ;
# endif munmap ( fbp, screensize) ; close ( fp) ; return 0 ;
}
交叉编译后执行