1141cc406Sopenharmony_ci/* @file plustek-pp_genericio.c
2141cc406Sopenharmony_ci * @brief all i/o functions
3141cc406Sopenharmony_ci *
4141cc406Sopenharmony_ci * based on sources acquired from Plustek Inc.
5141cc406Sopenharmony_ci * Copyright (C) 1998 Plustek Inc.
6141cc406Sopenharmony_ci * Copyright (C) 2000-2004 Gerhard Jaeger <gerhard@gjaeger.de>
7141cc406Sopenharmony_ci * also based on the work done by Rick Bronson
8141cc406Sopenharmony_ci *
9141cc406Sopenharmony_ci * History:
10141cc406Sopenharmony_ci * - 0.30 - initial version
11141cc406Sopenharmony_ci * - 0.31 - moved ioP96ReadScannerImageData and ioP98ReadScannerImageData
12141cc406Sopenharmony_ci *          into this file
13141cc406Sopenharmony_ci *        - added SPP-read functions
14141cc406Sopenharmony_ci * - 0.32 - changes in function ioControlLampOnOff()
15141cc406Sopenharmony_ci *        - made IOReadingImage a local function -> ioP98ReadingImage()
16141cc406Sopenharmony_ci *        - rewritten function ioP96ReadScannerImageData()
17141cc406Sopenharmony_ci *        - moved function IOSetStartStopRegister to p9636.c
18141cc406Sopenharmony_ci * - 0.33 - added debug messages to IOPutOnAllRegisters
19141cc406Sopenharmony_ci *        - fixed a bug in ioP96InitialSetCurrentSpeed
20141cc406Sopenharmony_ci * - 0.34 - no changes
21141cc406Sopenharmony_ci * - 0.35 - no changes
22141cc406Sopenharmony_ci * - 0.36 - removed some warning conditions
23141cc406Sopenharmony_ci * - 0.37 - moved functions IOSPPWrite(), IODataToScanner(), IODataToRegister(),
24141cc406Sopenharmony_ci *          IODataFromRegister() to io.c
25141cc406Sopenharmony_ci *        - moved the data read functions to io.c
26141cc406Sopenharmony_ci *        - renamed IOInitialize to IOFuncInitialize
27141cc406Sopenharmony_ci * - 0.38 - moved some functions to io.c
28141cc406Sopenharmony_ci *        - added P12 stuff
29141cc406Sopenharmony_ci * - 0.39 - no changes
30141cc406Sopenharmony_ci * - 0.40 - no changes
31141cc406Sopenharmony_ci * - 0.41 - no changes
32141cc406Sopenharmony_ci * - 0.42 - changed include names
33141cc406Sopenharmony_ci * - 0.43 - fixed a problem in ioP96InitialSetCurrentSpeed(), for COLOR_BW
34141cc406Sopenharmony_ci *          at least, used the setting for A3I
35141cc406Sopenharmony_ci * .
36141cc406Sopenharmony_ci * <hr>
37141cc406Sopenharmony_ci * This file is part of the SANE package.
38141cc406Sopenharmony_ci *
39141cc406Sopenharmony_ci * This program is free software; you can redistribute it and/or
40141cc406Sopenharmony_ci * modify it under the terms of the GNU General Public License as
41141cc406Sopenharmony_ci * published by the Free Software Foundation; either version 2 of the
42141cc406Sopenharmony_ci * License, or (at your option) any later version.
43141cc406Sopenharmony_ci *
44141cc406Sopenharmony_ci * This program is distributed in the hope that it will be useful, but
45141cc406Sopenharmony_ci * WITHOUT ANY WARRANTY; without even the implied warranty of
46141cc406Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
47141cc406Sopenharmony_ci * General Public License for more details.
48141cc406Sopenharmony_ci *
49141cc406Sopenharmony_ci * You should have received a copy of the GNU General Public License
50141cc406Sopenharmony_ci * along with this program.  If not, see <https://www.gnu.org/licenses/>.
51141cc406Sopenharmony_ci *
52141cc406Sopenharmony_ci * As a special exception, the authors of SANE give permission for
53141cc406Sopenharmony_ci * additional uses of the libraries contained in this release of SANE.
54141cc406Sopenharmony_ci *
55141cc406Sopenharmony_ci * The exception is that, if you link a SANE library with other files
56141cc406Sopenharmony_ci * to produce an executable, this does not by itself cause the
57141cc406Sopenharmony_ci * resulting executable to be covered by the GNU General Public
58141cc406Sopenharmony_ci * License.  Your use of that executable is in no way restricted on
59141cc406Sopenharmony_ci * account of linking the SANE library code into it.
60141cc406Sopenharmony_ci *
61141cc406Sopenharmony_ci * This exception does not, however, invalidate any other reasons why
62141cc406Sopenharmony_ci * the executable file might be covered by the GNU General Public
63141cc406Sopenharmony_ci * License.
64141cc406Sopenharmony_ci *
65141cc406Sopenharmony_ci * If you submit changes to SANE to the maintainers to be included in
66141cc406Sopenharmony_ci * a subsequent release, you agree by submitting the changes that
67141cc406Sopenharmony_ci * those changes may be distributed with this exception intact.
68141cc406Sopenharmony_ci *
69141cc406Sopenharmony_ci * If you write modifications of your own for SANE, it is your choice
70141cc406Sopenharmony_ci * whether to permit this exception to apply to your modifications.
71141cc406Sopenharmony_ci * If you do not wish that, delete this exception notice.
72141cc406Sopenharmony_ci * <hr>
73141cc406Sopenharmony_ci */
74141cc406Sopenharmony_ci#include "plustek-pp_scan.h"
75141cc406Sopenharmony_ci
76141cc406Sopenharmony_ci/*************************** local vars **************************************/
77141cc406Sopenharmony_ci
78141cc406Sopenharmony_ci/* WORK COMMENT THIS */
79141cc406Sopenharmony_citypedef void (*pFnSpeed_Set)(pScanData);
80141cc406Sopenharmony_ci
81141cc406Sopenharmony_cistatic ModeTypeVar a_FilmSettings[18] = {
82141cc406Sopenharmony_ci	/* SppNegFilmPos */
83141cc406Sopenharmony_ci	{0xa0, 1782, 96, _QuarterStep, 0, 0},
84141cc406Sopenharmony_ci	{0xb7, 1782, 96, _QuarterStep, 0, 0},
85141cc406Sopenharmony_ci	{0xb7, 1782, 96, _QuarterStep, 0, 0},
86141cc406Sopenharmony_ci	/* BppNegFilmPos */
87141cc406Sopenharmony_ci	{0xa9, 1782, 96, _QuarterStep, 0, 0},
88141cc406Sopenharmony_ci	{0xbf, 1782, 96, _QuarterStep, 0, 0},
89141cc406Sopenharmony_ci	{0xbf, 1782, 96, _QuarterStep, 0, 0},
90141cc406Sopenharmony_ci	/* EppNegFilmPos */
91141cc406Sopenharmony_ci	{0x95, 1782, 96, _QuarterStep, 0, 0},
92141cc406Sopenharmony_ci	{0xa6, 1782, 96, _QuarterStep, 0, 0},
93141cc406Sopenharmony_ci	{0xa6, 1782, 96, _QuarterStep, 0, 0},
94141cc406Sopenharmony_ci	/* SppPosFilmPos */
95141cc406Sopenharmony_ci	{0x50, 1782, 96, _QuarterStep, 0, 0},
96141cc406Sopenharmony_ci	{0x67, 1782, 96, _QuarterStep, 0, 0},
97141cc406Sopenharmony_ci	{0x67, 1782, 96, _QuarterStep, 0, 0},
98141cc406Sopenharmony_ci	/* BppPosFilmPos */
99141cc406Sopenharmony_ci	{0x59, 1782, 96, _QuarterStep, 0, 0},
100141cc406Sopenharmony_ci	{0x6f, 1782, 96, _QuarterStep, 0, 0},
101141cc406Sopenharmony_ci	{0x6f, 1782, 96, _QuarterStep, 0, 0},
102141cc406Sopenharmony_ci	/* EppPosFilmPos */
103141cc406Sopenharmony_ci	{0x45, 1782, 96, _QuarterStep, 0, 0},
104141cc406Sopenharmony_ci	{0x56, 1782, 96, _QuarterStep, 0, 0},
105141cc406Sopenharmony_ci	{0x56, 1782, 96, _QuarterStep, 0, 0}
106141cc406Sopenharmony_ci};
107141cc406Sopenharmony_ci
108141cc406Sopenharmony_cistatic ModeTypeVar a_BwSettings[12] = {
109141cc406Sopenharmony_ci	{_Home_BE75,   890, 96, _HalfStep,    2, 1},
110141cc406Sopenharmony_ci	{_Home_BE150, 1780, 88, _QuarterStep, 2, 0},
111141cc406Sopenharmony_ci	{_Home_BE300, 3542, 96, _QuarterStep, 2, 0},
112141cc406Sopenharmony_ci	{_Home_BE600, 7070, 96, _QuarterStep, 2, 0},
113141cc406Sopenharmony_ci	{_Home_BB75,   890, 96, _HalfStep,    2, 1},
114141cc406Sopenharmony_ci	{_Home_BB150, 1780, 88, _QuarterStep, 2, 0},
115141cc406Sopenharmony_ci	{_Home_BB300, 3542, 96, _QuarterStep, 2, 0},
116141cc406Sopenharmony_ci	{_Home_BB600, 7070, 96, _QuarterStep, 2, 0},
117141cc406Sopenharmony_ci	{_Home_BS75,   890, 96, _HalfStep,    2, 1},
118141cc406Sopenharmony_ci	{_Home_BS150, 1780, 88, _QuarterStep, 2, 0},
119141cc406Sopenharmony_ci	{_Home_BS300, 3542, 96, _QuarterStep, 2, 0},
120141cc406Sopenharmony_ci	{_Home_BS600, 7070, 96, _QuarterStep, 2, 0}
121141cc406Sopenharmony_ci};
122141cc406Sopenharmony_ci
123141cc406Sopenharmony_cistatic ModeTypeVar a_GraySettings[12] = {
124141cc406Sopenharmony_ci	{_Home_GE75,   890, 96, _HalfStep,    2, 0},
125141cc406Sopenharmony_ci	{_Home_GE150, 1780, 88, _QuarterStep, 2, 0},
126141cc406Sopenharmony_ci	{_Home_GE300, 3542, 88, _QuarterStep, 2, 0},
127141cc406Sopenharmony_ci	{_Home_GE600, 7070, 88, _QuarterStep, 2, 0},
128141cc406Sopenharmony_ci	{_Home_GB75,   890, 96, _HalfStep,    2, 0},
129141cc406Sopenharmony_ci	{_Home_GB150, 1780, 88, _QuarterStep, 2, 0},
130141cc406Sopenharmony_ci	{_Home_GB300, 3542, 88, _QuarterStep, 2, 0},
131141cc406Sopenharmony_ci	{_Home_GB600, 7070, 88, _QuarterStep, 2, 0},
132141cc406Sopenharmony_ci	{_Home_GS75,   890, 96, _HalfStep,    2, 0},
133141cc406Sopenharmony_ci	{_Home_GS150, 1782, 96, _QuarterStep, 2, 0},
134141cc406Sopenharmony_ci	{_Home_GS300, 3549, 88, _QuarterStep, 2, 0},
135141cc406Sopenharmony_ci	{_Home_GS600, 7070, 88, _QuarterStep, 2, 0}
136141cc406Sopenharmony_ci};
137141cc406Sopenharmony_ci
138141cc406Sopenharmony_cistatic ModeTypeVar a_ColorSettings[15] = {
139141cc406Sopenharmony_ci	{_Home_CE50,   720,  60, _HalfStep,	   1, 1},
140141cc406Sopenharmony_ci	{_Home_CE100, 1782,  48, _QuarterStep, 1, 0},
141141cc406Sopenharmony_ci	{_Home_CE150, 1782,  88, _QuarterStep, 0, 0},
142141cc406Sopenharmony_ci	{_Home_CE300, 3549,  96, _QuarterStep, 0, 0},
143141cc406Sopenharmony_ci	{_Home_CE600, 7082,  96, _QuarterStep, 0, 0},
144141cc406Sopenharmony_ci	{_Home_CB50,   720, 120, _QuarterStep, 0, 1},
145141cc406Sopenharmony_ci	{_Home_CB100, 1782,  96, _QuarterStep, 0, 0},
146141cc406Sopenharmony_ci	{_Home_CB150, 1782,  96, _QuarterStep, 0, 0},
147141cc406Sopenharmony_ci	{_Home_CB300, 3549,  96, _QuarterStep, 0, 0},
148141cc406Sopenharmony_ci	{_Home_CB600, 7082,  96, _QuarterStep, 0, 0},
149141cc406Sopenharmony_ci	{_Home_CS50,   720, 120, _QuarterStep, 0, 1},
150141cc406Sopenharmony_ci	{_Home_CS100, 1782,  96, _QuarterStep, 0, 0},
151141cc406Sopenharmony_ci	{_Home_CS150, 1782,  96, _QuarterStep, 0, 0},
152141cc406Sopenharmony_ci	{_Home_CS300, 3549,  96, _QuarterStep, 0, 0},
153141cc406Sopenharmony_ci	{_Home_CS600, 7082,  96, _QuarterStep, 0, 0}
154141cc406Sopenharmony_ci};
155141cc406Sopenharmony_ci
156141cc406Sopenharmony_cistatic DiffModeVar a_tabDiffParam[] ={
157141cc406Sopenharmony_ci	/* BPP/EPP B/W */
158141cc406Sopenharmony_ci	{0, 1, 11}, /* Bpp/Epp B/W, Dpi <= 150		 ;(0) */
159141cc406Sopenharmony_ci	{0, 1, 24}, /* Bpp/Epp B/W, Dpi <= 300		 ;(1) */
160141cc406Sopenharmony_ci	{0, 1, 48}, /* Bpp/Epp B/W, Dpi > 300		 ;(2) */
161141cc406Sopenharmony_ci   	/* SPP B/W */
162141cc406Sopenharmony_ci	{0, 1, 11}, /* Spp B/W, Dpi <= 150		 ;(3) */
163141cc406Sopenharmony_ci	{0, 1, 24}, /* Spp B/W, Dpi <= 300		 ;(4) */
164141cc406Sopenharmony_ci    {0, 1, 48}, /* Spp B/W, Dpi > 300		 ;(5) */
165141cc406Sopenharmony_ci	/* EPP Gray */
166141cc406Sopenharmony_ci	/* The difference for this DPI:
167141cc406Sopenharmony_ci     * if pixels <=        | 3000 | Others
168141cc406Sopenharmony_ci     * --------------------+------+-------------
169141cc406Sopenharmony_ci     *  VarFullStateSpeed  |   0  |   1
170141cc406Sopenharmony_ci     *  VarCurrentSpeed    |   1  |   2
171141cc406Sopenharmony_ci     *  VarStepSpeed       |  44  |  88
172141cc406Sopenharmony_ci     */
173141cc406Sopenharmony_ci		{0, 1, 12}, /* Epp Gray, Dpi <= 150		 ;(6)         */
174141cc406Sopenharmony_ci		{1, 2, 80}, /* Epp Gray, Dpi <= 300		 ;(7)         */
175141cc406Sopenharmony_ci		{0, 1, 80}, /* Epp Gray, Dpi > 300, Px <= 3000	 ;(8) */
176141cc406Sopenharmony_ci		{0, 1, 80}, /* Epp Gray, Dpi > 300, Px > 3000	 ;(9) */
177141cc406Sopenharmony_ci
178141cc406Sopenharmony_ci   /* BPP Gray */
179141cc406Sopenharmony_ci		{0, 1, 11}, /* Bpp Gray, Dpi <= 150		 ; 10 */
180141cc406Sopenharmony_ci	/* The difference for this DPI:
181141cc406Sopenharmony_ci	 *     if pixels <=    | 1600 | Others
182141cc406Sopenharmony_ci	 * --------------------+------+-------------
183141cc406Sopenharmony_ci	 *   VarFullStateSpeed |   0  |   1
184141cc406Sopenharmony_ci	 *   VarCurrentSpeed   |   1  |   2
185141cc406Sopenharmony_ci	 *   VarStepSpeed      |  24  |  48
186141cc406Sopenharmony_ci     */
187141cc406Sopenharmony_ci		{0, 1, 24}, /* Bpp Gray, Dpi <= 300, Px <= 1600  ; 11 */
188141cc406Sopenharmony_ci		{1, 2, 48}, /* Bpp Gray, Dpi <= 300, Px > 1600	 ; 12 */
189141cc406Sopenharmony_ci	/* The difference for this DPI:
190141cc406Sopenharmony_ci	 *     if pixels <=    | 1600 | 3200 | Others
191141cc406Sopenharmony_ci	 * --------------------+-----+-------+----------------------
192141cc406Sopenharmony_ci	 *   VarFullStateSpeed |  0  |	 1   |	 2
193141cc406Sopenharmony_ci	 *   VarCurrentSpeed   |  1  |	 2   |	 4
194141cc406Sopenharmony_ci	 *	 VarStepSpeed      | 44  |	88   |	88
195141cc406Sopenharmony_ci	 */
196141cc406Sopenharmony_ci		{0, 1, 44}, /* Bpp Gray, Dpi > 300, Px <= 1600	 ; 13 */
197141cc406Sopenharmony_ci		{1, 2, 88}, /* Bpp Gray, Dpi > 300, Px <= 3200	 ; 14 */
198141cc406Sopenharmony_ci		{2, 4, 88}, /* Bpp Gray, Dpi > 300, Px > 3200	 ; 15 */
199141cc406Sopenharmony_ci    /* SPP Gray */
200141cc406Sopenharmony_ci	/* The difference for this DPI:
201141cc406Sopenharmony_ci	 *     if pixels <=    | 800 | Others
202141cc406Sopenharmony_ci	 * --------------------+-----+-------------
203141cc406Sopenharmony_ci	 *   VarFullStateSpeed |  0  |	 1
204141cc406Sopenharmony_ci	 *   VarCurrentSpeed   |  1  |	 2
205141cc406Sopenharmony_ci	 *	 VarStepSpeed      | 12  |	24
206141cc406Sopenharmony_ci	 */
207141cc406Sopenharmony_ci		{0, 1, 12}, /* Spp Gray, Dpi <= 150, Px <= 800	 ; 16 */
208141cc406Sopenharmony_ci		{1, 2, 24}, /* Spp Gray, Dpi <= 150, Px > 800	 ; 17 */
209141cc406Sopenharmony_ci	/* The difference for this DPI:
210141cc406Sopenharmony_ci	 *     if pixels <=    |  800 | 1600 | Others
211141cc406Sopenharmony_ci	 * --------------------+-----+-------+----------------------
212141cc406Sopenharmony_ci     *   VarFullStateSpeed |  0  |	 1   |	 1
213141cc406Sopenharmony_ci	 *   VarCurrentSpeed   |  1  |	 2   |	 4
214141cc406Sopenharmony_ci	 *   VarStepSpeed      | 22  |	88   |	88
215141cc406Sopenharmony_ci	 */
216141cc406Sopenharmony_ci		{0, 1, 22}, /* Spp Gray, Dpi <= 300, Px <= 800	 ; 18 */
217141cc406Sopenharmony_ci		{1, 2, 88}, /* Spp Gray, Dpi <= 300, Px <= 1600  ; 19 */
218141cc406Sopenharmony_ci		{1, 4, 88}, /* Spp Gray, Dpi <= 300, Px > 1600	 ; 20 */
219141cc406Sopenharmony_ci	/* The difference for this DPI:
220141cc406Sopenharmony_ci	 *     if pixels <=    | 800 | 1600 | 3200 | Others
221141cc406Sopenharmony_ci	 * --------------------+-----+------+------+---------------
222141cc406Sopenharmony_ci	 *   VarFullStateSpeed |  0  |	 1  |	2  |   3
223141cc406Sopenharmony_ci	 *   VarCurrentSpeed   |  1  |	 2  |	4  |   6
224141cc406Sopenharmony_ci	 *   VarStepSpeed      | 44  |	88  |  88  |  88
225141cc406Sopenharmony_ci	 */
226141cc406Sopenharmony_ci		{0, 1, 44}, /* Spp Gray, Dpi > 300, Px <= 800	 ; 21 */
227141cc406Sopenharmony_ci		{1, 2, 88}, /* Spp Gray, Dpi > 300, Px <= 1600	 ; 22 */
228141cc406Sopenharmony_ci		{2, 4, 88}, /* Spp Gray, Dpi > 300, Px <= 3200	 ; 23 */
229141cc406Sopenharmony_ci		{3, 6, 88}, /* Spp Gray, Dpi > 300, Px > 3200	 ; 24 */
230141cc406Sopenharmony_ci	/* EPP Color */
231141cc406Sopenharmony_ci		{0, 1, 6},  /* Epp Color, Dpi <= 60/100 	 ; 25 */
232141cc406Sopenharmony_ci		{0, 1, 11}, /* Epp Color, Dpi <= 150		 ; 26 */
233141cc406Sopenharmony_ci	/* The difference for this DPI:
234141cc406Sopenharmony_ci	 *     if pixels <=    | 1200 | Others
235141cc406Sopenharmony_ci	 * --------------------+------+-------------
236141cc406Sopenharmony_ci	 *   VarFullStateSpeed |   0  |   1
237141cc406Sopenharmony_ci	 *   VarCurrentSpeed   |   1  |   2
238141cc406Sopenharmony_ci	 *	 VarStepSpeed      |  24  |  48
239141cc406Sopenharmony_ci	 */
240141cc406Sopenharmony_ci		{0, 1, 24}, /* Epp Color, Dpi <= 300, Px <= 1400 ; 27 */
241141cc406Sopenharmony_ci		{1, 2, 48}, /* Epp Color, Dpi <= 300, Px > 1400  ; 28 */
242141cc406Sopenharmony_ci	/* The difference for this DPI:
243141cc406Sopenharmony_ci	 *     if pixels <=    | 1400 | 2800 | 4000 | Others
244141cc406Sopenharmony_ci	 * --------------------+------+------+------+---------------
245141cc406Sopenharmony_ci	 *   VarFullStateSpeed |   0  |   1  |	 2  |	3
246141cc406Sopenharmony_ci	 *   VarCurrentSpeed   |   1  |   2  |	 4  |	6
247141cc406Sopenharmony_ci	 *  VarStepSpeed       |  48  |  96  |	88  |  88
248141cc406Sopenharmony_ci	 *     VarExposureTime |  96  |  96  |	88  |  88
249141cc406Sopenharmony_ci	 */
250141cc406Sopenharmony_ci		{0, 1, 48}, /* Epp Color, Dpi > 300, Px <= 1400  ; 29 */
251141cc406Sopenharmony_ci		{1, 2, 96}, /* Epp Color, Dpi > 300, Px <= 2800  ; 30 */
252141cc406Sopenharmony_ci		{2, 4, 88}, /* Epp Color, Dpi > 300, Px <= 4000  ; 31 */
253141cc406Sopenharmony_ci		{4, 8, 88}, /* Epp Color, Dpi > 300, Px >  4000  ; 32 */
254141cc406Sopenharmony_ci    /* BPP Color */
255141cc406Sopenharmony_ci		{0, 1, 6},  /* Bpp/Spp Color, Dpi <= 60 	 ; 33 */
256141cc406Sopenharmony_ci		{0, 1, 12}, /* Bpp/Spp Color, Dpi <= 100	 ; 34 */
257141cc406Sopenharmony_ci	/*     if pixels <=    | 800 | Others
258141cc406Sopenharmony_ci	 * --------------------+-----+-------------
259141cc406Sopenharmony_ci	 *   VarFullStateSpeed |  0  |	 1
260141cc406Sopenharmony_ci     *     VarCurrentSpeed |  1  |	 2
261141cc406Sopenharmony_ci	 *	 VarStepSpeed      | 12  |	24
262141cc406Sopenharmony_ci	 */
263141cc406Sopenharmony_ci		{0, 1, 12}, /* Bpp/Spp Color, Dpi <= 150, Px <= 800  ; 35 */
264141cc406Sopenharmony_ci		{1, 2, 24}, /* Bpp/Spp Color, Dpi <= 150, Px > 800   ; 36 */
265141cc406Sopenharmony_ci	/* The difference for this DPI:
266141cc406Sopenharmony_ci	 *     if pixels <=    |  800 | 1600 | Others
267141cc406Sopenharmony_ci	 * --------------------+-----+-------+----------------------
268141cc406Sopenharmony_ci	 *   VarFullStateSpeed |  0  |	 1   |	 1
269141cc406Sopenharmony_ci	 *   VarCurrentSpeed   |  1  |	 2   |	 4
270141cc406Sopenharmony_ci	 *	 VarStepSpeed      | 24  |	48   |	96
271141cc406Sopenharmony_ci	 */
272141cc406Sopenharmony_ci		{0, 1, 24}, /* Bpp Color, Dpi <= 300, Px <= 800  ; 37 */
273141cc406Sopenharmony_ci		{1, 2, 48}, /* Bpp Color, Dpi <= 300, Px <= 1600 ; 38 */
274141cc406Sopenharmony_ci		{1, 4, 96}, /* Bpp Color, Dpi <= 300, Px > 1600  ; 39 */
275141cc406Sopenharmony_ci	/* The difference for this DPI:
276141cc406Sopenharmony_ci	 *     if pixels <=    | 800 | 1600 | 3200 | Others
277141cc406Sopenharmony_ci	 * --------------------+-----+------+------+---------------
278141cc406Sopenharmony_ci	 *   VarFullStateSpeed |  0  |	 1  |	2  |   4
279141cc406Sopenharmony_ci	 *   VarCurrentSpeed   |  1  |	 2  |	4  |   8
280141cc406Sopenharmony_ci	 *   VarStepSpeed      | 48  |	96  |  96  |  96
281141cc406Sopenharmony_ci     */
282141cc406Sopenharmony_ci		{0, 1, 48}, /* Bpp Color, Dpi > 300, Px <= 800	 ; 40 */
283141cc406Sopenharmony_ci		{1, 2, 48}, /* Bpp Color, Dpi > 300, Px <= 1600  ; 41 */
284141cc406Sopenharmony_ci		{2, 4, 96}, /* Bpp Color, Dpi > 300, Px <= 3200  ; 42 */
285141cc406Sopenharmony_ci		{4, 8, 96}, /* Bpp Color, Dpi > 300, Px > 3200	 ; 43 */
286141cc406Sopenharmony_ci    /* SPP Color */
287141cc406Sopenharmony_ci	/* The difference for this DPI:
288141cc406Sopenharmony_ci	 *     if pixels <=    | 500 | 1000 | 2000 | Others
289141cc406Sopenharmony_ci	 * --------------------+-----+------+------+---------------
290141cc406Sopenharmony_ci	 *   VarFullStateSpeed |  0  |	 1  |	1  |   2
291141cc406Sopenharmony_ci	 *   VarCurrentSpeed   |  1  |	 2  |	4  |   8
292141cc406Sopenharmony_ci	 *	 VarStepSpeed      | 24  |	48  |  96  |  96
293141cc406Sopenharmony_ci	 */
294141cc406Sopenharmony_ci		{0, 1, 24}, /* Spp Color, Dpi <= 300, Px <= 500  ; 44 */
295141cc406Sopenharmony_ci		{1, 2, 48}, /* Spp Color, Dpi <= 300, Px <= 1000 ; 45 */
296141cc406Sopenharmony_ci		{1, 4, 96}, /* Spp Color, Dpi <= 300, Px <= 2000 ; 46 */
297141cc406Sopenharmony_ci		{2, 8, 96}, /* Spp Color, Dpi <= 300, Px > 2000  ; 47 */
298141cc406Sopenharmony_ci	/* The difference for this DPI:
299141cc406Sopenharmony_ci	 *     if pixels <=    | 500 | 1000 | 2000 | 4000 | Others
300141cc406Sopenharmony_ci	 * --------------------+-----+------+------+------+--------
301141cc406Sopenharmony_ci	 *   VarFullStateSpeed |  0  |	 1  |	2  |   4  |   5
302141cc406Sopenharmony_ci	 *   VarCurrentSpeed   |  1  |	 2  |	4  |   8  |  10
303141cc406Sopenharmony_ci	 *	 VarStepSpeed      | 48  |	96  |  96  |  96  |  96
304141cc406Sopenharmony_ci     */
305141cc406Sopenharmony_ci		{0, 1, 48},  /* Spp Color, Dpi > 300, Px <= 500   ; 48 */
306141cc406Sopenharmony_ci		{1, 2, 96},  /* Spp Color, Dpi > 300, Px <= 1000  ; 49 */
307141cc406Sopenharmony_ci		{2, 4, 96},  /* Spp Color, Dpi > 300, Px <= 2000  ; 50 */
308141cc406Sopenharmony_ci		{4, 8, 96},  /* Spp Color, Dpi > 300, Px <= 4000  ; 51 */
309141cc406Sopenharmony_ci		{5, 10, 96}, /* Spp Color, Dpi > 300, Px > 4000   ; 52 */
310141cc406Sopenharmony_ci
311141cc406Sopenharmony_ci    /* Negative & Transparency   */
312141cc406Sopenharmony_ci    /* EPP/SPP/BPP               */
313141cc406Sopenharmony_ci/* for exposure time = 96 */
314141cc406Sopenharmony_ci		{0, 1, 12},  /* Spp/EPP Color, Dpi <= 150	  ; 60 */
315141cc406Sopenharmony_ci		{0, 1, 24},  /* Spp Color, Dpi <= 300		  ; 61 */
316141cc406Sopenharmony_ci		{0, 1, 48},  /* Spp Color, Dpi > 300		  ; 62 */
317141cc406Sopenharmony_ci		{0, 1, 12},  /* Bpp/Epp B/W, Dpi <= 75		  ; 56 */
318141cc406Sopenharmony_ci
319141cc406Sopenharmony_ci/* for exposure time = 144 */
320141cc406Sopenharmony_ci		{0, 1, 18},  /* Spp/EPP Color, Dpi <= 150	  ; 57 */
321141cc406Sopenharmony_ci		{0, 1, 36},  /* Spp Color, Dpi <= 300		  ; 58 */
322141cc406Sopenharmony_ci		{0, 1, 72},  /* Spp Color, Dpi > 300		  ; 59 */
323141cc406Sopenharmony_ci
324141cc406Sopenharmony_ci/* for exposure time = 192 */
325141cc406Sopenharmony_ci		{0, 1, 24},  /* Spp/EPP Color, Dpi <= 150	  ; 53 */
326141cc406Sopenharmony_ci		{0, 1, 48},  /* Spp Color, Dpi <= 300		  ; 54 */
327141cc406Sopenharmony_ci		{0, 1, 96},  /* Spp Color, Dpi > 300		  ; 55 */
328141cc406Sopenharmony_ci
329141cc406Sopenharmony_ci/* for 48 bits color */
330141cc406Sopenharmony_ci		{1, 2, 12}, /* Epp Color, Dpi <= 100, Px > 1400   ; 63 */
331141cc406Sopenharmony_ci		{1, 2, 22}, /* Epp Color, Dpi <= 150, Px > 1900   ; 64 */
332141cc406Sopenharmony_ci		{2, 4, 48}, /* Epp Color, Dpi <= 300, Px > 4000   ; 65 */
333141cc406Sopenharmony_ci		{5, 10, 88},/* Epp Color, Dpi >  300, Px > 9600   ; 66 */
334141cc406Sopenharmony_ci		{3, 12, 96} /* Spp Color, Dpi <= 300, Px > 3000   ; 67 */
335141cc406Sopenharmony_ci};
336141cc406Sopenharmony_ci
337141cc406Sopenharmony_ci
338141cc406Sopenharmony_cistatic pModeTypeVar	pModeType;
339141cc406Sopenharmony_cistatic pDiffModeVar	pModeDiff;
340141cc406Sopenharmony_ci
341141cc406Sopenharmony_ci/*
342141cc406Sopenharmony_ci * prototypes for the speed procs (ASIC 98001), EPP, SPP and BIDI
343141cc406Sopenharmony_ci */
344141cc406Sopenharmony_cistatic void fnLineArtSpeed( pScanData ps );
345141cc406Sopenharmony_cistatic void fnGraySpeed   ( pScanData ps );
346141cc406Sopenharmony_cistatic void fnColorSpeed  ( pScanData ps );
347141cc406Sopenharmony_ci
348141cc406Sopenharmony_cistatic void fnSppLineArtSpeed( pScanData ps );
349141cc406Sopenharmony_cistatic void fnSppGraySpeed   ( pScanData ps );
350141cc406Sopenharmony_cistatic void fnSppColorSpeed  ( pScanData ps );
351141cc406Sopenharmony_ci
352141cc406Sopenharmony_cistatic void fnBppLineArtSpeed( pScanData ps );
353141cc406Sopenharmony_cistatic void fnBppGraySpeed   ( pScanData ps );
354141cc406Sopenharmony_cistatic void fnBppColorSpeed  ( pScanData ps );
355141cc406Sopenharmony_ci
356141cc406Sopenharmony_ci/*
357141cc406Sopenharmony_ci * some procedures for the different modes
358141cc406Sopenharmony_ci */
359141cc406Sopenharmony_cistatic pFnSpeed_Set a_fnSpeedProcs[5] = {
360141cc406Sopenharmony_ci	fnLineArtSpeed,
361141cc406Sopenharmony_ci	fnGraySpeed,
362141cc406Sopenharmony_ci	fnGraySpeed,
363141cc406Sopenharmony_ci	fnColorSpeed,
364141cc406Sopenharmony_ci	fnColorSpeed
365141cc406Sopenharmony_ci};
366141cc406Sopenharmony_ci
367141cc406Sopenharmony_cistatic pFnSpeed_Set a_fnSppSpeedProcs[5] = {
368141cc406Sopenharmony_ci	fnSppLineArtSpeed,
369141cc406Sopenharmony_ci	fnSppGraySpeed,
370141cc406Sopenharmony_ci	fnSppGraySpeed,
371141cc406Sopenharmony_ci	fnSppColorSpeed,
372141cc406Sopenharmony_ci	fnSppColorSpeed
373141cc406Sopenharmony_ci};
374141cc406Sopenharmony_ci
375141cc406Sopenharmony_cistatic pFnSpeed_Set a_fnBppSpeedProcs[5] = {
376141cc406Sopenharmony_ci	fnBppLineArtSpeed,
377141cc406Sopenharmony_ci	fnBppGraySpeed,
378141cc406Sopenharmony_ci	fnBppGraySpeed,
379141cc406Sopenharmony_ci	fnBppColorSpeed,
380141cc406Sopenharmony_ci	fnBppColorSpeed
381141cc406Sopenharmony_ci};
382141cc406Sopenharmony_ci
383141cc406Sopenharmony_ci
384141cc406Sopenharmony_ci/*************************** local functions *********************************/
385141cc406Sopenharmony_ci
386141cc406Sopenharmony_ci/*.............................................................................
387141cc406Sopenharmony_ci *
388141cc406Sopenharmony_ci */
389141cc406Sopenharmony_cistatic void ioP96InitialSetCurrentSpeed( pScanData ps )
390141cc406Sopenharmony_ci{
391141cc406Sopenharmony_ci	DBG( DBG_LOW, "ioP96InitialSetCurrentSpeed()\n" );
392141cc406Sopenharmony_ci
393141cc406Sopenharmony_ci	switch ( ps->DataInf.wPhyDataType ) {
394141cc406Sopenharmony_ci
395141cc406Sopenharmony_ci	case COLOR_BW:
396141cc406Sopenharmony_ci		ps->bCurrentSpeed = (ps->DataInf.dwAsicPixelsPerPlane >
397141cc406Sopenharmony_ci			                      _BUF_SIZE_BASE_CONST * 2) ? 2 : 1;
398141cc406Sopenharmony_ci		break;
399141cc406Sopenharmony_ci
400141cc406Sopenharmony_ci	case COLOR_256GRAY:
401141cc406Sopenharmony_ci		if ( COLOR_256GRAY == ps->DataInf.wAppDataType ) {
402141cc406Sopenharmony_ci
403141cc406Sopenharmony_ci			ps->bCurrentSpeed = (Byte)(ps->a_wGrayInitTime[ps->IO.portMode] /
404141cc406Sopenharmony_ci			                           ps->wLinesPer64kTime);
405141cc406Sopenharmony_ci			if (!ps->bCurrentSpeed)
406141cc406Sopenharmony_ci			    ps->bCurrentSpeed = 1;
407141cc406Sopenharmony_ci
408141cc406Sopenharmony_ci			if ((ps->DataInf.dwAsicPixelsPerPlane>=1500) && (ps->bCurrentSpeed==1))
409141cc406Sopenharmony_ci			    ps->bCurrentSpeed = 2;
410141cc406Sopenharmony_ci
411141cc406Sopenharmony_ci			if ( ps->DataInf.xyAppDpi.x > 1200) {
412141cc406Sopenharmony_ci			    ps->bCurrentSpeed += 2; 			/* 1201-2400 */
413141cc406Sopenharmony_ci
414141cc406Sopenharmony_ci			    if ( ps->DataInf.xyAppDpi.x > 2400 )
415141cc406Sopenharmony_ci					ps->bCurrentSpeed += 2;			/* >= 2401   */
416141cc406Sopenharmony_ci			}
417141cc406Sopenharmony_ci
418141cc406Sopenharmony_ci			MotorP96AdjustCurrentSpeed( ps, ps->bCurrentSpeed );
419141cc406Sopenharmony_ci
420141cc406Sopenharmony_ci	    } else {
421141cc406Sopenharmony_ci
422141cc406Sopenharmony_ci			if ( _PORT_SPP != ps->IO.portMode ) {
423141cc406Sopenharmony_ci			    if( ps->DataInf.dwAsicPixelsPerPlane <= 1280 )
424141cc406Sopenharmony_ci					ps->bCurrentSpeed = 1;	/* <= 1280 pixels */
425141cc406Sopenharmony_ci
426141cc406Sopenharmony_ci			    else if( ps->DataInf.dwAsicPixelsPerPlane <= 1720 )
427141cc406Sopenharmony_ci				    ps->bCurrentSpeed = 2;	/* 1281-1720 */
428141cc406Sopenharmony_ci
429141cc406Sopenharmony_ci				else if( ps->DataInf.dwAsicPixelsPerPlane <= 3780 )
430141cc406Sopenharmony_ci					ps->bCurrentSpeed = 4;	/* 1721-3780 */
431141cc406Sopenharmony_ci
432141cc406Sopenharmony_ci			    else
433141cc406Sopenharmony_ci					ps->bCurrentSpeed = 6;	/* >= 3780 */
434141cc406Sopenharmony_ci
435141cc406Sopenharmony_ci			} else {
436141cc406Sopenharmony_ci
437141cc406Sopenharmony_ci			    if( ps->DataInf.dwAsicPixelsPerPlane <= 400 )
438141cc406Sopenharmony_ci					ps->bCurrentSpeed = 1;			/* <= 400 pixels */
439141cc406Sopenharmony_ci
440141cc406Sopenharmony_ci			    else if( ps->DataInf.dwAsicPixelsPerPlane <= 853 )
441141cc406Sopenharmony_ci				    ps->bCurrentSpeed = 2;		/* 401-853 */
442141cc406Sopenharmony_ci
443141cc406Sopenharmony_ci				else if( ps->DataInf.dwAsicPixelsPerPlane <= 1280 )
444141cc406Sopenharmony_ci					ps->bCurrentSpeed = 4;	/* 854-1280 */
445141cc406Sopenharmony_ci
446141cc406Sopenharmony_ci			    else if( ps->DataInf.dwAsicPixelsPerPlane <= 1728 )
447141cc406Sopenharmony_ci				    ps->bCurrentSpeed = 6;	/* 1281-1728 */
448141cc406Sopenharmony_ci
449141cc406Sopenharmony_ci				else if( ps->DataInf.dwAsicPixelsPerPlane <= 3780 )
450141cc406Sopenharmony_ci					ps->bCurrentSpeed = 8;	/* 1729-3780 */
451141cc406Sopenharmony_ci
452141cc406Sopenharmony_ci			    else
453141cc406Sopenharmony_ci					ps->bCurrentSpeed = 10;	/* > 3780 */
454141cc406Sopenharmony_ci			}
455141cc406Sopenharmony_ci	    }
456141cc406Sopenharmony_ci	    break;
457141cc406Sopenharmony_ci
458141cc406Sopenharmony_ci	case COLOR_TRUE24:
459141cc406Sopenharmony_ci	    ps->bCurrentSpeed = (Byte)(ps->a_wColorInitTime[ps->IO.portMode] /
460141cc406Sopenharmony_ci								   ps->wLinesPer64kTime);
461141cc406Sopenharmony_ci
462141cc406Sopenharmony_ci	    if( 0 == ps->bCurrentSpeed ) {
463141cc406Sopenharmony_ci			DBG( DBG_LOW, "Initially set to 1\n" );
464141cc406Sopenharmony_ci			ps->bCurrentSpeed = 1;
465141cc406Sopenharmony_ci		}
466141cc406Sopenharmony_ci
467141cc406Sopenharmony_ci	    if (ps->DataInf.xyAppDpi.x > 150)  {
468141cc406Sopenharmony_ci			if (ps->bCurrentSpeed < 4)
469141cc406Sopenharmony_ci			    ps->bCurrentSpeed = 4;
470141cc406Sopenharmony_ci	    } else {
471141cc406Sopenharmony_ci/*
472141cc406Sopenharmony_ci// HEINER:A3I
473141cc406Sopenharmony_ci//			if (ps->DataInf.xyAppDpi.x > 100)
474141cc406Sopenharmony_ci*/
475141cc406Sopenharmony_ci			if (ps->DataInf.xyAppDpi.x > 75)
476141cc406Sopenharmony_ci			    if (ps->bCurrentSpeed < 2)
477141cc406Sopenharmony_ci					ps->bCurrentSpeed = 2;
478141cc406Sopenharmony_ci		}
479141cc406Sopenharmony_ci
480141cc406Sopenharmony_ci	    if( 1 != ps->bCurrentSpeed )
481141cc406Sopenharmony_ci			ps->bCurrentSpeed += ps->bExtraAdd;
482141cc406Sopenharmony_ci
483141cc406Sopenharmony_ci    	if (ps->DataInf.xyAppDpi.x > ps->PhysicalDpi) {
484141cc406Sopenharmony_ci			if (ps->DataInf.xyAppDpi.x <= 600)
485141cc406Sopenharmony_ci			    ps->bCurrentSpeed += 2;
486141cc406Sopenharmony_ci			else if (ps->DataInf.xyAppDpi.x <= 1200)
487141cc406Sopenharmony_ci				ps->bCurrentSpeed += 2;
488141cc406Sopenharmony_ci    		else if (ps->DataInf.xyAppDpi.x <= 2400)
489141cc406Sopenharmony_ci			    ps->bCurrentSpeed += 2;
490141cc406Sopenharmony_ci			else
491141cc406Sopenharmony_ci			    ps->bCurrentSpeed += 2;
492141cc406Sopenharmony_ci	    }
493141cc406Sopenharmony_ci
494141cc406Sopenharmony_ci		MotorP96AdjustCurrentSpeed( ps, ps->bCurrentSpeed );
495141cc406Sopenharmony_ci    }
496141cc406Sopenharmony_ci
497141cc406Sopenharmony_ci	DBG( DBG_LOW, "Current Speed = %u\n", ps->bCurrentSpeed );
498141cc406Sopenharmony_ci}
499141cc406Sopenharmony_ci
500141cc406Sopenharmony_ci/*.............................................................................
501141cc406Sopenharmony_ci *
502141cc406Sopenharmony_ci */
503141cc406Sopenharmony_cistatic void fnLineArtSpeed( pScanData ps )
504141cc406Sopenharmony_ci{
505141cc406Sopenharmony_ci    pModeType = a_BwSettings + _FixParamEppBw;
506141cc406Sopenharmony_ci    pModeDiff = a_tabDiffParam + _BwEpp75;
507141cc406Sopenharmony_ci
508141cc406Sopenharmony_ci    if (ps->DataInf.xyAppDpi.y > 75) {
509141cc406Sopenharmony_ci		pModeType++;
510141cc406Sopenharmony_ci		pModeDiff = a_tabDiffParam + _BwEpp150;
511141cc406Sopenharmony_ci    }
512141cc406Sopenharmony_ci
513141cc406Sopenharmony_ci    if (ps->DataInf.xyAppDpi.y > 150) {
514141cc406Sopenharmony_ci		if (ps->DataInf.xyAppDpi.y <= 300) {
515141cc406Sopenharmony_ci		    pModeType++;
516141cc406Sopenharmony_ci		    pModeDiff = a_tabDiffParam + _BwEpp300;
517141cc406Sopenharmony_ci		} else {
518141cc406Sopenharmony_ci		    pModeType += 2;
519141cc406Sopenharmony_ci		    pModeDiff = a_tabDiffParam + _BwEpp600;
520141cc406Sopenharmony_ci		}
521141cc406Sopenharmony_ci	}
522141cc406Sopenharmony_ci}
523141cc406Sopenharmony_ci
524141cc406Sopenharmony_ci/*.............................................................................
525141cc406Sopenharmony_ci *
526141cc406Sopenharmony_ci */
527141cc406Sopenharmony_cistatic void fnGraySpeed( pScanData ps )
528141cc406Sopenharmony_ci{
529141cc406Sopenharmony_ci    pModeType = a_GraySettings + _FixParamEppGray;
530141cc406Sopenharmony_ci    pModeDiff = a_tabDiffParam + _GrayEpp75;
531141cc406Sopenharmony_ci
532141cc406Sopenharmony_ci    if (ps->DataInf.xyAppDpi.y > 75) {
533141cc406Sopenharmony_ci		pModeType++;
534141cc406Sopenharmony_ci		pModeDiff = a_tabDiffParam + _GrayEpp150;
535141cc406Sopenharmony_ci    }
536141cc406Sopenharmony_ci
537141cc406Sopenharmony_ci    if ( ps->DataInf.xyAppDpi.y > 150) {
538141cc406Sopenharmony_ci		if (ps->DataInf.xyAppDpi.y <= 300) {
539141cc406Sopenharmony_ci		    pModeType++;
540141cc406Sopenharmony_ci		    pModeDiff = a_tabDiffParam + _GrayEpp300;
541141cc406Sopenharmony_ci		} else {
542141cc406Sopenharmony_ci		    pModeType += 2;
543141cc406Sopenharmony_ci		    pModeDiff = a_tabDiffParam + _GrayEpp600;
544141cc406Sopenharmony_ci	    	if (ps->DataInf.dwAsicPixelsPerPlane > 3000)
545141cc406Sopenharmony_ci				pModeDiff++;
546141cc406Sopenharmony_ci		}
547141cc406Sopenharmony_ci	}
548141cc406Sopenharmony_ci}
549141cc406Sopenharmony_ci
550141cc406Sopenharmony_ci/*.............................................................................
551141cc406Sopenharmony_ci *
552141cc406Sopenharmony_ci */
553141cc406Sopenharmony_cistatic void fnColorSpeed( pScanData ps )
554141cc406Sopenharmony_ci{
555141cc406Sopenharmony_ci	DBG( DBG_LOW, "fnColorSpeed();\n" );
556141cc406Sopenharmony_ci
557141cc406Sopenharmony_ci    pModeType = a_ColorSettings + _FixParamEppColor;
558141cc406Sopenharmony_ci
559141cc406Sopenharmony_ci    if ( ps->DataInf.xyAppDpi.y <= ps->wMinCmpDpi ) {
560141cc406Sopenharmony_ci		/* DPI <= 60 */
561141cc406Sopenharmony_ci		pModeDiff = a_tabDiffParam + _ColorEpp60;
562141cc406Sopenharmony_ci
563141cc406Sopenharmony_ci	} else {
564141cc406Sopenharmony_ci
565141cc406Sopenharmony_ci		if (ps->DataInf.xyAppDpi.y <= 100) {
566141cc406Sopenharmony_ci		    pModeType++;
567141cc406Sopenharmony_ci		    pModeDiff = a_tabDiffParam + _ColorEpp100;
568141cc406Sopenharmony_ci
569141cc406Sopenharmony_ci	    	if (ps->DataInf.dwAsicBytesPerPlane > 1400)
570141cc406Sopenharmony_ci				pModeDiff = a_tabDiffParam + _ColorEpp100_1400;
571141cc406Sopenharmony_ci		} else {
572141cc406Sopenharmony_ci		    if (ps->DataInf.xyAppDpi.y <= 150) {
573141cc406Sopenharmony_ci				pModeType += 2;
574141cc406Sopenharmony_ci				pModeDiff = a_tabDiffParam + _ColorEpp150;
575141cc406Sopenharmony_ci
576141cc406Sopenharmony_ci				if (ps->DataInf.dwAsicBytesPerPlane > 1900)
577141cc406Sopenharmony_ci				    pModeDiff = a_tabDiffParam + _ColorEpp150_1900;
578141cc406Sopenharmony_ci		    } else {
579141cc406Sopenharmony_ci				if (ps->DataInf.xyAppDpi.y <= 300) {
580141cc406Sopenharmony_ci				    pModeType += 3;
581141cc406Sopenharmony_ci				    pModeDiff = a_tabDiffParam + _ColorEpp300_1200;
582141cc406Sopenharmony_ci				    if (ps->DataInf.dwAsicBytesPerPlane <= 1200)
583141cc406Sopenharmony_ci						pModeDiff --;
584141cc406Sopenharmony_ci				    else {
585141cc406Sopenharmony_ci						if (ps->DataInf.dwAsicBytesPerPlane > 4000)
586141cc406Sopenharmony_ci						    pModeDiff = a_tabDiffParam + _ColorEpp300_4000;
587141cc406Sopenharmony_ci					}
588141cc406Sopenharmony_ci				} else {
589141cc406Sopenharmony_ci				    pModeType += 4;
590141cc406Sopenharmony_ci				    pModeDiff = a_tabDiffParam + _ColorEpp600_4000;
591141cc406Sopenharmony_ci				    pModeType->bExposureTime = 88;
592141cc406Sopenharmony_ci
593141cc406Sopenharmony_ci				    if (ps->DataInf.dwAsicBytesPerPlane <= 4000) {
594141cc406Sopenharmony_ci						pModeDiff--;
595141cc406Sopenharmony_ci						if (ps->DataInf.dwAsicBytesPerPlane <= 2800) {
596141cc406Sopenharmony_ci						    pModeType->bExposureTime = 96;
597141cc406Sopenharmony_ci						    pModeDiff--;
598141cc406Sopenharmony_ci						    if (ps->DataInf.dwAsicBytesPerPlane <= 1200)
599141cc406Sopenharmony_ci								pModeDiff--;
600141cc406Sopenharmony_ci						}
601141cc406Sopenharmony_ci		    		} else {
602141cc406Sopenharmony_ci						if (ps->DataInf.dwAsicBytesPerPlane >= 9600)
603141cc406Sopenharmony_ci						    pModeDiff = a_tabDiffParam + _ColorEpp600_9600;
604141cc406Sopenharmony_ci					}
605141cc406Sopenharmony_ci				}
606141cc406Sopenharmony_ci			}
607141cc406Sopenharmony_ci     	}
608141cc406Sopenharmony_ci	}
609141cc406Sopenharmony_ci}
610141cc406Sopenharmony_ci
611141cc406Sopenharmony_ci/*.............................................................................
612141cc406Sopenharmony_ci *
613141cc406Sopenharmony_ci */
614141cc406Sopenharmony_cistatic void fnSppLineArtSpeed( pScanData ps )
615141cc406Sopenharmony_ci{
616141cc406Sopenharmony_ci    pModeType = a_BwSettings + _FixParamSppBw;
617141cc406Sopenharmony_ci    pModeDiff = a_tabDiffParam + _BwSpp75;
618141cc406Sopenharmony_ci
619141cc406Sopenharmony_ci    if (ps->DataInf.xyAppDpi.y > 75) {
620141cc406Sopenharmony_ci
621141cc406Sopenharmony_ci		pModeType++;
622141cc406Sopenharmony_ci		pModeDiff = a_tabDiffParam + _BwSpp150;
623141cc406Sopenharmony_ci    }
624141cc406Sopenharmony_ci
625141cc406Sopenharmony_ci    if (ps->DataInf.xyAppDpi.y > 150) {
626141cc406Sopenharmony_ci		if (ps->DataInf.xyAppDpi.y <= 300) {
627141cc406Sopenharmony_ci		    pModeType++;
628141cc406Sopenharmony_ci		    pModeDiff = a_tabDiffParam + _BwSpp300;
629141cc406Sopenharmony_ci		} else {
630141cc406Sopenharmony_ci		    pModeType += 2;
631141cc406Sopenharmony_ci		    pModeDiff = a_tabDiffParam + _BwSpp600;
632141cc406Sopenharmony_ci		}
633141cc406Sopenharmony_ci	}
634141cc406Sopenharmony_ci}
635141cc406Sopenharmony_ci
636141cc406Sopenharmony_ci/*.............................................................................
637141cc406Sopenharmony_ci *
638141cc406Sopenharmony_ci */
639141cc406Sopenharmony_cistatic void fnSppGraySpeed( pScanData ps )
640141cc406Sopenharmony_ci{
641141cc406Sopenharmony_ci    pModeType = a_GraySettings + _FixParamSppGray;
642141cc406Sopenharmony_ci    pModeDiff = a_tabDiffParam + _GraySpp75;
643141cc406Sopenharmony_ci
644141cc406Sopenharmony_ci    if (ps->DataInf.xyAppDpi.y > 75) {
645141cc406Sopenharmony_ci		pModeType++;
646141cc406Sopenharmony_ci		pModeDiff = a_tabDiffParam + _GraySpp150_800;
647141cc406Sopenharmony_ci
648141cc406Sopenharmony_ci	    if (ps->DataInf.xyAppDpi.y > 150) {
649141cc406Sopenharmony_ci
650141cc406Sopenharmony_ci			if (ps->DataInf.xyAppDpi.y <= 300) {
651141cc406Sopenharmony_ci			    pModeType ++;
652141cc406Sopenharmony_ci	    		pModeDiff = a_tabDiffParam + _GraySpp300_1600;
653141cc406Sopenharmony_ci			} else {
654141cc406Sopenharmony_ci
655141cc406Sopenharmony_ci			    pModeType += 2;
656141cc406Sopenharmony_ci	    		pModeDiff = a_tabDiffParam + _GraySpp600_3200;
657141cc406Sopenharmony_ci
658141cc406Sopenharmony_ci			    if (ps->DataInf.dwAsicPixelsPerPlane <= 3200)
659141cc406Sopenharmony_ci					pModeDiff--;
660141cc406Sopenharmony_ci			}
661141cc406Sopenharmony_ci
662141cc406Sopenharmony_ci			if (ps->DataInf.dwAsicPixelsPerPlane <= 1600)
663141cc406Sopenharmony_ci			    pModeDiff--;
664141cc406Sopenharmony_ci	    }
665141cc406Sopenharmony_ci
666141cc406Sopenharmony_ci		if (ps->DataInf.dwAsicPixelsPerPlane <= 800)
667141cc406Sopenharmony_ci			pModeDiff--;
668141cc406Sopenharmony_ci    }
669141cc406Sopenharmony_ci}
670141cc406Sopenharmony_ci
671141cc406Sopenharmony_ci/*.............................................................................
672141cc406Sopenharmony_ci *
673141cc406Sopenharmony_ci */
674141cc406Sopenharmony_cistatic void fnSppColorSpeed( pScanData ps )
675141cc406Sopenharmony_ci{
676141cc406Sopenharmony_ci    pModeType = a_ColorSettings + _FixParamSppColor;
677141cc406Sopenharmony_ci    pModeDiff = a_tabDiffParam + _ColorSpp60;
678141cc406Sopenharmony_ci
679141cc406Sopenharmony_ci    if (ps->DataInf.xyAppDpi.y > ps->wMinCmpDpi) {
680141cc406Sopenharmony_ci		pModeType ++;
681141cc406Sopenharmony_ci		pModeDiff = a_tabDiffParam + _ColorSpp100;
682141cc406Sopenharmony_ci
683141cc406Sopenharmony_ci		if (ps->DataInf.xyAppDpi.y > 100) {
684141cc406Sopenharmony_ci		    pModeType ++;
685141cc406Sopenharmony_ci		    pModeDiff = a_tabDiffParam + _ColorSpp150_800;
686141cc406Sopenharmony_ci
687141cc406Sopenharmony_ci	    	if (ps->DataInf.xyAppDpi.y > 150) {
688141cc406Sopenharmony_ci				pModeType ++;
689141cc406Sopenharmony_ci				pModeDiff = a_tabDiffParam + _ColorSpp300_2000;
690141cc406Sopenharmony_ci
691141cc406Sopenharmony_ci				if (ps->DataInf.xyAppDpi.y > 300) {
692141cc406Sopenharmony_ci
693141cc406Sopenharmony_ci				    pModeType ++;
694141cc406Sopenharmony_ci				    pModeDiff = a_tabDiffParam + _ColorSpp600_4000;
695141cc406Sopenharmony_ci
696141cc406Sopenharmony_ci				    if (ps->DataInf.dwAsicBytesPerPlane > 4000)
697141cc406Sopenharmony_ci						return;
698141cc406Sopenharmony_ci		    		else
699141cc406Sopenharmony_ci						pModeDiff--;
700141cc406Sopenharmony_ci				} else {
701141cc406Sopenharmony_ci				    if (ps->DataInf.dwAsicBytesPerPlane > 3000)
702141cc406Sopenharmony_ci						pModeDiff = a_tabDiffParam + _ColorSpp300_3000;
703141cc406Sopenharmony_ci		    		return;
704141cc406Sopenharmony_ci				}
705141cc406Sopenharmony_ci
706141cc406Sopenharmony_ci				if (ps->DataInf.dwAsicBytesPerPlane <= 2000) {
707141cc406Sopenharmony_ci				    pModeDiff--;
708141cc406Sopenharmony_ci				    if (ps->DataInf.dwAsicBytesPerPlane <= 1000) {
709141cc406Sopenharmony_ci						pModeDiff--;
710141cc406Sopenharmony_ci
711141cc406Sopenharmony_ci						if (ps->DataInf.dwAsicBytesPerPlane <= 500)
712141cc406Sopenharmony_ci						    pModeDiff--;
713141cc406Sopenharmony_ci		    		}
714141cc406Sopenharmony_ci				}
715141cc406Sopenharmony_ci	    	} else {
716141cc406Sopenharmony_ci
717141cc406Sopenharmony_ci				if (ps->DataInf.dwAsicBytesPerPlane <= 800)
718141cc406Sopenharmony_ci				    pModeDiff--;
719141cc406Sopenharmony_ci	    	}
720141cc406Sopenharmony_ci		}
721141cc406Sopenharmony_ci    }
722141cc406Sopenharmony_ci}
723141cc406Sopenharmony_ci
724141cc406Sopenharmony_ci/*.............................................................................
725141cc406Sopenharmony_ci *
726141cc406Sopenharmony_ci */
727141cc406Sopenharmony_cistatic void fnBppLineArtSpeed( pScanData ps )
728141cc406Sopenharmony_ci{
729141cc406Sopenharmony_ci    pModeType = a_BwSettings + _FixParamBppBw;
730141cc406Sopenharmony_ci/* (+) Micky, 7-14-1998
731141cc406Sopenharmony_ci *   pModeDiff = a_tabDiffParam + _BwBpp150;
732141cc406Sopenharmony_ci */
733141cc406Sopenharmony_ci    pModeDiff = a_tabDiffParam + _BwBpp75;
734141cc406Sopenharmony_ci
735141cc406Sopenharmony_ci    if( ps->DataInf.xyAppDpi.y > 75 ) {
736141cc406Sopenharmony_ci		pModeType++;
737141cc406Sopenharmony_ci		pModeDiff = a_tabDiffParam + _BwBpp150;
738141cc406Sopenharmony_ci    }
739141cc406Sopenharmony_ci/* (-) Micky, 7-14-1998 */
740141cc406Sopenharmony_ci    if( ps->DataInf.xyAppDpi.y > 150 ) {
741141cc406Sopenharmony_ci		if( ps->DataInf.xyAppDpi.y <= 300 ) {
742141cc406Sopenharmony_ci		    pModeType++;
743141cc406Sopenharmony_ci		    pModeDiff = a_tabDiffParam + _BwBpp300;
744141cc406Sopenharmony_ci		} else {
745141cc406Sopenharmony_ci		    pModeType += 2;
746141cc406Sopenharmony_ci		    pModeDiff = a_tabDiffParam + _BwBpp600;
747141cc406Sopenharmony_ci		}
748141cc406Sopenharmony_ci	}
749141cc406Sopenharmony_ci}
750141cc406Sopenharmony_ci
751141cc406Sopenharmony_ci/*.............................................................................
752141cc406Sopenharmony_ci *
753141cc406Sopenharmony_ci */
754141cc406Sopenharmony_cistatic void fnBppGraySpeed( pScanData ps )
755141cc406Sopenharmony_ci{
756141cc406Sopenharmony_ci    pModeType = a_GraySettings + _FixParamBppGray;
757141cc406Sopenharmony_ci/* (+) Micky, 7-14-1998
758141cc406Sopenharmony_ci *   pModeDiff = a_tabDiffParam + _GrayBpp150;
759141cc406Sopenharmony_ci */
760141cc406Sopenharmony_ci    pModeDiff = a_tabDiffParam + _GrayBpp75;
761141cc406Sopenharmony_ci
762141cc406Sopenharmony_ci    if( ps->DataInf.xyAppDpi.y > 75 ) {
763141cc406Sopenharmony_ci		pModeType++;
764141cc406Sopenharmony_ci		pModeDiff = a_tabDiffParam + _GrayBpp150;
765141cc406Sopenharmony_ci    }
766141cc406Sopenharmony_ci/* (-) Micky, 7-14-1998 */
767141cc406Sopenharmony_ci    if( ps->DataInf.xyAppDpi.y > 150 ) {
768141cc406Sopenharmony_ci		pModeType ++;
769141cc406Sopenharmony_ci		pModeDiff = a_tabDiffParam + _GrayBpp300_1600;
770141cc406Sopenharmony_ci		if( ps->DataInf.xyAppDpi.y > 300 ) {
771141cc406Sopenharmony_ci		    pModeType ++;
772141cc406Sopenharmony_ci		    pModeDiff = a_tabDiffParam + _GrayBpp600_3200;
773141cc406Sopenharmony_ci	    	if( ps->DataInf.dwAsicPixelsPerPlane <= 3200 )
774141cc406Sopenharmony_ci				pModeDiff --;
775141cc406Sopenharmony_ci		}
776141cc406Sopenharmony_ci		if( ps->DataInf.dwAsicPixelsPerPlane <= 1600 )
777141cc406Sopenharmony_ci		    pModeDiff --;
778141cc406Sopenharmony_ci    }
779141cc406Sopenharmony_ci}
780141cc406Sopenharmony_ci
781141cc406Sopenharmony_ci/*.............................................................................
782141cc406Sopenharmony_ci *
783141cc406Sopenharmony_ci */
784141cc406Sopenharmony_cistatic void fnBppColorSpeed( pScanData ps )
785141cc406Sopenharmony_ci{
786141cc406Sopenharmony_ci    pModeType = a_ColorSettings + _FixParamBppColor;
787141cc406Sopenharmony_ci    pModeDiff = a_tabDiffParam + _ColorBpp60;
788141cc406Sopenharmony_ci
789141cc406Sopenharmony_ci    if (ps->DataInf.xyAppDpi.y > ps->wMinCmpDpi ) {
790141cc406Sopenharmony_ci		pModeType ++;
791141cc406Sopenharmony_ci		pModeDiff = a_tabDiffParam + _ColorBpp100;
792141cc406Sopenharmony_ci
793141cc406Sopenharmony_ci		if( ps->DataInf.xyAppDpi.y > 100 ) {
794141cc406Sopenharmony_ci		    pModeType ++;
795141cc406Sopenharmony_ci		    pModeDiff = a_tabDiffParam + _ColorBpp150_800;
796141cc406Sopenharmony_ci	    	if( ps->DataInf.xyAppDpi.y > 150 ) {
797141cc406Sopenharmony_ci				pModeType ++;
798141cc406Sopenharmony_ci				pModeDiff = a_tabDiffParam + _ColorBpp300_1600;
799141cc406Sopenharmony_ci				if( ps->DataInf.xyAppDpi.y > 300 ) {
800141cc406Sopenharmony_ci				    pModeType ++;
801141cc406Sopenharmony_ci				    pModeDiff = a_tabDiffParam + _ColorBpp600_3200;
802141cc406Sopenharmony_ci				    if( ps->DataInf.dwAsicBytesPerPlane <= 3200 )
803141cc406Sopenharmony_ci						return;
804141cc406Sopenharmony_ci		    		else
805141cc406Sopenharmony_ci						pModeDiff--;
806141cc406Sopenharmony_ci				}
807141cc406Sopenharmony_ci
808141cc406Sopenharmony_ci				if( ps->DataInf.dwAsicBytesPerPlane <= 1600 )
809141cc406Sopenharmony_ci				    pModeDiff--;
810141cc406Sopenharmony_ci	    	}
811141cc406Sopenharmony_ci
812141cc406Sopenharmony_ci		    if( ps->DataInf.dwAsicBytesPerPlane <= 800 )
813141cc406Sopenharmony_ci				pModeDiff--;
814141cc406Sopenharmony_ci		}
815141cc406Sopenharmony_ci    }
816141cc406Sopenharmony_ci}
817141cc406Sopenharmony_ci
818141cc406Sopenharmony_ci/*.............................................................................
819141cc406Sopenharmony_ci *
820141cc406Sopenharmony_ci */
821141cc406Sopenharmony_cistatic void ioP98SppNegativeProcs( pScanData ps )
822141cc406Sopenharmony_ci{
823141cc406Sopenharmony_ci	if ( ps->DataInf.dwScanFlag & SCANDEF_Negative )
824141cc406Sopenharmony_ci		pModeType = a_FilmSettings + _FixParamSppNegative;
825141cc406Sopenharmony_ci    else
826141cc406Sopenharmony_ci		pModeType = a_FilmSettings + _FixParamSppPositive;
827141cc406Sopenharmony_ci
828141cc406Sopenharmony_ci    pModeDiff = a_tabDiffParam + _NegativeSpp150;
829141cc406Sopenharmony_ci
830141cc406Sopenharmony_ci    if (ps->DataInf.xyAppDpi.y > 150) {
831141cc406Sopenharmony_ci		if (ps->DataInf.xyAppDpi.y < 300) {
832141cc406Sopenharmony_ci		    pModeType ++;
833141cc406Sopenharmony_ci		    pModeDiff ++;
834141cc406Sopenharmony_ci		} else {
835141cc406Sopenharmony_ci		    pModeType += 2;
836141cc406Sopenharmony_ci		    pModeDiff += 2;
837141cc406Sopenharmony_ci		}
838141cc406Sopenharmony_ci	}
839141cc406Sopenharmony_ci
840141cc406Sopenharmony_ci    if (ps->DataInf.dwScanFlag & SCANDEF_Negative) {
841141cc406Sopenharmony_ci		if (ps->AsicReg.RD_LineControl == 144)
842141cc406Sopenharmony_ci		    pModeDiff += 4;
843141cc406Sopenharmony_ci		else
844141cc406Sopenharmony_ci	    	if (ps->AsicReg.RD_LineControl == 192)
845141cc406Sopenharmony_ci			pModeDiff += 7;
846141cc406Sopenharmony_ci    }
847141cc406Sopenharmony_ci}
848141cc406Sopenharmony_ci
849141cc406Sopenharmony_ci/*.............................................................................
850141cc406Sopenharmony_ci *
851141cc406Sopenharmony_ci */
852141cc406Sopenharmony_cistatic void ioP98EppNegativeProcs( pScanData ps )
853141cc406Sopenharmony_ci{
854141cc406Sopenharmony_ci    if (ps->DataInf.dwScanFlag & SCANDEF_Negative)
855141cc406Sopenharmony_ci		pModeType = a_FilmSettings + _FixParamEppNegative;
856141cc406Sopenharmony_ci    else
857141cc406Sopenharmony_ci		pModeType = a_FilmSettings + _FixParamEppPositive;
858141cc406Sopenharmony_ci
859141cc406Sopenharmony_ci	pModeDiff = a_tabDiffParam + _NegativeEpp150;
860141cc406Sopenharmony_ci
861141cc406Sopenharmony_ci    if (ps->DataInf.xyAppDpi.y > 150) {
862141cc406Sopenharmony_ci		if (ps->DataInf.xyAppDpi.y < 300)
863141cc406Sopenharmony_ci		{
864141cc406Sopenharmony_ci	    	pModeType ++;
865141cc406Sopenharmony_ci		    pModeDiff ++;
866141cc406Sopenharmony_ci		} else {
867141cc406Sopenharmony_ci		    pModeType += 2;
868141cc406Sopenharmony_ci		    pModeDiff += 2;
869141cc406Sopenharmony_ci		}
870141cc406Sopenharmony_ci	}
871141cc406Sopenharmony_ci
872141cc406Sopenharmony_ci    if (ps->DataInf.dwScanFlag & SCANDEF_Negative) {
873141cc406Sopenharmony_ci		if (ps->AsicReg.RD_LineControl == 144)
874141cc406Sopenharmony_ci		    pModeDiff += 4;
875141cc406Sopenharmony_ci		else
876141cc406Sopenharmony_ci		    if (ps->AsicReg.RD_LineControl == 192)
877141cc406Sopenharmony_ci				pModeDiff += 7;
878141cc406Sopenharmony_ci    }
879141cc406Sopenharmony_ci}
880141cc406Sopenharmony_ci
881141cc406Sopenharmony_ci/*.............................................................................
882141cc406Sopenharmony_ci *
883141cc406Sopenharmony_ci */
884141cc406Sopenharmony_cistatic void ioP98BppNegativeProcs( pScanData ps )
885141cc406Sopenharmony_ci{
886141cc406Sopenharmony_ci    if( ps->DataInf.dwScanFlag & SCANDEF_Negative) {
887141cc406Sopenharmony_ci		pModeType = a_FilmSettings + _FixParamBppNegative;
888141cc406Sopenharmony_ci	} else {
889141cc406Sopenharmony_ci		pModeType = a_FilmSettings + _FixParamBppPositive;
890141cc406Sopenharmony_ci	}
891141cc406Sopenharmony_ci
892141cc406Sopenharmony_ci    pModeDiff = a_tabDiffParam + _NegativeBpp150;
893141cc406Sopenharmony_ci
894141cc406Sopenharmony_ci    if( ps->DataInf.xyAppDpi.y > 150 ) {
895141cc406Sopenharmony_ci		if( ps->DataInf.xyAppDpi.y < 300 ) {
896141cc406Sopenharmony_ci		    pModeType ++;
897141cc406Sopenharmony_ci		    pModeDiff ++;
898141cc406Sopenharmony_ci		} else {
899141cc406Sopenharmony_ci		    pModeType += 2;
900141cc406Sopenharmony_ci		    pModeDiff += 2;
901141cc406Sopenharmony_ci		}
902141cc406Sopenharmony_ci	}
903141cc406Sopenharmony_ci
904141cc406Sopenharmony_ci    if ( ps->DataInf.dwScanFlag & SCANDEF_Negative ) {
905141cc406Sopenharmony_ci		if( ps->AsicReg.RD_LineControl == 144 ) {
906141cc406Sopenharmony_ci		    pModeDiff += 4;
907141cc406Sopenharmony_ci		} else {
908141cc406Sopenharmony_ci		    if( ps->AsicReg.RD_LineControl == 192 )
909141cc406Sopenharmony_ci				pModeDiff += 7;
910141cc406Sopenharmony_ci	    }
911141cc406Sopenharmony_ci	}
912141cc406Sopenharmony_ci}
913141cc406Sopenharmony_ci
914141cc406Sopenharmony_ci/*.............................................................................
915141cc406Sopenharmony_ci *
916141cc406Sopenharmony_ci */
917141cc406Sopenharmony_cistatic void ioControlLampOnOff( pScanData ps )
918141cc406Sopenharmony_ci{
919141cc406Sopenharmony_ci	Byte lampStatus;
920141cc406Sopenharmony_ci
921141cc406Sopenharmony_ci	ps->fWarmupNeeded = _TRUE;
922141cc406Sopenharmony_ci
923141cc406Sopenharmony_ci	if( _IS_ASIC98(ps->sCaps.AsicID)) {
924141cc406Sopenharmony_ci
925141cc406Sopenharmony_ci	    lampStatus = ps->AsicReg.RD_ScanControl & _SCAN_LAMPS_ON;
926141cc406Sopenharmony_ci
927141cc406Sopenharmony_ci    	if (ps->bLastLampStatus != lampStatus) {
928141cc406Sopenharmony_ci
929141cc406Sopenharmony_ci			DBG( DBG_LOW, "Using OTHER Lamp !\n" );
930141cc406Sopenharmony_ci			ps->bLastLampStatus = lampStatus;
931141cc406Sopenharmony_ci
932141cc406Sopenharmony_ci			IOCmdRegisterToScanner( ps, ps->RegScanControl,
933141cc406Sopenharmony_ci									ps->AsicReg.RD_ScanControl);
934141cc406Sopenharmony_ci			return;
935141cc406Sopenharmony_ci	    }
936141cc406Sopenharmony_ci	} else {
937141cc406Sopenharmony_ci
938141cc406Sopenharmony_ci	    lampStatus = ps->AsicReg.RD_ScanControl & _SCAN_LAMP_ON;
939141cc406Sopenharmony_ci
940141cc406Sopenharmony_ci		if (ps->DataInf.dwScanFlag&(SCANDEF_Transparency + SCANDEF_Negative)) {
941141cc406Sopenharmony_ci	    	ps->bLampOn = 0;
942141cc406Sopenharmony_ci		} else {
943141cc406Sopenharmony_ci	    	ps->bLampOn = _SCAN_LAMP_ON;
944141cc406Sopenharmony_ci		}
945141cc406Sopenharmony_ci
946141cc406Sopenharmony_ci    	if (ps->bLastLampStatus != lampStatus) {
947141cc406Sopenharmony_ci			DBG( DBG_LOW, "Using OTHER Lamp !\n" );
948141cc406Sopenharmony_ci			ps->bLastLampStatus = lampStatus;
949141cc406Sopenharmony_ci			return;
950141cc406Sopenharmony_ci		}
951141cc406Sopenharmony_ci	}
952141cc406Sopenharmony_ci
953141cc406Sopenharmony_ci	ps->fWarmupNeeded = _FALSE;
954141cc406Sopenharmony_ci	DBG( DBG_LOW, "Using SAME Lamp !\n" );
955141cc406Sopenharmony_ci}
956141cc406Sopenharmony_ci
957141cc406Sopenharmony_ci/*.............................................................................
958141cc406Sopenharmony_ci *
959141cc406Sopenharmony_ci */
960141cc406Sopenharmony_cistatic void ioP98InitialSetCurrentSpeed( pScanData ps )
961141cc406Sopenharmony_ci{
962141cc406Sopenharmony_ci	DBG( DBG_LOW, "ioP98InitialSetCurrentSpeed()\n" );
963141cc406Sopenharmony_ci
964141cc406Sopenharmony_ci    if( ps->DataInf.dwScanFlag & SCANDEF_TPA) {
965141cc406Sopenharmony_ci
966141cc406Sopenharmony_ci		switch (ps->IO.portMode)
967141cc406Sopenharmony_ci		{
968141cc406Sopenharmony_ci	    	case _PORT_SPP:  ioP98SppNegativeProcs( ps ); break;
969141cc406Sopenharmony_ci		    case _PORT_BIDI: ioP98BppNegativeProcs( ps ); break;
970141cc406Sopenharmony_ci
971141cc406Sopenharmony_ci		    default: ioP98EppNegativeProcs( ps ); break;
972141cc406Sopenharmony_ci		}
973141cc406Sopenharmony_ci    } else {
974141cc406Sopenharmony_ci
975141cc406Sopenharmony_ci		switch (ps->IO.portMode) {
976141cc406Sopenharmony_ci		    case _PORT_SPP:
977141cc406Sopenharmony_ci				a_fnSppSpeedProcs[ps->DataInf.wAppDataType](ps);
978141cc406Sopenharmony_ci				break;
979141cc406Sopenharmony_ci
980141cc406Sopenharmony_ci		    case _PORT_BIDI:
981141cc406Sopenharmony_ci				a_fnBppSpeedProcs[ps->DataInf.wAppDataType](ps);
982141cc406Sopenharmony_ci				break;
983141cc406Sopenharmony_ci
984141cc406Sopenharmony_ci		    default:
985141cc406Sopenharmony_ci				a_fnSpeedProcs[ps->DataInf.wAppDataType](ps);
986141cc406Sopenharmony_ci				break;
987141cc406Sopenharmony_ci		}
988141cc406Sopenharmony_ci    }
989141cc406Sopenharmony_ci
990141cc406Sopenharmony_ci    ps->wInitialStep = pModeType->wHomePos;
991141cc406Sopenharmony_ci    ps->wMaxMoveStep = pModeType->wMaxSteps;
992141cc406Sopenharmony_ci
993141cc406Sopenharmony_ci	ps->AsicReg.RD_LineControl = pModeType->bExposureTime;
994141cc406Sopenharmony_ci
995141cc406Sopenharmony_ci    if (ps->DataInf.dwScanFlag & SCANDEF_Negative)
996141cc406Sopenharmony_ci		ps->AsicReg.RD_LineControl = 144;
997141cc406Sopenharmony_ci
998141cc406Sopenharmony_ci#ifdef DEBUG
999141cc406Sopenharmony_ci    if( pModeType->bFlagScanMode != ps->Shade.bIntermediate )
1000141cc406Sopenharmony_ci        DBG( DBG_HIGH, "bSetScanModeFlag != bIntermediate\n" );
1001141cc406Sopenharmony_ci#endif
1002141cc406Sopenharmony_ci
1003141cc406Sopenharmony_ci    ps->bHpMotor 		 = pModeType->bMotorStep;
1004141cc406Sopenharmony_ci    ps->bSetScanModeFlag = pModeType->bFlagScanMode;
1005141cc406Sopenharmony_ci    ps->bShadingTimeFlag = pModeType->bTimesShading;
1006141cc406Sopenharmony_ci
1007141cc406Sopenharmony_ci    ps->dwFullStateSpeed = pModeDiff->dwFullSpeed;
1008141cc406Sopenharmony_ci    ps->bCurrentSpeed    = pModeDiff->bCurrentSpeed;
1009141cc406Sopenharmony_ci    ps->bStepSpeed       = pModeDiff->bStepSpeed;
1010141cc406Sopenharmony_ci
1011141cc406Sopenharmony_ci    if( ps->DataInf.xyAppDpi.y > 600 ) {
1012141cc406Sopenharmony_ci		if( ps->dwFullStateSpeed )
1013141cc406Sopenharmony_ci		    ps->dwFullStateSpeed = 0;
1014141cc406Sopenharmony_ci		else
1015141cc406Sopenharmony_ci		    ps->bStepSpeed <<= 1;
1016141cc406Sopenharmony_ci		ps->wMaxMoveStep <<= 1;
1017141cc406Sopenharmony_ci    }
1018141cc406Sopenharmony_ci}
1019141cc406Sopenharmony_ci
1020141cc406Sopenharmony_ci/************************ exported functions *********************************/
1021141cc406Sopenharmony_ci
1022141cc406Sopenharmony_ci/*.............................................................................
1023141cc406Sopenharmony_ci * here we do some init work
1024141cc406Sopenharmony_ci */
1025141cc406Sopenharmony_ci_LOC int IOFuncInitialize( pScanData ps )
1026141cc406Sopenharmony_ci{
1027141cc406Sopenharmony_ci	DBG( DBG_HIGH, "IOFuncInitialize()\n" );
1028141cc406Sopenharmony_ci
1029141cc406Sopenharmony_ci	if( NULL == ps )
1030141cc406Sopenharmony_ci		return _E_NULLPTR;
1031141cc406Sopenharmony_ci
1032141cc406Sopenharmony_ci	ps->lpEppColorHomePos  = &a_ColorSettings[0];
1033141cc406Sopenharmony_ci	ps->lpEppColorExposure = &a_ColorSettings[4];
1034141cc406Sopenharmony_ci	ps->lpBppColorHomePos  = &a_ColorSettings[5];
1035141cc406Sopenharmony_ci	ps->lpSppColorHomePos  = &a_ColorSettings[10];
1036141cc406Sopenharmony_ci	ps->a_tabDiffParam	   = a_tabDiffParam;
1037141cc406Sopenharmony_ci	ps->a_ColorSettings	   = a_ColorSettings;
1038141cc406Sopenharmony_ci
1039141cc406Sopenharmony_ci	/*
1040141cc406Sopenharmony_ci	 * depending on the asic, we set some functions
1041141cc406Sopenharmony_ci	 */
1042141cc406Sopenharmony_ci	if( _IS_ASIC98(ps->sCaps.AsicID)) {
1043141cc406Sopenharmony_ci
1044141cc406Sopenharmony_ci		ps->InitialSetCurrentSpeed = ioP98InitialSetCurrentSpeed;
1045141cc406Sopenharmony_ci
1046141cc406Sopenharmony_ci  	} else 	if( _IS_ASIC96(ps->sCaps.AsicID)) {
1047141cc406Sopenharmony_ci
1048141cc406Sopenharmony_ci		ps->InitialSetCurrentSpeed = ioP96InitialSetCurrentSpeed;
1049141cc406Sopenharmony_ci
1050141cc406Sopenharmony_ci 	} else {
1051141cc406Sopenharmony_ci
1052141cc406Sopenharmony_ci		DBG( DBG_HIGH , "NOT SUPPORTED ASIC !!!\n" );
1053141cc406Sopenharmony_ci		return _E_NOSUPP;
1054141cc406Sopenharmony_ci	}
1055141cc406Sopenharmony_ci
1056141cc406Sopenharmony_ci	return _OK;
1057141cc406Sopenharmony_ci}
1058141cc406Sopenharmony_ci
1059141cc406Sopenharmony_ci/*.............................................................................
1060141cc406Sopenharmony_ci * 1) Fill scan states to asic.
1061141cc406Sopenharmony_ci * 2) Refresh the scan states if necessary
1062141cc406Sopenharmony_ci * 3) Wait for motor running within half-second period.
1063141cc406Sopenharmony_ci */
1064141cc406Sopenharmony_ci_LOC Byte IOSetToMotorRegister( pScanData ps )
1065141cc406Sopenharmony_ci{
1066141cc406Sopenharmony_ci    ps->OpenScanPath( ps );
1067141cc406Sopenharmony_ci
1068141cc406Sopenharmony_ci    IORegisterToScanner( ps, ps->RegInitScanState );
1069141cc406Sopenharmony_ci
1070141cc406Sopenharmony_ci    IODownloadScanStates( ps );
1071141cc406Sopenharmony_ci
1072141cc406Sopenharmony_ci    ps->CloseScanPath( ps );
1073141cc406Sopenharmony_ci
1074141cc406Sopenharmony_ci	if( _ASIC_IS_98001 != ps->sCaps.AsicID ) {
1075141cc406Sopenharmony_ci		return 0;
1076141cc406Sopenharmony_ci	}
1077141cc406Sopenharmony_ci
1078141cc406Sopenharmony_ci	ps->Scan.bOldScanState = IOGetScanState( ps, _FALSE );
1079141cc406Sopenharmony_ci
1080141cc406Sopenharmony_ci    return ps->Scan.bOldScanState;
1081141cc406Sopenharmony_ci}
1082141cc406Sopenharmony_ci
1083141cc406Sopenharmony_ci/*.............................................................................
1084141cc406Sopenharmony_ci * 1) If scanner path is not established, connect it
1085141cc406Sopenharmony_ci * 2) Read the recent state count
1086141cc406Sopenharmony_ci * 3) Disconnect the path if necessary
1087141cc406Sopenharmony_ci */
1088141cc406Sopenharmony_ci_LOC Byte IOGetScanState( pScanData ps, Bool fOpenned )
1089141cc406Sopenharmony_ci{
1090141cc406Sopenharmony_ci    Byte bScanState, bScanStateNow;
1091141cc406Sopenharmony_ci
1092141cc406Sopenharmony_ci    if( !fOpenned && (_ASIC_IS_98003 != ps->sCaps.AsicID))
1093141cc406Sopenharmony_ci		ps->OpenScanPath( ps );
1094141cc406Sopenharmony_ci
1095141cc406Sopenharmony_ci    bScanState    = IODataFromRegister( ps, ps->RegGetScanState );
1096141cc406Sopenharmony_ci    bScanStateNow = IODataFromRegister( ps, ps->RegGetScanState );
1097141cc406Sopenharmony_ci
1098141cc406Sopenharmony_ci    if((bScanState != bScanStateNow)
1099141cc406Sopenharmony_ci		|| ((ps->sCaps.AsicID == _ASIC_IS_98001 && bScanState & 0x40))) {
1100141cc406Sopenharmony_ci		bScanState = IODataFromRegister( ps, ps->RegGetScanState);
1101141cc406Sopenharmony_ci	}
1102141cc406Sopenharmony_ci
1103141cc406Sopenharmony_ci    if( !fOpenned && (_ASIC_IS_98003 != ps->sCaps.AsicID))
1104141cc406Sopenharmony_ci		ps->CloseScanPath( ps );
1105141cc406Sopenharmony_ci
1106141cc406Sopenharmony_ci    return bScanState;
1107141cc406Sopenharmony_ci}
1108141cc406Sopenharmony_ci
1109141cc406Sopenharmony_ci/*.............................................................................
1110141cc406Sopenharmony_ci * ASIC 98003 specific function to read status 2 register
1111141cc406Sopenharmony_ci */
1112141cc406Sopenharmony_ci_LOC Byte IOGetExtendedStatus( pScanData ps )
1113141cc406Sopenharmony_ci{
1114141cc406Sopenharmony_ci    Byte b;
1115141cc406Sopenharmony_ci
1116141cc406Sopenharmony_ci    b = IODataFromRegister( ps, ps->RegStatus2 );
1117141cc406Sopenharmony_ci
1118141cc406Sopenharmony_ci    if( b == 0xff )
1119141cc406Sopenharmony_ci    	return 0;
1120141cc406Sopenharmony_ci    return b;
1121141cc406Sopenharmony_ci}
1122141cc406Sopenharmony_ci
1123141cc406Sopenharmony_ci/*.............................................................................
1124141cc406Sopenharmony_ci * Read the scan state. Return the count with status bit, and count.
1125141cc406Sopenharmony_ci */
1126141cc406Sopenharmony_ci_LOC void IOGetCurrentStateCount( pScanData ps, pScanState pScanStep )
1127141cc406Sopenharmony_ci{
1128141cc406Sopenharmony_ci    pScanStep->bStatus = IOGetScanState( ps, _FALSE );
1129141cc406Sopenharmony_ci    pScanStep->bStep   = pScanStep->bStatus & _SCANSTATE_MASK;
1130141cc406Sopenharmony_ci}
1131141cc406Sopenharmony_ci
1132141cc406Sopenharmony_ci/*.............................................................................
1133141cc406Sopenharmony_ci * 1) If scanner connection is not established, return error
1134141cc406Sopenharmony_ci * 2) If paper not ready, return error
1135141cc406Sopenharmony_ci * 3) If scanning environment is not prepared, return error
1136141cc406Sopenharmony_ci * 4) Setup the buffers for reassembler the CCD incoming lines.
1137141cc406Sopenharmony_ci * 5) Initiate the registers of asic.
1138141cc406Sopenharmony_ci * [NOTE]
1139141cc406Sopenharmony_ci *	This routine combines from SetupAsicDependentVariables & IsReadyForScan
1140141cc406Sopenharmony_ci *	routines in assembly source.
1141141cc406Sopenharmony_ci */
1142141cc406Sopenharmony_ci_LOC int IOIsReadyForScan( pScanData ps )
1143141cc406Sopenharmony_ci{
1144141cc406Sopenharmony_ci	ULong  dw;
1145141cc406Sopenharmony_ci	pULong pdwTable;
1146141cc406Sopenharmony_ci
1147141cc406Sopenharmony_ci    if((_NO_BASE != ps->sCaps.wIOBase) &&
1148141cc406Sopenharmony_ci							   (ps->DataInf.dwVxdFlag & _VF_ENVIRONMENT_READY)) {
1149141cc406Sopenharmony_ci
1150141cc406Sopenharmony_ci		if( _ASIC_IS_98001 == ps->sCaps.AsicID ) {
1151141cc406Sopenharmony_ci
1152141cc406Sopenharmony_ci			IOSelectLampSource( ps );
1153141cc406Sopenharmony_ci			ioControlLampOnOff( ps );
1154141cc406Sopenharmony_ci			ps->AsicReg.RD_Motor0Control = 0;	    /* motor off */
1155141cc406Sopenharmony_ci			ps->AsicReg.RD_Motor1Control = 0;	    /* motor off */
1156141cc406Sopenharmony_ci			ps->AsicReg.RD_ModelControl = (_ModelDpi600 +
1157141cc406Sopenharmony_ci										   _LED_ACTIVITY + _LED_CONTROL);
1158141cc406Sopenharmony_ci			ps->AsicReg.RD_Origin = 0;
1159141cc406Sopenharmony_ci			ps->AsicReg.RD_Pixels = 5110;
1160141cc406Sopenharmony_ci
1161141cc406Sopenharmony_ci        } else if( _ASIC_IS_98003 == ps->sCaps.AsicID ) {
1162141cc406Sopenharmony_ci
1163141cc406Sopenharmony_ci            ps->OpenScanPath( ps );
1164141cc406Sopenharmony_ci            P12SetGeneralRegister( ps );
1165141cc406Sopenharmony_ci            ps->CloseScanPath( ps );
1166141cc406Sopenharmony_ci
1167141cc406Sopenharmony_ci			ioControlLampOnOff( ps );
1168141cc406Sopenharmony_ci
1169141cc406Sopenharmony_ci		} else {
1170141cc406Sopenharmony_ci
1171141cc406Sopenharmony_ci			ioControlLampOnOff( ps );
1172141cc406Sopenharmony_ci
1173141cc406Sopenharmony_ci			/* SetupAsicDependentVariables */
1174141cc406Sopenharmony_ci			ps->pPutBufR = ps->pGetBufR = ps->pPrescan16; /* 1st color plane */
1175141cc406Sopenharmony_ci			ps->pPutBufG = ps->pGetBufG = ps->pPrescan8;  /* 2nd color plane */
1176141cc406Sopenharmony_ci
1177141cc406Sopenharmony_ci			ps->AsicReg.RD_ScanControl    = ps->bLampOn;
1178141cc406Sopenharmony_ci			ps->Asic96Reg.RD_MotorControl = 0;
1179141cc406Sopenharmony_ci			ps->AsicReg.RD_Origin         = 0;
1180141cc406Sopenharmony_ci			ps->AsicReg.RD_ModelControl   = ps->Device.ModelCtrl | _ModelWhiteIs0;
1181141cc406Sopenharmony_ci			ps->AsicReg.RD_Pixels         = 5110; /* ps->RdPix; */
1182141cc406Sopenharmony_ci			IOPutOnAllRegisters( ps );
1183141cc406Sopenharmony_ci		}
1184141cc406Sopenharmony_ci
1185141cc406Sopenharmony_ci		/*
1186141cc406Sopenharmony_ci		 * MotorInitiate
1187141cc406Sopenharmony_ci		 */
1188141cc406Sopenharmony_ci        if( _ASIC_IS_98003 != ps->sCaps.AsicID ) {
1189141cc406Sopenharmony_ci    		for (dw = _SCANSTATE_BYTES,
1190141cc406Sopenharmony_ci	    	     pdwTable = (pULong)ps->a_wMoveStepTable; dw; dw--, pdwTable++) {
1191141cc406Sopenharmony_ci	        	*pdwTable = 0x10001;
1192141cc406Sopenharmony_ci    		}
1193141cc406Sopenharmony_ci
1194141cc406Sopenharmony_ci	    	memset( ps->a_bColorByteTable, 0, _NUMBER_OF_SCANSTEPS );
1195141cc406Sopenharmony_ci        }
1196141cc406Sopenharmony_ci
1197141cc406Sopenharmony_ci		return _OK;
1198141cc406Sopenharmony_ci    }
1199141cc406Sopenharmony_ci
1200141cc406Sopenharmony_ci	return _E_SEQUENCE;
1201141cc406Sopenharmony_ci}
1202141cc406Sopenharmony_ci
1203141cc406Sopenharmony_ci/*.............................................................................
1204141cc406Sopenharmony_ci *
1205141cc406Sopenharmony_ci */
1206141cc406Sopenharmony_ci_LOC void IOSetXStepLineScanTime( pScanData ps, Byte b )
1207141cc406Sopenharmony_ci{
1208141cc406Sopenharmony_ci    ps->AsicReg.RD_LineControl = b;
1209141cc406Sopenharmony_ci    ps->bSpeed1  = b;
1210141cc406Sopenharmony_ci    ps->bSpeed2  = b >> 1;
1211141cc406Sopenharmony_ci    ps->bSpeed4  = b >> 2;
1212141cc406Sopenharmony_ci	ps->bSpeed8  = b >> 3;
1213141cc406Sopenharmony_ci    ps->bSpeed16 = b >> 4;
1214141cc406Sopenharmony_ci    ps->bSpeed32 = b >> 5;
1215141cc406Sopenharmony_ci    ps->bSpeed24 = b / 24;
1216141cc406Sopenharmony_ci    ps->bSpeed12 = b / 12;
1217141cc406Sopenharmony_ci    ps->bSpeed6  = b / 6;
1218141cc406Sopenharmony_ci    ps->bSpeed3  = b / 3;
1219141cc406Sopenharmony_ci}
1220141cc406Sopenharmony_ci
1221141cc406Sopenharmony_ci/*.............................................................................
1222141cc406Sopenharmony_ci * 1) Reset and fill all new scan states (Mode = Scan)
1223141cc406Sopenharmony_ci * 2) Refresh scan state
1224141cc406Sopenharmony_ci * 3) Wait for motor running within half second.
1225141cc406Sopenharmony_ci */
1226141cc406Sopenharmony_ci_LOC void IOSetToMotorStepCount( pScanData ps )
1227141cc406Sopenharmony_ci{
1228141cc406Sopenharmony_ci	ULong	 dw;
1229141cc406Sopenharmony_ci    pUChar	 pb;
1230141cc406Sopenharmony_ci	TimerDef timer;
1231141cc406Sopenharmony_ci
1232141cc406Sopenharmony_ci  	ps->OpenScanPath( ps );
1233141cc406Sopenharmony_ci
1234141cc406Sopenharmony_ci	if( _ASIC_IS_98001 == ps->sCaps.AsicID ) {
1235141cc406Sopenharmony_ci	    IORegisterToScanner( ps, ps->RegInitScanState );
1236141cc406Sopenharmony_ci	} else {
1237141cc406Sopenharmony_ci	    ps->AsicReg.RD_ModeControl = _ModeScan;
1238141cc406Sopenharmony_ci	    IODataToRegister( ps, ps->RegModeControl, _ModeScan );
1239141cc406Sopenharmony_ci	}
1240141cc406Sopenharmony_ci    IORegisterToScanner( ps, ps->RegScanStateControl );
1241141cc406Sopenharmony_ci
1242141cc406Sopenharmony_ci    for (dw =  _SCANSTATE_BYTES, pb = ps->a_nbNewAdrPointer; dw; dw--, pb++)
1243141cc406Sopenharmony_ci		IODataToScanner( ps, *pb );
1244141cc406Sopenharmony_ci
1245141cc406Sopenharmony_ci    IORegisterToScanner( ps, ps->RegRefreshScanState );
1246141cc406Sopenharmony_ci
1247141cc406Sopenharmony_ci	MiscStartTimer( &timer, (_SECOND/2));
1248141cc406Sopenharmony_ci    do {
1249141cc406Sopenharmony_ci
1250141cc406Sopenharmony_ci		if (!( IOGetScanState( ps, _TRUE) & _SCANSTATE_STOP))
1251141cc406Sopenharmony_ci		    break;
1252141cc406Sopenharmony_ci    }
1253141cc406Sopenharmony_ci    while( !MiscCheckTimer(&timer));
1254141cc406Sopenharmony_ci
1255141cc406Sopenharmony_ci/* CHECK - this line has been added by Rick ? Why ?
1256141cc406Sopenharmony_ci *   return (pScanData->bOldTempScanState = GetScanState (pScanData, FALSE));
1257141cc406Sopenharmony_ci */
1258141cc406Sopenharmony_ci	ps->Scan.bOldScanState = IOGetScanState( ps, _TRUE );
1259141cc406Sopenharmony_ci
1260141cc406Sopenharmony_ci    ps->CloseScanPath( ps );
1261141cc406Sopenharmony_ci}
1262141cc406Sopenharmony_ci
1263141cc406Sopenharmony_ci/*.............................................................................
1264141cc406Sopenharmony_ci *
1265141cc406Sopenharmony_ci */
1266141cc406Sopenharmony_ci_LOC void IOSelectLampSource( pScanData ps )
1267141cc406Sopenharmony_ci{
1268141cc406Sopenharmony_ci 	ps->AsicReg.RD_ScanControl &= (~_SCAN_LAMPS_ON);
1269141cc406Sopenharmony_ci
1270141cc406Sopenharmony_ci    if (ps->DataInf.dwScanFlag & (SCANDEF_TPA)) {
1271141cc406Sopenharmony_ci		ps->AsicReg.RD_ScanControl |= _SCAN_TPALAMP_ON;
1272141cc406Sopenharmony_ci	} else {
1273141cc406Sopenharmony_ci		ps->AsicReg.RD_ScanControl |= _SCAN_NORMALLAMP_ON;
1274141cc406Sopenharmony_ci	}
1275141cc406Sopenharmony_ci}
1276141cc406Sopenharmony_ci
1277141cc406Sopenharmony_ci/*.............................................................................
1278141cc406Sopenharmony_ci *
1279141cc406Sopenharmony_ci */
1280141cc406Sopenharmony_ci_LOC Bool IOReadOneShadingLine( pScanData ps, pUChar pBuf, ULong len )
1281141cc406Sopenharmony_ci{
1282141cc406Sopenharmony_ci	TimerDef timer;
1283141cc406Sopenharmony_ci
1284141cc406Sopenharmony_ci	MiscStartTimer( &timer, _SECOND );
1285141cc406Sopenharmony_ci
1286141cc406Sopenharmony_ci    if( _ASIC_IS_98003 == ps->sCaps.AsicID )
1287141cc406Sopenharmony_ci        ps->Scan.bFifoSelect = ps->RegGFifoOffset;
1288141cc406Sopenharmony_ci
1289141cc406Sopenharmony_ci    do {
1290141cc406Sopenharmony_ci    	if( IOReadFifoLength( ps ) >= ps->AsicReg.RD_Pixels ) {
1291141cc406Sopenharmony_ci
1292141cc406Sopenharmony_ci            IOReadColorData( ps, pBuf, len );
1293141cc406Sopenharmony_ci	        return _TRUE;
1294141cc406Sopenharmony_ci    	}
1295141cc406Sopenharmony_ci    } while( _OK == MiscCheckTimer( &timer ));
1296141cc406Sopenharmony_ci
1297141cc406Sopenharmony_ci    return _FALSE;
1298141cc406Sopenharmony_ci}
1299141cc406Sopenharmony_ci
1300141cc406Sopenharmony_ci/*.............................................................................
1301141cc406Sopenharmony_ci *
1302141cc406Sopenharmony_ci */
1303141cc406Sopenharmony_ci_LOC ULong IOReadFifoLength( pScanData ps )
1304141cc406Sopenharmony_ci{
1305141cc406Sopenharmony_ci	DataType Data;
1306141cc406Sopenharmony_ci
1307141cc406Sopenharmony_ci    Data.dwValue  = 0;
1308141cc406Sopenharmony_ci
1309141cc406Sopenharmony_ci    if( _ASIC_IS_98003 != ps->sCaps.AsicID )
1310141cc406Sopenharmony_ci    	ps->OpenScanPath( ps );
1311141cc406Sopenharmony_ci
1312141cc406Sopenharmony_ci    IODataToRegister( ps, ps->RegBitDepth, _BIT0_7 );
1313141cc406Sopenharmony_ci    Data.dwOverlap.w1st.b1st = IODataFromRegister( ps, ps->Scan.bFifoSelect );
1314141cc406Sopenharmony_ci
1315141cc406Sopenharmony_ci    IODataToRegister( ps, ps->RegBitDepth, _BIT8_15 );
1316141cc406Sopenharmony_ci    Data.dwOverlap.w1st.b2nd = IODataFromRegister( ps, ps->Scan.bFifoSelect );
1317141cc406Sopenharmony_ci
1318141cc406Sopenharmony_ci    IODataToRegister( ps, ps->RegBitDepth, _BIT16_20 );
1319141cc406Sopenharmony_ci    Data.dwOverlap.w2nd.b1st = (IODataFromRegister( ps, ps->Scan.bFifoSelect) & 0x0f);
1320141cc406Sopenharmony_ci
1321141cc406Sopenharmony_ci    if( _ASIC_IS_98003 != ps->sCaps.AsicID )
1322141cc406Sopenharmony_ci        ps->CloseScanPath( ps );
1323141cc406Sopenharmony_ci
1324141cc406Sopenharmony_ci    return Data.dwValue;
1325141cc406Sopenharmony_ci}
1326141cc406Sopenharmony_ci
1327141cc406Sopenharmony_ci/*.............................................................................
1328141cc406Sopenharmony_ci * 1) Initiates the scan states
1329141cc406Sopenharmony_ci * 2) Write the contents to corresponding registers (from ps->RegModeControl to
1330141cc406Sopenharmony_ci *    ps->RegGreenGainOutDirect (P9363) or from ps->RegModeControl to
1331141cc406Sopenharmony_ci *	  ps->RegModeControl2 (48xx)
1332141cc406Sopenharmony_ci */
1333141cc406Sopenharmony_ci_LOC void IOPutOnAllRegisters( pScanData ps )
1334141cc406Sopenharmony_ci{
1335141cc406Sopenharmony_ci	pUChar	pValue;
1336141cc406Sopenharmony_ci    Byte	bReg;
1337141cc406Sopenharmony_ci
1338141cc406Sopenharmony_ci	/* setup scan states */
1339141cc406Sopenharmony_ci    if( _ASIC_IS_98003 == ps->sCaps.AsicID )
1340141cc406Sopenharmony_ci        IODownloadScanStates( ps );
1341141cc406Sopenharmony_ci    else {
1342141cc406Sopenharmony_ci    	IOSetToMotorRegister( ps );
1343141cc406Sopenharmony_ci    	ps->OpenScanPath( ps );
1344141cc406Sopenharmony_ci    }
1345141cc406Sopenharmony_ci
1346141cc406Sopenharmony_ci	if( _IS_ASIC98(ps->sCaps.AsicID)) {
1347141cc406Sopenharmony_ci
1348141cc406Sopenharmony_ci		IODataToRegister(ps, ps->RegStepControl, ps->AsicReg.RD_StepControl);
1349141cc406Sopenharmony_ci    	IODataToRegister(ps, ps->RegMotor0Control,
1350141cc406Sopenharmony_ci						 ps->AsicReg.RD_Motor0Control);
1351141cc406Sopenharmony_ci
1352141cc406Sopenharmony_ci	    if( _ASIC_IS_98003 == ps->sCaps.AsicID )
1353141cc406Sopenharmony_ci            IODataToRegister(ps,ps->RegLineControl,ps->AsicReg.RD_LineControl);
1354141cc406Sopenharmony_ci
1355141cc406Sopenharmony_ci	    IODataToRegister(ps, ps->RegXStepTime, 	  ps->AsicReg.RD_XStepTime);
1356141cc406Sopenharmony_ci    	IODataToRegister(ps, ps->RegModelControl, ps->AsicReg.RD_ModelControl);
1357141cc406Sopenharmony_ci
1358141cc406Sopenharmony_ci		/* the 1st register to write */
1359141cc406Sopenharmony_ci    	pValue = (pUChar)&ps->AsicReg.RD_Dpi;
1360141cc406Sopenharmony_ci
1361141cc406Sopenharmony_ci		/* 0x21 - 0x28 */
1362141cc406Sopenharmony_ci    	for (bReg = ps->RegDpiLow;
1363141cc406Sopenharmony_ci			 bReg <= ps->RegThresholdHigh; bReg++, pValue++) {
1364141cc406Sopenharmony_ci
1365141cc406Sopenharmony_ci			IODataToRegister( ps, bReg, *pValue);
1366141cc406Sopenharmony_ci		}
1367141cc406Sopenharmony_ci
1368141cc406Sopenharmony_ci    	IORegisterToScanner( ps, ps->RegInitDataFifo );
1369141cc406Sopenharmony_ci	    IORegisterToScanner( ps, ps->RegRefreshScanState );
1370141cc406Sopenharmony_ci
1371141cc406Sopenharmony_ci	    if( _ASIC_IS_98003 == ps->sCaps.AsicID )
1372141cc406Sopenharmony_ci            IODataToRegister( ps, ps->RegModeControl, _ModeScan );
1373141cc406Sopenharmony_ci        else
1374141cc406Sopenharmony_ci            IODataToRegister( ps, ps->RegModeControl, (_ModeScan + _ModeFifoRSel));
1375141cc406Sopenharmony_ci
1376141cc406Sopenharmony_ci	} else {
1377141cc406Sopenharmony_ci
1378141cc406Sopenharmony_ci		/*
1379141cc406Sopenharmony_ci		 * the original driver uses a loop, starting at RegModeControl
1380141cc406Sopenharmony_ci		 * 0x18 - 0x26
1381141cc406Sopenharmony_ci		 * as we use the Asic96Reg structure only  for the differences
1382141cc406Sopenharmony_ci		 * to the AsicReg struct, we have to write to each register by hand
1383141cc406Sopenharmony_ci		 */
1384141cc406Sopenharmony_ci		IODataToRegister( ps, ps->RegModeControl, ps->AsicReg.RD_ModeControl );
1385141cc406Sopenharmony_ci		IODataToRegister( ps, ps->RegLineControl, ps->AsicReg.RD_LineControl );
1386141cc406Sopenharmony_ci		IODataToRegister( ps, ps->RegScanControl, ps->AsicReg.RD_ScanControl );
1387141cc406Sopenharmony_ci		IODataToRegister( ps, ps->RegMotorControl,
1388141cc406Sopenharmony_ci											   ps->Asic96Reg.RD_MotorControl );
1389141cc406Sopenharmony_ci		IODataToRegister( ps, ps->RegModelControl,
1390141cc406Sopenharmony_ci												 ps->AsicReg.RD_ModelControl );
1391141cc406Sopenharmony_ci		IODataToRegister( ps, ps->RegMemAccessControl,
1392141cc406Sopenharmony_ci		 				  	  		       ps->Asic96Reg.RD_MemAccessControl );
1393141cc406Sopenharmony_ci
1394141cc406Sopenharmony_ci#if 0
1395141cc406Sopenharmony_ci		DBG( DBG_LOW, "[0x%02x] = 0x%02x\n",
1396141cc406Sopenharmony_ci							  ps->RegModeControl, ps->AsicReg.RD_ModeControl );
1397141cc406Sopenharmony_ci		DBG( DBG_LOW, "[0x%02x] = 0x%02x\n",
1398141cc406Sopenharmony_ci							  ps->RegLineControl, ps->AsicReg.RD_LineControl );
1399141cc406Sopenharmony_ci		DBG( DBG_LOW, "[0x%02x] = 0x%02x\n",
1400141cc406Sopenharmony_ci							  ps->RegScanControl, ps->AsicReg.RD_ScanControl );
1401141cc406Sopenharmony_ci		DBG( DBG_LOW, "[0x%02x] = 0x%02x\n",
1402141cc406Sopenharmony_ci						  ps->RegMotorControl, ps->Asic96Reg.RD_MotorControl );
1403141cc406Sopenharmony_ci		DBG( DBG_LOW, "[0x%02x] = 0x%02x\n",
1404141cc406Sopenharmony_ci					   		ps->RegModelControl, ps->AsicReg.RD_ModelControl );
1405141cc406Sopenharmony_ci		DBG( DBG_LOW, "[0x%02x] = 0x%02x\n",
1406141cc406Sopenharmony_ci				  ps->RegMemAccessControl, ps->Asic96Reg.RD_MemAccessControl );
1407141cc406Sopenharmony_ci#endif
1408141cc406Sopenharmony_ci
1409141cc406Sopenharmony_ci    	pValue = (pUChar)&ps->AsicReg.RD_Dpi;
1410141cc406Sopenharmony_ci
1411141cc406Sopenharmony_ci		/* 0x21 - 0x26 */
1412141cc406Sopenharmony_ci    	for (bReg = ps->RegDpiLow;
1413141cc406Sopenharmony_ci			 bReg <= ps->RegWidthPixelsHigh; bReg++, pValue++) {
1414141cc406Sopenharmony_ci
1415141cc406Sopenharmony_ci			IODataToRegister( ps, bReg, *pValue );
1416141cc406Sopenharmony_ci#if 0
1417141cc406Sopenharmony_ci			DBG( DBG_LOW, "[0x%02x] = 0x%02x\n", bReg, *pValue );
1418141cc406Sopenharmony_ci#endif
1419141cc406Sopenharmony_ci		}
1420141cc406Sopenharmony_ci
1421141cc406Sopenharmony_ci		/* the rest */
1422141cc406Sopenharmony_ci		IODataToRegister( ps, ps->RegThresholdControl,
1423141cc406Sopenharmony_ci									 (Byte)ps->AsicReg.RD_ThresholdControl );
1424141cc406Sopenharmony_ci
1425141cc406Sopenharmony_ci		IODataToRegister( ps, ps->RegWatchDogControl,
1426141cc406Sopenharmony_ci									 (Byte)ps->Asic96Reg.RD_WatchDogControl );
1427141cc406Sopenharmony_ci
1428141cc406Sopenharmony_ci		IODataToRegister( ps, ps->RegModelControl2,
1429141cc406Sopenharmony_ci										  ps->Asic96Reg.u26.RD_ModelControl2 );
1430141cc406Sopenharmony_ci
1431141cc406Sopenharmony_ci#if 0
1432141cc406Sopenharmony_ci		DBG( DBG_LOW, "[0x%02x] = 0x%02x\n",
1433141cc406Sopenharmony_ci					ps->RegThresholdControl, ps->AsicReg.RD_ThresholdControl );
1434141cc406Sopenharmony_ci		DBG( DBG_LOW, "[0x%02x] = 0x%02x\n",
1435141cc406Sopenharmony_ci					ps->RegWatchDogControl, ps->Asic96Reg.RD_WatchDogControl );
1436141cc406Sopenharmony_ci		DBG( DBG_LOW, "[0x%02x] = 0x%02x\n",
1437141cc406Sopenharmony_ci					ps->RegModelControl2, ps->Asic96Reg.u26.RD_ModelControl2 );
1438141cc406Sopenharmony_ci#endif
1439141cc406Sopenharmony_ci		IORegisterToScanner( ps, ps->RegInitDataFifo );
1440141cc406Sopenharmony_ci	}
1441141cc406Sopenharmony_ci
1442141cc406Sopenharmony_ci    if( _ASIC_IS_98003 != ps->sCaps.AsicID )
1443141cc406Sopenharmony_ci        ps->CloseScanPath( ps );
1444141cc406Sopenharmony_ci}
1445141cc406Sopenharmony_ci
1446141cc406Sopenharmony_ci/*.............................................................................
1447141cc406Sopenharmony_ci *
1448141cc406Sopenharmony_ci */
1449141cc406Sopenharmony_ci_LOC void IOReadColorData( pScanData ps, pUChar pBuf, ULong len )
1450141cc406Sopenharmony_ci{
1451141cc406Sopenharmony_ci   	ps->AsicReg.RD_ModeControl = _ModeFifoRSel;
1452141cc406Sopenharmony_ci    IOReadScannerImageData( ps, pBuf, len );
1453141cc406Sopenharmony_ci
1454141cc406Sopenharmony_ci    ps->AsicReg.RD_ModeControl = _ModeFifoGSel;
1455141cc406Sopenharmony_ci    IOReadScannerImageData( ps, pBuf + len, len );
1456141cc406Sopenharmony_ci
1457141cc406Sopenharmony_ci  	ps->AsicReg.RD_ModeControl = _ModeFifoBSel;
1458141cc406Sopenharmony_ci    IOReadScannerImageData( ps, pBuf + len * 2,  len );
1459141cc406Sopenharmony_ci}
1460141cc406Sopenharmony_ci
1461141cc406Sopenharmony_ci/* END PLUSTEK-PP_GENERICIO.C ...............................................*/
1462