summaryrefslogtreecommitdiff
path: root/backend/plustek-pp_hwdefs.h
blob: 7b9213ef0e8b3b99125ca3e3e4edd909ab045db8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
/* @file plustek-pp_hwdefs.h
 * @brief different definitions for describing the scanner hardware
 *
 * based on sources acquired from Plustek Inc.
 * Copyright (C) 1998 Plustek Inc.
 * Copyright (C) 2000-2004 Gerhard Jaeger <gerhard@gjaeger.de>
 * also based on the work done by Rick Bronson <rick@efn.org>
 *
 * History:
 * 0.30 - initial version
 * 0.31 - corrected the values of _GAIN_P98_HIGH, _GAIN_P96_HIGH and _GAIN_LOW
 * 0.32 - removed _LampDelay defines
 *		  removed _MODE_xxx defines
 * 0.33 - cosmetic changes
 *		  removed _PORT_BPP from modelist
 * 0.34 - no changes
 * 0.35 - no changes
 * 0.36 - moved struct ScanState to this header
 *		  moved some definitions from scandata.h to this file
 * 0.37 - some cleanup work
 *        added model override defines here
 *        added _A3
 *        changed some _ defines to _ defines
 * 0.38 - added ASIC98003 stuff
 *        removed the _ASIC_xxxxx definitions
 * 0.39 - major changes: moved a lot of stuff to this file
 * 0.40 - no changes
 * 0.41 - added _OVR_PLUSTEK_4800P definition
 * 0.42 - added _OVR_PRIMAX_4800D30 definition
 * 0.43 - no changes
 * .
 * <hr>
 * This file is part of the SANE package.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *
 * As a special exception, the authors of SANE give permission for
 * additional uses of the libraries contained in this release of SANE.
 *
 * The exception is that, if you link a SANE library with other files
 * to produce an executable, this does not by itself cause the
 * resulting executable to be covered by the GNU General Public
 * License.  Your use of that executable is in no way restricted on
 * account of linking the SANE library code into it.
 *
 * This exception does not, however, invalidate any other reasons why
 * the executable file might be covered by the GNU General Public
 * License.
 *
 * If you submit changes to SANE to the maintainers to be included in
 * a subsequent release, you agree by submitting the changes that
 * those changes may be distributed with this exception intact.
 *
 * If you write modifications of your own for SANE, it is your choice
 * whether to permit this exception to apply to your modifications.
 * If you do not wish that, delete this exception notice.
 * <hr>
 */
#ifndef __HWDEFS_H__
#define __HWDEFS_H__

/*
 * port modes
 * (WARNING: never change these defines, as they are used as entries
 *           to jump tables !!!)
 */
#define _PORT_EPP       0
#define _PORT_SPP       1
#define _PORT_BIDI      2
#define _PORT_ECP       3
#define _PORT_ESP       4
#define _PORT_NONE      5

/*
 * ScannerSize
 */
#define _SCANSIZE_A4        0
#define _SCANSIZE_LETTER    1
#define _SCANSIZE_LEGAL     2
#define _SCANSIZE_A3        3

/*
 * Magic IDs switch printer port to scanner mode
 */
#define _ID1ST          0x69
#define _ID2ND          0x96
#define _ID3RD          0xa5
#define _ID4TH          0x5a

/*
 * Special IDs used to reset scanner (ASIC98003)
 */
#define _RESET1ST       0x69
#define _RESET2ND       0x96
#define _RESET3RD       0xaa
#define _RESET4TH       0x55

/*
 * ID switch to printer mode
 */
#define _ID_TO_PRINTER	0

/*
 * Flags for internal use
 */
#define _VF_BUILDMAP		    0x0000001
#define _VF_DATATOUSERBUFFER    0x0000002
#define _VF_ENVIRONMENT_READY   0x0000004
#define _VF_FIRSTSCANLINE	    0x0000008
#define _VF_PREVIEW     		0x0000020

/*
 * Printer Control Port: Definitions
 */
#define _CTRL_STROBE		0x01
#define _CTRL_AUTOLF		0x02
#define _CTRL_NOT_INIT		0x04
#define _CTRL_SELECT_IN		0x08
#define _CTRL_ENABLE_IRQ	0x10
#define _CTRL_DIRECTION		0x20
#define _CTRL_RESERVED  	0xc0

/*
 * here are the definitions for the different registers
 * first the ASIC 96001/3 section
 */

/* Status Register 0x10 */
#define _FLAG_P96_PAPER		 0x01
#define _FLAG_P96_ADF		 0x02
#define _FLAG_P96_KEY		 0x04
#define _FLAG_P96_EPP		 0x08
#define _FLAG_P96_FIFOFULL	 0x10
#define _FLAG_P96_FIFOEMPTY	 0x20
#define _FLAG_P96_CCDTYPE	 0x40
#define _FLAG_P96_MOTORTYPE  0x80

/*
 * the 98001 section
 */
#define _DEFAULT_LINESCANTIME   96

/* Status Register (Addr: 0x30) */
#define	_FLAG_P98_PAPER      0x01
#define _FLAG_P98_KEY		 0x80

/*
 * some buffer sizes (for ASIC 98001 based devices)
 */
