diff options
Diffstat (limited to 'backend/pie-scsidef.h')
-rw-r--r-- | backend/pie-scsidef.h | 433 |
1 files changed, 433 insertions, 0 deletions
diff --git a/backend/pie-scsidef.h b/backend/pie-scsidef.h new file mode 100644 index 0000000..d86a0c9 --- /dev/null +++ b/backend/pie-scsidef.h @@ -0,0 +1,433 @@ +/* ----------------------------------------------------------------------------- */ + +/* sane - Scanner Access Now Easy. + + pie-scsidef.h: scsi-definiton header file for PIE scanner driver. + + Copyright (C) 2000 Simon Munton, based on the umax-scsidef.h by Oliver Rauch & Michael Johnson + + This file is part of the SANE package. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. + + As a special exception, the authors of SANE give permission for + additional uses of the libraries contained in this release of SANE. + + The exception is that, if you link a SANE library with other files + to produce an executable, this does not by itself cause the + resulting executable to be covered by the GNU General Public + License. Your use of that executable is in no way restricted on + account of linking the SANE library code into it. + + This exception does not, however, invalidate any other reasons why + the executable file might be covered by the GNU General Public + License. + + If you submit changes to SANE to the maintainers to be included in + a subsequent release, you agree by submitting the changes that + those changes may be distributed with this exception intact. + + If you write modifications of your own for SANE, it is your choice + whether to permit this exception to apply to your modifications. + If you do not wish that, delete this exception notice. + */ + +/* --------------------------------------------------------------------------------------------------------- */ + + +#ifndef PIE_SCSIDEF_H +#define PIE_SCSIDEF_H + + + +/* --------------------------------------------------------------------------------------------------------- */ + +/* I'm using functions derived from Eric Youngdale's scsiinfo + * program here for dealing with parts of SCSI commands. + */ + +static inline void setbitfield(unsigned char * pageaddr, int mask, int shift, int val) +{ *pageaddr = (*pageaddr & ~(mask << shift)) | ((val & mask) << shift); } + +static inline void resetbitfield(unsigned char * pageaddr, int mask, int shift, int val) +{ *pageaddr = (*pageaddr & ~(mask << shift)) | (((!val) & mask) << shift); } + +static inline int getbitfield(unsigned char * pageaddr, int mask, int shift) +{ return ((*pageaddr >> shift) & mask); } + +/* ------------------------------------------------------------------------- */ + +static inline int getnbyte(unsigned char * pnt, int nbytes) +{ + unsigned int result = 0; + int i; + + for(i=0; i<nbytes; i++) + result = (result << 8) | (pnt[i] & 0xff); + return result; +} + +/* ------------------------------------------------------------------------- */ + +static inline int getnbyte1(unsigned char * pnt, int nbytes) +{ + unsigned int result = 0; + int i; + + for(i=nbytes-1; i >= 0; i--) + result = (result << 8) | (pnt[i] & 0xff); + return result; +} + +/* ------------------------------------------------------------------------- */ + +static inline void putnbyte(unsigned char * pnt, unsigned int value, unsigned int nbytes) +{ + int i; + + for(i=nbytes-1; i>= 0; i--) + { + pnt[i] = value & 0xff; + value = value >> 8; + } +} + + +/* ------------------------------------------------------------------------- */ + +static inline void putnbyte1(unsigned char * pnt, unsigned int value, unsigned int nbytes) +{ + unsigned int i; + + for(i=0; i< nbytes; i++) + { + pnt[i] = value & 0xff; + value = value >> 8; + } +} + + +/* --------------------------------------------------------------------------------------------------------- */ + + +/* Not all of these are defined in scsi.h, so we'll make sure + * we agree about them here... + */ +#define TEST_UNIT_READY 0x00 +#define REQUEST_SENSE 0x03 +#define INQUIRY 0x12 +#define RESERVE_UNIT 0x16 +#define RELEASE_UNIT 0x17 +#define SCAN 0x1B +#define READ 0x08 +#define WRITE 0x0A +#define PARAM 0x0F +#define MODE 0x15 + +/* --------------------------------------------------------------------------------------------------------- */ + + +#define STD_WDB_LEN 0x28 /* wdb_len if nothing is set by inquiry */ + + +/* --------------------------------------------------------------------------------------------------------- */ + + +/* SCSI commands */ + +typedef struct +{ + unsigned char *cmd; + size_t size; +} scsiblk; + + +/* --------------------------------------------------------------------------------------------------------- */ + + +#define set_inquiry_return_size(icb,val) icb[0x04]=val +static unsigned char inquiryC[] = { INQUIRY, 0x00, 0x00, 0x00, 0x7c, 0x00 }; +static scsiblk inquiry = { inquiryC, sizeof(inquiryC) }; + + +/* --------------------------------------------------------------------------------------------------------- */ + + +#define get_inquiry_periph_qual(in) getbitfield(in, 0x07, 5) +# define IN_periph_qual_lun 0x00 +# define IN_periph_qual_nolun 0x03 +#define get_inquiry_periph_devtype(in) getbitfield(in, 0x1f, 0) +# define IN_periph_devtype_scanner 0x06 +# define IN_periph_devtype_unknown 0x1f + +#define get_inquiry_rmb(in) getbitfield(in + 0x01, 0x01, 7) +#define get_inquiry_0x01_bit6(in) getbitfield(in + 0x01, 0x01, 6) +#define get_inquiry_0x01_bit5(in) getbitfield(in + 0x01, 0x01, 5) + +#define get_inquiry_iso_version(in) getbitfield(in + 0x02, 0x03, 6) +#define get_inquiry_ecma_version(in) getbitfield(in + 0x02, 0x07, 3) +#define get_inquiry_ansi_version(in) getbitfield(in + 0x02, 0x07, 0) + +#define get_inquiry_aenc(in) getbitfield(in + 0x03, 0x01, 7) +#define get_inquiry_tmiop(in) getbitfield(in + 0x03, 0x01, 6) +#define get_inquiry_0x03_bit5(in) getbitfield(in + 0x03, 0x01, 5) +#define get_inquiry_0x03_bit4(in) getbitfield(in + 0x03, 0x01, 4) +#define get_inquiry_response_format(in) getbitfield(in + 0x03, 0x0f, 0) +# define IN_recognized 0x02 + +#define get_inquiry_additional_length(in) in[0x04] +#define set_inquiry_length(out,n) out[0x04]=n-5 + +#define get_inquiry_vendor(in, buf) strncpy(buf, in + 0x08, 0x08) +#define get_inquiry_product(in, buf) strncpy(buf, in + 0x10, 0x010) +#define get_inquiry_version(in, buf) strncpy(buf, in + 0x20, 0x04) + +#define get_inquiry_max_x_res(in) getnbyte1(in + 0x24, 2) +#define get_inquiry_max_y_res(in) getnbyte1(in + 0x26, 2) +#define get_inquiry_fb_max_scan_width(in) getnbyte1(in + 0x28, 2) +#define get_inquiry_fb_max_scan_length(in) getnbyte1(in + 0x2a, 2) +#define get_inquiry_filters(in) in[0x2c] +#define get_inquiry_color_depths(in) in[0x2d] +#define get_inquiry_color_format(in) in[0x2e] +#define get_inquiry_image_format(in) in[0x30] +#define get_inquiry_scan_capability(in) in[0x31] +#define get_inquiry_optional_devices(in) in[0x32] +#define get_inquiry_enhancements(in) in[0x33] +#define get_inquiry_gamma_bits(in) in[0x34] +#define get_inquiry_last_filter(in) in[0x35] +#define get_inquiry_fast_preview_res(in) getnbyte1(in + 0x36, 2) +#define get_inquiry_halftones(in) in[0x60] +#define get_inquiry_halftone_max_width(in) in[0x61] +#define get_inquiry_halftone_max_heighgt(in) in[0x62] +#define get_inquiry_max_windows(in) in[0x63] +#define get_inquiry_min_highlight(in) in[0x65] +#define get_inquiry_max_shadow(in) in[0x66] +#define get_inquiry_cal_eqn(in) in[0x67] +#define get_inquiry_max_exp(in) getnbyte1(in + 0x68, 2) +#define get_inquiry_min_exp(in) getnbyte1(in + 0x6a, 2) +#define get_inquiry_trans_x1(in) getnbyte1(in + 0x6c, 2) +#define get_inquiry_trans_y1(in) getnbyte1(in + 0x6e, 2) +#define get_inquiry_trans_x2(in) getnbyte1(in + 0x70, 2) +#define get_inquiry_trans_y2(in) getnbyte1(in + 0x72, 2) + +#define INQ_ONE_PASS_COLOR 0x80 +#define INQ_FILTER_BLUE 0x08 +#define INQ_FILTER_GREEN 0x04 +#define INQ_FILTER_RED 0x02 +#define INQ_FILTER_NEUTRAL 0x01 + +#define INQ_COLOR_DEPTH_16 0x20 +#define INQ_COLOR_DEPTH_12 0x10 +#define INQ_COLOR_DEPTH_10 0x08 +#define INQ_COLOR_DEPTH_8 0x04 +#define INQ_COLOR_DEPTH_4 0x02 +#define INQ_COLOR_DEPTH_1 0x01 + +#define INQ_COLOR_FORMAT_INDEX 0x04 +#define INQ_COLOR_FORMAT_LINE 0x02 +#define INQ_COLOR_FORMAT_PIXEL 0x01 + +#define INQ_IMG_FMT_OKLINE 0x08 +#define INQ_IMG_FMT_BLK_ONE 0x04 +#define INQ_IMG_FMT_MOTOROLA 0x02 +#define INQ_IMG_FMT_INTEL 0x01 + +#define INQ_CAP_PWRSAV 0x80 +#define INQ_CAP_EXT_CAL 0x40 +#define INQ_CAP_FAST_PREVIEW 0x10 +#define INQ_CAP_DISABLE_CAL 0x08 +#define INQ_CAP_SPEEDS 0x07 + +#define INQ_OPT_DEV_MPCL 0x80 +#define INQ_OPT_DEV_TP1 0x04 +#define INQ_OPT_DEV_TP 0x02 +#define INQ_OPT_DEV_ADF 0x01 + +#define INQ_ENHANCE_EDGE 0x02 + +#define INQ_LAST_FILTER_BLUE 0x08 +#define INQ_LAST_FILTER_GREEN 0x04 +#define INQ_LAST_FILTER_RED 0x02 +#define INQ_LAST_FILTER_NEUTRAL 0x01 + +#define INQ_DWNLD_HALFTONE 0x80 +#define INQ_NUM_HALFTONES 0x7f + + +/* --------------------------------------------------------------------------------------------------------- */ + + +static unsigned char test_unit_readyC[] = { TEST_UNIT_READY, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +static scsiblk test_unit_ready = { test_unit_readyC,sizeof(test_unit_readyC) }; + + +/* --------------------------------------------------------------------------------------------------------- */ + + +static unsigned char reserve_unitC[] = { RESERVE_UNIT, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +static scsiblk reserve_unit = { reserve_unitC, sizeof(reserve_unitC) }; + + +/* --------------------------------------------------------------------------------------------------------- */ + + +static unsigned char release_unitC[] = { RELEASE_UNIT, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +static scsiblk release_unit = { release_unitC, sizeof(release_unitC) }; + + +/* --------------------------------------------------------------------------------------------------------- */ + + +static unsigned char paramC[] = { PARAM, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +static scsiblk param = { paramC, sizeof(paramC) }; + +#define set_param_length(in, l) putnbyte(in + 3, (l), 2) + +#define get_param_scan_width(b) getnbyte1(b, 2) +#define get_param_scan_lines(b) getnbyte1(b + 2, 2) +#define get_param_scan_bytes(b) getnbyte1(b + 4, 2) +#define get_param_scan_filter_offset1(b) b[6] +#define get_param_scan_filter_offset2(b) b[7] +#define get_param_scan_period(b) getnbyte1(b + 8, 4) +#define get_param_scsi_xfer_rate(b) getnbyte1(b + 12, 2) +#define get_param_scan_available_lines(b) getnbyte1(b + 14, 2) + +/* --------------------------------------------------------------------------------------------------------- */ + + +static unsigned char writeC[] = { WRITE, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +static scsiblk swrite = { writeC, sizeof(writeC) }; + +#define set_write_length(in, l) putnbyte(in + 2, (l), 3) + + +/* --------------------------------------------------------------------------------------------------------- */ + + +static unsigned char modeC[] = { MODE, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +static scsiblk smode = { modeC, sizeof(modeC) }; + +#define set_mode_length(in, l) putnbyte(in + 3, (l), 2) + +/* --------------------------------------------------------------------------------------------------------- */ + + +static unsigned char scanC[] = { SCAN, 0x00, 0x00, 0x00, 0x01, 0x00 }; + +static scsiblk scan = { scanC, sizeof(scanC) }; + +#define set_scan_cmd(in, l) in[4] = l + +/* --------------------------------------------------------------------------------------------------------- */ + + +/* sread instead of read because read is a libc primitive */ +static unsigned char sreadC[] = { READ, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +static scsiblk sread = { sreadC, sizeof(sreadC) }; + +#define set_read_length(in, l) putnbyte(in + 2, (l), 3) + +/* --------------------------------------------------------------------------------------------------------- */ + +#if 0 +static unsigned char request_senseC[] = { REQUEST_SENSE, 0x00, 0x00, 0x00, 0x00, 0x00 }; +#define set_RS_allocation_length(sb,val) sb[0x04]=val +#define set_RS_LUN(sb,val) setbitfield(sb + 0x01, 7, 5) /* ??? */ + +static scsiblk request_sense = { request_senseC, sizeof(request_senseC) }; +#endif + +/* defines for request sense return block */ +#define get_RS_information_valid(b) getbitfield(b + 0x00, 1, 7) +#define get_RS_error_code(b) getbitfield(b + 0x00, 0x7f, 0) +#define get_RS_filemark(b) getbitfield(b + 0x02, 1, 7) +#define get_RS_EOM(b) getbitfield(b + 0x02, 1, 6) +#define get_RS_ILI(b) getbitfield(b + 0x02, 1, 5) +#define get_RS_sense_key(b) getbitfield(b + 0x02, 0x0f, 0) +#define get_RS_information(b) getnbyte(b+0x03, 4) +#define get_RS_additional_length(b) b[0x07] +#define get_RS_ASC(b) b[0x0c] +#define get_RS_ASCQ(b) b[0x0d] +#define get_RS_SKSV(b) getbitfield(b+0x0f,1,7) /* valid */ +#define get_RS_CD(b) getbitfield(b+0x0f,1,6) /* 1=CDB */ +#define get_RS_field_pointer(b) getnbyte(b+0x10, 2) + +#define get_RS_additional_sense(b) getnbyte(b+0x12, 2) + +#define rs_return_block_size 0x1f + + +/* --------------------------------------------------------------------------------------------------------- */ + + +static char *sense_str[] = {"NO SENSE", + "RECOVERED ERROR", + "NOT READY", + "MEDIUM ERROR", + "HARDWARE ERROR", + "ILLEGAL REQUEST", + "UNIT ATTENTION", + "DATA PROTECT", + "BLANK CHECK", + "VENDOR SPECIFIC", + "COPY ABORTED", + "ABORTED COMMAND", + "EQUAL", + "VOLUME OVERFLOW", + "MISCOMPARE", + "??? - SENSE 0FH" }; + +/* --------------------------------------------------------------------------------------------------------- */ + +/* command codes used in the data part of a SCSI write command */ + +#define SET_POWER_SAVE_CONTROL 0x01 +#define DWNLD_GAMMA_TABLE 0x10 +#define DWNLD_HALFTONE 0x11 +#define SET_SCAN_FRAME 0x12 +#define SET_EXP_TIME 0x13 +#define SET_HIGHLIGHT_SHADOW 0x14 +#define SEND_CAL_DATA 0x16 + +#define READ_POWER_SAVE_CONTROL 0x81 +#define READ_GAMMA_TABLE 0x90 +#define READ_HALFTONE 0x91 +#define READ_SCAN_FRAME 0x92 +#define READ_EXP_TIME 0x93 +#define READ_HIGHLIGHT_SHADOW 0x94 +#define READ_CAL_INFO 0x95 + + +#define set_command(in, cmd) putnbyte1(in, cmd, 2) +#define set_data_length(in, len) putnbyte1(in + 2, len, 2) +#define set_data(in, ofs, val, num) putnbyte1(in + ofs, val, num) + + + +#define FILTER_BLUE 0x08 +#define FILTER_GREEN 0x04 +#define FILTER_RED 0x02 +#define FILTER_NEUTRAL 0x01 + + +#endif |