/backend/avision.c
C | 8384 lines | 6077 code | 1415 blank | 892 comment | 1112 complexity | 5ce31aefcf994cdcea16ab127327f55a MD5 | raw file
Possible License(s): GPL-2.0, Unlicense
Large files files are truncated, but you can click here to view the full file
- /*******************************************************************************
- * SANE - Scanner Access Now Easy.
- avision.c
- This file is part of the SANE package.
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston,
- MA 02111-1307, USA.
- As a special exception, the authors of SANE give permission for
- additional uses of the libraries contained in this release of SANE.
- The exception is that, if you link a SANE library with other files
- to produce an executable, this does not by itself cause the
- resulting executable to be covered by the GNU General Public
- License. Your use of that executable is in no way restricted on
- account of linking the SANE library code into it.
- This exception does not, however, invalidate any other reasons why
- the executable file might be covered by the GNU General Public
- License.
- If you submit changes to SANE to the maintainers to be included in
- a subsequent release, you agree by submitting the changes that
- those changes may be distributed with this exception intact.
- *****************************************************************************
- This backend is based upon the Tamarack backend and adapted to the Avision
- scanners by René Rebe and Meino Cramer.
-
- This file implements a SANE backend for the Avision SCSI Scanners (like the
- AV 630 / 620 (CS) ...) and some Avision (OEM) USB scanners (like the HP 53xx,
- 74xx, Minolta FS-V1 ...) or Fujitsu ScanPartner with the AVISION SCSI-2/3
- or USB command set.
-
- Copyright 1999, 2000, 2001 by
- "René Rebe" <rene@exactcode.de>
- "Meino Christian Cramer" <mccramer@s.netic.de>
- Copyright 2002 by
- "René Rebe" <rene@exactcode.de>
- "Jose Paulo Moitinho de Almeida" <moitinho@civil.ist.utl.pt>
-
- Copyright 2003, 2004, 2005, 2006, 2007 by
- "René Rebe" <rene@exactcode.de>
-
- Additional Contributers:
- "Gunter Wagner"
- (some fixes and the transparency option)
- "Martin Jelínek" <mates@sirrah.troja.mff.cuni.cz>
- nice attach debug output
- "Marcin Siennicki" <m.siennicki@cloos.pl>
- found some typos and contributed fixes for the HP 7400
- "Frank Zago" <fzago@greshamstorage.com>
- Mitsubishi IDs and report
- Avision INC
- example code to handle calibration and C5 ASIC specifics
- "Franz Bakan" <fbakan@gmx.net>
- OS/2 threading support
- "Falk Rohsiepe"
- Spelling and whitespace as well as HP5370 quirks
-
- Many additinoal special thanks to:
- Avision INC for providing protocol documentation.
- Avision INC for sponsoring an AV 8000S with ADF.
- Avision Europe and BHS Binkert for sponsoring several more scanners.
- Archivista GmbH, Switzerland, for sponsoring several features
- Roberto Di Cosmo who sponsored a HP 5370 scanner.
- Oliver Neukum who sponsored a HP 5300 USB scanner.
- Matthias Wiedemann for lending his HP 7450C for some weeks.
- Compusoft, C.A. Caracas / Venezuela for sponsoring a
- HP 7450 scanner and so enhanced ADF support.
- Chris Komatsu for the nice ADF scanning observartion.
- All the many other beta-tester and debug-log sender!
- Thanks to all the people and companies above. Without you
- the Avision backend would not be in the shape it is today! ;-)
-
- ********************************************************************************/
- /* SANE-FLOW-DIAGRAMM (from umax.c)
- *
- * - sane_init() : initialize backend, attach scanners(devicename,0)
- * . - sane_get_devices() : query list of scanner-devices
- * . - sane_open() : open a particular scanner-device and attach_scanner(devicename,&dev)
- * . . - sane_set_io_mode : set blocking-mode
- * . . - sane_get_select_fd : get scanner-fd
- * . . - sane_get_option_descriptor() : get option information
- * . . - sane_control_option() : change option values
- * . .
- * . . - sane_start() : start image aquisition
- * . . - sane_get_parameters() : returns actual scan-parameters
- * . . - sane_read() : read image-data (from pipe)
- *
- * in ADF mode this is done often:
- * . . - sane_start() : start image aquisition
- * . . - sane_get_parameters() : returns actual scan-parameters
- * . . - sane_read() : read image-data (from pipe)
- *
- * . . - sane_cancel() : cancel operation, kill reader_process
- *
- * . - sane_close() : close opened scanner-device, do_cancel, free buffer and handle
- * - sane_exit() : terminate use of backend, free devicename and device-struture
- */
- #include "../include/sane/config.h"
- #include <errno.h>
- #include <fcntl.h>
- #include <limits.h>
- #include <signal.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <sys/time.h>
- #include <math.h>
- #define BACKEND_NAME avision
- #define BACKEND_BUILD 290 /* avision backend BUILD version */
- #include <sane/sane.h>
- #include <sane/sanei.h>
- #include <sane/saneopts.h>
- #include <sane/sanei_thread.h>
- #include <sane/sanei_scsi.h>
- #include <sane/sanei_usb.h>
- #include <sane/sanei_config.h>
- #include <sane/sanei_backend.h>
- #include <avision.h>
- /* For timeval... */
- #ifdef DEBUG
- #include <sys/time.h>
- #endif
- /* Attention: The comments must stay as they are - they are automatially parsed
- to generate the SANE avision.desc file, as well as HTML online content! */
- /* Attention2: This device table is part of the source code and as such
- licensed under the terms of the license as listed above (GPL2+). By
- using this data you obviously create derived work! -ReneR */
- static Avision_HWEntry Avision_Device_List [] =
- {
- { "AVISION", "AV100CS",
- 0, 0,
- "Avision", "AV100CS",
- 0},
- /* status="untested" */
-
- { "AVISION", "AV100IIICS",
- 0, 0,
- "Avision", "AV100IIICS",
- 0},
- /* status="untested" */
-
- { "AVISION", "AV100S",
- 0, 0,
- "Avision", "AV100S",
- 0},
- /* status="untested" */
- { NULL, NULL,
- 0x0638, 0x0A27,
- "Avision", "AV120",
- AV_INT_STATUS},
- /* comment="sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x0638, 0x0A3C,
- "Avision", "AV121",
- AV_INT_BUTTON | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA},
- /* comment="sheetfed scanner" */
- /* status="good" */
- { NULL, NULL,
- 0x0638, 0x0A33,
- "Avision", "AV122",
- AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_NO_REAR | AV_SOFT_SCALE | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_REAR_OFFSET},
- /* comment="sheetfed duplex scanner" */
- /* status="good" */
-
- { NULL, NULL,
- 0x0638, 0x0A93,
- "Avision", "AV122 C2",
- AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_NO_REAR | AV_SOFT_SCALE | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_REAR_OFFSET},
- /* comment="sheetfed duplex scanner" */
- /* status="good" */
- { NULL, NULL,
- 0x0638, 0x0A24,
- "Avision", "AV210",
- AV_INT_BUTTON | AV_ACCEL_TABLE},
- /* comment="sheetfed scanner" */
- /* status="complete" */
-
- { NULL, NULL,
- 0x0638, 0x0A25,
- "Avision", "AV210",
- AV_INT_BUTTON | AV_ACCEL_TABLE | AV_NO_64BYTE_ALIGN},
- /* comment="sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x0638, 0x0A3A,
- "Avision", "AV210C2",
- AV_INT_BUTTON | AV_GRAY_MODES},
- /* comment="sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x0638, 0x0A2F,
- "Avision", "AV210C2-G",
- AV_INT_BUTTON | AV_GRAY_MODES},
- /* comment="sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x0638, 0x0A3A,
- "Avision", "AV210C2",
- AV_INT_BUTTON | AV_GRAY_MODES},
- /* comment="sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x0638, 0x0A23,
- "Avision", "AV220",
- AV_INT_BUTTON},
- /* comment="duplex! sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x0638, 0x0A2A,
- "Avision", "AV220C2",
- AV_INT_BUTTON | AV_CANCEL_BUTTON},
- /* comment="duplex! sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x0638, 0x0A2B,
- "Avision", "AV220D2",
- AV_INT_BUTTON | AV_CANCEL_BUTTON},
- /* comment="duplex! sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x0638, 0x0A2C,
- "Avision", "AV220+",
- AV_INT_BUTTON | AV_CANCEL_BUTTON},
- /* comment="duplex! sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x0638, 0x0A2D,
- "Avision", "AV220C2-G",
- AV_INT_BUTTON | AV_CANCEL_BUTTON},
- /* comment="duplex! sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x0638, 0x0A2E,
- "Avision", "AV220C2-B",
- AV_INT_BUTTON | AV_CANCEL_BUTTON},
- /* comment="duplex! sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x0638, 0x0A94,
- "Avision", "AV220-G",
- AV_INT_BUTTON},
- /* comment="duplex! sheetfed scanner" */
- /* status="complete" */
- { "AVISION", "AV240SC",
- 0, 0,
- "Avision", "AV240SC",
- 0},
- /* status="untested" */
-
- { "AVISION", "AV260CS",
- 0, 0,
- "Avision", "AV260CS",
- 0},
- /* status="untested" */
-
- { "AVISION", "AV360CS",
- 0, 0,
- "Avision", "AV360CS",
- 0},
- /* status="untested" */
-
- { "AVISION", "AV363CS",
- 0, 0,
- "Avision", "AV363CS",
- 0},
- /* status="untested" */
-
- { "AVISION", "AV420CS",
- 0, 0,
- "Avision", "AV420CS",
- 0},
- /* status="untested" */
-
- { "AVISION", "AV6120",
- 0, 0,
- "Avision", "AV6120",
- 0},
- /* status="untested" */
-
- { NULL, "AV610",
- 0x0638, 0x0a18,
- "Avision", "AV610",
- AV_GRAY_CALIB_BLUE | AV_ACCEL_TABLE | AV_NO_64BYTE_ALIGN | AV_INT_STATUS | AV_INT_BUTTON},
- /* status="good" */
- { NULL, NULL,
- 0x0638, 0x0a18,
- "Avision", "AV600U Plus",
- AV_GRAY_CALIB_BLUE | AV_ACCEL_TABLE | AV_NO_64BYTE_ALIGN | AV_INT_STATUS | AV_INT_BUTTON},
- /* status="good" */
- { NULL, NULL,
- 0x0638, 0x0a5e,
- "Avision", "AV610C2",
- AV_NO_BACKGROUND | AV_INT_BUTTON}, /* cancel button -> sense abort! */
- /* status="good" */
- { NULL, NULL,
- 0x0638, 0x0a41,
- "Avision", "AM3000 Series",
- 0},
- /* comment="MFD" */
- /* status="basic" */
- { NULL, NULL,
- 0x0638, 0x0a16,
- "Avision", "DS610CU Scancopier",
- AV_INT_STATUS},
- /* comment="1 pass, 600 dpi, A4" */
- /* status="good" */
- { "AVISION", "AV620CS",
- 0, 0,
- "Avision", "AV620CS",
- 0},
- /* comment="1 pass, 600 dpi" */
- /* status="complete" */
-
- { "AVISION", "AV620CS Plus",
- 0, 0,
- "Avision", "AV620CS Plus",
- 0},
- /* comment="1 pass, 1200 dpi" */
- /* status="complete" */
-
- { "AVISION", "AV630CS",
- 0, 0,
- "Avision", "AV630CS",
- 0},
- /* comment="1 pass, 1200 dpi - regularly tested" */
- /* status="complete" */
-
- { "AVISION", "AV630CSL",
- 0, 0,
- "Avision", "AV630CSL",
- 0},
- /* comment="1 pass, 1200 dpi" */
- /* status="untested" */
-
- { "AVISION", "AV6240",
- 0, 0,
- "Avision", "AV6240",
- 0},
- /* comment="1 pass, ??? dpi" */
- /* status="complete" */
-
- { NULL, NULL,
- 0x0638, 0x0A13,
- "Avision", "AV600U",
- AV_MULTI_CALIB_CMD | AV_ADF_BGR_ORDER_INVERT | AV_SOFT_SCALE | AV_INT_STATUS | AV_NO_BUTTON},
- /* comment="1 pass, 600 dpi" */
- /* status="good" */
- { "AVISION", "AV660S",
- 0, 0,
- "Avision", "AV660S",
- 0},
- /* comment="1 pass, ??? dpi" */
- /* status="untested" */
- { "AVISION", "AV680S",
- 0, 0,
- "Avision", "AV680S",
- 0},
- /* comment="1 pass, ??? dpi" */
- /* status="untested" */
-
- { "AVISION", "AV690U",
- 0, 0,
- "Avision", "AV690U",
- 0},
- /* comment="1 pass, 2400 dpi" */
- /* status="untested" */
-
- { "AVISION", "AV800S",
- 0, 0,
- "Avision", "AV800S",
- 0},
- /* comment="1 pass, ??? dpi" */
- /* status="untested" */
-
- { "AVISION", "AV810C",
- 0, 0,
- "Avision", "AV810C",
- 0},
- /* comment="1 pass, ??? dpi" */
- /* status="untested" */
-
- { "AVISION", "AV820",
- 0, 0,
- "Avision", "AV820",
- 0},
- /* comment="1 pass, ??? dpi" */
- /* status="untested" */
-
- { "AVISION", "AV820C",
- 0, 0,
- "Avision", "AV820C",
- 0},
- /* comment="1 pass, ??? dpi" */
- /* status="complete" */
-
- { "AVISION", "AV820C Plus",
- 0, 0,
- "Avision", "AV820C Plus",
- 0},
- /* comment="1 pass, ??? dpi" */
- /* status="complete" */
-
- { "AVISION", "AV830C",
- 0, 0,
- "Avision", "AV830C",
- 0},
- /* comment="1 pass, ??? dpi" */
- /* status="complete" */
-
- { "AVISION", "AV830C Plus",
- 0, 0,
- "Avision", "AV830C Plus",
- 0},
- /* comment="1 pass, ??? dpi" */
- /* status="untested" */
-
- { "AVISION", "AV880",
- 0, 0,
- "Avision", "AV880",
- 0},
- /* comment="1 pass, ??? dpi" */
- /* status="untested" */
-
- { "AVISION", "AV880C",
- 0, 0,
- "Avision", "AV880C",
- 0},
- /* comment="1 pass, ??? dpi" */
- /* status="untested" */
- { "AVISION", "AV3200C",
- 0, 0,
- "Avision", "AV3200C",
- AV_NON_INTERLACED_DUPLEX_300 | AV_FASTER_WITH_FILTER},
- /* comment="1 pass, ??? dpi" */
- /* status="complete" */
- { "AVISION", "AV3200SU",
- 0x0638, 0x0A4E,
- "Avision", "AV3200SU",
- 0},
- /* comment="1 pass, ??? dpi" */
- /* status="complete" */
- { "AVISION", "AV3730SU",
- 0x0638, 0x0A4F,
- "Avision", "AV3730SU",
- 0},
- /* comment="1 pass, ??? dpi" */
- /* status="complete" */
- { "AVISION", "AV3750SU",
- 0x0638, 0x0A65,
- "Avision", "AV3750SU",
- 0},
- /* comment="1 pass, ??? dpi" */
- /* status="complete" */
- { "AVISION", "AV3800C",
- 0, 0,
- "Avision", "AV3800C",
- 0},
- /* comment="1 pass, ??? dpi" */
- /* status="complete" */
- { "AVISION", "AV3850SU",
- 0x0638, 0x0a66,
- "Avision", "AV3850SU",
- 0},
- /* comment="1 pass, ??? dpi" */
- /* status="complete" */
- { "AVISION", "FB6000E",
- 0, 0,
- "Avision", "FB6000E",
- AV_NON_INTERLACED_DUPLEX_300},
- /* comment="1 pass, 1200 dpi, A3 - duplex! - zero edge!" */
- /* status="complete" */
- { NULL, NULL,
- 0x0638, 0x0a82,
- "Avision", "FB6080E",
- AV_NON_INTERLACED_DUPLEX_300},
- /* comment="1 pass, 1200 dpi, A3 - duplex! - zero edge!" */
- /* status="complete" */
- { NULL, NULL,
- 0x0638, 0xa84,
- "Avision", "FB2080E",
- 0},
- /* comment="1 pass, 600 dpi, zero-edge" ASIC 7 */
- /* status="basic" */
- { "AVISION", "AV8000S",
- 0, 0,
- "Avision", "AV8000S",
- AV_DOES_NOT_KEEP_WINDOW},
- /* comment="1 pass, 1200 dpi, A3 - regularly tested" */
- /* status="complete" */
- { NULL, NULL,
- 0x0638, 0x0a4d,
- "Avision", "AV8050U",
- AV_NON_INTERLACED_DUPLEX_300 | AV_DOES_NOT_KEEP_GAMMA},
- /* comment="1 pass, 1200 dpi, A3 - duplex!" */
- /* status="complete" */
- { "AVISION", "AV8300",
- 0x0638, 0x0A40,
- "Avision", "AV8300",
- AV_NON_INTERLACED_DUPLEX_300 | AV_DOES_NOT_KEEP_GAMMA},
- /* comment="1 pass, 1200 dpi, A3 - duplex!" */
- /* status="complete" */
- { "AVISION", "AV8350",
- 0x0638, 0x0A68,
- "Avision", "AV8350",
- AV_NON_INTERLACED_DUPLEX_300 | AV_DOES_NOT_KEEP_GAMMA},
- /* comment="1 pass, 1200 dpi, A3 - duplex!" */
- /* status="complete" */
- { NULL, NULL,
- 0x0638, 0x0A61,
- "Avision", "IT8300",
- AV_NON_INTERLACED_DUPLEX_300 | AV_ACCEL_TABLE},
- /* comment="1 pass, 1200 dpi, A3 - duplex!, LCD screen, paper sensors" */
- /* status="good" */
- { NULL, NULL,
- 0x0638, 0x0AA1,
- "Avision", "@V2500",
- 0},
- /* comment="" */
- /* status="untested" */
- { NULL, NULL,
- 0x0638, 0x0A45,
- "Avision", "@V5100",
- 0},
- /* comment="" */
- /* status="good" */
- { "AVISION", "AVA3",
- 0, 0,
- "Avision", "AVA3",
- AV_FORCE_A3},
- /* comment="1 pass, 600 dpi, A3" */
- /* status="basic" */
- /* and possibly more avisions ;-) */
-
- { "HP", "ScanJet 5300C",
- 0x03f0, 0x0701,
- "Hewlett-Packard", "ScanJet 5300C",
- AV_INT_STATUS},
- /* comment="1 pass, 2400 dpi - regularly tested - some FW revisions have x-axis image scaling problems over 1200 dpi" */
- /* status="complete" */
- { "HP", "ScanJet 5370C",
- 0x03f0, 0x0701,
- "Hewlett-Packard", "ScanJet 5370C",
- AV_MULTI_CALIB_CMD | AV_INT_STATUS},
- /* comment="1 pass, 2400 dpi - some FW revisions have x-axis image scaling problems over 1200 dpi" */
- /* status="good" */
-
- { "hp", "scanjet 7400c",
- 0x03f0, 0x0801,
- "Hewlett-Packard", "ScanJet 7400c",
- AV_LIGHT_CHECK_BOGUS | AV_NO_64BYTE_ALIGN | AV_INT_STATUS},
- /* comment="1 pass, 2400 dpi - dual USB/SCSI interface" */
- /* status="good" */
-
- #ifdef FAKE_ENTRIES_FOR_DESC_GENERATION
- { "hp", "scanjet 7450c",
- 0x03f0, 0x0801,
- "Hewlett-Packard", "ScanJet 7450c",
- AV_NO_64BYTE_ALIGN | AV_INT_STATUS},
- /* comment="1 pass, 2400 dpi - dual USB/SCSI interface - regularly tested" */
- /* status="good" */
-
- { "hp", "scanjet 7490c",
- 0x03f0, 0x0801,
- "Hewlett-Packard", "ScanJet 7490c",
- AV_NO_64BYTE_ALIGN | AV_INT_STATUS},
- /* comment="1 pass, 1200 dpi - dual USB/SCSI interface" */
- /* status="good" */
- #endif
- { "HP", "C9930A",
- 0x03f0, 0x0b01,
- "Hewlett-Packard", "ScanJet 8200",
- 0},
- /* comment="1 pass, 4800 (?) dpi - USB 2.0" */
- /* status="good" */
- #ifdef FAKE_ENTRIES_FOR_DESC_GENERATION
- { "HP", "C9930A",
- 0x03f0, 0x0b01,
- "Hewlett-Packard", "ScanJet 8250",
- 0},
- /* comment="1 pass, 4800 (?) dpi - USB 2.0" */
- /* status="good" */
- #endif
- { "HP", "C9930A",
- 0x03f0, 0x3905,
- "Hewlett-Packard", "ScanJet 8270",
- 0},
- /* comment="1 pass, 4800 (?) dpi - USB 2.0" */
- /* status="good" */
- #ifdef FAKE_ENTRIES_FOR_DESC_GENERATION
- { "HP", "C9930A",
- 0x03f0, 0x0b01,
- "Hewlett-Packard", "ScanJet 8290",
- 0},
- /* comment="1 pass, 4800 (?) dpi - USB 2.0 and SCSI - only SCSI tested so far" */
- /* status="good" */
-
- #endif
- { "HP", "C9930A",
- 0x03f0, 0x3805,
- "Hewlett-Packard", "ScanJet 8390",
- 0},
- /* comment="1 pass, 4800 (?) dpi - USB 2.0" */
- /* status="good" */
- { "Minolta", "#2882",
- 0, 0,
- "Minolta", "Dimage Scan Dual I",
- AV_FORCE_FILM | AV_NO_START_SCAN}, /* not AV_FILMSCANNER (no frame control) */
- /* status="basic" */
- { "Minolta", "#2887",
- 0, 0,
- "Minolta", "Scan Multi Pro",
- AV_FORCE_FILM | AV_NO_START_SCAN}, /* AV_FILMSCANNER (rame control)? */
- /* status="untested" */
-
- { "MINOLTA", "FS-V1",
- 0x0638, 0x026a,
- "Minolta", "Dimage Scan Dual II",
- AV_FILMSCANNER | AV_ONE_CALIB_CMD | AV_12_BIT_MODE},
- /* comment="1 pass, film-scanner" */
- /* status="good" */
-
- { "MINOLTA", "Elite II",
- 0x0686, 0x4004,
- "Minolta", "Elite II",
- AV_FILMSCANNER | AV_ONE_CALIB_CMD},
- /* comment="1 pass, film-scanner" */
- /* status="untested" */
-
- { "MINOLTA", "FS-V3",
- 0x0686, 0x400d,
- "Minolta", "Dimage Scan Dual III",
- AV_FILMSCANNER | AV_ONE_CALIB_CMD | AV_ACCEL_TABLE },
- /* comment="1 pass, film-scanner" */
- /* status="good" */
- { "MINOLTA", "FS-V4",
- 0x0686, 0x400e,
- "Minolta", "Dimage Scan Elite 5400",
- AV_FILMSCANNER | AV_ONE_CALIB_CMD | /*AV_ACCEL_TABLE |*/ AV_NO_START_SCAN},
- /* comment="1 pass, film-scanner" */
- /* status="good" */
- { "QMS", "SC-110",
- 0x0638, 0x0a15,
- "Minolta-QMS", "SC-110",
- 0},
- /* comment="" */
- /* status="untested" */
- { "QMS", "SC-215",
- 0x0638, 0x0a16,
- "Minolta-QMS", "SC-215",
- 0},
- /* comment="" */
- /* status="good" */
-
- { "MITSBISH", "MCA-ADFC",
- 0, 0,
- "Mitsubishi", "MCA-ADFC",
- 0},
- /* status="untested" */
-
- { "MITSBISH", "MCA-S1200C",
- 0, 0,
- "Mitsubishi", "S1200C",
- 0},
- /* status="untested" */
-
- { "MITSBISH", "MCA-S600C",
- 0, 0,
- "Mitsubishi", "S600C",
- 0},
- /* status="untested" */
-
- { "MITSBISH", "SS600",
- 0, 0,
- "Mitsubishi", "SS600",
- 0},
- /* status="good" */
-
- /* The next are all untested ... */
-
- { "FCPA", "ScanPartner",
- 0, 0,
- "Fujitsu", "ScanPartner",
- AV_FUJITSU},
- /* status="untested" */
- { "FCPA", "ScanPartner 10",
- 0, 0,
- "Fujitsu", "ScanPartner 10",
- AV_FUJITSU},
- /* status="untested" */
-
- { "FCPA", "ScanPartner 10C",
- 0, 0,
- "Fujitsu", "ScanPartner 10C",
- AV_FUJITSU},
- /* status="untested" */
-
- { "FCPA", "ScanPartner 15C",
- 0, 0,
- "Fujitsu", "ScanPartner 15C",
- AV_FUJITSU},
- /* status="untested" */
-
- { "FCPA", "ScanPartner 300C",
- 0, 0,
- "Fujitsu", "ScanPartner 300C",
- 0},
- /* status="untested" */
-
- { "FCPA", "ScanPartner 600C",
- 0, 0,
- "Fujitsu", "ScanPartner 600C",
- 0},
- /* status="untested" */
- { "FCPA", "ScanPartner 620C",
- 0, 0,
- "Fujitsu", "ScanPartner 620C",
- 0},
- /* status="good" */
-
- { "FCPA", "ScanPartner Jr",
- 0, 0,
- "Fujitsu", "ScanPartner Jr",
- 0},
- /* status="untested" */
-
- { "FCPA", "ScanStation",
- 0, 0,
- "Fujitsu", "ScanStation",
- 0},
- /* status="untested" */
- { NULL, NULL,
- 0x04c5, 0x1029,
- "Fujitsu", "fi-4010CU",
- 0},
- /* status="untested" */
- { NULL, NULL,
- 0x040a, 0x6001,
- "Kodak", "i30",
- AV_INT_BUTTON},
- /* status="untested" */
- { NULL, NULL,
- 0x040a, 0x6002,
- "Kodak", "i40",
- AV_INT_BUTTON},
- /* status="basic" */
-
- { NULL, NULL,
- 0x040a, 0x6003,
- "Kodak", "i50",
- AV_INT_BUTTON},
- /* status="untested" */
-
- { NULL, NULL,
- 0x040a, 0x6003,
- "Kodak", "i55",
- AV_INT_BUTTON},
- /* status="untested" */
-
- { NULL, NULL,
- 0x040a, 0x6004,
- "Kodak", "i60",
- AV_INT_BUTTON},
- /* status="untested" */
-
- { NULL, NULL,
- 0x040a, 0x6004,
- "Kodak", "i65",
- AV_INT_BUTTON},
- /* status="untested" */
-
- { NULL, NULL,
- 0x040a, 0x6005,
- "Kodak", "i80",
- AV_INT_BUTTON},
- /* status="good" */
-
- { "iVina", "1200U",
- 0x0638, 0x0268,
- "iVina", "1200U",
- 0},
- /* status="untested" */
-
- { NULL, NULL,
- 0x04a7, 0x0424,
- "Visioneer", "Strobe XP 450",
- AV_INT_BUTTON | AV_ACCEL_TABLE},
- /* comment="sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x04a7, 0x0491,
- "Visioneer", "Strobe XP 450-G",
- AV_INT_BUTTON | AV_ACCEL_TABLE},
- /* comment="sheetfed scanner" */
- /* status="complete" */
-
- { NULL, NULL,
- 0x04a7, 0x0479,
- "Visioneer", "Strobe XP 470",
- AV_INT_BUTTON | AV_ACCEL_TABLE},
- /* comment="sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x04a7, 0x048F,
- "Visioneer", "Strobe XP 470-G",
- AV_INT_BUTTON | AV_ACCEL_TABLE},
- /* comment="sheetfed scanner" */
- /* status="complete" */
-
- { NULL, NULL,
- 0x04a7, 0x0420,
- "Visioneer", "9320",
- 0},
- /* comment="sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x04a7, 0x0421,
- "Visioneer", "9450",
- 0},
- /* comment="sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x04a7, 0x047A,
- "Visioneer", "9450-G",
- 0},
- /* comment="sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x04a7, 0x0422,
- "Visioneer", "9550",
- 0},
- /* comment="sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x04a7, 0x0390,
- "Visioneer", "9650",
- 0},
- /* comment="sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x04a7, 0x047B,
- "Visioneer", "9650-G",
- 0},
- /* comment="sheetfed scanner" */
- /* status="complete" */
-
- { NULL, NULL,
- 0x04a7, 0x0423,
- "Visioneer", "9750",
- AV_INT_BUTTON},
- /* comment="sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x04a7, 0x0493,
- "Visioneer", "9750-G",
- AV_INT_BUTTON},
- /* comment="sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x04a7, 0x0497,
- "Visioneer", "Patriot 430",
- AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_NO_REAR | AV_SOFT_SCALE | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_REAR_OFFSET},
- /* comment="sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x04a7, 0x048F,
- "Visioneer", "Patriot 470",
- AV_INT_BUTTON},
- /* comment="sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x04a7, 0x0498,
- "Visioneer", "Patriot 680",
- AV_INT_BUTTON},
- /* comment="sheetfed scanner" */
- /* status="complete" */
- { NULL, NULL,
- 0x04a7, 0x0499,
- "Visioneer", "Patriot 780",
- AV_INT_BUTTON},
- /* comment="sheetfed scanner" */
- /* status="complete" */
-
- { NULL, NULL,
- 0x04a7, 0x049C,
- "Xerox", "DocuMate150",
- AV_INT_BUTTON | AV_SOFT_SCALE | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_BACKGROUND_QUIRK},
- /* status="good" */
- { NULL, NULL,
- 0x04a7, 0x0477,
- "Xerox", "DocuMate152",
- AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_NO_REAR | AV_SOFT_SCALE | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_REAR_OFFSET | AV_BACKGROUND_QUIRK},
- /* status="good" */
- { NULL, NULL,
- 0x04a7, 0x049D,
- "Xerox", "DocuMate162",
- AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_NO_REAR | AV_SOFT_SCALE | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_REAR_OFFSET | AV_BACKGROUND_QUIRK},
- /* status="good" */
- { NULL, NULL,
- 0x04a7, 0x0448,
- "Xerox", "DocuMate250",
- AV_INT_BUTTON},
- /* status="good" */
- { NULL, NULL,
- 0x04a7, 0x0490,
- "Xerox", "DocuMate250-G",
- AV_INT_BUTTON},
- /* status="good" */
-
- { NULL, NULL,
- 0x04a7, 0x0449,
- "Xerox", "DocuMate252",
- AV_INT_BUTTON},
- /* status="good" */
- { NULL, NULL,
- 0x04a7, 0x048C,
- "Xerox", "DocuMate252-G",
- AV_INT_BUTTON},
- /* status="good" */
-
- { NULL, NULL,
- 0x04a7, 0x044c,
- "Xerox", "DocuMate262",
- AV_INT_BUTTON},
- /* status="good" */
- { NULL, NULL,
- 0x04a7, 0x048D,
- "Xerox", "DocuMate262-G",
- AV_INT_BUTTON},
- /* status="good" */
-
- { NULL, NULL,
- 0x04a7, 0x0475,
- "Xerox", "DocuMate272",
- AV_INT_BUTTON},
- /* status="untested" */
- { NULL, NULL,
- 0x04a7, 0x048E,
- "Xerox", "DocuMate272-G",
- AV_INT_BUTTON},
- /* status="untested" */
-
- { NULL, NULL,
- 0x04a7, 0x0446,
- "Xerox", "DocuMate510",
- AV_INT_BUTTON},
- /* status="untested" */
- { NULL, NULL,
- 0x04a7, 0x0495,
- "Xerox", "DocuMate512",
- AV_INT_BUTTON},
- /* status="untested" */
- { NULL, NULL,
- 0x04a7, 0x047c,
- "Xerox", "DocuMate510-G",
- AV_INT_BUTTON},
- /* status="untested" */
- { NULL, NULL,
- 0x04a7, 0x0447,
- "Xerox", "DocuMate520",
- AV_INT_BUTTON},
- /* status="untested" */
- { NULL, NULL,
- 0x04a7, 0x0492,
- "Xerox", "DocuMate520-G",
- AV_INT_BUTTON},
- /* status="untested" */
- { NULL, NULL,
- 0x04a7, 0x0498,
- "Xerox", "DocuMate632",
- AV_INT_BUTTON},
- /* status="untested" */
- { NULL, NULL,
- 0x04a7, 0x0478,
- "Xerox", "DocuMate752",
- AV_INT_BUTTON},
- /* status="untested" */
- { NULL, NULL,
- 0x04a7, 0x049A,
- "Xerox", "DocuMate752",
- AV_INT_BUTTON},
- /* status="untested" */
- { NULL, NULL,
- 0x0638, 0x0a16,
- "OKI", "S700 Scancopier",
- 0},
- /* comment="1 pass, 600 dpi, A4" */
- /* status="good" */
- { "B+H", "2000F",
- 0, 0,
- "Bell+Howell", "2000F",
- 0},
- /* comment="1 pass, ??? dpi, A4" */
- /* status="basic" */
- { NULL, NULL,
- 0x0482, 0x0335,
- "Kyocera", "FS-1016MFP",
- 0},
- /* comment="1 pass, ??? dpi, A4" */
- /* status="untested" */
- /* More IDs from the Avision dll:
- ArtiScan ProA3
- FB1065
- FB1265
- PHI860S
- PSDC SCSI
- SCSI Scan 19200
- V6240 */
- /* Possibly:
- Lexmark 4600 MFP Option MFP Options
- Lexmark 4600 MFP Option (C772n) MFP Options
- Lexmark X215
- Lexmark Optra Image X242
- Lexmark X443
- Lexmark 3100
- Lexmark 3200
- Lexmark X340 MFP Multifunction
- Lexmark X342n MFP Multifunction
- Lexmark X522
- Lexmark X630
- Lexmark X632E
- Lexmark X642e MFP Multifunction
- Lexmark X644e MFP Multifunction
- Lexmark X646dte MFP Multifunction
- Lexmark X646e MFP Multifunction
- Lexmark X646ef MFP Multifunction
- Lexmark X772e Multifunction
- Lexmark X850e MFP Multifunction
- Lexmark X852e MFP Multifunction
- Lexmark X854e MFP Multifunction
- Lexmark X4500 MFP
- */
-
- /* last entry detection */
- { NULL, NULL,
- 0, 0,
- NULL, NULL,
- 0}
- };
- #if 0
- struct timeval tv;
- #define TIMING(txt) gettimeofday (&tv, NULL); \
- DBG (4, "%lu: " txt "\n", tv.tv_sec * 1000000 + tv.tv_usec)
- #else
- #define TIMING(txt)
- #endif
- /* used when scanner returns invalid range fields ... */
- #define A4_X_RANGE 8.5 /* or 8.25 ? */
- #define A4_Y_RANGE 11.8
- #define A3_X_RANGE 11.8
- #define A3_Y_RANGE 16.5 /* or 17 ? */
- #define FILM_X_RANGE 1.0 /* really ? */
- #define FILM_Y_RANGE 1.0
- #define SHEETFEED_Y_RANGE 14.0
- #define AVISION_CONFIG_FILE "avision.conf"
- #define STD_INQUIRY_SIZE 0x24
- #define AVISION_INQUIRY_SIZE_V1 0x60
- #define AVISION_INQUIRY_SIZE_V2 0x88
- #define AVISION_INQUIRY_SIZE_MAX AVISION_INQUIRY_SIZE_V2
- #define MM_PER_INCH 25.4
- #define AVISION_BASE_RES 300
- /* calibration (shading) defines */
- #define INVALID_WHITE_SHADING 0x0000
- #define DEFAULT_WHITE_SHADING 0xFFF0
- #define MAX_WHITE_SHADING 0xFFFF
- /* originally the WHITE_MAP_RANGE was 0x4000 - but this always
- * resulted in slightly too dark images - thus I have choosen
- * 0x4FFF ... */
- #define WHITE_MAP_RANGE 0x4FFF
- #define INVALID_DARK_SHADING 0xFFFF
- #define DEFAULT_DARK_SHADING 0x0000
- #define read_constrains(s,var) {\
- if (s->hw->hw->feature_type & AV_NO_64BYTE_ALIGN) {\
- if (var % 64 == 0) var /= 2;\
- if (var % 64 == 0) var += 2;\
- }\
- }\
- static int num_devices;
- static Avision_Device* first_dev;
- static Avision_Scanner* first_handle;
- static const SANE_Device** devlist = 0;
- /* this is a bit hacky to get extra information in the attach callback */
- static Avision_HWEntry* attaching_hw = 0;
- /* disable the usage of a custom gamma-table */
- static SANE_Bool disable_gamma_table = SANE_FALSE;
- /* disable the calibration */
- static SANE_Bool disable_calibration = SANE_FALSE;
- static SANE_Bool force_calibration = SANE_FALSE;
- /* force scanable areas to ISO(DIN) A4/A3 */
- static SANE_Bool force_a4 = SANE_FALSE;
- static SANE_Bool force_a3 = SANE_FALSE;
- /* hardware resolutions to interpolate from */
- static const int hw_res_list_c5[] =
- {
- /* tested on AV600U */
- 75, 150, 300, 600, 1200, 2400, 4800, /* ... */ 0
- };
- static const int hw_res_list_generic[] =
- {
- 50, /* slower than 150 on the AV122/DM152, left for USB 1 host's preview */
- 75, /* slower than 150 on the AV122/DM152, left for USB 1 host's */
- 150, 200, 300,
- /* 400,*/ /* AV122 simplex y-scaling and duplex interlacing corrupt */
- 600, 1200, 2400, 4800,
- /* ... */
- 0
- };
- static SANE_Bool static_calib_list[3] =
- {
- SANE_FALSE, SANE_FALSE, SANE_FALSE
- };
- static const SANE_Range u8_range =
- {
- 0, /* minimum */
- 255, /* maximum */
- 0 /* quantization */
- };
- static const SANE_Range percentage_range =
- {
- SANE_FIX (-100), /* minimum */
- SANE_FIX (100), /* maximum */
- SANE_FIX (1) /* quantization */
- };
- static const SANE_Range abs_percentage_range =
- {
- SANE_FIX (0), /* minimum */
- SANE_FIX (100), /* maximum */
- SANE_FIX (1) /* quantization */
- };
- static const SANE_Range exposure_range =
- {
- 0, /* minimum */
- 1000, /* maximum */
- 1 /* quantization */
- };
- static const SANE_Range overscan_range =
- {
- SANE_FIX (0), /* minimum */
- SANE_FIX (4), /* maximum */ /* 4mm, meassured on AV122, AV220C2, i40 */
- 0 /* quantization */
- };
- /* The 0x32 is a random guess based on USB logs. Might need a
- per-device value in the future - 0x32 was tested on the AV122,
- DM152, AV220. */
- static const SANE_Range background_range =
- {
- 0, /* minimum */
- 0x32, /* maximum */
- 0 /* quantization */
- };
- static const uint8_t test_unit_ready[] =
- {
- AVISION_SCSI_TEST_UNIT_READY, 0x00, 0x00, 0x00, 0x00, 0x00
- };
- static const uint8_t get_status[] =
- {
- AVISION_SCSI_GET_DATA_STATUS, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x0c, 0x00
- };
- static size_t
- max_string_size (const SANE_String_Const strings[])
- {
- size_t size, max_size = 0;
- int i;
-
- DBG (3, "max_string_size:\n");
-
- for (i = 0; strings[i]; ++ i) {
- size = strlen (strings[i]) + 1;
- if (size > max_size)
- max_size = size;
- }
- return max_size;
- }
- static SANE_Status
- constrain_value (Avision_Scanner* s, SANE_Int option, void* value,
- SANE_Int* info)
- {
- DBG (3, "constrain_value:\n");
- return sanei_constrain_value (s->opt + option, value, info);
- }
- static void debug_print_raw (int dbg_level, char* info, const uint8_t* data,
- size_t count)
- {
- size_t i;
-
- DBG (dbg_level, info);
- for (i = 0; i < count; ++ i) {
- DBG (dbg_level, " [%lu] %1d%1d%1d%1d%1d%1d%1d%1db %3oo %3dd %2xx\n",
- (u_long) i,
- BIT(data[i],7), BIT(data[i],6), BIT(data[i],5), BIT(data[i],4),
- BIT(data[i],3), BIT(data[i],2), BIT(data[i],1), BIT(data[i],0),
- data[i], data[i], data[i]);
- }
- }
- static void debug_print_hex_raw (int dbg_level, char* info, const uint8_t* data,
- size_t count)
- {
- int address = 0;
- char text [16*3+1];
- DBG (dbg_level, info);
- while (count) {
- char* t = text;
- int i = 0;
- while (i < 16 && count) {
- t += sprintf (t, "%02x ", *data++);
- count--; i++;
- }
- *--t = 0;
-
- DBG (dbg_level, " [%08x] %s\n", address, text);
- address += 16;
- }
- }
- static void debug_print_nvram_data (int dbg_level, char* func,
- nvram_data* nvram)
- {
- DBG (dbg_level, "%s: pad scans: %d\n",
- func, get_quad(nvram->pad_scans));
- DBG (dbg_level, "%s: ADF simplex scans: %d\n",
- func, get_quad(nvram->adf_simplex_scans));
- DBG (dbg_level, "%s: ADF duplex scans: %d\n",
- func, get_quad(nvram->adf_duplex_scans));
- DBG (dbg_level, "%s: flatbed scans: %d\n",
- func, get_quad(nvram->flatbed_scans));
-
- DBG (dbg_level, "%s: flatbed leading edge: %d\n",
- func, (int16_t)get_double(nvram->flatbed_leading_edge));
- DBG (dbg_level, "%s: flatbed side edge: %d\n",
- func, (int16_t)get_double(nvram->flatbed_side_edge));
- DBG (dbg_level, "%s: ADF leading edge: %d\n",
- func, (int16_t)get_double(nvram->adf_leading_edge));
- DBG (dbg_level, "%s: ADF side edge: %d\n",
- func, (int16_t)get_double(nvram->adf_side_edge));
- DBG (dbg_level, "%s: ADF rear leading edge: %d\n",
- func, (int16_t)get_double(nvram->adf_rear_leading_edge));
- DBG (dbg_level, "%s: ADF rear side edge: %d\n",
- func, (int16_t)get_double(nvram->adf_rear_side_edge));
-
- DBG (dbg_level, "%s: born month: %d\n",
- func, get_double(nvram->born_month));
- DBG (dbg_level, "%s: born day: %d\n",
- func, get_double(nvram->born_day));
- DBG (dbg_level, "%s: born year: %d\n",
- func, get_double(nvram->born_year));
- DBG (dbg_level, "%s: first scan month: %d\n",
- func, get_double(nvram->first_scan_month));
- DBG (dbg_level, "%s: first scan day: %d\n",
- func, get_double(nvram->first_scan_day));
- DBG (dbg_level, "%s: first scan year: %d\n",
- func, get_double(nvram->first_scan_year));
-
- DBG (dbg_level, "%s: vert. magnification: %d\n",
- func, get_double(nvram->vertical_magnification));
- DBG (dbg_level, "%s: horiz. magnification: %d\n",
- func, get_double(nvram->horizontal_magnification));
- DBG (dbg_level, "%s: CCD type: %d\n",
- func, nvram->ccd_type);
- DBG (dbg_level, "%s: scan speed: %d\n",
- func, nvram->scan_speed);
-
- DBG (dbg_level, "%s: serial: '%.24s'\n", /* 24 chars max */
- func, nvram->serial);
-
- DBG (dbg_level, "%s: power saving time: %d\n",
- func, get_double(nvram->power_saving_time));
- DBG (dbg_level, "%s: auto feed: %d\n",
- func, nvram->auto_feed);
- DBG (dbg_level, "%s: roller count: %d\n",
- func, get_quad(nvram->roller_count));
- DBG (dbg_level, "%s: multifeed count: %d\n",
- func, get_quad(nvram->multifeed_count));
- DBG (dbg_level, "%s: jam count: %d\n",
- func, get_quad(nvram->jam_count));
- DBG (dbg_level, "%s: identify info: '%.16s'\n", /* 16 chars max */
- func, nvram->identify_info);
- DBG (dbg_level, "%s: formal_name: '%.16s'\n", /* 16 chars max */
- func, nvram->formal_name);
- }
- static void debug_print_avdimen (int dbg_level, char* func,
- Avision_Dimensions* avdimen)
- {
- DBG (dbg_level, "%s: hw_xres: %d, hw_yres: %d, line_difference: %d\n",
- func, avdimen->hw_xres, avdimen->hw_yres, avdimen->line_difference);
-
- DBG (dbg_level, "%s: tlx: %ld, tly: %ld, brx: %ld, bry: %ld\n",
- func, avdimen->tlx, avdimen->tly,
- avdimen->brx, avdimen->bry);
-
- DBG (dbg_level, "%s: hw_pixel_per_line: %d, hw_lines: %d, hw_bytes_per_line: %d\n",
- func, avdimen->hw_pixels_per_line, avdimen->hw_lines, avdimen->hw_bytes_per_line);
- DBG (dbg_level, "%s: xres: %d, yres: %d\n",
- func, avdimen->xres, avdimen->yres);
- }
- static void debug_print_params (int dbg_level, char* func, SANE_Parameters* params)
- {
- DBG (dbg_level, "%s: pixel_per_line: %d, lines: %d\n",
- func, params->pixels_per_line, params->lines);
- DBG (dbg_level, "%s: depth: %d, bytes_per_line: %d\n",
- func, params->depth, params->bytes_per_line);
- }
- static void debug_print_calib_format (int dbg_level, char* func,
- uint8_t* result)
- {
- debug_print_raw (dbg_level + 2, "debug_print_calib_format:\n", result, 32);
-
- DBG (dbg_level, "%s: [0-1] pixels per line: %d\n",
- func, get_double ( &(result[0]) ));
- DBG (dbg_level, "%s: [2] bytes per channel: %d\n", func, result[2]);
- DBG (dbg_level, "%s: [3] line count: %d\n", func, result[3]);
-
- DBG (dbg_level, "%s: [4] FLAG:%s%s%s\n",
- func,
- result[4] == 1?" MUST_DO_CALIBRATION":"",
- result[4] == 2?" SCAN_IMAGE_DOES_CALIBRATION":"",
- result[4] == 3?" NEEDS_NO_CALIBRATION":"");
-
- DBG (dbg_level, "%s: [5] Ability1:%s%s%s%s%s%s%s%s\n",
- func,
- BIT(result[5],7)?" NONE_PACKED":" PACKED",
- BIT(result[5],6)?" INTERPOLATED":"",
- BIT(result[5],5)?" SEND_REVERSED":"",
- BIT(result[5],4)?" PACKED_DATA":"",
- BIT(result[5],3)?" COLOR_CALIB":"",
- BIT(result[5],2)?" DARK_CALIB":"",
- BIT(result[5],1)?" NEEDS_WHITE_BLACK_SHADING_DATA":"",
- BIT(result[5],0)?" NEEDS_CALIB_TABLE_CHANNEL_BY_CHANNEL":"");
-
- DBG (dbg_level, "%s: [6] R gain: %d\n", func, result[6]);
- DBG (dbg_level, "%s: [7] G gain: %d\n", func, result[7]);
- DBG (dbg_level, "%s: [8] B gain: %d\n", func, result[8]);
-
- DBG (dbg_level, "%s: [9-10] R shading target: %x\n",
- func, get_double ( &(result[9]) ) );
- DBG (dbg_level, "%s: [11-12] G shading target: %x\n",
- func, get_double ( &(result[11]) ) );
- DBG (dbg_level, "%s: [13-14] B shading target: %x\n",
- func, get_double ( &(result[13]) ) );
-
- DBG (dbg_level, "%s: [15-16] R dark shading target: %x\n",
- func, get_double ( &(result[15]) ) );
- DBG (dbg_level, "%s: [17-18] G dark shading target: %x\n",
- func, get_double ( &(result[17]) ) );
- DBG (dbg_level, "%s: [19-20] B dark shading target: %x\n",
- func, get_double ( &(result[19]) ) );
- DBG (dbg_level, "%s: [21] true-gray gain: %d\n", func, result[21]);
- DBG (dbg_level, "%s: [22-23] true-gray shading target: %x\n",
- func, get_double ( &(result[22]) ) );
-
- DBG (dbg_level, "%s: [24-25] true-gray dark shading target: %x\n",
- func, get_double ( &(result[24]) ) );
- }
- static void debug_print_accel_info (int dbg_level, char* func,
- uint8_t* result)
- {
- debug_print_raw (dbg_level + 2, "debug_print_accel_info:\n", result, 24);
-
- DBG (dbg_level, "%s: [0-1] acceleration step count: %d\n",
- func, get_double ( &(result[0]) ));
- DBG (dbg_level, "%s: [2-3] stable step count: %d\n",
- func, get_double ( &(result[2]) ));
- DBG (dbg_level, "%s: [4-7] table units: %d\n",
- func, get_quad ( &(result[4]) ));
- DBG (dbg_level, "%s: [8-11] base units: %d\n",
- func, get_quad ( &(result[8]) ));
- DBG (dbg_level, "%s: [12-13] start speed: %d\n",
- func, get_double ( &(result[12]) ));
- DBG (dbg_level, "%s: [14-15] target speed: %d\n",
- func, get_double ( &(result[14]) ));
- DBG (dbg_level, "%s: [16] ability:%s%s\n",
- func,
- BIT(result[16],0)?" TWO_BYTES_PER_ELEM":" SINGLE_BYTE_PER_ELEM",
- BIT(result[16],1)?" LOW_HIGH_ORDER":" HIGH_LOW_ORDER");
- DBG (dbg_level, "%s: [17] table count: %d\n", func, result[17]);
-
- }
- static void debug_print_window_descriptor (int dbg_level, char* func,
- command_set_window_window* window)
- {
- debug_print_raw (dbg_level + 1, "window_data_header: \n",
- (uint8_t*)(&window->header),
- sizeof(window->header));
- debug_print_raw (dbg_level + 1, "window_descriptor: \n",
- (uint8_t*)(&window->descriptor),
- sizeof(*window) -
- sizeof(window->header));
-
- DBG (dbg_level, "%s: [0] window_id: %d\n", func,
- window->descriptor.winid);
- DBG (dbg_level, "%s: [2-3] x-axis res: %d\n", func,
- get_double (window->descriptor.xres));
- DBG (dbg_level, "%s: [4-5] y-axis res: %d\n", func,
- get_double (window->descriptor.yres));
- DBG (dbg_level, "%s: [6-9] x-axis upper left: %d\n",
- func, get_quad (window->descriptor.ulx));
- DBG (dbg_level, "%s: [10-13] y-axis upper left: %d\n",
- func, get_quad (window->descriptor.uly));
- DBG (dbg_level, "%s: [14-17] window width: %d\n", func,
- get_quad (window->descriptor.width));
- DBG (dbg_level, "%s: [18-21] window length: %d\n", func,
- get_quad (window->descriptor.length));
- DBG (dbg_level, "%s: [22] brightness: %d\n", func,
- window->descriptor.brightness);
- DBG (dbg_level, "%s: [23] threshold: %d\n", func,
- window->descriptor.threshold);
- DBG (dbg_level, "%s: [24] contrast: %d\n", func,
- window->descriptor.contrast);
- DBG (dbg_level, "%s: [25] image composition: %x\n", func,
- window->descriptor.image_comp);
- DBG (dbg_level, "%s: [26] bits per channel: %d\n", func,
- window->descriptor.bpc);
- DBG (dbg_level, "%s: [27-28] halftone pattern: %x\n", func,
- get_double (window->descriptor.halftone));
- DBG (dbg_level, "%s: [29] padding_and_bitset: %x\n", func,
- window->descriptor.padding_and_bitset);
- DBG (dbg_level, "%s: [30-31] bit ordering: %x\n", func,
- get_double (window->descriptor.bitordering));
- DBG (dbg_level, "%s: [32] compression type: %x\n", func,
- window->descriptor.compr_type);
- DBG (dbg_level, "%s: [33] compression argument: %x\n", func,
- window->descriptor.compr_arg);
- DBG (dbg_level, "%s: [34-35] paper length: %x\n", func,
- get_double (window->descriptor.paper_length) );
- DBG (dbg_level, "%s: [40] vendor id: %x\n", func,
- window->descriptor.vendor_specific);
- DBG (dbg_level, "%s: [41] param lenght: %d\n", func,
- window->descriptor.paralen);
- DBG (dbg_level, "%s: [42] bitset1: %x\n", func,
- window->avision.bitset1);
- DBG (dbg_level, "%s: [43] highlight: %d\n", func,
- window->avision.highlight);
- DBG (dbg_level, "%s: [44] shadow: %d\n", func,
- window->avision.shadow);
- DBG (dbg_level, "%s: [45-46] line-width: %d\n", func,
- get_double (window->avision.line_width));
- DBG (dbg_level, "%s: [47-48] line-count: %d\n", func,
- get_double (window->avision.line_count));
- DBG (dbg_level, "%s: [49] bitset2: %x\n", func,
- window->avision.type.normal.bitset2);
- DBG (dbg_level, "%s: [50] ir exposure time: %x\n",
- func, window->avision.type.normal.ir_exposure_time);
-
- DBG (dbg_level, "%s: [51-52] r exposure: %x\n", func,
- get_double (window->avision.type.normal.r_exposure_time));
- DBG (dbg_level, "%s: [53-54] g exposure: %x\n", func,
- get_double (window->avision.type.normal.g_exposure_time));
- DBG (dbg_level, "%s: [55-56] b exposure: %x\n", func,
- get_double (window->avision.type.normal.b_exposure_time));
-
- DBG (dbg_level, "%s: [57] bitset3: %x\n", func,
- window->avision.type.normal.bitset3);
- DBG (dbg_level, "%s: [58] auto focus: %d\n", func,
- window->avision.type.normal.auto_focus);
- DBG (dbg_level, "%s: [59] line-width (MSB): %d\n",
- func, window->avision.type.normal.line_width_msb);
- DBG (dbg_level, "%s: [60] line-count (MSB): %d\n",
- func, window->avision.type.normal.line_count_msb);
- DBG (dbg_level, "%s: [61] background lines: %d\n",
- func, window->avision.type.normal.background_lines);
- }
- static int write_pnm_header (FILE* f, color_mode m, int depth, int width, int height)
- {
- int maxval = (1 << depth) - 1;
- const char* hdr_str = NULL;
- /* construct PNM header */
-
- switch (m) {
- case AV_THRESHOLDED:
- case AV_DITHERED:
- hdr_str = "P4\n%d %d\n";
- break;
- case AV_GRAYSCALE:
- case AV_GRAYSCALE12:
- case AV_GRAYSCALE16:
- hdr_str = "P5\n%d %d\n%d\n";
- break;
- case AV_TRUECOLOR:
- case AV_TRUECOLOR12:
- case AV_TRUECOLOR16:
- hdr_str = "P6\n%d %d\n%d\n";
- break;
- case AV_COLOR_MODE_LAST:
- ; /* silence compiler warning */
- }
-
- return fprintf (f, hdr_str, width, height, maxval);
- }
- static SANE_Status
- sense_handler (int fd, u_char* sense, void* arg)
- {
- SANE_Status status = SANE_STATUS_IO_ERROR; /* default case */
-
- char* text;
- char textbuf[64];
-
- uint8_t error_code = sense[0] & 0x7f;
- uint8_t sense_key = sense[2] & 0xf;
- uint8_t additional_sense = sense[7];
-
- fd = fd; /* silence gcc */
- arg = arg; /* silence gcc */
-
- DBG (3, "sense_handler:\n");
-
- switch (error_code)
- {
- case 0x70:
- text = "standard sense";
- break;
- case 0x7f:
- text = "Avision-specific sense";
- break;
- default:
- text = "unknown sense";
- }
-
- debug_print_raw (1, "sense_handler: data:\n", sense, 8 + additional_sense);
-
- /* request valid? */
- if (! sense[0] & (1<<7)) {
- DBG (1, "sense_handler: sense not vaild ...\n");
- return status;
- }
-
- switch (sense_key)
- {
- case 0x00:
- status = SANE_STATUS_GOOD;
- text = "ok ?!?";
- break;
- case 0x02:
- text = "NOT READY";
- break;
- case 0x03:
- text = "MEDIUM ERROR (mostly ADF)";
- status = SANE_STATUS_JAMMED;
- break;
- case 0x04:
- text = "HARDWARE ERROR";
- break;
- case 0x05:
- text = "ILLEGAL REQUEST";
- break;
- case 0x06:
- text = "UNIT ATTENTION";
- break;
- case 0x09:
- text = "VENDOR SPECIFIC";
- break;
- case 0x0b:
- text = "ABORTED COMMAND";
- status = SANE_STATUS_CANCELLED; /* AV610C2 cancel button */
- break;
- default:
- sprintf (textbuf, "got unknown sense code 0x%02x", (int)sense_key);
- text = textbuf;
- }
-
- DBG (1, "sense_handler: sense code: %s\n", text);
-
- if (sense[2] & (1<<6))
- DBG (1, "sense_handler: end of scan\n");
- else
- DBG (1, "sense_handler: scan has not yet been completed\n");
-
- if (sense[2] & (1<<5))
- DBG (1, "sense_handler: incorrect logical length\n");
- else
- DBG (1, "sense_handler: correct logical length\n");
- {
- uint8_t asc = sense[12];
- uint8_t ascq = sense[13];
-
- #define ADDITIONAL_SENSE(asc,ascq,txt) \
- case ( (asc << 8) + ascq): text = txt; break
-
- switch ( (asc << 8) + ascq )
- {
- /* normal */
- ADDITIONAL_SENSE (0x00,0x00, "No additional sense information");
- ADDITIONAL_SENSE (0x00,0x06, "I/O process terminated");
- ADDITIONAL_SENSE (0x15,0x01, "Mechanical positioning error");
- ADDITIONAL_SENSE (0x15,0x02, "Flatbed Home Sensor Error (OKI only");
- ADDITIONAL_SENSE (0x15,0x03, "ADF Home Sensor Error (OKI only)");
- ADDITIONAL_SENSE (0x15,0x04, "Lock Error (OKI only)");
-
- ADDITIONAL_SENSE (0x1a,0x00, "parameter list lenght error");
-
- ADDITIO…
Large files files are truncated, but you can click here to view the full file