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 */
83static 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 */
171static 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 */
180static 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 */
200static 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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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