kopia lustrzana https://gitlab.com/sane-project/backends
Added workaround for toggle = data0 chipset bug. Fixes bug #300323.
rodzic
2e1f2f1a10
commit
cae6ee91fd
|
@ -1,3 +1,10 @@
|
|||
2004-03-02 Henning Meier-Geinitz <henning@meier-geinitz.de>
|
||||
|
||||
* backend/mustek_usb.c backend/mustek_usb_low.c
|
||||
backend/mustek_usb_low.h doc/sane-mustek_usb.man:
|
||||
Added workaround for toggle = data0 chipset bug.
|
||||
Fixes bug #300323.
|
||||
|
||||
2004-03-01 Frank Zago <fzago at austin dot rr dot com>
|
||||
|
||||
* doc/descriptions-external/genesys.desc: created list of scanners
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
Copyright (C) 2000 Mustek.
|
||||
Originally maintained by Tom Wang <tom.wang@mustek.com.tw>
|
||||
|
||||
Copyright (C) 2001, 2002 by Henning Meier-Geinitz.
|
||||
Copyright (C) 2001 - 2004 by Henning Meier-Geinitz.
|
||||
|
||||
This file is part of the SANE package.
|
||||
|
||||
|
@ -46,7 +46,7 @@
|
|||
This file implements a SANE backend for Mustek 1200UB and similar
|
||||
USB flatbed scanners. */
|
||||
|
||||
#define BUILD 17
|
||||
#define BUILD 18
|
||||
|
||||
#include "../include/sane/config.h"
|
||||
|
||||
|
@ -86,8 +86,8 @@ static Mustek_Usb_Device *first_dev;
|
|||
static Mustek_Usb_Scanner *first_handle;
|
||||
static const SANE_Device **devlist = 0;
|
||||
|
||||
/* Maximum amount of data read in one turn from USB */
|
||||
static SANE_Word max_block_size = 8 * 1024;
|
||||
/* Maximum amount of data read in one turn from USB. */
|
||||
static SANE_Word max_block_size = (8 * 1024);
|
||||
|
||||
/* Array of newly attached devices */
|
||||
static Mustek_Usb_Device **new_dev;
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
Copyright (C) 2000 Mustek.
|
||||
Originally maintained by Tom Wang <tom.wang@mustek.com.tw>
|
||||
|
||||
Copyright (C) 2001, 2002 by Henning Meier-Geinitz.
|
||||
Copyright (C) 2001 - 2004 by Henning Meier-Geinitz.
|
||||
|
||||
This file is part of the SANE package.
|
||||
|
||||
|
@ -153,6 +153,8 @@ usb_low_init (ma1017 ** chip_address)
|
|||
chip->sensor = ST_CANON600;
|
||||
chip->motor = MT_1200;
|
||||
|
||||
chip->total_read_urbs = 0;
|
||||
chip->total_write_urbs = 0;
|
||||
DBG (7, "usb_low_init: exit\n");
|
||||
return SANE_STATUS_GOOD;
|
||||
}
|
||||
|
@ -163,17 +165,15 @@ usb_low_exit (ma1017 * chip)
|
|||
DBG (7, "usb_low_exit: chip = %p\n", (void *) chip);
|
||||
if (chip)
|
||||
{
|
||||
if (chip->fd >= 0)
|
||||
{
|
||||
DBG (7, "usb_low_exit: closing fd %d\n", chip->fd);
|
||||
sanei_usb_close (chip->fd);
|
||||
chip->fd = -1;
|
||||
}
|
||||
if (chip->fd >= 0 && chip->is_opened)
|
||||
usb_low_close (chip);
|
||||
DBG (7, "usb_low_exit: freeing chip\n");
|
||||
free (chip);
|
||||
}
|
||||
return SANE_STATUS_GOOD;
|
||||
DBG (5, "usb_low_exit: read %d URBs, wrote %d URBs\n",
|
||||
chip->total_read_urbs, chip->total_write_urbs);
|
||||
DBG (7, "usb_low_exit: exit\n");
|
||||
return SANE_STATUS_GOOD;
|
||||
}
|
||||
|
||||
/* A0 ~ A1 */
|
||||
|
@ -294,6 +294,7 @@ usb_low_start_cmt_table (ma1017 * chip)
|
|||
"wrote %lu bytes\n", (unsigned long int) n);
|
||||
return SANE_STATUS_IO_ERROR;
|
||||
}
|
||||
chip->total_write_urbs++;
|
||||
chip->is_rowing = SANE_TRUE;
|
||||
DBG (7, "usb_low_start_cmt_table: exit\n");
|
||||
return SANE_STATUS_GOOD;
|
||||
|
@ -331,7 +332,7 @@ usb_low_stop_cmt_table (ma1017 * chip)
|
|||
"%lu bytes\n", (unsigned long int) n);
|
||||
return SANE_STATUS_IO_ERROR;
|
||||
}
|
||||
|
||||
chip->total_write_urbs++;
|
||||
n = 1;
|
||||
status = sanei_usb_read_bulk (chip->fd, &read_byte, &n);
|
||||
if (status != SANE_STATUS_GOOD || n != 1)
|
||||
|
@ -340,6 +341,7 @@ usb_low_stop_cmt_table (ma1017 * chip)
|
|||
"bytes\n", (unsigned long int) n);
|
||||
return SANE_STATUS_IO_ERROR;
|
||||
}
|
||||
chip->total_read_urbs++;
|
||||
chip->is_rowing = SANE_FALSE;
|
||||
|
||||
DBG (7, "usb_low_stop_cmt_table: exit\n");
|
||||
|
@ -2601,6 +2603,7 @@ usb_low_wait_rowing (ma1017 * chip)
|
|||
sane_strstatus (status));
|
||||
return SANE_STATUS_IO_ERROR;
|
||||
}
|
||||
chip->total_read_urbs++;
|
||||
chip->is_rowing = SANE_FALSE;
|
||||
DBG (7, "usb_low_wait_rowing: exit\n");
|
||||
return SANE_STATUS_GOOD;
|
||||
|
@ -2638,6 +2641,9 @@ usb_low_read_rows (ma1017 * chip, SANE_Byte * data, SANE_Word byte_count)
|
|||
sane_strstatus (status));
|
||||
return status;
|
||||
}
|
||||
/* Count the number of URBs. This is a bit tricky, as we are reading
|
||||
bigger chunks here but the scanner can only handle 64 bytes at once. */
|
||||
chip->total_read_urbs += ((n + 63) / 64);
|
||||
bytes_total += n;
|
||||
if ((SANE_Word) bytes_total != byte_count)
|
||||
{
|
||||
|
@ -2688,6 +2694,7 @@ usb_low_write_reg (ma1017 * chip, SANE_Byte reg_no, SANE_Byte data)
|
|||
sane_strstatus (status));
|
||||
return SANE_STATUS_IO_ERROR;
|
||||
}
|
||||
chip->total_write_urbs++;
|
||||
DBG (7, "usb_low_write_reg: reg: 0x%02x, value: 0x%02x\n", reg_no, data);
|
||||
return SANE_STATUS_GOOD;
|
||||
}
|
||||
|
@ -2719,6 +2726,8 @@ usb_low_read_reg (ma1017 * chip, SANE_Byte reg_no, SANE_Byte * data)
|
|||
return SANE_STATUS_INVAL;
|
||||
}
|
||||
n = 2;
|
||||
DBG (5, "usb_low_read_reg: trying to write %lu bytes\n", (unsigned long int) n);
|
||||
|
||||
status = sanei_usb_write_bulk (chip->fd, data_field, &n);
|
||||
if (status != SANE_STATUS_GOOD || n != 2)
|
||||
{
|
||||
|
@ -2727,7 +2736,9 @@ usb_low_read_reg (ma1017 * chip, SANE_Byte reg_no, SANE_Byte * data)
|
|||
sane_strstatus (status));
|
||||
return SANE_STATUS_IO_ERROR;
|
||||
}
|
||||
chip->total_write_urbs++;
|
||||
n = 1;
|
||||
DBG (5, "usb_low_read_reg: trying to read %lu bytes\n", (unsigned long int) n);
|
||||
status = sanei_usb_read_bulk (chip->fd, (SANE_Byte *) & read_byte, &n);
|
||||
if (status != SANE_STATUS_GOOD || n != 1)
|
||||
{
|
||||
|
@ -2736,6 +2747,7 @@ usb_low_read_reg (ma1017 * chip, SANE_Byte reg_no, SANE_Byte * data)
|
|||
(unsigned long int) n, sane_strstatus (status));
|
||||
return SANE_STATUS_IO_ERROR;
|
||||
}
|
||||
chip->total_read_urbs++;
|
||||
if (data)
|
||||
*data = read_byte;
|
||||
DBG (7, "usb_low_read_reg: Reg: 0x%02x, Value: 0x%02x\n",
|
||||
|
@ -2879,8 +2891,18 @@ usb_low_close (ma1017 * chip)
|
|||
|
||||
if (chip->fd >= 0)
|
||||
{
|
||||
SANE_Byte dummy;
|
||||
|
||||
if (chip->is_rowing)
|
||||
usb_low_stop_rowing (chip);
|
||||
/* Now make sure that both the number of written and
|
||||
read URBs is even. Use some dummy writes/reads. That's to avoid
|
||||
a nasty bug in the MA 1017 chipset that causes timeouts when
|
||||
the number of URBs is odd (toggle bug). */
|
||||
if ((chip->total_read_urbs % 2) == 1)
|
||||
usb_low_get_a4 (chip, &dummy);
|
||||
if ((chip->total_write_urbs % 2) == 1)
|
||||
usb_low_set_fix_pattern (chip, SANE_FALSE);
|
||||
sanei_usb_close (chip->fd);
|
||||
chip->fd = -1;
|
||||
}
|
||||
|
|
|
@ -188,6 +188,9 @@ typedef struct ma1017
|
|||
Motor_Type motor;
|
||||
Mustek_Type scanner_type;
|
||||
SANE_Word max_block_size;
|
||||
|
||||
SANE_Word total_read_urbs;
|
||||
SANE_Word total_write_urbs;
|
||||
}
|
||||
ma1017;
|
||||
|
||||
|
|
|
@ -1,5 +1,15 @@
|
|||
CHANGES for the SANE Mustek USB backend
|
||||
|
||||
2004-03-02
|
||||
* Release of version 1.0-18.
|
||||
|
||||
2004-03-02
|
||||
* Added workaround for data0 toggle bug. I think this is a bug in the
|
||||
chipset. The chipset doesn't set the toggle to data0 when the endpoints
|
||||
are reset. As this is done whenever the device files/libusb is closed,
|
||||
this backend worked ony once. Now we count the number of URBs and
|
||||
just read/write some crap if the number is odd.
|
||||
|
||||
2003-09-21
|
||||
* Release of version 1.0-17.
|
||||
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
2002-11-21
|
||||
2004-03-02
|
||||
|
||||
* Support more scanners
|
||||
- 1200 USB (work in progress)
|
||||
- 1200 USB
|
||||
- 600 USB
|
||||
These are both CCD scanners. Several people tried to add support until
|
||||
now but I have never heard from the again ...
|
||||
* Remove/replace _word variables from usb_low
|
||||
* Check if low resolutions can be made faster.
|
||||
* Check fixmes.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.TH sane-mustek_usb 5 "21 Oct 2003" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
|
||||
.TH sane-mustek_usb 5 "3 Mar 2004" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
|
||||
.IX sane-mustek_usb
|
||||
.SH NAME
|
||||
sane-mustek_usb \- SANE backend for Mustek USB flatbed scanners
|
||||
|
@ -189,16 +189,13 @@ Tom Wang.
|
|||
|
||||
.SH BUGS
|
||||
These devices have a hardware bug: Once data is written to them, they can't be
|
||||
resetted (toggle = DATA0). That means, any operation that tries to reset the
|
||||
reset (toggle = DATA0). That means, any operation that tries to reset the
|
||||
device will result in running into timeouts.
|
||||
|
||||
That means that this backend will fail when it is loaded the second time in
|
||||
some configurations: E.g. using libusb, (Free|Open|Net)BSD or with Linux if
|
||||
you unload and reload the scanner module. The only choice is to replug the
|
||||
scanner in this case. The workaround for Linux is to use the scanner module
|
||||
(modprobe scanner) instead of libusb. See
|
||||
.BR sane-usb (5)
|
||||
for details.
|
||||
In earlier versions this backend failed when it is loaded the second time in
|
||||
some configurations. The only choice was to replug the scanner in this case. The
|
||||
backend uses a workaround for that bug now but it's only tested on
|
||||
Linux. Reports for other operating systems are appriciated.
|
||||
|
||||
.PP
|
||||
More detailed bug information is available at the Mustek backend homepage
|
||||
|
|
Ładowanie…
Reference in New Issue