xref: /third_party/backends/backend/epson2.h (revision 141cc406)
1/*
2 * epson2.h - SANE library for Epson scanners.
3 *
4 * Based on Kazuhiro Sasayama previous
5 * Work on epson.[ch] file from the SANE package.
6 * Please see those files for original copyrights.
7 *
8 * Copyright (C) 2006 Tower Technologies
9 * Author: Alessandro Zummo <a.zummo@towertech.it>
10 *
11 * This file is part of the SANE package.
12 *
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License as
15 * published by the Free Software Foundation, version 2.
16 */
17
18#ifndef epson2_h
19#define epson2_h
20
21#undef BACKEND_NAME
22#define BACKEND_NAME epson2
23#define DEBUG_NOT_STATIC
24
25#define mode_params epson2_mode_params
26#define source_list epson2_source_list
27
28#ifdef HAVE_SYS_IOCTL_H
29#include <sys/ioctl.h>
30#endif
31
32#ifdef HAVE_STDDEF_H
33#include <stddef.h>
34#endif
35
36#ifdef HAVE_STDLIB_H
37#include <stdlib.h>
38#endif
39
40#ifdef NEED_SYS_TYPES_H
41#include <sys/types.h>
42#endif
43
44#include <string.h> /* for memset and memcpy */
45#include <stdio.h>
46
47#include "sane/sane.h"
48#include "sane/sanei_backend.h"
49#include "sane/sanei_debug.h"
50
51#define EPSON2_CONFIG_FILE "epson2.conf"
52
53#ifndef PATH_MAX
54#define PATH_MAX (1024)
55#endif
56
57#ifndef XtNumber
58#define XtNumber(x)  (sizeof(x) / sizeof(x[0]))
59#define XtOffset(p_type, field)  ((size_t)&(((p_type)NULL)->field))
60#define XtOffsetOf(s_type, field)  XtOffset(s_type*, field)
61#endif
62
63#define NUM_OF_HEX_ELEMENTS (16)        /* number of hex numbers per line for data dump */
64#define DEVICE_NAME_LEN (16)    /* length of device name in extended status */
65
66
67/* string constants for GUI elements that are not defined SANE-wide */
68
69#define SANE_NAME_GAMMA_CORRECTION "gamma-correction"
70#define SANE_TITLE_GAMMA_CORRECTION SANE_I18N("Gamma Correction")
71#define SANE_DESC_GAMMA_CORRECTION SANE_I18N("Selects the gamma correction value from a list of pre-defined devices or the user defined table, which can be downloaded to the scanner")
72
73#define SANE_EPSON_FOCUS_NAME "focus-position"
74#define SANE_EPSON_FOCUS_TITLE SANE_I18N("Focus Position")
75#define SANE_EPSON_FOCUS_DESC SANE_I18N("Sets the focus position to either the glass or 2.5mm above the glass")
76#define SANE_EPSON_WAIT_FOR_BUTTON_NAME "wait-for-button"
77#define SANE_EPSON_WAIT_FOR_BUTTON_TITLE SANE_I18N("Wait for Button")
78#define SANE_EPSON_WAIT_FOR_BUTTON_DESC SANE_I18N("After sending the scan command, wait until the button on the scanner is pressed to actually start the scan process.");
79
80/* misc constants */
81
82#define LINES_SHUFFLE_MAX	17	/* 2 x 8 lines plus 1 */
83#define SANE_EPSON_MAX_RETRIES	14	/* warmup max retry */
84#define CMD_SIZE_EXT_STATUS	42
85
86#define FOCUS_ON_GLASS 64
87#define FOCUS_ABOVE_25MM (64 + 25)
88
89/* NOTE: you can find these codes with "man ascii". */
90#define STX	0x02
91#define ACK	0x06
92#define NAK	0x15
93#define CAN	0x18
94#define ESC	0x1B
95#define PF	0x19
96#define FS	0x1C
97
98#define	S_ACK	"\006"
99#define	S_CAN	"\030"
100
101/* status bits */
102
103#define STATUS_FER		0x80	/* fatal error */
104#define STATUS_NOT_READY	0x40	/* scanner is in use on another interface */
105#define STATUS_AREA_END		0x20	/* area end */
106#define STATUS_OPTION		0x10	/* option installed */
107#define STATUS_EXT_COMMANDS	0x02	/* scanners supports extended commands */
108#define STATUS_RESERVED		0x01	/* this should be always 0 */
109
110#define EXT_STATUS_FER		0x80	/* fatal error */
111#define EXT_STATUS_FBF		0x40	/* flat bed scanner */
112#define EXT_STATUS_ADFT		0x20	/* page type ADF */
113#define EXT_STATUS_ADFS		0x10	/* ADF is duplex capable */
114#define EXT_STATUS_ADFO		0x08	/* ADF loads from the first sheet (page type only) */
115#define EXT_STATUS_LID		0x04	/* lid is open */
116#define EXT_STATUS_WU		0x02	/* warming up */
117#define EXT_STATUS_PB		0x01	/* scanner has a push button */
118
119#define EXT_STATUS_IST		0x80	/* option detected */
120#define EXT_STATUS_EN		0x40	/* option enabled */
121#define EXT_STATUS_ERR		0x20	/* other error */
122#define EXT_STATUS_PE		0x08	/* no paper */
123#define EXT_STATUS_PJ		0x04	/* paper jam */
124#define EXT_STATUS_OPN		0x02	/* cover open */
125
126#define EXT_IDTY_CAP1_DLF	0x80
127#define EXT_IDTY_CAP1_NOTFBF	0x40	/* not a flat bed scanner */
128#define EXT_IDTY_CAP1_ADFT	0x20	/* page type ADF ? */
129#define EXT_IDTY_CAP1_ADFS	0x10	/* ADF is duplex capable */
130#define EXT_IDTY_CAP1_ADFO	0x08	/* ADF loads from the first sheet (page type only) */
131#define EXT_IDTY_CAP1_LID	0x04	/* lid type option ? */
132#define EXT_IDTY_CAP1_TPIR	0x02	/* TPU with infrared */
133#define EXT_IDTY_CAP1_PB	0x01	/* scanner has a push button */
134
135#define EXT_IDTY_CAP2_AFF	0x04	/* auto form feed */
136#define EXT_IDTY_CAP2_DFD	0x08	/* double feed detection */
137#define EXT_IDTY_CAP2_ADFAS	0x10	/* ADF with auto scan support */
138
139#define FSF_STATUS_MAIN_FER	0x80	/* system error */
140#define FSF_STATUS_MAIN_NR	0x40	/* not ready */
141#define FSF_STATUS_MAIN_WU	0x02	/* warming up */
142#define FSF_STATUS_MAIN_CWU	0x01	/* warm up can be cancelled (?) */
143
144#define FSF_STATUS_ADF_IST	0x80	/* installed */
145#define FSF_STATUS_ADF_EN	0x40	/* enabled */
146#define FSF_STATUS_ADF_ERR	0x20	/* system error */
147#define FSF_STATUS_ADF_PE	0x08	/* paper empty */
148#define FSF_STATUS_ADF_PJ	0x04	/* paper jam */
149#define FSF_STATUS_ADF_OPN	0x02	/* cover open */
150#define FSF_STATUS_ADF_PAG	0x01	/* duplex */
151
152#define FSF_STATUS_TPU_IST	0x80	/* installed */
153#define FSF_STATUS_TPU_EN	0x40	/* enabled */
154#define FSF_STATUS_TPU_ERR	0x20	/* system error */
155#define FSF_STATUS_TPU_OPN	0x02	/* cover open */
156
157#define FSF_STATUS_MAIN2_ERR	0x20	/* system error */
158#define FSF_STATUS_MAIN2_PE	0x08	/* paper empty */
159#define FSF_STATUS_MAIN2_PJ	0x04	/* paper jam */
160#define FSF_STATUS_MAIN2_OPN	0x02	/* cover open */
161
162#define FSG_STATUS_FER		0x80
163#define FSG_STATUS_NOT_READY	0x40	/* in use via other interface */
164#define FSG_STATUS_CANCEL_REQ	0x10	/* cancel request from scanner */
165
166#define EPSON_LEVEL_A1		 0
167#define EPSON_LEVEL_A2		 1
168#define EPSON_LEVEL_B1		 2
169#define	EPSON_LEVEL_B2		 3
170#define	EPSON_LEVEL_B3		 4
171#define	EPSON_LEVEL_B4		 5
172#define	EPSON_LEVEL_B5		 6
173#define	EPSON_LEVEL_B6		 7
174#define	EPSON_LEVEL_B7		 8
175#define	EPSON_LEVEL_B8		 9
176#define	EPSON_LEVEL_F5		10
177#define EPSON_LEVEL_D1		11
178#define EPSON_LEVEL_D7		12
179#define EPSON_LEVEL_D8		13
180
181/* there is also a function level "A5", which I'm ignoring here until somebody can
182 * convince me that this is still needed. The A5 level was for the GT-300, which
183 * was (is) a monochrome only scanner. So if somebody really wants to use this
184 * scanner with SANE get in touch with me and we can work something out - khk
185 */
186
187#define	EPSON_LEVEL_DEFAULT EPSON_LEVEL_B3
188
189struct EpsonCmd
190{
191        char *level;
192
193        unsigned char request_identity;
194	unsigned char request_identity2; /* new request identity level Dx */
195	unsigned char request_status;
196	unsigned char request_condition;
197	unsigned char set_color_mode;
198	unsigned char start_scanning;
199	unsigned char set_data_format;
200	unsigned char set_resolution;
201	unsigned char set_zoom;
202	unsigned char set_scan_area;
203	unsigned char set_bright;
204	SANE_Range bright_range;
205	unsigned char set_gamma;
206	unsigned char set_halftoning;
207	unsigned char set_color_correction;
208	unsigned char initialize_scanner;
209	unsigned char set_speed;	/* B4 and later */
210	unsigned char set_lcount;
211	unsigned char mirror_image;	/* B5 and later */
212	unsigned char set_gamma_table;	/* B4 and later */
213	unsigned char set_outline_emphasis; /* B4 and later */
214	unsigned char set_dither;	/* B4 and later */
215	unsigned char set_color_correction_coefficients; /* B3 and later */
216	unsigned char request_extended_status;	/* get extended status from scanner */
217	unsigned char control_an_extension;	/* for extension control */
218	unsigned char eject;			/* for extension control */
219	unsigned char feed;
220	unsigned char request_push_button_status;
221	unsigned char control_auto_area_segmentation;
222	unsigned char set_film_type;		/* for extension control */
223	unsigned char set_exposure_time;	/* F5 only */
224	unsigned char set_bay;			/* F5 only */
225	unsigned char set_threshold;
226	unsigned char set_focus_position;	/* B8 only */
227	unsigned char request_focus_position;	/* B8 only */
228	unsigned char request_extended_identity;
229	unsigned char request_scanner_status;
230};
231
232enum {
233	OPT_NUM_OPTS = 0,
234	OPT_MODE_GROUP,
235	OPT_MODE,
236	OPT_BIT_DEPTH,
237	OPT_HALFTONE,
238	OPT_DROPOUT,
239	OPT_BRIGHTNESS,
240	OPT_SHARPNESS,
241	OPT_GAMMA_CORRECTION,
242	OPT_COLOR_CORRECTION,
243	OPT_RESOLUTION,
244	OPT_THRESHOLD,
245	OPT_ADVANCED_GROUP,
246	OPT_MIRROR,
247	OPT_AAS,
248	OPT_GAMMA_VECTOR_R,
249	OPT_GAMMA_VECTOR_G,
250	OPT_GAMMA_VECTOR_B,
251	OPT_WAIT_FOR_BUTTON,
252	OPT_CCT_GROUP,
253	OPT_CCT_MODE,
254	OPT_CCT_PROFILE,
255	OPT_PREVIEW_GROUP,
256	OPT_PREVIEW,
257	OPT_GEOMETRY_GROUP,
258	OPT_TL_X,
259	OPT_TL_Y,
260	OPT_BR_X,
261	OPT_BR_Y,
262	OPT_FOCUS_GROUP,
263	OPT_AUTOFOCUS,
264	OPT_FOCUS_POS,
265	OPT_EQU_GROUP,
266	OPT_SOURCE,
267	OPT_AUTO_EJECT,
268	OPT_FILM_TYPE,
269	OPT_BAY,
270	OPT_EJECT,
271	OPT_ADF_MODE,
272	NUM_OPTIONS
273};
274
275typedef enum
276{	/* hardware connection to the scanner */
277	SANE_EPSON_NODEV,	/* default, no HW specified yet */
278	SANE_EPSON_SCSI,	/* SCSI interface */
279	SANE_EPSON_PIO,		/* parallel interface */
280	SANE_EPSON_USB,		/* USB interface */
281	SANE_EPSON_NET		/* network interface */
282} Epson_Connection_Type;
283
284struct epson_profile
285{
286	unsigned int	model;
287	double		cct[4][9];
288};
289
290enum {
291	CCTP_REFLECTIVE = 0, CCTP_COLORNEG,
292	CCTP_MONONEG, CCTP_COLORPOS
293};
294
295struct epson_profile_map
296{
297        char		*name;
298        unsigned int	id;
299};
300
301extern const struct epson_profile epson_cct_profiles[];
302extern const struct epson_profile_map epson_cct_models[];
303
304/* hardware description */
305
306struct Epson_Device
307{
308	struct Epson_Device *next;
309
310	char *name;
311	char *model;
312
313	unsigned int model_id;
314
315	SANE_Device sane;
316	SANE_Int level;
317	SANE_Range dpi_range;
318
319	SANE_Range *x_range;	        /* x range w/out extension */
320	SANE_Range *y_range;	        /* y range w/out extension */
321
322	SANE_Range fbf_x_range;	        /* flattbed x range */
323	SANE_Range fbf_y_range;	        /* flattbed y range */
324	SANE_Range adf_x_range;	        /* autom. document feeder x range */
325	SANE_Range adf_y_range;	        /* autom. document feeder y range */
326	SANE_Range tpu_x_range;	        /* transparency unit x range */
327	SANE_Range tpu_y_range;	        /* transparency unit y range */
328	SANE_Range tpu2_x_range;	/* transparency unit 2 x range */
329	SANE_Range tpu2_y_range;	/* transparency unit 2 y range */
330
331	Epson_Connection_Type connection;
332
333	SANE_Int *res_list;		/* list of resolutions */
334	SANE_Int res_list_size;		/* number of entries in this list */
335	SANE_Int last_res;		/* last selected resolution */
336	SANE_Int last_res_preview;	/* last selected preview resolution */
337
338	SANE_Word *resolution_list;	/* for display purposes we store a second copy */
339
340	SANE_Bool extension;		/* extension is installed */
341	SANE_Int use_extension;		/* use the installed extension */
342	SANE_Bool TPU;			/* TPU is installed */
343	SANE_Bool TPU2;			/* TPU2 is installed */
344	SANE_Bool ADF;			/* ADF is installed */
345	SANE_Bool duplex;		/* does the ADF handle duplex scanning */
346	SANE_Bool focusSupport;		/* does this scanner have support for "set focus position" ? */
347	SANE_Bool color_shuffle;	/* does this scanner need color shuffling */
348
349	SANE_Int maxDepth;		/* max. color depth */
350	SANE_Int *depth_list;
351
352	SANE_Int optical_res;		/* optical resolution */
353	SANE_Int max_line_distance;
354
355	SANE_Bool need_double_vertical;
356	SANE_Bool need_color_reorder;
357	SANE_Bool need_reset_on_source_change;
358
359	SANE_Bool wait_for_button;	/* do we have to wait until the scanner button is pressed? */
360
361	SANE_Bool extended_commands;
362
363	struct EpsonCmd *cmd;
364	const struct epson_profile *cct_profile;
365};
366
367typedef struct Epson_Device Epson_Device;
368
369/* an instance of a scanner */
370
371struct Epson_Scanner
372{
373	struct Epson_Scanner *next;
374	struct Epson_Device *hw;
375
376	int fd;
377
378	SANE_Option_Descriptor opt[NUM_OPTIONS];
379	Option_Value val[NUM_OPTIONS];
380	SANE_Parameters params;
381
382	SANE_Bool block;
383	SANE_Bool eof;
384	SANE_Byte *buf, *end, *ptr;
385	SANE_Bool canceling;
386	SANE_Word gamma_table[3][256];
387	SANE_Word cct_table[9];
388	SANE_Int retry_count;
389
390	/* buffer lines for color shuffling */
391	SANE_Byte *line_buffer[LINES_SHUFFLE_MAX];
392	SANE_Int color_shuffle_line;	/* current line number for color shuffling */
393	SANE_Int line_distance;		/* current line distance */
394	SANE_Int current_output_line;	/* line counter when color shuffling */
395	SANE_Int lines_written;		/* debug variable */
396
397	SANE_Int left, top, lcount;
398	SANE_Byte currentFocusPosition;
399
400	/* network buffers */
401	unsigned char *netbuf, *netptr;
402	size_t netlen;
403
404	/* extended image data handshaking */
405	SANE_Int ext_block_len;
406	SANE_Int ext_last_len;
407	SANE_Int ext_blocks;
408	SANE_Int ext_counter;
409};
410
411typedef struct Epson_Scanner Epson_Scanner;
412
413struct mode_param
414{
415	int color;
416	int flags;
417	int dropout_mask;
418	int depth;
419};
420
421enum {
422	MODE_BINARY, MODE_GRAY, MODE_COLOR, MODE_INFRARED
423};
424
425#endif
426