摄像头应用采集程序出错mmap映射出错

出错描述如下:

在2.6.28内核下对cam130进行操作,程序一点问题没有,可以正常采集摄像头数据,换到2.6.38这个版本的时候,驱动发生了变化,友善对于这个版本的cam130摄像头驱动不开源,找不到程序是哪里出错了,在执行ioctl(fd, VIDIOC_QUERYBUF, &dev.buffer)到这里时,返回小于0的值,错误提示说参数错误。


今天终于有时间进行测试,上午调试了一下,问题找到了,在long video_ioctl2(struct file *file, unsigned int cmd, unsigned long arg)函数实现时,将由用户空间传进来的arg的内容,赋值于内核临时开僻的parg空间时,unsigned long n = cmd_input_size(cmd);n取值只取了从struct v4l2_buffer结构开始到type字段的大小,struct v4l2_buffer结构type字段后面的内容丢失掉了,而在ov9650驱动中实现vidioc_querybuf(file, fh, p)函数时,应该要对memory字段进行判断,因此,当我们在应用程序当中对这一字段设置为V4L2_MEMORY_MMAP时,会因为n的传太小,造成这一部分内容丢失,由此传给vidioc_querybuf(file, fh, p)函数时,其值为0,返回错误。修改后摄像头正常工作,但是又遇到了另一个问题,如何对摄像头的参数进行设置,当调用VIDIOC_S_CTRL命令时出现错误,还不明白原因,有待进一步解决。


Linux内核中drivers/media/video/v4l2-ioctl.c中修正如下: 2011-06-07 15:31

CMDINSIZE(QUERYBUF,        buffer,        type);
改为
CMDINSIZE(QUERYBUF,        buffer,        memory);


修改后调用正确了但buffer.lenght为0无法影射内存,不知道什么原因??

应用程序改正如下 2011-12-16 10:05
    struct v4l2_format format;
    memset(&format, 0, sizeof(format));

    format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    format.fmt.pix.width = 320;
    format.fmt.pix.height = 240;
    format.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
    format.fmt.pix.field = V4L2_FIELD_INTERLACED;
    format.fmt.pix.priv = 1;
加上这个参数:
    format.fmt.pix.priv = 1;
就可以了.返回的length就不为0了

可参考一下链接:
http://www.arm9home.net/simple/index.php?t11869.html

你可能感兴趣的:(struct,File,cmd,buffer,CAM,linux内核)