* backend/fujitsu.c, backend/fujitsu.h: renamed some variables

* backend/fujitsu.c: gray duplex scanning now works with the 4097D
	  when disconnect is enabled in the scsi-controller
	* doc/descriptions/unsupported.desc: remove fujitsu fi4120C
	* doc/descriptions/fujitsu.desc added fi4120C, ScanParter 93GX
merge-requests/1/head
Oliver Schirrmeister 2003-03-05 12:56:44 +00:00
rodzic a4b5a465fd
commit f9d7350534
5 zmienionych plików z 494 dodań i 451 usunięć

Wyświetl plik

@ -1,3 +1,10 @@
2003-03-05 Oliver Schirrmeister <oschirr@abm.de>
* backend/fujitsu.c, backend/fujitsu.h: renamed some variables
* backend/fujitsu.c: gray duplex scanning now works with the 4097D
when disconnect is enabled in the scsi-controller
* doc/descriptions/unsupported.desc: remove fujitsu fi4120C
* doc/descriptions/fujitsu.desc added fi4120C, ScanParter 93GX
2003-03-04 Henning Meier-Geinitz <henning@meier-geinitz.de> 2003-03-04 Henning Meier-Geinitz <henning@meier-geinitz.de>
* include/sane/sanei.h sanei/sanei_constrain_value.c: Added function * include/sane/sanei.h sanei/sanei_constrain_value.c: Added function
@ -158,15 +165,14 @@
HP scanners. HP scanners.
2003-02-20 Oliver Schirrmeister <oschirr@abm.de> 2003-02-20 Oliver Schirrmeister <oschirr@abm.de>
* make option RIF available for 3091 and 3092, bugfix * backend/fujitsu.c: make option RIF available for 3091 and 3092, bugfix
* set availability of options THRESHOLD und VARIANCE * backend/fujitsu.c: set availability of options THRESHOLD und VARIANCE
2003-02-20 Oliver Schirrmeister <oschirr@abm.de> 2003-02-20 Oliver Schirrmeister <oschirr@abm.de>
* patch from <ron@roncemer.com>: * backend/fujitsu.c, backend/fujitsu.h: patch from <ron@roncemer.com>:
fi4220 support fi4220 support
USB support for scanners which send SCSI commands over usb USB support for scanners which send SCSI commands over usb
2003-02-19 Henning Meier-Geinitz <henning@meier-geinitz.de> 2003-02-19 Henning Meier-Geinitz <henning@meier-geinitz.de>
* doc/descriptions-external/ma1509.desc: Added description of the * doc/descriptions-external/ma1509.desc: Added description of the

Wyświetl plik

