fujitsu backend v113

- support for ScanSnap iX500
- fix bug with jpeg de-interlacing code
- allow has_MS_* and has_pixelsize to be set in init_model
- fix use of uninitialized buffer in send_lut
- add send_q_table()
- allow wait_scanner() to be bypassed in object_position
- moved send_lut() to after set_window
merge-requests/1/head
m. allan noah 2013-02-23 14:57:00 -05:00
rodzic 96628ed13f
commit 36523e547d
6 zmienionych plików z 338 dodań i 168 usunięć

Wyświetl plik

@ -371,6 +371,7 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
/* ==================================================================== */
/* page codes used by mode_sense and mode_select */
#define MS_pc_unk 0x2c /* Used by iX500 */
#define MS_pc_patch 0x2e /* Patch code scanning */
#define MS_pc_counter 0x2f /* Page number and counter reset */
#define MS_pc_autocolor 0x32 /* Automatic color detection */
@ -582,8 +583,8 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
#define S_datatype_halftone_mask 0x02
#define S_datatype_gamma_function 0x03*/
#define S_datatype_lut_data 0x83
/*#define S_datatype_jpg_q_table 0x88*/
#define S_datatype_endorser_data 0x90
#define S_datatype_jpg_q_table 0x88
#define S_datatype_endorser_data 0x90
/*#define S_EX_datatype_lut 0x01
#define S_EX_datatype_shading_data 0xa0
#define S_user_reg_gamma 0xc0
@ -608,6 +609,13 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
#define S_lut_data_min_len 256
#define S_lut_data_max_len 1024
/*q-table*/
#define S_q_table_header_len 0x0a
#define S_q_table_y_len 0x40
#define set_S_q_table_y_len(sb, val) putnbyte(sb + 4, val, 2)
#define S_q_table_uv_len 0x40
#define set_S_q_table_uv_len(sb, val) putnbyte(sb + 6, val, 2)
/*endorser*/
#define S_e_data_min_len 18 /*minimum 18 bytes no string bytes*/
#define S_e_data_max_len 98 /*maximum 18 bytes plus 80 string bytes*/

Wyświetl plik