#define _LINE_BUFSIZE		(5500 * 6)
#define _LINE_BUFSIZE1		(5500 * 8)
#define _PROCESS_BUFSIZE 	(5120 * 3)

/*
 * generic equates
 */
#define _DEF_BW_THRESHOLD	  111		/* default B/W mode threshold value	*/
#define _NUMBER_OF_SCANSTEPS   64		/* Asic spec.: up to 64 scan steps 	*/
#define _SCANSTATE_BYTES      (_NUMBER_OF_SCANSTEPS/2)

/* CHECK: Play around with the P98003/1
 * gain values - maybe we get a brighter picture...
 */
#define _GAIN_P98_HIGH		  225		/* Volt. max. value, Asic 98001		*/
#define _GAIN_P98003_HIGH	  240		/* Volt. max. value, Asic 98003		*/
#define _GAIN_P96_HIGH		  240		/* Volt. max. value, Asic 96001/3	*/
#define _GAIN_LOW			  210		/* Volt. min. value					*/
#define _GAIN_P98003_LOW	  220		/* Volt. min. value, Asic 98003 	*/
#define _MOTOR_ONE_LINE_TIME    4

/* for ASIC 98001/3 shading */
#define _DEF_BRIGHTEST_SKIP     3
#define _DEF_DARKEST_SKIP		5

#define _BUF_SIZE_BASE_CONST 	1280
#define _SCANSTATE_TABLE_SIZE	250		/* was 200 for 4830 */
#define _P98_OFFSET70			60

/* for Data channel (BYTE) */
#define _RED_DATA_READY		0x01
#define _GREEN_DATA_READY 	0x02
#define _BLUE_DATA_READY	0x04

#define _ASIC_REDCOLOR		0x01
#define _ASIC_GREENCOLOR    0x03
#define _ASIC_BLUECOLOR		0x02

/*
 * for Asic I/O signal control
 */
#define _CTRL_GENSIGNAL         (_CTRL_RESERVED + _CTRL_NOT_INIT)   /* 0xc4 */

#define _CTRL_START_REGWRITE    (_CTRL_GENSIGNAL + _CTRL_SELECT_IN) /* 0xcc */
#define _CTRL_END_REGWRITE      (_CTRL_GENSIGNAL)                   /* 0xc4 */

#define _CTRL_START_DATAWRITE   (_CTRL_GENSIGNAL + _CTRL_AUTOLF)    /* 0xc6 */
#define _CTRL_END_DATAWRITE     (_CTRL_GENSIGNAL)                   /* 0xc4 */

#define _CTRL_EPPSIGNAL_WRITE   (_CTRL_GENSIGNAL + _CTRL_STROBE)    /* 0xc5 */
#define _CTRL_EPPTRIG_REGWRITE  (_CTRL_GENSIGNAL + _CTRL_SELECT_IN + _CTRL_STROBE)

#define _CTRL_START_BIDIREAD    (_CTRL_GENSIGNAL + _CTRL_DIRECTION + _CTRL_AUTOLF)
#define _CTRL_END_BIDIREAD      (_CTRL_GENSIGNAL + _CTRL_DIRECTION) /* 0xe4 */


typedef struct
{
    ULong	dwFullSpeed;
    Byte	bCurrentSpeed;
    Byte	bStepSpeed;
} DiffModeVar, *pDiffModeVar;

typedef struct
{
    UShort wHomePos;		/* scanner's scanning home position	*/
    UShort wMaxSteps;		/* maximum steps for this scan		*/
    Byte   bExposureTime;	/* exposure time for one line		*/
    Byte   bMotorStep;
    Byte   bFlagScanMode;	/* see below	*/
    Byte   bTimesShading;	/* see below	*/
} ModeTypeVar, *pModeTypeVar;

typedef struct {
	Byte	bStep;
	Byte	bStatus;
} ScanState, *pScanState;

typedef struct {
    Byte    bReg;
    Byte    bParam;
} RegDef, *pRegDef;

typedef union {
   	RGBByteDef	Colors;
    UChar		bColors[3];
} ColorByte, *pColorByte;

typedef union {
    RGBUShortDef Colors;
    UShort		 wColors[3];
} ColorWord, *pColorWord;

typedef struct {
    UShort exposureTime;
    UShort xStepTime;
} ExpXStepDef, *pExtXStepDef;

typedef struct {
    UShort  thresholdBW;
    UShort  thresholdGray;
    UShort  thresholdColor;
} ThreshDef, *pThreshDef;

/* for description of the DAC specific stuff*/
typedef struct {
    ColorWord	GainResize;
    ColorWord   DarkCmpHi;
    ColorWord   DarkCmpLo;
    ColorWord   DarkOffSub;
    ColorByte   DarkDAC;
    UChar		Reserved;
} DACTblDef, *pDACTblDef;

/*
 * some function types
 */
typedef struct scandata *pScanData;
typedef void (*pFnDataProcess)(pScanData, pVoid, pVoid, ULong);
typedef Bool (*pFnReadData)(pScanData, pUChar, ULong);
typedef void (*pFnVoid)(pScanData);
typedef Bool (*pFnBool)(pScanData);
typedef void (*pFnDACOffs)(pScanData, pDACTblDef, ULong);
typedef void (*pFnDACDark)(pScanData, pDACTblDef, ULong, UShort);
typedef void (*pFnOut)(Byte,UShort);
typedef Byte (*pFnIn)(UShort);

