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>