Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 12 Nov 2012 20:52:08 +0900 (JST)
From:      SAITOU Toshihide <toshi@ruby.ocn.ne.jp>
To:        freebsd-usb@freebsd.org
Subject:   isochronous transfer packet is out of sequence
Message-ID:  <20121112.205208.208974549.toshi@ruby.ocn.ne.jp>

next in thread | raw e-mail | index | archive | help
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");
        }
}

---
SAITOU Toshihide



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