/*
 * For Motor step control
 */
#define _FullStepStrong 	0x10
#define _HalfStep			0x04
#define _QuarterStep		0x08
#define _EightStep			0x0c

/* bTimesShading */
#define _Shading_32Times	0
#define _Shading_4Times 	1
#define _Shading_16Times	2

/* Scan.bModuleState */
#define _MotorInNormalState	0
#define _MotorGoBackward	1
#define _MotorInStopState	2
#define _MotorAdvancing	    3
#define _MotorAdvanced	    4

/* bMoveDataOutFlag */
#define _DataInNormalState		0
#define _DataAfterRefreshState	1
#define _DataFromStopState		2

/* bFastMoveFlag */
#define _FastMove_Fast_C50_G100 	0
#define _FastMove_Middle_C75_G150	1
#define _FastMove_Low_C75_G150		2
#define _FastMove_Low_C75_G150_Back	4
#define _FastMove_Pos_300			5
#define _FastMove_Film_150			6

/*
 * ASIC 98003 base models...
 */
#define _TPA_P98003_SHADINGORG	2172U
#define _RFT_SCANNING_ORG	    380U

#define _POS_SCANNING_ORG	    2840U
#define _POS_PAGEWIDTH  		450U
#define _POS_ORG_OFFSETX    	0x41C

#define _NEG_SCANNING_ORG	    3000U
#define _NEG_PAGEWIDTH		    464U
#define _NEG_PAGEWIDTH600       992U
#define _NEG_ORG_OFFSETX    	0x430
#define _NEG_SHADING_OFFS       1500U

#define _NEG_EDGE_VALUE 		0x800

#define _SHADING_BEGINX 		4U


/* home positions */
#define _Home_CE50		0x1f	/* 0x1d     1b	*/
#define _Home_CE100		0x27	/* 0x34     23	*/
#define _Home_CE150		0x29	/* 0x23     25	*/
#define _Home_CE300		0x34	/* 0x2e     30	*/
#define _Home_CE600		0x3a	/* 0x35     36	*/
#define _Home_CB50		0x20	/* 0x22     1c	*/
#define _Home_CB100		0x41	/* 0x42     3d	*/
#define _Home_CB150		0x41	/* 0x3f     3d	*/
#define _Home_CB300		0x4c	/* 0x4a     48	*/
#define _Home_CB600		0x53	/* 0x54     4f	*/
#define _Home_CS50		0x20	/* 0x1b     1c	*/
#define _Home_CS100		0x41	/* 0x40     3d	*/
#define _Home_CS150		0x41	/* 0x3e     3d	*/
#define _Home_CS300		0x4c	/* 0x4b     48	*/
#define _Home_CS600		0x53	/* 0x4f     4f	*/
#define _Home_GE75		0x08	/* 7-14-98  00	*/
#define _Home_GE150		0x04	/* 0x22     00	*/
#define _Home_GE300		0x12	/* 0x2d     0e	*/
#define _Home_GE600		0x19	/* 0x33     15	*/
#define _Home_GB75		0x40	/* 7-14-98  3e	*/
#define _Home_GB150		0x40	/* 0x3f     3e	*/
#define _Home_GB300		0x4e	/* 0x4c     4a	*/
#define _Home_GB600		0x53	/* 0x51     4f	*/
#define _Home_GS75		0x40	/* 7-14-98  3c	*/
#define _Home_GS150		0x40	/* 0x3f     3c	*/
#define _Home_GS300		0x4e	/* 0x4d     4a	*/
#define _Home_GS600		0x53	/* 0x51     4f	*/
#define _Home_BE75		0x30	/* 7-14-98  20	*/
#define _Home_BE150		0x30	/* 0x3c     20	*/
#define _Home_BE300		0x32	/* 0x48     2e	*/
#define _Home_BE600		0x37	/* 0x35     33	*/
#define _Home_BB75		0x42	/* 7-14-98  3e	*/
#define _Home_BB150		0x42	/* 0x47     3e 	*/
#define _Home_BB300		0x50	/* 0x51     4c	*/
#define _Home_BB600		0x53	/* 0x51     4f	*/
#define _Home_BS75		0x42	/* 7-14-98  3e	*/
#define _Home_BS150		0x42	/* 0x46     3e	*/
#define _Home_BS300		0x50	/* 0x4f     4c	*/
#define _Home_BS600		0x53	/* 0x55     4f	*/

/*
 * for ModeTypeVar indexes
 */
#define _FixParamEppBw		    0
#define _FixParamBppBw		    _FixParamEppBw + 4
#define _FixParamSppBw		    _FixParamBppBw + 4
#define _FixParamEppGray	    0
#define _FixParamBppGray	    _FixParamEppGray + 4
#define _FixParamSppGray	    _FixParamBppGray + 4
#define _FixParamEppColor	    0
#define _FixParamBppColor	    _FixParamEppColor + 5
#define _FixParamSppColor	    _FixParamBppColor + 5
#define _FixParamSppNegative    0
#define _FixParamBppNegative    _FixParamSppNegative + 3
#define _FixParamEppNegative    _FixParamBppNegative + 3
#define _FixParamSppPositive    _FixParamEppNegative + 3
#define _FixParamBppPositive    _FixParamSppPositive + 3
#define _FixParamEppPositive    _FixParamBppPositive + 3

