diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2015-09-27 08:20:20 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2015-09-27 08:20:20 +0200 |
commit | e94622c319e4307617b202f19d3ec05b21a9bb49 (patch) | |
tree | c5ddf44352b9bd47aeb3eb432ba79638079efe25 /backend/pieusb_scancmd.h | |
parent | 6f2255c9648b175d51e2c8e5e9670557f9dc4ee1 (diff) |
merge to 1.0.25+git20150927
Diffstat (limited to 'backend/pieusb_scancmd.h')
-rw-r--r-- | backend/pieusb_scancmd.h | 378 |
1 files changed, 378 insertions, 0 deletions
diff --git a/backend/pieusb_scancmd.h b/backend/pieusb_scancmd.h new file mode 100644 index 0000000..0dee646 --- /dev/null +++ b/backend/pieusb_scancmd.h @@ -0,0 +1,378 @@ +/* sane - Scanner Access Now Easy. + + pieusb_scancmd.h + + Copyright (C) 2012-2015 Jan Vleeshouwers, Michael Rickmann, Klaus Kaempf + + 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 PIEUSB_SCANCMD_H +#define PIEUSB_SCANCMD_H + +#include "../include/sane/sane.h" + +/* ========================================================================= + * + * Data-structures used by scanner commands + * + * For SENSE descriptions, see SCSI-2 p158, table 67 (p469 ASC/Q alphabetically) + * For the INQUIRY command, see SCSI-2 p141 table 45, 46, 47 + * + * 2-byte short ints are represented by 4-byte SANE_Int types + * + * ========================================================================= */ + +struct Pieusb_Scanner_Properties { + SANE_Byte deviceType; /* 0x06 = scanner */ + SANE_Byte additionalLength; /* including this byte: 0xb4 = 180, so total structure 184 bytes */ + SANE_Char vendor[9]; /* actually 8 bytes, not null-terminated ...PIE ... */ + SANE_Char product[17]; /* actually 16 bytes, null-terminated ...SF Scanner... */ + SANE_Char productRevision[5]; /* actually 4 bytes, not null-terminated ...1.70... */ + /* 1st Vendor-specific block, 20 bytes, see pie_get_inquiry_values(), partially: */ + SANE_Int maxResolutionX; /* 7200 maximum scan resolution in x direction */ + SANE_Int maxResolutionY; /* 7200 maximum scan resolution in y direction */ + SANE_Int maxScanWidth; /* 10680 flatbed_max_scan_width (& calibration block size) */ + SANE_Int maxScanHeight; /* 6888 flatbed_max_scan_height */ + SANE_Byte filters; /* 0x9e = 10011110 ?-0-0-OnePassColor-B-G-R-N => additional infrared? */ + SANE_Byte colorDepths; /* 0x35 = 00110101 0-0-16-12-10-8-4-1 */ + SANE_Byte colorFormat; /* 0x07 = 00000111 0-0-0-0-0-Index-Line-Pixel */ + SANE_Byte imageFormat; /* 0x09 = 00001001 0-0-0-0-OKLine-BlkOne-Motorola-Intel */ + SANE_Byte scanCapability; + /* 0x4b = 01001011 PowerSave-ExtCal-0-FastPreview-DisableCal-[CalSpeeds=3] + * PowerSave: no + * ExtCal: yes => + * FastPreview: no + * DisableCal: yes => can calibration be disabled? + * CalSpeeds: 3 => 1 line, 13 lines, 31 lines */ + SANE_Byte optionalDevices; + /* 0x61 = 01100001 MultiPageLoad-?-?-0-0-TransModule1-TransModule-AutoDocFeeder => additional? + * MultiPageLoad: no + * ?: yes + * ?: yes + * TransModule1: no + * TransModule: no + * AutoDocFeeder: yes */ + SANE_Byte enhancements; /* 0x02 = no info in pie.c */ + SANE_Byte gammaBits; /* 0x0c = 00001100 = 12 ? used when downloading gamma table ... does not happen */ + SANE_Byte lastFilter; /* 0x00 = ? no info in pie.c, not used */ + SANE_Int previewScanResolution; /* 0x2c01 = 300 fast preview scan resolution */ + /* Reserved (56-95) */ + /* SANE_Byte div_56[40]; */ + /* 2nd vendor specific block (36 bytes at offset 96) */ + SANE_Char firmwareVersion[5]; /* actually 4 bytes, not null terminated "1.05" */ + SANE_Byte halftones; /* 0x08 = halftones (4 LSbits) = 00001000 ? */ + SANE_Byte minumumHighlight; /* 0x64 = 100 */ + SANE_Byte maximumShadow; /* 0x64 = 100 */ + SANE_Byte calibrationEquation; /* 0x01 ? see pie_perform_cal() */ + SANE_Int maximumExposure; /* 0xc409 = 2500 (units?) */ + SANE_Int minimumExposure; /* 0x6400 = 100 (units?) */ + SANE_Int x0; /* 0xd002 = 720 transparency top left x */ + SANE_Int y0; /* 0x8604 = 1158 transparency top left y */ + SANE_Int x1; /* 0xbc10 = 4284 transparency bottom right x */ + SANE_Int y1; /* 0xc015 = 5568 transparency bottom right y */ + SANE_Int model; /* 0x3000 => model number */ + /* SANE_Int div_118; 0x0000 meaning? */ + SANE_Char production[4]; /* null terminated */ + SANE_Char timestamp[20]; /* null terminated */ + SANE_Byte signature[40]; /* null terminated */ +}; + +struct Pieusb_Sense { + /* 14 bytes according to SCSI-2 p158, table 67 (p469 ASC/Q alphabetically) */ + SANE_Byte errorCode; /* 0x70 or 0x71 */ + SANE_Byte segment; + SANE_Byte senseKey; /* sense key is actually this value & 0x0F - table 69 */ + SANE_Byte info[4]; + SANE_Byte addLength; /* should be 0x07 (remaining struct length including this byte) */ + SANE_Byte cmdInfo[4]; /* command specific information */ + SANE_Byte senseCode; /* abbreviated ASC - table 71 */ + SANE_Byte senseQualifier; /* abbreviated ASCQ - table 71 */ +}; + +struct Pieusb_Scanner_State { + SANE_Byte buttonPushed; /* 0x01 if pushed */ + SANE_Byte warmingUp; /* 0x01 if warming up, 0x00 if not */ + SANE_Byte scanning; /* bit 6 set if SCAN active, bit 7 motor direction inverted (not analysed in detail) */ +}; + +struct Pieusb_Scan_Parameters { + SANE_Int width; /* Number of pixels on a scan line */ + SANE_Int lines; /* Number of lines in the scan. Value depends on color format, see Pieusb_Mode. */ + SANE_Int bytes; /* Number of bytes on a scan line. Value depends on color format. */ + SANE_Byte filterOffset1; /* 0x08 in the logs, but may also be set to 0x16, they seem to be used in “line”-format only. */ + SANE_Byte filterOffset2; /* 0x08 in the logs, but may also be set to 0x16, they seem to be used in “line”-format only. */ + SANE_Int period; /* Seems to be unused */ + SANE_Int scsiTransferRate; /* Don't use, values cannot be trusted */ + SANE_Int availableLines; /* The number of currently available scanned lines. Value depends on color format. Returns a value >0 if PARAM is called while scanning is in progress */ + SANE_Byte motor; /* Motor direction in bit 0 */ +}; + +struct Pieusb_Mode { + /* SANE_Byte size; of remaining data, not useful */ + SANE_Int resolution; /* in dpi */ + SANE_Byte passes; + /* 0x80 = One pass color; 0x90 = One pass RGBI; + * bit 7 : one-pass-color bit (equivalent to RGB all set?) + * bit 6 & 5: unused + * bit 4 : Infrared + * bit 3 : Blue + * bit 2 : Green + * bit 1 : Red + * bit 0: Neutral (not supported, ignored) */ + SANE_Byte colorDepth; + /* 0x04 = 8, 0x20 = 16 bit + * bit 7 & 6 : 0 (unused) + * bit 5 : 16 bit + * bit 4 : 12 bit + * bit 3 : 10 bit + * bit 2 : 8 bit + * bit 1 : 4 bit + * bit 0 : 1 bit */ + SANE_Byte colorFormat; + /* 0x04 = index, cf. INQUIRY + * bit 7-3 : 0 (unused) + * bit 2 : Index = scanned data are lines preceeded by a two-byte index, 'RR', 'GG', 'BB', or 'II' + * bit 1 : Line = scanned data are (probably) lines in RGBI order (needs testing) + * bit 0 : Pixel = scanned data are always RGB-pixels, i.e. 3x2 bytes at depth = 16 bits, 3 bytes + * at depth = 8 bits, and 3 packed bytes at depth = 1. This is also the case in + * a single color or gray scale scan; in these cases only the first pixel contains + * valid data. */ + SANE_Byte byteOrder; /* 0x01 = Intel; only bit 0 used */ + SANE_Bool sharpen; /* byte 9 bit 1 */ + SANE_Bool skipShadingAnalysis; /* byte 9 bit 3 */ + SANE_Bool fastInfrared; /* byte 9 bit 7 */ + /* bit 7 : “fast infrared” flag + * bit 6,5,4 : 0 (unused) + * bit 3 : “skip calibration” flag (skip collecting shading information) + * bit 2 : 0 (unused) + * bit 1 : “sharpen” flag (only effective with fastInfrared off, one-pass-color and no extra BADF-entries) + * bit 0 : 0 (unused) */ + SANE_Byte halftonePattern; /* 0x00 = no halftone pattern */ + SANE_Byte lineThreshold; /* 0xFF = 100% */ +}; + +struct Pieusb_Settings { + SANE_Int saturationLevel[3]; + /* The average pixel values for the three colors Red, Green and Blue, + * which are the result of optimizing the Timer 1 counts so that Red and + * Blue values are least 90% of full scale (58981) and the Green value is + * at least 80% (52428). These levels are only determined during warming up. */ + SANE_Int exposureTime[4]; + /* Optimized exposure times for Red, Green and Blue. The exposure times are + * Timer 1 counts which define when Timer 1 interrupts. These values are + * only determined at startup. + * Exposure time for Infrared. The value is optimized and set at startup + * with the other exposure times. Quite often, it is subsequently reset to + * a default value (0x0B79). */ + SANE_Word offset[4]; + /* Optimized offsets for Red, Green and Blue. See above. These values are + * also updated before outputting the CCD-mask. + * Element 4 is offset for Infrared. */ + SANE_Word gain[4]; + /* Optimized gains for Red, Green and Blue. See the remark for + * exposureTime above. Element 4 is gain for Infrared. */ + SANE_Byte light; + /* Current light level. The stability of the light source is tested during + * warming up. The check starts with a light value 7 or 6, and decrements + * it when the light warms up. At a light value of 4, the scanner produces + * stable scans (i.e. successive “white” scan values don't differ more + * than 0x200). */ + SANE_Int minimumExposureTime; + /* Fixed value: 0x0b79 (2937) */ + SANE_Byte extraEntries; + SANE_Byte doubleTimes; + /* Originally 20 unused bytes (uninitialized memory) + * To complete the mapping to the Pieusb_Settings_Condensed struct, + * the last two bytes are given an explicit meaning. */ + /* SANE_Int exposureTimeIR; */ + /* SANE_Byte offsetIR; */ + /* SANE_Byte gainIR; */ +}; + +/* Not used, Pieusb_Settings contains the same fields (after a bit of juggling) */ +struct Pieusb_Settings_Condensed { + SANE_Int exposureTime[4]; /* => Pieusb_Settings.exposureTime */ + SANE_Byte offset[4]; /* => Pieusb_Settings.offset */ + SANE_Byte gain[4]; /* => Pieusb_Settings.gain */ + SANE_Byte light; /* => Pieusb_Settings.light */ + SANE_Byte extraEntries; /* => Pieusb_Settings.extraEntries */ + SANE_Byte doubleTimes; /* => Pieusb_Settings.doubleTimes */ +}; + +struct Pieusb_Halftone_Pattern { + SANE_Int code; /* 0x91 */ + /*TODO */ +}; + +struct Pieusb_Scan_Frame { + SANE_Int index; /* scan frame index (0-7) */ + SANE_Int x0; /* top left, is origin */ + SANE_Int y0; + SANE_Int x1; /* bottom right */ + SANE_Int y1; +}; + +struct Pieusb_Exposure_Time_Color { + SANE_Int filter; /* color mask 0x02, 0x04 or 0x08 for R, G, B */ + SANE_Int value; /* relative exposure time 0 - 100 */ +}; + +struct Pieusb_Exposure_Time { + SANE_Int code; /* 0x93 */ + SANE_Int size; /* number of bytes in rest of structure */ + struct Pieusb_Exposure_Time_Color color[3]; /* not all elements may actually be used */ +}; + +struct Pieusb_Highlight_Shadow_Color { + SANE_Int filter; /* color mask 0x02, 0x04 or 0x08 for R, G, B */ + SANE_Int value; /* 0-100 */ +}; + +struct Pieusb_Highlight_Shadow { + SANE_Int code; /* 0x94 */ + SANE_Int size; /* number of bytes in rest of structure */ + struct Pieusb_Highlight_Shadow_Color color[3]; +}; + +struct Pieusb_Shading_Parameters_Info { + SANE_Byte type; /* 0x00, 0x08, 0x10, 0x20; RGBI(?) */ + SANE_Byte sendBits; /* 0x10 = 16 */ + SANE_Byte recieveBits; /* 0x10 = 16 */ + SANE_Byte nLines; /* 0x2D = 45 */ + SANE_Int pixelsPerLine; /* 0x14dc = 5340 */ +}; + +#define SHADING_PARAMETERS_INFO_COUNT 4 +struct Pieusb_Shading_Parameters { + SANE_Byte code; /* 0x95 */ + SANE_Int size; /* number of bytes in rest of structure (0x1c=28) */ + SANE_Byte calInfoCount; /* number of individual info structures (=0x04) */ + SANE_Byte calInfoSize; /* size of individual info structure (=0x06) */ + SANE_Int div_6; /* 0x0004, meaning not clear */ + struct Pieusb_Shading_Parameters_Info cal[SHADING_PARAMETERS_INFO_COUNT]; +}; + +typedef enum { + PIEUSB_STATUS_GOOD = 0, /* 0 everything A-OK */ + PIEUSB_STATUS_UNSUPPORTED, /* 1 operation is not supported */ + PIEUSB_STATUS_CANCELLED, /* 2 operation was cancelled */ + PIEUSB_STATUS_DEVICE_BUSY, /* 3 device is busy; try again later */ + PIEUSB_STATUS_INVAL, /* 4 data is invalid (includes no dev at open) */ + PIEUSB_STATUS_EOF, /* 5 no more data available (end-of-file) */ + PIEUSB_STATUS_JAMMED, /* 6 document feeder jammed */ + PIEUSB_STATUS_NO_DOCS, /* 7 document feeder out of documents */ + PIEUSB_STATUS_COVER_OPEN, /* 8 scanner cover is open */ + PIEUSB_STATUS_IO_ERROR, /* 9 error during device I/O */ + PIEUSB_STATUS_NO_MEM, /* 10 out of memory */ + PIEUSB_STATUS_ACCESS_DENIED, /* 11 access to resource has been denied */ + PIEUSB_STATUS_WARMING_UP, /* 12 lamp not ready, please retry */ + PIEUSB_STATUS_HW_LOCKED, /* 13 scanner mechanism locked for transport */ + PIEUSB_STATUS_MUST_CALIBRATE /* 14 */ +} PIEUSB_Status; + +/* Structures used by the USB functions */ + +struct Pieusb_Command_Status { + PIEUSB_Status pieusb_status; + SANE_Byte senseKey; /* sense key: see Pieusb_Sense */ + SANE_Byte senseCode; /* sense code */ + SANE_Byte senseQualifier; /* sense code qualifier */ +}; + +typedef struct Pieusb_Scanner_Properties Pieusb_Scanner_Properties; + +typedef enum { + SLIDE_NEXT = 0x04, SLIDE_PREV = 0x05, SLIDE_LAMP_ON = 0x10, SLIDE_RELOAD = 0x40 +} slide_action; + +void sanei_pieusb_cmd_slide(SANE_Int device_number, slide_action action, struct Pieusb_Command_Status *status); + +/* Scanner commands */ + +void sanei_pieusb_cmd_test_unit_ready(SANE_Int device_number, struct Pieusb_Command_Status *status); + +void sanei_pieusb_cmd_get_sense(SANE_Int device_number, struct Pieusb_Sense* sense, struct Pieusb_Command_Status *status, PIEUSB_Status *ret); + +void sanei_pieusb_cmd_get_halftone_pattern(SANE_Int device_number, SANE_Int index, struct Pieusb_Halftone_Pattern* pattern, struct Pieusb_Command_Status *status); +void sanei_pieusb_cmd_set_halftone_pattern(SANE_Int device_number, SANE_Int index, struct Pieusb_Halftone_Pattern* pattern, struct Pieusb_Command_Status *status); + +void sanei_pieusb_cmd_get_scan_frame(SANE_Int device_number, SANE_Int index, struct Pieusb_Scan_Frame* frame, struct Pieusb_Command_Status *status); +void sanei_pieusb_cmd_set_scan_frame(SANE_Int device_number, SANE_Int index, struct Pieusb_Scan_Frame* frame, struct Pieusb_Command_Status *status); + +void sanei_pieusb_cmd_17(SANE_Int device_number, SANE_Int value, struct Pieusb_Command_Status *status); + +void sanei_pieusb_cmd_get_exposure_time(SANE_Int device_number, SANE_Int colorbits, struct Pieusb_Exposure_Time* time, struct Pieusb_Command_Status *status); +void sanei_pieusb_cmd_set_exposure_time(SANE_Int device_number, struct Pieusb_Exposure_Time* time, struct Pieusb_Command_Status *status); + +void sanei_pieusb_cmd_get_highlight_shadow(SANE_Int device_number, SANE_Int colorbits, struct Pieusb_Highlight_Shadow* hgltshdw, struct Pieusb_Command_Status *status); +void sanei_pieusb_cmd_set_highlight_shadow(SANE_Int device_number, struct Pieusb_Highlight_Shadow* hgltshdw, struct Pieusb_Command_Status *status); + +void sanei_pieusb_cmd_get_shading_parms(SANE_Int device_number, struct Pieusb_Shading_Parameters_Info* shading, struct Pieusb_Command_Status *status); +void sanei_pieusb_cmd_get_scanned_lines(SANE_Int device_number, SANE_Byte* data, SANE_Int lines, SANE_Int size, struct Pieusb_Command_Status *status); + +void sanei_pieusb_cmd_get_ccd_mask(SANE_Int device_number, SANE_Byte* mask, SANE_Int mask_size, struct Pieusb_Command_Status *status); +void sanei_pieusb_cmd_set_ccd_mask(SANE_Int device_number, SANE_Byte colorbits, SANE_Byte* mask, SANE_Int mask_size, struct Pieusb_Command_Status *status); + +/* +void cmdPrepareHalftonePattern(SANE_Int device_number, SANE_Int index, struct Pieusb_Command_Status *status); +void cmdPrepareScanFrame(SANE_Int device_number, SANE_Int index, struct Pieusb_Command_Status *status); +void cmdPrepareRelativeExposureTime(SANE_Int device_number, SANE_Int colorbits, struct Pieusb_Command_Status *status); +void cmdPrepareHighlightShadow(SANE_Int device_number, SANE_Int colorbits, struct Pieusb_Command_Status *status); +void cmdPrepareShadingParameters(SANE_Int device_number, struct Pieusb_Command_Status *status); +*/ + +void sanei_pieusb_cmd_get_parameters(SANE_Int device_number, struct Pieusb_Scan_Parameters* parameters, struct Pieusb_Command_Status *status); + +void sanei_pieusb_cmd_inquiry(SANE_Int device_number, struct Pieusb_Scanner_Properties* inq, SANE_Byte size, struct Pieusb_Command_Status *status); + +void sanei_pieusb_cmd_get_mode(SANE_Int device_number, struct Pieusb_Mode* mode, struct Pieusb_Command_Status *status); +void sanei_pieusb_cmd_set_mode(SANE_Int device_number, struct Pieusb_Mode* mode, struct Pieusb_Command_Status *status); + +void sanei_pieusb_cmd_start_scan(SANE_Int device_number, struct Pieusb_Command_Status *status); +void sanei_pieusb_cmd_stop_scan(SANE_Int device_number, struct Pieusb_Command_Status *status); + +void sanei_pieusb_cmd_set_scan_head(SANE_Int device_number, SANE_Int mode, SANE_Int steps, struct Pieusb_Command_Status *status); + +void sanei_pieusb_cmd_get_gain_offset(SANE_Int device_number, struct Pieusb_Settings* settings, struct Pieusb_Command_Status *status); + +void sanei_pieusb_cmd_set_gain_offset(SANE_Int device_number, struct Pieusb_Settings* settings, struct Pieusb_Command_Status *status); + +void sanei_pieusb_cmd_read_state(SANE_Int device_number, struct Pieusb_Scanner_State* state, struct Pieusb_Command_Status *status); + +#endif /* PIEUSB_SCANCMD_H */ |