Firefly Open Source Community

   Login   |   Register   |

frame buffer mmap error

68

Credits

0

Prestige

0

Contribution

registered members

Rank: 2

Credits
68
Posted at 6/18/2019 10:54:27     
Hello.

I am trying to test linux frame buffer on the ubuntu 18.04 installed aio-3399j board.

On the console,

# cat /dev/urandom > /dev/fb0

Testing with this command works fine. (noise displayed on the screen)

However, when I test frame buffer with c code using mmap(), it fails.
(mmap returns -1 (EINVAL))

# ./fb
The framebuffer device was opened successfully.
1280x800, 32bpp
Error: failed to map framebuffer device to memory: Invalid argument


Can anyone help me to solve this problem?


c source code:

#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 argc, char *argv[])
{
        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
        for (y = 100; y < 300; y++)
                for (x = 100; x < 300; 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;
                        }

                }
        munmap(fbp, screensize);
        close(fbfd);
        return 0;
}
Reply

Use props Report

1085

Credits

0

Prestige

0

Contribution

vip

Rank: 6Rank: 6

Credits
1085
Posted at 6/18/2019 15:49:57     
Reply

Use props Report

You need to log in before you can reply Login | Register

This forum Credits Rules

Quick Reply Back to top Back to list