原文地址: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