1/* @file plustek-pp_p12ccd.c
2 * @brief here we have the whole code to initialize the CCD and DAC stuff
3 *
4 * based on sources acquired from Plustek Inc.
5 * Copyright (C) 2000 Plustek Inc.
6 * Copyright (C) 2001-2004 Gerhard Jaeger <gerhard@gjaeger.de>
7 *
8 * History:
9 * - 0.38 - initial version
10 * - 0.39 - using now fnDarkOffsetWolfson3797 instead of fnDarkOffsetWolfson3799
11 *          This should provide a better picture quality on the GENIUS Colorpage
12 *          Vivid V2
13 * - 0.40 - no changes
14 * - 0.41 - no changes
15 * - 0.42 - changed include names
16 * - 0.43 - no changes
17 * .
18 * <hr>
19 * This file is part of the SANE package.
20 *
21 * This program is free software; you can redistribute it and/or
22 * modify it under the terms of the GNU General Public License as
23 * published by the Free Software Foundation; either version 2 of the
24 * License, or (at your option) any later version.
25 *
26 * This program is distributed in the hope that it will be useful, but
27 * WITHOUT ANY WARRANTY; without even the implied warranty of
28 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
29 * General Public License for more details.
30 *
31 * You should have received a copy of the GNU General Public License
32 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
33 *
34 * As a special exception, the authors of SANE give permission for
35 * additional uses of the libraries contained in this release of SANE.
36 *
37 * The exception is that, if you link a SANE library with other files
38 * to produce an executable, this does not by itself cause the
39 * resulting executable to be covered by the GNU General Public
40 * License.  Your use of that executable is in no way restricted on
41 * account of linking the SANE library code into it.
42 *
43 * This exception does not, however, invalidate any other reasons why
44 * the executable file might be covered by the GNU General Public
45 * License.
46 *
47 * If you submit changes to SANE to the maintainers to be included in
48 * a subsequent release, you agree by submitting the changes that
49 * those changes may be distributed with this exception intact.
50 *
51 * If you write modifications of your own for SANE, it is your choice
52 * whether to permit this exception to apply to your modifications.
53 * If you do not wish that, delete this exception notice.
54 * <hr>
55 */
56#include "plustek-pp_scan.h"
57
58/*************************** some definitions ********************************/
59
60#define _REFLECTION     0
61#define _TRANSPARENCY   1
62#define _NEGATIVE       2
63
64#define _NUM_OF_CCDREGS_W8143    25
65#define _NUM_OF_DACREGS_W8143    10
66
67#define _NUM_OF_CCDREGS_S1224    29
68#define _NUM_OF_DACREGS_S1224    7
69
70#define _NUM_OF_CCDREGS_S8531    29
71#define _NUM_OF_DACREGS_S8531    9
72
73#define _NUM_OF_CCDREGS_Max	    _NUM_OF_CCDREGS_S1224
74#define _NUM_OF_DACREGS_Max	    _NUM_OF_DACREGS_W8143
75
76
77/*************************** some local vars *********************************/
78
79static pFnVoid p12ccdInitFunc = NULL;
80
81static RegDef W3797CCDParams[4][_NUM_OF_CCDREGS_W8143] = {
82    {
83        {0x2c, 0x02}, {0x39, 0x2a}, {0x3a, 0x0a}, {0x3b, 0x37},
84        {0x3c, 0x16}, {0x41, 0x0e}, {0x42, 0x90}, {0x43, 0x01},
85        {0x44, 0x27}, {0x45, 0x27}, {0x46, 0x01}, {0x47, 0x03},
86        {0x48, 0x27}, {0x49, 0x2f}, {0x4a, 0x09}, {0x4b, 0x03},
87        {0x4c, 0x07}, {0x4d, 0x06}, {0x4e, 0x06}, {0x67, 0x00},
88        {0x50, 0x08}, {0x51, 0x0e}, {0x52, 0x0c}, {0x53, 0x0b},
89        {0xf0, 0x00}
90    }, {
91        {0x2c, 0x02}, {0x39, 0x3d}, {0x3a, 0x04}, {0x3b, 0x46},
92        {0x3c, 0x06}, {0x41, 0x1f}, {0x42, 0x8c}, {0x43, 0x01},
93        {0x44, 0x13}, {0x45, 0x13}, {0x46, 0xf2}, {0x47, 0x02},
94        {0x48, 0x13}, {0x49, 0x13}, {0x4a, 0xfa}, {0x4b, 0x00},
95        {0x4c, 0x07}, {0x4d, 0x05}, {0x4e, 0x0e}, {0x67, 0x00},
96        {0x50, 0x01}, {0x51, 0x06}, {0x52, 0x09}, {0x53, 0x0b},
97        {0xf0, 0x00}
98    }, {
99        {0x2c, 0x00}, {0x39, 0x16}, {0x3a, 0x03}, {0x3b, 0x1f},
100        {0x3c, 0x07}, {0x41, 0x04}, {0x42, 0x1e}, {0x43, 0x01},
101        {0x44, 0x13}, {0x45, 0x13}, {0x46, 0xf1}, {0x47, 0x02},
102        {0x48, 0x13}, {0x49, 0x13}, {0x4a, 0xf9}, {0x4b, 0x04},
103        {0x4c, 0x07}, {0x4d, 0x05}, {0x4e, 0x03}, {0x67, 0x00},
104        {0x50, 0x06}, {0x51, 0x03}, {0x52, 0x09}, {0x53, 0x0b},
105        {0xf0, 0x00}
106    }, {
107        {0x2c, 0x02}, {0x39, 0x18}, {0x3a, 0x04}, {0x3b, 0x1d},
108        {0x3c, 0x03}, {0x41, 0x0c}, {0x42, 0x84}, {0x43, 0x03},
109        {0x44, 0x0a}, {0x45, 0x08}, {0x46, 0xfa}, {0x47, 0x04},
110        {0x48, 0x0a}, {0x49, 0x08}, {0x4a, 0xf2}, {0x4b, 0x02},
111        {0x4c, 0x03}, {0x4d, 0x02}, {0x4e, 0x0e}, {0x67, 0x00},
112        {0x50, 0x00}, {0x51, 0x09}, {0x52, 0x03}, {0x53, 0x03},
113        {0xf0, 0x00}
114    }
115};
116
117static RegDef W3799CCDParams[4][_NUM_OF_CCDREGS_W8143] = {
118    {
119        {0x2c, 0x02}, {0x39, 0x2c}, {0x3a, 0x05}, {0x3b, 0x3c},
120        {0x3c, 0x0e}, {0x41, 0x0e}, {0x42, 0x90}, {0x43, 0x01},
121        {0x44, 0x27}, {0x45, 0x27}, {0x46, 0x01}, {0x47, 0x02},
122        {0x48, 0x27}, {0x49, 0x2f}, {0x4a, 0x09}, {0x4b, 0x05},
123        {0x4c, 0x07}, {0x4d, 0x05}, {0x4e, 0x06}, {0x67, 0x00},
124        {0x50, 0x08}, {0x51, 0x0d}, {0x52, 0x0c}, {0x53, 0x0b},
125        {0xf0, 0x00}
126    }, {
127        {0x2c, 0x02}, {0x39, 0x3d}, {0x3a, 0x04}, {0x3b, 0x46},
128        {0x3c, 0x06}, {0x41, 0x1f}, {0x42, 0x8c}, {0x43, 0x01},
129        {0x44, 0x13}, {0x45, 0x13}, {0x46, 0xf2}, {0x47, 0x01},
130        {0x48, 0x13}, {0x49, 0x13}, {0x4a, 0xfa}, {0x4b, 0x00},
131        {0x4c, 0x07}, {0x4d, 0x05}, {0x4e, 0x0e}, {0x67, 0x00},
132        {0x50, 0x01}, {0x51, 0x06}, {0x52, 0x12}, {0x53, 0x0b},
133        {0xf0, 0x00}
134    }, {
135        {0x2c, 0x00}, {0x39, 0x16}, {0x3a, 0x02}, {0x3b, 0x1a},
136        {0x3c, 0x05}, {0x41, 0x04}, {0x42, 0x1e}, {0x43, 0x01},
137        {0x44, 0x13}, {0x45, 0x13}, {0x46, 0xf1}, {0x47, 0x01},
138        {0x48, 0x13}, {0x49, 0x13}, {0x4a, 0xf9}, {0x4b, 0x04},
139        {0x4c, 0x07}, {0x4d, 0x05}, {0x4e, 0x03}, {0x67, 0x00},
140        {0x50, 0x06}, {0x51, 0x03}, {0x52, 0x09}, {0x53, 0x0b},
141        {0xf0, 0x00}
142    }, {
143        {0x2c, 0x02}, {0x39, 0x18}, {0x3a, 0x04}, {0x3b, 0x1d},
144        {0x3c, 0x03}, {0x41, 0x0c}, {0x42, 0x84}, {0x43, 0x03},
145        {0x44, 0x0a}, {0x45, 0x08}, {0x46, 0xfa}, {0x47, 0x03},
146        {0x48, 0x0a}, {0x49, 0x08}, {0x4a, 0xf2}, {0x4b, 0x02},
147        {0x4c, 0x03}, {0x4d, 0x02}, {0x4e, 0x0e}, {0x67, 0x00},
148        {0x50, 0x00}, {0x51, 0x09}, {0x52, 0x03}, {0x53, 0x03},
149        {0xf0, 0x00}
150    }
151};
152
153/* Genius ColorPage Vivid III */
154static RegDef W548CCDParams[4][_NUM_OF_CCDREGS_W8143] = {
155    {
156        {0x2c, 0x02}, {0x39, 0x2c}, {0x3a, 0x05}, {0x3b, 0x3c},
157        {0x3c, 0x0e}, {0x41, 0x0e}, {0x42, 0x90}, {0x43, 0x01},
158        {0x44, 0x27}, {0x45, 0x27}, {0x46, 0x01}, {0x47, 0x02},
159        {0x48, 0x27}, {0x49, 0x2f}, {0x4a, 0x09}, {0x4b, 0x05},
160        {0x4c, 0x07}, {0x4d, 0x05}, {0x4e, 0x06}, {0x67, 0x00},
161        {0x50, 0x08}, {0x51, 0x0d}, {0x52, 0x0c}, {0x53, 0x0b},
162        {0xf0, 0x00}
163    }, {
164        {0x2c, 0x02}, {0x39, 0x3d}, {0x3a, 0x04}, {0x3b, 0x46},
165        {0x3c, 0x06}, {0x41, 0x1f}, {0x42, 0x8c}, {0x43, 0x01},
166        {0x44, 0x13}, {0x45, 0x13}, {0x46, 0xf2}, {0x47, 0x01},
167        {0x48, 0x13}, {0x49, 0x13}, {0x4a, 0xfa}, {0x4b, 0x00},
168        {0x4c, 0x07}, {0x4d, 0x05}, {0x4e, 0x0e}, {0x67, 0x00},
169        {0x50, 0x01}, {0x51, 0x06}, {0x52, 0x12}, {0x53, 0x0b},
170        {0xf0, 0x00}
171    }, {
172        {0x2c, 0x00}, {0x39, 0x16}, {0x3a, 0x02}, {0x3b, 0x1a},
173        {0x3c, 0x05}, {0x41, 0x04}, {0x42, 0x1e}, {0x43, 0x01},
174        {0x44, 0x13}, {0x45, 0x13}, {0x46, 0xf1}, {0x47, 0x01},
175        {0x48, 0x13}, {0x49, 0x13}, {0x4a, 0xf9}, {0x4b, 0x04},
176        {0x4c, 0x07}, {0x4d, 0x05}, {0x4e, 0x03}, {0x67, 0x00},
177        {0x50, 0x06}, {0x51, 0x03}, {0x52, 0x09}, {0x53, 0x0b},
178        {0xf0, 0x00}
179    }, {
180        {0x2c, 0x02}, {0x39, 0x18}, {0x3a, 0x04}, {0x3b, 0x1d},
181        {0x3c, 0x03}, {0x41, 0x0c}, {0x42, 0x84}, {0x43, 0x03},
182        {0x44, 0x0a}, {0x45, 0x08}, {0x46, 0xfa}, {0x47, 0x03},
183        {0x48, 0x0a}, {0x49, 0x08}, {0x4a, 0xf2}, {0x4b, 0x02},
184        {0x4c, 0x03}, {0x4d, 0x02}, {0x4e, 0x0e}, {0x67, 0x00},
185        {0x50, 0x00}, {0x51, 0x09}, {0x52, 0x03}, {0x53, 0x03},
186        {0xf0, 0x00}
187    }
188};
189
190static RegDef S3797CCDParams[4][_NUM_OF_CCDREGS_S1224] = {
191    {
192        {0x2c, 0x00}, {0x39, 0x2a}, {0x3a, 0x0a}, {0x3b, 0x37},
193        {0x3c, 0x16}, {0x41, 0x2c}, {0x42, 0x9f}, {0x43, 0x01},
194        {0x44, 0x27}, {0x45, 0x27}, {0x46, 0x01}, {0x47, 0x03},
195        {0x48, 0x27}, {0x49, 0x27}, {0x4a, 0x09}, {0x4b, 0x0b},
196        {0x4c, 0x06}, {0x4d, 0x06}, {0x4e, 0x0b}, {0x50, 0x13},
197        {0x51, 0x06}, {0x52, 0x06}, {0x53, 0x0b}, {0x67, 0x00},
198        {0x6f, 0x20}, {0x70, 0x06}, {0x60, 0x07}, {0x61, 0x9f},
199        {0x65, 0x01}
200    }, {
201        {0x2c, 0x00}, {0x39, 0x3d}, {0x3a, 0x06}, {0x3b, 0x46},
202        {0x3c, 0x06}, {0x41, 0x3d}, {0x42, 0x92}, {0x43, 0x01},
203        {0x44, 0x13}, {0x45, 0x13}, {0x46, 0xf2}, {0x47, 0x02},
204        {0x48, 0x13}, {0x49, 0x13}, {0x4a, 0xfa}, {0x4b, 0x1b},
205        {0x4c, 0x06}, {0x4d, 0x06}, {0x4e, 0x0b}, {0x50, 0x23},
206        {0x51, 0x06}, {0x52, 0x06}, {0x53, 0x0b}, {0x67, 0x00},
207        {0x6f, 0x30}, {0x70, 0x06}, {0x60, 0x17}, {0x61, 0x9f},
208        {0x65, 0x01}
209    }, {
210        {0x2c, 0x02}, {0x39, 0x16}, {0x3a, 0x03}, {0x3b, 0x1f},
211        {0x3c, 0x07}, {0x41, 0x1c}, {0x42, 0x99}, {0x43, 0x01},
212        {0x44, 0x13}, {0x45, 0x13}, {0x46, 0xf1}, {0x47, 0x02},
213        {0x48, 0x13}, {0x49, 0x13}, {0x4a, 0xfa}, {0x4b, 0x09},
214        {0x4c, 0x13}, {0x4d, 0x14}, {0x4e, 0x09}, {0x50, 0x09},
215        {0x51, 0x14}, {0x52, 0x13}, {0x53, 0x01}, {0x67, 0x00},
216        {0x6f, 0xff}, {0x70, 0x7f}, {0x60, 0x04}, {0x61, 0x8f},
217        {0x65, 0x01}
218    }, {
219        {0x2c, 0x02}, {0x39, 0x16}, {0x3a, 0x03}, {0x3b, 0x1f},
220        {0x3c, 0x07}, {0x41, 0x1c}, {0x42, 0x99}, {0x43, 0x01},
221        {0x44, 0x13}, {0x45, 0x13}, {0x46, 0xf1}, {0x47, 0x02},
222        {0x48, 0x13}, {0x49, 0x13}, {0x4a, 0xfa}, {0x4b, 0x09},
223        {0x4c, 0x13}, {0x4d, 0x14}, {0x4e, 0x09}, {0x50, 0x09},
224        {0x51, 0x14}, {0x52, 0x13}, {0x53, 0x01}, {0x67, 0x00},
225        {0x6f, 0xff}, {0x70, 0x7f}, {0x60, 0x04}, {0x61, 0x8f},
226        {0x65, 0x01}
227    }
228};
229
230static RegDef S3799CCDParams[4][_NUM_OF_CCDREGS_S1224] = {
231    {
232        {0x2c, 0x00}, {0x39, 0x2a}, {0x3a, 0x0a}, {0x3b, 0x37},
233        {0x3c, 0x16}, {0x41, 0x2c}, {0x42, 0x8f}, {0x43, 0x01},
234	    {0x44, 0x27}, {0x45, 0x27}, {0x46, 0x01}, {0x47, 0x01},
235	    {0x48, 0x27}, {0x49, 0x27}, {0x4a, 0x09}, {0x4b, 0x0b},
236	    {0x4c, 0x06}, {0x4d, 0x06}, {0x4e, 0x0b}, {0x50, 0x13},
237	    {0x51, 0x06}, {0x52, 0x06}, {0x53, 0x0b}, {0x67, 0x00},
238	    {0x6f, 0x20}, {0x70, 0x06}, {0x60, 0x07}, {0x61, 0x9f},
239	    {0x65, 0x01}
240    }, {
241        {0x2c, 0x00}, {0x39, 0x3d}, {0x3a, 0x06}, {0x3b, 0x46},
242	    {0x3c, 0x06}, {0x41, 0x3d}, {0x42, 0x92}, {0x43, 0x01},
243	    {0x44, 0x13}, {0x45, 0x13}, {0x46, 0xf2}, {0x47, 0x01},
244	    {0x48, 0x13}, {0x49, 0x13}, {0x4a, 0xfa}, {0x4b, 0x1b},
245	    {0x4c, 0x06}, {0x4d, 0x06}, {0x4e, 0x0b}, {0x50, 0x23},
246	    {0x51, 0x06}, {0x52, 0x06}, {0x53, 0x0b}, {0x67, 0x00},
247	    {0x6f, 0x30}, {0x70, 0x06}, {0x60, 0x17}, {0x61, 0x9f},
248	    {0x65, 0x01}
249    }, {
250        {0x2c, 0x02}, {0x39, 0x16}, {0x3a, 0x03}, {0x3b, 0x1f},
251	    {0x3c, 0x07}, {0x41, 0x1c}, {0x42, 0x99}, {0x43, 0x01},
252	    {0x44, 0x13}, {0x45, 0x13}, {0x46, 0xf1}, {0x47, 0x01},
253	    {0x48, 0x13}, {0x49, 0x13}, {0x4a, 0xfa}, {0x4b, 0x09},
254	    {0x4c, 0x13}, {0x4d, 0x14}, {0x4e, 0x09}, {0x50, 0x09},
255	    {0x51, 0x14}, {0x52, 0x13}, {0x53, 0x01}, {0x67, 0x00},
256	    {0x6f, 0xff}, {0x70, 0x7f}, {0x60, 0x04}, {0x61, 0x8f},
257	    {0x65, 0x01}
258    }, {
259        {0x2c, 0x00}, {0x39, 0x16}, {0x3a, 0x03}, {0x3b, 0x1f},
260	    {0x3c, 0x07}, {0x41, 0x1c}, {0x42, 0x99}, {0x43, 0x03},
261	    {0x44, 0x0a}, {0x45, 0x08}, {0x46, 0xfa}, {0x47, 0x03},
262	    {0x48, 0x0a}, {0x49, 0x08}, {0x4a, 0xf2}, {0x4b, 0x02},
263	    {0x4c, 0x03}, {0x4d, 0x02}, {0x4e, 0x0e}, {0x50, 0x00},
264	    {0x51, 0x09}, {0x52, 0x03}, {0x53, 0x03}, {0x67, 0x00},
265	    {0x6f, 0xff}, {0x70, 0x7f}, {0x60, 0x04}, {0x61, 0x8f},
266	    {0x65, 0x01}
267    }
268};
269
270static RegDef WolfsonDAC8143[_NUM_OF_DACREGS_W8143] = {
271    {0x01, 0x01}, {0x02, 0x04}, {0x03, 0x42}, {0x05, 0x10}, {0x20, 0xd0},
272    {0x21, 0xd0}, {0x22, 0xd0}, {0x24, 0x00}, {0x25, 0x00},	{0x26, 0x00}
273};
274
275static RegDef SamsungDAC8531[_NUM_OF_DACREGS_S8531] = {
276    {0x00, 0x51}, {0x02, 0x01}, {0x01, 0x80},
277    {0x00, 0x55}, {0x02, 0x01}, {0x01, 0x80},
278    {0x00, 0x59}, {0x02, 0x01}, {0x01, 0x80}
279};
280
281static RegDef SamsungDAC1224[_NUM_OF_DACREGS_S1224] ={
282    {0x00, 0x00}, {0x01, 0x80}, {0x02, 0x80},
283    {0x03, 0x80}, {0x04, 0x06}, {0x05, 0x06}, {0x06, 0x06}
284};
285
286static DACTblDef ShadingVar3797[3] = {
287    {
288        {{99, 100, 94}}, {{0x30, 0x30, 0x30}},
289        {{0x20, 0x20, 0x20}}, {{0x04, 0x00, 0x00}}, {{0xcc, 0xcc, 0xcc}}, 0
290    }, {
291        {{100, 90, 100}}, {{0x30, 0x30, 0x30}},
292        {{0x20, 0x20, 0x20}}, {{0x10, 0x10, 0x10}}, {{0xcc, 0xcc, 0xcc}}, 0
293    }, {
294        {{90, 90, 90}}, {{0x30, 0x30, 0x30}}, {{0x20, 0x20, 0x20}},
295        {{0x10, 0x10, 0x10}}, {{0x80, 0x80, 0x80}}, 0
296    }
297};
298
299static DACTblDef ShadingVar3799[3] = {
300    {
301        {{100, 97, 92}}, {{0x90, 0xe0, 0x80}},
302        {{0x70, 0xc0, 0x60}}, {{0x90, 0x34, 0x3c}}, {{0x80, 0x80, 0x80}}, 0
303    }, {
304        {{75, 75, 75}}, {{0x30, 0x30, 0x30}},
305        {{0x10, 0x10, 0x10}}, {{0x20, 0x20, 0x20}}, {{0x80, 0x80, 0x80}}, 0
306    }, {
307        {{80, 75, 64}}, {{0x30, 0x30, 0x30}},
308        {{0x20, 0x20, 0x20}}, {{0x10, 0x10, 0x10}}, {{0x80, 0x80, 0x80}}, 0
309    }
310};
311
312/* Genius ColorPage Vivid III */
313static DACTblDef ShadingVar548[3] = {
314    {
315        {{100, 97, 92}}, {{0x90, 0xe0, 0x80}},
316        {{0x70, 0xc0, 0x60}}, {{0x90, 0x34, 0x3c}}, {{0x80, 0x80, 0x80}}, 0
317    }, {
318        {{75, 75, 75}}, {{0x30, 0x30, 0x30}},
319        {{0x10, 0x10, 0x10}}, {{0x20, 0x20, 0x20}}, {{0x80, 0x80, 0x80}}, 0
320    }, {
321        {{80, 75, 64}}, {{0x30, 0x30, 0x30}},
322        {{0x20, 0x20, 0x20}}, {{0x10, 0x10, 0x10}}, {{0x80, 0x80, 0x80}}, 0
323    }
324};
325
326static DACTblDef ShadingVar3777[3] = {
327    {
328        {{100, 100, 100}}, {{0x90, 0xe0, 0x80}},
329        {{0x70, 0xc0, 0x60}}, {{0x90, 0x34, 0x3c}}, {{0x80, 0x80, 0x80}}, 0
330    }, {
331        {{75, 75, 75}}, {{0x30, 0x30, 0x30}},
332        {{0x10, 0x10, 0x10}}, {{0x20, 0x20, 0x20}}, {{0x80, 0x80, 0x80}}, 0
333    }, {
334        {{80, 75, 64}}, {{0x30, 0x30, 0x30}},
335        {{0x20, 0x20, 0x20}}, {{0x10, 0x10, 0x10}}, {{0x80, 0x80, 0x80}}, 0
336    }
337};
338
339/*************************** local functions *********************************/
340
341/*.............................................................................
342 *
343 */
344static void fnCCDInitWolfson3797( pScanData ps )
345{
346    if( ps->Shade.bIntermediate & _ScanMode_Mono )
347    	ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0xcc;
348    else
349    	if (ps->Shade.bIntermediate & _ScanMode_AverageOut)
350	        ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0x68;
351    	else
352  	        ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0xa0;
353
354    if((ps->Shade.bIntermediate & _ScanMode_AverageOut) ||
355        (ps->DataInf.dwScanFlag & SCANDEF_Negative))
356    	WolfsonDAC8143[3].bParam = 0x12;
357    else
358        WolfsonDAC8143[3].bParam = 0x10;
359}
360
361/*.............................................................................
362 *
363 */
364static void fnCCDInitSamsung3797( pScanData ps )
365{
366    if(!(ps->DataInf.dwScanFlag & SCANDEF_TPA)) {
367
368        if (!(ps->Shade.bIntermediate & _ScanMode_AverageOut)) {
369
370    	    if( ps->Device.bPCBID == _OPTICWORKS2000 ) {
371        		ps->Shade.pCcdDac->GainResize.Colors.Red = 102;
372	        	ps->Shade.pCcdDac->GainResize.Colors.Green = 102;
373        		ps->Shade.pCcdDac->GainResize.Colors.Blue = 97;
374        		ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0x40;
375        		ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0x40;
376        		ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0x40;
377		        ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x48;
378        		ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x40;
379        		ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x40;
380        		ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x38;
381        		ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x30;
382        		ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x30;
383        		ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x48;
384        		ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x38;
385        		ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0x40;
386	        } else {
387        		ps->Shade.pCcdDac->GainResize.Colors.Red = 99;
388        		ps->Shade.pCcdDac->GainResize.Colors.Green = 101;
389		        ps->Shade.pCcdDac->GainResize.Colors.Blue = 94;
390        		ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0x40;
391        		ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0x40;
392		        ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0x40;
393        		ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x30;
394        		ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x30;
395        		ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x30;
396        		ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x20;
397        		ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x20;
398		        ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x20;
399        		ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x04;
400		        ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x00;
401        		ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0x00;
402	        }
403    	} else {
404            if( ps->Device.bPCBID == _OPTICWORKS2000 ) {
405    	    	ps->Shade.pCcdDac->GainResize.Colors.Red = 100;
406    	    	ps->Shade.pCcdDac->GainResize.Colors.Green = 100;
407	    	    ps->Shade.pCcdDac->GainResize.Colors.Blue = 96;
408    	    	ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0x30;
409        		ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0x30;
410	        	ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0x30;
411    	    	ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x48;
412    	    	ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x48;
413        		ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x48;
414	        	ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x38;
415        		ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x38;
416	        	ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x38;
417    		    ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x48;
418        		ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x48;
419    	    	ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0x48;
420	        } else {
421    	    	ps->Shade.pCcdDac->GainResize.Colors.Red = 100;   /*  98 */
422    	    	ps->Shade.pCcdDac->GainResize.Colors.Green = 103; /* 106 */
423	    	    ps->Shade.pCcdDac->GainResize.Colors.Blue = 96;	  /*  96 */
424    	    	ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0x20;
425	    	    ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0x10;
426    		    ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0x10;
427        		ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x110;
428	        	ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x1f0;
429    		    ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x190;
430        		ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x100;
431	        	ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x1e0;
432    		    ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x180;
433        		ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x20;
434	        	ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x10;
435    		    ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0x20;
436	        }
437       	}
438    }
439}
440
441/*.............................................................................
442 *
443 */
444static void fnCCDInitWolfson3799( pScanData ps )
445{
446    if(!(ps->DataInf.dwScanFlag & SCANDEF_Negative)) {
447
448        if (!(ps->Shade.bIntermediate & _ScanMode_AverageOut)) {
449
450    	    ps->Shade.pCcdDac->GainResize.Colors.Red = 103;
451	        ps->Shade.pCcdDac->GainResize.Colors.Green = 102;
452    	    ps->Shade.pCcdDac->GainResize.Colors.Blue = 99;
453	        ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0xc8;
454	        ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0xc8;
455    	    ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0xc8;
456	        ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x48;
457	        ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x30;
458    	    ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x30;
459	        ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x40;
460	        ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x28;
461    	    ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x28;
462	        ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x48;
463    	    ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x18;
464	        ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0x2c;
465    	} else {
466	        ps->Shade.pCcdDac->GainResize.Colors.Red = 100;
467    	    ps->Shade.pCcdDac->GainResize.Colors.Green = 98;
468	        ps->Shade.pCcdDac->GainResize.Colors.Blue = 95;
469	        ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0xd0;
470    	    ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0xd0;
471	        ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0xd0;
472	        ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x30;
473    	    ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x30;
474	        ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x30;
475    	    ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x28;
476	        ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x28;
477    	    ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x28;
478	        ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x0;
479    	    ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x0;
480	        ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0x0;
481    	}
482    } else {
483    	ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0x80;
484	    ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0x80;
485    	ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0x80;
486	    ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x28;
487    	ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x28;
488	    ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x28;
489    	ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x20;
490	    ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x20;
491    	ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x20;
492	    ps->Shade.pCcdDac->DarkOffSub.Colors.Red = -0x38;
493    	ps->Shade.pCcdDac->DarkOffSub.Colors.Green = -0x108;
494	    ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = -0x1c8;
495    }
496}
497
498/*.............................................................................
499 *  Genius ColorPage VIVID III
500 */
501static void fnCCDInitWolfson548( pScanData ps )
502{
503    if (!(ps->Shade.bIntermediate & _ScanMode_AverageOut)) {
504
505 	    ps->Shade.pCcdDac->GainResize.Colors.Red   = 103;
506        ps->Shade.pCcdDac->GainResize.Colors.Green = 102;
507   	    ps->Shade.pCcdDac->GainResize.Colors.Blue  = 99;
508        ps->Shade.pCcdDac->DarkDAC.Colors.Red      = 0xc8;
509        ps->Shade.pCcdDac->DarkDAC.Colors.Green    = 0xc8;
510   	    ps->Shade.pCcdDac->DarkDAC.Colors.Blue     = 0xc8;
511        ps->Shade.pCcdDac->DarkCmpHi.Colors.Red    = 0x48;
512        ps->Shade.pCcdDac->DarkCmpHi.Colors.Green  = 0x30;
513   	    ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue   = 0x30;
514        ps->Shade.pCcdDac->DarkCmpLo.Colors.Red    = 0x40;
515        ps->Shade.pCcdDac->DarkCmpLo.Colors.Green  = 0x28;
516   	    ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue   = 0x28;
517        ps->Shade.pCcdDac->DarkOffSub.Colors.Red   = 0x48;
518   	    ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x18;
519        ps->Shade.pCcdDac->DarkOffSub.Colors.Blue  = 0x2c;
520
521   	} else {
522        ps->Shade.pCcdDac->GainResize.Colors.Red   = 100;
523   	    ps->Shade.pCcdDac->GainResize.Colors.Green = 98;
524        ps->Shade.pCcdDac->GainResize.Colors.Blue  = 95;
525        ps->Shade.pCcdDac->DarkDAC.Colors.Red      = 0xd0;
526   	    ps->Shade.pCcdDac->DarkDAC.Colors.Green    = 0xd0;
527        ps->Shade.pCcdDac->DarkDAC.Colors.Blue     = 0xd0;
528        ps->Shade.pCcdDac->DarkCmpHi.Colors.Red    = 0x30;
529   	    ps->Shade.pCcdDac->DarkCmpHi.Colors.Green  = 0x30;
530        ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue   = 0x30;
531   	    ps->Shade.pCcdDac->DarkCmpLo.Colors.Red    = 0x28;
532        ps->Shade.pCcdDac->DarkCmpLo.Colors.Green  = 0x28;
533   	    ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue   = 0x28;
534        ps->Shade.pCcdDac->DarkOffSub.Colors.Red   = 0x0;
535   	    ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x0;
536        ps->Shade.pCcdDac->DarkOffSub.Colors.Blue  = 0x0;
537   	}
538}
539
540/*.............................................................................
541 *
542 */
543static void fnCCDInitSamsung3777( pScanData ps )
544{
545    if(!(ps->DataInf.dwScanFlag & SCANDEF_Negative)) {
546
547        if (!(ps->Shade.bIntermediate & _ScanMode_AverageOut)) {
548
549    	    ps->Shade.pCcdDac->GainResize.Colors.Red = 109;
550	        ps->Shade.pCcdDac->GainResize.Colors.Green = 108;
551	        ps->Shade.pCcdDac->GainResize.Colors.Blue = 105;
552    	    ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0x4a;
553	        ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0x4a;
554            ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0x4a;
555	        ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x3c;
556    	    ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x38;
557	        ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x38;
558	        ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x28;
559    	    ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x2c;
560	        ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x28;
561	        ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x30;
562    	    ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x30;
563	        ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0x3C;
564    	} else {
565    	    ps->Shade.pCcdDac->GainResize.Colors.Red = 108;
566	        ps->Shade.pCcdDac->GainResize.Colors.Green = 107;
567    	    ps->Shade.pCcdDac->GainResize.Colors.Blue = 104;
568	        ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0x50;
569	        ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0x50;
570    	    ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0x50;
571    	    ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x40;
572	        ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x40;
573	        ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x40;
574    	    ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x30;
575	        ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x30;
576	        ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x30;
577	        ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x20;
578    	    ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x20;
579	        ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0x20;
580	    }
581    } else {
582    	ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0x80;
583	    ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0x80;
584    	ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0x80;
585	    ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x28;
586    	ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x28;
587    	ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x28;
588	    ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x20;
589    	ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x20;
590	    ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x20;
591    	ps->Shade.pCcdDac->DarkOffSub.Colors.Red = -0x38;
592	    ps->Shade.pCcdDac->DarkOffSub.Colors.Green = -0x108;
593    	ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = -0x1c8;
594    }
595}
596
597/*.............................................................................
598 *
599 */
600static void fnCCDInitSamsung3799( pScanData ps )
601{
602    if(!(ps->DataInf.dwScanFlag & SCANDEF_TPA)) {
603
604        if (!(ps->Shade.bIntermediate & _ScanMode_AverageOut)) {
605
606    	    if( ps->Device.bPCBID == _SCANNER2Button ) {
607        		ps->Shade.pCcdDac->GainResize.Colors.Red = 109;
608        		ps->Shade.pCcdDac->GainResize.Colors.Green = 109;
609		        ps->Shade.pCcdDac->GainResize.Colors.Blue = 105;
610        		ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0x68;
611		        ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0x68;
612        		ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0x68;
613		        ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x30;
614        		ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x30;
615		        ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x30;
616        		ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x28;
617		        ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x28;
618        		ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x28;
619		        ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x24;    /* 0 */
620        		ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x20;  /* 0 */
621		        ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0x1c;   /* 0 */
622    	    } else {
623        		ps->Shade.pCcdDac->GainResize.Colors.Red = 98;
624		        ps->Shade.pCcdDac->GainResize.Colors.Green = 97;
625        		ps->Shade.pCcdDac->GainResize.Colors.Blue = 92;
626		        ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0x90;
627        		ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0x90;
628		        ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0x90;
629        		ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0xc0;	    /* 0x90 */
630		        ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0xc0;   /* 0xe0 */
631        		ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0xc0;    /* 0x80 */
632		        ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0xb0;	    /* 0x70 */
633        		ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0xb0;   /* 0xc0 */
634		        ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0xb0;    /* 0x60 */
635        		ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x24;    /* 0x90 */
636		        ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x00;	/* 0x34 */
637        		ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0x0c;	/* 0x3c */
638	        }
639    	} else {
640    	    if( ps->Device.bPCBID == _SCANNER2Button ) {
641        		ps->Shade.pCcdDac->GainResize.Colors.Red = 107;
642		        ps->Shade.pCcdDac->GainResize.Colors.Green = 106;
643        		ps->Shade.pCcdDac->GainResize.Colors.Blue = 103;
644		        ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0x48;
645        		ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0x48;
646		        ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0x48;
647        		ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x30;
648		        ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x30;
649        		ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x30;
650		        ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x28;
651        		ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x28;
652		        ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x28;
653        		ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x28;    /* 0 */
654		        ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x18;  /* 0 */
655        		ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0x20;   /* 0 */
656	        } else {
657        		ps->Shade.pCcdDac->GainResize.Colors.Red = 104;
658		        ps->Shade.pCcdDac->GainResize.Colors.Green = 107;
659        		ps->Shade.pCcdDac->GainResize.Colors.Blue = 99;
660		        ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0x30;	    /* 0x80 */
661        		ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0x30;
662		        ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0x30;	    /* 0x0a0 */
663        		ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x150;    /* 0x170 */
664		        ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x130;  /* 0x90  */
665        		ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x110;   /* 0x130 */
666		        ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x140;    /* 0x150 */
667        		ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x120;  /* 0x70  */
668		        ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x100;   /* 0x120 */
669        		ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0xF0;    /* 0x90  */
670		        ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0xD4;  /* 0x50  */
671        		ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0xCC;   /* 0x60  */
672	        }
673        }
674    }
675}
676
677/*.............................................................................
678 *
679 */
680static void fnCCDInitESIC3799( pScanData ps )
681{
682    if(!(ps->DataInf.dwScanFlag & SCANDEF_Negative)) {
683
684        if (!(ps->Shade.bIntermediate & _ScanMode_AverageOut)) {
685
686    	    ps->Shade.pCcdDac->GainResize.Colors.Red = 100;
687	        ps->Shade.pCcdDac->GainResize.Colors.Green = 99;
688	        ps->Shade.pCcdDac->GainResize.Colors.Blue = 94;
689    	    ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0xc8;
690	        ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0xc8;
691	        ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0xc8;
692    	    ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x58;
693	        ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x38;
694	        ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x48;
695    	    ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x48;
696	        ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x28;
697	        ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x38;
698    	    ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x58;
699	        ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0x38;
700	        ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0x48;
701    	} else {
702    	    ps->Shade.pCcdDac->GainResize.Colors.Red = 100;
703	        ps->Shade.pCcdDac->GainResize.Colors.Green = 98;
704	        ps->Shade.pCcdDac->GainResize.Colors.Blue = 93;
705    	    ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0xd0;
706	        ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0xd0;
707	        ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0xd0;
708    	    ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x108;
709	        ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0xf8;
710	        ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0xc8;
711    	    ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x100;
712	        ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0xf0;
713	        ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0xc0;
714    	    ps->Shade.pCcdDac->DarkOffSub.Colors.Red = 0x108;
715	        ps->Shade.pCcdDac->DarkOffSub.Colors.Green = 0xf8;
716	        ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = 0xc8;
717    	}
718    } else {
719    	ps->Shade.pCcdDac->DarkDAC.Colors.Red = 0x80;
720	    ps->Shade.pCcdDac->DarkDAC.Colors.Green = 0x80;
721    	ps->Shade.pCcdDac->DarkDAC.Colors.Blue = 0x80;
722	    ps->Shade.pCcdDac->DarkCmpHi.Colors.Red = 0x28;
723    	ps->Shade.pCcdDac->DarkCmpHi.Colors.Green = 0x28;
724	    ps->Shade.pCcdDac->DarkCmpHi.Colors.Blue = 0x28;
725    	ps->Shade.pCcdDac->DarkCmpLo.Colors.Red = 0x20;
726	    ps->Shade.pCcdDac->DarkCmpLo.Colors.Green = 0x20;
727    	ps->Shade.pCcdDac->DarkCmpLo.Colors.Blue = 0x20;
728	    ps->Shade.pCcdDac->DarkOffSub.Colors.Red = -0x38;
729    	ps->Shade.pCcdDac->DarkOffSub.Colors.Green = -0x38;
730	    ps->Shade.pCcdDac->DarkOffSub.Colors.Blue = -0x38;
731    }
732}
733
734/*.............................................................................
735 *
736 */
737static void fnDarkOffsetWolfson3797( pScanData ps, pDACTblDef pDacTbl, ULong dwCh )
738{
739    if(( ps->Shade.DarkOffset.wColors[dwCh] -=
740                pDacTbl->DarkOffSub.wColors[dwCh]) > 0xfff ) {
741	    ps->Shade.DarkOffset.wColors[dwCh] = 0;
742    }
743}
744
745/*.............................................................................
746 * this function was defined in the original sources, but never used...
747 */
748#if 0
749static void fnDarkOffsetWolfson3799( pScanData ps, pDACTblDef pDacTbl, ULong dwCh )
750{
751    if( ps->Shade.DarkOffset.wColors[dwCh] > pDacTbl->DarkOffSub.wColors[dwCh])
752        ps->Shade.DarkOffset.wColors[dwCh] -= pDacTbl->DarkOffSub.wColors[dwCh];
753    else
754        ps->Shade.DarkOffset.wColors[dwCh] = 0;
755}
756#endif
757
758/*.............................................................................
759 *
760 */
761static void fnDarkOffsetSamsung3777( pScanData ps, pDACTblDef pDacTbl, ULong dwCh )
762{
763    ps->Shade.DarkOffset.wColors[dwCh] += pDacTbl->DarkOffSub.wColors [dwCh];
764}
765
766/*.............................................................................
767 *
768 */
769static void fnDarkOffsetSamsung3797( pScanData ps, pDACTblDef pDacTbl, ULong dwCh )
770{
771    if( ps->Shade.DarkOffset.wColors[dwCh] > pDacTbl->DarkOffSub.wColors[dwCh] )
772    	ps->Shade.DarkOffset.wColors[dwCh] -= pDacTbl->DarkOffSub.wColors[dwCh];
773    else
774    	ps->Shade.DarkOffset.wColors[dwCh] = 0;
775}
776
777/*.............................................................................
778 *
779 */
780static void fnDarkOffsetSamsung3799( pScanData ps, pDACTblDef pDacTbl, ULong dwCh )
781{
782    if( ps->Shade.DarkOffset.wColors[dwCh] > pDacTbl->DarkOffSub.wColors[dwCh])
783    	ps->Shade.DarkOffset.wColors[dwCh] -= pDacTbl->DarkOffSub.wColors[dwCh];
784    else
785        ps->Shade.DarkOffset.wColors[dwCh] = 0;
786}
787
788/*.............................................................................
789 *
790 */
791static void fnDACDarkWolfson( pScanData ps, pDACTblDef pDacTbl,
792                              ULong dwCh, UShort wDarkest )
793{
794    UShort w;
795
796    w = ps->Shade.DarkDAC.bColors[dwCh];
797
798    if (wDarkest > pDacTbl->DarkCmpHi.wColors[dwCh] ) {
799
800    	wDarkest -= pDacTbl->DarkCmpHi.wColors[dwCh];
801    	if (wDarkest > ps->Shade.wDarkLevels)
802	        w += (UShort)wDarkest / ps->Shade.wDarkLevels;
803    	else
804	        w++;
805
806        if (w > 0xff)
807	        w = 0xff;
808
809        if(w != (UShort)ps->Shade.DarkDAC.bColors[dwCh] ) {
810    	    ps->Shade.DarkDAC.bColors[dwCh] = (Byte)w;
811	        ps->Shade.fStop                 = _FALSE;
812    	}
813    } else
814    	if((wDarkest < pDacTbl->DarkCmpLo.wColors[dwCh]) &&
815                                	        ps->Shade.DarkDAC.bColors[dwCh]) {
816    	    if (wDarkest)
817	        	w = (UShort)ps->Shade.DarkDAC.bColors[dwCh] - 2U;
818    	    else
819	        	w = (UShort)ps->Shade.DarkDAC.bColors[dwCh] - ps->Shade.wDarkLevels;
820
821    	    if ((short) w < 0)
822	        	w = 0;
823    	    if (w != (UShort)ps->Shade.DarkDAC.bColors[dwCh] ) {
824        		ps->Shade.DarkDAC.bColors [dwCh] = (Byte)w;
825		        ps->Shade.fStop                  = _FALSE;
826	        }
827	}
828}
829
830/*.............................................................................
831 *
832 */
833static void fnDACDarkSamsung( pScanData ps, pDACTblDef pDacTbl,
834                              ULong dwCh, UShort wDarkest )
835{
836    UShort w;
837
838    if( wDarkest > pDacTbl->DarkCmpHi.wColors[dwCh] ) {
839
840    	wDarkest -= pDacTbl->DarkCmpHi.wColors [dwCh];
841    	if (wDarkest > ps->Shade.wDarkLevels)
842	        w = (UShort)ps->Shade.DarkDAC.bColors[dwCh] -
843	                                        wDarkest / ps->Shade.wDarkLevels;
844    	else
845	        w = (UShort)ps->Shade.DarkDAC.bColors[dwCh] - 1U;
846
847    	if((short) w < 0)
848	        w = 0;
849
850    	if(w != (UShort)ps->Shade.DarkDAC.bColors[dwCh]) {
851    	    ps->Shade.DarkDAC.bColors [dwCh] = (Byte)w;
852	        ps->Shade.fStop                  = _FALSE;
853    	}
854    } else
855    	if((wDarkest < pDacTbl->DarkCmpLo.wColors[dwCh]) &&
856                                    	    ps->Shade.DarkDAC.bColors[dwCh]) {
857    	    if (wDarkest)
858	        	w = (UShort)ps->Shade.DarkDAC.bColors[dwCh] + 2U;
859    	    else
860	    	w = ps->Shade.wDarkLevels + (UShort)ps->Shade.DarkDAC.bColors [dwCh];
861
862    	    if (w > 0xff)
863	        	w = 0xff;
864
865    	    if(w != (UShort)ps->Shade.DarkDAC.bColors[dwCh]) {
866        		ps->Shade.DarkDAC.bColors[dwCh] = (Byte)w;
867		        ps->Shade.fStop                 = _FALSE;
868    	    }
869	}
870}
871
872/************************ exported functions *********************************/
873
874/*.............................................................................
875 * according to detected CCD and DAC, we set their correct init values
876 * and functions
877 */
878_LOC void P12InitCCDandDAC( pScanData ps, Bool shading )
879{
880    UShort     w;
881    pDACTblDef pDAC_CCD;
882
883    /* some presets */
884    ps->Device.f0_8_16 = _FALSE;
885
886    switch( ps->Device.bDACType ) {
887
888	case _DA_WOLFSON8143:
889
890       	DBG( DBG_LOW, "WOLFSON 8143\n" );
891	    switch( ps->Device.bCCDID ) {
892
893		case _CCD_3797:
894           	DBG( DBG_LOW, "CCD-3797\n" );
895    	    pDAC_CCD                 = ShadingVar3797;
896		    p12ccdInitFunc           = fnCCDInitWolfson3797;
897		    ps->Device.fnDarkOffset  = fnDarkOffsetWolfson3797;
898		    ps->Device.fnDACDark     = fnDACDarkWolfson;
899		    ps->Device.pCCDRegisters = (pRegDef)W3797CCDParams;
900		    break;
901
902		case _CCD_548:
903           	DBG( DBG_LOW, "CCD-548\n" );
904		    pDAC_CCD                 = ShadingVar548;
905		    p12ccdInitFunc           = fnCCDInitWolfson548;
906		    ps->Device.fnDarkOffset  = fnDarkOffsetWolfson3797;
907		    ps->Device.fnDACDark     = fnDACDarkWolfson;
908		    ps->Device.pCCDRegisters = (pRegDef)W548CCDParams;
909		    break;
910
911
912		default:
913           	DBG( DBG_LOW, "CCD-3799\n" );
914		    pDAC_CCD                 = ShadingVar3799;
915		    p12ccdInitFunc           = fnCCDInitWolfson3799;
916/* CHECK: org was to  fnDarkOffsetWolfson3797 */
917		    ps->Device.fnDarkOffset  = fnDarkOffsetWolfson3797;
918		    ps->Device.fnDACDark     = fnDACDarkWolfson;
919		    ps->Device.pCCDRegisters = (pRegDef)W3799CCDParams;
920	    }
921
922        ps->Device.wNumCCDRegs   = _NUM_OF_CCDREGS_W8143;
923        ps->Device.wNumDACRegs   = _NUM_OF_DACREGS_W8143;
924        ps->Device.pDACRegisters = WolfsonDAC8143;
925        ps->Device.RegDACOffset.Red   = 0x20;
926        ps->Device.RegDACOffset.Green = 0x21;
927        ps->Device.RegDACOffset.Blue  = 0x22;
928        ps->Device.RegDACGain.Red     = 0x28;
929        ps->Device.RegDACGain.Green   = 0x29;
930        ps->Device.RegDACGain.Blue    = 0x2a;
931
932        if( ps->Shade.bIntermediate & _ScanMode_AverageOut ) {
933    		ps->Shade.bUniGain    = 1;
934	    	ps->Shade.bGainDouble = 1;
935	    } else {
936    		ps->Shade.bUniGain    = 2;
937	    	ps->Shade.bGainDouble = 4;
938	    }
939	    ps->Shade.bMinGain    = 1;
940	    ps->Shade.bMaxGain    = 0x1f;
941	    ps->Shade.wDarkLevels = 10;
942
943	    if( ps->Shade.bIntermediate == _ScanMode_Color )
944    		WolfsonDAC8143[2].bParam = 0x52;
945	    else
946    		WolfsonDAC8143[2].bParam = 0x42;
947
948	    if (ps->Shade.bIntermediate == _ScanMode_Mono )
949    		WolfsonDAC8143 [0].bParam = 7;
950	    else
951		    WolfsonDAC8143 [0].bParam = 3;
952
953	    break;
954
955	case _DA_SAMSUNG1224:
956
957       	DBG( DBG_LOW, "Samsung 1224\n" );
958
959	    switch(ps->Device.bCCDID )
960	    {
961		case _CCD_3797:
962           	DBG( DBG_LOW, "CCD-3797\n" );
963		    pDAC_CCD                 = ShadingVar3797;
964		    p12ccdInitFunc           = fnCCDInitSamsung3797;
965		    ps->Device.fnDarkOffset  = fnDarkOffsetSamsung3797;
966		    ps->Device.fnDACDark     = fnDACDarkSamsung;
967		    ps->Device.pCCDRegisters = (pRegDef)S3797CCDParams;
968		    break;
969
970		default:
971           	DBG( DBG_LOW, "CCD-3799\n" );
972		    pDAC_CCD                 = ShadingVar3799;
973		    p12ccdInitFunc           = fnCCDInitSamsung3799;
974		    ps->Device.fnDarkOffset  = fnDarkOffsetSamsung3799;
975		    ps->Device.fnDACDark     = fnDACDarkSamsung;
976		    ps->Device.pCCDRegisters = (pRegDef)S3799CCDParams;
977	    }
978	    ps->Device.wNumCCDRegs        = _NUM_OF_CCDREGS_S1224;
979	    ps->Device.wNumDACRegs        = _NUM_OF_DACREGS_S1224;
980	    ps->Device.pDACRegisters      = SamsungDAC1224;
981	    ps->Device.RegDACOffset.Red   = 1;
982	    ps->Device.RegDACOffset.Green = 2;
983	    ps->Device.RegDACOffset.Blue  = 3;
984	    ps->Device.RegDACGain.Red     = 4;
985	    ps->Device.RegDACGain.Green   = 5;
986	    ps->Device.RegDACGain.Blue    = 6;
987	    ps->Shade.bGainDouble         = 6;
988	    ps->Shade.bUniGain            = 7;
989	    ps->Shade.bMinGain            = 0;
990	    ps->Shade.bMaxGain            = 0x1f;
991	    ps->Shade.wDarkLevels = 10;
992
993	    if( ps->Shade.bIntermediate & _ScanMode_Mono )
994    		SamsungDAC1224[0].bParam = 0x57;
995	    else
996	    	SamsungDAC1224[0].bParam = 0x51;
997	    break;
998
999	case _DA_ESIC:
1000
1001       	DBG( DBG_LOW, "ESIC\n" );
1002
1003	    switch( ps->Device.bCCDID ) {
1004
1005		case _CCD_3797:
1006           	DBG( DBG_LOW, "CCD-3797\n" );
1007		    pDAC_CCD                 = ShadingVar3797;
1008		    p12ccdInitFunc           = fnCCDInitWolfson3797;
1009		    ps->Device.fnDarkOffset  = fnDarkOffsetWolfson3797;
1010		    ps->Device.fnDACDark     = fnDACDarkWolfson;
1011		    ps->Device.pCCDRegisters = (pRegDef)W3797CCDParams;
1012		    break;
1013
1014		default:
1015           	DBG( DBG_LOW, "CCD-3799\n" );
1016		    pDAC_CCD                 = ShadingVar3799;
1017		    p12ccdInitFunc           = fnCCDInitESIC3799;
1018		    ps->Device.fnDarkOffset  = fnDarkOffsetWolfson3797;
1019		    ps->Device.fnDACDark     = fnDACDarkWolfson;
1020		    ps->Device.pCCDRegisters = (pRegDef)W3799CCDParams;
1021	    }
1022
1023	    ps->Device.wNumCCDRegs        = _NUM_OF_CCDREGS_W8143;
1024	    ps->Device.wNumDACRegs        = _NUM_OF_DACREGS_W8143;
1025	    ps->Device.pDACRegisters      = WolfsonDAC8143;
1026	    ps->Device.RegDACOffset.Red   = 0x20;
1027	    ps->Device.RegDACOffset.Green = 0x21;
1028	    ps->Device.RegDACOffset.Blue  = 0x22;
1029	    ps->Device.RegDACGain.Red     = 0x28;
1030	    ps->Device.RegDACGain.Green   = 0x29;
1031	    ps->Device.RegDACGain.Blue    = 0x2a;
1032
1033	    if( ps->Shade.bIntermediate & _ScanMode_AverageOut ) {
1034    		ps->Shade.bUniGain    = 1;
1035	    	ps->Shade.bGainDouble = 1;
1036	    } else {
1037    		ps->Shade.bUniGain    = 2;
1038	    	ps->Shade.bGainDouble = 4;
1039	    }
1040	    ps->Shade.bMinGain    = 1;
1041	    ps->Shade.bMaxGain    = 0x1f;
1042	    ps->Shade.wDarkLevels = 10;
1043
1044	    if( ps->Shade.bIntermediate == _ScanMode_Color )
1045    		WolfsonDAC8143 [2].bParam = 0x52;
1046	    else
1047	    	WolfsonDAC8143 [2].bParam = 0x42;
1048
1049	    if(ps->Shade.bIntermediate == _ScanMode_Mono )
1050    		WolfsonDAC8143[0].bParam = 7;
1051	    else
1052	    	WolfsonDAC8143[0].bParam = 3;
1053	    break;
1054
1055	/* _DA_SAMSUNG8531 */
1056	default:
1057
1058       	DBG( DBG_LOW, "SAMSUNG 8531\n" );
1059	    switch( ps->Device.bCCDID ) {
1060
1061		case _CCD_3797:
1062           	DBG( DBG_LOW, "CCD-3797\n" );
1063		    pDAC_CCD                 = ShadingVar3797;
1064		    p12ccdInitFunc           = fnCCDInitSamsung3797;
1065		    ps->Device.fnDarkOffset  = fnDarkOffsetSamsung3797;
1066		    ps->Device.fnDACDark     = fnDACDarkSamsung;
1067		    ps->Device.pCCDRegisters = (pRegDef)S3797CCDParams;
1068		    break;
1069
1070		case _CCD_3777:
1071           	DBG( DBG_LOW, "CCD-3777\n" );
1072		    pDAC_CCD                 = ShadingVar3777;
1073		    p12ccdInitFunc           = fnCCDInitSamsung3777;
1074		    ps->Device.fnDarkOffset  = fnDarkOffsetSamsung3777;
1075		    ps->Device.fnDACDark     = fnDACDarkSamsung;
1076		    ps->Device.pCCDRegisters = (pRegDef)S3797CCDParams;
1077		    ps->Device.f0_8_16 = _TRUE;
1078		    break;
1079
1080		default:
1081          	DBG( DBG_LOW, "CCD-3799\n" );
1082		    pDAC_CCD                 = ShadingVar3799;
1083		    p12ccdInitFunc           = fnCCDInitSamsung3799;
1084		    ps->Device.fnDarkOffset  = fnDarkOffsetSamsung3799;
1085		    ps->Device.fnDACDark     = fnDACDarkSamsung;
1086		    ps->Device.pCCDRegisters = (pRegDef)S3799CCDParams;
1087	    }
1088
1089	    ps->Device.wNumCCDRegs   = _NUM_OF_CCDREGS_S8531;
1090	    ps->Device.wNumDACRegs   = _NUM_OF_DACREGS_S8531;
1091	    ps->Device.pDACRegisters = SamsungDAC8531;
1092	    ps->Device.RegDACOffset.Red   =
1093	    ps->Device.RegDACOffset.Green =
1094	    ps->Device.RegDACOffset.Blue  = 1;
1095	    ps->Device.RegDACGain.Red   =
1096	    ps->Device.RegDACGain.Green =
1097	    ps->Device.RegDACGain.Blue  = 2;
1098	    ps->Shade.bGainDouble = 6;
1099	    ps->Shade.bMinGain    = 1;
1100	    ps->Shade.bMaxGain    = 0x1f;
1101	    if( ps->DataInf.dwScanFlag & SCANDEF_TPA )
1102    		ps->Shade.bUniGain = 2;
1103	    else
1104    		ps->Shade.bUniGain = 7;
1105
1106	    ps->Shade.wDarkLevels = 10;
1107
1108	    if( ps->Shade.bIntermediate & _ScanMode_Mono ) {
1109    		SamsungDAC8531[0].bParam = 0x57;
1110	    	SamsungDAC8531[3].bParam = 0x57;
1111		    SamsungDAC8531[6].bParam = 0x57;
1112	    } else {
1113    		SamsungDAC8531[0].bParam = 0x51;
1114	    	SamsungDAC8531[3].bParam = 0x55;
1115		    SamsungDAC8531[6].bParam = 0x59;
1116	    }
1117    }
1118
1119    if( shading ) {
1120
1121        if( !(ps->DataInf.dwScanFlag & SCANDEF_TPA))
1122	        ps->Shade.pCcdDac = &pDAC_CCD[_REFLECTION];
1123    	else {
1124	        if( ps->DataInf.dwScanFlag & SCANDEF_Transparency )
1125		        ps->Shade.pCcdDac = &pDAC_CCD[_TRANSPARENCY];
1126    	    else
1127                ps->Shade.pCcdDac = &pDAC_CCD[_NEGATIVE];
1128        }
1129    } else
1130	    ps->Shade.pCcdDac = &pDAC_CCD[_REFLECTION];
1131
1132    /* as we now have the correct init function, call it */
1133    p12ccdInitFunc( ps );
1134
1135    DBG( DBG_IO, "Programming DAC (%u regs)\n", ps->Device.wNumDACRegs );
1136
1137    for(w = 0; w < ps->Device.wNumDACRegs; w++ ) {
1138
1139        DBG( DBG_IO, "[0x%02x] = 0x%02x\n", ps->Device.pDACRegisters[w].bReg,
1140                                          ps->Device.pDACRegisters[w].bParam );
1141
1142        IODataRegisterToDAC( ps, ps->Device.pDACRegisters[w].bReg,
1143                                 ps->Device.pDACRegisters[w].bParam );
1144    }
1145}
1146
1147/* END PLUSTEK-PP_P12CCD.C ..................................................*/
1148