2015-02-20 19:52:08 +00:00
/* 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 . 3 x2 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 {
2017-05-03 15:52:15 +00:00
SLIDE_NEXT = 0x04 , SLIDE_PREV = 0x05 , SLIDE_INIT = 0x10 , SLIDE_RELOAD = 0x40
2015-02-20 19:52:08 +00:00
} 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 */