xref: /third_party/backends/backend/sp15c.h (revision 141cc406)
1#ifndef SP15C_H
2#define SP15C_H
3
4/* sane - Scanner Access Now Easy.
5
6   This file is part of the SANE package.
7
8   This program is free software; you can redistribute it and/or
9   modify it under the terms of the GNU General Public License as
10   published by the Free Software Foundation; either version 2 of the
11   License, or (at your option) any later version.
12
13   This program is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16   General Public License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with this program.  If not, see <https://www.gnu.org/licenses/>.
20
21   As a special exception, the authors of SANE give permission for
22   additional uses of the libraries contained in this release of SANE.
23
24   The exception is that, if you link a SANE library with other files
25   to produce an executable, this does not by itself cause the
26   resulting executable to be covered by the GNU General Public
27   License.  Your use of that executable is in no way restricted on
28   account of linking the SANE library code into it.
29
30   This exception does not, however, invalidate any other reasons why
31   the executable file might be covered by the GNU General Public
32   License.
33
34   If you submit changes to SANE to the maintainers to be included in
35   a subsequent release, you agree by submitting the changes that
36   those changes may be distributed with this exception intact.
37
38   If you write modifications of your own for SANE, it is your choice
39   whether to permit this exception to apply to your modifications.
40   If you do not wish that, delete this exception notice.
41
42   This file implements a SANE backend for Fujitsu ScanParner 15c
43   flatbed/ADF scanners.  It was derived from the COOLSCAN driver.
44   Written by Randolph Bentson <bentson@holmsjoen.com> */
45
46/* ------------------------------------------------------------------------- */
47/*
48 * Revision 1.8  2008/05/15 12:50:24  ellert-guest
49 * Fix for bug #306751: sanei-thread with pthreads on 64 bit
50 *
51 * Revision 1.7  2005-09-19 19:57:48  fzago-guest
52 * Replaced __unused__ with __sane_unused__ to avoid a namespace conflict.
53 *
54 * Revision 1.6  2004/11/13 19:53:04  fzago-guest
55 * Fixes some warnings.
56 *
57 * Revision 1.5  2004/05/23 17:28:56  hmg-guest
58 * Use sanei_thread instead of fork() in the unmaintained backends.
59 * Patches from Mattias Ellert (bugs: 300635, 300634, 300633, 300629).
60 *
61 * Revision 1.4  2003/12/27 17:48:38  hmg-guest
62 * Silenced some compilation warnings.
63 *
64 * Revision 1.3  2000/08/12 15:09:42  pere
65 * Merge devel (v1.0.3) into head branch.
66 *
67 * Revision 1.1.2.3  2000/03/14 17:47:14  abel
68 * new version of the Sharp backend added.
69 *
70 * Revision 1.1.2.2  2000/01/26 03:51:50  pere
71 * Updated backends sp15c (v1.12) and m3096g (v1.11).
72 *
73 * Revision 1.7  2000/01/05 05:22:26  bentson
74 * indent to barfable GNU style
75 *
76 * Revision 1.6  1999/12/03 20:57:13  bentson
77 * add MEDIA CHECK command
78 *
79 * Revision 1.5  1999/11/24 15:55:56  bentson
80 * remove some debug stuff; rename function
81 *
82 * Revision 1.4  1999/11/23 18:54:26  bentson
83 * tidy up function types for constraint checking
84 *
85 * Revision 1.3  1999/11/23 06:41:54  bentson
86 * add debug flag to interface
87 *
88 * Revision 1.2  1999/11/22 18:15:20  bentson
89 * more work on color support
90 *
91 * Revision 1.1  1999/11/19 15:09:08  bentson
92 * cribbed from m3096g
93 *
94 */
95
96static const SANE_Device **devlist = NULL;
97static int num_devices;
98static struct sp15c *first_dev;
99
100enum sp15c_Option
101  {
102    OPT_NUM_OPTS = 0,
103
104    OPT_MODE_GROUP,
105    OPT_SOURCE,
106    OPT_MODE,
107    OPT_TYPE,
108    OPT_X_RES,
109    OPT_Y_RES,
110    OPT_PRESCAN,
111    OPT_PREVIEW_RES,
112
113    OPT_GEOMETRY_GROUP,
114    OPT_TL_X,			/* in mm/2^16 */
115    OPT_TL_Y,			/* in mm/2^16 */
116    OPT_BR_X,			/* in mm/2^16 */
117    OPT_BR_Y,			/* in mm/2^16 */
118
119    OPT_ENHANCEMENT_GROUP,
120    OPT_AVERAGING,
121    OPT_BRIGHTNESS,
122    OPT_THRESHOLD,
123
124    OPT_ADVANCED_GROUP,
125    OPT_PREVIEW,
126
127    /* must come last: */
128    NUM_OPTIONS
129  };
130
131struct sp15c
132  {
133    struct sp15c *next;
134
135    SANE_Option_Descriptor opt[NUM_OPTIONS];
136    SANE_Device sane;
137
138    char vendor[9];
139    char product[17];
140    char version[5];
141
142    char *devicename;		/* name of the scanner device */
143    int sfd;			/* output file descriptor, scanner device */
144    int pipe;
145    int reader_pipe;
146
147    int scanning;		/* "in progress" flag */
148    int autofeeder;		/* detected */
149    int use_adf;		/* requested */
150    SANE_Pid reader_pid;	/* child is running */
151    int prescan;		/* ??? */
152
153/***** terms for "set window" command *****/
154    int x_res;			/* resolution in */
155    int y_res;			/* pixels/inch */
156    int tl_x;			/* top left position, */
157    int tl_y;			/* in inch/1200 units */
158    int br_x;			/* bottom right position, */
159    int br_y;			/* in inch/1200 units */
160
161    int brightness;
162    int threshold;
163    int contrast;
164    int composition;
165    int bitsperpixel;		/* at the scanner interface */
166    int halftone;
167    int rif;
168    int bitorder;
169    int compress_type;
170    int compress_arg;
171    int vendor_id_code;
172    int outline;
173    int emphasis;
174    int auto_sep;
175    int mirroring;
176    int var_rate_dyn_thresh;
177    int white_level_follow;
178    int subwindow_list;
179    int paper_size;
180    int paper_width_X;
181    int paper_length_Y;
182/***** end of "set window" terms *****/
183
184    /* buffer used for scsi-transfer */
185    unsigned char *buffer;
186    unsigned int row_bufsize;
187
188  };
189
190/* ------------------------------------------------------------------------- */
191
192#define length_quant SANE_UNFIX(SANE_FIX(MM_PER_INCH / 1200.0))
193#define mmToIlu(mm) ((mm) / length_quant)
194#define iluToMm(ilu) ((ilu) * length_quant)
195#define SP15C_CONFIG_FILE "sp15c.conf"
196
197/* ------------------------------------------------------------------------- */
198
199SANE_Status
200sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize);
201
202SANE_Status
203sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only);
204
205SANE_Status
206sane_open (SANE_String_Const name, SANE_Handle * handle);
207
208SANE_Status
209sane_set_io_mode (SANE_Handle h, SANE_Bool non_blocking);
210
211SANE_Status
212sane_get_select_fd (SANE_Handle h, SANE_Int * fdp);
213
214const SANE_Option_Descriptor *
215  sane_get_option_descriptor (SANE_Handle handle, SANE_Int option);
216
217SANE_Status
218sane_control_option (SANE_Handle handle, SANE_Int option,
219		     SANE_Action action, void *val, SANE_Int * info);
220
221SANE_Status
222sane_start (SANE_Handle handle);
223
224SANE_Status
225sane_get_parameters (SANE_Handle handle, SANE_Parameters * params);
226
227SANE_Status
228sane_read (SANE_Handle handle, SANE_Byte * buf,
229	   SANE_Int max_len, SANE_Int * len);
230
231void
232  sane_cancel (SANE_Handle h);
233
234void
235  sane_close (SANE_Handle h);
236
237void
238  sane_exit (void);
239
240/* ------------------------------------------------------------------------- */
241
242static SANE_Status
243  attach_scanner (const char *devicename, struct sp15c **devp);
244
245static SANE_Status
246  sense_handler (int scsi_fd, u_char * result, void *arg);
247
248static int
249  request_sense_parse (u_char * sensed_data);
250
251static SANE_Status
252  sp15c_identify_scanner (struct sp15c *s);
253
254static SANE_Status
255  sp15c_do_inquiry (struct sp15c *s);
256
257static SANE_Status
258  do_scsi_cmd (int fd, unsigned char *cmd, int cmd_len, unsigned char *out, size_t out_len);
259
260static void
261  hexdump (int level, char *comment, unsigned char *p, int l);
262
263static SANE_Status
264  init_options (struct sp15c *scanner);
265
266static int
267  sp15c_check_values (struct sp15c *s);
268
269static int
270  sp15c_grab_scanner (struct sp15c *s);
271
272static int
273  sp15c_free_scanner (struct sp15c *s);
274
275static int
276  wait_scanner (struct sp15c *s);
277
278static int __sane_unused__
279  sp15c_object_position (struct sp15c *s);
280
281static SANE_Status
282  do_cancel (struct sp15c *scanner);
283
284static void
285  swap_res (struct sp15c *s);
286
287static int __sane_unused__
288  sp15c_object_discharge (struct sp15c *s);
289
290static int
291  sp15c_set_window_param (struct sp15c *s, int prescan);
292
293static size_t
294  max_string_size (const SANE_String_Const strings[]);
295
296static int
297  sp15c_start_scan (struct sp15c *s);
298
299static int
300  reader_process (void *scanner);
301
302static SANE_Status
303  do_eof (struct sp15c *scanner);
304
305static int
306  pixels_per_line (struct sp15c *s);
307
308static int
309  lines_per_scan (struct sp15c *s);
310
311static int
312  bytes_per_line (struct sp15c *s);
313
314static void
315  sp15c_trim_rowbufsize (struct sp15c *s);
316
317static int
318  sp15c_read_data_block (struct sp15c *s, unsigned int length);
319
320static SANE_Status
321  attach_one (const char *name);
322
323static void
324  adjust_width (struct sp15c *s, SANE_Int * info);
325
326static SANE_Status
327  apply_constraints (struct sp15c *s, SANE_Int opt,
328		     SANE_Int * target, SANE_Word * info);
329
330static int
331  sp15c_media_check (struct sp15c *s);
332
333#endif /* SP15C_H */
334