diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2014-10-06 14:00:40 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2014-10-06 14:00:40 +0200 |
commit | 6e9c41a892ed0e0da326e0278b3221ce3f5713b8 (patch) | |
tree | 2e301d871bbeeb44aa57ff9cc070fcf3be484487 /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.h | 725 |
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 ........................................................*/ |