Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Feb 2007 16:11:23 +0100
From:      Steinar Hamre <steinarh@pvv.ntnu.no>
To:        Alexander Leidinger <Alexander@Leidinger.net>
Cc:        freebsd-usb@freebsd.org
Subject:   Supporting scanners on multi function devices
Message-ID:  <20070201151123.GC45997@pvv.ntnu.no>
In-Reply-To: <20070201083333.rjvhpmnjggwk4wso@webmail.leidinger.net>
References:  <200701100050.l0A0oOTY002615@freefall.freebsd.org> <20070129203852.2f3d6a89@Magellan.Leidinger.net> <20070131230920.GA45997@pvv.ntnu.no> <20070201083333.rjvhpmnjggwk4wso@webmail.leidinger.net>

next in thread | previous in thread | raw e-mail | index | archive | help

--DBIVS5p969aUjpLe
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Thu, Feb 01, 2007 at 08:33:33AM +0100, Alexander Leidinger wrote:
> Quoting Steinar Hamre <steinarh@pvv.ntnu.no> (from Thu, 1 Feb 2007  
> 
> >Did the device work without my patch?
> 
> I never tried, I don't have a driver for this scanner (Brother has  
> binary only drivers for sane on linux only).

Can you verify that the same crash occurs if you add your device
to uscanner.c without my patch?

If so, the problem might indeed be that the scanner is not the
first device. I have attached a small program to list the interfaces
of an ugen device.

Making a ugen device of a multi function device is a bit tricky.
If you kldunload all modules using the device (usbdevs -d),
kldload ugen and then powercycle the device, that should do
the trick. Alternativly, compile a kernel without the relevant
devices and reboot.
(A way to get this information from a non-ugen device would
be appreciated.)

Then run
./ugeninfo /dev/ugen0

On my printer/scanner/memorycardreader this looks like:

4:4: EPSON(0x04b8) USB2.0 MFP(Hi-Speed)(0x082b): class 0:0:0 config 1, 3 ifs
        0: class 255:255:255, 2 eps
        1: class 7:1:2, 2 eps
        2: class 8:6:80, 2 eps

0 is the scanner. (UICLASS_VENDOR)
1 is UICLASS_PRINTER and 2 is UICLASS_MASS

	Steinar

--DBIVS5p969aUjpLe
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="ugeninfo.c"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <err.h>
#include <errno.h>
#include <dev/usb/usb.h>
#include <sys/ioctl.h>

int
print_device(char *path) {
  struct usb_device_info di; 
  struct usb_config_desc cd; 
  struct usb_interface_desc id; 
  int r, i, f;

  f=open(path, O_RDONLY);
  if (!f) {
    perror(path);
    return 0;
  }

  //di.udi_addr = a;
  r = ioctl(f, USB_GET_DEVICEINFO, &di);
  if (r<0) {
    perror("USB_GET_DEVICEINFO");
    return 0;
  }

  cd.ucd_config_index=USB_CURRENT_CONFIG_INDEX;
  r = ioctl(f, USB_GET_CONFIG_DESC, &cd);
  if (r<0) {
    perror("USB_GET_CONFIG_DESC");
    return 0;
  }
  
  printf("%d:%d: %s(0x%04x) %s(0x%04x): class %d:%d:%d config %d, %d ifs\n",
	 di.udi_bus, di.udi_addr,
	 di.udi_vendor, di.udi_vendorNo,
	 di.udi_product, di.udi_productNo,
	 di.udi_class, di.udi_subclass, di.udi_protocol,
	 cd.ucd_desc.bConfigurationValue,
	 cd.ucd_desc.bNumInterface);
  for (i = 0; i < cd.ucd_desc.bNumInterface; i++) {
    id.uid_config_index=USB_CURRENT_CONFIG_INDEX;
    id.uid_interface_index=i;
    id.uid_alt_index=USB_CURRENT_ALT_INDEX;
    r = ioctl(f, USB_GET_INTERFACE_DESC, &id);
    if (r<0) {
      perror("USB_GET_INTERFACE_DESC");
      continue;
    }
    printf("\t%d: class %d:%d:%d, %d eps\n",
	   i, id.uid_desc.bInterfaceClass,
	   id.uid_desc.bInterfaceSubClass, id.uid_desc.bInterfaceProtocol,
	   id.uid_desc.bNumEndpoints);
  }
  return 1;
}

int
main(int argc, char *argv[]) {
  print_device(argv[1]);
}


--DBIVS5p969aUjpLe--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070201151123.GC45997>