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