Hi folks,

Here is a naughty hack I wrote to be able to access simultaneously JTAG and
serial ports of the freerunner. It works for sheevaplug too, you juste need
to
change some values in omconsole.

It mostly consists in opening the control endpoint only when needed. How to
recompile:

        cd /usr/ports/devel/libusb
        patch < ../libusb-ftdi-hack.diff
        COPTS="-DBSD_FTDI_HACK" make build
        make install

Happy ARM hacking !

--
Vincent / dermiste


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 22 May 2010 11:10:32 -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        22 May 2010 11:10:32 -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