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 [EMAIL PROTECTED]
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.
--- 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_ */
--- 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 + +
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; + } ++