Firefly Open Source Community

   Login   |   Register   |
New_Topic
Print Previous Topic Next Topic

frame buffer mmap error

68

Credits

0

Prestige

0

Contribution

registered members

Rank: 2

Credits
68

frame buffer mmap error

Posted at 6/18/2019 10:54:27      View:9530 | Replies:3        Print      Only Author   [Copy Link] 1#
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

1429

Credits

0

Prestige

0

Contribution

vip

Rank: 6Rank: 6

Credits
1429
Posted at 6/18/2019 15:49:57        Only Author  2#
Reply

Use props Report

189

Credits

0

Prestige

0

Contribution

registered members

Rank: 2

Credits
189
Posted at 1/11/2026 01:39:34        Only Author  3#
Een kennis uit Thun adviseerde me onlangs om eens een kijkje te nemen op dit portaal voor wat afleiding. Ik bezocht play jonny om de SLOTS ONLINE uit te proberen na een periode waarin ik alleen maar geld had verloren. Mijn geduld werd eindelijk beloond met een flinke winst die al mijn eerdere inzetten ruimschoots compenseerde. Het was een spannende ervaring en ik ben zeer voldaan over het feit dat ik heb doorgezet gisteren.
Reply

Use props Report

138

Credits

0

Prestige

0

Contribution

registered members

Rank: 2

Credits
138
Posted at 3 day before        Only Author  4#
現在IT行业競爭越來越激烈,通過Microsoft AZ-120認證考試可以有效的帮助你在现在这个竞争激烈的IT行业中稳固和提升自己的地位。在我們PDFExamDumps中你可以獲得關Microsoft AZ-120認證考試的培訓工具。我們PDFExamDumps的IT精英團隊會及時為你提供準確以及詳細的關Microsoft AZ-120認證考試的培訓材料。通過我們PDFExamDumps提供的學習材料以及考試練習題和答案,我們PDFExamDumps能確保你第一次參加Microsoft AZ-120认证考试時挑戰成功,而且不用花費大量時間和精力來準備考試。
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