kopia lustrzana https://gitlab.com/sane-project/backends
Added support for Relisys AVEC II S3 (VM3564) and Primax Jewel 4800 (VM356A). Patch from Gerard Klaver.
rodzic
ccba930ae3
commit
500d1b48cb
270
backend/teco2.c
270
backend/teco2.c
|
@ -43,12 +43,14 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
$Id$
|
$Id$
|
||||||
TECO scanner VM3575, VM6565, VM6575, VM6586
|
TECO scanner VM3575, VM6565, VM6575, VM6586, VM356A
|
||||||
|
Patch for VM356A Gerard Klaver v 2003/02/14
|
||||||
|
update 2003/03/19, traces, tests, Gerard Klaver, Michael Hoeller
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#define BUILD 3 /* 2002/08/28 */
|
#define BUILD 4 /* 2003/04/18 */
|
||||||
#define BACKEND_NAME teco2
|
#define BACKEND_NAME teco2
|
||||||
#define TECO2_CONFIG_FILE "teco2.conf"
|
#define TECO2_CONFIG_FILE "teco2.conf"
|
||||||
|
|
||||||
|
@ -153,12 +155,68 @@ static const SANE_Range threshold_range = {
|
||||||
/* Gamma range */
|
/* Gamma range */
|
||||||
static const SANE_Range gamma_range = {
|
static const SANE_Range gamma_range = {
|
||||||
0, /* minimum */
|
0, /* minimum */
|
||||||
255, /* maximum */
|
255, /* 255 maximum */
|
||||||
0 /* quantization */
|
0 /* quantization */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static const struct dpi_color_adjust vm3564_dpi_color_adjust[] = {
|
||||||
|
|
||||||
|
/*dpi, x, y, z, color sequence R G or B, 0 (-) or 1 (+) color skewing, lines skewing */
|
||||||
|
{25, 1, 0, 2, 0, 0},
|
||||||
|
{40, 1, 0, 2, 0, 0},
|
||||||
|
{50, 1, 0, 2, 0, 1},
|
||||||
|
{60, 1, 0, 2, 1, 0},
|
||||||
|
{72, 1, 2, 0, 0, 1},
|
||||||
|
{75, 1, 0, 2, 1, 1},
|
||||||
|
{100, 2, 1, 0, 0, 1},
|
||||||
|
{120, 1, 0, 2, 1, 1},
|
||||||
|
{150, 1, 0, 2, 1, 2},
|
||||||
|
{160, 1, 0, 2, 1, 1},
|
||||||
|
{175, 1, 0, 2, 1, 1},
|
||||||
|
{180, 1, 0, 2, 1, 1},
|
||||||
|
{200, 2, 1, 0, 0, 1},
|
||||||
|
{225, 1, 0, 2, 1, 2},
|
||||||
|
{300, 1, 0, 2, 1, 2},
|
||||||
|
/* must be the last entry */
|
||||||
|
{0, 0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Used for VM356A only */
|
||||||
|
|
||||||
|
static const struct dpi_color_adjust vm356a_dpi_color_adjust[] = {
|
||||||
|
/*dpi, x, y, z, color sequence R G or B, 0 (-) or 1 (+) color skewing, lines skewing */
|
||||||
|
{25, 1, 0, 2, 0, 0}, /* ok */
|
||||||
|
{50, 1, 0, 2, 0, 1},
|
||||||
|
{75, 1, 0, 2, 1, 1}, /* ok */
|
||||||
|
{150, 1, 0, 2, 1, 2}, /* ok */
|
||||||
|
{160, 1, 0, 2, 1, 2}, /* ok */
|
||||||
|
{225, 1, 0, 2, 1, 2}, /* ok */
|
||||||
|
{300, 1, 0, 2, 1, 2}, /* ok */
|
||||||
|
|
||||||
|
{305, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
||||||
|
{310, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
||||||
|
{315, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
||||||
|
{375, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
||||||
|
{380, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
||||||
|
{385, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
||||||
|
{450, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
||||||
|
{455, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
||||||
|
{525, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
||||||
|
{600, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
||||||
|
|
||||||
|
/* text Michael Hoeller */
|
||||||
|
/* all increments by 5 from 20 to 600 are checked */
|
||||||
|
/* with 85, 165, 155 good picture but not colur setup works */
|
||||||
|
/* with 65, 200 and 320 crashs the driver */
|
||||||
|
|
||||||
|
/* {0, 1, 0, 2, 1, 1} general setup NOK for all dpi values */
|
||||||
|
/* 150, 225 and 300 should be OK*/
|
||||||
|
|
||||||
|
/* must be the last entry */
|
||||||
|
{0, 0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
/* Used for the VM3575 only */
|
/* Used for the VM3575 only */
|
||||||
|
|
||||||
static const struct dpi_color_adjust vm3575_dpi_color_adjust[] = {
|
static const struct dpi_color_adjust vm3575_dpi_color_adjust[] = {
|
||||||
|
@ -224,6 +282,25 @@ static const struct dpi_color_adjust default_dpi_color_adjust[1] = {
|
||||||
|
|
||||||
/* Define the supported scanners and their characteristics. */
|
/* Define the supported scanners and their characteristics. */
|
||||||
static const struct scanners_supported scanners[] = {
|
static const struct scanners_supported scanners[] = {
|
||||||
|
|
||||||
|
{6, "TECO VM3564",
|
||||||
|
TECO_VM3564,
|
||||||
|
"Relisys", "AVEC II S3",
|
||||||
|
{1, 600, 1}, /* resolution */
|
||||||
|
300, 600, /* max x and Y resolution */
|
||||||
|
2550, 12, /* calibration */
|
||||||
|
{SANE_FIX (0), SANE_FIX (8.5 * MM_PER_INCH), 0},
|
||||||
|
{SANE_FIX (0), SANE_FIX (11.7 * MM_PER_INCH), 0},
|
||||||
|
vm3564_dpi_color_adjust},
|
||||||
|
{6, "TECO VM356A",
|
||||||
|
TECO_VM356A,
|
||||||
|
"Relisys", "APOLLO Express 3",
|
||||||
|
{1, 600, 1}, /* resolution */
|
||||||
|
300, 600, /* max x and Y resolution */
|
||||||
|
2550, 12, /* calibration */
|
||||||
|
{SANE_FIX (0), SANE_FIX (8.5 * MM_PER_INCH), 0},
|
||||||
|
{SANE_FIX (0), SANE_FIX (11.7 * MM_PER_INCH), 0},
|
||||||
|
vm356a_dpi_color_adjust},
|
||||||
{6, "TECO VM3575",
|
{6, "TECO VM3575",
|
||||||
TECO_VM3575,
|
TECO_VM3575,
|
||||||
"Relisys", "SCORPIO Super 3",
|
"Relisys", "SCORPIO Super 3",
|
||||||
|
@ -493,6 +570,32 @@ teco_identify_scanner (Teco_Scanner * dev)
|
||||||
#endif
|
#endif
|
||||||
#ifdef sim
|
#ifdef sim
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
|
/* vm3564 */
|
||||||
|
unsigned char table[] = {
|
||||||
|
0x06, 0x00, 0x02, 0x02, 0x43, 0x00, 0x00, 0x10, 0x52, 0x45,
|
||||||
|
0x4c, 0x49, 0x53, 0x59, 0x53, 0x20, 0x41, 0x56, 0x45, 0x43,
|
||||||
|
0x20, 0x49, 0x49, 0x20, 0x53, 0x33, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x31, 0x2e, 0x30, 0x37, 0x31, 0x2e, 0x30, 0x37,
|
||||||
|
0x00, 0x01, 0x54, 0x45, 0x43, 0x4f, 0x20, 0x56, 0x4d, 0x33,
|
||||||
|
0x35, 0x36, 0x34, 0x20, 0x00, 0x01, 0x01, 0x2c, 0x00, 0x01,
|
||||||
|
0x02, 0x58, 0x09, 0xf6, 0x0d, 0xaf, 0x01, 0x2c, 0x00, 0x08,
|
||||||
|
0x01, 0x00
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
#if 0
|
||||||
|
/* vm356A */
|
||||||
|
unsigned char table[] = {
|
||||||
|
0x06, 0x00, 0x02, 0x02, 0x43, 0x00, 0x00, 0x10, 0x50, 0x72,
|
||||||
|
0x69, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x4a, 0x65, 0x77, 0x65,
|
||||||
|
0x6c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x31, 0x2e, 0x30, 0x30, 0x31, 0x2e, 0x30, 0x30,
|
||||||
|
0x00, 0x01, 0x54, 0x45, 0x43, 0x4f, 0x20, 0x56, 0x4d, 0x33,
|
||||||
|
0x35, 0x36, 0x41, 0x20, 0x00, 0x01, 0x01, 0x2c, 0x00, 0x01,
|
||||||
|
0x02, 0x58, 0x09, 0xf6, 0x0d, 0xaf, 0x01, 0x2c, 0x00, 0x08,
|
||||||
|
0x10, 0x00
|
||||||
|
};
|
||||||
|
#endif
|
||||||
#if 0
|
#if 0
|
||||||
/* vm3575 */
|
/* vm3575 */
|
||||||
unsigned char table[] = {
|
unsigned char table[] = {
|
||||||
|
@ -553,13 +656,13 @@ teco_identify_scanner (Teco_Scanner * dev)
|
||||||
hexdump (DBG_info2, "inquiry", dev->buffer, size);
|
hexdump (DBG_info2, "inquiry", dev->buffer, size);
|
||||||
|
|
||||||
dev->scsi_type = dev->buffer[0] & 0x1f;
|
dev->scsi_type = dev->buffer[0] & 0x1f;
|
||||||
strncpy (dev->scsi_vendor, dev->buffer + 0x08, 0x08);
|
memcpy (dev->scsi_vendor, dev->buffer + 0x08, 0x08);
|
||||||
dev->scsi_vendor[0x08] = 0;
|
dev->scsi_vendor[0x08] = 0;
|
||||||
strncpy (dev->scsi_product, dev->buffer + 0x10, 0x010);
|
memcpy (dev->scsi_product, dev->buffer + 0x10, 0x010);
|
||||||
dev->scsi_product[0x10] = 0;
|
dev->scsi_product[0x10] = 0;
|
||||||
strncpy (dev->scsi_version, dev->buffer + 0x20, 0x04);
|
memcpy (dev->scsi_version, dev->buffer + 0x20, 0x04);
|
||||||
dev->scsi_version[0x04] = 0;
|
dev->scsi_version[0x04] = 0;
|
||||||
strncpy (dev->scsi_teco_name, dev->buffer + 0x2A, 0x0B);
|
memcpy (dev->scsi_teco_name, dev->buffer + 0x2A, 0x0B);
|
||||||
dev->scsi_teco_name[0x0B] = 0;
|
dev->scsi_teco_name[0x0B] = 0;
|
||||||
|
|
||||||
DBG (DBG_info, "device is \"%s\" \"%s\" \"%s\" \"%s\"\n",
|
DBG (DBG_info, "device is \"%s\" \"%s\" \"%s\" \"%s\"\n",
|
||||||
|
@ -607,6 +710,8 @@ teco_set_window (Teco_Scanner * dev)
|
||||||
case TECO_VM3575:
|
case TECO_VM3575:
|
||||||
size = 53;
|
size = 53;
|
||||||
break;
|
break;
|
||||||
|
case TECO_VM3564:
|
||||||
|
case TECO_VM356A:
|
||||||
case TECO_VM656A:
|
case TECO_VM656A:
|
||||||
case TECO_VM6575:
|
case TECO_VM6575:
|
||||||
case TECO_VM6586:
|
case TECO_VM6586:
|
||||||
|
@ -878,12 +983,27 @@ teco_wait_for_data (Teco_Scanner * dev)
|
||||||
|
|
||||||
hexdump (DBG_info2, "teco_wait_for_data return", dev->buffer, size);
|
hexdump (DBG_info2, "teco_wait_for_data return", dev->buffer, size);
|
||||||
|
|
||||||
|
switch (dev->def->tecoref)
|
||||||
|
{
|
||||||
|
case TECO_VM3564:
|
||||||
|
case TECO_VM356A:
|
||||||
|
if (dev->buffer[11] > 0x01)
|
||||||
|
{
|
||||||
|
return SANE_STATUS_GOOD;
|
||||||
|
}
|
||||||
|
|
||||||
|
sleep (1);
|
||||||
|
break;
|
||||||
|
/* For VM3575, VM6575, VM656A, VM6586 until otherwise default value is used */
|
||||||
|
default:
|
||||||
if (dev->buffer[11] == 0x80)
|
if (dev->buffer[11] == 0x80)
|
||||||
{
|
{
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
sleep (1);
|
sleep (1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DBG (DBG_proc, "teco_wait_for_data: scanner not ready to send data (%d)\n",
|
DBG (DBG_proc, "teco_wait_for_data: scanner not ready to send data (%d)\n",
|
||||||
|
@ -909,9 +1029,29 @@ teco_do_calibration (Teco_Scanner * dev)
|
||||||
size_t size;
|
size_t size;
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
|
int colbyte;
|
||||||
|
int colsub;
|
||||||
int *tmp_buf; /* hold the temporary calibration */
|
int *tmp_buf; /* hold the temporary calibration */
|
||||||
size_t tmp_buf_size;
|
size_t tmp_buf_size;
|
||||||
|
|
||||||
|
switch (dev->def->tecoref)
|
||||||
|
{
|
||||||
|
case TECO_VM3564:
|
||||||
|
case TECO_VM356A:
|
||||||
|
colbyte = 3;
|
||||||
|
colsub = 0x110;
|
||||||
|
break;
|
||||||
|
case TECO_VM3575:
|
||||||
|
colbyte = 6;
|
||||||
|
colsub = 0x1100;
|
||||||
|
break;
|
||||||
|
/* For VM6575, 656A, 6586 until otherwise default value is used */
|
||||||
|
default:
|
||||||
|
colbyte = 6;
|
||||||
|
colsub = 0x1000;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
DBG (DBG_proc, "teco_do_calibration: enter\n");
|
DBG (DBG_proc, "teco_do_calibration: enter\n");
|
||||||
|
|
||||||
tmp_buf_size = dev->def->cal_length * 3 * sizeof (int);
|
tmp_buf_size = dev->def->cal_length * 3 * sizeof (int);
|
||||||
|
@ -944,7 +1084,8 @@ teco_do_calibration (Teco_Scanner * dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Length of the scanner * 6 bytes */
|
/* Length of the scanner * 6 bytes */
|
||||||
size = dev->def->cal_length * 6;
|
/* size = dev->def->cal_length * 6; */
|
||||||
|
size = dev->def->cal_length * colbyte;
|
||||||
cdb.data[3] = (size >> 8) & 0xff;
|
cdb.data[3] = (size >> 8) & 0xff;
|
||||||
cdb.data[4] = (size >> 0) & 0xff;
|
cdb.data[4] = (size >> 0) & 0xff;
|
||||||
|
|
||||||
|
@ -975,12 +1116,26 @@ teco_do_calibration (Teco_Scanner * dev)
|
||||||
|
|
||||||
for (j = 0; j < dev->def->cal_length; j++)
|
for (j = 0; j < dev->def->cal_length; j++)
|
||||||
{
|
{
|
||||||
|
switch (dev->def->tecoref)
|
||||||
|
{
|
||||||
|
case TECO_VM3575:
|
||||||
|
case TECO_VM6575:
|
||||||
|
case TECO_VM656A:
|
||||||
|
case TECO_VM6586:
|
||||||
tmp_buf[3 * j + 0] +=
|
tmp_buf[3 * j + 0] +=
|
||||||
(dev->buffer[6 * j + 1] << 8) + dev->buffer[6 * j + 0];
|
(dev->buffer[6 * j + 1] << 8) + dev->buffer[6 * j + 0];
|
||||||
tmp_buf[3 * j + 1] +=
|
tmp_buf[3 * j + 1] +=
|
||||||
(dev->buffer[6 * j + 3] << 8) + dev->buffer[6 * j + 2];
|
(dev->buffer[6 * j + 3] << 8) + dev->buffer[6 * j + 2];
|
||||||
tmp_buf[3 * j + 2] +=
|
tmp_buf[3 * j + 2] +=
|
||||||
(dev->buffer[6 * j + 5] << 8) + dev->buffer[6 * j + 4];
|
(dev->buffer[6 * j + 5] << 8) + dev->buffer[6 * j + 4];
|
||||||
|
break;
|
||||||
|
case TECO_VM3564:
|
||||||
|
case TECO_VM356A:
|
||||||
|
tmp_buf[3 * j + 0] += dev->buffer[3 * j + 0];
|
||||||
|
tmp_buf[3 * j + 1] += dev->buffer[3 * j + 1];
|
||||||
|
tmp_buf[3 * j + 2] += dev->buffer[3 * j + 2];
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -991,7 +1146,11 @@ teco_do_calibration (Teco_Scanner * dev)
|
||||||
* white values read. */
|
* white values read. */
|
||||||
for (j = 0; j < (3 * dev->def->cal_length); j++)
|
for (j = 0; j < (3 * dev->def->cal_length); j++)
|
||||||
{
|
{
|
||||||
tmp_buf[j] = 0x1000 - (tmp_buf[j] / dev->def->cal_lines);
|
|
||||||
|
tmp_buf[j] = colsub - (tmp_buf[j] / dev->def->cal_lines);
|
||||||
|
|
||||||
|
/* tmp_buf[j] = ( 4206639 * dev->def->cal_lines )/tmp_buf[j]; */
|
||||||
|
/* tmp_buf[j] = ( 14000 * dev->def->cal_lines )/tmp_buf[j]; */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*hexdump (DBG_info2, "calibration after average:", tmp_buf, tmp_buf_size); */
|
/*hexdump (DBG_info2, "calibration after average:", tmp_buf, tmp_buf_size); */
|
||||||
|
@ -999,6 +1158,13 @@ teco_do_calibration (Teco_Scanner * dev)
|
||||||
/* Build the calibration line to send. */
|
/* Build the calibration line to send. */
|
||||||
for (j = 0; j < dev->def->cal_length; j++)
|
for (j = 0; j < dev->def->cal_length; j++)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
switch (dev->def->tecoref)
|
||||||
|
{
|
||||||
|
case TECO_VM3575:
|
||||||
|
case TECO_VM6575:
|
||||||
|
case TECO_VM656A:
|
||||||
|
case TECO_VM6586:
|
||||||
dev->buffer[6 * j + 0] =
|
dev->buffer[6 * j + 0] =
|
||||||
(tmp_buf[0 * dev->def->cal_length + j] >> 0) & 0xff;
|
(tmp_buf[0 * dev->def->cal_length + j] >> 0) & 0xff;
|
||||||
dev->buffer[6 * j + 1] =
|
dev->buffer[6 * j + 1] =
|
||||||
|
@ -1013,6 +1179,16 @@ teco_do_calibration (Teco_Scanner * dev)
|
||||||
(tmp_buf[2 * dev->def->cal_length + j] >> 0) & 0xff;
|
(tmp_buf[2 * dev->def->cal_length + j] >> 0) & 0xff;
|
||||||
dev->buffer[6 * j + 5] =
|
dev->buffer[6 * j + 5] =
|
||||||
(tmp_buf[2 * dev->def->cal_length + j] >> 8) & 0xff;
|
(tmp_buf[2 * dev->def->cal_length + j] >> 8) & 0xff;
|
||||||
|
break;
|
||||||
|
case TECO_VM3564:
|
||||||
|
case TECO_VM356A:
|
||||||
|
dev->buffer[3 * j + 0] = (tmp_buf[3 * j + 0] >> 0) & 0xff;
|
||||||
|
|
||||||
|
dev->buffer[3 * j + 1] = (tmp_buf[3 * j + 1] >> 0) & 0xff;
|
||||||
|
|
||||||
|
dev->buffer[3 * j + 2] = (tmp_buf[3 * j + 2] >> 0) & 0xff;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free (tmp_buf);
|
free (tmp_buf);
|
||||||
|
@ -1022,7 +1198,7 @@ teco_do_calibration (Teco_Scanner * dev)
|
||||||
* one, except for the command. */
|
* one, except for the command. */
|
||||||
|
|
||||||
cdb.data[0] = 0x0E;
|
cdb.data[0] = 0x0E;
|
||||||
size = dev->def->cal_length * 6;
|
size = dev->def->cal_length * colbyte;
|
||||||
|
|
||||||
hexdump (DBG_info2, "CDB:", cdb.data, cdb.len);
|
hexdump (DBG_info2, "CDB:", cdb.data, cdb.len);
|
||||||
/*hexdump (DBG_info2, "calibration line sent:", dev->buffer, size); */
|
/*hexdump (DBG_info2, "calibration line sent:", dev->buffer, size); */
|
||||||
|
@ -1041,6 +1217,30 @@ teco_do_calibration (Teco_Scanner * dev)
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*------------request sense command 03----------------*/
|
||||||
|
static SANE_Status
|
||||||
|
teco_request_sense (Teco_Scanner * dev)
|
||||||
|
{
|
||||||
|
CDB cdb;
|
||||||
|
SANE_Status status;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
|
||||||
|
MKSCSI_REQUEST_SENSE (cdb, size);
|
||||||
|
size = cdb.data[5];
|
||||||
|
|
||||||
|
hexdump (DBG_info2, "teco_request_sense: enter\n", cdb.data, cdb.len);
|
||||||
|
|
||||||
|
status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
|
||||||
|
NULL, 0, dev->buffer, &size);
|
||||||
|
|
||||||
|
DBG (DBG_proc, "teco_request_sense: exit, status=%d\n", status);
|
||||||
|
|
||||||
|
return (status);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------*/
|
||||||
|
|
||||||
/* Send the gamma */
|
/* Send the gamma */
|
||||||
static SANE_Status
|
static SANE_Status
|
||||||
teco_send_gamma (Teco_Scanner * dev)
|
teco_send_gamma (Teco_Scanner * dev)
|
||||||
|
@ -1099,9 +1299,16 @@ teco_send_gamma (Teco_Scanner * dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
hexdump (DBG_info2, "CDB:", cdb.data, cdb.len);
|
hexdump (DBG_info2, "CDB:", cdb.data, cdb.len);
|
||||||
|
switch (dev->def->tecoref)
|
||||||
|
{
|
||||||
|
case TECO_VM3564:
|
||||||
|
case TECO_VM356A:
|
||||||
|
status = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
|
status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
|
||||||
¶m, size, NULL, NULL);
|
¶m, size, NULL, NULL);
|
||||||
|
}
|
||||||
DBG (DBG_proc, "teco_send_gamma: exit, status=%d\n", status);
|
DBG (DBG_proc, "teco_send_gamma: exit, status=%d\n", status);
|
||||||
|
|
||||||
return (status);
|
return (status);
|
||||||
|
@ -2260,7 +2467,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
dev->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE;
|
dev->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE;
|
||||||
|
|
||||||
/* This the default resolution range, except for the
|
/* This the default resolution range, except for the
|
||||||
* VM3575 and VM6586 in color mode. */
|
* VM3575, VM3564, VM356A and VM6586 in color mode. */
|
||||||
dev->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_RANGE;
|
dev->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_RANGE;
|
||||||
dev->opt[OPT_RESOLUTION].constraint.range = &dev->def->res_range;
|
dev->opt[OPT_RESOLUTION].constraint.range = &dev->def->res_range;
|
||||||
|
|
||||||
|
@ -2295,7 +2502,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
dev->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
|
dev->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The VM3575 and VM6586 supports only a handful of resolution. Do that here.
|
/* The VM3575, VM3564, VM356A and VM6586 supports only a handful of resolution. Do that here.
|
||||||
* Ugly! */
|
* Ugly! */
|
||||||
if (dev->resolutions_list != NULL)
|
if (dev->resolutions_list != NULL)
|
||||||
{
|
{
|
||||||
|
@ -2392,8 +2599,20 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
|
||||||
* in the SET WINDOWS command. */
|
* in the SET WINDOWS command. */
|
||||||
if (dev->val[OPT_PREVIEW].w == SANE_TRUE)
|
if (dev->val[OPT_PREVIEW].w == SANE_TRUE)
|
||||||
{
|
{
|
||||||
|
/* for VM356A, no good 50 dpi scan possible */
|
||||||
|
|
||||||
|
switch (dev->def->tecoref)
|
||||||
|
{
|
||||||
|
case TECO_VM356A:
|
||||||
|
dev->x_resolution = 75;
|
||||||
|
dev->y_resolution = 75;
|
||||||
|
break;
|
||||||
|
/* For VM3575, VM6575, VM656A, VM6586 etc until otherwise default value is used */
|
||||||
|
default:
|
||||||
dev->x_resolution = 50;
|
dev->x_resolution = 50;
|
||||||
dev->y_resolution = 50;
|
dev->y_resolution = 50;
|
||||||
|
break;
|
||||||
|
}
|
||||||
dev->x_tl = 0;
|
dev->x_tl = 0;
|
||||||
dev->y_tl = 0;
|
dev->y_tl = 0;
|
||||||
dev->x_br = mmToIlu (SANE_UNFIX (dev->def->x_range.max));
|
dev->x_br = mmToIlu (SANE_UNFIX (dev->def->x_range.max));
|
||||||
|
@ -2594,6 +2813,22 @@ sane_start (SANE_Handle handle)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
switch (dev->def->tecoref)
|
||||||
|
{
|
||||||
|
case TECO_VM3564:
|
||||||
|
case TECO_VM356A:
|
||||||
|
/*--------------request sense for first time loop---*/
|
||||||
|
status = teco_request_sense (dev);
|
||||||
|
if (status)
|
||||||
|
{
|
||||||
|
teco_close (dev);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
status = teco_send_gamma (dev);
|
status = teco_send_gamma (dev);
|
||||||
if (status)
|
if (status)
|
||||||
{
|
{
|
||||||
|
@ -2607,14 +2842,19 @@ sane_start (SANE_Handle handle)
|
||||||
teco_close (dev);
|
teco_close (dev);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
switch (dev->def->tecoref)
|
||||||
|
{
|
||||||
|
case TECO_VM3564:
|
||||||
|
case TECO_VM356A:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
status = teco_send_vendor_06 (dev);
|
status = teco_send_vendor_06 (dev);
|
||||||
if (status)
|
if (status)
|
||||||
{
|
{
|
||||||
teco_close (dev);
|
teco_close (dev);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
status = teco_scan (dev);
|
status = teco_scan (dev);
|
||||||
if (status)
|
if (status)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,3 +1,12 @@
|
||||||
|
# VM3564 RELISYS AVEC II S3 scanner
|
||||||
|
scsi "RELISYS" "AVEC II S3" Scanner
|
||||||
|
|
||||||
|
# VM356A Primax Jewel 4800 scanner
|
||||||
|
scsi "Primax Jewel" "VM356A" Scanner
|
||||||
|
|
||||||
|
# VM356A RELISYS APOLLO Express 3
|
||||||
|
scsi "RELISYS" "APOLLO Express 3"
|
||||||
|
|
||||||
# VM3575 Relisys SCORPIO Super 3
|
# VM3575 Relisys SCORPIO Super 3
|
||||||
# VM6586 Relisys SCORPIO Pro-S
|
# VM6586 Relisys SCORPIO Pro-S
|
||||||
scsi "" "Flatbed Scanner" Scanner
|
scsi "" "Flatbed Scanner" Scanner
|
||||||
|
|
|
@ -322,6 +322,8 @@ struct scanners_supported
|
||||||
char scsi_teco_name[12]; /* real name of the scanner */
|
char scsi_teco_name[12]; /* real name of the scanner */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
TECO_VM3564,
|
||||||
|
TECO_VM356A,
|
||||||
TECO_VM3575,
|
TECO_VM3575,
|
||||||
TECO_VM6575,
|
TECO_VM6575,
|
||||||
TECO_VM656A,
|
TECO_VM656A,
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
;
|
;
|
||||||
|
|
||||||
:backend "teco2" ; name of backend
|
:backend "teco2" ; name of backend
|
||||||
:version "1.0-3" ; version of backend
|
:version "1.0-4" ; version of backend
|
||||||
:status :beta ; :alpha, :beta, :stable
|
:status :beta ; :alpha, :beta, :stable
|
||||||
:manpage "sane-teco2"
|
:manpage "sane-teco2"
|
||||||
:url "http://fz.eryx.net/sane/#teco2" ; backend's web page
|
:url "http://fz.eryx.net/sane/#teco2" ; backend's web page
|
||||||
|
@ -25,11 +25,21 @@
|
||||||
:comment "sub model VM3575"
|
:comment "sub model VM3575"
|
||||||
:status :untested
|
:status :untested
|
||||||
|
|
||||||
|
:model "AVEC II S3"
|
||||||
|
:interface "SCSI"
|
||||||
|
:comment :sub model VM3564"
|
||||||
|
:status :alpha
|
||||||
|
|
||||||
:model "SCORPIO Super 3"
|
:model "SCORPIO Super 3"
|
||||||
:comment "sub model VM3575"
|
:comment "sub model VM3575"
|
||||||
:interface "SCSI"
|
:interface "SCSI"
|
||||||
:status :alpha
|
:status :alpha
|
||||||
|
|
||||||
|
:model "APOLLO Express 3"
|
||||||
|
:comment "sub model VM356A"
|
||||||
|
:interface "SCSI"
|
||||||
|
:status :alpha
|
||||||
|
|
||||||
:model "APOLLO Express 6"
|
:model "APOLLO Express 6"
|
||||||
:comment "sub model VM6565" ; aka VM656A
|
:comment "sub model VM6565" ; aka VM656A
|
||||||
:interface "SCSI"
|
:interface "SCSI"
|
||||||
|
|
|
@ -8,7 +8,7 @@ The
|
||||||
library implements a SANE (Scanner Access Now Easy) backend that
|
library implements a SANE (Scanner Access Now Easy) backend that
|
||||||
provides access to some TECO SCSI flatbed scanners. This backend
|
provides access to some TECO SCSI flatbed scanners. This backend
|
||||||
should be considered
|
should be considered
|
||||||
.B alpha-quality
|
.B beta-quality
|
||||||
software! TECO scanners are sold under
|
software! TECO scanners are sold under
|
||||||
various brands like Relisys, Piotech, TRUST. This backend may or
|
various brands like Relisys, Piotech, TRUST. This backend may or
|
||||||
may not support yours.
|
may not support yours.
|
||||||
|
@ -20,12 +20,26 @@ The scanners that should work with this backend are:
|
||||||
.br
|
.br
|
||||||
---------------------- -------------- -----------
|
---------------------- -------------- -----------
|
||||||
.br
|
.br
|
||||||
Relisys Scorpio Super 3 VM3575 tested
|
|
||||||
Apollo Express 6 VM656A tested
|
Primax Jewel 4800 VM356A tested
|
||||||
Scorpio Pro-S VM6586 tested
|
Primax Profi 19200 VM6586 tested
|
||||||
|
Primax Profi 9600 VM6575 tested
|
||||||
|
Relisys APOLLO Express 12 ? untested
|
||||||
|
Relisys APOLLO Express 3 VM356A tested
|
||||||
|
Relisys APOLLO Express 6 VM6565 tested
|
||||||
|
Relisys AVEC II S3 VM3564 tested
|
||||||
|
Relisys AVEC Super 3 VM3575 tested
|
||||||
|
Relisys SCORPIO Pro VM6575 tested
|
||||||
|
Relisys SCORPIO Pro-S VM6586 tested
|
||||||
|
Relisys SCORPIO Super 3 VM3575 tested
|
||||||
|
|
||||||
.RE
|
.RE
|
||||||
|
|
||||||
|
For all these scanners, black&white and grayscale mode work
|
||||||
|
well. However, most of them do not support more than a handful of
|
||||||
|
resolutions in color mode. See the backend home page (under AUTHOR)
|
||||||
|
for the exact status of each scanner.
|
||||||
|
|
||||||
Note that the untested scanner will not be directly supported. You
|
Note that the untested scanner will not be directly supported. You
|
||||||
should contact the author for that.
|
should contact the author for that.
|
||||||
|
|
||||||
|
@ -109,7 +123,8 @@ selected. The default is "no".
|
||||||
|
|
||||||
|
|
||||||
.SH CONFIGURATION FILE
|
.SH CONFIGURATION FILE
|
||||||
The configuration file @CONFIGDIR@/teco2.conf supports only one information: the device name to use (eg /dev/scanner).
|
The configuration file @CONFIGDIR@/teco2.conf supports only one
|
||||||
|
information: the device name to use (eg /dev/scanner).
|
||||||
|
|
||||||
|
|
||||||
.SH FILES
|
.SH FILES
|
||||||
|
@ -147,11 +162,13 @@ Plenty. Parts of this backend are still under development.
|
||||||
sane\-scsi(5), scanimage(1), xscanimage(1), xsane(1), sane(7)
|
sane\-scsi(5), scanimage(1), xscanimage(1), xsane(1), sane(7)
|
||||||
|
|
||||||
|
|
||||||
.SH AUTHOR
|
.SH AUTHORS
|
||||||
|
|
||||||
The package is actively maintained by Frank Zago.
|
The package is actively maintained by Frank Zago.
|
||||||
http://fz.eryx.net/sane/#teco2
|
http://fz.eryx.net/sane/#teco2
|
||||||
|
|
||||||
|
Gerard Klaver contributed a patch to support the VM3564 and VM356A.
|
||||||
|
|
||||||
.SH CREDITS
|
.SH CREDITS
|
||||||
|
|
||||||
Thanks to:
|
Thanks to:
|
||||||
|
|
Ładowanie…
Reference in New Issue