搜索
bottom↓
回复: 0

V4L2采集图像时,总是在分配内存(mmap)时失败,求助

[复制链接]

出0入0汤圆

发表于 2017-6-6 12:18:41 | 显示全部楼层 |阅读模式
本帖最后由 thy110 于 2017-6-6 12:19 编辑

我的是模拟摄像头+TVP5150+S3C6410,驱动是正常的,我用开发板的卖家提供的可执行程序测试过了,就是在没有源码,想自己写个程序,顺便学习一下V4L2编程。
我参考的是V4L2官方那个程序,再接在他的基础上修改了]参数,但是现在总是在分配内存(mmap)时失败。
错误信息如下:
  1. <------------camera infomation------------->
  2. device driver=Samsung FIMC Dris3c-fimc0
  3. device name=s3c-fimc0
  4. bus_infomation=FIMC AHB-bus
  5. image_width=640
  6. image_height=480
  7. pixel_format=1448695129

  8. <------------screen infomation------------->
  9. id=s3cfb
  10. x=800
  11. y=480
  12. bpp=16
  13. redoffset=11,redlength=5,msb_right=0
  14. greenoffset=5,greenlength=6,msb_right=0
  15. blueoffset=0,bluelength=5,msb_right=0
  16. screensize=768000
  17. init_mmap
  18. buffers[n_buffers].length=0
  19. buffers[n_buffers].start=-1
  20. mmap error 22, Invalid argument
复制代码

相关代码如下:

  1. static void init_mmap(void)
  2. {
  3.         struct v4l2_requestbuffers req;

  4.         fprintf(stderr, "init_mmap\n");
  5.         //VIDIOC_REQBUFS
  6.         CLEAR(req);
  7.         req.count = 4;
  8.         req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  9.         req.memory = V4L2_MEMORY_MMAP;
  10.         if(-1 == xioctl(fd1, VIDIOC_REQBUFS, &req))
  11.         {
  12.                 if (EINVAL == errno)
  13.                 {
  14.                         fprintf(stderr, "%s does not support ""memory mapping\n", dev_name1);
  15.                         exit(EXIT_FAILURE);
  16.                 }
  17.                 else
  18.                         errno_exit("VIDIOC_REQBUFS");
  19.         }
  20.         if(req.count < 2)
  21.         {
  22.                 fprintf(stderr, "Insufficient buffer memory on %s\n",dev_name1);
  23.                 exit(EXIT_FAILURE);
  24.         }

  25.         //VIDIOC_QUERYBUF
  26.         buffers = calloc(req.count, sizeof(*buffers));   ///////////
  27.         if (!buffers)
  28.         {
  29.                 fprintf(stderr, "Out of memory\n");
  30.                 exit(EXIT_FAILURE);
  31.         }
  32.         for (n_buffers = 0; n_buffers < req.count; ++n_buffers)
  33.         {                    
  34.                 struct v4l2_buffer buf;
  35.                 CLEAR(buf);
  36.                 buf.type        = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  37.                 buf.memory      = V4L2_MEMORY_MMAP;
  38.                 buf.index       = n_buffers;
  39.                 if (-1 == xioctl(fd1, VIDIOC_QUERYBUF, &buf))
  40.                         errno_exit("VIDIOC_QUERYBUF");
  41.                
  42.                 buffers[n_buffers].length = buf.length;
  43.                 buffers[n_buffers].start =mmap(NULL /* start anywhere */,buf.length,
  44.                                                                 PROT_READ | PROT_WRITE /* required */,
  45.                                                                 MAP_SHARED /* recommended */,
  46.                                                                 fd1, buf.m.offset);
  47.                
  48.                 fprintf(stderr, "buffers[n_buffers].length=%d\n", buffers[n_buffers].length);
  49.                 fprintf(stderr, "buffers[n_buffers].start=%d\n", buffers[n_buffers].start);
  50.                
  51.                 if (MAP_FAILED == buffers[n_buffers].start)
  52.                 {
  53.                         errno_exit("mmap");
  54.                 }
  55.         }//now n_buffers is 4

  56.         //fbmmap
  57.         fb_buffer=(char*)mmap(NULL,screensize,PROT_READ | PROT_WRITE,MAP_SHARED,fd2,0);
  58.         if(MAP_FAILED == fb_buffer)
  59.         {
  60.                 errno_exit("mmap");
  61.         }
  62.        
  63.         //malloc the yuv_buffer
  64.         yuv_buffer = (char*)malloc(screensize);
  65.         if (!yuv_buffer)
  66.         {
  67.                 fprintf(stderr, "Out of memory\n");
  68.                 exit(EXIT_FAILURE);
  69.         }
  70.        
  71.         //malloc the rgb_buffer
  72.         rgb_buffer = (char*)malloc(screensize);
  73.         if (!rgb_buffer)
  74.         {
  75.                 fprintf(stderr, "Out of memory\n");
  76.                 exit(EXIT_FAILURE);
  77.         }       
  78. }
复制代码
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 14:51

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表