/*
 * for DiffModeVar indexes
 */
#define _BwEpp150		    0
#define _BwEpp300		    1
#define _BwEpp600		    2
#define _BwBpp150		    _BwEpp150
#define _BwBpp300		    _BwEpp300
#define _BwBpp600		    _BwEpp600
#define _BwSpp150		    3
#define _BwSpp300		    4
#define _BwSpp600		    5
#define _GrayEpp150		    6
#define _GrayEpp300		    7
#define _GrayEpp600		    8
#define _GrayEpp600_3000	9	    /* > 3000 pixels per channel */
#define _GrayBpp150		    10
#define _GrayBpp300		    11
#define _GrayBpp300_1600	12
#define _GrayBpp600		    13
#define _GrayBpp600_1600	14
#define _GrayBpp600_3200	15
#define _GraySpp150		    16
#define _GraySpp150_800 	17
#define _GraySpp300		    18
#define _GraySpp300_800 	19
#define _GraySpp300_1600	20
#define _GraySpp600		    21
#define _GraySpp600_800 	22
#define _GraySpp600_1600	23
#define _GraySpp600_3200	24
#define _ColorEpp60		    25
#define _ColorEpp100		_ColorEpp60
#define _ColorEpp150		26
#define _ColorEpp300		27
#define _ColorEpp300_1200	28
#define _ColorEpp600		29
#define _ColorEpp600_1400	30
#define _ColorEpp600_2800	31
#define _ColorEpp600_4000	32
#define _ColorBpp60		    33
#define _ColorBpp100		34
#define _ColorBpp150		35
#define _ColorBpp150_800	36
#define _ColorBpp300		37
#define _ColorBpp300_800	38
#define _ColorBpp300_1600	39
#define _ColorBpp600		40
#define _ColorBpp600_800	41
#define _ColorBpp600_1600	42
#define _ColorBpp600_3200	43
#define _ColorSpp60		    _ColorBpp60
#define _ColorSpp100		_ColorBpp100
#define _ColorSpp150		_ColorBpp150
#define _ColorSpp150_800	_ColorBpp150_800
#define _ColorSpp300		44
#define _ColorSpp300_500	45
#define _ColorSpp300_1000	46
#define _ColorSpp300_2000	47
#define _ColorSpp600		48
#define _ColorSpp600_500	49
#define _ColorSpp600_1000	50
#define _ColorSpp600_2000	51
#define _ColorSpp600_4000	52

#define _NegativeSpp150 	53
#define _NegativeSpp300 	54
#define _NegativeSpp600 	55
#define _NegativeBpp150 	_NegativeSpp150
#define _NegativeBpp300 	_NegativeSpp300
#define _NegativeBpp600 	_NegativeSpp600
#define _NegativeEpp150 	_NegativeSpp150
#define _NegativeEpp300 	_NegativeSpp300
#define _NegativeEpp600 	_NegativeSpp600

#define _BwEpp75		    56
#define _BwBpp75		    56
#define _BwSpp75		    56
#define _GrayEpp75		    56
#define _GrayBpp75		    56
#define _GraySpp75		    56

#define _TransparencySpp150	_NegativeSpp150
#define _TransparencySpp300	_NegativeSpp300
#define _TransparencySpp600	_NegativeSpp600
#define _TransparencyBpp150	_NegativeSpp150
#define _TransparencyBpp300	_NegativeSpp300
#define _TransparencyBpp600	_NegativeSpp600
#define _TransparencyEpp150	_NegativeSpp150
#define _TransparencyEpp300	_NegativeSpp300
#define _TransparencyEpp600	_NegativeSpp600

/* for 48 bits color */
#define _ColorEpp100_1400	63
#define _ColorEpp150_1900	64
#define _ColorEpp300_4000	65
#define _ColorEpp600_9600	66
#define _ColorSpp300_3000	67

/*
 * for mirroring parts of the 98001/3 asic register set
 */
typedef struct {
    Byte	RD_Motor1Control;		/* 0x0b             	*/
    Byte	RD_StepControl; 		/* 0x14					*/
    Byte	RD_Motor0Control;		/* 0x15					*/
    Byte	RD_XStepTime;			/* 0x16					*/
    Byte	RD_ModeControl; 		/* 0x1b					*/
    Byte	RD_LineControl; 		/* 0x1c					*/
    Byte	RD_ScanControl; 		/* 0x1d, init = 5		*/
    Byte	RD_ModelControl;		/* 0x1f					*/
    Byte	RD_Model1Control;		/* 0x20					*/
    UShort	RD_Dpi; 			    /* 0x21					*/
    UShort	RD_Origin;			    /* 0x23					*/
    UShort	RD_Pixels;			    /* 0x25					*/
    UShort	RD_ThresholdControl;	/* 0x27					*/
    Byte	RD_ThresholdGapCtrl;	/* 0x29					*/
    UShort	RD_RedDarkOff;			/* 0x33					*/
    UShort	RD_GreenDarkOff;		/* 0x35					*/
    UShort	RD_BlueDarkOff; 		/* 0x37					*/

    ULong   RD_BufFullSize;         /* 0x54, ASIC 98003     */
    UShort  RD_MotorTotalSteps;     /* 0x57, ASIC 98003     */

    Byte    RD_ScanControl1;        /* 0x5b, ASIC 98003     */
    Byte    RD_MotorDriverType;     /* 0x64, ASIC 98003     */
    Byte    RD_ExtLineControl;      /* 0x6d, ASIC 98003     */
    Byte    RD_ExtXStepTime;        /* 0x6e, ASIC 98003     */

} RegData, *pRegData;

