[sane-devel] Help with usb AGFA 1212U an libusb
Jose Alberto Reguero
jareguero@telefonica.net
Wed, 7 Apr 2004 19:36:22 +0200
--Boundary-00=_WwDdAZYOumXfd5e
Content-Type: text/plain;
charset="us-ascii"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
I patch the code to count urb packets as suggested in:
http://lists.alioth.debian.org/pipermail/sane-devel/2004-March/010534.html
and I have some success, but it don't work well absolutely.
I think that the problem is in th count of the urb read packets, and perhaps
there is a better solution to make the number of packets even.
I attach the patch.
Thanks.
Jose Alberto Reguero.
--Boundary-00=_WwDdAZYOumXfd5e
Content-Type: text/x-diff;
charset="us-ascii";
name="snapscan-usb.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="snapscan-usb.patch"
--- snapscan-usb.c 2004-04-07 19:18:21.189514624 +0200
+++ snapscan-usb.c.coque 2004-04-07 19:17:59.742775024 +0200
@@ -96,6 +96,8 @@
static struct sembuf sem_signal = { 0, 1, 0 };
static sense_handler_type usb_sense_handler;
static void* usb_pss;
+static int read_urb = 0;
+static int write_urb = 0;
/* Forward declarations */
static SANE_Status usb_request_sense(SnapScan_Scanner *pss);
@@ -186,6 +188,36 @@
DBG (DL_CALL_TRACE, "%s(%d)\n", me, fd);
semctl(sem_id, 0, IPC_RMID, dummy_semun_arg);
+ printf ("1 read %d write %d\n", read_urb, write_urb);
+ if ((read_urb % 2) == 1 && (write_urb % 2) == 1)
+ {
+ char cmd[] = {TEST_UNIT_READY, 0, 0, 0, 0, 0};
+
+ snapscani_usb_cmd (fd, cmd, sizeof (cmd), NULL, 0);
+ }
+ else if ((read_urb % 2) == 1)
+ {
+ size_t read_bytes;
+ char cmd[] = {TEST_UNIT_READY, 0, 0, 0, 0, 0};
+ char cmd2[] = {INQUIRY, 0, 0, 0, 120, 0};
+ char data[120];
+
+ read_bytes = 120;
+ snapscani_usb_cmd (fd, cmd2, sizeof (cmd2), data, &read_bytes);
+ snapscani_usb_cmd (fd, cmd, sizeof (cmd), NULL, 0);
+ }
+ else if ((write_urb %1) == 1)
+ {
+ size_t read_bytes;
+ char cmd[] = {INQUIRY, 0, 0, 0, 120, 0};
+ char data[120];
+
+ read_bytes = 120;
+ snapscani_usb_cmd (fd, cmd, sizeof (cmd), data, &read_bytes);
+ }
+ printf ("2 read %d write %d\n", read_urb, write_urb);
+ read_urb = 0;
+ write_urb = 0;
sanei_usb_close(fd);
}
@@ -241,6 +273,8 @@
DBG (DL_MAJOR_ERROR, "%s Only %d bytes written\n",me,bytes_written);
status = SANE_STATUS_IO_ERROR;
}
+ write_urb++;
+ printf ("write %d\n",n);
return status;
}
@@ -255,6 +289,8 @@
DBG (DL_MAJOR_ERROR, "%s Only %d bytes read\n",me,bytes_read);
status = SANE_STATUS_IO_ERROR;
}
+ read_urb += ((63 + n) / 64);
+ printf ("read %d\n",n);
DBG(DL_DATA_TRACE, "%s: reading: %s\n",me,usb_debug_data(dbgmsg,buf,n));
return status;
--Boundary-00=_WwDdAZYOumXfd5e--