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