@ -515,6 +515,14 @@
- add paper-protect, staple-detect and df-recovery options
v112 2013-02-22, MAN
- some scanners (fi-6x70 and later) don't enable IPC by default
v113 2013-02-24, MAN
- support for ScanSnap iX500
- fix bug with jpeg de-interlacing code
- allow has_MS_* and has_pixelsize to be set in init_model
- fix use of uninitialized buffer in send_lut
- add send_q_table()
- allow wait_scanner() to be bypassed in object_position
- moved send_lut() to after set_window
SANE FLOW DIAGRAM
@ -564,7 +572,7 @@
#include "fujitsu.h"
#define DEBUG 1
#define BUILD 112
#define BUILD 113
/* values for SANE_DEBUG_FUJITSU env var:
- errors 5
@ -1702,159 +1710,183 @@ init_ms(struct fujitsu *s)
set_SCSI_opcode(cmd, MODE_SENSE_code);
set_MSEN_xfer_length (cmd, inLen);
DBG (35, "init_ms: autocolor\n");
set_MSEN_pc(cmd, MS_pc_autocolor);
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret == SANE_STATUS_GOOD){
s->has_MS_autocolor=1;
if(s->has_MS_autocolor){
DBG (35, "init_ms: autocolor\n");
set_MSEN_pc(cmd, MS_pc_autocolor);
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret != SANE_STATUS_GOOD){
s->has_MS_autocolor=0;
}
}
DBG (35, "init_ms: prepick\n");
set_MSEN_pc(cmd, MS_pc_prepick);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret == SANE_STATUS_GOOD){
s->has_MS_prepick=1;
if(s->has_MS_prepick){
DBG (35, "init_ms: prepick\n");
set_MSEN_pc(cmd, MS_pc_prepick);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret != SANE_STATUS_GOOD){
s->has_MS_prepick=0;
}
}
DBG (35, "init_ms: sleep\n");
set_MSEN_pc(cmd, MS_pc_sleep);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret == SANE_STATUS_GOOD){
s->has_MS_sleep=1;
if(s->has_MS_sleep){
DBG (35, "init_ms: sleep\n");
set_MSEN_pc(cmd, MS_pc_sleep);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret != SANE_STATUS_GOOD){
s->has_MS_sleep=0;
}
}
DBG (35, "init_ms: duplex\n");
set_MSEN_pc(cmd, MS_pc_duplex);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret == SANE_STATUS_GOOD){
s->has_MS_duplex=1;
if(s->has_MS_duplex){
DBG (35, "init_ms: duplex\n");
set_MSEN_pc(cmd, MS_pc_duplex);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret != SANE_STATUS_GOOD){
s->has_MS_duplex=0;
}
}
DBG (35, "init_ms: rand\n");
set_MSEN_pc(cmd, MS_pc_rand);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret == SANE_STATUS_GOOD){
s->has_MS_rand=1;
if(s->has_MS_rand){
DBG (35, "init_ms: rand\n");
set_MSEN_pc(cmd, MS_pc_rand);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret != SANE_STATUS_GOOD){
s->has_MS_rand=0;
}
}
DBG (35, "init_ms: bg\n");
set_MSEN_pc(cmd, MS_pc_bg);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret == SANE_STATUS_GOOD){
s->has_MS_bg=1;
if(s->has_MS_bg){
DBG (35, "init_ms: bg\n");
set_MSEN_pc(cmd, MS_pc_bg);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret != SANE_STATUS_GOOD){
s->has_MS_bg=0;
}
}
DBG (35, "init_ms: df\n");
set_MSEN_pc(cmd, MS_pc_df);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret == SANE_STATUS_GOOD){
s->has_MS_df=1;
if(s->has_MS_df){
DBG (35, "init_ms: df\n");
set_MSEN_pc(cmd, MS_pc_df);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret != SANE_STATUS_GOOD){
s->has_MS_df=0;
}
}
DBG (35, "init_ms: dropout\n");
set_MSEN_pc(cmd, MS_pc_dropout);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret == SANE_STATUS_GOOD){
s->has_MS_dropout=1;
if(s->has_MS_dropout){
DBG (35, "init_ms: dropout\n");
set_MSEN_pc(cmd, MS_pc_dropout);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret != SANE_STATUS_GOOD){
s->has_MS_dropout=0;
}
}
DBG (35, "init_ms: buffer\n");
set_MSEN_pc(cmd, MS_pc_buff);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret == SANE_STATUS_GOOD){
s->has_MS_buff=1;
if(s->has_MS_buff){
DBG (35, "init_ms: buffer\n");
set_MSEN_pc(cmd, MS_pc_buff);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret != SANE_STATUS_GOOD){
s->has_MS_buff=0;
}
}
DBG (35, "init_ms: auto\n");
set_MSEN_pc(cmd, MS_pc_auto);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret == SANE_STATUS_GOOD){
s->has_MS_auto=1;
if(s->has_MS_auto){
DBG (35, "init_ms: auto\n");
set_MSEN_pc(cmd, MS_pc_auto);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret != SANE_STATUS_GOOD){
s->has_MS_auto=0;
}
}
DBG (35, "init_ms: lamp\n");
set_MSEN_pc(cmd, MS_pc_lamp);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret == SANE_STATUS_GOOD){
s->has_MS_lamp=1;
if(s->has_MS_lamp){
DBG (35, "init_ms: lamp\n");
set_MSEN_pc(cmd, MS_pc_lamp);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret != SANE_STATUS_GOOD){
s->has_MS_lamp=0;
}
}
DBG (35, "init_ms: jobsep\n");
set_MSEN_pc(cmd, MS_pc_jobsep);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret == SANE_STATUS_GOOD){
s->has_MS_jobsep=1;
if(s->has_MS_jobsep){
DBG (35, "init_ms: jobsep\n");
set_MSEN_pc(cmd, MS_pc_jobsep);
inLen = MODE_SENSE_data_len;
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
NULL, 0,
in, &inLen
);
if(ret != SANE_STATUS_GOOD){
s->has_MS_jobsep=0;
}
}
IF_DBG (DBG_LEVEL = oldDbg;)
@ -1964,6 +1996,22 @@ init_model (struct fujitsu *s)
s->max_x_fb = s->max_x;
s->max_y_fb = s->max_y;
/* assume we can do these. we will disable
* them at runtime if they cannot */
s->has_pixelsize = 1;
s->has_MS_autocolor = 1;
s->has_MS_prepick = 1;
s->has_MS_sleep = 1;
s->has_MS_duplex = 1;
s->has_MS_rand = 1;
s->has_MS_bg = 1;
s->has_MS_df = 1;
s->has_MS_dropout = 1;
s->has_MS_buff = 1;
s->has_MS_auto = 1;
s->has_MS_lamp = 1;
s->has_MS_jobsep = 1;
/* these two scanners lie about their capabilities,
* and/or differ significantly from most other models */
if (strstr (s->model_name, "M3091")
@ -2122,6 +2170,20 @@ init_model (struct fujitsu *s)
s->has_df_recovery=1;
}
else if (strstr (s->model_name,"iX500")){
/* locks up scanner if we try to auto detect */
s->has_MS_lamp = 0;
/* weirdness */
s->need_q_table = 1;
s->ppl_mod_by_mode[MODE_GRAYSCALE] = 2;
s->ppl_mod_by_mode[MODE_COLOR] = 2;
s->no_wait_after_op = 1;
/* lies */
s->adbits = 8;
}
DBG (10, "init_model: finish\n");
return SANE_STATUS_GOOD;
@ -5718,6 +5780,7 @@ send_lut (struct fujitsu *s)
set_S_xfer_datatype (cmd, S_datatype_lut_data);
set_S_xfer_length (cmd, outLen);
memset(out,0,outLen);
set_S_lut_order (out, S_lut_order_single);
set_S_lut_ssize (out, bytes);
set_S_lut_dsize (out, 256);
@ -5749,6 +5812,65 @@ send_lut (struct fujitsu *s)
return ret;
}
static SANE_Status
send_q_table (struct fujitsu *s)
{
SANE_Status ret = SANE_STATUS_GOOD;
unsigned char cmd[SEND_len];
size_t cmdLen = SEND_len;
unsigned char out[S_q_table_header_len + S_q_table_y_len + S_q_table_uv_len];
size_t outLen = S_q_table_header_len + S_q_table_y_len + S_q_table_uv_len;
unsigned char * yp = out + S_q_table_header_len;
unsigned char * uvp = out + S_q_table_header_len + S_q_table_y_len;
/* FIXME: generate these instead of hardcode */
unsigned char ydata[] = {
0x04, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x04,
0x03, 0x04, 0x05, 0x05, 0x04, 0x05, 0x07, 0x0c,
0x07, 0x07, 0x06, 0x06, 0x07, 0x0e, 0x0a, 0x0b,
0x08, 0x0c, 0x11, 0x0f, 0x12, 0x12, 0x11, 0x0f,
0x10, 0x10, 0x13, 0x15, 0x1b, 0x17, 0x13, 0x14,
0x1a, 0x14, 0x10, 0x10, 0x18, 0x20, 0x18, 0x1a,
0x1c, 0x1d, 0x1e, 0x1f, 0x1e, 0x12, 0x17, 0x21,
0x24, 0x21, 0x1e, 0x24, 0x1b, 0x1e, 0x1e, 0x1d };
unsigned char uvdata[] = {
0x05, 0x05, 0x05, 0x07, 0x06, 0x07, 0x0e, 0x07,
0x07, 0x0e, 0x1d, 0x13, 0x10, 0x13, 0x1d, 0x1d,
0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d,
0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d,
0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d,
0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d,
0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d,
0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d };
DBG (10, "send_q_table: start\n");
memset(cmd,0,cmdLen);
set_SCSI_opcode(cmd, SEND_code);
set_S_xfer_datatype (cmd, S_datatype_jpg_q_table);
set_S_xfer_length (cmd, outLen);
memset(out,0,outLen);
set_S_q_table_y_len (out, S_q_table_y_len);
set_S_q_table_uv_len (out, S_q_table_uv_len);
memcpy (yp, ydata, S_q_table_y_len);
memcpy (uvp, uvdata, S_q_table_uv_len);
ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
out, outLen,
NULL, NULL
);
DBG (10, "send_q_table: finish\n");
return ret;
}
static SANE_Status
mode_select_df (struct fujitsu *s)
{
@ -6307,13 +6429,6 @@ sane_start (SANE_Handle handle)
if (ret != SANE_STATUS_GOOD)
DBG (5, "sane_start: WARNING: cannot mode_select_df %d\n", ret);
/* send lut if scanner has no hardware brightness/contrast */
if (!s->brightness_steps || !s->contrast_steps){
ret = send_lut(s);
if (ret != SANE_STATUS_GOOD)
DBG (5, "sane_start: WARNING: cannot send_lut %d\n", ret);
}
/* enable background color setting */
ret = mode_select_bg(s);
if (ret != SANE_STATUS_GOOD)
@ -6334,6 +6449,7 @@ sane_start (SANE_Handle handle)
if (ret != SANE_STATUS_GOOD)
DBG (5, "sane_start: WARNING: cannot mode_select_prepick %d\n", ret);
/* send endorser config */
ret = send_endorser(s);
if (ret != SANE_STATUS_GOOD)
DBG (5, "sane_start: WARNING: cannot send_endorser %d\n", ret);
@ -6345,6 +6461,20 @@ sane_start (SANE_Handle handle)
return ret;
}
/* send lut if scanner has no hardware brightness/contrast */
if (!s->brightness_steps || !s->contrast_steps){
ret = send_lut(s);
if (ret != SANE_STATUS_GOOD)
DBG (5, "sane_start: WARNING: cannot send_lut %d\n", ret);
}
/* some scanners need the q table sent, even when not scanning jpeg */
if (s->need_q_table){
ret = send_q_table(s);
if (ret != SANE_STATUS_GOOD)
DBG (5, "sane_start: WARNING: cannot send_q_table %d\n", ret);
}
/* try to read scan size from scanner */
ret = get_pixelsize(s,0);
if (ret != SANE_STATUS_GOOD) {
@ -7032,6 +7162,11 @@ get_pixelsize(struct fujitsu *s, int actual)
DBG (10, "get_pixelsize: start %d\n",actual);
if (!s->has_pixelsize){
DBG (10, "get_pixelsize: unsupported\n");
return SANE_STATUS_GOOD;
}
memset(cmd,0,cmdLen);
set_SCSI_opcode(cmd, READ_code);
set_R_datatype_code (cmd, R_datatype_pixelsize);
@ -7099,6 +7234,11 @@ get_pixelsize(struct fujitsu *s, int actual)
DBG (15, "get_pixelsize: scan_x=%d, Bpl=%d, scan_y=%d\n",
s->params.pixels_per_line, s->params.bytes_per_line, s->params.lines );
}
else{
DBG (10, "get_pixelsize: got bad status %d, ignoring\n", ret);
s->has_pixelsize = 0;
ret = SANE_STATUS_GOOD;
}
DBG (10, "get_pixelsize: finish\n");
@ -7144,7 +7284,8 @@ object_position (struct fujitsu *s, int i_load)
if (ret != SANE_STATUS_GOOD)
return ret;
wait_scanner (s);
if(!s->no_wait_after_op)
wait_scanner (s);
DBG (10, "object_position: finish\n");
@ -7484,7 +7625,16 @@ read_from_JPEGduplex(struct fujitsu *s)
DBG(15, "read_from_JPEGduplex: stage sos\n");
}
/* finished front image block, switch to back */
/* found image block. images are not interlaced */
/* copy to front, don't change RST */
else if(in[i] >= 0xd0 && in[i] <= 0xd7
&& s->jpeg_interlace == JPEG_INTERLACE_NONE){
s->jpeg_stage = JPEG_STAGE_FRONT;
DBG(35, "read_from_JPEGduplex: stage front (all)\n");
}
/* found even numbered image block. */
/* images are interlaced, so switch to back. */
/* also change from even RST to proper one */
else if(in[i] == 0xd0 || in[i] == 0xd2
|| in[i] == 0xd4 || in[i] == 0xd6){
@ -7504,6 +7654,7 @@ read_from_JPEGduplex(struct fujitsu *s)
}
/* finished back image block, switch to front */
/* also change from odd RST to proper one */
else if(in[i] == 0xd1 || in[i] == 0xd3
|| in[i] == 0xd5 || in[i] == 0xd7){
s->jpeg_stage = JPEG_STAGE_FRONT;
@ -7512,7 +7663,7 @@ read_from_JPEGduplex(struct fujitsu *s)
s->jpeg_front_rst++;
}
/* finished image, in both, update totals */
/* finished image, update totals */
else if(in[i]==0xd9){
s->jpeg_stage = JPEG_STAGE_EOI;
DBG(15, "read_from_JPEGduplex: stage eoi %d %d\n",(int)inLen,i);
@ -7611,17 +7762,19 @@ read_from_JPEGduplex(struct fujitsu *s)
/* last byte of file, update totals, bail out */
if(s->jpeg_stage == JPEG_STAGE_EOI){
s->eof_rx[SIDE_FRONT] = 1;
s->eof_rx[SIDE_BACK] = 1;
if(s->jpeg_interlace == JPEG_INTERLACE_ALT)
s->eof_rx[SIDE_BACK] = 1;
}
}
free(in);
/* jpeg uses in-band EOI marker, so we should never hit this? */
/* jpeg uses in-band EOI marker, so this is ususally redundant */
if(ret == SANE_STATUS_EOF){
DBG(15, "read_from_JPEGduplex: got EOF, finishing both sides\n");
DBG(15, "read_from_JPEGduplex: got EOF, finishing\n");
s->eof_rx[SIDE_FRONT] = 1;
s->eof_rx[SIDE_BACK] = 1;
if(s->jpeg_interlace == JPEG_INTERLACE_ALT)
s->eof_rx[SIDE_BACK] = 1;
ret = SANE_STATUS_GOOD;
}

