IMX6 Frame Buffer

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 
3,240件の閲覧回数
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

ラベル(4)
0 件の賞賛
返信
1 解決策
1,955件の閲覧回数
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 件の賞賛
返信
3 返答(返信)
1,955件の閲覧回数
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 件の賞賛
返信
1,955件の閲覧回数
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 件の賞賛
返信
1,956件の閲覧回数
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 件の賞賛
返信