Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 12 Nov 2012 13:42:47 +0100
From:      Hans Petter Selasky <hselasky@c2i.net>
To:        freebsd-usb@freebsd.org
Subject:   Re: isochronous transfer packet is out of sequence
Message-ID:  <201211121342.47141.hselasky@c2i.net>
In-Reply-To: <20121112.205208.208974549.toshi@ruby.ocn.ne.jp>
References:  <20121112.205208.208974549.toshi@ruby.ocn.ne.jp>

next in thread | previous in thread | raw e-mail | index | archive | help
On Monday 12 November 2012 12:52:08 SAITOU Toshihide wrote:
> I have tryed the USB isochronous transfer for UVC cam using libusb
> interface and I find the packet fragment is out of sequence on the
> FreeBSD(1). But I don't find it on the MacBook(2).
> 
> (1) FreeBSD 9.1-RC2, Intel Core i7 3770T
> (2) Mac OS X 10.6.8, Intel Core 2 Duo, libusb 1.0.9 (single core)
> 
> Can I prevent this behaviour using libusb interface or is
> this an expected behaviour?
> 
> The bellow I issued two libusb_submit_transfer at the beginning.
> 
> 
> ----- log (1)
> 049 4437e06b 0 c 818
> 04a 4437e06b 0 c c00
> 04b 4437e06b 0 c 818
> UVC_STREAM_EOF
> total a1400
> 04c 4402516b 1 c b9c
> 04d 4402516b 1 c 87c
> 04e 4402516b 1 c 800
> 04f 4402516b 1 c c00
> 050 4402516b 1 c 800
> 051 4437e06b 0 c c00
> 052 4437e06b 0 c 744
> 053 4437e06b 0 c c00
> 
> 
> ----- callback function
> static void cb(struct libusb_transfer *xfer)
> {
>         uint8_t *p;
>         int plen;
>         int i;
> 
>         p = xfer->buffer;
> 
>         for (i = 0; i < xfer->num_iso_packets; i++, p += PKT_LEN)
>         {
>                 if (xfer->iso_packet_desc[i].status ==
> LIBUSB_TRANSFER_COMPLETED) {
>                         plen = xfer->iso_packet_desc[i].actual_length;
> 
>                         if (plen < 2)
> 				continue;
> 
>                         if (p[1] & UVC_STREAM_ERR) // bmHeaderInfo
> 				continue;
> 
>                         fprintf(stderr, "%03x ", i);
>                         fprintf(stderr, "%08x ", p[2] | p[3]<<8 | p[4]<<16
> | p[5]<<24); // pts fprintf(stderr, "%01x ", p[1] & UVC_STREAM_FID); //
> fid fprintf(stderr, "%01x ", p[0]); // header length fprintf(stderr,
> "%x\n", plen); // actual length
> 
>                         total += plen - p[0];
> 
>                         if (p[1] & UVC_STREAM_EOF)
>                         {
> 				fprintf(stderr, "UVC_STREAM_EOF\n", total);
> 				fprintf(stderr, "total %x\n", total);
> 
> 				if (total < FrameSize)
> 				{
> 					fprintf(stderr, "insufficient frame data.\n");
> 					write(fd, padding, FrameSize - total); // zero padding
> 				}
>                                 total = 0;
>                         }
> 			write(fd, p + p[0], plen - p[0]); // write payload data
>                 }
>         }
> 
>         if (libusb_submit_transfer(xfer) != 0)
>         {
>                 fprintf(stderr, "submit transfer failed.\n");
>         }
> }

Hi,

You need to submit two transfers for continued operation.

--HPS



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201211121342.47141.hselasky>