[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