Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 6 Sep 2000 19:15:49 +0100 (BST)
From:      Nick Hibma <n_hibma@qubesoft.com>
To:        USB BSD list <usb-bsd@egroups.com>
Cc:        freebsd-current@freebsd.org
Subject:   uscanner driver
Message-ID:  <Pine.BSF.4.20.0009061904060.54419-500000@henny.webweaving.org>

index | next in thread | raw e-mail

[-- Attachment #1 --]

I've quickly thrown together a driver for USB scanners. Unforunately, I
don't have a scanner available that is supported by SANE, so I can't
test it.

The driver is a rip-off of the ugen, with some bits of udbp thrown in
for good measure. It relies on a very recent version of usbdevs, so make
sure your system is up to date.

I'd appreciate it if someone that has a supported scanner (see

	http://www.mostang.com/sane/sane-backends.html

) would pick this driver up and turn it into something that works. If
your scanner is supported by SANE, but not recognised by uscanner.ko,
add the id for your scanner (usbdevs -v) to usbdevs and uscanner.h and
recompile and try again.

To install it:

Install Gimp
Install Sane
Copy uscanner.c & .h (attached) to /sys/dev/usb
Mkdir /sys/modules/uscanner
Copy Makefile (attached) to /sys/modules/uscanner/
patch your kernel with the file uscanner.patch (attached)

	cd /sys/
	patch < /tmp/uscanner.patch

And compile & load the thing

	cd /sys/modules/uscanner
	make load

Be warned! This driver will reboot your machine, break it, send your dog
on a holiday and will turn the weather into hail for the next three
weeks. If any of that does not happen, you just got lucky, don't have a 
dog or live in Scotland.


Let me know!

Nick

--
Qube Software, Ltd.                                             Private:
n_hibma@qubesoft.com                              n_hibma@webweaving.org
                                                     n_hibma@freebsd.org
http://www.qubesoft.com/                   http://www.etla.net/~n_hibma/

