故障现象:
某客户需要调试一款usb camera,包括黑白和彩色两个sensor:
在调试中发现调用open函数去打开注册的 dev/video1节点时报错:
USBCamera: Cannot open ‘/dev/video1’: 16, Device or resource busy
分析:
1.首先排查硬件的问题。
把该camera连接到PC,下载通用的camera驱动后,设备管理器中显示:
使用网上下载的USB摄像头采集调试工具2020可以正常使用的,说明硬件是好的。
2.检查下camera的uvc驱动注册是正常的:
[ 6.406765] usb 1-1: New USB device found, idVendor=15aa, idProduct=1555
[ 6.412464] usb 1-1: New USB device strings: Mfr=3, Product=1, SerialNumber=2
[ 6.419546] usb 1-1: Product: SIT USB2.0 Camera RGB
[ 6.424433] usb 1-1: Manufacturer: Generic
[ 6.428487] usb 1-1: SerialNumber: 200901010001
[ 6.439198] uvcvideo: Found UVC 1.00 device SIT USB2.0 Camera RGB (15aa:1555)
检查dev下成功注册了video1节点。
3.apk会通过ioctl调到uvc camera的open操作。(uvc_v4l2.c)
const struct v4l2_file_operations uvc_fops = {
.owner = THIS_MODULE,
.open = uvc_v4l2_open,
.release = uvc_v4l2_release,
.unlocked_ioctl = uvc_v4l2_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl32 = uvc_v4l2_compat_ioctl32,
#endif
.read = uvc_v4l2_read,
.mmap = uvc_v4l2_mmap,
.poll = uvc_v4l2_poll,
#ifndef CONFIG_MMU
.get_unmapped_area = uvc_v4l2_get_unmapped_area,
#endif
};
既然是上层open错误,那肯定是调用到驱动这里的open有错误。
继续添加打印发现是uvc_fops的.open函数uvc_v4l2_open -->ret = usb_autopm_get_interface(stream->dev->intf);
这里返回错误 -16。
4.usb_autopm_get_interface分析。
uvc_v4l2_open函数里会调用usb_autopm_get_interface:
static int uvc_v4l2_open(struct file *file)
{
struct uvc_streaming *stream;
struct uvc_fh *handle;
int ret = 0;
uvc_trace(UVC_TRACE_CALLS, "uvc_v4l2_open\n");
stream = video_drvdata(file);
if (stream->dev->state & UVC_DEV_DISCONNECTED)
return -ENODEV;
ret = usb_autopm_get_interface