[73762] trunk/dports/devel
adfernandes at macports.org
adfernandes at macports.org
Wed Nov 24 07:07:09 PST 2010
Revision: 73762
http://trac.macports.org/changeset/73762
Author: adfernandes at macports.org
Date: 2010-11-24 07:07:04 -0800 (Wed, 24 Nov 2010)
Log Message:
-----------
new port: libusb-devel - current libusb with darwin bugfixes and Microsfot Kinect support
Modified Paths:
--------------
trunk/dports/devel/libusb-devel/Portfile
Added Paths:
-----------
trunk/dports/devel/libusb-devel/
trunk/dports/devel/libusb-devel/files/
trunk/dports/devel/libusb-devel/files/patch-USBI_OS_HANDLES_TIMEOUT.diff
Modified: trunk/dports/devel/libusb-devel/Portfile
===================================================================
--- trunk/dports/devel/libusb/Portfile 2010-11-22 15:17:36 UTC (rev 73719)
+++ trunk/dports/devel/libusb-devel/Portfile 2010-11-24 15:07:04 UTC (rev 73762)
@@ -2,26 +2,31 @@
PortSystem 1.0
-name libusb
-version 1.0.8
+name libusb-devel
+version 1.0.8.20101017
categories devel
-description library for USB device access
-long_description \
- library for use by user level applications to \
- access USB devices regardless of OS
+description library for USB device access
+long_description library for use by user level applications to \
+ access USB devices regardless of OS
+
homepage http://www.libusb.org/
platforms darwin
license LGPLv2.1
-maintainers wilcoxd.com:rwilcox toby brett
+maintainers adfernandes openmaintainer
-master_sites sourceforge
-checksums md5 37d34e6eaa69a4b645a19ff4ca63ceef \
- sha1 5484397860f709c9b51611d224819f8ed5994063 \
- rmd160 5a413a77e240a15480ef1437d5f5393badbae985
+conflicts libusb
-use_bzip2 yes
+fetch.type git
+git.url git://git.libusb.org/libusb.git
+git.branch 7da756e09fd97efad2b35b5cee0e2b2550aac2cb
-livecheck.url http://sourceforge.net/projects/libusb/files/libusb-1.0/
-livecheck.regex "${name}-(\[0-9\]+\\.\[0-9\]+\\.\[0-9\]+)${extract.suffix}"
+depends_build port:autoconf port:automake
+pre-configure { system "cd ${worksrcpath}; ./autogen.sh" }
+
+ # This patch is required for the Kinect: http://openkinect.org/wiki/Getting_Started
+ # and is a known issue: <http://vimeo.com/16734124> and <http://www.libusb.org/ticket/31>
+patch.pre_args -p1
+patchfiles patch-USBI_OS_HANDLES_TIMEOUT.diff
+
\ No newline at end of file
Added: trunk/dports/devel/libusb-devel/files/patch-USBI_OS_HANDLES_TIMEOUT.diff
===================================================================
--- trunk/dports/devel/libusb-devel/files/patch-USBI_OS_HANDLES_TIMEOUT.diff (rev 0)
+++ trunk/dports/devel/libusb-devel/files/patch-USBI_OS_HANDLES_TIMEOUT.diff 2010-11-24 15:07:04 UTC (rev 73762)
@@ -0,0 +1,132 @@
+--- a/libusb/libusbi.h
++++ b/libusb/libusbi.h
+@@ -288,13 +288,21 @@ struct libusb_device_handle {
+ unsigned char os_priv[0];
+ };
+
+-#define USBI_TRANSFER_TIMED_OUT (1<<0)
+-
+ enum {
+ USBI_CLOCK_MONOTONIC,
+ USBI_CLOCK_REALTIME
+ };
+
++/* flags for struct usbi_transfer:
++ * USBI_TRANSFER_TIMED_OUT
++ * USBI_TRANSFER_OS_HANDLES_TIMEOUT - set in the backend submit_transfer if the os will handle the timeout
++ */
++enum {
++ USBI_TRANSFER_TIMED_OUT = (1 << 0),
++ USBI_TRANSFER_OS_HANDLES_TIMEOUT = (1 << 1)
++};
++
++
+ /* in-memory transfer layout:
+ *
+ * 1. struct usbi_transfer
+diff --git a/libusb/os/darwin_usb.c b/libusb/os/darwin_usb.c
+index 646c938..79ba6c6 100644
+--- a/libusb/os/darwin_usb.c
++++ b/libusb/os/darwin_usb.c
+@@ -1137,6 +1137,8 @@ static int submit_bulk_transfer(struct usbi_transfer *itransfer) {
+ ret = (*(cInterface->interface))->WritePipeAsync(cInterface->interface, pipeRef, transfer->buffer,
+ transfer->length, darwin_async_io_callback, itransfer);
+ } else {
++ itransfer->flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT;
++
+ if (is_read)
+ ret = (*(cInterface->interface))->ReadPipeAsyncTO(cInterface->interface, pipeRef, transfer->buffer,
+ transfer->length, transfer->timeout, transfer->timeout,
+@@ -1171,10 +1173,19 @@ static int submit_iso_transfer(struct usbi_transfer *itransfer) {
+ /* are we reading or writing? */
+ is_read = transfer->endpoint & LIBUSB_ENDPOINT_IN;
+
+- /* construct an array of IOUSBIsocFrames */
+- tpriv->isoc_framelist = (IOUSBIsocFrame*) calloc (transfer->num_iso_packets, sizeof(IOUSBIsocFrame));
+- if (!tpriv->isoc_framelist)
+- return LIBUSB_ERROR_NO_MEM;
++ /* construct an array of IOUSBIsocFrames, reuse the old one if possible */
++ if (tpriv->isoc_framelist != NULL && tpriv->num_iso_packets != transfer->num_iso_packets)
++ {
++ free(tpriv->isoc_framelist);
++ tpriv->isoc_framelist = NULL;
++ }
++ if (tpriv->isoc_framelist == NULL)
++ {
++ tpriv->isoc_framelist = (IOUSBIsocFrame*) calloc (transfer->num_iso_packets, sizeof(IOUSBIsocFrame));
++ tpriv->num_iso_packets = transfer->num_iso_packets;
++ if (!tpriv->isoc_framelist)
++ return LIBUSB_ERROR_NO_MEM;
++ }
+
+ /* copy the frame list from the libusb descriptor (the structures differ only is member order) */
+ for (i = 0 ; i < transfer->num_iso_packets ; i++)
+@@ -1198,9 +1209,11 @@ static int submit_iso_transfer(struct usbi_transfer *itransfer) {
+
+ return darwin_to_libusb (kresult);
+ }
+-
+ /* schedule for a frame a little in the future */
+- frame += 2;
++ frame += 4;
++
++ if(cInterface->frames[transfer->endpoint] && frame < cInterface->frames[transfer->endpoint])
++ frame = cInterface->frames[transfer->endpoint];
+
+ /* submit the request */
+ if (is_read)
+@@ -1211,6 +1224,7 @@ static int submit_iso_transfer(struct usbi_transfer *itransfer) {
+ kresult = (*(cInterface->interface))->WriteIsochPipeAsync(cInterface->interface, pipeRef, transfer->buffer, frame,
+ transfer->num_iso_packets, tpriv->isoc_framelist, darwin_async_io_callback,
+ itransfer);
++ cInterface->frames[transfer->endpoint] = frame + transfer->num_iso_packets / 8;
+
+ if (kresult != kIOReturnSuccess) {
+ usbi_err (TRANSFER_CTX (transfer), "isochronous transfer failed (dir: %s): %s", is_read ? "In" : "Out",
+@@ -1243,6 +1257,8 @@ static int submit_control_transfer(struct usbi_transfer *itransfer) {
+ tpriv->req.pData = transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE;
+ tpriv->req.completionTimeout = transfer->timeout;
+ tpriv->req.noDataTimeout = transfer->timeout;
++
++ itransfer->flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT;
+
+ /* all transfers in libusb-1.0 are async */
+ kresult = (*(dpriv->device))->DeviceRequestAsyncTO(dpriv->device, &(tpriv->req), darwin_async_io_callback, itransfer);
+@@ -1358,6 +1374,9 @@ static void darwin_async_io_callback (void *refcon, IOReturn result, void *arg0)
+ }
+
+ static int darwin_transfer_status (struct usbi_transfer *itransfer, kern_return_t result) {
++ if (itransfer->flags & USBI_TRANSFER_TIMED_OUT)
++ result = kIOUSBTransactionTimeout;
++
+ switch (result) {
+ case kIOReturnUnderrun:
+ case kIOReturnSuccess:
+@@ -1372,6 +1391,7 @@ static int darwin_transfer_status (struct usbi_transfer *itransfer, kern_return_
+ return LIBUSB_TRANSFER_OVERFLOW;
+ case kIOUSBTransactionTimeout:
+ usbi_err (ITRANSFER_CTX (itransfer), "transfer error: timed out");
++ itransfer->flags |= USBI_TRANSFER_TIMED_OUT;
+ return LIBUSB_TRANSFER_TIMED_OUT;
+ default:
+ usbi_err (ITRANSFER_CTX (itransfer), "transfer error: %s (value = 0x%08x)", darwin_error_str (result), result);
+diff --git a/libusb/os/darwin_usb.h b/libusb/os/darwin_usb.h
+index a71d464..4aadf8c 100644
+--- a/libusb/os/darwin_usb.h
++++ b/libusb/os/darwin_usb.h
+@@ -139,6 +139,7 @@ struct darwin_device_handle_priv {
+ usb_interface_t **interface;
+ uint8_t num_endpoints;
+ CFRunLoopSourceRef cfSource;
++ UInt64 frames[256];
+ uint8_t endpoint_addrs[USB_MAXENDPOINTS];
+ } interfaces[USB_MAXINTERFACES];
+ };
+@@ -146,6 +147,7 @@ struct darwin_device_handle_priv {
+ struct darwin_transfer_priv {
+ /* Isoc */
+ IOUSBIsocFrame *isoc_framelist;
++ size_t num_iso_packets;
+
+ /* Control */
+ #if !defined (LIBUSB_NO_TIMEOUT_DEVICE)
\ No newline at end of file
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20101124/a2f10a9c/attachment.html>
More information about the macports-changes
mailing list