mmap语法没问题报错:--Invalid argument

2010.11.5

今天用FrameBuffer来刷屏幕,显示图像,mmap语法没有什么问题,但是编译报错:invalid argument.

老师找了老久最后发现屏幕分辨率,有个bits_per_pixel 为4bits。显卡没有支持4bits的

下面是转一个帖子的内容:

1.开启内核对framebuffer的支持
我发现有很多种framebuffer模式,不太明白它们之间有什么区别,不过我的机器在Ubuntu 10.04下,vesafb和nvidiafb都没搞好,能用,但是颜色分辨率低(可能是我用的方式不对),www.linuxidc.com最后还是看了别人帖子,改用uvesafb就OK了。

总之,做三个事情,一个是装uvesafb要用的东西,一个是开启内核对uvesafb的支持,还有要设置并更新grub2设置让内核用framebuffer启动。

装uvesafb要用的东西,看下你的显卡支持哪些fb的分辨率::
sudo apt-get install v86d hwinfo
sudo hwinfo --framebuffer

修改内核配置:
sudo gedit /etc/initramfs-tools/modules
在末尾加一行
uvesafb mode_option=1600x900-24 mtrr=3 scroll=ywrap
更新内核配置:
sudo update-initramfs -u

修改grub2配置:
sudo gedit /etc/default/grub
改:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash
nomodeset video=uvesafb:mode_option=1600x900-24,mtrr=3,scroll=ywrap "
GRUB_GFXMODE=
1600x900
红色部分是改动的,分辨率按上面用hwinfo看到的选一个自己喜欢的。(前面的“#”如果有一定要去掉。)
更新grub2配置:
sudo update-grub

 

 

如果你在运行上述代码时遇到 `mmap: Invalid argument` 的错误,可能是由于视频设备的分辨率不支持程序中设置的分辨率所导致的。 你可以尝试修改 `IMAGE_WIDTH` 和 `IMAGE_HEIGHT` 的值为你的摄像头支持的分辨率,或者使用以下代码查询摄像头支持的分辨率: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <sys/ioctl.h> #include <linux/videodev2.h> #define DEVICE "/dev/video0" int main(int argc, char **argv) { int fd = 0; struct v4l2_capability cap; struct v4l2_fmtdesc format; struct v4l2_frmsizeenum framesize; int ret = 0; // 打开视频设备 fd = open(DEVICE, O_RDWR); if (-1 == fd) { perror("open"); return errno; } // 查询设备能力 ret = ioctl(fd, VIDIOC_QUERYCAP, &cap); if (-1 == ret) { perror("ioctl(VIDIOC_QUERYCAP)"); return errno; } // 打印支持的格式 printf("Supported formats:\n"); memset(&format, 0, sizeof(format)); format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; while (0 == ioctl(fd, VIDIOC_ENUM_FMT, &format)) { printf("\t%s\n", format.description); format.index++; } // 打印支持的分辨率 printf("Supported framesizes:\n"); memset(&framesize, 0, sizeof(framesize)); framesize.pixel_format = V4L2_PIX_FMT_YUYV; while (0 == ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &framesize)) { if (framesize.type == V4L2_FRMSIZE_TYPE_DISCRETE) { printf("\t%dx%d\n", framesize.discrete.width, framesize.discrete.height); } framesize.index++; } // 关闭设备 close(fd); return 0; } ``` 该代码能够打印出摄像头支持的格式和分辨率,你可以根据打印结果修改程序中的分辨率设置,或者手动调整摄像头的分辨率。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值