LINUX下 V4L2 摄像头设备初始化问题

 原文地址:http://user.qzone.qq.com/490054348/infocenter#!app=2&via=QZ.HashRefresh&pos=1362544013


内核选择 uvc模块选项,编译好内核下载使用后,一直在使用的时候报如下错误:
 

错误的:

usb 1-1: new full speed USB device using s3c2410-ohci and address 7

usb 1-1: configuration #1 chosen from 1 choice

uvcvideo: Found UVC 1.00 device USB2.0 Camera (1e4e:0102)

uvcvideo: Failed to query (1) UVC control 2 (unit 0) : -32 (exp. 26).

uvcvideo: Failed to initialize the device (-5).

usb 1-1: USB disconnect, address 7

 

然后在网上找了很多方法,

1:什么先编译其他模块,后编译uvc模块啥的等。

2:由于自己尝试在自己电脑上fedora17上完全可以使用,没有保错。所以我就把我电脑内核版本3.4的源码中的uvc模块拿出来单做,在加载到开发版内核2.6.26中。还是一样报错。

 

好吧!那我就看内核错误代码,跟踪源代码找结果吧!!先定位在drivers/media/video/uvc下面的几个文件里。然后搜索错误提示。定位在uvc_video.c和uvc_driver.c这两个里面。

最后简单通过设置打印信息内核一步一步找到局部的小流程。

uvc_driver.c文件的驱动注册时:

uvc_register_video()

         -àuvc_video_init()

                   -àuvc_set_video_ctrl()

                            -à__uvc_query_ctrl()

在__uvc_query_ctrl()中有如下内容:

 

if (ret != size) {

                   uvc_printk(KERN_ERR, "Failed to query (%u) UVC control %u "

                            "(unit %u) : %d (exp. %u).\n", query, cs, unit, ret,

                            size);

                   return -EIO;

         }

这里存在一个return –EIO;这个-EIO就是错误返回码-5.

        

下面根据我设置的信息(我在内核里自己设置的,亲)来分析这段过程,信息如下:

usb 1-1: new full speed USB device using s3c2410-ohci and address 4

usb 1-1: configuration #1 chosen from 1 choice

uvcvideo: Found UVC 1.00 device USB2.0 Camera (1e4e:0102)

uvcvideo: before uvc_video_init(&dev->video)

uvcvideo: loveywm1

uvcvideo: uvc_get_video_ctrl().query111==135

uvcvideo: query==135;size==26

uvcvideo: ret==26;size==26

uvcvideo: ret==26;size==26

uvcvideo: loveywm2

uvcvideo: loveywm3

uvcvideo: uvc_set_video_ctrl().sixe==26

uvcvideo: query==1;size==26

uvcvideo: ret==-32;size==26

uvcvideo: ret==-32;size==26

uvcvideo: Failed to query (1) UVC control 2 (unit 0) : -32 (exp. 26).

uvcvideo: loveywm4

uvcvideo: loveywm5

input: USB2.0 Camera as /class/input/input1

evbug.c: Connected device: "USB2.0 Camera", usb-s3c24xx-1

 

思路:在这个过程中,一共调用了两次__uvc_query_ctrl(),第一次是查询uvc_get_video_ctrl();其判断依据是打印的query111==135(query就是命令字,自信查看),这里没有保错;第二次是设置uvc_set_video_ctrl().其判断依据是打印的query111==1.然后就报错返回了!!至于为什么错,我没有继续跟下去,反正就是在设置信息发生了问题。

         于是我就想,那我就不设置了,你报错我就不理你。所以临时解决办法就出来了。

 

解决方法:

         屏蔽返回值。在函数中做如下修改

static int __uvc_query_ctrl(struct uvc_device *dev, __u8 query, __u8 unit,

                            __u8 intfnum, __u8 cs, void *data, __u16 size,

                            int timeout)

{

         __u8 type = USB_TYPE_CLASS | USB_RECIP_INTERFACE;

         unsigned int pipe;

         int ret;

 

         pipe = (query & 0x80) ? usb_rcvctrlpipe(dev->udev, 0)

                                  : usb_sndctrlpipe(dev->udev, 0);

         type |= (query & 0x80) ? USB_DIR_IN : USB_DIR_OUT;

 

         ret = usb_control_msg(dev->udev, pipe, query, type, cs << 8,

                            unit << 8 | intfnum, data, size, timeout);

         uvc_printk(KERN_ERR, "ret==%d;size==%d\n",ret,size);

 

         if (ret != size) {

                   uvc_printk(KERN_ERR, "Failed to query (%u) UVC control %u "

                            "(unit %u) : %d (exp. %u).\n", query, cs, unit, ret,

                            size);

                   return -EIO; //此处是我屏蔽的,由于在初始化设备时发生错误,就返回错误代码,导致不能继续初始化,那么就在此不让他返回错误码,实际结果也不影响设备使用。

         }

 

         return 0;

}

 

反正可以用了!!插入设备时出现如下提示:

input: USB2.0 Camera as /class/input/input1

 

你可能感兴趣的:(嵌入式—ARM开发学习)