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
--2fHTh5uZTiUOsy+g Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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. --2fHTh5uZTiUOsy+g Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="mypatch-usb.h" --- 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_ */ --2fHTh5uZTiUOsy+g Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="mypatch-uscanner.c_v2" --- 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 + + --2fHTh5uZTiUOsy+g Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=mypatch-sane-backends 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; + } ++ --2fHTh5uZTiUOsy+g-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-stable" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020324200343.GA24999>