From 43b2d6c59aaac0aa17b81043b641149105a0315d Mon Sep 17 00:00:00 2001 From: EliteTK Date: Tue, 25 Feb 2014 16:18:35 +0000 Subject: Working on framebuffer graphics. --- fbcopy.c | 21 +++++++++++++++++++ framebuffer.c | 43 ++++++++++++++++++++++++++++++-------- sofbcode.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 122 insertions(+), 8 deletions(-) create mode 100644 fbcopy.c create mode 100644 sofbcode.c diff --git a/fbcopy.c b/fbcopy.c new file mode 100644 index 0000000..bc4e078 --- /dev/null +++ b/fbcopy.c @@ -0,0 +1,21 @@ +#include +#include +#include + +int main(void) { + FILE *fbp = fopen( "/dev/fb0", "r" ); + if (!fbp) + exit(1); + puts("Opened framebuffer for reading."); + FILE *outfile = fopen( "/home/main/c-stuff/fbshot", "w" ); + if (!outfile) + exit(1); + puts("Opened outfile for writing."); + char c; + while ( (c = fgetc(fbp)) != EOF ) + fputc(c, outfile); + puts("Finished writing to files. Closing."); + fclose(fbp); + fclose(outfile); + puts("Finished."); +} diff --git a/framebuffer.c b/framebuffer.c index 9902fa1..665b833 100644 --- a/framebuffer.c +++ b/framebuffer.c @@ -1,14 +1,41 @@ #include #include +#define SSIZE 3145728 +#define INFILE "/home/main/c-stuff/fbshot" + int main( void ) { - printf("Here goes nothing!"); - getchar(); - FILE *fbp = fopen( "/dev/fb0", "w"); - int i; - for( i = 0; i < 1044480; i++ ) - fputc(i, fbp); - fclose( fbp ); -} + FILE *fbp = fopen( "/dev/fb0", "w" ); + if (!fbp) { + puts("Failed to open /dev/fb0"); + exit(1); + } + FILE *infile = fopen( INFILE, "r" ); + if (!infile) { + printf("Failed to open %s\n", INFILE); + exit(1); + } + int i, ii, iii; + for ( iii = 0; iii < 768 / 2; iii++ ) { + for ( i = 0; i < 1024; i++ ) { + fputc(0, fbp); + fputc(255, fbp); + fputc(0, fbp); + fputc(255, fbp); + } + for ( i = 0; i < 1024; i++ ) { + for ( ii = 0; ii < 4; ii++ ) + fputc(0, fbp); + } + } + + /* + char c; + while((c = fgetc(infile)) != EOF) + fputc(c, fbp); + */ + fclose( fbp ); + fclose( infile ); +} diff --git a/sofbcode.c b/sofbcode.c new file mode 100644 index 0000000..e4b9d3d --- /dev/null +++ b/sofbcode.c @@ -0,0 +1,66 @@ +#include +#include +#include +#include +#include +#include + +int main() +{ + int fbfd = 0; + struct fb_var_screeninfo vinfo; + struct fb_fix_screeninfo finfo; + long int screensize = 0; + char *fbp = 0; + int x = 0, y = 0; + long int location = 0; + int count ; + + /* 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); + } + + /* Figure out the size of the screen in bytes */ + screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8; + printf("\nScreen size is %d",screensize); + printf("\nVinfo.bpp = %d",vinfo.bits_per_pixel); + + /* 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"); + + + x = 100; y = 100; /* Where we are going to put the pixel */ + + /* Figure out where in memory to put the pixel */ + location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) + (y+vinfo.yoffset) * finfo.line_length; + for(count = 1 ;count < 100 ;count++) + { + *(fbp + location) = 255; /* Some blue */ + *(fbp + location + count) = 0; /* A little green */ + *(fbp + location + count + 1) = 0; /* A lot of red */ + *(fbp + location + count + 2) = 0; /* No transparency */ + } + munmap(fbp, screensize); + close(fbfd); + return 0; +} -- cgit v1.2.3-54-g00ecf