diff --git a/ChangeLog b/ChangeLog index d16dd662c..3bdc8caff 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-05-20 m. allan noah + * 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 * include/sane/sane.h: add SANE_STATUS_WARMING_UP and SANE_STATUS_HW_LOCKED, remove SANE_CAP_ALWAYS_SETTABLE, diff --git a/backend/fujitsu-scsi.h b/backend/fujitsu-scsi.h index 7208a3868..011baea83 100644 --- a/backend/fujitsu-scsi.h +++ b/backend/fujitsu-scsi.h @@ -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 */ diff --git a/backend/fujitsu.c b/backend/fujitsu.c index 343dfb539..ecca5b14e 100644 --- a/backend/fujitsu.c +++ b/backend/fujitsu.c @@ -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. diff --git a/backend/fujitsu.h b/backend/fujitsu.h index d970a581a..0347b213a 100644 --- a/backend/fujitsu.h +++ b/backend/fujitsu.h @@ -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; diff --git a/doc/descriptions/fujitsu.desc b/doc/descriptions/fujitsu.desc index da826c868..911b9960e 100644 --- a/doc/descriptions/fujitsu.desc +++ b/doc/descriptions/fujitsu.desc @@ -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....