mmap / dev / fb0失败,并显示“无效参数”; [英] mmap /dev/fb0 fails with "Invalid argument"
问题描述
我有一个嵌入式系统,想直接使用 / dev / fb0
。作为第一个测试,我使用一些基于示例代码的代码,这些示例代码可在无处不在 http://doc.qt.digia.com/4.1/qtopiacore-testingframebuffer.html 网络 和SO 。 fstat
和类似功能也可以成功打开。但是 mmap
失败并显示EINVAL。
I have an embedded system and want to use /dev/fb0
directly. As a first test, I use some code based on example-code found everywhere in the net and SO. Opening succeeds, also fstat
and similar. But mmap
fails with EINVAL.
来源:
#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");
struct stat stat;
fstat(fbfd, &stat);
printf("/dev/mem -> size: %u blksize: %u blkcnt: %u\n",
stat.st_size, stat.st_blksize, stat.st_blocks);
// 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;
const int PADDING = 4096;
int mmapsize = (screensize + PADDING - 1) & ~(PADDING-1);
// Map the device to memory
fbp = (char *)mmap(0, mmapsize, 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");
munmap(fbp, screensize);
close(fbfd);
return 0;
}
输出:
The framebuffer device was opened successfully.
/dev/mem -> size: 0 blksize: 4096 blkcnt: 0
640x480, 4bpp
Error: failed to map framebuffer device to memory: Invalid argument
跟踪:
...
open("/dev/fb0", O_RDWR) = 3
write(1, "The framebuffer device was opene"..., 48The framebuffer device was opened successfully.
) = 48
fstat64(3, {st_mode=S_IFCHR|0640, st_rdev=makedev(29, 0), ...}) = 0
write(1, "/dev/mem -> size: 0 blksize: 409"..., 44/dev/mem -> size: 0 blksize: 4096 blkcnt: 0
) = 44
ioctl(3, FBIOGET_FSCREENINFO or FBIOPUT_CONTRAST, 0xbfca6564) = 0
ioctl(3, FBIOGET_VSCREENINFO, 0xbfca6600) = 0
write(1, "640x480, 4bpp\n", 14640x480, 4bpp
) = 14
old_mmap(NULL, 155648, PROT_READ|PROT_WRITE, MAP_SHARED, 3, 0) = -1 EINVAL (Invalid argument)
write(2, "Error: failed to map framebuffer"..., 49Error: failed to map framebuffer device to memory) = 49
write(2, ": ", 2: ) = 2
write(2, "Invalid argument", 16Invalid argument) = 16
write(2, "\n", 1
) = 1
带有控制台和晚礼服的启动屏幕可见。而 cat / dev / urandom> / dev / fb0
充满噪音。系统上的页面大小为4096(`getconf PAGESIZE)。因此,155648(0x26000)是倍数。偏移量和指针均为零。
The boot-screen with console and tux is visible. And cat /dev/urandom > /dev/fb0
fills the screen with noise. The pagesize is 4096 on the system (`getconf PAGESIZE). So, 155648 (0x26000) is a multiple. Offset and pointer are both zero. Mapping and filemode are both RW .. what am I missing?
这是针对使用uClibc和busybox运行一个应用程序的嵌入式设备构建的,我必须从中移植它。一个古老的内核。有用于线条画的代码,此类代码不需要多处理/开窗口..请不要直接使用Directfb提示;)。
This is for an embedded device build with uClibc and busybox running a single application and I have to port it from an ancient kernel. There is code for linedrawing and such and no need for multiprocessing/ windowing .. please no hints to directfb ;).
推荐答案
The呈现 framebuffer
的内核驱动程序不支持的旧版直接
设备;您需要使用更新的 mmap()
framebuffer DRM
和 KMS
界面。
The kernel driver that presents the framebuffer
doesn't support the legacy direct mmap()
of the framebuffer
device; you need to use the newer DRM
and KMS
interface.
这篇关于mmap / dev / fb0失败,并显示“无效参数”;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!