How to draw the graph in framebuffer using c language..?

c, c++, framebuffer, linux

Solution

Use `open()` on the right file in `/dev` (eg. `/dev/fb0`), then use `mmap()` to map it into memory. Manpages will help for these syscalls if you do not know how to use them.

Then there are some structures and constants for some `ioctl()`s in `<linux/fb.h>`. Like many kernel headers, you can learn a lot simply browsing the file.

Particularly interesting is the ioctl `FBIOGET_VSCREENINFO` with `struct fb_var_screeninfo`. Note this has `xres`, `yres` (resolution) and `bits_per_pixel`. Then there's `FBIOGET_FSCREENINFO` and `struct fb_fix_screeninfo` which has further information like `type` and `line_length`.

So a pixel at (x, y) might be at `mmap_base_address + x * bits_per_pixel/8 + y * line_length`. The exact format of the pixels will depend on the structures you retrieve via ioctl; it's your job to decide how to read/write them.

It's been a while since I've worked with this so I'm a bit hazy on more details..

Here's a quick and dirty code sample just to illustrate how it's done... I haven't tested this.

#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/mman.h>

#include <linux/fb.h>

#include <unistd.h>
#include <fcntl.h>

#include <stdio.h>

int main()
{
   struct fb_var_screeninfo screen_info;
   struct fb_fix_screeninfo fixed_info;
   char *buffer = NULL;
   size_t buflen;
   int fd = -1;
   int r = 1;

   fd = open("/dev/fb0", O_RDWR);
   if (fd >= 0)
   {
      if (!ioctl(fd, FBIOGET_VSCREENINFO, &screen_info) &&
          !ioctl(fd, FBIOGET_FSCREENINFO, &fixed_info))
      {
         buflen = screen_info.yres_virtual * fixed_info.line_length;
         buffer = mmap(NULL,
                       buflen,
                       PROT_READ|PROT_WRITE,
                       MAP_SHARED,
                       fd,
                       0);
         if (buffer != MAP_FAILED)
         {
            /*
             * TODO: something interesting here.
             * "buffer" now points to screen pixels.
             * Each individual pixel might be at:
             *    buffer + x * screen_info.bits_per_pixel/8
             *           + y * fixed_info.line_length
             * Then you can write pixels at locations such as that.
             */

             r = 0;   /* Indicate success */
         }
         else
         {
            perror("mmap");
         }
      }
      else
      {
         perror("ioctl");
      }
   }
   else
   {
      perror("open");
   }

   /*
    * Clean up
    */
   if (buffer && buffer != MAP_FAILED)
      munmap(buffer, buflen);
   if (fd >= 0)
      close(fd);

   return r;
}

Problem

i am new to this linux framebuffer so do anybody guide me to draw the line-graph in framebuffer. And i have the code to draw graph in turbo c but now in linux. So please help me out. Thank You, Rahul

Original source