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