出错描述如下:
在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); |
|
|