Hi folks,

I needed to use omconsole and openocd simultaneously to develop on freerunner 
and sheevaplug. After a bit of tinkering, I did a messy hack into libusb to do 
so. This should not go upstream, as it is completely unsafe to (ab)use the USB 
specification in such a way, but maybe it could land into the ports tree to 
help developers ?

Cheers,

--
Vincent / dermiste



Index: Makefile
===================================================================
RCS file: /cvs/ports/devel/libusb/Makefile,v
retrieving revision 1.17
diff -u -r1.17 Makefile
--- Makefile    16 Sep 2007 02:53:01 -0000      1.17
+++ Makefile    27 May 2010 16:05:28 -0000
@@ -2,6 +2,8 @@
 
 COMMENT=       USB access library
 
+FLAVORS=       ft2232
+
 DISTNAME=      libusb-0.1.12
 SHARED_LIBS=           usb     9.0 \
                        usbpp   10.0
@@ -27,5 +29,8 @@
 CONFIGURE_STYLE=       gnu
 CONFIGURE_ARGS+=       ${CONFIGURE_SHARED} \
                        --disable-build-docs
+.if ${FLAVOR:L:Mft2232}
+COPTS+=                        -DBSD_FTDI_HACK
+.endif
 
 .include <bsd.port.mk>
Index: patches/patch-bsd_c
===================================================================
RCS file: /cvs/ports/devel/libusb/patches/patch-bsd_c,v
retrieving revision 1.7
diff -u -r1.7 patch-bsd_c
--- patches/patch-bsd_c 15 Nov 2006 18:34:13 -0000      1.7
+++ patches/patch-bsd_c 27 May 2010 16:05:28 -0000
@@ -1,7 +1,108 @@
 $OpenBSD: patch-bsd_c,v 1.7 2006/11/15 18:34:13 pvalchev Exp $
