• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* sane - Scanner Access Now Easy.
2    Copyright (C) Marian Matthias Eichholz 2001
3    This file is part of the SANE package.
4 
5    This program is free software; you can redistribute it and/or
6    modify it under the terms of the GNU General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
9 
10    This program is distributed in the hope that it will be useful, but
11    WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    General Public License for more details.
14 
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <https://www.gnu.org/licenses/>.
17 
18    As a special exception, the authors of SANE give permission for
19    additional uses of the libraries contained in this release of SANE.
20 
21    The exception is that, if you link a SANE library with other files
22    to produce an executable, this does not by itself cause the
23    resulting executable to be covered by the GNU General Public
24    License.  Your use of that executable is in no way restricted on
25    account of linking the SANE library code into it.
26 
27    This exception does not, however, invalidate any other reasons why
28    the executable file might be covered by the GNU General Public
29    License.
30 
31    If you submit changes to SANE to the maintainers to be included in
32    a subsequent release, you agree by submitting the changes that
33    those changes may be distributed with this exception intact.
34 
35    If you write modifications of your own for SANE, it is your choice
36    whether to permit this exception to apply to your modifications.
37    If you do not wish that, delete this exception notice.
38 */
39 
40 #ifndef _H_SM3600
41 #define _H_SM3600
42 
43 /* ======================================================================
44 
45 sm3600.h
46 
47 SANE backend master module.
48 
49 Definitions ported from "scantool.h" 5.4.2001.
50 
51 (C) Marian Matthias Eichholz 2001
52 
53 Start: 2.4.2001
54 
55 ====================================================================== */
56 
57 #define DEBUG_SCAN     0x0001
58 #define DEBUG_COMM     0x0002
59 #define DEBUG_ORIG     0x0004
60 #define DEBUG_BASE     0x0011
61 #define DEBUG_DEVSCAN  0x0012
62 #define DEBUG_REPLAY   0x0014
63 #define DEBUG_BUFFER   0x0018
64 #define DEBUG_SIGNALS  0x0020
65 #define DEBUG_CALIB    0x0040
66 
67 #define DEBUG_CRITICAL 1
68 #define DEBUG_VERBOSE  2
69 #define DEBUG_INFO     3
70 #define DEBUG_JUNK     5
71 
72 #define USB_TIMEOUT_JIFFIES  2000
73 
74 #define SCANNER_VENDOR     0x05DA
75 
76 #define MAX_PIXEL_PER_SCANLINE  5300
77 
78 /* ====================================================================== */
79 
80 typedef enum { false, true } TBool;
81 
82 typedef SANE_Status TState;
83 
84 typedef enum { unknown, sm3600, sm3700, sm3750 } TModel;
85 
86 typedef struct {
87   TBool         bCalibrated;
88   int           xMargin; /* in 1/600 inch */
89   int           yMargin; /* in 1/600 inch */
90   unsigned char nHoleGray;
91   unsigned char nBarGray;
92   long          rgbBias;
93   unsigned char      *achStripeY;
94   unsigned char      *achStripeR;
95   unsigned char      *achStripeG;
96   unsigned char      *achStripeB;
97 } TCalibration;
98 
99 typedef struct {
100   int x;
101   int y;
102   int cx;
103   int cy;
104   int res; /* like all parameters in 1/1200 inch */
105   int nBrightness; /* -255 ... 255 */
106   int nContrast;   /* -128 ... 127 */
107 } TScanParam;
108 
109 typedef enum { fast, high, best } TQuality;
110 typedef enum { color, gray, line, halftone } TMode;
111 
112 #define INST_ASSERT() { if (this->nErrorState) return this->nErrorState; }
113 
114 #define CHECK_ASSERTION(a) if (!(a)) return SetError(this,SANE_STATUS_INVAL,"assertion failed in %s %d",__FILE__,__LINE__)
115 
116 #define CHECK_POINTER(p) \
117 if (!(p)) return SetError(this,SANE_STATUS_NO_MEM,"memory failed in %s %d",__FILE__,__LINE__)
118 
119 #define dprintf debug_printf
120 
121 typedef struct TInstance *PTInstance;
122 typedef TState (*TReadLineCB)(PTInstance);
123 
124 typedef struct TScanState {
125   TBool           bEOF;         /* EOF marker for sane_read */
126   TBool           bCanceled;
127   TBool           bScanning;    /* block is active? */
128   TBool           bLastBulk;    /* EOF announced */
129   int             iReadPos;     /* read() interface */
130   int             iBulkReadPos; /* bulk read pos */
131   int             iLine;        /* log no. line */
132   int             cchBulk;      /* available bytes in bulk buffer */
133   int             cchLineOut;   /* buffer size */
134   int             cxPixel,cyPixel; /* real pixel */
135   int             cxMax;        /* uninterpolated in real pixels */
136   int             cxWindow;     /* Window with in 600 DPI */
137   int             cyWindow;     /* Path length in 600 DPI */
138   int             cyTotalPath;  /* from bed start to window end in 600 dpi */
139   int             nFixAspect;   /* aspect ratio in percent, 75-100 */
140   int             cBacklog;     /* depth of ppchLines */
141   int             ySensorSkew;  /* distance in pixel between sensors */
142   char           *szOrder;      /* 123 or 231 or whatever */
143   unsigned char  *pchBuf;       /* bulk transfer buffer */
144   short         **ppchLines;    /* for error diffusion and color corr. */
145   unsigned char  *pchLineOut;   /* read() interface */
146   TReadLineCB     ReadProc;     /* line getter callback */
147 } TScanState;
148 
149 
150 #ifndef INSANE_VERSION
151 
152 #ifdef SM3600_SUPPORT_EXPOSURE
153 #define NUM_OPTIONS 18
154 #else
155 #define NUM_OPTIONS 16
156 #endif
157 
158 
159 typedef struct TDevice {
160   struct TDevice        *pNext;
161   struct usb_device     *pdev;
162   TModel                 model;
163   SANE_Device            sane;
164   char			*szSaneName;
165 } TDevice;
166 
167 #endif
168 
169 typedef struct TInstance {
170 #ifndef INSANE_VERSION
171   struct TInstance         *pNext;
172   SANE_Option_Descriptor    aoptDesc[NUM_OPTIONS];
173   Option_Value              aoptVal[NUM_OPTIONS];
174 #endif
175   SANE_Int           agammaY[4096];
176   SANE_Int           agammaR[4096];
177   SANE_Int           agammaG[4096];
178   SANE_Int           agammaB[4096];
179   TScanState         state;
180   TCalibration       calibration;
181   TState             nErrorState;
182   char              *szErrorReason;
183   TBool              bSANE;
184   TScanParam         param;
185   TBool              bWriteRaw;
186   TBool              bVerbose;
187   TBool              bOptSkipOriginate;
188   TQuality           quality;
189   TMode              mode;
190   TModel             model;
191   int                hScanner;
192   FILE              *fhLog;
193   FILE              *fhScan;
194   int                ichPageBuffer; /* write position in full page buffer */
195   int                cchPageBuffer; /* total size of '' */
196   unsigned char     *pchPageBuffer; /* the humble buffer */
197 } TInstance;
198 
199 #define TRUE  1
200 #define FALSE 0
201 
202 /* ====================================================================== */
203 
204 #define ERR_FAILED -1
205 #define OK         0
206 
207 #define NUM_SCANREGS      74
208 
209 /* ====================================================================== */
210 
211 /* note: The first register has address 0x01 */
212 
213 #define R_ALL    0x01
214 
215 /* have to become an enumeration */
216 
217 typedef enum { none, hpos, hposH, hres } TRegIndex;
218 
219 /* WORD */
220 #define R_SPOS   0x01
221 #define R_XRES   0x03
222 /* WORD */
223 #define R_SWID   0x04
224 /* WORD */
225 #define R_STPS   0x06
226 /* WORD */
227 #define R_YRES   0x08
228 /* WORD */
229 #define R_SLEN   0x0A
230 /* WORD*/
231 #define R_INIT   0x12
232 #define RVAL_INIT 0x1540
233 /* RGB */
234 #define R_CCAL   0x2F
235 
236 /* WORD */
237 #define R_CSTAT  0x42
238 #define R_CTL    0x46
239 /* WORD */
240 #define R_POS    0x52
241 /* WORD */
242 #define R_LMP    0x44
243 #define R_QLTY   0x4A
244 #define R_STAT   0x54
245 
246 #define LEN_MAGIC   0x24EA
247 
248 /* ====================================================================== */
249 #define USB_CHUNK_SIZE 0x8000
250 
251 /* sm3600-scanutil.c */
252 __SM3600EXPORT__ int SetError(TInstance *this, int nError, const char *szFormat, ...);
253 __SM3600EXPORT__ void debug_printf(unsigned long ulType, const char *szFormat, ...);
254 __SM3600EXPORT__ TState FreeState(TInstance *this, TState nReturn);
255 __SM3600EXPORT__ TState EndScan(TInstance *this);
256 __SM3600EXPORT__ TState ReadChunk(TInstance *this, unsigned char *achOut,
257 				  int cchMax, int *pcchRead);
258 #ifdef INSANE_VERSION
259 __SM3600EXPORT__ void DumpBuffer(FILE *fh, const char *pch, int cch);
260 __SM3600EXPORT__ TState DoScanFile(TInstance *this);
261 #endif
262 
263 __SM3600EXPORT__ void   GetAreaSize(TInstance *this);
264 __SM3600EXPORT__ void   ResetCalibration(TInstance *this);
265 
266 __SM3600EXPORT__ TState InitGammaTables(TInstance *this,
267 					int nBrightness,
268 					int nContrast);
269 __SM3600EXPORT__ TState CancelScan(TInstance *this);
270 
271 /* sm3600-scanmtek.c */
272 extern unsigned short aidProduct[];
273 __SM3600EXPORT__ TState DoInit(TInstance *this);
274 __SM3600EXPORT__ TState DoReset(TInstance *this);
275 __SM3600EXPORT__ TState WaitWhileBusy(TInstance *this,int cSecs);
276 __SM3600EXPORT__ TState WaitWhileScanning(TInstance *this,int cSecs);
277 __SM3600EXPORT__ TModel GetScannerModel(unsigned short idVendor, unsigned short idProduct);
278 
279 #ifdef INSANE_VERSION
280 __SM3600EXPORT__ TState DoLampSwitch(TInstance *this,int nPattern);
281 #endif
282 __SM3600EXPORT__ TState DoCalibration(TInstance *this);
283 __SM3600EXPORT__ TState UploadGammaTable(TInstance *this, int iByteAddress, SANE_Int *pnGamma);
284 __SM3600EXPORT__ TState UploadGainCorrection(TInstance *this, int iTableOffset);
285 
286 /* sm3600-scanusb.c */
287 __SM3600EXPORT__ TState RegWrite(TInstance *this,int iRegister, int cb, unsigned long ulValue);
288 __SM3600EXPORT__ TState RegWriteArray(TInstance *this,int iRegister, int cb, unsigned char *pchBuffer);
289 #ifdef INSANE_VERSIONx
290 __SM3600EXPORT__ TState RegCheck(TInstance *this,int iRegister, int cch, unsigned long ulValue);
291 __SM3600EXPORT__ int BulkRead(TInstance *this,FILE *fhOut, unsigned int cchBulk);
292 __SM3600EXPORT__ TState MemReadArray(TInstance *this, int iAddress, int cb, unsigned char *pchBuffer);
293 #endif
294 __SM3600EXPORT__ int BulkReadBuffer(TInstance *this,unsigned char *puchBufferOut, unsigned int cchBulk); /* gives count */
295 __SM3600EXPORT__ unsigned int RegRead(TInstance *this,int iRegister, int cch);
296 __SM3600EXPORT__ TState MemWriteArray(TInstance *this, int iAddress, int cb, unsigned char *pchBuffer);
297 
298 /* sm3600-gray.c */
299 __SM3600EXPORT__ TState StartScanGray(TInstance *this);
300 /* sm3600-color.c */
301 __SM3600EXPORT__ TState StartScanColor(TInstance *this);
302 
303 /* sm3600-homerun.c */
304 #ifdef INSANE_VERSION
305 __SM3600EXPORT__ TState FakeCalibration(TInstance *this);
306 #endif
307 
308 __SM3600EXPORT__ TState DoOriginate(TInstance *this, TBool bStepOut);
309 __SM3600EXPORT__ TState DoJog(TInstance *this,int nDistance);
310 
311 /* ====================================================================== */
312 
313 #endif
314