/*
 * for registers, that only exist on the 96001/3
 */
typedef struct
{
    Byte	RD_MotorControl;			/* 0x1b, init = 3		*/
    Byte	RD_MemAccessControl;		/* 0x1d					*/
    Byte	RD_WatchDogControl;			/* 0x25, init = 0x8f	*/

    union {
		Byte	RD_ModelControl2;		/* 0x26, P96003 		*/
    } u26;

	union {
		Byte	RD_RedChShadingOff;		/* 0x28, P96003			*/
    } u28;
    union {
		Byte	RD_GreenChShadingOff;	/* 0x29, P96003			*/
    } u29;
	Byte	RD_BlueChShadingOff;		/* 0x2a, P96003			*/
    Byte	RD_RedChDarkOff;			/* 0x2b, P96003			*/
    Byte	RD_GreenChDarkOff;			/* 0x2c, P96003			*/
    Byte	RD_BlueChDarkOff;			/* 0x2d, P96003			*/

    Byte	RD_RedChEvenOff;			/* 0x31, P96003			*/
    Byte	RD_GreenChEvenOff;			/* 0x32, P96003			*/
    Byte	RD_BlueChEvenOff;			/* 0x33, P96003			*/
    Byte	RD_RedChOddOff; 			/* 0x34, P96003			*/
    Byte	RD_GreenChOddOff;			/* 0x35, P96003			*/
    Byte	RD_BlueChOddOff;			/* 0x36, P96003			*/
    Byte	RD_RedGainOut;				/* 0x37, P96003			*/
    Byte	RD_GreenGainOut;			/* 0x38, P96003			*/
    Byte	RD_BlueGainOut; 			/* 0x39, P96003			*/
    Byte	RD_LedControl;				/* 0x3a, P96003			*/
    Byte	RD_ShadingCorrectCtrl;		/* 0x3b, P96003			*/

} Reg96, *pReg96;

/*
 * model override defines
 */
#define _OVR_NONE				0
#define _OVR_PLUSTEK_9630PL		1	/* for legal version of the OP9630	*/
#define _OVR_PRIMAX_4800D		2	/* for the Primax 4800 Direct		*/
#define _OVR_PLUSTEK_9636		3	/* for 9636T/P+/Turbo				*/
#define _OVR_PLUSTEK_9636P		4	/* for 9636P						*/
#define _OVR_PLUSTEK_A3I		5	/* for A3I  						*/
#define _OVR_PLUSTEK_4800P		6	/* for OpticPro4800					*/
#define _OVR_PRIMAX_4800D30		7	/* for the Primax 4800 Direct 30bit	*/

/* CHECK: THIS has to be changed and merged with the old code */

/*
 * structure to hold IO port specific stuff
 */
typedef struct {
	UShort portBase;
	UShort portMode;
	UShort lastPortMode;

	Byte   bOldControlValue;
	Byte   bOldDataValue;
	Byte   bOpenCount;
	Byte   delay;           /* to allow various delay on port operations    */

	Bool   slowIO;
	UShort forceMode;
	Bool   useEPPCmdMode;

} IODef, *pIODef;


/*
 * structure to hold device specific stuff
 */
typedef struct
{
#if 0
    PFNVOID			pfnIOWrite;
    PFNVOID			pfnCCDInit;
    DWORD			dwLampOnTicks;
    DWORD			dwLampOnBegin;
    LONG			lLeftPositive;
    LONG			lLeftNegative;
    UCHAR			bLampOnMinutes;
    DRVBOOL			fButton;
    DRVBOOL			fSoftReset;
    UCHAR			bStatusLamp;
#endif

	pFnReadData     ReadData;       /* read function, portmode specific */

    ULong   		dwModelOriginY;
    Bool			f0_8_16;
    Bool            fTpa;           /* transparency adapter ?           */
    Bool			f2003;          /* has 2003 motor driver ?          */

    UChar			bMotorID;       /* the type of the motor drivers    */
    UChar			bPCBID;         /* which version of the PCB         */

    UChar			bCCDID;         /* what CCD do we have              */
    pRegDef         pCCDRegisters;  /* pointer to the register descr    */
    UShort			wNumCCDRegs;    /* number of values to write        */
    UShort   		DataOriginX;

    UChar   		bDACType;       /* what DAC do we have              */
    pRegDef			pDACRegisters;  /* pointer to DAC reg descr.        */
    UShort			wNumDACRegs;    /* number of values to write        */
    pFnDACOffs		fnDarkOffset;   /* func-ptr to func for DAC         */
    pFnDACDark		fnDACDark;      /* adjustments                      */

    RGBByteDef		RegDACOffset;
    RGBByteDef		RegDACGain;

    UChar			buttons;        /* Number of buttons                */

    UChar			ModelCtrl;      /* contents of the model control reg*/
    UChar			Model1Mono;     /* for model control 1 in mono mode */
    UChar			Model1Color;    /* for model control 1 in color mode*/

    UChar			XStepMono;
    UChar			XStepColor;
    UChar			XStepBack;

    long			lUpNormal;      /* device specific offsets */
    long			lUpPositive;
    long			lUpNegative;
    long			lLeftNormal;

} DeviceDef, *pDeviceDef;

