[sane-devel] microtek2 - libusb ?
gerard klaver
gerard@gkall.hobby.nl
Sat, 21 May 2005 18:08:09 +0200
On Fri, 2005-05-20 at 16:36 -0500, Steven Palm wrote:
> On May 14, 2005, at 7:18 AM, Henning Meier-Geinitz wrote:
> >> Any notes on how to go about (or general guidelines for) converting a
> >> driver to support libusb?
> >
> > You shouldn't use libusb directly but the sanei_usb functions. AFAIK
> > the avision backend has been changed to use direct USB access instead
> > of using the kernel driver hpusbscsi so you may want to have a look at
> > its code.
>
> I'm running into a few issues that are beyond the scope of my
> ignorance... :-) (Well, the scope of my ignorance is pretty large in
> this area, so maybe I should say beyond the scope of my understanding.)
>
> A few things seem to be different between the avision and microtek2
> that are complicating my efforts.
>
> 1) The avision does a status read on an interrupt endpoint, the
> microtek2 USB config has none. Not a big deal, I just do a bulk_read
> and it seems to catch it OK.
>
> 2) The microtek has three endpoints, one output and two input.
> Using the sanei_open() and related functions I see this happening:
>
> [sanei_usb] sanei_usb_open: trying to open device `libusb:
> 003:002-05da-00a3-ff-03'
> usb_os_open: 05da:00a3
> usb_set_configuration: called for config 1
> usb_claim_interface: called for interface 0
> Interface 0 of device is 0x000011cf
> claim_interface: Interface 0 of device from QueryInterface is 0x303c80
> libusb/darwin.c get_endpoints: building table of endpoints.
> get_endpoints: Pipe 1: DIR: 0 number: 1
> get_endpoints: Pipe 2: DIR: 1 number: 2
> get_endpoints: Pipe 3: DIR: 1 number: 3
> libusb/darwin.c get_endpoints: complete.
> [sanei_usb] sanei_usb_open: configuration nr: 0
> [sanei_usb] sanei_usb_open: interface nr: 0
> [sanei_usb] sanei_usb_open: alt_setting nr: 0
> [sanei_usb] sanei_usb_open:num: 0 endpoint: 0x304260
> [sanei_usb] sanei_usb_open: direction: 0)
> [sanei_usb] sanei_usb_open: address: 1 transfertype: 2
> [sanei_usb] sanei_usb_open: found bulk-out endpoint (address 0x01)
> [sanei_usb] sanei_usb_open:num: 1 endpoint: 0x304274
> [sanei_usb] sanei_usb_open: direction: 128)
> [sanei_usb] sanei_usb_open: address: 2 transfertype: 2
> [sanei_usb] sanei_usb_open: found bulk-in endpoint (address 0x02)
> [sanei_usb] sanei_usb_open:num: 2 endpoint: 0x304288
> [sanei_usb] sanei_usb_open: direction: 128)
> [sanei_usb] sanei_usb_open: address: 3 transfertype: 2
> [sanei_usb] sanei_usb_open: found bulk-in endpoint (address 0x03)
> [sanei_usb] sanei_usb_open: we already have a bulk-in endpoint
> (address: 0x82), ignoring the new one
> [sanei_usb] sanei_usb_open: opened usb device `libusb:
> 003:002-05da-00a3-ff-03' (*dn=0)
>
> The trouble is, I can't have it throwing away the other endpoint,
> because apparently the microtek scanner sends command responses back
> on endpoint 2, but scan data comes back on endpoint 3. <sigh> Anyway
> to get this type of behavior out of the sanei_ routines?
>
> FWIW, I gleaned this little bit of info from the microtek linux
> kernel driver code:
>
> * The X6 USB has three bulk endpoints, one output (0x1) down which
> * commands and outgoing data are sent, and two input: 0x82 from which
> * normal data is read from the scanner (in packets of maximum 32
> * bytes) and from which the status byte is read, and 0x83 from which
> * the results of a scan (or preview) are read in up to 64 * 1024 byte
> * chunks by the Windows driver. We don't know how much it is possible
> * to read at a time from 0x83.
> *
> * It seems possible to read (with URB transfers) everything from 0x82
> * in one go, without bothering to read in 32 byte chunks.
> *
> * There seems to be an optimisation of a further READ implicit if
> * you simply read from 0x83.
>
>
> (MY NOTE: I have no clue what that last bit means... Anyone? :-)
>
> *
> * Guessed protocol:
> *
> * Send raw SCSI command to EP 0x1
> *
> * If there is data to receive:
> * If the command was READ datatype=image:
> * Read a lot of data from EP 0x83
> * Else:
> * Read data from EP 0x82
> * Else:
> * If there is data to transmit:
> * Write it to EP 0x1
> *
> * Read status byte from EP 0x82
>
>
> So far, it is talking to the scanner anyway, sending some commands
> and getting data back right up until it calls the READ microtek
> opcode and times out on waiting for response, my guess is that this
> response needs to be obtained over the other endpoint. THe above
> said READ datatype=image, and in this case the READ is type=system
> status.
>
> Thanks!
>
> Steve
>
Advantage for a bulk endpoint with a greater size should be that its
faster.
To select in SANE in the same configuration (conf 0, interface 0 and
altsetting ) a different endpoint is not possible yet.
It can be done by adding a a sanei_usb_read_bulk_ep routine
(at least thats how i called it) if needed.
For some example see this page and the sanei_usb.c and .h files.
I have not added these routines to SANE CVS because i used them for
testing but didn't needed them at this moment.
http://gkall.hobby.nl/downloads.html
--
--------
m.vr.gr.
Gerard Klaver