[-- Attachment #2 --]
/*	$FreeBSD$	*/

/*
 * Copyright (c) 1998 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Lennart Augustsson (lennart@augustsson.net) at
 * Carlstedt Research & Technology.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *        This product includes software developed by the NetBSD
 *        Foundation, Inc. and its contributors.
 * 4. Neither the name of The NetBSD Foundation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */


#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#if defined(__NetBSD__) || defined(__OpenBSD__)
#include <sys/device.h>
#elif defined(__FreeBSD__)
#include <sys/module.h>
#include <sys/bus.h>
#include <sys/conf.h>
#include <sys/fcntl.h>
#include <sys/filio.h>
#endif
#include <sys/tty.h>
#include <sys/file.h>
#include <sys/select.h>
#include <sys/proc.h>
#include <sys/vnode.h>
#include <sys/poll.h>

#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdi_util.h>

#include <dev/usb/usbdevs.h>
#include <dev/usb/uscanner.h>

#ifdef USCANNER_DEBUG
#define DPRINTF(x)	if (uscannerdebug) logprintf x
#define DPRINTFN(n,x)	if (uscannerdebug>(n)) logprintf x
int	uscannerdebug = 10;
#else
#define DPRINTF(x)
#define DPRINTFN(n,x)
#endif

#define	USCANNER_BUFFERSIZE	1024

struct uscanner_softc {
	USBBASEDEVICE		sc_dev;		/* base device */
	usbd_device_handle	sc_udev;
	usbd_interface_handle	sc_iface;

	usbd_pipe_handle	sc_bulkin_pipe;
	int			sc_bulkin;
	usbd_xfer_handle	sc_bulkin_xfer;
	void 			*sc_bulkin_buffer;
	int			sc_bulkin_bufferlen;
	int			sc_bulkin_datalen;

	usbd_pipe_handle	sc_bulkout_pipe;
	int			sc_bulkout;
	usbd_xfer_handle	sc_bulkout_xfer;
	void 			*sc_bulkout_buffer;
	int			sc_bulkout_bufferlen;
	int			sc_bulkout_datalen;

	unsigned char state;
#define USCANNER_OPEN		0x01	/* opened */

	int			sc_refcnt;
	u_char			sc_dying;
};

#if defined(__NetBSD__) || defined(__OpenBSD__)
cdev_decl(uscanner);
#elif defined(__FreeBSD__)
d_open_t  uscanneropen;
d_close_t uscannerclose;
d_read_t  uscannerread;
d_write_t uscannerwrite;
d_poll_t  uscannerpoll;

#define USCANNER_CDEV_MAJOR	155

Static struct cdevsw uscanner_cdevsw = {
	/* open */	uscanneropen,
	/* close */	uscannerclose,
	/* read */	uscannerread,
	/* write */	uscannerwrite,
	/* ioctl */	noioctl,
	/* poll */	uscannerpoll,
	/* mmap */	nommap,
	/* strategy */	nostrategy,
	/* name */	"uscanner",
	/* maj */	USCANNER_CDEV_MAJOR,
	/* dump */	nodump,
	/* psize */	nopsize,
	/* flags */	0,
	/* bmaj */	-1
};
#endif

Static int uscanner_do_read(struct uscanner_softc *, struct uio *, int);
Static int uscanner_do_write(struct uscanner_softc *, struct uio *, int);
Static void uscanner_do_close(struct uscanner_softc *);

#define USCANNERUNIT(n) (minor(n) & 0xf)

USB_DECLARE_DRIVER(uscanner);

USB_MATCH(uscanner)
{
	USB_MATCH_START(uscanner, uaa);
	int i = 0;

	if (uaa->iface == 0)
		return UMATCH_NONE;

	while (scanner_ids[i].vendor != 0) {
		if (scanner_ids[i].vendor == uaa->vendor
		    && scanner_ids[i].vendor == uaa->vendor) {
			return (UMATCH_VENDOR_PRODUCT);
		} else {
			i++;
		}
	}

	return (UMATCH_NONE);
}

USB_ATTACH(uscanner)
{
	USB_ATTACH_START(uscanner, sc, uaa);
	usb_interface_descriptor_t *id = 0;
	usb_endpoint_descriptor_t *ed, *ed_bulkin = NULL, *ed_bulkout = NULL;
	char devinfo[1024];
	int i;
	usbd_status err;

	usbd_devinfo(uaa->device, 0, devinfo);
	USB_ATTACH_SETUP;
	printf("%s: %s\n", USBDEVNAME(sc->sc_dev), devinfo);

	sc->sc_udev = uaa->device;

	/* XXX We only check the first interface */
	err = usbd_device2interface_handle(sc->sc_udev, 0, &sc->sc_iface);
	if (!err && sc->sc_iface)
	    id = usbd_get_interface_descriptor(sc->sc_iface);
	if (err || id == 0) {
		printf("%s: could not get interface descriptor, err=%d,id=%p\n",
		       USBDEVNAME(sc->sc_dev), err, id);
		USB_ATTACH_ERROR_RETURN;
	}

	/* Find the two first bulk endpoints */
	for (i = 0 ; i < id->bNumEndpoints; i++) {
		ed = usbd_interface2endpoint_descriptor(sc->sc_iface, i);
		if (ed == 0) {
			printf("%s: could not read endpoint descriptor\n",
			       USBDEVNAME(sc->sc_dev));
			USB_ATTACH_ERROR_RETURN;
		}

		if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN
		    && (ed->bmAttributes & UE_XFERTYPE) == UE_BULK) {
			ed_bulkin = ed;
		} else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT
		    && (ed->bmAttributes & UE_XFERTYPE) == UE_BULK) {
		        ed_bulkout = ed;
		}

		if (ed_bulkin && ed_bulkout)	/* found all we need */
			break;
	}

	/* Verify that we goething sensible */
	if (ed_bulkin == NULL || ed_bulkout == NULL) {
		printf("%s: bulk-in and/or bulk-out endpoint not found\n",
			USBDEVNAME(sc->sc_dev));
		USB_ATTACH_ERROR_RETURN;
	}

	sc->sc_bulkin = ed_bulkin->bEndpointAddress;
	sc->sc_bulkout = ed_bulkout->bEndpointAddress;

	/* the main device, ctrl endpoint */
	make_dev(&uscanner_cdevsw, USBDEVUNIT(sc->sc_dev),
		UID_ROOT, GID_OPERATOR, 0644, "%s", USBDEVNAME(sc->sc_dev));

	USB_ATTACH_SUCCESS_RETURN;
}

int
uscanneropen(dev, flag, mode, p)
	dev_t dev;
	int flag;
	int mode;
	struct proc *p;
{
	struct uscanner_softc *sc;
	int unit = USCANNERUNIT(dev);
	usbd_status err;

	USB_GET_SC_OPEN(uscanner, unit, sc);