/*
 * to hold all the shading stuff for calibrating a scanner
 */
typedef struct
{
    pRGBUShortDef	pHilight;
    ColorByte		Hilight;
    ULong   		dwDiv;
    UShort			wExposure;
    UShort  		wXStep;

    UChar			skipHilight;
    UChar			skipShadow;
    ULong			shadingBytes;

    pDACTblDef		pCcdDac;
    ColorByte		DarkDAC;
    ColorWord		DarkOffset;
    UShort			wDarkLevels;
    UChar			bIntermediate;

    ColorByte		Gain;
    UChar			bGainDouble;
    UChar			bUniGain;
    Byte			bMinGain;
    Byte			bMaxGain;
    Byte			bGainHigh;
    Byte			bGainLow;

    Bool			fStop;

} ShadingDef, *pShadingDef;


/*
 * structure to hold scan-specific data
 */
typedef struct _SCANDEF
{
#if 0
    DWORD			dwLinesRead;
    LONG			lBufAdjust;
    DRVBOOL			fBackmove;
    DRVBOOL			fEsc;
    UCHAR			Reserved;
#endif

    pFnBool			DoSample;
    pFnDataProcess	DataProcess;    /* to convert RGB buffers to RGB pixels */
    pFnBool			DataRead;       /* function to get data from scanner    */

    ULong			dwLinesToRead;  /* number of images lines to read       */
    Long	    	lBufferAdjust;

    ULong			dwScanOrigin;   /* where to start the scan              */
    Bool			fRefreshState;  /* refresh ?                            */
    Bool			fMotorBackward;
    UChar			motorPower;     /* how to drive the motor               */

    ULong			dwMinReadFifo;
    ULong			dwMaxReadFifo;
    Byte            bFifoSelect;    /* defines which FIFO to use            */

    UChar			bDiscardAll;
    ULong			dwInterval;
    ULong			dwInterlace;    /* CHECK: here always 0 - remove ?     */

    union {
        UShort		wGreenDiscard;
        UShort  	wGreenKeep;
    } gd_gk;
    union {
        UShort		wBlueDiscard;
        UShort  	wRedKeep;
    } bd_rk;

    UChar			bRefresh;       /* for controlling the movement         */
    UChar			bOldScanState;
    UChar   		bNowScanState;
    UChar			bModuleState;

    DataPointer 	p48BitBuf;      /* for handling 48-bit data             */
    union {
        pUChar  	pMonoBuf;
        DataPointer ColorBuf;
    } bp;

    RBGPtrDef       BufBegin;       /* for reading/writing the scan-data    */
    RBGPtrDef       BufEnd;
    RBGPtrDef       BufGet;
    RBGPtrDef       BufData;
    RBGPtrDef       BufPut;

    ULong           negBegin;       /* used while scanning in TPA modes     */
    ULong           posBegin;

    ULong           dpiIdx;         /* index to get/set values in the table */
    pExtXStepDef    negScan;        /* reference to exposure/xtep table     */

} ScanDef, *pScanDef;

/*
 * structure to hold buffer pointers
 */
typedef struct {

    union {
    	pUChar		pReadBuf;
    	pUChar		pShadingMap;
    	pUChar		pRWTestBuffer;
    	pUShort		pShadingRam;
    	DataPointer	Buf;
    } b1;

    union {
        pUChar        pSumBuf;
	    pRGBUShortDef pSumRGB;
	    pUChar		  pRWTestBuffer1;
    } b2;
    DataPointer TpaBuf;

} BufferDef, *pBufferDef;


/* Register RegBitDepth (Addr: 0x13) - ASIC 9800x */
#define _BIT0_7		            0x00
#define _BIT8_15		        0x01
#define _BIT16_20	    	    0x02

/* Register RegStepControl (Addr: 0x14) - ASIC 9800x */
#define _MOTOR0_ONESTEP	        0x01
#define _MOTOR0_SCANSTATE	    0x02
#define _MOTOR_FREERUN          0x40
#define _MOTOR_NOFREERUN        0x00

/* Register RegGetScanState (Addr: 0x17, 0x12 on 9600x) - ASIC 9800x */
#define _SCANSTATE_MASK         0x3f	/* bit 0-5 */
#define _SCANSTATE_STOP	        0x80

/* Register RegReadIOBufBus (Addr: 0x17) - ASIC 9600x only */
#define _IOBUF_BUSMASK	        0x0f	/* bit 0-3 */

/* Register RegMemoryLow/High (Addr: 0x19/0x1a) - ASIC 9800x */
#define _MAP_ADDR_RED           0x00
#define _MAP_ADDR_GREEN	        0x40
#define _MAP_ADDR_BLUE	        0x80
#define _MAP_ADDR_SIZE	        0x40	/* 0x4000 */

