IMX6 Frame Buffer

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

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 项奖励
回复