 	DPRINTFN(5, ("uscanneropen: flag=%d, mode=%d, unit=%d\n", 
		     flag, mode, unit));

	if (sc == NULL || sc->sc_dying)
		return (ENXIO);

	if (sc->state & USCANNER_OPEN)
		return (EBUSY);

	sc->sc_bulkin_buffer = malloc(USCANNER_BUFFERSIZE, M_USBDEV, M_WAITOK);
	sc->sc_bulkout_buffer = malloc(USCANNER_BUFFERSIZE, M_USBDEV, M_WAITOK);
	if (sc->sc_bulkin_buffer == 0 || sc->sc_bulkout_buffer == 0) {
		uscanner_do_close(sc);
		return ENOMEM;
	}
	sc->sc_bulkin_bufferlen = USCANNER_BUFFERSIZE;
	sc->sc_bulkout_bufferlen = USCANNER_BUFFERSIZE;

	/* We have decided on which endpoints to use, now open the pipes */
	err = usbd_open_pipe(sc->sc_iface, sc->sc_bulkin,
				USBD_EXCLUSIVE_USE, &sc->sc_bulkin_pipe);
	if (err) {
		printf("%s: cannot open bulk-in pipe (addr %d)\n",
			USBDEVNAME(sc->sc_dev), sc->sc_bulkin);
		uscanner_do_close(sc);
		return EIO;
	}
	err = usbd_open_pipe(sc->sc_iface, sc->sc_bulkout,
				USBD_EXCLUSIVE_USE, &sc->sc_bulkout_pipe);
	if (err) {
		printf("%s: cannot open bulk-out pipe (addr %d)\n",
			USBDEVNAME(sc->sc_dev), sc->sc_bulkout);
		uscanner_do_close(sc);
		return EIO;
	}

	sc->sc_bulkin_xfer = usbd_alloc_xfer(sc->sc_udev);
	if (sc->sc_bulkin_xfer == 0) {
		uscanner_do_close(sc);
		return (ENOMEM);
	}
	sc->sc_bulkout_xfer = usbd_alloc_xfer(sc->sc_udev);
	if (sc->sc_bulkout_xfer == 0) {
		uscanner_do_close(sc);
		return (ENOMEM);
	}

	return 0;	/* success */
}

int
uscannerclose(dev, flag, mode, p)
	dev_t dev;
	int flag;
	int mode;
	struct proc *p;
{
	struct uscanner_softc *sc;

	USB_GET_SC(uscanner, USCANNERUNIT(dev), sc);

	DPRINTFN(5, ("uscannerclose: flag=%d, mode=%d, unit=%d\n",
		     flag, mode, USCANNERUNIT(dev)));

#ifdef DIAGNOSTIC
	if (!(sc->state & USCANNER_OPEN)) {
		printf("uscannerclose: not open\n");
		return (EINVAL);
	}
#endif

	uscanner_do_close(sc);

	return 0;
}

void
uscanner_do_close(struct uscanner_softc *sc)
{
	if (sc->sc_bulkin_xfer) {
		usbd_free_xfer(sc->sc_bulkin_xfer);
		sc->sc_bulkin_xfer = NULL;
	}
	if (sc->sc_bulkout_xfer) {
		usbd_free_xfer(sc->sc_bulkout_xfer);
		sc->sc_bulkout_xfer = NULL;
	}

	if (sc->sc_bulkin_pipe) {
		usbd_abort_pipe(sc->sc_bulkin_pipe);
		usbd_close_pipe(sc->sc_bulkin_pipe);
		sc->sc_bulkin_pipe = NULL;
	}
	if (sc->sc_bulkout_pipe) {
		usbd_abort_pipe(sc->sc_bulkout_pipe);
		usbd_close_pipe(sc->sc_bulkout_pipe);
		sc->sc_bulkout_pipe = NULL;
	}

	if (sc->sc_bulkin_buffer) {
		free(sc->sc_bulkin_buffer, M_USBDEV);
		sc->sc_bulkin_buffer = NULL;
	}
	if (sc->sc_bulkout_buffer) {
		free(sc->sc_bulkout_buffer, M_USBDEV);
		sc->sc_bulkout_buffer = NULL;
	}

	sc->state &= ~USCANNER_OPEN;
}

