kopia lustrzana https://gitlab.com/sane-project/backends
backend version 1.0.62, begin sane 1.1.0 compliance
rodzic
e91fea4ac1
commit
2016e8f019
|
@ -1,3 +1,10 @@
|
|||
2008-05-20 m. allan noah <kitno455 a t gmail d o t com>
|
||||
* backend/fujitsu.[ch], backend/fujitsu-scsi.h: v1.0.62,
|
||||
check for all supported scsi commands, use well-known option
|
||||
group strings from saneopts.h, rename pagewidth to page-width
|
||||
to meet sane 1.1.0 spec, same for height, add unused get_window()
|
||||
* doc/descriptions/fujitsu.desc: increase version to 1.0.62.
|
||||
|
||||
2008-05-20 m. allan noah <kitno455 a t gmail d o t com>
|
||||
* include/sane/sane.h: add SANE_STATUS_WARMING_UP and
|
||||
SANE_STATUS_HW_LOCKED, remove SANE_CAP_ALWAYS_SETTABLE,
|
||||
|
|
|
@ -100,6 +100,7 @@ scsiblk;
|
|||
#define SEND_DIAGNOSTIC 0x1d
|
||||
#define TEST_UNIT_READY 0x00
|
||||
#define SET_WINDOW 0x24
|
||||
#define GET_WINDOW 0x25
|
||||
#define SET_SUBWINDOW 0xc0
|
||||
#define OBJECT_POSITION 0x31
|
||||
#define SEND 0x2a
|
||||
|
@ -221,9 +222,38 @@ static scsiblk inquiryB = { inquiryC, sizeof (inquiryC) };
|
|||
#define get_IN_adbits(in) getbitfield(in+0x21, 0x0f, 0)
|
||||
#define get_IN_buffer_bytes(in) getnbyte(in + 0x22, 4)
|
||||
|
||||
/* more stuff here (std supported commands) */
|
||||
#define get_IN_has_cmd_msen(in) getbitfield(in+0x29, 1, 7)
|
||||
/*supported scsi commands*/
|
||||
#define get_IN_has_cmd_msen(in) getbitfield(in+0x26, 1, 1)
|
||||
#define get_IN_has_cmd_msel(in) getbitfield(in+0x26, 1, 0)
|
||||
|
||||
#define get_IN_has_cmd_lsen(in) getbitfield(in+0x27, 1, 7)
|
||||
#define get_IN_has_cmd_lsel(in) getbitfield(in+0x27, 1, 6)
|
||||
#define get_IN_has_cmd_change(in) getbitfield(in+0x27, 1, 5)
|
||||
#define get_IN_has_cmd_rbuff(in) getbitfield(in+0x27, 1, 4)
|
||||
#define get_IN_has_cmd_wbuff(in) getbitfield(in+0x27, 1, 3)
|
||||
#define get_IN_has_cmd_cav(in) getbitfield(in+0x27, 1, 2)
|
||||
#define get_IN_has_cmd_comp(in) getbitfield(in+0x27, 1, 1)
|
||||
#define get_IN_has_cmd_gdbs(in) getbitfield(in+0x27, 1, 0)
|
||||
|
||||
#define get_IN_has_cmd_op(in) getbitfield(in+0x28, 1, 7)
|
||||
#define get_IN_has_cmd_send(in) getbitfield(in+0x28, 1, 6)
|
||||
#define get_IN_has_cmd_read(in) getbitfield(in+0x28, 1, 5)
|
||||
#define get_IN_has_cmd_gwin(in) getbitfield(in+0x28, 1, 4)
|
||||
#define get_IN_has_cmd_swin(in) getbitfield(in+0x28, 1, 3)
|
||||
#define get_IN_has_cmd_sdiag(in) getbitfield(in+0x28, 1, 2)
|
||||
#define get_IN_has_cmd_rdiag(in) getbitfield(in+0x28, 1, 1)
|
||||
#define get_IN_has_cmd_scan(in) getbitfield(in+0x28, 1, 0)
|
||||
|
||||
#define get_IN_has_cmd_msen6(in) getbitfield(in+0x29, 1, 7)
|
||||
#define get_IN_has_cmd_copy(in) getbitfield(in+0x29, 1, 6)
|
||||
#define get_IN_has_cmd_rel(in) getbitfield(in+0x29, 1, 5)
|
||||
#define get_IN_has_cmd_runit(in) getbitfield(in+0x29, 1, 4)
|
||||
#define get_IN_has_cmd_msel6(in) getbitfield(in+0x29, 1, 3)
|
||||
#define get_IN_has_cmd_inq(in) getbitfield(in+0x29, 1, 2)
|
||||
#define get_IN_has_cmd_rs(in) getbitfield(in+0x29, 1, 1)
|
||||
#define get_IN_has_cmd_tur(in) getbitfield(in+0x29, 1, 0)
|
||||
|
||||
/* more stuff here? (vendor commands) */
|
||||
#define get_IN_has_subwindow(in) getbitfield(in+0x2b, 1, 0)
|
||||
#define get_IN_has_endorser(in) getbitfield(in+0x2b, 1, 1)
|
||||
#define get_IN_has_hw_status(in) getbitfield(in+0x2b, 1, 2)
|
||||
|
@ -282,6 +312,14 @@ static scsiblk test_unit_readyB =
|
|||
|
||||
/* ==================================================================== */
|
||||
|
||||
static unsigned char get_windowC[] =
|
||||
{ GET_WINDOW, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
|
||||
/* opcode, lun, _____4 X reserved____, transfer length, control byte */
|
||||
static scsiblk get_windowB = { get_windowC, sizeof (get_windowC) };
|
||||
#define set_GW_xferlen(sb, len) putnbyte(sb + 0x06, len, 3)
|
||||
|
||||
/* ==================================================================== */
|
||||
|
||||
static unsigned char set_windowC[] =
|
||||
{ SET_WINDOW, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
|
||||
/* opcode, lun, _____4 X reserved____, transfer length, control byte */
|
||||
|
|
|
@ -301,6 +301,11 @@
|
|||
- add fi-5530C2 usb id
|
||||
- merge find_scanners into sane_get_devices
|
||||
- inspect correct bool to enable prepick mode option
|
||||
V 1.0.62 2008-05-20, MAN
|
||||
- check for all supported scsi commands
|
||||
- use well-known option group strings from saneopts.h
|
||||
- rename pagewidth to page-width, to meet sane 1.1.0, same for height
|
||||
- add unused get_window()
|
||||
|
||||
SANE FLOW DIAGRAM
|
||||
|
||||
|
@ -361,7 +366,7 @@
|
|||
#include "fujitsu.h"
|
||||
|
||||
#define DEBUG 1
|
||||
#define BUILD 61
|
||||
#define BUILD 62
|
||||
|
||||
/* values for SANE_DEBUG_FUJITSU env var:
|
||||
- errors 5
|
||||
|
@ -1101,10 +1106,88 @@ init_vpd (struct fujitsu *s)
|
|||
s->buffer_bytes = get_IN_buffer_bytes(buffer);
|
||||
DBG (15, " buffer bytes: %d\n",s->buffer_bytes);
|
||||
|
||||
/* std scsi command support */
|
||||
/* std scsi command support byte 26*/
|
||||
s->has_cmd_msen = get_IN_has_cmd_msen(buffer);
|
||||
DBG (15, " mode_sense cmd: %d\n", s->has_cmd_msen);
|
||||
|
||||
s->has_cmd_msel = get_IN_has_cmd_msel(buffer);
|
||||
DBG (15, " mode_select cmd: %d\n", s->has_cmd_msel);
|
||||
|
||||
/* std scsi command support byte 27*/
|
||||
s->has_cmd_lsen = get_IN_has_cmd_lsen(buffer);
|
||||
DBG (15, " log_sense cmd: %d\n", s->has_cmd_lsen);
|
||||
|
||||
s->has_cmd_lsel = get_IN_has_cmd_lsel(buffer);
|
||||
DBG (15, " log_select cmd: %d\n", s->has_cmd_lsel);
|
||||
|
||||
s->has_cmd_change = get_IN_has_cmd_change(buffer);
|
||||
DBG (15, " change cmd: %d\n", s->has_cmd_change);
|
||||
|
||||
s->has_cmd_rbuff = get_IN_has_cmd_rbuff(buffer);
|
||||
DBG (15, " read_buffer cmd: %d\n", s->has_cmd_rbuff);
|
||||
|
||||
s->has_cmd_wbuff = get_IN_has_cmd_wbuff(buffer);
|
||||
DBG (15, " write_buffer cmd: %d\n", s->has_cmd_wbuff);
|
||||
|
||||
s->has_cmd_cav = get_IN_has_cmd_cav(buffer);
|
||||
DBG (15, " copy_and_verify cmd: %d\n", s->has_cmd_cav);
|
||||
|
||||
s->has_cmd_comp = get_IN_has_cmd_comp(buffer);
|
||||
DBG (15, " compare cmd: %d\n", s->has_cmd_comp);
|
||||
|
||||
s->has_cmd_gdbs = get_IN_has_cmd_gdbs(buffer);
|
||||
DBG (15, " get_d_b_status cmd: %d\n", s->has_cmd_gdbs);
|
||||
|
||||
/* std scsi command support byte 28*/
|
||||
s->has_cmd_op = get_IN_has_cmd_op(buffer);
|
||||
DBG (15, " object_pos cmd: %d\n", s->has_cmd_op);
|
||||
|
||||
s->has_cmd_send = get_IN_has_cmd_send(buffer);
|
||||
DBG (15, " send cmd: %d\n", s->has_cmd_send);
|
||||
|
||||
s->has_cmd_read = get_IN_has_cmd_read(buffer);
|
||||
DBG (15, " read cmd: %d\n", s->has_cmd_read);
|
||||
|
||||
s->has_cmd_gwin = get_IN_has_cmd_gwin(buffer);
|
||||
DBG (15, " get_window cmd: %d\n", s->has_cmd_gwin);
|
||||
|
||||
s->has_cmd_swin = get_IN_has_cmd_swin(buffer);
|
||||
DBG (15, " set_window cmd: %d\n", s->has_cmd_swin);
|
||||
|
||||
s->has_cmd_sdiag = get_IN_has_cmd_sdiag(buffer);
|
||||
DBG (15, " send_diag cmd: %d\n", s->has_cmd_sdiag);
|
||||
|
||||
s->has_cmd_rdiag = get_IN_has_cmd_rdiag(buffer);
|
||||
DBG (15, " read_diag cmd: %d\n", s->has_cmd_rdiag);
|
||||
|
||||
s->has_cmd_scan = get_IN_has_cmd_scan(buffer);
|
||||
DBG (15, " scan cmd: %d\n", s->has_cmd_scan);
|
||||
|
||||
/* std scsi command support byte 29*/
|
||||
s->has_cmd_msen6 = get_IN_has_cmd_msen6(buffer);
|
||||
DBG (15, " mode_sense_6 cmd: %d\n", s->has_cmd_msen6);
|
||||
|
||||
s->has_cmd_copy = get_IN_has_cmd_copy(buffer);
|
||||
DBG (15, " copy cmd: %d\n", s->has_cmd_copy);
|
||||
|
||||
s->has_cmd_rel = get_IN_has_cmd_rel(buffer);
|
||||
DBG (15, " release cmd: %d\n", s->has_cmd_rel);
|
||||
|
||||
s->has_cmd_runit = get_IN_has_cmd_runit(buffer);
|
||||
DBG (15, " reserve_unit cmd: %d\n", s->has_cmd_runit);
|
||||
|
||||
s->has_cmd_msel6 = get_IN_has_cmd_msel6(buffer);
|
||||
DBG (15, " mode_select_6 cmd: %d\n", s->has_cmd_msel6);
|
||||
|
||||
s->has_cmd_inq = get_IN_has_cmd_inq(buffer);
|
||||
DBG (15, " inquiry cmd: %d\n", s->has_cmd_inq);
|
||||
|
||||
s->has_cmd_rs = get_IN_has_cmd_rs(buffer);
|
||||
DBG (15, " request_sense cmd: %d\n", s->has_cmd_rs);
|
||||
|
||||
s->has_cmd_tur = get_IN_has_cmd_tur(buffer);
|
||||
DBG (15, " test_unit_ready cmd: %d\n", s->has_cmd_tur);
|
||||
|
||||
/* vendor added scsi command support */
|
||||
/* FIXME: there are more of these... */
|
||||
s->has_cmd_subwindow = get_IN_has_subwindow(buffer);
|
||||
|
@ -1732,9 +1815,10 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
return NULL;
|
||||
|
||||
/* "Mode" group -------------------------------------------------------- */
|
||||
if(option==OPT_MODE_GROUP){
|
||||
opt->title = "Scan Mode";
|
||||
opt->desc = "";
|
||||
if(option==OPT_STANDARD_GROUP){
|
||||
opt->name = SANE_NAME_STANDARD;
|
||||
opt->title = SANE_TITLE_STANDARD;
|
||||
opt->desc = SANE_DESC_STANDARD;
|
||||
opt->type = SANE_TYPE_GROUP;
|
||||
opt->constraint_type = SANE_CONSTRAINT_NONE;
|
||||
}
|
||||
|
@ -1944,8 +2028,9 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
|
||||
/* "Geometry" group ---------------------------------------------------- */
|
||||
if(option==OPT_GEOMETRY_GROUP){
|
||||
opt->title = "Geometry";
|
||||
opt->desc = "";
|
||||
opt->name = SANE_NAME_GEOMETRY;
|
||||
opt->title = SANE_TITLE_GEOMETRY;
|
||||
opt->desc = SANE_DESC_GEOMETRY;
|
||||
opt->type = SANE_TYPE_GROUP;
|
||||
opt->constraint_type = SANE_CONSTRAINT_NONE;
|
||||
}
|
||||
|
@ -2030,9 +2115,9 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
s->paper_x_range.max = SCANNER_UNIT_TO_FIXED_MM(s->max_x);
|
||||
s->paper_x_range.quant = MM_PER_UNIT_FIX;
|
||||
|
||||
opt->name = "pagewidth";
|
||||
opt->title = "ADF paper width";
|
||||
opt->desc = "Must be set properly to align scanning window";
|
||||
opt->name = SANE_NAME_PAGE_WIDTH;
|
||||
opt->title = SANE_TITLE_PAGE_WIDTH;
|
||||
opt->desc = SANE_DESC_PAGE_WIDTH;
|
||||
opt->type = SANE_TYPE_FIXED;
|
||||
opt->unit = SANE_UNIT_MM;
|
||||
opt->constraint_type = SANE_CONSTRAINT_RANGE;
|
||||
|
@ -2053,9 +2138,9 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
s->paper_y_range.max = SCANNER_UNIT_TO_FIXED_MM(s->max_y);
|
||||
s->paper_y_range.quant = MM_PER_UNIT_FIX;
|
||||
|
||||
opt->name = "pageheight";
|
||||
opt->title = "ADF paper length";
|
||||
opt->desc = "Must be set properly to eject pages";
|
||||
opt->name = SANE_NAME_PAGE_HEIGHT;
|
||||
opt->title = SANE_TITLE_PAGE_HEIGHT;
|
||||
opt->desc = SANE_DESC_PAGE_HEIGHT;
|
||||
opt->type = SANE_TYPE_FIXED;
|
||||
opt->unit = SANE_UNIT_MM;
|
||||
opt->constraint_type = SANE_CONSTRAINT_RANGE;
|
||||
|
@ -2070,8 +2155,9 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
|
||||
/* "Enhancement" group ------------------------------------------------- */
|
||||
if(option==OPT_ENHANCEMENT_GROUP){
|
||||
opt->title = "Enhancement";
|
||||
opt->desc = "";
|
||||
opt->name = SANE_NAME_ENHANCEMENT;
|
||||
opt->title = SANE_TITLE_ENHANCEMENT;
|
||||
opt->desc = SANE_DESC_ENHANCEMENT;
|
||||
opt->type = SANE_TYPE_GROUP;
|
||||
opt->constraint_type = SANE_CONSTRAINT_NONE;
|
||||
}
|
||||
|
@ -2183,8 +2269,9 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
|
||||
/* "Advanced" group ------------------------------------------------------ */
|
||||
if(option==OPT_ADVANCED_GROUP){
|
||||
opt->title = "Advanced";
|
||||
opt->desc = "";
|
||||
opt->name = SANE_NAME_ADVANCED;
|
||||
opt->title = SANE_TITLE_ADVANCED;
|
||||
opt->desc = SANE_DESC_ADVANCED;
|
||||
opt->type = SANE_TYPE_GROUP;
|
||||
opt->constraint_type = SANE_CONSTRAINT_NONE;
|
||||
}
|
||||
|
@ -2468,8 +2555,9 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
|
||||
/* "Sensor" group ------------------------------------------------------ */
|
||||
if(option==OPT_SENSOR_GROUP){
|
||||
opt->title = "Sensors and Buttons";
|
||||
opt->desc = "";
|
||||
opt->name = SANE_NAME_SENSORS;
|
||||
opt->title = SANE_TITLE_SENSORS;
|
||||
opt->desc = SANE_DESC_SENSORS;
|
||||
opt->type = SANE_TYPE_GROUP;
|
||||
opt->constraint_type = SANE_CONSTRAINT_NONE;
|
||||
}
|
||||
|
@ -4371,6 +4459,42 @@ setup_buffers (struct fujitsu *s)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* This routine issues a SCSI GET WINDOW command to the scanner
|
||||
*/
|
||||
static SANE_Status
|
||||
get_window (struct fujitsu *s)
|
||||
{
|
||||
unsigned char buffer[max_WDB_size];
|
||||
size_t bufferLen;
|
||||
SANE_Status ret = SANE_STATUS_GOOD;
|
||||
|
||||
DBG (10, "get_window: start\n");
|
||||
|
||||
/* The command specifies the number of bytes in the data phase
|
||||
* the data phase has a header, followed by 1 or 2 window desc blocks
|
||||
* the header specifies the number of bytes in 1 window desc block
|
||||
*/
|
||||
|
||||
bufferLen = max_WDB_size;
|
||||
|
||||
/* cmd has data phase byte count */
|
||||
set_GW_xferlen(get_windowB.cmd,bufferLen);
|
||||
|
||||
ret = do_cmd (
|
||||
s, 1, 0,
|
||||
get_windowB.cmd, get_windowB.size,
|
||||
NULL, 0,
|
||||
buffer, &bufferLen
|
||||
);
|
||||
|
||||
hexdump(10, "GW: <<", buffer, bufferLen);
|
||||
|
||||
DBG (10, "get_window: finish\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* This routine issues a SCSI SET WINDOW command to the scanner, using the
|
||||
* values currently in the scanner data structure.
|
||||
|
|
|
@ -15,7 +15,7 @@ enum fujitsu_Option
|
|||
{
|
||||
OPT_NUM_OPTS = 0,
|
||||
|
||||
OPT_MODE_GROUP,
|
||||
OPT_STANDARD_GROUP,
|
||||
OPT_SOURCE, /*fb/adf/front/back/duplex*/
|
||||
OPT_MODE, /*mono/gray/color*/
|
||||
OPT_X_RES, /*a range or a list*/
|
||||
|
@ -160,8 +160,36 @@ struct fujitsu
|
|||
int adbits;
|
||||
int buffer_bytes;
|
||||
|
||||
/*FIXME: do we need the std cmd list? */
|
||||
/*supported scsi commands*/
|
||||
int has_cmd_msen;
|
||||
int has_cmd_msel;
|
||||
|
||||
int has_cmd_lsen;
|
||||
int has_cmd_lsel;
|
||||
int has_cmd_change;
|
||||
int has_cmd_rbuff;
|
||||
int has_cmd_wbuff;
|
||||
int has_cmd_cav;
|
||||
int has_cmd_comp;
|
||||
int has_cmd_gdbs;
|
||||
|
||||
int has_cmd_op;
|
||||
int has_cmd_send;
|
||||
int has_cmd_read;
|
||||
int has_cmd_gwin;
|
||||
int has_cmd_swin;
|
||||
int has_cmd_sdiag;
|
||||
int has_cmd_rdiag;
|
||||
int has_cmd_scan;
|
||||
|
||||
int has_cmd_msen6;
|
||||
int has_cmd_copy;
|
||||
int has_cmd_rel;
|
||||
int has_cmd_runit;
|
||||
int has_cmd_msel6;
|
||||
int has_cmd_inq;
|
||||
int has_cmd_rs;
|
||||
int has_cmd_tur;
|
||||
|
||||
/*FIXME: there are more vendor cmds? */
|
||||
int has_cmd_subwindow;
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
|
||||
:backend "fujitsu" ; name of backend
|
||||
:url "http://www.thebility.com/fujitsu/"
|
||||
:version "1.0.61" ; version of backend
|
||||
:version "1.0.62" ; version of backend
|
||||
:manpage "sane-fujitsu" ; name of manpage (if it exists)
|
||||
:comment "Backend re-written for SANE release 1.0.18, see sane-fujitsu manpage"
|
||||
:devicetype :scanner ; start of a list of devices....
|
||||
|
|
Ładowanie…
Reference in New Issue