summaryrefslogtreecommitdiff
path: root/backend/plustek-usb.h
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff-webhosting.net>2014-10-06 14:00:40 +0200
committerJörg Frings-Fürst <debian@jff-webhosting.net>2014-10-06 14:00:40 +0200
commit6e9c41a892ed0e0da326e0278b3221ce3f5713b8 (patch)
tree2e301d871bbeeb44aa57ff9cc070fcf3be484487 /backend/plustek-usb.h
Initial import of sane-backends version 1.0.24-1.2
Diffstat (limited to 'backend/plustek-usb.h')
-rw-r--r--backend/plustek-usb.h725
1 files changed, 725 insertions, 0 deletions
diff --git a/backend/plustek-usb.h b/backend/plustek-usb.h
new file mode 100644
index 0000000..0f001c9
--- /dev/null
+++ b/backend/plustek-usb.h
@@ -0,0 +1,725 @@
+/*.............................................................................
+ * Project : SANE library for Plustek flatbed scanners.
+ *.............................................................................
+ */
+
+/** @file plustek-usb.h
+ * @brief Main defines for the USB devices.
+ *
+ * Based on sources acquired from Plustek Inc.<br>
+ * Copyright (C) 2001-2013 Gerhard Jaeger <gerhard@gjaeger.de>
+ *
+ * History:
+ * - 0.40 - starting version of the USB support
+ * - 0.41 - added workaround flag to struct DevCaps
+ * - 0.42 - added MODEL_NOPLUSTEK
+ * - replaced fLM9831 by chip (valid entries: _LM9831, _LM9832, _LM9833)
+ * - added _WAF_MISC_IO3_LAMP for UMAX 3400
+ * - 0.43 - added _WAF_MISC_IOx_LAMP (x=1,2,4,5)
+ * - added CLKDef
+ * - 0.44 - added vendor and product ID to struct DeviceDef
+ * - added _WAF_BYPASS_CALIBRATION
+ * - added _WAF_INV_NEGATIVE_MAP
+ * - 0.45 - added _WAF_SKIP_FINE for skipping fine calibration
+ * - added _WAF_SKIP_WHITEFINE for skipping fine white calibration
+ * - added MCLK setting for 16 bit modes
+ * - added _WAF_FIX_GAIN and _WAF_FIX_OFS
+ * - 0.46 - added UMAX1200 for 5400 model
+ * - removed _WAF_FIX_GAIN and _WAF_FIX_OFS
+ * - added skipCoarseCalib to ScanDef
+ * - added additional defines for cis and epson-ccd sensor
+ * - 0.47 - cleanup work
+ * - added gamma to struct HWDefault
+ * - 0.48 - added DEVCAPSFLAG_LargeTPA
+ * - added _WAF_BIN_FROM_COLOR and _WAF_GRAY_FROM_COLOR
+ * - added dHighSpeed to struct HwDefault
+ * - 0.49 - added a_bRegs, fModFirstHome and fLastScanIsAdf
+ * to struct DeviceDef
+ * - added CRYSTAL_FREQ
+ * - added IPCDef
+ * - 0.50 - cleanup
+ * - removed obsolete _WAF_BLACKFINE
+ * - added MODEL_CANON_LIDE25
+ * - 0.51 - added _WAF_MISC_IO_BUTTONS plus _BUTTON stuff
+ * - added _WAF_USE_ALT_DESC
+ * - added DEVCAPSFLAG_SheetFed
+ * - added dpi_thresh and lineend to motor structure
+ * - 0.52 - added MODEL_QSCAN
+ * - added MODEL_QSCAN_A6 (thanks to Hiroshi Miura)
+ * - changed DCapsDef, lamp -> misc_io
+ * - bPCB is now ushort to be "missused" by non Plustek
+ * devices (as threshhold for resetting sensor order)
+ * - added _WAF_LOFF_ON_START and _WAF_ONLY_8BIT
+ * - added MODEL_TSCAN_A4
+ * - added attribute packed for data access structs
+ * - added _WAF_INC_DARKTGT
+ * .
+ * <hr>
+ * 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.
+ * <hr>
+ */
+#ifndef __PLUSTEK_USB_H__
+#define __PLUSTEK_USB_H__
+
+/** CCD ID (PCB ID): total 3 bits (on Plustek devices) */
+#define kNEC3799 0
+#define kSONY518 1
+#define kSONY548 2
+#define kNEC8861 3
+#define kNEC3778 4
+#define kNECSLIM 5
+#define kCIS650 6
+#define kCIS670 7
+#define kCIS1220 8
+#define kCIS1240 9
+#define kEPSON 10
+
+/** 48MHz Quartz */
+#define CRYSTAL_FREQ 48000000UL
+
+/*********************************** plustek_types.h!!! ************************/
+
+/* makes trouble with gcc3
+#define _SWAP(x,y) (x)^=(y)^=(x)^=(y)
+*/
+#define _SWAP(x,y) { (x)^=(y); (x)^=((y)^=(x));}
+
+#define _LOWORD(x) ((u_short)(x & 0xffff))
+#define _HIWORD(x) ((u_short)(x >> 16))
+#define _LOBYTE(x) ((u_char)((x) & 0xFF))
+#define _HIBYTE(x) ((u_char)((x) >> 8))
+
+#define _HILO2WORD(x) ((u_short)x.bHi * 256U + x.bLo)
+#define _LOHI2WORD(x) ((u_short)x.bLo * 256U + x.bHi)
+
+#define _PHILO2WORD(x) ((u_short)x->bHi * 256U + x->bLo)
+#define _PLOHI2WORD(x) ((u_short)x->bLo * 256U + x->bHi)
+
+#define PACKED8 __attribute__ ((packed,aligned(1)))
+#define PACKED16 __attribute__ ((packed,aligned(2)))
+
+/* useful for RGB-values */
+typedef struct {
+ u_char Red;
+ u_char Green;
+ u_char Blue;
+} PACKED8 RGBByteDef;
+
+typedef struct {
+ u_short Red;
+ u_short Green;
+ u_short Blue;
+} PACKED16 RGBUShortDef;
+
+typedef struct {
+ u_long Red;
+ u_long Green;
+ u_long Blue;
+} RGBULongDef;
+
+typedef struct {
+ u_char a_bColor[3];
+} PACKED8 ColorByteDef;
+
+typedef struct {
+ u_char bHi;
+ u_char bLo;
+} PACKED8 HiLoDef;
+
+typedef union {
+ HiLoDef HiLo[3];
+ u_short Colors[3];
+} PACKED16 ColorWordDef;
+
+typedef union {
+ HiLoDef HiLo;
+ u_short Mono;
+} PACKED16 MonoWordDef;
+
+typedef union {
+
+ u_char *pb;
+ u_short *pw;
+ MonoWordDef *pmw;
+ ColorByteDef *pcb;
+ ColorWordDef *pcw;
+ RGBByteDef *pb_rgb;
+ RGBUShortDef *pw_rgb;
+ HiLoDef *philo;
+
+} __attribute__ ((aligned(4))) AnyPtr;
+
+typedef struct {
+ unsigned short x;
+ unsigned short y;
+} XY;
+
+#define _VAR_NOT_USED(x) ((x)=(x))
+
+/*****************************************************************************/
+
+#define IDEAL_GainNormal 0xf000UL /* 240 */
+#define IDEAL_GainPositive 0xfe00UL /* 254 */
+#define IDEAL_Offset 0x1000UL /* 20 */
+
+#define GAIN_Target 65535UL
+
+/** Chip-types */
+typedef enum _CHIPSET
+{
+ _LM9831,
+ _LM9832,
+ _LM9833
+} eChipDef;
+
+/** ScanParam.bCalibration */
+enum _SHADINGID
+{
+ PARAM_Scan,
+ PARAM_Gain,
+ PARAM_DarkShading,
+ PARAM_WhiteShading,
+ PARAM_Offset
+};
+
+/** ScanParam.bDataType */
+enum _SCANDATATYPE
+{
+ SCANDATATYPE_BW,
+ SCANDATATYPE_Gray,
+ SCANDATATYPE_Color
+};
+
+/** DCapsDef.bSensorColor */
+enum _SENSORCOLOR
+{
+ SENSORORDER_rgb,
+ SENSORORDER_rbg,
+ SENSORORDER_gbr,
+ SENSORORDER_grb,
+ SENSORORDER_brg,
+ SENSORORDER_bgr
+};
+
+/** DCapsDef.wFlags */
+enum _DEVCAPSFLAG
+{
+ DEVCAPSFLAG_Normal = 0x0001,
+ DEVCAPSFLAG_Positive = 0x0002,
+ DEVCAPSFLAG_Negative = 0x0004,
+ DEVCAPSFLAG_TPA = 0x0006,
+ DEVCAPSFLAG_Adf = 0x0008,
+ DEVCAPSFLAG_LargeTPA = 0x0010,
+ DEVCAPSFLAG_SheetFed = 0x0020
+};
+
+/** to allow some workarounds */
+enum _WORKAROUNDS
+{
+ _WAF_NONE = 0x00000000, /* no fix anywhere needed */
+ _WAF_BSHIFT7_BUG = 0x00000001, /* to fix U12 bug in 14bit mode */
+ _WAF_MISC_IO_LAMPS = 0x00000002, /* special lamp switching */
+ _WAF_BLACKFINE = 0x00000004, /* use black calibration strip */
+ _WAF_BYPASS_CALIBRATION = 0x00000008, /* no calibration,use linear gamma */
+ _WAF_INV_NEGATIVE_MAP = 0x00000010, /* the backend does the neg. stuff */
+ _WAF_SKIP_FINE = 0x00000020, /* skip the fine calbration */
+ _WAF_SKIP_WHITEFINE = 0x00000040, /* skip the fine white calbration */
+ _WAF_BIN_FROM_COLOR = 0x00000080, /* generate binary & gray images */
+ _WAF_GRAY_FROM_COLOR = 0x00000100, /* from color scans */
+ _WAF_MISC_IO_BUTTONS = 0x00000200, /* special handling for buttons */
+ _WAF_USE_ALT_DESC = 0x00000400, /* use alternate manufacturer */
+ _WAF_RESET_SO_TO_RGB = 0x00000800, /* set sensororder to RGB(CIS only)*/
+ _WAF_LOFF_ON_START = 0x00001000, /* switch lamp off before scanning */
+ _WAF_ONLY_8BIT = 0x00002000, /* scanner allows only 8 bit modes */
+ _WAF_INC_DARKTGT = 0x00004000 /* allow tgt darklevel adjustment */
+};
+
+/** for lamps connected to the misc I/O pins*/
+enum _LAMPS
+{
+ _NO_MIO = 0,
+ _MIO1 = 0x0001,
+ _MIO2 = 0x0002,
+ _MIO3 = 0x0004,
+ _MIO4 = 0x0008,
+ _MIO5 = 0x0010,
+ _MIO6 = 0x0020
+};
+
+#define _PSENSE_SHIFT 24
+#define _PSENSE_MASK 0xFF000000
+#define _BUTTON_SHIFT 16
+#define _BUTTON_MASK 0xFF0000
+#define _TPA_SHIFT 8
+#define _TPA_MASK 0xFF00
+
+enum _BUTTONS
+{
+ _NO_BUTTON = 0,
+ _PORT0 = ((_MIO1 | _MIO2) << _BUTTON_SHIFT),
+ _PORT1 = ((_MIO3 | _MIO4) << _BUTTON_SHIFT),
+ _PORT2 = ((_MIO5 | _MIO6) << _BUTTON_SHIFT)
+};
+
+enum _PAPER_SENSE
+{
+ _PS_INP1 = (0x01 << _PSENSE_SHIFT),
+ _PS_INP2 = (0x02 << _PSENSE_SHIFT),
+ _PS_INP_MIO1 = (_MIO1 << (_PSENSE_SHIFT+2)),
+ _PS_INP_MIO2 = (_MIO2 << (_PSENSE_SHIFT+2)),
+ _PS_INP_MIO3 = (_MIO3 << (_PSENSE_SHIFT+2)),
+ _PS_INP_MIO4 = (_MIO4 << (_PSENSE_SHIFT+2)),
+ _PS_INP_MIO5 = (_MIO5 << (_PSENSE_SHIFT+2)),
+ _PS_INP_MIO6 = (_MIO6 << (_PSENSE_SHIFT+2))
+};
+
+/** for encoding a misc I/O register as TPA */
+#define _TPA(register) ((u_long)(register << _TPA_SHIFT))
+
+/** Mask to check for available TPA */
+#define _HAS_TPA(flag) (flag & _TPA_MASK)
+
+/** Get the TPA misc I/O register */
+#define _GET_TPALAMP(flag) ((flag >> _TPA_SHIFT) & 0xFF)
+
+/** Get the Papersense port*/
+#define _GET_PAPERSENSE_PORT(flag) ((flag >> _PSENSE_SHIFT) & 0xFF)
+
+/** motor types */
+typedef enum
+{
+ MODEL_KaoHsiung = 0,
+ MODEL_HuaLien,
+ MODEL_Tokyo600,
+ MODEL_EPSON, /**< for EPSON1250/1260 */
+ MODEL_MUSTEK600, /**< for BearPaw 1200 */
+ MODEL_MUSTEK1200, /**< for BearPaw 2400 */
+ MODEL_HP, /**< for HP2x00 */
+ MODEL_CANON600 , /**< for CanoScan 600dpi models */
+ MODEL_CANON1200, /**< for Canon 1200dpi models */
+ MODEL_CANONCCD1200, /**< for Canon CCD 1200dpi models */
+ MODEL_CANON_LIDE25, /**< for CanoScan LiDE25 */
+ MODEL_UMAX, /**< for UMAX 3400/3450 */
+ MODEL_UMAX1200, /**< for UMAX 5400 */
+ MODEL_TSCAN, /**< for Syscan TravelScan A6 */
+ MODEL_TSCAN_A4, /**< for Syscan TravelScan A4 */
+ MODEL_QSCAN, /**< for PandP Q-Scan A4 */
+ MODEL_QSCAN_A6, /**< for PandP Q-Scan A6 */
+ MODEL_LAST
+} eModelDef;
+
+/** to distinguish between Plustek and other devices */
+#define _IS_PLUSTEKMOTOR(x) (x<=MODEL_Tokyo600)
+
+/** Generic usage */
+enum _CHANNEL
+{
+ CHANNEL_red,
+ CHANNEL_green,
+ CHANNEL_blue,
+ CHANNEL_rgb
+};
+
+/** motor movement */
+enum MODULEMOVE
+{
+ MOVE_Forward,
+ MOVE_Backward,
+ MOVE_Both,
+ MOVE_ToPaperSensor,
+ MOVE_EjectAllPapers,
+ MOVE_SkipPaperSensor,
+ MOVE_ToShading
+};
+
+/** SCANDEF.dwFlags */
+enum SCANFLAG
+{
+ SCANDEF_Transparency = 0x00000100, /* Scanning from transparency*/
+ SCANDEF_Negative = 0x00000200, /* Scanning from negative */
+ SCANDEF_QualityScan = 0x00000400, /* Scanning in quality mode */
+ SCANDEF_ContinuousScan = 0x00001000,
+ SCANDEF_Adf = 0x00002000, /* Scan from ADF tray */
+
+ SCANFLAG_bgr = 0x00004000,
+ SCANFLAG_BottomUp = 0x00008000,
+ SCANFLAG_DWORDBoundary = 0x00020000,
+ SCANFLAG_RightAlign = 0x00040000,
+ SCANFLAG_StillModule = 0x00080000,
+ SCANFLAG_Pseudo48 = 0x08000000,
+ SCANFLAG_SampleY = 0x04000000,
+ SCANFLAG_Calibration = 0x10000000,
+ SCANFLAG_Scanning = 0x20020000,
+ SCANFLAG_StartScan = 0x40000000
+};
+
+typedef struct Origins
+{
+ long lLeft; /* How many pix to move the scanning org left, in optic res */
+ long lUp; /* How many pix to move the scanning or up, in optic res */
+} OrgDef;
+
+typedef struct SrcAttr
+{
+ XY DataOrigin; /**< The origin x is from visible pixel not CCD */
+ /* pixel 0, in 300 DPI base. */
+ /* The origin y is from visible top */
+ /* (glass area), in 300 DPI */
+ short ShadingOriginY; /**< The origin y is from top of scanner body */
+ short DarkShadOrgY; /**< if the device has a dark calibration strip */
+ XY Size; /**< Scanning width/height, in 300 DPI base. */
+ XY MinDpi; /**< Minimum dpi supported for scanning */
+
+} SrcAttrDef;
+
+typedef struct DevCaps
+{
+ SrcAttrDef Normal; /**< Reflection */
+ SrcAttrDef Positive; /**< Positive film */
+ SrcAttrDef Negative; /**< Negative film */
+ SrcAttrDef Adf; /**< Adf device */
+ XY OpticDpi; /**< Maximum DPI */
+ u_short wFlags; /**< Flag to indicate what kinds of elements */
+ /* are available */
+ u_char bSensorOrder; /**< CCD color sequences, see _SENSORORDER */
+ u_char bSensorDistance; /**< CCD Color distance */
+ u_char bButtons; /**< Number of buttons */
+ u_char bCCD; /**< CCD ID */
+ u_short bPCB; /**< PCB ID/or threshold (only CIS) */
+ u_long workaroundFlag; /**< Flag to allow special work arounds, see */
+ /* _WORKAROUNDS */
+ u_long misc_io; /**< for lamp, papersense and buttons */
+
+} DCapsDef;
+
+/**
+ * for keeping intial illumination settings
+ */
+typedef struct
+{
+ u_char mode;
+
+ u_short red_lamp_on;
+ u_short red_lamp_off;
+ u_short green_lamp_on;
+ u_short green_lamp_off;
+ u_short blue_lamp_on;
+ u_short blue_lamp_off;
+
+} IllumiDef;
+
+
+/** basic register settings
+ */
+typedef struct HWDefault
+{
+ double dMaxMotorSpeed; /* Inches/second, max. scan speed */
+ double dMaxMoveSpeed; /* Inches/second, max. move speed */
+ double dHighSpeed; /* for speeding up the sensor */
+ double dIntegrationTimeLowLamp;
+ double dIntegrationTimeHighLamp;
+ u_short wMotorDpi; /* Full step DPI */
+ u_short wDRAMSize; /* in KB */
+ double dMinIntegrationTimeLowres; /*in ms. */
+ double dMinIntegrationTimeHighres; /* in ms. */
+ u_short wGreenPWMDutyCycleLow;
+ u_short wGreenPWMDutyCycleHigh;
+ /* Registers */
+ u_char bSensorConfiguration; /* 0x0b */
+ /* Sensor control settings */
+ u_char bReg_0x0c;
+ u_char bReg_0x0d;
+ u_char bReg_0x0e;
+ u_char bReg_0x0f_Mono [10]; /* 0x0f to 0x18 */
+ u_char bReg_0x0f_Color [10]; /* 0x0f to 0x18 */
+
+ /* color mode settings */
+ u_char bReg_0x26;
+ u_char bReg_0x27;
+
+ /* illumination mode reg 0x29 (runtime) */
+ u_char bReg_0x29;
+
+ /* initial illumination settings */
+ IllumiDef illu_mono;
+ IllumiDef illu_color;
+
+ /* 0x1a & 0x1b, remember the u_char order is not Intel
+ * format, you have to pay your attention when you
+ * write this value to register.
+ */
+ u_short StepperPhaseCorrection;
+
+ /* Sensor Pixel Configuration
+ * Actually, the wActivePixelsStart will be set to 0 for shading purpose.
+ * We have to keep these values to adjust the origins when user does the
+ * scan. These settings are based on optic resolution.
+ */
+ u_char bOpticBlackStart; /* 0x1c */
+ u_char bOpticBlackEnd; /* 0x1d */
+ u_short wActivePixelsStart; /* 0x1e & 0x1f */
+ u_short wLineEnd; /* 0x20 & 0x21 */
+
+ /* illumination settings (runtime) */
+ u_short red_lamp_on; /* 0x2c & 0x2d */
+ u_short red_lamp_off; /* 0x2e & 0x2f */
+ u_short green_lamp_on; /* 0x30 & 0x31 */
+ u_short green_lamp_off; /* 0x32 & 0x33 */
+ u_short blue_lamp_on; /* 0x34 & 0x35 */
+ u_short blue_lamp_off; /* 0x36 & 0x37 */
+
+ /* Misc */
+ u_char bReg_0x45;
+ u_short wStepsAfterPaperSensor2;/* 0x4c & 0x4d */
+ u_char bStepsToReverse; /* 0x50 */
+ u_char bReg_0x51;
+ u_char bReg_0x54;
+ u_char bReg_0x55;
+ u_char bReg_0x56;
+ u_char bReg_0x57;
+ u_char bReg_0x58;
+ u_char bReg_0x59;
+ u_char bReg_0x5a;
+ u_char bReg_0x5b;
+ u_char bReg_0x5c;
+ u_char bReg_0x5d;
+ u_char bReg_0x5e;
+
+ eChipDef chip; /* chiptype */
+ eModelDef motorModel; /* to identify used motor */
+ double gamma; /* default gamma setting */
+} HWDef;
+
+/** device description during runtime
+ */
+typedef struct DeviceDef
+{
+ char* ModelStr; /**< pointer to our model string */
+ int vendor; /**< vendor ID */
+ int product; /**< product ID */
+ DCapsDef Caps; /**< pointer to the attribute of current dev */
+ HWDef HwSetting; /**< Pointer to the characteristics of device */
+ SrcAttrDef *pSource; /**< Scanning src, it's equal to Caps.Normal */
+ /**< on the source that the user specified. */
+ OrgDef Normal; /**< Reflection - Pix to adjust scanning orgs */
+ OrgDef Positive; /**< Pos film - Pix to adjust scanning orgs */
+ OrgDef Negative; /**< Neg film - Pix to adjust scanning orgs */
+ OrgDef Adf; /**< Adf - Pixels to adjust scanning origins */
+ u_long dwTicksLampOn; /**< The ticks when lamp turns on */
+ u_long dwLampOnPeriod;/**< How many seconds to keep lamp on */
+ SANE_Bool bLampOffOnEnd; /**< switch lamp off on end or keep cur. state*/
+ int currentLamp; /**< The lamp ID of the currently used lamp */
+ SANE_Bool fModFirstHome; /**< */
+ SANE_Bool fLastScanIsAdf;/**< */
+ u_char a_bRegs[0x80]; /**< our global register file */
+
+} DeviceDef;
+
+
+typedef struct Settings
+{
+ char *pIDString;
+ DCapsDef *pDevCaps;
+ HWDef *pHwDef;
+ char *pModelString;
+
+} SetDef;
+
+/**
+ */
+typedef struct
+{
+ /** User Information */
+ u_long dwBytes; /**< bytes per line */
+ u_long dwPixels; /**< pixels per line */
+ u_long dwLines; /**< lines */
+
+ /** Driver Info */
+ u_long dwValidPixels; /**< only valid pixels, not incl. pad pix(B/W,Gray)*/
+ u_long dwPhyPixels; /**< inlcude pad pixels for ASIC (B/W, Gray) */
+ u_long dwPhyBytes; /**< bytes to read from ASIC */
+ u_long dwPhyLines; /**< should include the extra lines accord to the */
+ /* request dpi (CCD lines distance) */
+ u_long dwTotalBytes; /**< Total bytes per scan */
+
+} WinInfo;
+
+/**
+ */
+typedef struct
+{
+ /* OUTPUT - Driver returned area. All are based on physical
+ * scanning conditions. */
+ WinInfo Size; /* i/p:
+ * dwPixels, dwBytes(without u_long boundary factor)
+ * dwLines in user specified dpi
+ * o/p:
+ * dwPhyPixels, dwPhyBytes, dwPhyLines
+ * so after called, caller have to change it */
+ XY PhyDpi; /* Driver DPI */
+
+ /* INPUT - User info. All sizes and coordinates are specified in the
+ * unit based on 300 DPI */
+ XY UserDpi; /**< User specified DPI */
+ XY Origin; /**< Scanning origin in optic dpi */
+ double dMCLK; /**< for positive & negative & Adf */
+ short brightness;
+ short contrast;
+ u_char bSource; /**< Reflection/Positive/Negative/Adf(SOURCE_xxx)*/
+ u_char bDataType; /**< Bw, Gray or Color (see _SCANDATATYPE) */
+ u_char bBitDepth; /**< 1/8/14 */
+ u_char bChannels; /**< Color or Gray */
+ u_char bCalibration; /**< 1 or 2: the origin.x is from CCD pixel 0 and
+ * the origin.y is from Top of scanner.
+ * In this case, the WININFO.dwPhyLines
+ * will not included the extra lines for
+ * color distance factor.
+ * 0: normal scan, the both directions have to
+ * add the distance */
+ int swOffset[3]; /**< for calibration adjustment */
+ int swGain[3]; /**< for calibration adjustment */
+
+} ScanParam;
+
+struct Plustek_Device;
+
+/** structure to hold all necessary buffer informations for current scan
+ */
+typedef struct ScanDef
+{
+ SANE_Bool fCalibrated; /**< calibrated or not */
+ SANE_Bool skipCoarseCalib;/**< skip coarse calibration or not */
+ u_long dwFlag; /**< scan attributes */
+
+ ScanParam sParam; /**< all we need to scan */
+
+ AnyPtr UserBuf; /**< pointer to the user buffer */
+ u_long dwLinesUser; /**< Number of lines of user buffer */
+ u_long dwBytesLine; /**< Bytes per line of user buffer. */
+ u_long dwLinesToProcess;
+
+ /** Image processing routine according to the scan mode */
+ void (*pfnProcess)(struct Plustek_Device*);
+
+ u_long* pScanBuffer; /**< our scan buffer */
+
+ u_long dwLinesPerScanBufs;
+ u_long dwNumberOfScanBufs;
+ u_long dwLinesScanBuf;
+
+ u_char* pbScanBufBegin;
+ u_char* pbScanBufEnd;
+ u_char* pbGetDataBuf;
+ u_long dwBytesScanBuf;
+ u_long dwLinesDiscard;
+
+ u_long dwRedShift;
+ u_long dwGreenShift;
+ u_long dwBlueShift;
+
+ AnyPtr Green;
+ AnyPtr Red;
+ AnyPtr Blue;
+
+ long lBufAdjust; /**< bytes to adjust buffer pointer */
+ /* after a image line processed */
+ u_short wSumY; /**< for line sampling */
+
+ u_char bLineDistance; /**< Color offset in specific dpi y */
+ int fGrayFromColor; /**< channel to use for gray mode */
+
+ u_char bLinesToSkip; /**< how many lines to skip at start */
+
+} ScanDef;
+
+
+/** max number of different colck settings */
+#define _MAX_CLK 10
+
+/** structure to hold PWN settings
+ */
+typedef struct
+{
+ u_char pwm; /**< PWM */
+ u_char pwm_duty; /**< PWM duty cycles */
+ u_char scan_lines_per_line; /**< lines to scan to obtain 1 real line
+ will be used in 16bit color modes only */
+} MDef;
+
+/** according to the CCD and motor, we provide various settings
+ */
+typedef struct {
+
+ eModelDef motorModel; /**< the motor ID */
+
+ u_char pwm_fast; /**< PWM during fast movement */
+ u_char pwm_duty_fast; /**< PWM duty during fast movement */
+ u_char mclk_fast; /**< MCLK during fast movement */
+
+ u_short dpi_thresh;
+ u_short lineend;
+
+ /**
+ * here we define some ranges for better supporting
+ * non-Plustek devices with it's different hardware
+ * we can set the MCLK and the motor PWM stuff for color
+ * and gray modes (8bit and 14/16bit modes)
+ * 0 1 2 3 4 5 6 7 8 9
+ * <= 75 <=100 <=150 <=200 <=300 <=400 <=600 <= 800 <=1200 <=2400DPI
+ */
+ MDef motor_sets[_MAX_CLK]; /**< motor PWM settings during scan */
+ double color_mclk_8[_MAX_CLK]; /**< MCLK settings for color scan */
+ double color_mclk_16[_MAX_CLK]; /**< MCLK settings for color (16bit) scan*/
+ double gray_mclk_8[_MAX_CLK]; /**< MCLK settings for gray scan */
+ double gray_mclk_16[_MAX_CLK]; /**< MCLK settings for gray (16bit) scan */
+
+} ClkMotorDef;
+
+/** for transferring some info between child and parent after calibration
+ */
+#define _MAX_SHAD 0x4000
+#define _SHADING_BUF (_MAX_SHAD*3) /**< max size of the shading buffer */
+
+typedef struct {
+ u_long transferRate;
+} IPCDef;
+
+#endif /* guard __PLUSTEK_USB_H__ */
+
+/* END PLUSTEK-USB.H ........................................................*/