From owner-freebsd-current Sun Mar 24 12: 3:52 2002 Delivered-To: freebsd-current@freebsd.org Received: from totem.fix.no (totem.fix.no [80.91.32.29]) by hub.freebsd.org (Postfix) with ESMTP id 0786237B400; Sun, 24 Mar 2002 12:03:27 -0800 (PST) Received: by totem.fix.no (Postfix, from userid 1000) id D52E13C97; Sun, 24 Mar 2002 21:03:43 +0100 (CET) Date: Sun, 24 Mar 2002 21:03:43 +0100 From: Anders Nordby 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> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="2fHTh5uZTiUOsy+g" Content-Disposition: inline User-Agent: Mutt/1.3.27i X-message-flag: Outlook : A program to spread viri, but it can do mail too. X-PGP-Key: http://anders.fix.no/pgp/ X-PGP-Key-FingerPrint: 1E0F C53C D8DF 6A8F EAAD 19C5 D12A BC9F 0083 5956 Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG --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-current" in the body of the message