[sane-devel] microtek2 - libusb ?
steven, do you have a trace of the windows operation of the device? if not get one using benoit's usbsniffer, and see if the RSS data block is not read from the other endpoint, and perhaps that is why you get nothing... allan On Sat, 21 May 2005, Steven Palm wrote: OK, although I will need to read the other endpoint for image data, that apparently is not the issue I'm hitting right now. I can open the scanner. I can send it short INQUIRY and get the requested data block back then read status. I can send it long INQUIRY and get the requested data block back then read status. I can send it READ ATTRIBUTES and get the requested data block back then read status. I can send it READ SYSTEM STATUS, but instead of getting my data block back, I get one byte (00), and it timeout on trying to read additional bytes. It is almost like the RSS data block is not being sent and the status byte is the one byte I am reading. It appears that both prior developers of the microtek2 backend are not involved any longer, so I guess there is no help from them. Steve -- so don't tell us it can't be done, putting down what you don't know. money isn't our god, integrity will free our souls - Max Cavalera
[sane-devel] microtek2 - libusb ?
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 0x11cf 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
[sane-devel] microtek2 - libusb ?
On May 21, 2005, at 11:08 AM, gerard klaver wrote: To select in SANE in the same configuration (conf 0, interface 0 and altsetting ) a different endpoint is not possible yet. And there is only one configuration in this scanner, and I had tried altsetting with no luck, it seems there is no altsettings for the single configuration either. 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. Thank you, I will test them and report back. If they do work, I will vote to include them in the main sane distribution. :-) Steve
[sane-devel] microtek2 - libusb ?
OK, although I will need to read the other endpoint for image data, that apparently is not the issue I'm hitting right now. I can open the scanner. I can send it short INQUIRY and get the requested data block back then read status. I can send it long INQUIRY and get the requested data block back then read status. I can send it READ ATTRIBUTES and get the requested data block back then read status. I can send it READ SYSTEM STATUS, but instead of getting my data block back, I get one byte (00), and it timeout on trying to read additional bytes. It is almost like the RSS data block is not being sent and the status byte is the one byte I am reading. It appears that both prior developers of the microtek2 backend are not involved any longer, so I guess there is no help from them. Steve
[sane-devel] microtek2 - libusb ?
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 0x11cf 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
[sane-devel] microtek2 - libusb ?
Hi, On Fri, May 13, 2005 at 08:37:08PM -0500, Steven Palm wrote: Is anyone working on the microtek2 driver, specifically to allow it to support libusb? Have you already asked the authors of that backend? I'm not sure if they read this list: Bernd Schroeder bernd AT aquila.muc.de Karsten Festag karsten.festag AT gmx.de 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. If nobody is working on this, I may pursue it, but my hack work usually isn't nearly as glamorous as the original code and may not be suitable for integration back into the project. ;-) If it works and compiles everywhere I see no reason why it shouldn't be included. Bye, Henning
[sane-devel] microtek2 - libusb ?
Is anyone working on the microtek2 driver, specifically to allow it to support libusb? In looking at things, it appears as though it was designed to deal with the scanners through opening the /dev files and sending/reading SCSI data directly. Any notes on how to go about (or general guidelines for) converting a driver to support libusb? If nobody is working on this, I may pursue it, but my hack work usually isn't nearly as glamorous as the original code and may not be suitable for integration back into the project. ;-) Steve