问题:我在调试USB camera时候,如果先连接上USB CABLE,然后对系统上电,上电完了,打开amcap没有图像;
分析:
理论上 系统上电的过程应该是这样的,
1,install dwc_otg driver ,DP应该为PULL DOWN,USB connection 不建立;
2,install webcam driver,DP仍然为PULL DOWN,USB connection 依然不建立;
3,Run user app,open video device后,DP被Pull Up,USB connection建立,PC开始发送request,协商,
打开AMCAP,则就会出图像;
但是实际上,我的情况是这样的,install dwc_otg driver & webcam driver,,Run user app,open video device后没有任何打印信息输出,在probe里面增加打印输出,没有任何信息输出,就是说usb connection一直没有建立,
当然无法触发probe函数;
这些天一直在努力地读code,我的调试过程如下:
先连接USB CABLE,然后对系统上电,在install dwc_otg 时,在初始化dwc_otg control core时就强制将DP PULL UP,
dctl.d32 = DWC_READ_REG32(&dev_if->dev_global_regs->dctl);
dctl.b.sftdiscon = 0;
DWC_WRITE_REG32(&dev_if->dev_global_regs->dctl, dctl.d32);
我先连接USB cable,那么在install driver之后,打印信息输出如下:
g_webcam gadget: high speed config #1: Video
g_webcam gadget: uvc_function_set_alt(0, 0)
g_webcam gadget: uvc_function_set_alt(1, 0)
g_webcam gadget: uvc_function_set_alt(1, 0)
g_webcam gadget: uvc_function_set_alt(1, 0)
这说明PC已经开始发送请求信息了,已经开始协商,但是目前user app还没有启动,无法响应PC发过来的UVC请求,更无法调度数据过来;PC请求超时,USB connection建立超时;
如果我在系统加载over之后,我再连接USB,那么一切正常,打开AMCAP,也会有图像出来,打印信息如下:
g_webcam gadget: high speed config #1: Video
g_webcam gadget: uvc_function_set_alt(0, 0)
g_webcam gadget: uvc_function_set_alt(1, 0)
g_webcam gadget: uvc_function_set_alt(1, 0)
g_webcam gadget: uvc_function_set_alt(1, 0)
g_webcam gadget: uvc_function_set_alt(1, 1)
当然,在driver初始化时就强制将DP PULL UP,肯定是不行的,
那么问题到底出在哪里呢,我认为应该是在Run user app之后,DP还是没有被PULL UP,在driver中,在app还没有准备好的时候,对于request的请求,执行hold
避免USB被枚举当user app还没有运行的时候,
在uvc_function_bind()函数里面增加:
if ((ret = usb_function_deactivate(f)) < 0)
goto error;
然后再连接usb cable,再上电,看到这行输出:
g_webcam gadget: high speed config #1: Video
g_webcam gadget: uvc_function_set_alt(0, 0)
g_webcam gadget: uvc_function_set_alt(1, 0)
g_webcam gadget: uvc_function_set_alt(1, 0)
g_webcam gadget: uvc_function_set_alt(1, 0)
g_webcam gadget: uvc_function_set_alt(1, 1)
我知道USB connection已经建立,usb probe已经执行了,打开AMCAP,真的出图像了。。
兴奋不已啊。。。