frame buffer mmap error

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;

}

This is similar to your problem:

https://stackoverflow.com/questions/22915778/mmap-dev-fb0-fails-with-invalid-argument

However, you can try the DRM way:
https://stackoverflow.com/questions/36960747/calling-mmap-on-dumbbuffer-with-linux-direct-rendering-manager-in-rust-fails-wh

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

ほぼ100%の通過率は我々のお客様からの最高のプレゼントです。我々は弊社のWGUのManaging-Cloud-Security試験の資料はより多くの夢のある人にWGUのManaging-Cloud-Security試験に合格させると希望します。我々のチームは毎日資料の更新を確認していますから、ご安心ください、あなたの利用しているソフトは最も新しく全面的な資料を含めています。

Truly a brilliant article, I’m so appreciative of your sharing. The 212-89 reliable study questions sheet helped me move up with a promotion and raise. It’s now free for everyone. Best wishes for your career growth!