summaryrefslogtreecommitdiff
path: root/backend/plustek-pp_genericio.c
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-pp_genericio.c
Initial import of sane-backends version 1.0.24-1.2
Diffstat (limited to 'backend/plustek-pp_genericio.c')
-rw-r--r--backend/plustek-pp_genericio.c1463
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 ...............................................*/