/* Register RegModeControl (Addr: 0x1b, 0x18 on 9600x) - all ASICs*/
#define _ModeScan		        0x00    /* all ASICs       */
#define _ModeProgram	        0x01    /* 9600x def       */
#define _ModeIdle		        0x01    /* 9800x defs      */
#define _ModeShadingMem	        0x02
#define _ModeMappingMem	        0x03
#define _ModeReadMappingMem     0x07
#define _ModeFifoRSel	        0x00
#define _ModeFifoGSel	        0x08
#define _ModeFifoBSel	        0x10
#define _ModeFifoClose          0x18

/* Register RegLineControl (Addr: 0x1c, 0x19 on 9600x) - all ASICs*/
#define _LINE_SCANTIME_MASK     0x3f	/* bit 0-6              */
#define _LINE_CDSINVERSE        0x80	/* Color Drive Signal   */

/* Register RegScanControl (Addr: 0x1d) - all ASICs*/
#define _SCAN_BITMODE	        0x00
#define _SCAN_BYTEMODE	        0x01	/* Gray/Color mode                  */
#define _SCAN_1ST_AVERAGE	    0x04	/* first pixel is averaged pixel    */
#define _SCAN_BITDIRR2L         0x08	/* bit shift from right to left     */

/* ASIC 9600x section */
#define _P96_SCANDATA_INVERT    0x02
#define _SCAN_LAMP_ON 	        0x10

/* ASIC 9800x section */
#define _SCAN_12BITMODE         0x02
#define _SCAN_NORMALLAMP_ON     0x10    /* normal Lamp  */
#define _SCAN_TPALAMP_ON        0x20
#define _P98_SCANDATA_INVERT    0x40
#define _BITALIGN_LEFT	        0x80

#define _SCAN_LAMPS_ON          (_SCAN_NORMALLAMP_ON | _SCAN_TPALAMP_ON)

/* Register RegMotor0Control (Addr: 0x15) */
#define _MotorDirForward	    0x01
#define _MotorDirBackward	    0x00
#define _MotorOn		        0x02
#define _MotorHFullStepH	    0x00
#define _MotorHHalfStep	        0x04
#define _MotorHQuarterStep	    0x08
#define _MotorHEightStep	    0x08	/* for 2916 driver      */
#define _MotorPowerEnable	    0x40    /* ASIC 98003 specific  */
#define _MotorHHomeStop	        0x80

#define _FORWARD_MOTOR			(_MotorDirForward + _MotorOn + \
               					 _MotorHQuarterStep + _MotorPowerEnable)

/* Register RegConfiguration (Addr: 0x1e), ASIC 9800x */
#define	_P98_CCD_TYPE_ID	    0x07
#define	_P98_NEC_MACHINE        0x08
#define _P98_PCBID		        0xF0

#define _CCD_3797		        0
#define _CCD_3717		        1
#define _CCD_3799	            1   /* new for 98003     */
#define _CCD_535		        2
#define _CCD_2556		        3
#define _CCD_518		        4
#define _CCD_539		        5	/* default for 98001 */
#define _CCD_3777	            6   /* new for 98003     */
#define _CCD_548 	            7   /* new for 98003     */

/* ASIC 98003 section */
#define _OPTICWORKS2000         0x00
#define _PLUSTEK_SCANNER        0x10
#define _SCANNER_WITH_TPA       0x20
#define _SCANNER4Button         0x30
#define _SCANNER4ButtonTPA      0x40
#define _SCANNER5Button         0x50
#define _SCANNER5ButtonTPA      0x60
#define _SCANNER1Button         0x70
#define _SCANNER1ButtonTPA      0x80
#define _SCANNER2Button         0x90
#define _AGFA_SCANNER	        0xf0
#define _AGFA_PCB   	        0x1f

/* Register RegModelControl (Addr: 0x1f), all ASICs */
#define _ModelSampleAndHold     0x01	/* sample and hold              */
#define _ModelWhiteIs0	        0x02	/* white is 0                   */
#define _ModelInvertPF	        0x04	/* invert paper flag            */
#define _ModelDpi200	           0	/* (400 / 2)                    */
#define _ModelDpi300	        0x08	/* (600 / 2)                    */
#define _ModelDpi400	        0x10	/* (800 / 2)                    */
#define _ModelDpi600	        0x18	/* (1200 / 2)                   */
#define _ModelMemSize32k3	       0	/* 32k for 300 dpi color        */
#define _ModelMemSize64k3	    0x20	/* 64k for 300 dpi color        */
#define _ModelMemSize128k3	    0x40	/* 128k for 300 dpi color       */
#define _ModelMemSize64k4	    0x60	/* 64k for 400/600 dpi color    */
#define _ModelMemSize128k4	    0x80	/* 128k for 400/600 dpi color   */

#define _ModelMemSize8k	           0    /* for 96001 */
#define _ModelMemSize8k3	    0x20
#define _ModelMemSize32k96001   0x40
#define _ModelMemSize128k396001 0x60
#define _ModelMemSize128k696001 0x80