Static int
uscanner_do_read(sc, uio, flag)
	struct uscanner_softc *sc;
	struct uio *uio;
	int flag;
{
	u_int32_t n, tn;
	usbd_status err;
	int error = 0;

	DPRINTFN(5, ("%s: uscannerread\n", USBDEVNAME(sc->sc_dev)));

	if (sc->sc_dying)
		return (EIO);

	while ((n = min(sc->sc_bulkin_bufferlen, uio->uio_resid)) != 0) {
		DPRINTFN(1, ("uscannerread: start transfer %d bytes\n",n));
		tn = n;

		err = usbd_bulk_transfer(
			sc->sc_bulkin_xfer, sc->sc_bulkin_pipe,
			sc->state & USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT,
			sc->sc_bulkin_buffer, &tn,
			"uscannerrb");
		if (err) {
			if (err == USBD_INTERRUPTED)
				error = EINTR;
			else if (err == USBD_TIMEOUT)
				error = ETIMEDOUT;
			else
				error = EIO;
			break;
		}
		DPRINTFN(1, ("uscannerread: got %d bytes\n", tn));
		error = uiomove(sc->sc_bulkin_buffer, tn, uio);
		if (error || tn < n)
			break;
	}

	return (error);
}

int
uscannerread(dev, uio, flag)
	dev_t dev;
	struct uio *uio;
	int flag;
{
	struct uscanner_softc *sc;
	int error;

	USB_GET_SC(uscanner, USCANNERUNIT(dev), sc);

	sc->sc_refcnt++;
	error = uscanner_do_read(sc, uio, flag);
	if (--sc->sc_refcnt < 0)
		usb_detach_wakeup(USBDEV(sc->sc_dev));

	return (error);
}

Static int
uscanner_do_write(sc, uio, flag)
	struct uscanner_softc *sc;
	struct uio *uio;
	int flag;
{
	u_int32_t n;
	int error = 0;
	usbd_status err;

	DPRINTFN(5, ("%s: uscanner_do_write\n", USBDEVNAME(sc->sc_dev)));

	if (sc->sc_dying)
		return (EIO);

	while ((n = min(sc->sc_bulkout_bufferlen, uio->uio_resid)) != 0) {
		error = uiomove(sc->sc_bulkout_buffer, n, uio);
		if (error)
			break;
		DPRINTFN(1, ("uscanner_do_write: transfer %d bytes\n", n));
		err = usbd_bulk_transfer(
			sc->sc_bulkout_xfer, sc->sc_bulkout_pipe,
			0, USBD_NO_TIMEOUT,
			sc->sc_bulkout_buffer, &n,
			"uscannerwb");
		if (err) {
			if (err == USBD_INTERRUPTED)
				error = EINTR;
			else
				error = EIO;
			break;
		}
	}

	return (error);
}

int
uscannerwrite(dev, uio, flag)
	dev_t dev;
	struct uio *uio;
	int flag;
{
	struct uscanner_softc *sc;
	int error;

	USB_GET_SC(uscanner, USCANNERUNIT(dev), sc);

	sc->sc_refcnt++;
	error = uscanner_do_write(sc, uio, flag);
	if (--sc->sc_refcnt < 0)
		usb_detach_wakeup(USBDEV(sc->sc_dev));
	return (error);
}

#if defined(__NetBSD__) || defined(__OpenBSD__)
int
uscanner_activate(self, act)
	device_ptr_t self;
	enum devact act;
{
	struct uscanner_softc *sc = (struct uscanner_softc *)self;

	switch (act) {
	case DVACT_ACTIVATE:
		return (EOPNOTSUPP);
		break;

	case DVACT_DEACTIVATE:
		sc->sc_dying = 1;
		break;
	}
	return (0);
}
#endif

