diff options
Diffstat (limited to 'backend/plustek-pp_genericio.c')
-rw-r--r-- | backend/plustek-pp_genericio.c | 1463 |
1 files changed, 1463 insertions, 0 deletions
diff --git a/backend/plustek-pp_genericio.c b/backend/plustek-pp_genericio.c new file mode 100644 index 0000000..1a1ebf4 --- /dev/null +++ b/backend/plustek-pp_genericio.c @@ -0,0 +1,1463 @@ +/* @file plustek-pp_genericio.c + * @brief all i/o functions + * + * based on sources acquired from Plustek Inc. + * Copyright (C) 1998 Plustek Inc. + * Copyright (C) 2000-2004 Gerhard Jaeger <gerhard@gjaeger.de> + * also based on the work done by Rick Bronson + * + * History: + * - 0.30 - initial version + * - 0.31 - moved ioP96ReadScannerImageData and ioP98ReadScannerImageData + * into this file + * - added SPP-read functions + * - 0.32 - changes in function ioControlLampOnOff() + * - made IOReadingImage a local function -> ioP98ReadingImage() + * - rewritten function ioP96ReadScannerImageData() + * - moved function IOSetStartStopRegister to p9636.c + * - 0.33 - added debug messages to IOPutOnAllRegisters + * - fixed a bug in ioP96InitialSetCurrentSpeed + * - 0.34 - no changes + * - 0.35 - no changes + * - 0.36 - removed some warning conditions + * - 0.37 - moved functions IOSPPWrite(), IODataToScanner(), IODataToRegister(), + * IODataFromRegister() to io.c + * - moved the data read functions to io.c + * - renamed IOInitialize to IOFuncInitialize + * - 0.38 - moved some functions to io.c + * - added P12 stuff + * - 0.39 - no changes + * - 0.40 - no changes + * - 0.41 - no changes + * - 0.42 - changed include names + * - 0.43 - fixed a problem in ioP96InitialSetCurrentSpeed(), for COLOR_BW + * at least, used the setting for A3I + * . + * <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> + */ +#include "plustek-pp_scan.h" + +/*************************** local vars **************************************/ + +/* WORK COMMENT THIS */ +typedef void (*pFnSpeed_Set)(pScanData); + +static ModeTypeVar a_FilmSettings[18] = { + /* SppNegFilmPos */ + {0xa0, 1782, 96, _QuarterStep, 0, 0}, + {0xb7, 1782, 96, _QuarterStep, 0, 0}, + {0xb7, 1782, 96, _QuarterStep, 0, 0}, + /* BppNegFilmPos */ + {0xa9, 1782, 96, _QuarterStep, 0, 0}, + {0xbf, 1782, 96, _QuarterStep, 0, 0}, + {0xbf, 1782, 96, _QuarterStep, 0, 0}, + /* EppNegFilmPos */ + {0x95, 1782, 96, _QuarterStep, 0, 0}, + {0xa6, 1782, 96, _QuarterStep, 0, 0}, + {0xa6, 1782, 96, _QuarterStep, 0, 0}, + /* SppPosFilmPos */ + {0x50, 1782, 96, _QuarterStep, 0, 0}, + {0x67, 1782, 96, _QuarterStep, 0, 0}, + {0x67, 1782, 96, _QuarterStep, 0, 0}, + /* BppPosFilmPos */ + {0x59, 1782, 96, _QuarterStep, 0, 0}, + {0x6f, 1782, 96, _QuarterStep, 0, 0}, + {0x6f, 1782, 96, _QuarterStep, 0, 0}, + /* EppPosFilmPos */ + {0x45, 1782, 96, _QuarterStep, 0, 0}, + {0x56, 1782, 96, _QuarterStep, 0, 0}, + {0x56, 1782, 96, _QuarterStep, 0, 0} +}; + +static ModeTypeVar a_BwSettings[12] = { + {_Home_BE75, 890, 96, _HalfStep, 2, 1}, + {_Home_BE150, 1780, 88, _QuarterStep, 2, 0}, + {_Home_BE300, 3542, 96, _QuarterStep, 2, 0}, + {_Home_BE600, 7070, 96, _QuarterStep, 2, 0}, + {_Home_BB75, 890, 96, _HalfStep, 2, 1}, + {_Home_BB150, 1780, 88, _QuarterStep, 2, 0}, + {_Home_BB300, 3542, 96, _QuarterStep, 2, 0}, + {_Home_BB600, 7070, 96, _QuarterStep, 2, 0}, + {_Home_BS75, 890, 96, _HalfStep, 2, 1}, + {_Home_BS150, 1780, 88, _QuarterStep, 2, 0}, + {_Home_BS300, 3542, 96, _QuarterStep, 2, 0}, + {_Home_BS600, 7070, 96, _QuarterStep, 2, 0} +}; + +static ModeTypeVar a_GraySettings[12] = { + {_Home_GE75, 890, 96, _HalfStep, 2, 0}, + {_Home_GE150, 1780, 88, _QuarterStep, 2, 0}, + {_Home_GE300, 3542, 88, _QuarterStep, 2, 0}, + {_Home_GE600, 7070, 88, _QuarterStep, 2, 0}, + {_Home_GB75, 890, 96, _HalfStep, 2, 0}, + {_Home_GB150, 1780, 88, _QuarterStep, 2, 0}, + {_Home_GB300, 3542, 88, _QuarterStep, 2, 0}, + {_Home_GB600, 7070, 88, _QuarterStep, 2, 0}, + {_Home_GS75, 890, 96, _HalfStep, 2, 0}, + {_Home_GS150, 1782, 96, _QuarterStep, 2, 0}, + {_Home_GS300, 3549, 88, _QuarterStep, 2, 0}, + {_Home_GS600, 7070, 88, _QuarterStep, 2, 0} +}; + +static ModeTypeVar a_ColorSettings[15] = { + {_Home_CE50, 720, 60, _HalfStep, 1, 1}, + {_Home_CE100, 1782, 48, _QuarterStep, 1, 0}, + {_Home_CE150, 1782, 88, _QuarterStep, 0, 0}, + {_Home_CE300, 3549, 96, _QuarterStep, 0, 0}, + {_Home_CE600, 7082, 96, _QuarterStep, 0, 0}, + {_Home_CB50, 720, 120, _QuarterStep, 0, 1}, + {_Home_CB100, 1782, 96, _QuarterStep, 0, 0}, + {_Home_CB150, 1782, 96, _QuarterStep, 0, 0}, + {_Home_CB300, 3549, 96, _QuarterStep, 0, 0}, + {_Home_CB600, 7082, 96, _QuarterStep, 0, 0}, + {_Home_CS50, 720, 120, _QuarterStep, 0, 1}, + {_Home_CS100, 1782, 96, _QuarterStep, 0, 0}, + {_Home_CS150, 1782, 96, _QuarterStep, 0, 0}, + {_Home_CS300, 3549, 96, _QuarterStep, 0, 0}, + {_Home_CS600, 7082, 96, _QuarterStep, 0, 0} +}; + +static DiffModeVar a_tabDiffParam[] ={ + /* BPP/EPP B/W */ + {0, 1, 11}, /* Bpp/Epp B/W, Dpi <= 150 ;(0) */ + {0, 1, 24}, /* Bpp/Epp B/W, Dpi <= 300 ;(1) */ + {0, 1, 48}, /* Bpp/Epp B/W, Dpi > 300 ;(2) */ + /* SPP B/W */ + {0, 1, 11}, /* Spp B/W, Dpi <= 150 ;(3) */ + {0, 1, 24}, /* Spp B/W, Dpi <= 300 ;(4) */ + {0, 1, 48}, /* Spp B/W, Dpi > 300 ;(5) */ + /* EPP Gray */ + /* The difference for this DPI: + * if pixels <= | 3000 | Others + * --------------------+------+------------- + * VarFullStateSpeed | 0 | 1 + * VarCurrentSpeed | 1 | 2 + * VarStepSpeed | 44 | 88 + */ + {0, 1, 12}, /* Epp Gray, Dpi <= 150 ;(6) */ + {1, 2, 80}, /* Epp Gray, Dpi <= 300 ;(7) */ + {0, 1, 80}, /* Epp Gray, Dpi > 300, Px <= 3000 ;(8) */ + {0, 1, 80}, /* Epp Gray, Dpi > 300, Px > 3000 ;(9) */ + + /* BPP Gray */ + {0, 1, 11}, /* Bpp Gray, Dpi <= 150 ; 10 */ + /* The difference for this DPI: + * if pixels <= | 1600 | Others + * --------------------+------+------------- + * VarFullStateSpeed | 0 | 1 + * VarCurrentSpeed | 1 | 2 + * VarStepSpeed | 24 | 48 + */ + {0, 1, 24}, /* Bpp Gray, Dpi <= 300, Px <= 1600 ; 11 */ + {1, 2, 48}, /* Bpp Gray, Dpi <= 300, Px > 1600 ; 12 */ + /* The difference for this DPI: + * if pixels <= | 1600 | 3200 | Others + * --------------------+-----+-------+---------------------- + * VarFullStateSpeed | 0 | 1 | 2 + * VarCurrentSpeed | 1 | 2 | 4 + * VarStepSpeed | 44 | 88 | 88 + */ + {0, 1, 44}, /* Bpp Gray, Dpi > 300, Px <= 1600 ; 13 */ + {1, 2, 88}, /* Bpp Gray, Dpi > 300, Px <= 3200 ; 14 */ + {2, 4, 88}, /* Bpp Gray, Dpi > 300, Px > 3200 ; 15 */ + /* SPP Gray */ + /* The difference for this DPI: + * if pixels <= | 800 | Others + * --------------------+-----+------------- + * VarFullStateSpeed | 0 | 1 + * VarCurrentSpeed | 1 | 2 + * VarStepSpeed | 12 | 24 + */ + {0, 1, 12}, /* Spp Gray, Dpi <= 150, Px <= 800 ; 16 */ + {1, 2, 24}, /* Spp Gray, Dpi <= 150, Px > 800 ; 17 */ + /* The difference for this DPI: + * if pixels <= | 800 | 1600 | Others + * --------------------+-----+-------+---------------------- + * VarFullStateSpeed | 0 | 1 | 1 + * VarCurrentSpeed | 1 | 2 | 4 + * VarStepSpeed | 22 | 88 | 88 + */ + {0, 1, 22}, /* Spp Gray, Dpi <= 300, Px <= 800 ; 18 */ + {1, 2, 88}, /* Spp Gray, Dpi <= 300, Px <= 1600 ; 19 */ + {1, 4, 88}, /* Spp Gray, Dpi <= 300, Px > 1600 ; 20 */ + /* The difference for this DPI: + * if pixels <= | 800 | 1600 | 3200 | Others + * --------------------+-----+------+------+--------------- + * VarFullStateSpeed | 0 | 1 | 2 | 3 + * VarCurrentSpeed | 1 | 2 | 4 | 6 + * VarStepSpeed | 44 | 88 | 88 | 88 + */ + {0, 1, 44}, /* Spp Gray, Dpi > 300, Px <= 800 ; 21 */ + {1, 2, 88}, /* Spp Gray, Dpi > 300, Px <= 1600 ; 22 */ + {2, 4, 88}, /* Spp Gray, Dpi > 300, Px <= 3200 ; 23 */ + {3, 6, 88}, /* Spp Gray, Dpi > 300, Px > 3200 ; 24 */ + /* EPP Color */ + {0, 1, 6}, /* Epp Color, Dpi <= 60/100 ; 25 */ + {0, 1, 11}, /* Epp Color, Dpi <= 150 ; 26 */ + /* The difference for this DPI: + * if pixels <= | 1200 | Others + * --------------------+------+------------- + * VarFullStateSpeed | 0 | 1 + * VarCurrentSpeed | 1 | 2 + * VarStepSpeed | 24 | 48 + */ + {0, 1, 24}, /* Epp Color, Dpi <= 300, Px <= 1400 ; 27 */ + {1, 2, 48}, /* Epp Color, Dpi <= 300, Px > 1400 ; 28 */ + /* The difference for this DPI: + * if pixels <= | 1400 | 2800 | 4000 | Others + * --------------------+------+------+------+--------------- + * VarFullStateSpeed | 0 | 1 | 2 | 3 + * VarCurrentSpeed | 1 | 2 | 4 | 6 + * VarStepSpeed | 48 | 96 | 88 | 88 + * VarExposureTime | 96 | 96 | 88 | 88 + */ + {0, 1, 48}, /* Epp Color, Dpi > 300, Px <= 1400 ; 29 */ + {1, 2, 96}, /* Epp Color, Dpi > 300, Px <= 2800 ; 30 */ + {2, 4, 88}, /* Epp Color, Dpi > 300, Px <= 4000 ; 31 */ + {4, 8, 88}, /* Epp Color, Dpi > 300, Px > 4000 ; 32 */ + /* BPP Color */ + {0, 1, 6}, /* Bpp/Spp Color, Dpi <= 60 ; 33 */ + {0, 1, 12}, /* Bpp/Spp Color, Dpi <= 100 ; 34 */ + /* if pixels <= | 800 | Others + * --------------------+-----+------------- + * VarFullStateSpeed | 0 | 1 + * VarCurrentSpeed | 1 | 2 + * VarStepSpeed | 12 | 24 + */ + {0, 1, 12}, /* Bpp/Spp Color, Dpi <= 150, Px <= 800 ; 35 */ + {1, 2, 24}, /* Bpp/Spp Color, Dpi <= 150, Px > 800 ; 36 */ + /* The difference for this DPI: + * if pixels <= | 800 | 1600 | Others + * --------------------+-----+-------+---------------------- + * VarFullStateSpeed | 0 | 1 | 1 + * VarCurrentSpeed | 1 | 2 | 4 + * VarStepSpeed | 24 | 48 | 96 + */ + {0, 1, 24}, /* Bpp Color, Dpi <= 300, Px <= 800 ; 37 */ + {1, 2, 48}, /* Bpp Color, Dpi <= 300, Px <= 1600 ; 38 */ + {1, 4, 96}, /* Bpp Color, Dpi <= 300, Px > 1600 ; 39 */ + /* The difference for this DPI: + * if pixels <= | 800 | 1600 | 3200 | Others + * --------------------+-----+------+------+--------------- + * VarFullStateSpeed | 0 | 1 | 2 | 4 + * VarCurrentSpeed | 1 | 2 | 4 | 8 + * VarStepSpeed | 48 | 96 | 96 | 96 + */ + {0, 1, 48}, /* Bpp Color, Dpi > 300, Px <= 800 ; 40 */ + {1, 2, 48}, /* Bpp Color, Dpi > 300, Px <= 1600 ; 41 */ + {2, 4, 96}, /* Bpp Color, Dpi > 300, Px <= 3200 ; 42 */ + {4, 8, 96}, /* Bpp Color, Dpi > 300, Px > 3200 ; 43 */ + /* SPP Color */ + /* The difference for this DPI: + * if pixels <= | 500 | 1000 | 2000 | Others + * --------------------+-----+------+------+--------------- + * VarFullStateSpeed | 0 | 1 | 1 | 2 + * VarCurrentSpeed | 1 | 2 | 4 | 8 + * VarStepSpeed | 24 | 48 | 96 | 96 + */ + {0, 1, 24}, /* Spp Color, Dpi <= 300, Px <= 500 ; 44 */ + {1, 2, 48}, /* Spp Color, Dpi <= 300, Px <= 1000 ; 45 */ + {1, 4, 96}, /* Spp Color, Dpi <= 300, Px <= 2000 ; 46 */ + {2, 8, 96}, /* Spp Color, Dpi <= 300, Px > 2000 ; 47 */ + /* The difference for this DPI: + * if pixels <= | 500 | 1000 | 2000 | 4000 | Others + * --------------------+-----+------+------+------+-------- + * VarFullStateSpeed | 0 | 1 | 2 | 4 | 5 + * VarCurrentSpeed | 1 | 2 | 4 | 8 | 10 + * VarStepSpeed | 48 | 96 | 96 | 96 | 96 + */ + {0, 1, 48}, /* Spp Color, Dpi > 300, Px <= 500 ; 48 */ + {1, 2, 96}, /* Spp Color, Dpi > 300, Px <= 1000 ; 49 */ + {2, 4, 96}, /* Spp Color, Dpi > 300, Px <= 2000 ; 50 */ + {4, 8, 96}, /* Spp Color, Dpi > 300, Px <= 4000 ; 51 */ + {5, 10, 96}, /* Spp Color, Dpi > 300, Px > 4000 ; 52 */ + + /* Negative & Transparency */ + /* EPP/SPP/BPP */ +/* for exposure time = 96 */ + {0, 1, 12}, /* Spp/EPP Color, Dpi <= 150 ; 60 */ + {0, 1, 24}, /* Spp Color, Dpi <= 300 ; 61 */ + {0, 1, 48}, /* Spp Color, Dpi > 300 ; 62 */ + {0, 1, 12}, /* Bpp/Epp B/W, Dpi <= 75 ; 56 */ + +/* for exposure time = 144 */ + {0, 1, 18}, /* Spp/EPP Color, Dpi <= 150 ; 57 */ + {0, 1, 36}, /* Spp Color, Dpi <= 300 ; 58 */ + {0, 1, 72}, /* Spp Color, Dpi > 300 ; 59 */ + +/* for exposure time = 192 */ + {0, 1, 24}, /* Spp/EPP Color, Dpi <= 150 ; 53 */ + {0, 1, 48}, /* Spp Color, Dpi <= 300 ; 54 */ + {0, 1, 96}, /* Spp Color, Dpi > 300 ; 55 */ + +/* for 48 bits color */ + {1, 2, 12}, /* Epp Color, Dpi <= 100, Px > 1400 ; 63 */ + {1, 2, 22}, /* Epp Color, Dpi <= 150, Px > 1900 ; 64 */ + {2, 4, 48}, /* Epp Color, Dpi <= 300, Px > 4000 ; 65 */ + {5, 10, 88},/* Epp Color, Dpi > 300, Px > 9600 ; 66 */ + {3, 12, 96} /* Spp Color, Dpi <= 300, Px > 3000 ; 67 */ +}; + + +static pModeTypeVar pModeType; +static pDiffModeVar pModeDiff; + +/* + * prototypes for the speed procs (ASIC 98001), EPP, SPP and BIDI + */ +static void fnLineArtSpeed( pScanData ps ); +static void fnGraySpeed ( pScanData ps ); +static void fnColorSpeed ( pScanData ps ); + +static void fnSppLineArtSpeed( pScanData ps ); +static void fnSppGraySpeed ( pScanData ps ); +static void fnSppColorSpeed ( pScanData ps ); + +static void fnBppLineArtSpeed( pScanData ps ); +static void fnBppGraySpeed ( pScanData ps ); +static void fnBppColorSpeed ( pScanData ps ); + +/* + * some procedures for the different modes + */ +static pFnSpeed_Set a_fnSpeedProcs[5] = { + fnLineArtSpeed, + fnGraySpeed, + fnGraySpeed, + fnColorSpeed, + fnColorSpeed +}; + +static pFnSpeed_Set a_fnSppSpeedProcs[5] = { + fnSppLineArtSpeed, + fnSppGraySpeed, + fnSppGraySpeed, + fnSppColorSpeed, + fnSppColorSpeed +}; + +static pFnSpeed_Set a_fnBppSpeedProcs[5] = { + fnBppLineArtSpeed, + fnBppGraySpeed, + fnBppGraySpeed, + fnBppColorSpeed, + fnBppColorSpeed +}; + + +/*************************** local functions *********************************/ + +/*............................................................................. + * + */ +static void ioP96InitialSetCurrentSpeed( pScanData ps ) +{ + DBG( DBG_LOW, "ioP96InitialSetCurrentSpeed()\n" ); + + switch ( ps->DataInf.wPhyDataType ) { + + case COLOR_BW: + ps->bCurrentSpeed = (ps->DataInf.dwAsicPixelsPerPlane > + _BUF_SIZE_BASE_CONST * 2) ? 2 : 1; + break; + + case COLOR_256GRAY: + if ( COLOR_256GRAY == ps->DataInf.wAppDataType ) { + + ps->bCurrentSpeed = (Byte)(ps->a_wGrayInitTime[ps->IO.portMode] / + ps->wLinesPer64kTime); + if (!ps->bCurrentSpeed) + ps->bCurrentSpeed = 1; + + if ((ps->DataInf.dwAsicPixelsPerPlane>=1500) && (ps->bCurrentSpeed==1)) + ps->bCurrentSpeed = 2; + + if ( ps->DataInf.xyAppDpi.x > 1200) { + ps->bCurrentSpeed += 2; /* 1201-2400 */ + + if ( ps->DataInf.xyAppDpi.x > 2400 ) + ps->bCurrentSpeed += 2; /* >= 2401 */ + } + + MotorP96AdjustCurrentSpeed( ps, ps->bCurrentSpeed ); + + } else { + + if ( _PORT_SPP != ps->IO.portMode ) { + if( ps->DataInf.dwAsicPixelsPerPlane <= 1280 ) + ps->bCurrentSpeed = 1; /* <= 1280 pixels */ + + else if( ps->DataInf.dwAsicPixelsPerPlane <= 1720 ) + ps->bCurrentSpeed = 2; /* 1281-1720 */ + + else if( ps->DataInf.dwAsicPixelsPerPlane <= 3780 ) + ps->bCurrentSpeed = 4; /* 1721-3780 */ + + else + ps->bCurrentSpeed = 6; /* >= 3780 */ + + } else { + + if( ps->DataInf.dwAsicPixelsPerPlane <= 400 ) + ps->bCurrentSpeed = 1; /* <= 400 pixels */ + + else if( ps->DataInf.dwAsicPixelsPerPlane <= 853 ) + ps->bCurrentSpeed = 2; /* 401-853 */ + + else if( ps->DataInf.dwAsicPixelsPerPlane <= 1280 ) + ps->bCurrentSpeed = 4; /* 854-1280 */ + + else if( ps->DataInf.dwAsicPixelsPerPlane <= 1728 ) + ps->bCurrentSpeed = 6; /* 1281-1728 */ + + else if( ps->DataInf.dwAsicPixelsPerPlane <= 3780 ) + ps->bCurrentSpeed = 8; /* 1729-3780 */ + + else + ps->bCurrentSpeed = 10; /* > 3780 */ + } + } + break; + + case COLOR_TRUE24: + ps->bCurrentSpeed = (Byte)(ps->a_wColorInitTime[ps->IO.portMode] / + ps->wLinesPer64kTime); + + if( 0 == ps->bCurrentSpeed ) { + DBG( DBG_LOW, "Initially set to 1\n" ); + ps->bCurrentSpeed = 1; + } + + if (ps->DataInf.xyAppDpi.x > 150) { + if (ps->bCurrentSpeed < 4) + ps->bCurrentSpeed = 4; + } else { +/* +// HEINER:A3I +// if (ps->DataInf.xyAppDpi.x > 100) +*/ + if (ps->DataInf.xyAppDpi.x > 75) + if (ps->bCurrentSpeed < 2) + ps->bCurrentSpeed = 2; + } + + if( 1 != ps->bCurrentSpeed ) + ps->bCurrentSpeed += ps->bExtraAdd; + + if (ps->DataInf.xyAppDpi.x > ps->PhysicalDpi) { + if (ps->DataInf.xyAppDpi.x <= 600) + ps->bCurrentSpeed += 2; + else if (ps->DataInf.xyAppDpi.x <= 1200) + ps->bCurrentSpeed += 2; + else if (ps->DataInf.xyAppDpi.x <= 2400) + ps->bCurrentSpeed += 2; + else + ps->bCurrentSpeed += 2; + } + + MotorP96AdjustCurrentSpeed( ps, ps->bCurrentSpeed ); + } + + DBG( DBG_LOW, "Current Speed = %u\n", ps->bCurrentSpeed ); +} + +/*............................................................................. + * + */ +static void fnLineArtSpeed( pScanData ps ) +{ + pModeType = a_BwSettings + _FixParamEppBw; + pModeDiff = a_tabDiffParam + _BwEpp75; + + if (ps->DataInf.xyAppDpi.y > 75) { + pModeType++; + pModeDiff = a_tabDiffParam + _BwEpp150; + } + + if (ps->DataInf.xyAppDpi.y > 150) { + if (ps->DataInf.xyAppDpi.y <= 300) { + pModeType++; + pModeDiff = a_tabDiffParam + _BwEpp300; + } else { + pModeType += 2; + pModeDiff = a_tabDiffParam + _BwEpp600; + } + } +} + +/*............................................................................. + * + */ +static void fnGraySpeed( pScanData ps ) +{ + pModeType = a_GraySettings + _FixParamEppGray; + pModeDiff = a_tabDiffParam + _GrayEpp75; + + if (ps->DataInf.xyAppDpi.y > 75) { + pModeType++; + pModeDiff = a_tabDiffParam + _GrayEpp150; + } + + if ( ps->DataInf.xyAppDpi.y > 150) { + if (ps->DataInf.xyAppDpi.y <= 300) { + pModeType++; + pModeDiff = a_tabDiffParam + _GrayEpp300; + } else { + pModeType += 2; + pModeDiff = a_tabDiffParam + _GrayEpp600; + if (ps->DataInf.dwAsicPixelsPerPlane > 3000) + pModeDiff++; + } + } +} + +/*............................................................................. + * + */ +static void fnColorSpeed( pScanData ps ) +{ + DBG( DBG_LOW, "fnColorSpeed();\n" ); + + pModeType = a_ColorSettings + _FixParamEppColor; + + if ( ps->DataInf.xyAppDpi.y <= ps->wMinCmpDpi ) { + /* DPI <= 60 */ + pModeDiff = a_tabDiffParam + _ColorEpp60; + + } else { + + if (ps->DataInf.xyAppDpi.y <= 100) { + pModeType++; + pModeDiff = a_tabDiffParam + _ColorEpp100; + + if (ps->DataInf.dwAsicBytesPerPlane > 1400) + pModeDiff = a_tabDiffParam + _ColorEpp100_1400; + } else { + if (ps->DataInf.xyAppDpi.y <= 150) { + pModeType += 2; + pModeDiff = a_tabDiffParam + _ColorEpp150; + + if (ps->DataInf.dwAsicBytesPerPlane > 1900) + pModeDiff = a_tabDiffParam + _ColorEpp150_1900; + } else { + if (ps->DataInf.xyAppDpi.y <= 300) { + pModeType += 3; + pModeDiff = a_tabDiffParam + _ColorEpp300_1200; + if (ps->DataInf.dwAsicBytesPerPlane <= 1200) + pModeDiff --; + else { + if (ps->DataInf.dwAsicBytesPerPlane > 4000) + pModeDiff = a_tabDiffParam + _ColorEpp300_4000; + } + } else { + pModeType += 4; + pModeDiff = a_tabDiffParam + _ColorEpp600_4000; + pModeType->bExposureTime = 88; + + if (ps->DataInf.dwAsicBytesPerPlane <= 4000) { + pModeDiff--; + if (ps->DataInf.dwAsicBytesPerPlane <= 2800) { + pModeType->bExposureTime = 96; + pModeDiff--; + if (ps->DataInf.dwAsicBytesPerPlane <= 1200) + pModeDiff--; + } + } else { + if (ps->DataInf.dwAsicBytesPerPlane >= 9600) + pModeDiff = a_tabDiffParam + _ColorEpp600_9600; + } + } + } + } + } +} + +/*............................................................................. + * + */ +static void fnSppLineArtSpeed( pScanData ps ) +{ + pModeType = a_BwSettings + _FixParamSppBw; + pModeDiff = a_tabDiffParam + _BwSpp75; + + if (ps->DataInf.xyAppDpi.y > 75) { + + pModeType++; + pModeDiff = a_tabDiffParam + _BwSpp150; + } + + if (ps->DataInf.xyAppDpi.y > 150) { + if (ps->DataInf.xyAppDpi.y <= 300) { + pModeType++; + pModeDiff = a_tabDiffParam + _BwSpp300; + } else { + pModeType += 2; + pModeDiff = a_tabDiffParam + _BwSpp600; + } + } +} + +/*............................................................................. + * + */ +static void fnSppGraySpeed( pScanData ps ) +{ + pModeType = a_GraySettings + _FixParamSppGray; + pModeDiff = a_tabDiffParam + _GraySpp75; + + if (ps->DataInf.xyAppDpi.y > 75) { + pModeType++; + pModeDiff = a_tabDiffParam + _GraySpp150_800; + + if (ps->DataInf.xyAppDpi.y > 150) { + + if (ps->DataInf.xyAppDpi.y <= 300) { + pModeType ++; + pModeDiff = a_tabDiffParam + _GraySpp300_1600; + } else { + + pModeType += 2; + pModeDiff = a_tabDiffParam + _GraySpp600_3200; + + if (ps->DataInf.dwAsicPixelsPerPlane <= 3200) + pModeDiff--; + } + + if (ps->DataInf.dwAsicPixelsPerPlane <= 1600) + pModeDiff--; + } + + if (ps->DataInf.dwAsicPixelsPerPlane <= 800) + pModeDiff--; + } +} + +/*............................................................................. + * + */ +static void fnSppColorSpeed( pScanData ps ) +{ + pModeType = a_ColorSettings + _FixParamSppColor; + pModeDiff = a_tabDiffParam + _ColorSpp60; + + if (ps->DataInf.xyAppDpi.y > ps->wMinCmpDpi) { + pModeType ++; + pModeDiff = a_tabDiffParam + _ColorSpp100; + + if (ps->DataInf.xyAppDpi.y > 100) { + pModeType ++; + pModeDiff = a_tabDiffParam + _ColorSpp150_800; + + if (ps->DataInf.xyAppDpi.y > 150) { + pModeType ++; + pModeDiff = a_tabDiffParam + _ColorSpp300_2000; + + if (ps->DataInf.xyAppDpi.y > 300) { + + pModeType ++; + pModeDiff = a_tabDiffParam + _ColorSpp600_4000; + + if (ps->DataInf.dwAsicBytesPerPlane > 4000) + return; + else + pModeDiff--; + } else { + if (ps->DataInf.dwAsicBytesPerPlane > 3000) + pModeDiff = a_tabDiffParam + _ColorSpp300_3000; + return; + } + + if (ps->DataInf.dwAsicBytesPerPlane <= 2000) { + pModeDiff--; + if (ps->DataInf.dwAsicBytesPerPlane <= 1000) { + pModeDiff--; + + if (ps->DataInf.dwAsicBytesPerPlane <= 500) + pModeDiff--; + } + } + } else { + + if (ps->DataInf.dwAsicBytesPerPlane <= 800) + pModeDiff--; + } + } + } +} + +/*............................................................................. + * + */ +static void fnBppLineArtSpeed( pScanData ps ) +{ + pModeType = a_BwSettings + _FixParamBppBw; +/* (+) Micky, 7-14-1998 + * pModeDiff = a_tabDiffParam + _BwBpp150; + */ + pModeDiff = a_tabDiffParam + _BwBpp75; + + if( ps->DataInf.xyAppDpi.y > 75 ) { + pModeType++; + pModeDiff = a_tabDiffParam + _BwBpp150; + } +/* (-) Micky, 7-14-1998 */ + if( ps->DataInf.xyAppDpi.y > 150 ) { + if( ps->DataInf.xyAppDpi.y <= 300 ) { + pModeType++; + pModeDiff = a_tabDiffParam + _BwBpp300; + } else { + pModeType += 2; + pModeDiff = a_tabDiffParam + _BwBpp600; + } + } +} + +/*............................................................................. + * + */ +static void fnBppGraySpeed( pScanData ps ) +{ + pModeType = a_GraySettings + _FixParamBppGray; +/* (+) Micky, 7-14-1998 + * pModeDiff = a_tabDiffParam + _GrayBpp150; + */ + pModeDiff = a_tabDiffParam + _GrayBpp75; + + if( ps->DataInf.xyAppDpi.y > 75 ) { + pModeType++; + pModeDiff = a_tabDiffParam + _GrayBpp150; + } +/* (-) Micky, 7-14-1998 */ + if( ps->DataInf.xyAppDpi.y > 150 ) { + pModeType ++; + pModeDiff = a_tabDiffParam + _GrayBpp300_1600; + if( ps->DataInf.xyAppDpi.y > 300 ) { + pModeType ++; + pModeDiff = a_tabDiffParam + _GrayBpp600_3200; + if( ps->DataInf.dwAsicPixelsPerPlane <= 3200 ) + pModeDiff --; + } + if( ps->DataInf.dwAsicPixelsPerPlane <= 1600 ) + pModeDiff --; + } +} + +/*............................................................................. + * + */ +static void fnBppColorSpeed( pScanData ps ) +{ + pModeType = a_ColorSettings + _FixParamBppColor; + pModeDiff = a_tabDiffParam + _ColorBpp60; + + if (ps->DataInf.xyAppDpi.y > ps->wMinCmpDpi ) { + pModeType ++; + pModeDiff = a_tabDiffParam + _ColorBpp100; + + if( ps->DataInf.xyAppDpi.y > 100 ) { + pModeType ++; + pModeDiff = a_tabDiffParam + _ColorBpp150_800; + if( ps->DataInf.xyAppDpi.y > 150 ) { + pModeType ++; + pModeDiff = a_tabDiffParam + _ColorBpp300_1600; + if( ps->DataInf.xyAppDpi.y > 300 ) { + pModeType ++; + pModeDiff = a_tabDiffParam + _ColorBpp600_3200; + if( ps->DataInf.dwAsicBytesPerPlane <= 3200 ) + return; + else + pModeDiff--; + } + + if( ps->DataInf.dwAsicBytesPerPlane <= 1600 ) + pModeDiff--; + } + + if( ps->DataInf.dwAsicBytesPerPlane <= 800 ) + pModeDiff--; + } + } +} + +/*............................................................................. + * + */ +static void ioP98SppNegativeProcs( pScanData ps ) +{ + if ( ps->DataInf.dwScanFlag & SCANDEF_Negative ) + pModeType = a_FilmSettings + _FixParamSppNegative; + else + pModeType = a_FilmSettings + _FixParamSppPositive; + + pModeDiff = a_tabDiffParam + _NegativeSpp150; + + if (ps->DataInf.xyAppDpi.y > 150) { + if (ps->DataInf.xyAppDpi.y < 300) { + pModeType ++; + pModeDiff ++; + } else { + pModeType += 2; + pModeDiff += 2; + } + } + + if (ps->DataInf.dwScanFlag & SCANDEF_Negative) { + if (ps->AsicReg.RD_LineControl == 144) + pModeDiff += 4; + else + if (ps->AsicReg.RD_LineControl == 192) + pModeDiff += 7; + } +} + +/*............................................................................. + * + */ +static void ioP98EppNegativeProcs( pScanData ps ) +{ + if (ps->DataInf.dwScanFlag & SCANDEF_Negative) + pModeType = a_FilmSettings + _FixParamEppNegative; + else + pModeType = a_FilmSettings + _FixParamEppPositive; + + pModeDiff = a_tabDiffParam + _NegativeEpp150; + + if (ps->DataInf.xyAppDpi.y > 150) { + if (ps->DataInf.xyAppDpi.y < 300) + { + pModeType ++; + pModeDiff ++; + } else { + pModeType += 2; + pModeDiff += 2; + } + } + + if (ps->DataInf.dwScanFlag & SCANDEF_Negative) { + if (ps->AsicReg.RD_LineControl == 144) + pModeDiff += 4; + else + if (ps->AsicReg.RD_LineControl == 192) + pModeDiff += 7; + } +} + +/*............................................................................. + * + */ +static void ioP98BppNegativeProcs( pScanData ps ) +{ + if( ps->DataInf.dwScanFlag & SCANDEF_Negative) { + pModeType = a_FilmSettings + _FixParamBppNegative; + } else { + pModeType = a_FilmSettings + _FixParamBppPositive; + } + + pModeDiff = a_tabDiffParam + _NegativeBpp150; + + if( ps->DataInf.xyAppDpi.y > 150 ) { + if( ps->DataInf.xyAppDpi.y < 300 ) { + pModeType ++; + pModeDiff ++; + } else { + pModeType += 2; + pModeDiff += 2; + } + } + + if ( ps->DataInf.dwScanFlag & SCANDEF_Negative ) { + if( ps->AsicReg.RD_LineControl == 144 ) { + pModeDiff += 4; + } else { + if( ps->AsicReg.RD_LineControl == 192 ) + pModeDiff += 7; + } + } +} + +/*............................................................................. + * + */ +static void ioControlLampOnOff( pScanData ps ) +{ + Byte lampStatus; + + ps->fWarmupNeeded = _TRUE; + + if( _IS_ASIC98(ps->sCaps.AsicID)) { + + lampStatus = ps->AsicReg.RD_ScanControl & _SCAN_LAMPS_ON; + + if (ps->bLastLampStatus != lampStatus) { + + DBG( DBG_LOW, "Using OTHER Lamp !\n" ); + ps->bLastLampStatus = lampStatus; + + IOCmdRegisterToScanner( ps, ps->RegScanControl, + ps->AsicReg.RD_ScanControl); + return; + } + } else { + + lampStatus = ps->AsicReg.RD_ScanControl & _SCAN_LAMP_ON; + + if (ps->DataInf.dwScanFlag&(SCANDEF_Transparency + SCANDEF_Negative)) { + ps->bLampOn = 0; + } else { + ps->bLampOn = _SCAN_LAMP_ON; + } + + if (ps->bLastLampStatus != lampStatus) { + DBG( DBG_LOW, "Using OTHER Lamp !\n" ); + ps->bLastLampStatus = lampStatus; + return; + } + } + + ps->fWarmupNeeded = _FALSE; + DBG( DBG_LOW, "Using SAME Lamp !\n" ); +} + +/*............................................................................. + * + */ +static void ioP98InitialSetCurrentSpeed( pScanData ps ) +{ + DBG( DBG_LOW, "ioP98InitialSetCurrentSpeed()\n" ); + + if( ps->DataInf.dwScanFlag & SCANDEF_TPA) { + + switch (ps->IO.portMode) + { + case _PORT_SPP: ioP98SppNegativeProcs( ps ); break; + case _PORT_BIDI: ioP98BppNegativeProcs( ps ); break; + + default: ioP98EppNegativeProcs( ps ); break; + } + } else { + + switch (ps->IO.portMode) { + case _PORT_SPP: + a_fnSppSpeedProcs[ps->DataInf.wAppDataType](ps); + break; + + case _PORT_BIDI: + a_fnBppSpeedProcs[ps->DataInf.wAppDataType](ps); + break; + + default: + a_fnSpeedProcs[ps->DataInf.wAppDataType](ps); + break; + } + } + + ps->wInitialStep = pModeType->wHomePos; + ps->wMaxMoveStep = pModeType->wMaxSteps; + + ps->AsicReg.RD_LineControl = pModeType->bExposureTime; + + if (ps->DataInf.dwScanFlag & SCANDEF_Negative) + ps->AsicReg.RD_LineControl = 144; + +#ifdef DEBUG + if( pModeType->bFlagScanMode != ps->Shade.bIntermediate ) + DBG( DBG_HIGH, "bSetScanModeFlag != bIntermediate\n" ); +#endif + + ps->bHpMotor = pModeType->bMotorStep; + ps->bSetScanModeFlag = pModeType->bFlagScanMode; + ps->bShadingTimeFlag = pModeType->bTimesShading; + + ps->dwFullStateSpeed = pModeDiff->dwFullSpeed; + ps->bCurrentSpeed = pModeDiff->bCurrentSpeed; + ps->bStepSpeed = pModeDiff->bStepSpeed; + + if( ps->DataInf.xyAppDpi.y > 600 ) { + if( ps->dwFullStateSpeed ) + ps->dwFullStateSpeed = 0; + else + ps->bStepSpeed <<= 1; + ps->wMaxMoveStep <<= 1; + } +} + +/************************ exported functions *********************************/ + +/*............................................................................. + * here we do some init work + */ +_LOC int IOFuncInitialize( pScanData ps ) +{ + DBG( DBG_HIGH, "IOFuncInitialize()\n" ); + + if( NULL == ps ) + return _E_NULLPTR; + + ps->lpEppColorHomePos = &a_ColorSettings[0]; + ps->lpEppColorExposure = &a_ColorSettings[4]; + ps->lpBppColorHomePos = &a_ColorSettings[5]; + ps->lpSppColorHomePos = &a_ColorSettings[10]; + ps->a_tabDiffParam = a_tabDiffParam; + ps->a_ColorSettings = a_ColorSettings; + + /* + * depending on the asic, we set some functions + */ + if( _IS_ASIC98(ps->sCaps.AsicID)) { + + ps->InitialSetCurrentSpeed = ioP98InitialSetCurrentSpeed; + + } else if( _IS_ASIC96(ps->sCaps.AsicID)) { + + ps->InitialSetCurrentSpeed = ioP96InitialSetCurrentSpeed; + + } else { + + DBG( DBG_HIGH , "NOT SUPPORTED ASIC !!!\n" ); + return _E_NOSUPP; + } + + return _OK; +} + +/*............................................................................. + * 1) Fill scan states to asic. + * 2) Refresh the scan states if necessary + * 3) Wait for motor running within half-second period. + */ +_LOC Byte IOSetToMotorRegister( pScanData ps ) +{ + ps->OpenScanPath( ps ); + + IORegisterToScanner( ps, ps->RegInitScanState ); + + IODownloadScanStates( ps ); + + ps->CloseScanPath( ps ); + + if( _ASIC_IS_98001 != ps->sCaps.AsicID ) { + return 0; + } + + ps->Scan.bOldScanState = IOGetScanState( ps, _FALSE ); + + return ps->Scan.bOldScanState; +} + +/*............................................................................. + * 1) If scanner path is not established, connect it + * 2) Read the recent state count + * 3) Disconnect the path if necessary + */ +_LOC Byte IOGetScanState( pScanData ps, Bool fOpenned ) +{ + Byte bScanState, bScanStateNow; + + if( !fOpenned && (_ASIC_IS_98003 != ps->sCaps.AsicID)) + ps->OpenScanPath( ps ); + + bScanState = IODataFromRegister( ps, ps->RegGetScanState ); + bScanStateNow = IODataFromRegister( ps, ps->RegGetScanState ); + + if((bScanState != bScanStateNow) + || ((ps->sCaps.AsicID == _ASIC_IS_98001 && bScanState & 0x40))) { + bScanState = IODataFromRegister( ps, ps->RegGetScanState); + } + + if( !fOpenned && (_ASIC_IS_98003 != ps->sCaps.AsicID)) + ps->CloseScanPath( ps ); + + return bScanState; +} + +/*............................................................................. + * ASIC 98003 specific function to read status 2 regiser + */ +_LOC Byte IOGetExtendedStatus( pScanData ps ) +{ + Byte b; + + b = IODataFromRegister( ps, ps->RegStatus2 ); + + if( b == 0xff ) + return 0; + return b; +} + +/*............................................................................. + * Read the scan state. Return the count with status bit, and count. + */ +_LOC void IOGetCurrentStateCount( pScanData ps, pScanState pScanStep ) +{ + pScanStep->bStatus = IOGetScanState( ps, _FALSE ); + pScanStep->bStep = pScanStep->bStatus & _SCANSTATE_MASK; +} + +/*............................................................................. + * 1) If scanner connection is not established, return error + * 2) If paper not ready, return error + * 3) If scanning environment is not prepared, return error + * 4) Setup the buffers for reassembler the CCD incoming lines. + * 5) Initiate the registers of asic. + * [NOTE] + * This routine combines from SetupAsicDependentVariables & IsReadyForScan + * routines in assembly source. + */ +_LOC int IOIsReadyForScan( pScanData ps ) +{ + ULong dw; + pULong pdwTable; + + if((_NO_BASE != ps->sCaps.wIOBase) && + (ps->DataInf.dwVxdFlag & _VF_ENVIRONMENT_READY)) { + + if( _ASIC_IS_98001 == ps->sCaps.AsicID ) { + + IOSelectLampSource( ps ); + ioControlLampOnOff( ps ); + ps->AsicReg.RD_Motor0Control = 0; /* motor off */ + ps->AsicReg.RD_Motor1Control = 0; /* motor off */ + ps->AsicReg.RD_ModelControl = (_ModelDpi600 + + _LED_ACTIVITY + _LED_CONTROL); + ps->AsicReg.RD_Origin = 0; + ps->AsicReg.RD_Pixels = 5110; + + } else if( _ASIC_IS_98003 == ps->sCaps.AsicID ) { + + ps->OpenScanPath( ps ); + P12SetGeneralRegister( ps ); + ps->CloseScanPath( ps ); + + ioControlLampOnOff( ps ); + + } else { + + ioControlLampOnOff( ps ); + + /* SetupAsicDependentVariables */ + ps->pPutBufR = ps->pGetBufR = ps->pPrescan16; /* 1st color plane */ + ps->pPutBufG = ps->pGetBufG = ps->pPrescan8; /* 2nd color plane */ + + ps->AsicReg.RD_ScanControl = ps->bLampOn; + ps->Asic96Reg.RD_MotorControl = 0; + ps->AsicReg.RD_Origin = 0; + ps->AsicReg.RD_ModelControl = ps->Device.ModelCtrl | _ModelWhiteIs0; + ps->AsicReg.RD_Pixels = 5110; /* ps->RdPix; */ + IOPutOnAllRegisters( ps ); + } + + /* + * MotorInitiate + */ + if( _ASIC_IS_98003 != ps->sCaps.AsicID ) { + for (dw = _SCANSTATE_BYTES, + pdwTable = (pULong)ps->a_wMoveStepTable; dw; dw--, pdwTable++) { + *pdwTable = 0x10001; + } + + memset( ps->a_bColorByteTable, 0, _NUMBER_OF_SCANSTEPS ); + } + + return _OK; + } + + return _E_SEQUENCE; +} + +/*............................................................................. + * + */ +_LOC void IOSetXStepLineScanTime( pScanData ps, Byte b ) +{ + ps->AsicReg.RD_LineControl = b; + ps->bSpeed1 = b; + ps->bSpeed2 = b >> 1; + ps->bSpeed4 = b >> 2; + ps->bSpeed8 = b >> 3; + ps->bSpeed16 = b >> 4; + ps->bSpeed32 = b >> 5; + ps->bSpeed24 = b / 24; + ps->bSpeed12 = b / 12; + ps->bSpeed6 = b / 6; + ps->bSpeed3 = b / 3; +} + +/*............................................................................. + * 1) Reset and fill all new scan states (Mode = Scan) + * 2) Refresh scan state + * 3) Wait for motor running within half second. + */ +_LOC void IOSetToMotorStepCount( pScanData ps ) +{ + ULong dw; + pUChar pb; + TimerDef timer; + + ps->OpenScanPath( ps ); + + if( _ASIC_IS_98001 == ps->sCaps.AsicID ) { + IORegisterToScanner( ps, ps->RegInitScanState ); + } else { + ps->AsicReg.RD_ModeControl = _ModeScan; + IODataToRegister( ps, ps->RegModeControl, _ModeScan ); + } + IORegisterToScanner( ps, ps->RegScanStateControl ); + + for (dw = _SCANSTATE_BYTES, pb = ps->a_nbNewAdrPointer; dw; dw--, pb++) + IODataToScanner( ps, *pb ); + + IORegisterToScanner( ps, ps->RegRefreshScanState ); + + MiscStartTimer( &timer, (_SECOND/2)); + do { + + if (!( IOGetScanState( ps, _TRUE) & _SCANSTATE_STOP)) + break; + } + while( !MiscCheckTimer(&timer)); + +/* CHECK - this line has been added by Rick ? Why ? + * return (pScanData->bOldTempScanState = GetScanState (pScanData, FALSE)); + */ + ps->Scan.bOldScanState = IOGetScanState( ps, _TRUE ); + + ps->CloseScanPath( ps ); +} + +/*............................................................................. + * + */ +_LOC void IOSelectLampSource( pScanData ps ) +{ + ps->AsicReg.RD_ScanControl &= (~_SCAN_LAMPS_ON); + + if (ps->DataInf.dwScanFlag & (SCANDEF_TPA)) { + ps->AsicReg.RD_ScanControl |= _SCAN_TPALAMP_ON; + } else { + ps->AsicReg.RD_ScanControl |= _SCAN_NORMALLAMP_ON; + } +} + +/*............................................................................. + * + */ +_LOC Bool IOReadOneShadingLine( pScanData ps, pUChar pBuf, ULong len ) +{ + TimerDef timer; + + MiscStartTimer( &timer, _SECOND ); + + if( _ASIC_IS_98003 == ps->sCaps.AsicID ) + ps->Scan.bFifoSelect = ps->RegGFifoOffset; + + do { + if( IOReadFifoLength( ps ) >= ps->AsicReg.RD_Pixels ) { + + IOReadColorData( ps, pBuf, len ); + return _TRUE; + } + } while( _OK == MiscCheckTimer( &timer )); + + return _FALSE; +} + +/*............................................................................. + * + */ +_LOC ULong IOReadFifoLength( pScanData ps ) +{ + DataType Data; + + Data.dwValue = 0; + + if( _ASIC_IS_98003 != ps->sCaps.AsicID ) + ps->OpenScanPath( ps ); + + IODataToRegister( ps, ps->RegBitDepth, _BIT0_7 ); + Data.dwOverlap.w1st.b1st = IODataFromRegister( ps, ps->Scan.bFifoSelect ); + + IODataToRegister( ps, ps->RegBitDepth, _BIT8_15 ); + Data.dwOverlap.w1st.b2nd = IODataFromRegister( ps, ps->Scan.bFifoSelect ); + + IODataToRegister( ps, ps->RegBitDepth, _BIT16_20 ); + Data.dwOverlap.w2nd.b1st = (IODataFromRegister( ps, ps->Scan.bFifoSelect) & 0x0f); + + if( _ASIC_IS_98003 != ps->sCaps.AsicID ) + ps->CloseScanPath( ps ); + + return Data.dwValue; +} + +/*............................................................................. + * 1) Initiates the scan states + * 2) Write the contents to corresponding registers (from ps->RegModeControl to + * ps->RegGreenGainOutDirect (P9363) or from ps->RegModeControl to + * ps->RegModeControl2 (48xx) + */ +_LOC void IOPutOnAllRegisters( pScanData ps ) +{ + pUChar pValue; + Byte bReg; + + /* setup scan states */ + if( _ASIC_IS_98003 == ps->sCaps.AsicID ) + IODownloadScanStates( ps ); + else { + IOSetToMotorRegister( ps ); + ps->OpenScanPath( ps ); + } + + if( _IS_ASIC98(ps->sCaps.AsicID)) { + + IODataToRegister(ps, ps->RegStepControl, ps->AsicReg.RD_StepControl); + IODataToRegister(ps, ps->RegMotor0Control, + ps->AsicReg.RD_Motor0Control); + + if( _ASIC_IS_98003 == ps->sCaps.AsicID ) + IODataToRegister(ps,ps->RegLineControl,ps->AsicReg.RD_LineControl); + + IODataToRegister(ps, ps->RegXStepTime, ps->AsicReg.RD_XStepTime); + IODataToRegister(ps, ps->RegModelControl, ps->AsicReg.RD_ModelControl); + + /* the 1st register to write */ + pValue = (pUChar)&ps->AsicReg.RD_Dpi; + + /* 0x21 - 0x28 */ + for (bReg = ps->RegDpiLow; + bReg <= ps->RegThresholdHigh; bReg++, pValue++) { + + IODataToRegister( ps, bReg, *pValue); + } + + IORegisterToScanner( ps, ps->RegInitDataFifo ); + IORegisterToScanner( ps, ps->RegRefreshScanState ); + + if( _ASIC_IS_98003 == ps->sCaps.AsicID ) + IODataToRegister( ps, ps->RegModeControl, _ModeScan ); + else + IODataToRegister( ps, ps->RegModeControl, (_ModeScan + _ModeFifoRSel)); + + } else { + + /* + * the original driver uses a loop, starting at RegModeControl + * 0x18 - 0x26 + * as we use the Asic96Reg structure only for the differences + * to the AsicReg struct, we have to write to each register by hand + */ + IODataToRegister( ps, ps->RegModeControl, ps->AsicReg.RD_ModeControl ); + IODataToRegister( ps, ps->RegLineControl, ps->AsicReg.RD_LineControl ); + IODataToRegister( ps, ps->RegScanControl, ps->AsicReg.RD_ScanControl ); + IODataToRegister( ps, ps->RegMotorControl, + ps->Asic96Reg.RD_MotorControl ); + IODataToRegister( ps, ps->RegModelControl, + ps->AsicReg.RD_ModelControl ); + IODataToRegister( ps, ps->RegMemAccessControl, + ps->Asic96Reg.RD_MemAccessControl ); + +#if 0 + DBG( DBG_LOW, "[0x%02x] = 0x%02x\n", + ps->RegModeControl, ps->AsicReg.RD_ModeControl ); + DBG( DBG_LOW, "[0x%02x] = 0x%02x\n", + ps->RegLineControl, ps->AsicReg.RD_LineControl ); + DBG( DBG_LOW, "[0x%02x] = 0x%02x\n", + ps->RegScanControl, ps->AsicReg.RD_ScanControl ); + DBG( DBG_LOW, "[0x%02x] = 0x%02x\n", + ps->RegMotorControl, ps->Asic96Reg.RD_MotorControl ); + DBG( DBG_LOW, "[0x%02x] = 0x%02x\n", + ps->RegModelControl, ps->AsicReg.RD_ModelControl ); + DBG( DBG_LOW, "[0x%02x] = 0x%02x\n", + ps->RegMemAccessControl, ps->Asic96Reg.RD_MemAccessControl ); +#endif + + pValue = (pUChar)&ps->AsicReg.RD_Dpi; + + /* 0x21 - 0x26 */ + for (bReg = ps->RegDpiLow; + bReg <= ps->RegWidthPixelsHigh; bReg++, pValue++) { + + IODataToRegister( ps, bReg, *pValue ); +#if 0 + DBG( DBG_LOW, "[0x%02x] = 0x%02x\n", bReg, *pValue ); +#endif + } + + /* the rest */ + IODataToRegister( ps, ps->RegThresholdControl, + (Byte)ps->AsicReg.RD_ThresholdControl ); + + IODataToRegister( ps, ps->RegWatchDogControl, + (Byte)ps->Asic96Reg.RD_WatchDogControl ); + + IODataToRegister( ps, ps->RegModelControl2, + ps->Asic96Reg.u26.RD_ModelControl2 ); + +#if 0 + DBG( DBG_LOW, "[0x%02x] = 0x%02x\n", + ps->RegThresholdControl, ps->AsicReg.RD_ThresholdControl ); + DBG( DBG_LOW, "[0x%02x] = 0x%02x\n", + ps->RegWatchDogControl, ps->Asic96Reg.RD_WatchDogControl ); + DBG( DBG_LOW, "[0x%02x] = 0x%02x\n", + ps->RegModelControl2, ps->Asic96Reg.u26.RD_ModelControl2 ); +#endif + IORegisterToScanner( ps, ps->RegInitDataFifo ); + } + + if( _ASIC_IS_98003 != ps->sCaps.AsicID ) + ps->CloseScanPath( ps ); +} + +/*............................................................................. + * + */ +_LOC void IOReadColorData( pScanData ps, pUChar pBuf, ULong len ) +{ + ps->AsicReg.RD_ModeControl = _ModeFifoRSel; + IOReadScannerImageData( ps, pBuf, len ); + + ps->AsicReg.RD_ModeControl = _ModeFifoGSel; + IOReadScannerImageData( ps, pBuf + len, len ); + + ps->AsicReg.RD_ModeControl = _ModeFifoBSel; + IOReadScannerImageData( ps, pBuf + len * 2, len ); +} + +/* END PLUSTEK-PP_GENERICIO.C ...............................................*/ |