#define _HOME_SENSOR_POLARITY   0x01    /* 9800x */
#define _LED_CONTROL 	        0x02
#define _LED_ACTIVITY	        0x04
#define _MODEL_DPI800	        0x20
#define _MODEL_DPI1200	        0x28
#define _DUMMY_12BIT 	        0x40

/* Register RegModel1Control (Addr: 0x20), 9800x */
#define _SCAN_GRAYTYPE	        0x01
#define _CCD_SHIFT_GATE 	    0x02
#define _CCD_SHIFT_PULSE	    0x04
#define _BUTTON_MODE     	    0x08
#define _MOTOR_2003		        0x00
#define _MOTOR_2916		        0x10
#define _MOTOR_7042		        0x20

/* Register RegThresholdGapControl (Addr: 0x29, 0x27 on 9600x ) - all ASICs */
#define _THRESHOLDGAP_MASK      0x0f

/* Register RegResetConfig (Addr: 0x2e) */
#define _ADC_MASK		        0x07
#define _DA_WOLFSON8143	        0x00
#define _DA_ESIC 	            0x04
#define _DA_SAMSUNG8531	        0x05
#define _DA_WOLFSON8141	        0x06
#define _DA_SAMSUNG1224	        0x07
#define _MOTOR0_MASK 	        0x18
#define _MOTOR0_2003	        0x00
#define _MOTOR0_2916	        0x08
#define _MOTOR0_7042	        0x10
#define _MOTOR1_MASK 	        0x60
#define _MOTOR1_2003	        0x00
#define _MOTOR1_2916	        0x20
#define _MOTOR1_7042	        0x40

/* Register RegFifoFullLength (Addr: 0x54) */
#define _RED_FULLSIZE	        0x00
#define _GREEN_FULLSIZE         0x08
#define _BLUE_FULLSIZE	        0x10

/* Register RegScanControl1	(Addr: 0x5b) */
#define _MTSC_ENABLE 	        0x01
#define _SCANSTOPONBUFFULL      0x02
#define _MFRC_RUNSCANSTATE      0x04
#define _MFRC_BY_XSTEP	        0x08

/* Register RegMotorDriverType (Addr: 0x64) */
#define _MOTORS_MASK 	        0x33
#define _MOTORR_MASK	        0xf3
#define _MOTORR_WEAK	        0x04
#define _MOTORR_MEDIUM	        0x08
#define _MOTORR_STRONG	        0x0c
#define _MOTORT_WEAK	        0x40
#define _MOTORT_MEDIUM	        0x80
#define _MOTORT_STRONG	        0xc0
#define _BUTTON_SELECT1	        0x40
#define _BUTTON_SELECT2	        0x80
#define _BUTTON_DISABLE	        0xc0

/* Register RegStatus2	(Addr: 0x66) */
#define _REFLECTIONLAMP_ON      0x01
#define _TPALAMP_ON 	        0x02
#define _STILL_FREE_RUNNING     0x04
#define _BUFFER_IS_FULL	        0x08

/* Register RegTestMode	(Addr: 0xf0) */
#define _SW_TESTMODE	        0x20

/* other stuff... */

/* CHECK: changes this stuff... */
#define _BytesPerChannel	    5500UL
#define _SizeDataBuf		(ULong)(_BytesPerChannel * 3 * 2)
#define _SizeTpaDataBuf 	(ULong)(_BytesPerChannel * 3 * 2)
#define _SizeShadingSumBuf	(ULong)(_BytesPerChannel * 3 * 4)
#define _SizeTotalBuf		(ULong)(_SizeDataBuf + _SizeShadingSumBuf)
#define _SizeTotalBufTpa	(ULong)(_SizeTotalBuf + _SizeTpaDataBuf)

/* for DAC programming (ASIC 98003)*/
#define _VALUE_CONFIG		    0x51
#define _DAC_RED 	    	    (Byte)(_VALUE_CONFIG | 0x00)
#define _DAC_GREENCOLOR		    (Byte)(_VALUE_CONFIG | 0x04)
#define _DAC_GREENMONO		    (Byte)(_VALUE_CONFIG | 0x06)
#define _DAC_BLUE   		    (Byte)(_VALUE_CONFIG | 0x08)

/* internal FIFO buffers (ASIC 9800x) */
#define _SIZE_REDFIFO		    196608UL	/* 192k */
#define _SIZE_GREENFIFO		    147456UL	/* 144k */
#define _SIZE_BLUEFIFO		    114688UL	/* 112k */

#define _SIZE_COLORFIFO	        _SIZE_BLUEFIFO
#define _SIZE_GRAYFIFO	    (_SIZE_REDFIFO + _SIZE_GREENFIFO + _SIZE_BLUEFIFO)

/* Scan State Definitions */
#define _SS_STEP		        0x08
#define _SS_RED 		        0x04
#define _SS_GREEN		        0x02
#define _SS_BLUE		        0x01

#define _SS_MONO		        _SS_GREEN
#define _SS_COLOR		        (_SS_RED | _SS_GREEN | _SS_BLUE)

/* for shading */
#define _CHANNEL_RED	        0
#define _CHANNEL_GREEN	        1
#define _CHANNEL_BLUE	        2

#endif	/* guard __HWDEFS_H__ */

/* END PLUSTEK-PP_HWDEFS.H ..................................................*/