USB_DETACH(uscanner)
{
	USB_DETACH_START(uscanner, sc);
	int s;
#if defined(__NetBSD__) || defined(__OpenBSD__)
	int maj, mn;
#elif defined(__FreeBSD__)
	dev_t dev;
	struct vnode *vp;
#endif

#if defined(__NetBSD__) || defined(__OpenBSD__)
	DPRINTF(("uscanner_detach: sc=%p flags=%d\n", sc, flags));
#elif defined(__FreeBSD__)
	DPRINTF(("uscanner_detach: sc=%p\n", sc));
#endif

	sc->sc_dying = 1;

	/* Abort all pipes.  Causes processes waiting for transfer to wake. */
	if (sc->sc_bulkin_pipe)
		usbd_abort_pipe(sc->sc_bulkin_pipe);
	if (sc->sc_bulkout_pipe)
		usbd_abort_pipe(sc->sc_bulkout_pipe);

	s = splusb();
	if (--sc->sc_refcnt >= 0) {
		/* Wait for processes to go away. */
		usb_detach_wait(USBDEV(sc->sc_dev));
	}
	splx(s);

#if defined(__NetBSD__) || defined(__OpenBSD__)
	/* locate the major number */
	for (maj = 0; maj < nchrdev; maj++)
		if (cdevsw[maj].d_open == uscanneropen)
			break;

	/* Nuke the vnodes for any open instances (calls close). */
	mn = self->dv_unit * USB_MAX_ENDPOINTS;
	vdevgone(maj, mn, mn + USB_MAX_ENDPOINTS - 1, VCHR);
#elif defined(__FreeBSD__)
	/* destroy the device for the control endpoint */
	dev = makedev(USCANNER_CDEV_MAJOR, USBDEVUNIT(sc->sc_dev));
	vp = SLIST_FIRST(&dev->si_hlist);
	if (vp)
		VOP_REVOKE(vp, REVOKEALL);
	destroy_dev(dev);
#endif

	return (0);
}

int
uscannerpoll(dev, events, p)
	dev_t dev;
	int events;
	struct proc *p;
{
	struct uscanner_softc *sc;
	int revents = 0;

	USB_GET_SC(uscanner, USCANNERUNIT(dev), sc);

	if (sc->sc_dying)
		return (EIO);

	/* 
	 * We have no easy way of determining if a read will
	 * yield any data or a write will happen.
	 * Pretend they will.
	 */
	revents |= events & 
		   (POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM);

	return (revents);
}

#if defined(__FreeBSD__)
DRIVER_MODULE(uscanner, uhub, uscanner_driver, uscanner_devclass, usbd_driver_load, 0);
#endif