Wyświetl plik

@ -127,12 +127,6 @@ usb 0x04c5 0x11a0
#S1500 & S1500M
usb 0x04c5 0x11a2
#fi-6125
usb 0x04c5 0x11ee
#fi-6225
usb 0x04c5 0x11ef
#fi-6140Z
usb 0x04c5 0x11f1
@ -147,3 +141,9 @@ usb 0x04c5 0x11f4
#fi-6110
usb 0x04c5 0x11fc
#fi-5950
usb 0x04c5 0x1213
#ScanSnap iX500
usb 0x04c5 0x132b

Wyświetl plik

@ -314,8 +314,11 @@ struct fujitsu
int ghs_in_rs;
int window_gamma;
int endorser_string_len;
int has_pixelsize;
int broken_diag_serial; /* some scanners are just plain borked */
int need_q_table; /* some scanners wont work without this */
int no_wait_after_op; /* some scanners dont like TUR after OP */
int has_vuid_mono; /* mono set window data */
int has_vuid_3091; /* 3091/2 set window data */

Wyświetl plik

@ -12,7 +12,7 @@
:backend "fujitsu" ; name of backend
:url "http://www.thebility.com/fujitsu/"
:version "111" ; version of backend
:version "113" ; version of backend
:manpage "sane-fujitsu" ; name of manpage (if it exists)
:comment "Backend updated for SANE release 1.0.23, see sane-fujitsu manpage"
:devicetype :scanner ; start of a list of devices....
@ -143,6 +143,18 @@
:usbid "0x04c5" "0x1150"
:comment "small, recent, discontinued"
:model "ScanSnap S1500"
:interface "USB"
:status :complete
:usbid "0x04c5" "0x11a2"
:comment "small, discontinued"
:model "ScanSnap S1500M"
:interface "USB"
:status :complete
:usbid "0x04c5" "0x11a2"
:comment "small, discontinued, same as S1500"
;==================================================
; CURRENT MODELS, SMALL
:model "ScanSnap N1800"
@ -173,17 +185,11 @@
:usbid "0x04c5" "0x11f4"
:comment "small, current"
:model "ScanSnap S1500"
:interface "USB"
:status :complete
:usbid "0x04c5" "0x11a2"
:comment "small, current"
:model "ScanSnap S1500M"
:interface "USB"
:status :complete
:usbid "0x04c5" "0x11a2"
:comment "small, current, same as S1500"
:model "ScanSnap iX500"
:interface "USB WiFi"
:status :basic
:usbid "0x04c5" "0x132b"
:comment "small, current, WiFi not supported. Only scans in color."
;==================================================
; DISCONTINUED OLDER MODELS, MEDIUM
@ -395,7 +401,7 @@
;==================================================
; CURRENT MODELS, BIG
:model "fi-5950C"
:model "fi-5950"
:interface "SCSI USB"
:usbid "0x04c5" "0x1213"
:status :untested

Wyświetl plik

@ -182,7 +182,7 @@ SANE_Frame;
/* push remaining types down to match existing backends */
/* these are to be exposed in a later version of SANE */
/* most front-ends will require updates to understand them */
#if 0
#if 1
#define SANE_FRAME_TEXT 0x0A /* backend specific textual data */
#define SANE_FRAME_JPEG 0x0B /* complete baseline JPEG file */
#define SANE_FRAME_G31D 0x0C /* CCITT Group 3 1-D Compressed (MH) */