IMX6 Frame Buffer

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

IMX6 Frame Buffer

Jump to solution
2,770 Views
ali_sarlak
Contributor III

Hello

I created a simple program which duty is to draw a vertical line on (frame buffer) ,yet it seems the vertical line doesn’t draw from point (0,0) the actual line is drawn from point (0,3) 3 pixels to the right from origin.

Another problem is, when I use OpenVG to draw something(As you know OpenVG and OpenGL ES  use EGL to get native window) in double buffering mode (onscreen to offscreen and vice versa) sometimes I observe flickers on my screen(it quickly moves 3 pixels from left to right and vice versa) and sometimes everything is OK(no any flickers).

I believe the root of above problems lies on Frame Buffer kernel driver in Linux If anyone knows how I can solve the problems please share it with me.

I use L3.0.35_4.1.0_130816_source.

Best Regards:

Ali

Labels (4)
0 Kudos
1 Solution
1,485 Views
ali_sarlak
Contributor III

Hello

The problem is with my HDMI to DVI convertor.The cable is cause of the problem.

Best Regards:

Ali

View solution in original post

0 Kudos
3 Replies
1,485 Views
jamesbone
NXP TechSupport
NXP TechSupport

Hello Ali,

Sometimes the error is in the perspective of the view do you think you can share your code, to review how you are drawing the line?

0 Kudos
1,485 Views
ali_sarlak
Contributor III

Thanks for your reply

The code that I used is from internet, I only changed the main loop on it.

#include <stdlib.h>

#include <unistd.h>

#include <stdio.h>

#include <fcntl.h>

#include <linux/fb.h>

#include <sys/mman.h>

#include <sys/ioctl.h>

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;

     // Open the file for reading and writing

     fbfd = open("/dev/fb0", O_RDWR);

     if (fbfd == -1) {

         perror("Error: cannot open framebuffer device");

         exit(1);

     }

     printf("The framebuffer device was opened successfully.\n");

     // Get fixed screen information

     if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo) == -1) {

         perror("Error reading fixed information");

         exit(2);

     }

     // Get variable screen information

     if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo) == -1) {

         perror("Error reading variable information");

         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) {

         perror("Error: failed to map framebuffer device to memory");

         exit(4);

     }

     printf("The framebuffer device was mapped to memory successfully.\n");

     x = 300; y = 100;       // Where we are going to put the pixel

     // Figure out where in memory to put the pixel

     //                    MAIN LOOP

     for (y = 0; y < 800; y++)

         for (x = 0; x < 10; x++) {

             location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) +

                        (y+vinfo.yoffset) * finfo.line_length;

             if (vinfo.bits_per_pixel == 32) {

                 *(fbp + location) = 100;        // Some blue

                 *(fbp + location + 1) = 15+(x-100)/2;     // A little green

                 *(fbp + location + 2) = 200-(y-100)/5;    // A lot of red

                 *(fbp + location + 3) = 0;      // No transparency

             } else  { //assume 16bpp

                 int b = 10;

                 int g = (x-100)/6;     // A little green

                 int r = 31-(y-100)/16;    // A lot of red

                 unsigned short int t = r<<11 | g << 5 | b;

                 *((unsigned short int*)(fbp + location)) = t;

             }

         }

         //                              MAIN LOOP

         //Draw 10 W 800 H

     munmap(fbp, screensize);

     close(fbfd);

     return 0;

}

In another board such as BeagleBone Black it draws correctly, but in IMX6 it draws with 3 pixels gap from the left?!

0 Kudos
1,486 Views
ali_sarlak
Contributor III

Hello

The problem is with my HDMI to DVI convertor.The cable is cause of the problem.

Best Regards:

Ali

0 Kudos