[-- Attachment #3 --]
/* table of scanners that may work with this driver */
static const struct scanner_id {
    uint16_t	vendor;
    uint16_t	product;
} scanner_ids [] = {
    { USB_VENDOR_ACERP, USB_PRODUCT_ACERP_ACERSCAN_640U },
    { USB_VENDOR_ACERP, USB_PRODUCT_ACERP_ACERSCAN_620U },

    { USB_VENDOR_AGFA, USB_PRODUCT_AGFA_SNAPSCAN1212U },
    { USB_VENDOR_AGFA, USB_PRODUCT_AGFA_SNAPSCAN1212U2 },
    { USB_VENDOR_AGFA, USB_PRODUCT_AGFA_SNAPSCANTOUCH },

    { USB_VENDOR_KYE, USB_PRODUCT_KYE_VIVIDPRO },

    { USB_VENDOR_HP, USB_PRODUCT_HP_3300C },
    { USB_VENDOR_HP, USB_PRODUCT_HP_4100C },
    { USB_VENDOR_HP, USB_PRODUCT_HP_4200C },
    { USB_VENDOR_HP, USB_PRODUCT_HP_S20 },
    { USB_VENDOR_HP, USB_PRODUCT_HP_5200 },
    { USB_VENDOR_HP, USB_PRODUCT_HP_6200C },
    { USB_VENDOR_HP, USB_PRODUCT_HP_6300C },

    { USB_VENDOR_AVISION, USB_PRODUCT_AVISION_1200U },

    { USB_VENDOR_MICROTEK, USB_PRODUCT_MICROTEK_X6U },
    { USB_VENDOR_MICROTEK, USB_PRODUCT_MICROTEK_336CX },
    { USB_VENDOR_MICROTEK, USB_PRODUCT_MICROTEK_336CX2 },
    { USB_VENDOR_MICROTEK, USB_PRODUCT_MICROTEK_C6 },
    { USB_VENDOR_MICROTEK, USB_PRODUCT_MICROTEK_V6USL },
    { USB_VENDOR_MICROTEK, USB_PRODUCT_MICROTEK_V6USL2 },
    { USB_VENDOR_MICROTEK, USB_PRODUCT_MICROTEK_V6UL },

    { USB_VENDOR_MUSTEK, USB_PRODUCT_MUSTEK_1200CU },

    { USB_VENDOR_PRIMAX, USB_PRODUCT_PRIMAX_G2E300 },
    { USB_VENDOR_PRIMAX, USB_PRODUCT_PRIMAX_636I },
    { USB_VENDOR_PRIMAX, USB_PRODUCT_PRIMAX_G2300 },
    { USB_VENDOR_PRIMAX, USB_PRODUCT_PRIMAX_G2600 },
    { USB_VENDOR_PRIMAX, USB_PRODUCT_PRIMAX_G2E3002 },
    { USB_VENDOR_PRIMAX, USB_PRODUCT_PRIMAX_G2E600 },
    { USB_VENDOR_PRIMAX, USB_PRODUCT_PRIMAX_9600 },
    { USB_VENDOR_PRIMAX, USB_PRODUCT_PRIMAX_19200 },
    { USB_VENDOR_PRIMAX, USB_PRODUCT_PRIMAX_600U },
    { USB_VENDOR_PRIMAX, USB_PRODUCT_PRIMAX_1200U },

    { USB_VENDOR_EPSON, USB_PRODUCT_EPSON_636 },
    { USB_VENDOR_EPSON, USB_PRODUCT_EPSON_610 },
    { USB_VENDOR_EPSON, USB_PRODUCT_EPSON_1200 },

    { USB_VENDOR_UMAX, USB_PRODUCT_UMAX_ASTRA1220U },
    { USB_VENDOR_UMAX, USB_PRODUCT_UMAX_ASTRA1236U },
    { USB_VENDOR_UMAX, USB_PRODUCT_UMAX_ASTRA2000U },
    { USB_VENDOR_UMAX, USB_PRODUCT_UMAX_ASTRA2200U },

    { USB_VENDOR_VISIONEER, USB_PRODUCT_VISIONEER_5300 },
    { USB_VENDOR_VISIONEER, USB_PRODUCT_VISIONEER_6100 },

    { 0, 0 }
};



[-- Attachment #4 --]
#       $FreeBSD: src/sys/modules/ums/Makefile,v 1.9 2000/05/27 01:14:28 peter Exp $ 

MAINTAINER	 = n_hibma@freebsd.org

.PATH:  	 ${.CURDIR}/../../dev/usb
KMOD		 = uscanner
SRCS		 = bus_if.h device_if.h vnode_if.h opt_usb.h uscanner.c
NOMAN		 =

CFLAGS		+= -g

.include <bsd.kmod.mk>

[-- Attachment #5 --]
Index: boot/forth/loader.conf
===================================================================
RCS file: /home/ncvs/src/sys/boot/forth/loader.conf,v
retrieving revision 1.30
diff -w -u -r1.30 loader.conf
--- boot/forth/loader.conf	2000/07/28 11:54:08	1.30
+++ boot/forth/loader.conf	2000/09/05 13:48:23
@@ -169,6 +169,7 @@
 ulpt_load="NO"			# Printer
 ums_load="NO"			# Mouse
 umass_load="NO"			# Mass Storage Devices
+uscanner_load="NO"		# Scanners
 if_aue_load="NO"		# ADMtek USB ethernet
 if_cue_load="NO"		# CATC USB ethernet
 if_kue_load="NO"		# Kawasaki LSI USB ethernet
Index: conf/majors
===================================================================
RCS file: /home/ncvs/src/sys/conf/majors,v
retrieving revision 1.112
diff -w -u -r1.112 majors
--- conf/majors	2000/09/01 21:14:15	1.112
+++ conf/majors	2000/09/05 13:36:02
@@ -171,6 +171,7 @@
 152	acpi		ACPI bios support (Takanori Watanabe takawata@shidahara1.planet.sci.kobe-u.ac.jp)
 153	ti		Tigon Gigabit Ethernet driver (ken@FreeBSD.ORG)
 154	asr		Adaptec SCSI RAID <msmith@freebsd.org>
+155	uscanner	USB Scanners <n_hibma>
 200	??		entries from 200-252 are reserved for local use
 252	??		entries from 200-252 are reserved for local use
 253	mfs		Used by MFS
Index: modules/Makefile
===================================================================
RCS file: /home/ncvs/src/sys/modules/Makefile,v
retrieving revision 1.137
diff -w -u -r1.137 Makefile
--- modules/Makefile	2000/09/01 07:51:24	1.137
+++ modules/Makefile	2000/09/05 13:46:03
@@ -13,6 +13,7 @@
 	nwfs portal procfs ${_randomdev} \
 	rl rp sf sis sk sn sound ste syscons ti tl twe tx \
 	udbp ugen uhid ukbd ulpt umapfs umass umodem ums union urio usb \
+	uscanner \
 	vinum vn vpo vr wb wx xl
 
 # XXX some of these can move to the general case when de-i386'ed
help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.20.0009061904060.54419-500000>