---- bsd.c.orig Fri Mar  3 19:52:46 2006
-+++ bsd.c      Tue Nov 14 21:00:00 2006
-@@ -361,7 +361,7 @@ int usb_bulk_read(usb_dev_handle *dev, i
+--- bsd.c.orig Sat Mar  4 03:52:46 2006
++++ bsd.c      Sat May 22 11:25:48 2010
+@@ -139,7 +139,6 @@ int usb_os_open(usb_dev_handle *dev)
+ {
+   int i;
+   struct bsd_usb_dev_handle_info *info;
+-  char ctlpath[PATH_MAX + 1];
+ 
+   info = malloc(sizeof(struct bsd_usb_dev_handle_info));
+   if (!info)
+@@ -147,20 +146,23 @@ int usb_os_open(usb_dev_handle *dev)
+   dev->impl_info = info;
+ 
+ #ifdef __FreeBSD_kernel__
+-  snprintf(ctlpath, PATH_MAX, "%s", dev->device->filename);
++  snprintf(dev->ctlpath, PATH_MAX, "%s", dev->device->filename);
+ #else
+-  snprintf(ctlpath, PATH_MAX, "%s.00", dev->device->filename);
++  snprintf(dev->ctlpath, PATH_MAX, "%s.00", dev->device->filename);
+ #endif
+-  dev->fd = open(ctlpath, O_RDWR);
++  dev->fd = open(dev->ctlpath, O_RDWR);
+   if (dev->fd < 0) {
+-    dev->fd = open(ctlpath, O_RDONLY);
++    dev->fd = open(dev->ctlpath, O_RDONLY);
+     if (dev->fd < 0) {
+       free(info);
+       USB_ERROR_STR(-errno, "failed to open %s: %s",
+-                    ctlpath, strerror(errno));
++                    dev->ctlpath, strerror(errno));
+     }
+   }
+ 
++  close(dev->fd);
++  dev->fd = -1;
++
+   /* Mark the endpoints as not yet open */
+   for (i = 0; i < USB_MAX_ENDPOINTS; i++)
+     info->ep_fd[i] = -1;
+@@ -199,6 +201,19 @@ int usb_set_configuration(usb_dev_handle *dev, int con
+ {
+   int ret;
+ 
++#ifdef BSD_FTDI_HACK
++  if (dev->fd <= 0) {
++    dev->fd = open(dev->ctlpath, O_RDWR);
++    if (dev->fd < 0) {
++      dev->fd = open(dev->ctlpath, O_RDONLY);
++      if (dev->fd < 0) {
++        USB_ERROR_STR(-errno, "failed to open %s: %s",
++                      dev->ctlpath, strerror(errno));
++      }
++    }
++  }
++#endif
++
+   ret = ioctl(dev->fd, USB_SET_CONFIG, &configuration);
+   if (ret < 0)
+     USB_ERROR_STR(-errno, "could not set config %d: %s", configuration,
+@@ -206,6 +221,11 @@ int usb_set_configuration(usb_dev_handle *dev, int con
+ 
+   dev->config = configuration;
+ 
++#ifdef BSD_FTDI_HACK
++  close(dev->fd);
++  dev->fd = -1;
++#endif
++
+   return 0;
+ }
+ 
+@@ -230,6 +250,19 @@ int usb_set_altinterface(usb_dev_handle *dev, int alte
+   int ret;
+   struct usb_alt_interface intf;
+ 
++#ifdef BSD_FTDI_HACK
++  if (dev->fd <= 0) {
++    dev->fd = open(dev->ctlpath, O_RDWR);
++    if (dev->fd < 0) {
++      dev->fd = open(dev->ctlpath, O_RDONLY);
++      if (dev->fd < 0) {
++        USB_ERROR_STR(-errno, "failed to open %s: %s",
++                      dev->ctlpath, strerror(errno));
++      }
++    }
++  }
++#endif
++
+   if (dev->interface < 0)
+     USB_ERROR(-EINVAL);
+ 
+@@ -243,6 +276,11 @@ int usb_set_altinterface(usb_dev_handle *dev, int alte
+ 
+   dev->altsetting = alternate;
+ 
++#ifdef BSD_FTDI_HACK
++  close(dev->fd);
++  dev->fd = -1;
++#endif
++
+   return 0;
+ }
+ 
+@@ -361,7 +399,7 @@ int usb_bulk_read(usb_dev_handle *dev, int ep, char *b
  int usb_interrupt_write(usb_dev_handle *dev, int ep, char *bytes, int size,
                          int timeout)
  {
@@ -10,7 +111,7 @@
  
    /* Ensure the endpoint address is correct */
    ep &= ~USB_ENDPOINT_IN;
-@@ -383,8 +383,7 @@ int usb_interrupt_write(usb_dev_handle *
+@@ -383,8 +421,7 @@ int usb_interrupt_write(usb_dev_handle *dev, int ep, c
      USB_ERROR_STR(-errno, "error setting timeout: %s",
                    strerror(errno));
  
@@ -20,7 +121,7 @@
      if (ret < 0)
  #ifdef __FreeBSD_kernel__
        USB_ERROR_STR(-errno, "error writing to interrupt endpoint %s.%d: %s",
-@@ -394,16 +393,13 @@ int usb_interrupt_write(usb_dev_handle *
+@@ -394,16 +431,13 @@ int usb_interrupt_write(usb_dev_handle *dev, int ep, c
                    dev->device->filename, UE_GET_ADDR(ep), strerror(errno));
  #endif
  
@@ -39,7 +140,7 @@
  
    /* Ensure the endpoint address is correct */
    ep |= USB_ENDPOINT_IN;
-@@ -428,8 +424,7 @@ int usb_interrupt_read(usb_dev_handle *d
+@@ -428,8 +462,7 @@ int usb_interrupt_read(usb_dev_handle *dev, int ep, ch
    if (ret < 0)
      USB_ERROR_STR(-errno, "error setting short xfer: %s", strerror(errno));
  
@@ -49,7 +150,7 @@
      if (ret < 0)
  #ifdef __FreeBSD_kernel__
        USB_ERROR_STR(-errno, "error reading from interrupt endpoint %s.%d: %s",
-@@ -438,10 +433,7 @@ int usb_interrupt_read(usb_dev_handle *d
+@@ -438,10 +471,7 @@ int usb_interrupt_read(usb_dev_handle *dev, int ep, ch
        USB_ERROR_STR(-errno, "error reading from interrupt endpoint %s.%02d: 
%s",
                    dev->device->filename, UE_GET_ADDR(ep), strerror(errno));
  #endif
@@ -61,3 +162,35 @@
  }
  
  int usb_control_msg(usb_dev_handle *dev, int requesttype, int request,
+@@ -450,6 +480,19 @@ int usb_control_msg(usb_dev_handle *dev, int requestty
+   struct usb_ctl_request req;
+   int ret;
+ 
++#ifdef BSD_FTDI_HACK
++  if (dev->fd <= 0) {
++    dev->fd = open(dev->ctlpath, O_RDWR);
++    if (dev->fd < 0) {
++      dev->fd = open(dev->ctlpath, O_RDONLY);
++      if (dev->fd < 0) {
++        USB_ERROR_STR(-errno, "failed to open %s: %s",
++                      dev->ctlpath, strerror(errno));
++      }
++    }
++  }
++#endif
++
+   if (usb_debug >= 3)
+     fprintf(stderr, "usb_control_msg: %d %d %d %d %p %d %d\n",
+             requesttype, request, value, index, bytes, size, timeout);
+@@ -476,6 +519,11 @@ int usb_control_msg(usb_dev_handle *dev, int requestty
+   if (ret < 0)
+     USB_ERROR_STR(-errno, "error sending control message: %s",
+                   strerror(errno));
++
++#ifdef BSD_FTDI_HACK
++  close(dev->fd);
++  dev->fd = -1;
++#endif
+ 
+   return UGETW(req.ucr_request.wLength);
+ }
Index: patches/patch-usbi_h
===================================================================
RCS file: patches/patch-usbi_h
diff -N patches/patch-usbi_h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-usbi_h        27 May 2010 16:05:28 -0000
@@ -0,0 +1,11 @@
+$OpenBSD$
+--- usbi.h.orig        Sat May 22 10:51:26 2010
++++ usbi.h     Sat May 22 10:49:29 2010
+@@ -40,6 +40,7 @@ extern int usb_debug;
+ 
+ struct usb_dev_handle {
+   int fd;
++  char ctlpath[PATH_MAX + 1];
+ 
+   struct usb_bus *bus;
+   struct usb_device *device;

Reply via email to