Added support for detecting vendor and product id with FreeBSD kernel scanner

driver (based on patch in FreeBSD ports).
merge-requests/1/head
Henning Geinitz 2005-11-01 20:57:03 +00:00
rodzic 710e8d4423
commit f85bbc0a0b
2 zmienionych plików z 57 dodań i 7 usunięć

Wyświetl plik

@ -1,4 +1,10 @@
2005-10-24 Oliver Schwartz <Oliver.Schwartz@gmx.de> 2005-11-01 Henning Meier-Geinitz <henning@meier-geinitz.de>
* sanei/sanei_usb.c: Added support for detecting vendor and
product id with FreeBSD kernel scanner driver (based on patch in
FreeBSD ports).
2005-10-31 Oliver Schwartz <Oliver.Schwartz@gmx.de>
* backend/snapscan.c backend/snapscan-scsi.c backend/snapscan.h * backend/snapscan.c backend/snapscan-scsi.c backend/snapscan.h
backend/snapscan-options.c doc/descriptions/snapscan.desc: backend/snapscan-options.c doc/descriptions/snapscan.desc:

Wyświetl plik

@ -87,6 +87,10 @@ struct usb_descriptor_header *GetNextDescriptor( struct usb_descriptor_header *c
} }
#endif /* HAVE_USBCALLS */ #endif /* HAVE_USBCALLS */
#if defined (__FreeBSD__)
#include <dev/usb/usb.h>
#endif /* __FreeBSD__ */
#define BACKEND_NAME sanei_usb #define BACKEND_NAME sanei_usb
#include "../include/sane/sane.h" #include "../include/sane/sane.h"
#include "../include/sane/sanei_debug.h" #include "../include/sane/sanei_debug.h"
@ -216,7 +220,7 @@ print_buffer (const SANE_Byte * buffer, SANE_Int size)
} }
static void static void
kernel_get_vendor_product (int fd, int *vendorID, int *productID) kernel_get_vendor_product (int fd, const char *name, int *vendorID, int *productID)
{ {
#if defined (__linux__) #if defined (__linux__)
/* read the vendor and product IDs via the IOCTLs */ /* read the vendor and product IDs via the IOCTLs */
@ -224,13 +228,13 @@ kernel_get_vendor_product (int fd, int *vendorID, int *productID)
{ {
if (ioctl (fd, SCANNER_IOCTL_VENDOR_OLD, vendorID) == -1) if (ioctl (fd, SCANNER_IOCTL_VENDOR_OLD, vendorID) == -1)
DBG (3, "kernel_get_vendor_product: ioctl (vendor) " DBG (3, "kernel_get_vendor_product: ioctl (vendor) "
"of device %d failed: %s\n", fd, strerror (errno)); "of device %s failed: %s\n", name, strerror (errno));
} }
if (ioctl (fd, SCANNER_IOCTL_PRODUCT, productID) == -1) if (ioctl (fd, SCANNER_IOCTL_PRODUCT, productID) == -1)
{ {
if (ioctl (fd, SCANNER_IOCTL_PRODUCT_OLD, productID) == -1) if (ioctl (fd, SCANNER_IOCTL_PRODUCT_OLD, productID) == -1)
DBG (3, "sanei_usb_get_vendor_product: ioctl (product) " DBG (3, "sanei_usb_get_vendor_product: ioctl (product) "
"of device %d failed: %s\n", fd, strerror (errno)); "of device %s failed: %s\n", name, strerror (errno));
} }
#elif defined(__BEOS__) #elif defined(__BEOS__)
{ {
@ -245,7 +249,47 @@ kernel_get_vendor_product (int fd, int *vendorID, int *productID)
*vendorID = vendor; *vendorID = vendor;
*productID = product; *productID = product;
} }
#endif /* defined (__linux__), defined(__BEOS__) */ #elif defined (__FreeBSD__)
{
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; /* Treat 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 %s\n", name);
}
#endif /* defined (__linux__), defined(__BEOS__), ... */
/* put more os-dependant stuff ... */ /* put more os-dependant stuff ... */
} }
@ -341,7 +385,7 @@ sanei_usb_init (void)
} }
vendor = -1; vendor = -1;
product = -1; product = -1;
kernel_get_vendor_product (fd, &vendor, &product); kernel_get_vendor_product (fd, devname, &vendor, &product);
close (fd); close (fd);
devices[dn].devname = strdup (devname); devices[dn].devname = strdup (devname);
if (!devices[dn].devname) if (!devices[dn].devname)
@ -598,7 +642,7 @@ sanei_usb_get_vendor_product (SANE_Int dn, SANE_Word * vendor,
} }
if (devices[dn].method == sanei_usb_method_scanner_driver) if (devices[dn].method == sanei_usb_method_scanner_driver)
kernel_get_vendor_product (devices[dn].fd, &vendorID, &productID); kernel_get_vendor_product (devices[dn].fd, devices[dn].devname, &vendorID, &productID);
else if (devices[dn].method == sanei_usb_method_libusb) else if (devices[dn].method == sanei_usb_method_libusb)
{ {
#ifdef HAVE_LIBUSB #ifdef HAVE_LIBUSB