RE: usb video capture issue due to uvc_complete callback spends more time

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Laurent

> 
> Hi Ravi,
> 
> On Wednesday 27 March 2013 10:43:24 B, Ravi wrote:
> > Hi
> >
> > I am observing issue while streaming video from usb camera connected to
> host
> > controller based on mentor graphics. The issue is root caused that there
> > are huge SOF gaps seen between the two isochronous IN token issued by
> host
> > controller. This is due to fact, significant amount of time is spent in
> uvc
> > callback function handler. Due to this next request programmed is
> delayed
> > leads to this failure of video streaming. I have measured time taken by
> uvc
> > callback function is in range minimum of 11 microsecond to maximum of
> 3318
> > microsecond.   Looks like callback handler doing some processing and
> takes
> > more time to return rather than giveback immediately. Need your help to
> > understand why uvc callback handler takes much time, if it does any
> > processing can it move to different task context and return immediately,
> > this will reduce the latency.
> 
> I'm surprised by that large delay. A quick look at the UVC URB completion
> handler (I assume you're talking about the host driver, not the gadget
> driver)

Thanks for reply, Yes, I am using the musb host controller driver (driver/usb/musb). 

> doesn't show any significant source of delay. You will likely need to
> profile
> the code to find out where the problem comes from. 

I have profiled by adding timestamp before and after the usb_hcd_giveback_urb() @ drivers/usb/musb/musb_host.c and found the microsecond delay is ranging from 11usec to 3318usec while capturing video stream frames of resolution 640x480 from usb camera.

static void musb_giveback(struct musb *musb, struct urb *urb, int status)
 __releases(musb->lock)
 __acquires(musb->lock)
 {
+       struct timeval st, et, t;
+       int is_isoc;
.....
+       if (is_isoc)
+               do_gettimeofday(&st); /* get start time */
        usb_hcd_giveback_urb(musb_to_hcd(musb), urb, status);
+       if (is_isoc) {
+               do_gettimeofday(&et); /* get end time */
+               t.tv_sec = et.tv_sec - st.tv_sec;
+               t.tv_usec = et.tv_usec - st.tv_usec;
+               gtime[gIndex++ % MAX_LOG_TIME] = t; /* compute diff time */
+       }

Anything I miss here?

You should also make
> sure
> that no other IRQ handler on the system keeps IRQs disabled for a long
> time.


Regards
Ravi B

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux