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
解決済! 解決策の投稿を見る。
Hello
The problem is with my HDMI to DVI convertor.The cable is cause of the problem.
Best Regards:
Ali
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?
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?!
Hello
The problem is with my HDMI to DVI convertor.The cable is cause of the problem.
Best Regards:
Ali