1 /* @file plustek-pp_models.c
2  * @brief model specific stuff
3  *
4  * based on sources acquired from Plustek Inc.
5  * Copyright (C) 1998 Plustek Inc.
6  * Copyright (C) 2000-2004 Gerhard Jaeger <gerhard@gjaeger.de>
7  * also based on the work done by Rick Bronson
8  *
9  * History:
10  * - 0.30 - initial version
11  * - 0.31 - no changes
12  * - 0.32 - no changes
13  * - 0.33 - no changes
14  * - 0.34 - no changes
15  * - 0.35 - added some comments
16  *        - did some fine tuning on the 9630P and 12000P/9600P models
17  *        - moved function initPageSettings() to this module
18  * - 0.36 - as the ps->MaxWideLineBlks and ps->MaxWideLineLen are only used
19  *          for the OP 4800, it has been removed from pScanData
20  *        - changed settings of OP600 according to the Primax Direct 4800 tests
21  *        - removed dwPreferSize from struct ScannerCaps
22  *        - fixed the 5seconds bed-hit problem for ASIC 96001/3 based models
23  *        - changes, due to define renaming
24  * - 0.37 - added ButtonCount init
25  *        - added A3I model
26  *        - added functions modelInitCaps(), modelInitMotor() and
27  *          modelSetBufferSizes()
28  * - 0.38 - added P12 stuff
29  *        - code cleanup
30  * - 0.39 - no changes
31  * - 0.40 - changed back to build 0.39-3 (disabled A3I stuff)
32  * - 0.41 - added _OVR_PLUSTEK_4800P switch
33  * - 0.42 - added SFLAG_CUSTOM_GAMMA to capabilities
34  *        - added _OVR_PRIMAX_4800D30 switch
35  *        - changed include names
36  * - 0.43 - no changes
37  * .
38  * <hr>
39  * This file is part of the SANE package.
40  *
41  * This program is free software; you can redistribute it and/or
42  * modify it under the terms of the GNU General Public License as
43  * published by the Free Software Foundation; either version 2 of the
44  * License, or (at your option) any later version.
45  *
46  * This program is distributed in the hope that it will be useful, but
47  * WITHOUT ANY WARRANTY; without even the implied warranty of
48  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
49  * General Public License for more details.
50  *
51  * You should have received a copy of the GNU General Public License
52  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
53  *
54  * As a special exception, the authors of SANE give permission for
55  * additional uses of the libraries contained in this release of SANE.
56  *
57  * The exception is that, if you link a SANE library with other files
58  * to produce an executable, this does not by itself cause the
59  * resulting executable to be covered by the GNU General Public
60  * License.  Your use of that executable is in no way restricted on
61  * account of linking the SANE library code into it.
62  *
63  * This exception does not, however, invalidate any other reasons why
64  * the executable file might be covered by the GNU General Public
65  * License.
66  *
67  * If you submit changes to SANE to the maintainers to be included in
68  * a subsequent release, you agree by submitting the changes that
69  * those changes may be distributed with this exception intact.
70  *
71  * If you write modifications of your own for SANE, it is your choice
72  * whether to permit this exception to apply to your modifications.
73  * If you do not wish that, delete this exception notice.
74  * <hr>
75  */
76 #include "plustek-pp_scan.h"
77 
78 /*************************** local functions *********************************/
79 
80 /*.............................................................................
81  * initialize the extension according to the page size...
82  */
modelInitPageSettings( pScanData ps )83 static void modelInitPageSettings( pScanData ps )
84 {
85 	DBG(DBG_LOW, "modelInitPageSettings()\n" );
86 
87 	if( MODEL_OP_9630PL == ps->sCaps.Model )
88 		ps->dwScannerSize = _SCANSIZE_LEGAL;
89 	else if( MODEL_OP_A3I == ps->sCaps.Model )
90 		ps->dwScannerSize = _SCANSIZE_A3;
91 	else
92 		ps->dwScannerSize = _SCANSIZE_A4;
93 
94     /* default width for all but A3 - 8.5"* 300dpi (_MEASURE_BASE) */
95 	ps->sCaps.wMaxExtentX = 2550;
96 
97     /* this applies to all scanners but the A3 model */
98 	ps->LensInf.rExtentX.wMin 	 = 150;
99 	ps->LensInf.rExtentX.wDef 	 = 2550;
100 	ps->LensInf.rExtentX.wMax 	 = 2550;
101 	ps->LensInf.rExtentX.wPhyMax = 2500;
102 
103 	ps->LensInf.rExtentY.wMin 	 = 150;
104 
105 	ps->LensInf.wBeginX 		 = 0;
106 	ps->LensInf.wBeginY 		 = 0;
107 
108     switch( ps->dwScannerSize ) {
109 
110 	case _SCANSIZE_A4:
111 		/* 11.69 inches */
112 		DBG( DBG_LOW, "A4 set\n" );
113 	    ps->sCaps.wMaxExtentY     =
114         ps->LensInf.rExtentY.wDef =
115 		ps->LensInf.rExtentY.wMax =
116 	    ps->LensInf.rExtentY.wPhyMax = _MEASURE_BASE * 11.6934;
117 	    break;
118 
119 	case _SCANSIZE_A3:
120 		/* 17 inches */
121 		DBG( DBG_LOW, "A3 set\n" );
122 	    ps->sCaps.wMaxExtentY     =
123 		ps->LensInf.rExtentY.wMax =
124         ps->LensInf.rExtentY.wDef =
125 	    ps->LensInf.rExtentY.wPhyMax = _MEASURE_BASE * 17;
126 
127         /* _MEASURE_BASE * 11.69 */
128     	ps->sCaps.wMaxExtentX     =
129 	    ps->LensInf.rExtentX.wDef =
130     	ps->LensInf.rExtentX.wMax = 3507;
131     	ps->LensInf.rExtentX.wPhyMax = 3500;
132 	    break;
133 
134 	case _SCANSIZE_LETTER:
135         /* 11 inches */
136 		DBG( DBG_LOW, "Letter set\n" );
137 	    ps->sCaps.wMaxExtentY     =
138         ps->LensInf.rExtentY.wDef =
139 		ps->LensInf.rExtentY.wMax =
140 	    ps->LensInf.rExtentY.wPhyMax = _MEASURE_BASE * 11;
141 	    break;
142 
143 	case _SCANSIZE_LEGAL:
144         /* 14 inches */
145 		DBG( DBG_LOW, "Legal set\n" );
146 	    ps->sCaps.wMaxExtentY     =
147         ps->LensInf.rExtentY.wDef =
148 		ps->LensInf.rExtentY.wMax =
149 	    ps->LensInf.rExtentY.wPhyMax = _MEASURE_BASE * 14;
150     }
151 
152 	/*
153 	 * add this value to avoid the problems in binary mode
154 	 */
155 	ps->LensInf.rExtentY.wMax += 64;
156 
157     /* set the DPI stuff */
158 	ps->LensInf.rDpiX.wMin 	  = 16;
159 	ps->LensInf.rDpiX.wDef 	  = 50;
160 	ps->LensInf.rDpiX.wMax 	  = (ps->PhysicalDpi * 16);
161 	ps->LensInf.rDpiX.wPhyMax = ps->PhysicalDpi;
162 	ps->LensInf.rDpiY.wMin 	  = 16;
163 	ps->LensInf.rDpiY.wDef 	  = 50;
164 	ps->LensInf.rDpiY.wMax 	  = (ps->PhysicalDpi * 16);
165 	ps->LensInf.rDpiY.wPhyMax = (ps->PhysicalDpi * 2);
166 }
167 
168 /*.............................................................................
169  * set the scanner capabilities
170  */
modelInitCaps( pScanData ps )171 static void modelInitCaps( pScanData ps )
172 {
173 	ps->sCaps.wIOBase = _NO_BASE;
174     ps->sCaps.dwFlag  = SFLAG_CUSTOM_GAMMA;
175 }
176 
177 /*.............................................................................
178  * set the motor stuff
179  */
modelInitMotor( pScanData ps )180 static void modelInitMotor( pScanData ps )
181 {
182     if(	_ASIC_IS_96001 == ps->sCaps.AsicID ) {
183     	ps->FullStep = _MotorFullStep96001;
184 	    ps->MotorOn  = _MotorOn96001;
185     	ps->IgnorePF = _MotorIgnorePF96001;
186     	ps->StepMask = ~ps->FullStep;
187     } else {
188     	ps->FullStep = _Motor1FullStep;
189     	ps->MotorOn	 = _MotorOn;
190 	    ps->IgnorePF = _MotorIgnorePF;
191     	ps->StepMask = _MotorStepMask;
192     }
193 
194 	ps->BackwardSteps = 4000;
195 }
196 
197 /*.............................................................................
198  * according to the models' capabilities, set the buffer stuff
199  */
modelSetBufferSizes( pScanData ps )200 static void modelSetBufferSizes( pScanData ps )
201 {
202     /* should depend on the scan-area !!!! */
203     if( 400 == ps->PhysicalDpi ) {
204 
205         /* assuming a A3I */
206     	ps->BufferSizeBase		   = 3517;
207     	ps->BufferForColorRunTable = (5500 * 4); /* might be 17" * 800dpi !!! */
208 
209     } else if( 600 == ps->PhysicalDpi ) {
210 
211     	ps->BufferSizeBase		   = 2560;
212     	ps->BufferForColorRunTable = (5500 * 4);
213 
214     } else {
215     	ps->BufferSizeBase 	   	   = 1280;
216 	    ps->BufferForColorRunTable = 9000;
217     }
218 
219  	ps->BufferSizePerModel = ps->BufferSizeBase * 2;
220 	ps->BufferForDataRead1 = ps->BufferSizePerModel * 3;
221 
222 	/* patch that for the 600 DPI models OP9630 etc.*/
223 	if(( 300 != ps->PhysicalDpi) && (_ASIC_IS_96003 == ps->sCaps.AsicID))
224 		ps->BufferForDataRead1 += 300;
225 
226 	ps->BufferFor1stColor  = (ps->BufferSizePerModel * 17);
227 	ps->BufferFor2ndColor  = (ps->BufferSizePerModel * 9);
228 	ps->TotalBufferRequire = (ps->BufferFor1stColor  +
229                           	  ps->BufferFor2ndColor  +
230                               ps->BufferForDataRead1 +
231                               ps->BufferForColorRunTable );
232 }
233 
234 /************************ exported functions *********************************/
235 
236 /*.............................................................................
237  * set the model to 4800
238  */
ModelSet4800( pScanData ps )239 _LOC void ModelSet4800( pScanData ps )
240 {
241 	DBG( DBG_LOW, "ModelSet4800()\n" );
242 
243 	/* has 96001 ASIC */
244 	ps->sCaps.AsicID     = _ASIC_IS_96001;
245 	ps->sCaps.Model      = MODEL_OP_4800P;
246 	ps->Device.buttons   = 0;
247 	ps->Device.ModelCtrl = (_ModelDpi300 | _ModelMemSize32k96001 | _ModelWhiteIs0);
248 	ps->Device.DataOriginX = 72;
249 
250 	ps->PhysicalDpi  = 300;
251 	ps->TimePerLine  = 0x30;
252 	ps->Offset70     = 70;
253 
254     modelSetBufferSizes( ps );
255 
256 	ps->a_wGrayInitTime[0]  = 220;	/* _EppTimeForOthers	*/
257 	ps->a_wGrayInitTime[1]  = 720;	/* _SppTimeForOthers	*/
258 	ps->a_wGrayInitTime[2]  = 360;	/* _BidirTimeForOthers	*/
259 	ps->a_wColorInitTime[0] = 500;	/* _EppTimeForColor		*/
260 	ps->a_wColorInitTime[1] = 1680;	/* _SppTimeForColor		*/
261 	ps->a_wColorInitTime[2] = 1100;	/* _BidirTimeForColor	*/
262 
263 	ps->AsicRedColor   = _ASIC_REDCOLOR;
264 	ps->AsicGreenColor = _ASIC_GREENCOLOR;
265 	ps->RedDataReady   = _RED_DATA_READY;
266 	ps->GreenDataReady = _GREEN_DATA_READY;
267 
268     /*
269      * used for shading stuff (see dac.c)
270      */
271 	ps->FBKScanLineBlks	    = 5;
272 	ps->FBKScanLineLenBase  = 1024;
273 	ps->FBKScanLineLen	    = (ps->FBKScanLineLenBase * 3);
274 
275 	ps->ShadingBufferSize	= ps->FBKScanLineLen;
276 	ps->ShadingBankSize		= (ps->FBKScanLineLenBase * 4);
277 	ps->ShadingBankRed		= (_MemBankSize4k96001 | 0x3a);
278 	ps->ShadingBankGreen	= (_MemBankSize4k96001 | 0x3e);
279 	ps->ShadingBankBlue		= (_MemBankSize4k96001 | 0x3c);
280 	ps->ShadingScanLineBlks = 6;
281 	ps->ShadingScanLineLen  = (ps->BufferSizeBase * 3);
282 	ps->OneScanLineLen      = (ps->BufferSizePerModel * 3);
283 
284     modelInitMotor( ps );
285     modelInitCaps ( ps );
286 	modelInitPageSettings( ps );
287 
288 	DBG( DBG_LOW, "ModelSet4800() done.\n" );
289 }
290 
291 /*.............................................................................
292  * set the model to 4830
293  */
ModelSet4830( pScanData ps )294 _LOC void ModelSet4830( pScanData ps )
295 {
296 	DBG( DBG_LOW, "ModelSet4830()\n" );
297 
298 	/* has 96003 ASIC */
299 	ps->sCaps.Model = MODEL_OP_4830P;
300 	if( _OVR_PRIMAX_4800D30 == ps->ModelOverride ) {
301 		DBG( DBG_LOW, "Model Override --> Primax 4800D 30\n" );
302 		ps->sCaps.Model = MODEL_PMX_4800D3;
303 	}
304 	ps->sCaps.AsicID     = _ASIC_IS_96003;
305 	ps->Device.buttons   = 1;
306 	ps->Device.ModelCtrl = (_ModelDpi300 | _ModelMemSize32k3 | _ModelWhiteIs0);
307 	ps->Device.DataOriginX = 72;
308 
309 	ps->PhysicalDpi 		= 300;
310 	ps->TimePerLine 		= 0x30;
311 	ps->Offset70 		    = 70;
312 
313     modelSetBufferSizes( ps );
314 
315 	ps->a_wGrayInitTime[0]  = 220;	/* _EppTimeForOthers 	*/
316 	ps->a_wGrayInitTime[1]  = 720;	/* _SppTimeForOthers 	*/
317 	ps->a_wGrayInitTime[2]  = 360;	/* _BidirTimeForOthers 	*/
318 	ps->a_wColorInitTime[0] = 500;	/* _EppTimeForColor 	*/
319 	ps->a_wColorInitTime[1] = 1680;	/* _SppTimeForColor 	*/
320 	ps->a_wColorInitTime[2] = 1100;  /* _BidirTimeForColor 	*/
321 
322 	ps->AsicRedColor   = _ASIC_REDCOLOR;
323 	ps->AsicGreenColor = _ASIC_GREENCOLOR;
324 	ps->RedDataReady   = _RED_DATA_READY;
325 	ps->GreenDataReady = _GREEN_DATA_READY;
326 
327     /*
328      * used for shading stuff (see dac.c)
329      */
330 	ps->FBKScanLineBlks	    = 5;
331 	ps->FBKScanLineLenBase  = 1024;
332 	ps->FBKScanLineLen	    = (ps->FBKScanLineLenBase * 3);
333 
334   	ps->ShadingBufferSize	= ps->FBKScanLineLen;
335 	ps->ShadingBankSize		= (ps->FBKScanLineLenBase * 4);
336 	ps->ShadingBankRed		= (_MemBankSize4k | 0x3a);
337 	ps->ShadingBankGreen	= (_MemBankSize4k | 0x3e);
338 	ps->ShadingBankBlue		= (_MemBankSize4k | 0x3c);
339 	ps->ShadingScanLineBlks = 6;
340 	ps->ShadingScanLineLen  = (ps->BufferSizeBase * 3);
341 	ps->OneScanLineLen      = (ps->BufferSizePerModel * 3);
342 
343     modelInitMotor( ps );
344     modelInitCaps ( ps );
345 	modelInitPageSettings( ps );
346 
347 	DBG( DBG_LOW, "ModelSet4830() done.\n" );
348 }
349 
350 /*.............................................................................
351  * set the model to 600, tested on a Primax Direct 4800 and OP600
352  */
ModelSet600( pScanData ps )353 _LOC void ModelSet600( pScanData ps )
354 {
355 	DBG( DBG_LOW, "ModelSet600()\n" );
356 
357 	/*
358  	 * set to 4830 first, then do the differences
359 	 */
360  	ModelSet4830( ps );
361 	ps->Device.buttons = 0;
362 
363 	if( _OVR_PLUSTEK_4800P == ps->ModelOverride ) {
364 
365 		DBG( DBG_LOW, "Model Override --> OpticPro4800\n" );
366 		ps->sCaps.Model = MODEL_OP_4800P;
367 
368 	} else if( _OVR_PRIMAX_4800D == ps->ModelOverride ) {
369 
370 		DBG( DBG_LOW, "Model Override --> Primax 4800D\n" );
371 		ps->sCaps.Model = MODEL_PMX_4800D;
372 
373 	} else {
374 
375 		ps->sCaps.Model = MODEL_OP_600P;
376 
377 		/* for Plustek OpticPro 600P it's necessary to swap Red and Green
378 		 * changed by mh moloch@nikocity.de
379 		 */
380 	 	ps->AsicRedColor   = _ASIC_GREENCOLOR;
381 	 	ps->AsicGreenColor = _ASIC_REDCOLOR;
382 	}
383 
384 	DBG( DBG_LOW, "ModelSet600() done.\n" );
385 }
386 
387 /*.............................................................................
388  * set the model to 12000P, 96000P (tested on a OP96000P)
389  */
ModelSet12000( pScanData ps )390 _LOC void ModelSet12000( pScanData ps )
391 {
392 	DBG( DBG_LOW, "ModelSet12000()\n" );
393 
394 	/*
395 	 * set to 9630 first, then do the differences
396 	 */
397 	ModelSet9630( ps );
398 	ps->Device.buttons = 0;
399 	ps->sCaps.Model    = MODEL_OP_12000P;
400 
401 	/*
402 	 * swapped Red and Green for 12000P/96000P
403 	 */
404 	ps->AsicRedColor   = _ASIC_GREENCOLOR;
405 	ps->AsicGreenColor = _ASIC_REDCOLOR;
406     ps->RedDataReady   = _GREEN_DATA_READY;
407 	ps->GreenDataReady = _RED_DATA_READY;
408 
409 	DBG( DBG_LOW, "ModelSet12000() done.\n" );
410 }
411 
412 /*.............................................................................
413  * set the model to A3I
414  */
ModelSetA3I( pScanData ps )415 _LOC void ModelSetA3I( pScanData ps )
416 {
417 	DBG( DBG_LOW, "ModelSetA3I()\n" );
418 
419 	/*
420  	 * has 96003 ASIC
421 	 */
422 	ps->Device.buttons = 1;
423 	ps->sCaps.Model    = MODEL_OP_A3I;
424 	ps->sCaps.AsicID   = _ASIC_IS_96003;
425 
426 	ps->Device.ModelCtrl = (_ModelDpi400 | _ModelMemSize128k4 | _ModelWhiteIs0);
427 	ps->Device.DataOriginX = 164;
428 
429 	ps->PhysicalDpi = 400;
430 	ps->TimePerLine = 0x50;
431 	ps->Offset70 	= 145;
432 
433     modelSetBufferSizes( ps );
434 
435 	ps->a_wGrayInitTime[0]  = 133;  /* _EppTimeForOthers	*/
436 	ps->a_wGrayInitTime[1]  = 720;  /* _SppTimeForOthers	*/
437 	ps->a_wGrayInitTime[2]  = 300;  /* _BidirTimeForOthers	*/
438 	ps->a_wColorInitTime[0] = 400;  /* _EppTimeForColor		*/
439 	ps->a_wColorInitTime[1] = 1800; /* _SppTimeForColor		*/
440 	ps->a_wColorInitTime[2] = 800;  /* _BidirTimeForColor	*/
441 
442 	ps->AsicRedColor   = _ASIC_GREENCOLOR;
443 	ps->AsicGreenColor = _ASIC_REDCOLOR;
444     ps->RedDataReady   = _GREEN_DATA_READY;
445 	ps->GreenDataReady = _RED_DATA_READY;
446 
447 	ps->FBKScanLineBlks	   = 10;
448 	ps->FBKScanLineLenBase = 2048;
449 	ps->FBKScanLineLen	   = (ps->FBKScanLineLenBase * 3);
450 
451 	ps->ShadingBufferSize	= (1024 * 7);
452 	ps->ShadingBankSize		= 8192;
453 	ps->ShadingBankRed		= (_MemBankSize8k | 0x34);
454 	ps->ShadingBankGreen	= (_MemBankSize8k | 0x3c);
455 	ps->ShadingBankBlue		= (_MemBankSize8k | 0x38);
456 	ps->ShadingScanLineBlks = 10;
457 	ps->ShadingScanLineLen  = (ps->BufferSizeBase * 3);
458 	ps->OneScanLineLen      = (ps->ShadingScanLineLen * 2);
459 
460     modelInitMotor( ps );
461 	ps->BackwardSteps = 9000;
462 
463     modelInitCaps( ps );
464 	modelInitPageSettings( ps );
465 
466 	/*
467 	 * need to double the vals
468 	 */
469 	ps->LensInf.rExtentX.wMax 	 *= 2;
470 	ps->LensInf.rExtentX.wPhyMax *= 2;
471 	ps->LensInf.rExtentY.wMax 	 *= 2;
472 	ps->LensInf.rExtentY.wPhyMax *= 2;
473 
474 	DBG( DBG_LOW, "ModelSetA3I() done.\n" );
475 }
476 
477 /*.............................................................................
478  * set the model to 9630
479  */
ModelSet9630( pScanData ps )480 _LOC void ModelSet9630( pScanData ps )
481 {
482 	DBG( DBG_LOW, "ModelSet9360()\n" );
483 
484 	/*
485  	 * has 96003 ASIC
486 	 */
487 	if( _OVR_PLUSTEK_9630PL == ps->ModelOverride ) {
488 		DBG( DBG_LOW, "Model Override --> 9630PL\n" );
489 		ps->sCaps.Model = MODEL_OP_9630PL;
490 	} else {
491 		ps->sCaps.Model = MODEL_OP_9630P;
492 	}
493 
494 	ps->Device.buttons = 1;
495 	ps->sCaps.AsicID   = _ASIC_IS_96003;
496 
497 	ps->Device.ModelCtrl = (_ModelDpi600 | _ModelMemSize128k4 | _ModelWhiteIs0);
498 	ps->Device.DataOriginX = 64;
499 
500 	ps->PhysicalDpi = 600;
501 	ps->TimePerLine = 0x5a;
502 	ps->Offset70 	= 95;
503 
504     modelSetBufferSizes( ps );
505 
506 	ps->a_wGrayInitTime[0]  = 133;  /* _EppTimeForOthers	*/
507 	ps->a_wGrayInitTime[1]  = 720;  /* _SppTimeForOthers	*/
508 	ps->a_wGrayInitTime[2]  = 300;  /* _BidirTimeForOthers	*/
509 	ps->a_wColorInitTime[0] = 400;  /* _EppTimeForColor		*/
510 	ps->a_wColorInitTime[1] = 1800; /* _SppTimeForColor		*/
511 	ps->a_wColorInitTime[2] = 800;  /* _BidirTimeForColor	*/
512 
513 	ps->AsicRedColor   = _ASIC_REDCOLOR;
514 	ps->AsicGreenColor = _ASIC_GREENCOLOR;
515 	ps->RedDataReady   = _RED_DATA_READY;
516 	ps->GreenDataReady = _GREEN_DATA_READY;
517 
518 	ps->ShadingBufferSize	= (1024 * 7);
519 	ps->ShadingBankSize		= 8192;
520 	ps->ShadingBankRed		= (_MemBankSize8k | 0x34);
521 	ps->ShadingBankGreen	= (_MemBankSize8k | 0x3c);
522 	ps->ShadingBankBlue		= (_MemBankSize8k | 0x38);
523 	ps->ShadingScanLineBlks = 10;
524 	ps->ShadingScanLineLen  = (2560 * 3);
525 
526 	ps->FBKScanLineBlks	   = 10;
527 	ps->FBKScanLineLenBase = 2048;
528 	ps->FBKScanLineLen	   = (ps->FBKScanLineLenBase * 6);
529 
530 	ps->OneScanLineLen = (5120 * 3);
531 
532     modelInitMotor( ps );
533 	ps->BackwardSteps = 9000;
534 
535     modelInitCaps( ps );
536 	modelInitPageSettings( ps );
537 
538 	/*
539 	 * need to double the vals
540 	 */
541 	ps->LensInf.rExtentX.wMax 	 *= 2;
542 	ps->LensInf.rExtentX.wPhyMax *= 2;
543 	ps->LensInf.rExtentY.wMax 	 *= 2;
544 	ps->LensInf.rExtentY.wPhyMax *= 2;
545 
546 	DBG( DBG_LOW, "ModelSet9630() done.\n" );
547 }
548 
549 /*.............................................................................
550  * set the model to 9636 (ASIC 98001 models)
551  * works for 9636P Turbo and 9636T /12000T
552  */
ModelSet9636( pScanData ps )553 _LOC void ModelSet9636( pScanData ps )
554 {
555 	DBG( DBG_LOW, "ModelSet9636()\n" );
556 
557 	/*
558 	 *set to 9630 first, then do the differences
559 	 */
560 	ModelSet9630( ps );
561 	ps->Device.buttons = 0;
562 
563 	/*
564 	 * has 98001 ASIC
565 	 */
566 	if( _OVR_PLUSTEK_9636 == ps->ModelOverride ) {
567 		DBG( DBG_LOW, "Model Override --> 9636P+/Turbo\n" );
568 		ps->sCaps.Model = MODEL_OP_9636PP;
569 	} else if( _OVR_PLUSTEK_9636P == ps->ModelOverride ) {
570 		DBG( DBG_LOW, "Model Override --> 9636P\n" );
571 		ps->sCaps.Model = MODEL_OP_9636P;
572 	} else {
573 		ps->sCaps.Model   = MODEL_OP_9636T;
574         ps->sCaps.dwFlag |= SFLAG_TPA;
575 	}
576 
577 	ps->Device.DataOriginX = 72;
578 	ps->sCaps.AsicID = _ASIC_IS_98001;
579 
580 	ps->TotalBufferRequire = _LINE_BUFSIZE * 2 + _LINE_BUFSIZE1 +
581 			 					ps->BufferForColorRunTable + _PROCESS_BUFSIZE;
582 
583     /* do it again, as ModelSet9630() changes the result of this function !*/
584 	modelInitPageSettings( ps );
585 
586 	DBG( DBG_LOW, "ModelSet9636() done.\n" );
587 }
588 
589 /*.............................................................................
590  * set the model to P12 (ASIC 98003 models)
591  */
ModelSetP12( pScanData ps )592 _LOC void ModelSetP12( pScanData ps )
593 {
594 	DBG( DBG_LOW, "ModelSetP12()\n" );
595 
596 	/*
597 	 * set to 9630 first, then do the differences
598 	 */
599 	ModelSet9630( ps );
600 	ps->Device.DataOriginX = 72;
601     ps->sCaps.Model  = MODEL_OP_PT12;
602 	ps->sCaps.AsicID = _ASIC_IS_98003;
603 
604 	ps->TotalBufferRequire = _SizeTotalBufTpa;
605 
606     /* do it again, as ModelSet9630() changes the result of this function !*/
607 	modelInitPageSettings( ps );
608 
609 	DBG( DBG_LOW, "ModelSetP12() done.\n" );
610 }
611 
612 /* END PLUSTEK-PP_MODEL.C ...................................................*/
613