Date: Sun, 24 Mar 2002 21:03:43 +0100 From: Anders Nordby <anders@fix.no> To: dominic_marks@btinternet.com, current@freebsd.org, stable@freebsd.org Cc: n_hibma@freebsd.org Subject: How to make USB scanners work in FreeBSD (well at least Agfa ones..) Message-ID: <20020324200343.GA24999@totem.fix.no>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Hi,
Attached are patches that makes scanning work with sane, using an Agfa
Snapscan 1212U USB scanner for me. They are merely reworked from PRs
32652 and 32653 by ebakke@trolltech.com.
NB: Only tested in 4.5-stable, not in -current (sorry). Patches should
apply cleanly in -stable.
It would be nice if more people could have a look at this, so that we
can get hopefully get it in the tree sometime soon.
Thanks.
--
Anders.
[-- Attachment #2 --]
--- sys/dev/usb/usb.h.orig Tue Oct 31 23:59:35 2000
+++ sys/dev/usb/usb.h Wed Feb 20 01:52:35 2002
@@ -566,4 +566,7 @@
#define USB_GET_CM_OVER_DATA _IOR ('U', 130, int)
#define USB_SET_CM_OVER_DATA _IOW ('U', 131, int)
+/* Scanner device */
+#define USB_GET_DEVICE_ID _IOR('U', 140, int)
+
#endif /* _USB_H_ */
[-- Attachment #3 --]
--- sys/dev/usb/uscanner.c.orig Thu Feb 14 03:52:50 2002
+++ sys/dev/usb/uscanner.c Sun Feb 24 00:46:11 2002
@@ -222,6 +222,8 @@
int sc_refcnt;
u_char sc_dying;
+ u_int16_t sc_vendor_id;
+ u_int16_t sc_product_id;
};
#if defined(__NetBSD__) || defined(__OpenBSD__)
@@ -233,7 +235,7 @@
d_write_t uscannerwrite;
d_ioctl_t uscannerioctl;
d_poll_t uscannerpoll;
-
+d_ioctl_t uscannerioctl;
#define USCANNER_CDEV_MAJOR 156
Static struct cdevsw uscanner_cdevsw = {
@@ -289,6 +291,8 @@
sc->sc_dev_flags = uscanner_lookup(uaa->vendor, uaa->product)->flags;
sc->sc_udev = uaa->device;
+ sc->sc_vendor_id = uaa->vendor;
+ sc->sc_product_id = uaa->product;
err = usbd_set_config_no(uaa->device, 1, 1); /* XXX */
if (err) {
@@ -360,9 +364,10 @@
USB_GET_SC_OPEN(uscanner, unit, sc);
- DPRINTFN(5, ("uscanneropen: flag=%d, mode=%d, unit=%d\n",
+ DPRINTFN(5, ("uscanneropen: flag=%d, mode=%d, unit=%d\n",
flag, mode, unit));
+ printf( "uscanneropen()\n" );
if (sc->sc_dying)
return (ENXIO);
@@ -696,9 +701,25 @@
int
uscannerioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p)
{
- return (EINVAL);
+ struct uscanner_softc* sc;
+
+ USB_GET_SC( uscanner, USCANNERUNIT( dev ), sc );
+
+ if( sc->sc_dying )
+ return( EIO );
+
+ switch( cmd ) {
+ case USB_GET_DEVICE_ID:
+ *(u_int32_t*)addr = ( sc->sc_vendor_id << 16 ) | sc->sc_product_id;
+ break;
+ default:
+ return EINVAL;
+ }
+ return 0;
}
#if defined(__FreeBSD__)
DRIVER_MODULE(uscanner, uhub, uscanner_driver, uscanner_devclass, usbd_driver_load, 0);
#endif
+
+
[-- Attachment #4 --]
diff -Nur sane-backends.old/files/patch-backend_snapscan.c sane-backends/files/patch-backend_snapscan.c
--- sane-backends.old/files/patch-backend_snapscan.c Thu Jan 1 00:00:00 1970
+++ sane-backends/files/patch-backend_snapscan.c Tue Mar 5 23:49:15 2002
@@ -0,0 +1,19 @@
+--- backend/snapscan.c.bak Sun Dec 9 22:51:01 2001
++++ backend/snapscan.c Sun Dec 9 22:51:01 2001
+@@ -1016,7 +1016,11 @@
+
+ vendor[0] = model[0] = '\0';
+
++#if defined( __FreeBSD__ )
++ if(strstr (name, "uscanner"))
++#else /* __FreeBSD__ */
+ if((strstr (name, "usb")) || (strstr (name, "USB")))
++#endif /* __FreeBSD__ */
+ {
+ DBG (DL_VERBOSE, "%s: Detected (kind of) an USB device\n", me);
+
+@@ -3540,3 +3544,4 @@
+ * Revision 1.1 1997/10/13 02:25:54 charter
+ * Initial revision
+ * */
++
diff -Nur sane-backends.old/files/patch-sanei_sanei_usb.c sane-backends/files/patch-sanei_sanei_usb.c
--- sane-backends.old/files/patch-sanei_sanei_usb.c Thu Jan 1 00:00:00 1970
+++ sane-backends/files/patch-sanei_sanei_usb.c Tue Mar 5 23:49:22 2002
@@ -0,0 +1,42 @@
+--- sanei/sanei_usb.c.bak Sun Dec 9 22:40:14 2001
++++ sanei/sanei_usb.c Sun Dec 9 22:49:04 2001
+@@ -112,6 +112,9 @@
+ SANE_Word * product)
+ {
+ SANE_Word vendorID, productID;
++#if defined( __FreeBSD__ )
++ u_int32_t vendorproductID;
++#endif /* __FreeBSD__ */
+
+ #if defined (__linux__)
+ #define IOCTL_SCANNER_VENDOR _IOR('U', 0x20, int)
+@@ -145,8 +148,24 @@
+ if (product)
+ *product = productID;
+ #else /* not defined (__linux__) */
++#if defined( __FreeBSD__ )
++#define USB_GET_DEVICE_ID _IOR('U', 140, int)
++ /* read the vendo and product IDs via the IOCTLs */
++ if( ioctl( fd, USB_GET_DEVICE_ID, &vendorproductID ) == -1 )
++ {
++ DBG( 3, "sanei_usb_get_vendor_product: ioctl( productid ) of fd %d "
++ "failed: %s\n", fd, strerror( errno ) );
++ }
++ productID = vendorproductID & 0xffff;
++ vendorID = ( vendorproductID >> 16 ) & 0xffff;
++ if( vendor )
++ *vendor = vendorID;
++ if( product )
++ *product = productID;
++#else /* __FreeBSD__ */
+ vendorID = 0;
+ productID = 0;
++#endif /* __FreeBSD__ */
+ #endif /* not defined (__linux__) */
+
+ if (!vendorID || !productID)
+@@ -309,3 +328,4 @@
+ *size = write_size;
+ return SANE_STATUS_GOOD;
+ }
++
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020324200343.GA24999>