@ -71,7 +71,7 @@
V 1.3, 08-Aug-2002, OS (oschirr@abm.de) V 1.3, 08-Aug-2002, OS (oschirr@abm.de)
- bugfix. Imprinter didn't print the first time after - bugfix. Imprinter didn't print the first time after
switching on the scanner switching on the scanner
- bugfix. readerGenericPassthrough ignored the number of bytes - bugfix. reader_generic_passthrough ignored the number of bytes
returned by the scanner. returned by the scanner.
V 1.4, 13-Sep-2002 V 1.4, 13-Sep-2002
- 3092 support (mgoppold@tbz-pariv.de) - 3092 support (mgoppold@tbz-pariv.de)
@ -85,6 +85,10 @@
- set availability of options THRESHOLD und VARIANCE - set availability of options THRESHOLD und VARIANCE
correctly correctly
- option RIF is available for 3091 und 3092 - option RIF is available for 3091 und 3092
V 1.6, 04-Mar-2003 (oschirr@abm.de)
- renamed some variables
- bugfix: duplex scanning now works when disconnect is enabled
in the scsi controller.
SANE FLOW DIAGRAM SANE FLOW DIAGRAM
@ -1949,7 +1953,7 @@ sane_start (SANE_Handle handle)
} else if (scanner->connection == SANE_FUJITSU_SCSI) { } else if (scanner->connection == SANE_FUJITSU_SCSI) {
DBG (10, "sane_start opening SCSI device\n"); DBG (10, "sane_start opening SCSI device\n");
if (sanei_scsi_open (scanner->sane.name, &(scanner->sfd), if (sanei_scsi_open (scanner->sane.name, &(scanner->sfd),
scsiSenseHandler, 0) != SANE_STATUS_GOOD) { scsi_sense_handler, 0) != SANE_STATUS_GOOD) {
DBG (MSG_ERR, DBG (MSG_ERR,
"sane_start: open of %s failed:\n", scanner->sane.name); "sane_start: open of %s failed:\n", scanner->sane.name);
return SANE_STATUS_INVAL; return SANE_STATUS_INVAL;
@ -1959,7 +1963,7 @@ sane_start (SANE_Handle handle)
scanner->object_count = 1; scanner->object_count = 1;
scanner->eof = SANE_FALSE; scanner->eof = SANE_FALSE;
if ((ret = grabScanner (scanner))) if ((ret = grab_scanner (scanner)))
{ {
DBG (5, "sane_start: unable to reserve scanner\n"); DBG (5, "sane_start: unable to reserve scanner\n");
if (scanner->connection == SANE_FUJITSU_USB) { if (scanner->connection == SANE_FUJITSU_USB) {
@ -1985,7 +1989,7 @@ sane_start (SANE_Handle handle)
if ((ret = fujitsu_send(scanner))) if ((ret = fujitsu_send(scanner)))
{ {
DBG (5, "sane_start: ERROR: failed to start send command\n"); DBG (5, "sane_start: ERROR: failed to start send command\n");
freeScanner (scanner); free_scanner (scanner);
if (scanner->connection == SANE_FUJITSU_USB) { if (scanner->connection == SANE_FUJITSU_USB) {
sanei_usb_close (scanner->sfd); sanei_usb_close (scanner->sfd);
} else if (scanner->connection == SANE_FUJITSU_SCSI) { } else if (scanner->connection == SANE_FUJITSU_SCSI) {
@ -1999,7 +2003,7 @@ sane_start (SANE_Handle handle)
if ((ret = imprinter(scanner))) if ((ret = imprinter(scanner)))
{ {
DBG (5, "sane_start: ERROR: failed to start imprinter command\n"); DBG (5, "sane_start: ERROR: failed to start imprinter command\n");
freeScanner (scanner); free_scanner (scanner);
if (scanner->connection == SANE_FUJITSU_USB) { if (scanner->connection == SANE_FUJITSU_USB) {
sanei_usb_close (scanner->sfd); sanei_usb_close (scanner->sfd);
} else if (scanner->connection == SANE_FUJITSU_SCSI) { } else if (scanner->connection == SANE_FUJITSU_SCSI) {
@ -2015,7 +2019,7 @@ sane_start (SANE_Handle handle)
(ret = object_position (scanner, SANE_TRUE))) (ret = object_position (scanner, SANE_TRUE)))
{ {
DBG (5, "sane_start: WARNING: ADF empty\n"); DBG (5, "sane_start: WARNING: ADF empty\n");
freeScanner (scanner); free_scanner (scanner);
if (scanner->connection == SANE_FUJITSU_USB) { if (scanner->connection == SANE_FUJITSU_USB) {
sanei_usb_close (scanner->sfd); sanei_usb_close (scanner->sfd);
} else if (scanner->connection == SANE_FUJITSU_SCSI) { } else if (scanner->connection == SANE_FUJITSU_SCSI) {
@ -2032,7 +2036,7 @@ sane_start (SANE_Handle handle)
if ((ret = setWindowParam (scanner))) if ((ret = setWindowParam (scanner)))
{ {
DBG (5, "sane_start: ERROR: failed to set window\n"); DBG (5, "sane_start: ERROR: failed to set window\n");
freeScanner (scanner); free_scanner (scanner);
if (scanner->connection == SANE_FUJITSU_USB) { if (scanner->connection == SANE_FUJITSU_USB) {
sanei_usb_close (scanner->sfd); sanei_usb_close (scanner->sfd);
} else if (scanner->connection == SANE_FUJITSU_SCSI) { } else if (scanner->connection == SANE_FUJITSU_SCSI) {
@ -2052,14 +2056,19 @@ sane_start (SANE_Handle handle)
DBG (10, "\tthreshold (line art) = %d\n", scanner->threshold); DBG (10, "\tthreshold (line art) = %d\n", scanner->threshold);
startScan (scanner); ret = start_scan (scanner);
if (ret != SANE_STATUS_GOOD)
{
DBG (MSG_ERR, "start_scan failed");
return ret;
}
/* create a pipe, fds[0]=read-fd, fds[1]=write-fd */ /* create a pipe, fds[0]=read-fd, fds[1]=write-fd */
if (pipe (defaultFds) < 0) if (pipe (defaultFds) < 0)
{ {
DBG (MSG_ERR, "ERROR: could not create pipe\n"); DBG (MSG_ERR, "ERROR: could not create pipe\n");
scanner->object_count = 0; scanner->object_count = 0;
freeScanner (scanner); free_scanner (scanner);
if (scanner->connection == SANE_FUJITSU_USB) { if (scanner->connection == SANE_FUJITSU_USB) {
sanei_usb_close (scanner->sfd); sanei_usb_close (scanner->sfd);
} else if (scanner->connection == SANE_FUJITSU_SCSI) { } else if (scanner->connection == SANE_FUJITSU_SCSI) {
@ -2078,7 +2087,7 @@ sane_start (SANE_Handle handle)
{ {
DBG (MSG_ERR, "ERROR: could not create temporary file.\n"); DBG (MSG_ERR, "ERROR: could not create temporary file.\n");
scanner->object_count = 0; scanner->object_count = 0;
freeScanner (scanner); free_scanner (scanner);
if (scanner->connection == SANE_FUJITSU_USB) { if (scanner->connection == SANE_FUJITSU_USB) {
sanei_usb_close (scanner->sfd); sanei_usb_close (scanner->sfd);
} else if (scanner->connection == SANE_FUJITSU_SCSI) { } else if (scanner->connection == SANE_FUJITSU_SCSI) {
@ -2094,7 +2103,7 @@ sane_start (SANE_Handle handle)
{ {
DBG (MSG_ERR, "ERROR: could not create duplex pipe.\n"); DBG (MSG_ERR, "ERROR: could not create duplex pipe.\n");
scanner->object_count = 0; scanner->object_count = 0;
freeScanner (scanner); free_scanner (scanner);
if (scanner->connection == SANE_FUJITSU_USB) { if (scanner->connection == SANE_FUJITSU_USB) {
sanei_usb_close (scanner->sfd); sanei_usb_close (scanner->sfd);
} else if (scanner->connection == SANE_FUJITSU_SCSI) { } else if (scanner->connection == SANE_FUJITSU_SCSI) {
@ -2427,7 +2436,7 @@ attachScanner (const char *devicename, struct fujitsu **devp)
} }
} else if (mostRecentConfigConnectionType == SANE_FUJITSU_SCSI) { } else if (mostRecentConfigConnectionType == SANE_FUJITSU_SCSI) {
DBG (15, "attachScanner opening SCSI device\n"); DBG (15, "attachScanner opening SCSI device\n");
if (sanei_scsi_open (devicename, &sfd, scsiSenseHandler, 0) != 0) { if (sanei_scsi_open (devicename, &sfd, scsi_sense_handler, 0) != 0) {
DBG (5, "attach_scanner: open failed\n"); DBG (5, "attach_scanner: open failed\n");
return SANE_STATUS_INVAL; return SANE_STATUS_INVAL;
} }
@ -2448,7 +2457,7 @@ attachScanner (const char *devicename, struct fujitsu **devp)
/* /*
* Now query the device and find out what it is, exactly. * Now query the device and find out what it is, exactly.
*/ */
if (identifyScanner (dev) != 0) if (identify_scanner (dev) != 0)
{ {
DBG (5, "attach_scanner: scanner identification failed\n"); DBG (5, "attach_scanner: scanner identification failed\n");
if (dev->connection == SANE_FUJITSU_USB) { if (dev->connection == SANE_FUJITSU_USB) {
@ -2504,7 +2513,7 @@ attachOne (const char *name)
* Responsible for producing a meaningful debug message. * Responsible for producing a meaningful debug message.
*/ */
static SANE_Status static SANE_Status
scsiSenseHandler (int scsi_fd, u_char * sensed_data, void *arg) scsi_sense_handler (int scsi_fd, u_char * sensed_data, void *arg)
{ {
unsigned int ret = SANE_STATUS_IO_ERROR; unsigned int ret = SANE_STATUS_IO_ERROR;
unsigned int sense = get_RS_sense_key (sensed_data); unsigned int sense = get_RS_sense_key (sensed_data);
@ -2728,7 +2737,7 @@ scsiSenseHandler (int scsi_fd, u_char * sensed_data, void *arg)
* struct buffer. * struct buffer.
*/ */
static void static void
doInquiry (struct fujitsu *s) do_inquiry (struct fujitsu *s)
{ {
DBG (10, "do_inquiry\n"); DBG (10, "do_inquiry\n");
@ -2764,7 +2773,7 @@ get_hardware_status (struct fujitsu *s)
} }
} else if (s->connection == SANE_FUJITSU_SCSI) { } else if (s->connection == SANE_FUJITSU_SCSI) {
DBG (10, "get_hardware_status opening SCSI device\n"); DBG (10, "get_hardware_status opening SCSI device\n");
if (sanei_scsi_open (s->devicename, &sfd, scsiSenseHandler, 0)!=0) { if (sanei_scsi_open (s->devicename, &sfd, scsi_sense_handler, 0)!=0) {
DBG (5, "get_hardware_status: open failed\n"); DBG (5, "get_hardware_status: open failed\n");
return SANE_STATUS_INVAL; return SANE_STATUS_INVAL;
} }
@ -3177,10 +3186,10 @@ makeTempFile ()
* GOOD * GOOD
*/ */
static int static int
freeScanner (struct fujitsu *s) free_scanner (struct fujitsu *s)
{ {
int ret; int ret;
DBG (10, "freeScanner\n"); DBG (10, "free_scanner\n");
#if 0 #if 0
ret = object_position (s, SANE_FALSE); ret = object_position (s, SANE_FALSE);
@ -3196,13 +3205,13 @@ freeScanner (struct fujitsu *s)
if (ret) if (ret)
return ret; return ret;
DBG (10, "freeScanner: ok\n"); DBG (10, "free_scanner: ok\n");
return ret; return ret;
} }
/** /**
* Reserves the scanner on the SCSI bus for our exclusive access until released * Reserves the scanner on the SCSI bus for our exclusive access until released
* by freeScanner. * by free_scanner.
* *
* Should go through the following command sequence: * Should go through the following command sequence:
* TEST UNIT READY * TEST UNIT READY
@ -3215,11 +3224,11 @@ freeScanner (struct fujitsu *s)
* GOOD * GOOD
*/ */
static int static int
grabScanner (struct fujitsu *s) grab_scanner (struct fujitsu *s)
{ {
int ret; int ret;
DBG (10, "grabScanner\n"); DBG (10, "grab_scanner\n");
wait_scanner (s); wait_scanner (s);
hexdump (MSG_IO, "reserve_unit", reserve_unitB.cmd, reserve_unitB.size); hexdump (MSG_IO, "reserve_unit", reserve_unitB.cmd, reserve_unitB.size);
@ -3228,7 +3237,7 @@ grabScanner (struct fujitsu *s)
if (ret) if (ret)
return ret; return ret;
DBG (10, "grabScanner: ok\n"); DBG (10, "grab_scanner: ok\n");
return 0; return 0;
} }
@ -3404,7 +3413,7 @@ doCancel (struct fujitsu *scanner)
if (scanner->sfd >= 0) if (scanner->sfd >= 0)
{ {
freeScanner (scanner); free_scanner (scanner);
DBG (10, "doCancel: close filedescriptor\n"); DBG (10, "doCancel: close filedescriptor\n");
if (scanner->connection == SANE_FUJITSU_USB) { if (scanner->connection == SANE_FUJITSU_USB) {
sanei_usb_close (scanner->sfd); sanei_usb_close (scanner->sfd);
@ -3445,14 +3454,14 @@ maxStringSize (const SANE_String_Const strings[])
* to start scanning.) * to start scanning.)
*/ */
static int static int
startScan (struct fujitsu *s) start_scan (struct fujitsu *s)
{ {
int ret; int ret;
unsigned char *command; unsigned char *command;
int cmdsize; int cmdsize;
DBG (10, "startScan\n"); DBG (10, "start_scan\n");
command = malloc (scanB.size + 2); command = malloc (scanB.size + 2);
memcpy (command, scanB.cmd, scanB.size); memcpy (command, scanB.cmd, scanB.size);
@ -3485,8 +3494,16 @@ startScan (struct fujitsu *s)
free (command); free (command);
if (ret) if (ret)
{
/* possible reasons:
* - duplex reading without object_position
* - invalid field in parameter list
*/
return ret; return ret;
DBG (10, "startScan:ok\n"); }
DBG (10, "start_scan:ok\n");
return ret; return ret;
} }
@ -3618,16 +3635,16 @@ sigtermHandler (int signal)
* through (i.e. stuffs it into the pipe). * through (i.e. stuffs it into the pipe).
*/ */
static unsigned int static unsigned int
readerGenericPassthrough (struct fujitsu *scanner, FILE * fp, int i_window_id) reader_generic_passthrough (struct fujitsu *scanner, FILE * fp, int i_window_id)
{ {
int status; int status;
unsigned int totalDataSize, dataLeft, dataToRead; unsigned int total_data_size, dataLeft, data_to_read;
unsigned char *largeBuffer; unsigned char *largeBuffer;
unsigned int largeBufferSize = 0; unsigned int largeBufferSize = 0;
unsigned int i_data_read; unsigned int i_data_read;
dataLeft = scanner->bytes_per_scan_line * scanner->scan_height_pixels; dataLeft = scanner->bytes_per_scan_line * scanner->scan_height_pixels;
totalDataSize = dataLeft; total_data_size = dataLeft;
largeBuffer = scanner->buffer; largeBuffer = scanner->buffer;
largeBufferSize = largeBufferSize =
@ -3636,9 +3653,9 @@ readerGenericPassthrough (struct fujitsu *scanner, FILE * fp, int i_window_id)
do do
{ {
dataToRead = (dataLeft < largeBufferSize) ? dataLeft : largeBufferSize; data_to_read = (dataLeft < largeBufferSize) ? dataLeft : largeBufferSize;
status = read_large_data_block (scanner, largeBuffer, dataToRead, status = read_large_data_block (scanner, largeBuffer, data_to_read,
i_window_id, &i_data_read); i_window_id, &i_data_read);
switch (status) switch (status)
@ -3648,8 +3665,8 @@ readerGenericPassthrough (struct fujitsu *scanner, FILE * fp, int i_window_id)
case SANE_STATUS_EOF: case SANE_STATUS_EOF:
DBG (10, "reader_process: EOM (no more data) length = %d\n", DBG (10, "reader_process: EOM (no more data) length = %d\n",
i_data_read); i_data_read);
dataToRead -= i_data_read; data_to_read -= i_data_read;
dataLeft = dataToRead; dataLeft = data_to_read;
break; break;
default: default:
DBG (MSG_ERR, DBG (MSG_ERR,
@ -3661,14 +3678,14 @@ readerGenericPassthrough (struct fujitsu *scanner, FILE * fp, int i_window_id)
fwrite (largeBuffer, 1, i_data_read, fp); fwrite (largeBuffer, 1, i_data_read, fp);
fflush (fp); fflush (fp);
dataLeft -= dataToRead; dataLeft -= data_to_read;
DBG (10, "reader_process: buffer of %d bytes read; %d bytes to go\n", DBG (10, "reader_process: buffer of %d bytes read; %d bytes to go\n",
dataToRead, dataLeft); data_to_read, dataLeft);
} }
while (dataLeft); while (dataLeft);
fclose (fp); fclose (fp);
return totalDataSize; return total_data_size;
} }
@ -3692,7 +3709,7 @@ read_large_data_block (struct fujitsu *s, unsigned char *buffer,
unsigned int *i_data_read) unsigned int *i_data_read)
{ {
unsigned int data_left = length; unsigned int data_left = length;
unsigned int dataToRead; unsigned int data_to_read;
int status; int status;
unsigned char *myBuffer = buffer; unsigned char *myBuffer = buffer;
size_t data_read; size_t data_read;
@ -3702,15 +3719,15 @@ read_large_data_block (struct fujitsu *s, unsigned char *buffer,
DBG (FLOW_CONTROL, "read_large_data_block requested %u bytes\n", length); DBG (FLOW_CONTROL, "read_large_data_block requested %u bytes\n", length);
do do
{ {
dataToRead = data_to_read =
(data_left <= s->scsi_buf_size) ? data_left : s->scsi_buf_size; (data_left <= s->scsi_buf_size) ? data_left : s->scsi_buf_size;
set_R_datatype_code (readB.cmd, R_datatype_imagedata); set_R_datatype_code (readB.cmd, R_datatype_imagedata);
set_R_window_id (readB.cmd, i_window_id); set_R_window_id (readB.cmd, i_window_id);
set_R_xfer_length (readB.cmd, dataToRead); set_R_xfer_length (readB.cmd, data_to_read);
status = do_cmd (s->connection, s->sfd, readB.cmd, readB.size, status = do_cmd (s->connection, s->sfd, readB.cmd, readB.size,
myBuffer, dataToRead, &data_read); myBuffer, data_to_read, &data_read);
if (status == SANE_STATUS_EOF) if (status == SANE_STATUS_EOF)
{ {
@ -3718,6 +3735,14 @@ read_large_data_block (struct fujitsu *s, unsigned char *buffer,
data_read = s->i_transfer_length; data_read = s->i_transfer_length;
data_left = 0; data_left = 0;
} }
else if (status == SANE_STATUS_DEVICE_BUSY)
{
/* temporary lack of data?
* try again.
*/
data_read = 0;
usleep(100000L);
}
else if (status != SANE_STATUS_GOOD) else if (status != SANE_STATUS_GOOD)
{ {
/* denotes error */ /* denotes error */
@ -3762,7 +3787,7 @@ read_large_data_block (struct fujitsu *s, unsigned char *buffer,
* scanner. * scanner.
*/ */
static int static int
identifyScanner (struct fujitsu *s) identify_scanner (struct fujitsu *s)
{ {
char vendor[9]; char vendor[9];
char product[17]; char product[17];
@ -3773,7 +3798,7 @@ identifyScanner (struct fujitsu *s)
vendor[8] = product[0x10] = version[4] = 0; vendor[8] = product[0x10] = version[4] = 0;
doInquiry (s); /* get inquiry */ do_inquiry (s); /* get inquiry */
if (get_IN_periph_devtype (s->buffer) != IN_periph_devtype_scanner) if (get_IN_periph_devtype (s->buffer) != IN_periph_devtype_scanner)
{ {
DBG (5, "The device at \"%s\" is not a scanner.\n", s->devicename); DBG (5, "The device at \"%s\" is not a scanner.\n", s->devicename);
@ -3897,7 +3922,7 @@ identifyScanner (struct fujitsu *s)
/* no info about the 3093DG, seems to have trouble when trying to /* no info about the 3093DG, seems to have trouble when trying to
* alternate read in linear mode. * alternate read in linear mode.
*/ */
s->can_read_alternate = 0; s->can_read_alternate = SANE_FALSE;
s->ipc_present = (strchr (s->productName, 'i')) ? 1 : 0; s->ipc_present = (strchr (s->productName, 'i')) ? 1 : 0;
s->cmp_present = (strchr (s->productName, 'm')) ? 1 : 0; s->cmp_present = (strchr (s->productName, 'm')) ? 1 : 0;
@ -3922,7 +3947,7 @@ identifyScanner (struct fujitsu *s)
if (!strncmp (product, "M4097D", 6)) if (!strncmp (product, "M4097D", 6))
{ {
s->can_read_alternate = 1; s->can_read_alternate = SANE_TRUE;
} }
for (i = 0; i <= res_list3[0]; i++) for (i = 0; i <= res_list3[0]; i++)
@ -3963,7 +3988,7 @@ identifyScanner (struct fujitsu *s)
else if (s->model == MODEL_FI) else if (s->model == MODEL_FI)
{ {
s->can_read_alternate = 1; s->can_read_alternate = SANE_TRUE;
s->ipc_present = (strchr ((s->productName)+3, 'i')) ? 1 : 0; s->ipc_present = (strchr ((s->productName)+3, 'i')) ? 1 : 0;
if (!strncmp (product, "fi-4340C", 8)) if (!strncmp (product, "fi-4340C", 8))
{ {
@ -4396,7 +4421,7 @@ imprinter(struct fujitsu *s)
} else if (s->connection == SANE_FUJITSU_SCSI) { } else if (s->connection == SANE_FUJITSU_SCSI) {
DBG (10, "imprinter opening SCSI device\n"); DBG (10, "imprinter opening SCSI device\n");
if (sanei_scsi_open if (sanei_scsi_open
(s->devicename, &sfd, scsiSenseHandler, 0) != 0) { (s->devicename, &sfd, scsi_sense_handler, 0) != 0) {
DBG (5, "imprinter: open failed\n"); DBG (5, "imprinter: open failed\n");
return SANE_STATUS_INVAL; return SANE_STATUS_INVAL;
} }
@ -4818,10 +4843,10 @@ reader_process (struct fujitsu *scanner, int pipe_fd, int duplex_pipeFd)
FILE *fp1, *fp2; FILE *fp1, *fp2;
sigset_t sigterm_set; sigset_t sigterm_set;
struct SIGACTION act; struct SIGACTION act;
time_t startTime, endTime; time_t start_time, end_time;
unsigned int totalDataSize = 0; unsigned int total_data_size = 0;
(void) time (&startTime); (void) time (&start_time);
DBG (10, "reader_process started\n"); DBG (10, "reader_process started\n");
@ -4873,24 +4898,24 @@ reader_process (struct fujitsu *scanner, int pipe_fd, int duplex_pipeFd)
case MODEL_3091: case MODEL_3091:
if ((scanner->color_mode == MODE_COLOR) if ((scanner->color_mode == MODE_COLOR)
&& (scanner->duplex_mode == DUPLEX_BOTH)) && (scanner->duplex_mode == DUPLEX_BOTH))
totalDataSize = reader3091ColorDuplex (scanner, fp1, fp2); total_data_size = reader3091ColorDuplex (scanner, fp1, fp2);
else if (scanner->color_mode == MODE_COLOR) else if (scanner->color_mode == MODE_COLOR)
totalDataSize = reader3091ColorSimplex (scanner, fp1); total_data_size = reader3091ColorSimplex (scanner, fp1);
else if (scanner->duplex_mode == DUPLEX_BOTH) else if (scanner->duplex_mode == DUPLEX_BOTH)
totalDataSize = reader3091GrayDuplex (scanner, fp1, fp2); total_data_size = reader3091GrayDuplex (scanner, fp1, fp2);
else else
totalDataSize = readerGenericPassthrough (scanner, fp1, 0); total_data_size = reader_generic_passthrough (scanner, fp1, 0);
break; break;
case MODEL_3092: case MODEL_3092:
if ((scanner->color_mode == MODE_COLOR) if ((scanner->color_mode == MODE_COLOR)
&& (scanner->duplex_mode == DUPLEX_BOTH)) && (scanner->duplex_mode == DUPLEX_BOTH))
totalDataSize = reader3092ColorDuplex (scanner, fp1, fp2); total_data_size = reader3092ColorDuplex (scanner, fp1, fp2);
else if (scanner->color_mode == MODE_COLOR) else if (scanner->color_mode == MODE_COLOR)
totalDataSize = reader3092ColorSimplex (scanner, fp1); total_data_size = reader3092ColorSimplex (scanner, fp1);
else if (scanner->duplex_mode == DUPLEX_BOTH) else if (scanner->duplex_mode == DUPLEX_BOTH)
totalDataSize = reader3092GrayDuplex (scanner, fp1, fp2); total_data_size = reader3092GrayDuplex (scanner, fp1, fp2);
else else
totalDataSize = readerGenericPassthrough (scanner, fp1, 0); total_data_size = reader_generic_passthrough (scanner, fp1, 0);
break; break;
case MODEL_FORCE: case MODEL_FORCE:
@ -4904,19 +4929,19 @@ reader_process (struct fujitsu *scanner, int pipe_fd, int duplex_pipeFd)
if (scanner->can_read_alternate) if (scanner->can_read_alternate)
{ {
totalDataSize = total_data_size =
reader_gray_duplex_alternate (scanner, fp1, fp2); reader_gray_duplex_alternate (scanner, fp1, fp2);
} }
else else
{ {
totalDataSize = total_data_size =
reader_gray_duplex_sequential (scanner, fp1, fp2); reader_gray_duplex_sequential (scanner, fp1, fp2);
} }
} }
else else
{ {
totalDataSize = readerGenericPassthrough (scanner, fp1, 0); total_data_size = reader_generic_passthrough (scanner, fp1, 0);
} }
break; break;
@ -4924,12 +4949,12 @@ reader_process (struct fujitsu *scanner, int pipe_fd, int duplex_pipeFd)
DBG (5, "reader_process: no implementation for this scanner model\n"); DBG (5, "reader_process: no implementation for this scanner model\n");
} }
(void) time (&endTime); (void) time (&end_time);
if (endTime == startTime) if (end_time == start_time)
endTime++; end_time++;
DBG (10, "reader_process: finished, throughput was %lu bytes/second\n", DBG (10, "reader_process: finished, throughput was %lu bytes/second\n",
(u_long) totalDataSize / (endTime - startTime)); (u_long) total_data_size / (end_time - start_time));
return 0; return 0;
@ -5741,7 +5766,7 @@ reader3091ColorSimplex (struct fujitsu *scanner, FILE * fp)
{ {
int status; int status;
unsigned int data_left; unsigned int data_left;
unsigned int totalDataSize, dataToRead, dataToProcess; unsigned int total_data_size, data_to_read, dataToProcess;
unsigned int green_offset, blue_offset, lookAheadSize; unsigned int green_offset, blue_offset, lookAheadSize;
unsigned readOffset; unsigned readOffset;
unsigned char *linebuffer = 0; unsigned char *linebuffer = 0;
@ -5793,18 +5818,18 @@ reader3091ColorSimplex (struct fujitsu *scanner, FILE * fp)
readOffset = 0; readOffset = 0;
data_left += lookAheadSize; data_left += lookAheadSize;
totalDataSize = data_left; total_data_size = data_left;
do do
{ {
dataToRead = (data_left < largeBufferSize - readOffset) data_to_read = (data_left < largeBufferSize - readOffset)
? data_left : largeBufferSize - readOffset; ? data_left : largeBufferSize - readOffset;
dataToProcess = dataToRead + readOffset - lookAheadSize; dataToProcess = data_to_read + readOffset - lookAheadSize;
/* if (dataToRead == data_left) dataToProcess += lookAheadSize / 2; */ /* if (data_to_read == data_left) dataToProcess += lookAheadSize / 2; */
status = status =
read_large_data_block (scanner, largeBuffer + readOffset, dataToRead, read_large_data_block (scanner, largeBuffer + readOffset, data_to_read,
0, &i_data_read); 0, &i_data_read);
switch (status) switch (status)
@ -5814,8 +5839,8 @@ reader3091ColorSimplex (struct fujitsu *scanner, FILE * fp)
case SANE_STATUS_EOF: case SANE_STATUS_EOF:
DBG (5, "reader_process: EOM (no more data) length = %d\n", DBG (5, "reader_process: EOM (no more data) length = %d\n",
scanner->i_transfer_length); scanner->i_transfer_length);
dataToRead -= scanner->i_transfer_length; data_to_read -= scanner->i_transfer_length;
data_left = dataToRead; data_left = data_to_read;
break; break;
default: default:
DBG (MSG_ERR, DBG (MSG_ERR,
@ -5894,9 +5919,9 @@ reader3091ColorSimplex (struct fujitsu *scanner, FILE * fp)
} }
fflush (fp); fflush (fp);
data_left -= dataToRead; data_left -= data_to_read;
DBG (10, "reader_process: buffer of %d bytes read; %d bytes to go\n", DBG (10, "reader_process: buffer of %d bytes read; %d bytes to go\n",
dataToRead, data_left); data_to_read, data_left);
memcpy (largeBuffer, largeBuffer + dataToProcess, lookAheadSize); memcpy (largeBuffer, largeBuffer + dataToProcess, lookAheadSize);
readOffset = lookAheadSize; readOffset = lookAheadSize;
} }
@ -5906,7 +5931,7 @@ reader3091ColorSimplex (struct fujitsu *scanner, FILE * fp)
free (largeBuffer); free (largeBuffer);
fclose (fp); fclose (fp);
return totalDataSize; return total_data_size;
} }
@ -5915,7 +5940,7 @@ reader3091ColorDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
{ {
int status; int status;
unsigned int data_left; unsigned int data_left;
unsigned int totalDataSize, dataToRead, dataToProcess; unsigned int total_data_size, data_to_read, dataToProcess;
unsigned int green_offset, blue_offset, lookAheadSize; unsigned int green_offset, blue_offset, lookAheadSize;
unsigned readOffset; unsigned readOffset;
unsigned int duplexStartLine, duplexEndLine; unsigned int duplexStartLine, duplexEndLine;
@ -6034,19 +6059,19 @@ reader3091ColorDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
readOffset = 0; readOffset = 0;
data_left += lookAheadSize; data_left += lookAheadSize;
totalDataSize = data_left; total_data_size = data_left;
do do
{ {
dataToRead = (data_left < largeBufferSize - readOffset) data_to_read = (data_left < largeBufferSize - readOffset)
? data_left : largeBufferSize - readOffset; ? data_left : largeBufferSize - readOffset;
dataToProcess = dataToRead + readOffset - lookAheadSize; dataToProcess = data_to_read + readOffset - lookAheadSize;
if (dataToRead == data_left) if (data_to_read == data_left)
dataToProcess += lookAheadSize / 2; dataToProcess += lookAheadSize / 2;
status = status =
read_large_data_block (scanner, largeBuffer + readOffset, dataToRead, read_large_data_block (scanner, largeBuffer + readOffset, data_to_read,
0, &i_data_read); 0, &i_data_read);
switch (status) switch (status)
{ {
@ -6055,8 +6080,8 @@ reader3091ColorDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
case SANE_STATUS_EOF: case SANE_STATUS_EOF:
DBG (5, "reader_process: EOM (no more data) length = %d\n", DBG (5, "reader_process: EOM (no more data) length = %d\n",
scanner->i_transfer_length); scanner->i_transfer_length);
dataToRead -= scanner->i_transfer_length; data_to_read -= scanner->i_transfer_length;
data_left = dataToRead; data_left = data_to_read;
break; break;
default: default:
DBG (MSG_ERR, DBG (MSG_ERR,
@ -6214,9 +6239,9 @@ reader3091ColorDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
fflush (fp_front); fflush (fp_front);
data_left -= dataToRead; data_left -= data_to_read;
DBG (10, "reader_process: buffer of %d bytes read; %d bytes to go\n", DBG (10, "reader_process: buffer of %d bytes read; %d bytes to go\n",
dataToRead, data_left); data_to_read, data_left);
/* FIXME: simon lai reported an overflow here! */ /* FIXME: simon lai reported an overflow here! */
memcpy (largeBuffer, largeBuffer + dataToProcess, lookAheadSize); memcpy (largeBuffer, largeBuffer + dataToProcess, lookAheadSize);
readOffset = lookAheadSize; readOffset = lookAheadSize;
@ -6251,7 +6276,7 @@ reader3091ColorDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
free (duplexBuffer); free (duplexBuffer);
} }
return totalDataSize; return total_data_size;
} }
@ -6263,13 +6288,18 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
int status; int status;
unsigned int i_left_front, i_left_back; unsigned int i_left_front, i_left_back;
unsigned int totalDataSize, dataToRead; unsigned int total_data_size, data_to_read;
unsigned int duplexBufferSize; unsigned int duplexBufferSize;
unsigned char *duplexBuffer; unsigned char *duplexBuffer;
unsigned char *duplexPointer; unsigned char *duplexPointer;
unsigned int largeBufferSize = 0; unsigned int largeBufferSize = 0;
unsigned int i_data_read; unsigned int i_data_read;
/*
time_t start_time, end_time;
(void) time (&start_time);
*/
i_left_front = scanner->bytes_per_scan_line * scanner->scan_height_pixels; i_left_front = scanner->bytes_per_scan_line * scanner->scan_height_pixels;
i_left_back = i_left_front; i_left_back = i_left_front;
@ -6301,15 +6331,15 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
scanner->scsi_buf_size - scanner->scsi_buf_size -
(scanner->scsi_buf_size % scanner->bytes_per_scan_line); (scanner->scsi_buf_size % scanner->bytes_per_scan_line);
totalDataSize = 0; total_data_size = 0;
do do
{ {
dataToRead = (i_left_front < largeBufferSize) data_to_read = (i_left_front < largeBufferSize)
? i_left_front : largeBufferSize; ? i_left_front : largeBufferSize;
DBG (5, "reader_process: read %d bytes from front side\n", dataToRead); DBG (5, "reader_process: read %d bytes from front side\n", data_to_read);
status = read_large_data_block (scanner, scanner->buffer, dataToRead, status = read_large_data_block (scanner, scanner->buffer, data_to_read,
0x0, &i_data_read); 0x0, &i_data_read);
switch (status) switch (status)
@ -6319,12 +6349,12 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
case SANE_STATUS_EOF: case SANE_STATUS_EOF:
DBG (5, "reader_process: EOM (no more data) length = %d\n", DBG (5, "reader_process: EOM (no more data) length = %d\n",
scanner->i_transfer_length); scanner->i_transfer_length);
dataToRead -= scanner->i_transfer_length; data_to_read -= scanner->i_transfer_length;
i_left_front = dataToRead; i_left_front = data_to_read;
break; break;
case SANE_STATUS_DEVICE_BUSY: case SANE_STATUS_DEVICE_BUSY:
DBG (5, "device busy"); DBG (5, "device busy");
dataToRead = 0; data_to_read = 0;
break; break;
default: default:
DBG (MSG_ERR, DBG (MSG_ERR,
@ -6334,22 +6364,22 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
return (0); return (0);
} }
totalDataSize += dataToRead; total_data_size += data_to_read;
fwrite (scanner->buffer, 1, dataToRead, fp_front); fwrite (scanner->buffer, 1, data_to_read, fp_front);
i_left_front -= dataToRead; i_left_front -= data_to_read;
DBG (5, DBG (5,
"reader_process_front: buffer of %d bytes read; %d bytes to go\n", "reader_process_front: buffer of %d bytes read; %d bytes to go\n",
dataToRead, i_left_front); data_to_read, i_left_front);
/* /*
* read back side * read back side
*/ */
dataToRead = (i_left_back < largeBufferSize) data_to_read = (i_left_back < largeBufferSize)
? i_left_back : largeBufferSize; ? i_left_back : largeBufferSize;
DBG (5, "reader_process: read %d bytes from back side\n", dataToRead); DBG (5, "reader_process: read %d bytes from back side\n", data_to_read);
status = read_large_data_block (scanner, scanner->buffer, dataToRead, status = read_large_data_block (scanner, scanner->buffer, data_to_read,
0x80, &i_data_read); 0x80, &i_data_read);
switch (status) switch (status)
@ -6359,12 +6389,12 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
case SANE_STATUS_EOF: case SANE_STATUS_EOF:
DBG (5, "reader_process: EOM (no more data) length = %d\n", DBG (5, "reader_process: EOM (no more data) length = %d\n",
scanner->i_transfer_length); scanner->i_transfer_length);
dataToRead -= scanner->i_transfer_length; data_to_read -= scanner->i_transfer_length;
i_left_back = dataToRead; i_left_back = data_to_read;
break; break;
case SANE_STATUS_DEVICE_BUSY: case SANE_STATUS_DEVICE_BUSY:
DBG (5, "device busy"); DBG (5, "device busy");
dataToRead = 0; data_to_read = 0;
break; break;
default: default:
DBG (MSG_ERR, DBG (MSG_ERR,
@ -6374,11 +6404,11 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
return (0); return (0);
} }
totalDataSize += dataToRead; total_data_size += data_to_read;
if (scanner->use_temp_file) if (scanner->use_temp_file)
{ {
if ((unsigned int) fwrite (scanner->buffer, 1, dataToRead, fp_back) if ((unsigned int) fwrite (scanner->buffer, 1, data_to_read, fp_back)
!= dataToRead) != data_to_read)
{ {
fclose (fp_back); fclose (fp_back);
DBG (MSG_ERR, DBG (MSG_ERR,
@ -6388,20 +6418,28 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
} }
else else
{ {
memcpy (duplexPointer, scanner->buffer, dataToRead); memcpy (duplexPointer, scanner->buffer, data_to_read);
duplexPointer += dataToRead; duplexPointer += data_to_read;
} }
i_left_back -= dataToRead; i_left_back -= data_to_read;
DBG (5, DBG (5,
"reader_process_back: buffer of %d bytes read; %d bytes to go\n", "reader_process_back: buffer of %d bytes read; %d bytes to go\n",
dataToRead, i_left_back); data_to_read, i_left_back);
} }
while (i_left_front > 0 || i_left_back > 0); while (i_left_front > 0 || i_left_back > 0);
fflush (fp_front); fflush (fp_front);
fclose (fp_front); fclose (fp_front);
/*
(void) time (&end_time);
if (end_time == start_time)
end_time++;
DBG (1, "time to read from scanner: %lu seconds\n", (end_time - start_time));
*/
if (scanner->use_temp_file) if (scanner->use_temp_file)
{ {
fflush (fp_back); fflush (fp_back);
@ -6414,7 +6452,7 @@ reader_gray_duplex_alternate (struct fujitsu *scanner,
free (duplexBuffer); free (duplexBuffer);
} }
return totalDataSize; return total_data_size;
} }
static unsigned int static unsigned int
@ -6425,8 +6463,8 @@ reader_gray_duplex_sequential (struct fujitsu *scanner,
i_total_size = 0; i_total_size = 0;
i_total_size += readerGenericPassthrough (scanner, fp_front, 0); i_total_size += reader_generic_passthrough (scanner, fp_front, 0);
i_total_size += readerGenericPassthrough (scanner, fp_back, 0x80); i_total_size += reader_generic_passthrough (scanner, fp_back, 0x80);
return i_total_size; return i_total_size;
} }
@ -6437,7 +6475,7 @@ static unsigned int
reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back) reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
{ {
int status; int status;
unsigned int totalDataSize, data_left, dataToRead; unsigned int total_data_size, data_left, data_to_read;
unsigned int duplexStartLine, duplexEndLine; unsigned int duplexStartLine, duplexEndLine;
unsigned int duplexBufferSize; unsigned int duplexBufferSize;
unsigned char *duplexBuffer; unsigned char *duplexBuffer;
@ -6480,13 +6518,13 @@ reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
scanner->scan_height_pixels * 2 - scanner->scan_height_pixels * 2 -
scanner->duplex_raster_offset * scanner->resolution_y / 300; scanner->duplex_raster_offset * scanner->resolution_y / 300;
totalDataSize = data_left; total_data_size = data_left;
do do
{ {
dataToRead = (data_left < largeBufferSize) ? data_left : largeBufferSize; data_to_read = (data_left < largeBufferSize) ? data_left : largeBufferSize;
status = read_large_data_block (scanner, largeBuffer, dataToRead, status = read_large_data_block (scanner, largeBuffer, data_to_read,
0, &i_data_read); 0, &i_data_read);
switch (status) switch (status)
@ -6496,8 +6534,8 @@ reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
case SANE_STATUS_EOF: case SANE_STATUS_EOF:
DBG (5, "reader_process: EOM (no more data) length = %d\n", DBG (5, "reader_process: EOM (no more data) length = %d\n",
scanner->i_transfer_length); scanner->i_transfer_length);
dataToRead -= scanner->i_transfer_length; data_to_read -= scanner->i_transfer_length;
data_left = dataToRead; data_left = data_to_read;
break; break;
default: default:
DBG (MSG_ERR, DBG (MSG_ERR,
@ -6507,7 +6545,7 @@ reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
return (0); return (0);
} }
for (source = scanner->buffer; source < scanner->buffer + dataToRead; for (source = scanner->buffer; source < scanner->buffer + data_to_read;
source += scanner->bytes_per_scan_line) source += scanner->bytes_per_scan_line)
{ {
if ((lineCount < duplexStartLine) || if ((lineCount < duplexStartLine) ||
@ -6541,9 +6579,9 @@ reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
} }
fflush (fp_front); fflush (fp_front);
data_left -= dataToRead; data_left -= data_to_read;
DBG (10, "reader_process: buffer of %d bytes read; %d bytes to go\n", DBG (10, "reader_process: buffer of %d bytes read; %d bytes to go\n",
dataToRead, data_left); data_to_read, data_left);
} }
while (data_left); while (data_left);
fclose (fp_front); fclose (fp_front);
@ -6560,7 +6598,7 @@ reader3091GrayDuplex (struct fujitsu *scanner, FILE * fp_front, FILE * fp_back)
free (duplexBuffer); free (duplexBuffer);
} }
return totalDataSize; return total_data_size;
} }
/** /**

Wyświetl plik

@ -471,16 +471,14 @@ void sane_exit (void);
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
static void doInquiry (struct fujitsu *s); static void do_inquiry (struct fujitsu *s);
static SANE_Status attachScanner (const char *devicename, static SANE_Status attachScanner (const char *devicename,
struct fujitsu **devp); struct fujitsu **devp);
static SANE_Status scsiSenseHandler (int scsi_fd, u_char * result, void *arg); static SANE_Status scsi_sense_handler (int scsi_fd, u_char * result, void *arg);
static int identifyScanner (struct fujitsu *s); static int identify_scanner (struct fujitsu *s);
static void doInquiry (struct fujitsu *s);
static int static int
do_cmd (Fujitsu_Connection_Type connection, int fd, unsigned char *cmd, do_cmd (Fujitsu_Connection_Type connection, int fd, unsigned char *cmd,
@ -500,9 +498,9 @@ static void hexdump (int level, char *comment, unsigned char *p, int l);
static SANE_Status init_options (struct fujitsu *scanner); static SANE_Status init_options (struct fujitsu *scanner);
static int grabScanner (struct fujitsu *s); static int grab_scanner (struct fujitsu *s);
static int freeScanner (struct fujitsu *s); static int free_scanner (struct fujitsu *s);
static int wait_scanner (struct fujitsu *s); static int wait_scanner (struct fujitsu *s);
@ -526,7 +524,7 @@ static int setWindowParam (struct fujitsu *s);
static size_t maxStringSize (const SANE_String_Const strings[]); static size_t maxStringSize (const SANE_String_Const strings[]);
static int startScan (struct fujitsu *s); static int start_scan (struct fujitsu *s);
static int reader_process (struct fujitsu *scanner, int fd1, int fd2); static int reader_process (struct fujitsu *scanner, int fd1, int fd2);
@ -547,7 +545,7 @@ static unsigned int reader_gray_duplex_sequential (struct fujitsu *scanner,
static unsigned int reader_gray_duplex_alternate (struct fujitsu *scanner, static unsigned int reader_gray_duplex_alternate (struct fujitsu *scanner,
FILE * fd, FILE * fd2); FILE * fd, FILE * fd2);
static unsigned int readerGenericPassthrough (struct fujitsu *scanner, static unsigned int reader_generic_passthrough (struct fujitsu *scanner,
FILE * fd, int i_window_id); FILE * fd, int i_window_id);
static int read_large_data_block (struct fujitsu *s, static int read_large_data_block (struct fujitsu *s,

Wyświetl plik

@ -37,8 +37,14 @@
:interface "SCSI" :interface "SCSI"
:model "M4097" :model "M4097"
:interface "SCSI" :interface "SCSI"
:model "fi-4120C"
:interface "USB SCSI"
:status :untested
:comment "Probably similar to fi-4220C?"
:model "fi-4220C" :model "fi-4220C"
:interface "SCSI USB" :interface "SCSI USB"
:model "fi-4340C" :model "fi-4340C"
:interface "SCSI USB" :interface "SCSI USB"
:model "ScanPartner 93GX"
:interface "SCSI"

Wyświetl plik

@ -164,11 +164,6 @@
:status :unsupported :status :unsupported
:comment "Unsupported. Vendor/product unknown. Maybe similar to fi-4220C?" :comment "Unsupported. Vendor/product unknown. Maybe similar to fi-4220C?"
:model "fi-4120C"
:interface "USB SCSI"
:status :unsupported
:comment "Unsupported. Vendor/product: 0x04c5/0x1042. Maybe similar to fi-4220C?"
;******************************************************************************************** ;********************************************************************************************