Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 2 May 2003 16:32:44 +0200 (CEST)
From:      "Erik H. Bakke" <ebakke@trolltech.com>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   ports/51692: Patch to enable USB scanner autodetection
Message-ID:  <200305021432.h42EWinu005001@riserva.troll.no>
Resent-Message-ID: <200305021430.h42EUE9M013065@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>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@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:



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