[sane-devel] deadlock with sanei_usb_read_bulk

Jürgen Ernst jrernst at gmx.de
Sun Feb 10 01:25:09 UTC 2008


Hi!

I'm trying to write the backend for Canon LiDE 600F and now I'm stuck 
with sanei_usb_read_bulk. I tried 10 hours but I don't understand how to 
get sanei_usb working with bulk_read. Can somebody help me out?

Here are some details:

Canon LiDE 600F is similar to Canon LiDE 70. I checked this with two 
guys owning a LiDE 70. So you can read some info on
http://www.sane-project.org/unsupported/canon-lide-70.html

...
<endpoint 0>
   bEndpointAddress  0x02 (out 0x02)
   bmAttributes      2 (bulk)
...
<endpoint 0>
   bEndpointAddress  0x83 (in 0x03)
   bmAttributes      2 (bulk)
...

For short:
LiDE 600F has only two endpoints. Both bulk no interrupt. In the log 
file no control messages are used. Only simple bulk read and write.

I programmed a perl script with which I was able to access the scanner 
and retrieve scan data.

So this was the point to start writing the sane backend in C.

Okay, let's look first on a perl code snippet:

sub canon_get
{
   my ( $reg ) = @_ ;
   my $data = '01 ' . $reg . ' 01 00' ;
   my $err = $dev->bulk_write(hex('02'), hex2bin($data), $timeout);

   my $data = "\0" x 512 ;
   my $cnt = $dev->bulk_write(hex('03'), $data, $timeout);

   my $data = ' ' ;
   my $cnt = $dev->bulk_read(hex('83'), $data, 1, $timeout) ;
   return ( $data ) ;
}

This is the procedure to get 1 byte of data from the CP2155 chip.
Suppose we called canon_get('91'); then $reg is '91' in hex.
$data is set to '01 91 01 00'.
I made it this way to better check with output from log.
hex2bin converts this string to binary.

Then a first bulk_write is made. In perl I had to give the 
bEndpointAddress '02' while in sanei_usb I saw I had to give the 
endpoint number as an integer (endpoint 0).

Second is a dummy write on the other endpoint (endpoint 1) with 512 
bytes of data.

Third we can get the result with a 1 byte bulk_read on endpoint 1.

That's it.

But it doesn't work in sane.

Here's the snippet of my test procedure in C:

static byte setup_buffer[] = { 0, 0, 0, 0, ... ,0 };

static SANE_Status
CP2155get (CP2155_Register reg, byte *data)
{
   SANE_Status status;
   size_t count;

   setup_buffer[0] = 0x01;
   setup_buffer[1] = (reg) & 0xFF;
   setup_buffer[2] = 0x01;
   setup_buffer[3] = 0x00;
   count = 4;

   status = sanei_usb_write_bulk (0, setup_buffer, &count);

   if (status != SANE_STATUS_GOOD)
     DBG (1, "CP2155get: sanei_usb_write_bulk.1 error\n");

   count = 512;
   status = sanei_usb_write_bulk (0, setup_buffer, &count);

   if (status != SANE_STATUS_GOOD)
     DBG (1, "CP2155get: sanei_usb_write_bulk.2 error\n");

   count = 1;
   status = sanei_usb_read_bulk (0, data, &count);

   if (status != SANE_STATUS_GOOD)
     DBG (1, "CP2155get: sanei_usb_read_bulk error\n");

   return status;
}

setup_buffer is an array with 512 bytes.

The first two bulk_writes didn't return any error.
It seems that they worked fine.

On the last bulk_read the program hangs forever.

I surely did a mistake but I don't know where and why.
Please help.

-- 
Ciao
Jürgen

Microsoft is not the answer. Microsoft is the question.
"NO" is the answer.



More information about the sane-devel mailing list