ports/51692: Patch to enable USB scanner autodetection

Erik H. Bakke ebakke at trolltech.com
Fri May 2 14:30:16 UTC 2003


>Number:         51692
>Category:       ports
>Synopsis:       Patch to enable USB scanner autodetection
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Fri May 02 07:30:13 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator:     Erik H. Bakke
>Release:        FreeBSD 5.0-CURRENT i386
>Organization:
Trolltech AS
>Environment:
System: FreeBSD riserva.troll.no 5.0-CURRENT FreeBSD 5.0-CURRENT #7: Tue Apr 29 10:48:10 CEST 2003 ebakke at riserva.troll.no:/usr/src/sys/i386/compile/KARLOVO i386


>Description:
	Autodetection of USB scanners is currently only supported for Linux.
	The autodetection code that is in sanei_usb.c will not work for FreeBSD,
	as we do not have an ioctl to get the vendor and product ID.
	The included patch adds support for FreeBSD by iterating over the USB
	device tree to find the scanner device.
>How-To-Repeat:
	
>Fix:

--- sanei/sanei_usb.c.orig	Wed Jan 22 17:54:14 2003
+++ sanei/sanei_usb.c	Fri May  2 11:33:48 2003
@@ -58,6 +58,9 @@
 #include <usb.h>
 #endif /* HAVE_LIBUSB */
 
+#if defined (__FreeBSD__)
+#include <dev/usb/usb.h>
+#endif /* __FreeBSD__ */
 #define BACKEND_NAME	sanei_usb
 #include "../include/sane/sane.h"
 #include "../include/sane/sanei_debug.h"
@@ -130,6 +133,49 @@
 #endif /* __linux__ */
 
 
+#if defined (__FreeBSD__)
+static void
+kernel_get_vendor_product (int fd, const char *name, int *vendorID, int *productID)
+{
+  int controller;
+  int ctrl_fd;
+  char buf[40];
+  int dev;
+
+  for (controller = 0; ; controller++ )
+    {
+      snprintf (buf, sizeof( buf ) - 1, "/dev/usb%d", controller);
+      ctrl_fd = open (buf, O_RDWR);
+
+       /* If we can not open the usb controller device, treat it
+         as the end of controller devices */
+      if (ctrl_fd < 0)
+        break;
+
+      /* Search for the scanner device on this bus */
+      for( dev = 1; dev < USB_MAX_DEVICES; dev++ )
+        {
+	  struct usb_device_info devInfo;
+	  devInfo.udi_addr = dev;
+
+	  if (ioctl (ctrl_fd, USB_DEVICEINFO, &devInfo) == -1)
+	    break; /* Treak this as the end of devices for this controller */
+
+	  snprintf( buf, sizeof( buf ), "/dev/%s", devInfo.udi_devnames[0] );
+	  if( strncmp( buf, name, sizeof( buf ) ) == 0 )
+	    {
+	      *vendorID = (int)devInfo.udi_vendorNo;
+	      *productID = (int)devInfo.udi_productNo;
+	      close( ctrl_fd );
+	      return;
+	    }
+        }
+      close( ctrl_fd );
+      DBG (3, "kernel_get_vendor_product: Could not retrieve "
+           "vendor/product ID from device %d\n", fd );
+    }
+}
+#else
 static void
 kernel_get_vendor_product (int fd, int *vendorID, int *productID)
 {
@@ -150,6 +196,7 @@
 #endif /* defined (__linux__) */
       /* put more os-dependant stuff ... */
 }
+#endif
 
 void
 sanei_usb_init (void)
@@ -219,7 +266,11 @@
 		}
 	      vendor = -1;
 	      product = -1;
+#if defined (__FreeBSD__)
+	      kernel_get_vendor_product (fd, devname, &vendor, &product );
+#else
 	      kernel_get_vendor_product (fd, &vendor, &product);
+#endif
 	      close (fd);
 	      devices[dn].devname = strdup (devname);
 	      if (!devices[dn].devname)
@@ -371,7 +422,11 @@
     }
 
   if (devices[dn].method == sanei_usb_method_scanner_driver)
+#if defined (__FreeBSD__ )
+    kernel_get_vendor_product (devices[dn].fd, devices[dn].devname, &vendorID, &productID);
+#else
     kernel_get_vendor_product (devices[dn].fd, &vendorID, &productID);
+#endif
   else if (devices[dn].method == sanei_usb_method_libusb)
     {
 #ifdef HAVE_LIBUSB



>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list