kopia lustrzana https://gitlab.com/sane-project/backends
Added IBM backend for the IBM 2456, the Ricoh IS-420 and maybe the IS-410 and
IS-430 from mf <massifr@tiscalinet.it>. Added manual page, fixed some warnings, Added detection for IS-410 and IS-430.merge-requests/1/head
rodzic
b05d98e145
commit
87387511b0
2
AUTHORS
2
AUTHORS
|
@ -36,6 +36,7 @@ Backends:
|
|||
hp: Peter Kirchgessner (*)
|
||||
Geoffrey Dairiki
|
||||
hpsj5s: Max Vorobiev (*)
|
||||
ibm: mf, Henning Meier-Geinitz (*)
|
||||
leo: Frank Zago (*)
|
||||
ma1509: Henning Meier-Geinitz (*)
|
||||
matsushita: Frank Zago (*)
|
||||
|
@ -152,6 +153,7 @@ Matthew Duggan <stauff1@users.sourceforge.net>
|
|||
Matthew Marjanovic <maddog@mir.com>
|
||||
Max Vorobiev <pcwizard@yandex.ru>
|
||||
Meino Christian Cramer <mccramer@s.netic.de>
|
||||
mf <massifr@tiscalinet.it>
|
||||
Michael Herder <crapsite@gmx.net>
|
||||
Michael K. Johnson <johnsonm@redhat.com>
|
||||
Michel Roelofs <michelr@stack.nl>
|
||||
|
|
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
|||
2003-04-15 Henning Meier-Geinitz <henning@meier-geinitz.de>
|
||||
|
||||
* AUTHORS backend/Makefile.in backend/dll.conf backend/ibm-scsi.c
|
||||
backend/ibm.c backend/ibm.conf backend/ibm.h doc/Makefile.in
|
||||
doc/sane.man doc/sane-ibm.man doc/.cvsignore
|
||||
doc/descriptions/ibm.desc: Added IBM backend for the
|
||||
IBM 2456, the Ricoh IS-420 and maybe the IS-410 and IS-430 from
|
||||
mf <massifr@tiscalinet.it>. Added manual page, fixed some
|
||||
warnings, Added detection for IS-410 and IS-430.
|
||||
|
||||
2003-04-14 Henning Meier-Geinitz <henning@meier-geinitz.de>
|
||||
|
||||
* tools/sane-desc.c: Fixed some HTML bugs.
|
||||
|
|
|
@ -66,7 +66,7 @@ PRELOADABLE_BACKENDS = abaton agfafocus apple artec as6e avision bh canon \
|
|||
microtek2 mustek mustek_pp mustek_usb nec @NET@ pie @PINT@ plustek \
|
||||
@PNM@ @QCAM@ ricoh s9036 sceptre sharp @SM3600@ @SNAPSCAN@ \
|
||||
sp15c st400 tamarack test teco1 teco2 teco3 umax umax_pp umax1220u \
|
||||
@V4L@ artec_eplus48u ma1509
|
||||
@V4L@ artec_eplus48u ma1509 ibm
|
||||
ifneq (@SELECTED_BACKENDS@,)
|
||||
PRELOADABLE_BACKENDS = @SELECTED_BACKENDS@
|
||||
endif
|
||||
|
@ -111,6 +111,7 @@ DISTFILES = abaton.c abaton.conf abaton.h agfafocus.c agfafocus.conf \
|
|||
hp-device.c hp-device.h hp.h hp-handle.c hp-handle.h hp-hpmem.c hp-option.c \
|
||||
hp-option.h hp.README hp-scl.c hp-scl.h hp-scsi.h hp.TODO \
|
||||
hpsj5s.c hpsj5s.conf hpsj5s.h \
|
||||
ibm.c ibm.conf ibm.h ibm-scsi.c \
|
||||
jinclude.h \
|
||||
leo.c leo.h leo.conf \
|
||||
lm9830.h \
|
||||
|
@ -314,6 +315,9 @@ libsane-hp.la: ../sanei/sanei_scsi.lo
|
|||
libsane-hp.la: ../sanei/sanei_usb.lo
|
||||
libsane-hp.la: $(addsuffix .lo,$(EXTRA_hp))
|
||||
libsane-hp.la: ../sanei/sanei_pio.lo
|
||||
libsane-ibm.la: ../sanei/sanei_scsi.lo
|
||||
libsane-ibm.la: ../sanei/sanei_config2.lo
|
||||
libsane-ibm.la: ../sanei/sanei_constrain_value.lo
|
||||
libsane-leo.la: ../sanei/sanei_config2.lo
|
||||
libsane-leo.la: ../sanei/sanei_constrain_value.lo
|
||||
libsane-leo.la: ../sanei/sanei_scsi.lo
|
||||
|
|
|
@ -23,6 +23,7 @@ fujitsu
|
|||
gt68xx
|
||||
hp
|
||||
hpsj5s
|
||||
ibm
|
||||
leo
|
||||
ma1509
|
||||
matsushita
|
||||
|
|
|
@ -0,0 +1,433 @@
|
|||
/* sane - Scanner Access Now Easy.
|
||||
|
||||
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.
|
||||
|
||||
If you write modifications of your own for SANE, it is your choice
|
||||
whether to permit this exception to apply to your modifications.
|
||||
If you do not wish that, delete this exception notice. */
|
||||
|
||||
/*
|
||||
*/
|
||||
|
||||
#include <time.h>
|
||||
|
||||
|
||||
/* SCSI commands that the Ibm scanners understand: */
|
||||
#define IBM_SCSI_TEST_UNIT_READY 0x00
|
||||
#define IBM_SCSI_SET_WINDOW 0x24
|
||||
#define IBM_SCSI_GET_WINDOW 0x25
|
||||
#define IBM_SCSI_READ_SCANNED_DATA 0x28
|
||||
#define IBM_SCSI_INQUIRY 0x12
|
||||
#define IBM_SCSI_MODE_SELECT 0x15
|
||||
#define IBM_SCSI_START_SCAN 0x1b
|
||||
#define IBM_SCSI_MODE_SENSE 0x1a
|
||||
#define IBM_SCSI_GET_BUFFER_STATUS 0x34
|
||||
#define IBM_SCSI_OBJECT_POSITION 0x31
|
||||
|
||||
/* How long do we wait for scanner to have data for us */
|
||||
#define MAX_WAITING_TIME 15
|
||||
|
||||
/* for object_position command */
|
||||
#define OBJECT_POSITION_UNLOAD 0
|
||||
#define OBJECT_POSITION_LOAD 1
|
||||
|
||||
struct scsi_window_cmd {
|
||||
SANE_Byte opcode;
|
||||
SANE_Byte byte2;
|
||||
SANE_Byte reserved[4];
|
||||
SANE_Byte len[3];
|
||||
SANE_Byte control;
|
||||
};
|
||||
|
||||
struct scsi_mode_select_cmd {
|
||||
SANE_Byte opcode;
|
||||
SANE_Byte byte2;
|
||||
#define SMS_SP 0x01
|
||||
#define SMS_PF 0x10
|
||||
SANE_Byte page_code; /* for mode_sense, reserved for mode_select */
|
||||
SANE_Byte unused[1];
|
||||
SANE_Byte len;
|
||||
SANE_Byte control;
|
||||
};
|
||||
|
||||
struct scsi_mode_header {
|
||||
SANE_Byte data_length; /* Sense data length */
|
||||
SANE_Byte medium_type;
|
||||
SANE_Byte dev_spec;
|
||||
SANE_Byte blk_desc_len;
|
||||
};
|
||||
|
||||
/* next struct introduced by mf */
|
||||
struct scsi_object_position_cmd {
|
||||
SANE_Byte opcode;
|
||||
SANE_Byte position_func;
|
||||
SANE_Byte count[3];
|
||||
SANE_Byte res[3];
|
||||
SANE_Byte control;
|
||||
SANE_Byte res2;
|
||||
};
|
||||
|
||||
struct scsi_get_buffer_status_cmd {
|
||||
SANE_Byte opcode;
|
||||
SANE_Byte byte2;
|
||||
SANE_Byte res[5];
|
||||
SANE_Byte len[2];
|
||||
SANE_Byte control;
|
||||
};
|
||||
|
||||
struct scsi_status_desc {
|
||||
SANE_Byte window_id;
|
||||
SANE_Byte byte2;
|
||||
SANE_Byte available[3];
|
||||
SANE_Byte filled[3];
|
||||
};
|
||||
|
||||
struct scsi_status_data {
|
||||
SANE_Byte len[3];
|
||||
SANE_Byte byte4;
|
||||
struct scsi_status_desc desc;
|
||||
};
|
||||
|
||||
struct scsi_start_scan_cmd {
|
||||
SANE_Byte opcode;
|
||||
SANE_Byte byte2;
|
||||
SANE_Byte unused[2];
|
||||
SANE_Byte len;
|
||||
SANE_Byte control;
|
||||
};
|
||||
|
||||
struct scsi_read_scanner_cmd {
|
||||
SANE_Byte opcode;
|
||||
SANE_Byte byte2;
|
||||
SANE_Byte data_type;
|
||||
SANE_Byte byte3;
|
||||
SANE_Byte data_type_qualifier[2];
|
||||
SANE_Byte len[3];
|
||||
SANE_Byte control;
|
||||
};
|
||||
|
||||
static SANE_Status
|
||||
test_unit_ready (int fd)
|
||||
{
|
||||
static SANE_Byte cmd[6];
|
||||
SANE_Status status;
|
||||
DBG (11, ">> test_unit_ready\n");
|
||||
|
||||
cmd[0] = IBM_SCSI_TEST_UNIT_READY;
|
||||
memset (cmd, 0, sizeof (cmd));
|
||||
status = sanei_scsi_cmd (fd, cmd, sizeof (cmd), 0, 0);
|
||||
|
||||
DBG (11, "<< test_unit_ready\n");
|
||||
return (status);
|
||||
}
|
||||
|
||||
static SANE_Status
|
||||
inquiry (int fd, void *buf, size_t * buf_size)
|
||||
{
|
||||
static SANE_Byte cmd[6];
|
||||
SANE_Status status;
|
||||
DBG (11, ">> inquiry\n");
|
||||
|
||||
memset (cmd, 0, sizeof (cmd));
|
||||
cmd[0] = IBM_SCSI_INQUIRY;
|
||||
cmd[4] = *buf_size;
|
||||
status = sanei_scsi_cmd (fd, cmd, sizeof (cmd), buf, buf_size);
|
||||
|
||||
DBG (11, "<< inquiry\n");
|
||||
return (status);
|
||||
}
|
||||
|
||||
static SANE_Status
|
||||
mode_select (int fd, struct mode_pages *mp)
|
||||
{
|
||||
static struct {
|
||||
struct scsi_mode_select_cmd cmd;
|
||||
struct scsi_mode_header smh;
|
||||
struct mode_pages mp;
|
||||
} select_cmd;
|
||||
SANE_Status status;
|
||||
DBG (11, ">> mode_select\n");
|
||||
|
||||
memset (&select_cmd, 0, sizeof (select_cmd));
|
||||
select_cmd.cmd.opcode = IBM_SCSI_MODE_SELECT;
|
||||
select_cmd.cmd.byte2 |= SMS_PF;
|
||||
select_cmd.cmd.len = sizeof(select_cmd.smh) + sizeof(select_cmd.mp);
|
||||
/* next line by mf */
|
||||
/* select_cmd.cmd.page_code= 20; */
|
||||
memcpy (&select_cmd.mp, mp, sizeof(*mp));
|
||||
status = sanei_scsi_cmd (fd, &select_cmd, sizeof (select_cmd), 0, 0);
|
||||
|
||||
DBG (11, "<< mode_select\n");
|
||||
return (status);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static SANE_Status
|
||||
mode_sense (int fd, struct mode_pages *mp, SANE_Byte page_code)
|
||||
{
|
||||
static struct scsi_mode_select_cmd cmd; /* no type, we can reuse it for sensing */
|
||||
static struct {
|
||||
struct scsi_mode_header smh;
|
||||
struct mode_pages mp;
|
||||
} select_data;
|
||||
static size_t select_size = sizeof(select_data);
|
||||
SANE_Status status;
|
||||
DBG (11, ">> mode_sense\n");
|
||||
|
||||
memset (&cmd, 0, sizeof (cmd));
|
||||
cmd.opcode = IBM_SCSI_MODE_SENSE;
|
||||
cmd.page_code = page_code;
|
||||
cmd.len = sizeof(select_data);
|
||||
status = sanei_scsi_cmd (fd, &cmd, sizeof (cmd), &select_data, &select_size);
|
||||
memcpy (mp, &select_data.mp, sizeof(*mp));
|
||||
|
||||
DBG (11, "<< mode_sense\n");
|
||||
return (status);
|
||||
}
|
||||
#endif
|
||||
|
||||
static SANE_Status
|
||||
trigger_scan (int fd)
|
||||
{
|
||||
static struct scsi_start_scan_cmd cmd;
|
||||
static char window_id_list[1] = { '\0' }; /* scan start data out */
|
||||
static size_t wl_size = 1;
|
||||
SANE_Status status;
|
||||
DBG (11, ">> trigger scan\n");
|
||||
|
||||
memset (&cmd, 0, sizeof (cmd));
|
||||
cmd.opcode = IBM_SCSI_START_SCAN;
|
||||
cmd.len = wl_size;
|
||||
/* next line by mf */
|
||||
/* cmd.unused[0] = 1; */
|
||||
if (wl_size)
|
||||
status = sanei_scsi_cmd (fd, &cmd, sizeof (cmd), &window_id_list, &wl_size);
|
||||
else
|
||||
status = sanei_scsi_cmd (fd, &cmd, sizeof (cmd), 0, 0);
|
||||
|
||||
DBG (11, "<< trigger scan\n");
|
||||
return (status);
|
||||
}
|
||||
|
||||
static SANE_Status
|
||||
set_window (int fd, struct ibm_window_data *iwd)
|
||||
{
|
||||
|
||||
static struct {
|
||||
struct scsi_window_cmd cmd;
|
||||
struct ibm_window_data iwd;
|
||||
} win;
|
||||
|
||||
SANE_Status status;
|
||||
DBG (11, ">> set_window\n");
|
||||
|
||||
memset (&win, 0, sizeof (win));
|
||||
win.cmd.opcode = IBM_SCSI_SET_WINDOW;
|
||||
_lto3b(sizeof(*iwd), win.cmd.len);
|
||||
memcpy (&win.iwd, iwd, sizeof(*iwd));
|
||||
status = sanei_scsi_cmd (fd, &win, sizeof (win), 0, 0);
|
||||
|
||||
DBG (11, "<< set_window\n");
|
||||
return (status);
|
||||
}
|
||||
|
||||
static SANE_Status
|
||||
get_window (int fd, struct ibm_window_data *iwd)
|
||||
{
|
||||
|
||||
static struct scsi_window_cmd cmd;
|
||||
static size_t iwd_size;
|
||||
SANE_Status status;
|
||||
|
||||
iwd_size = sizeof(*iwd);
|
||||
DBG (11, ">> get_window datalen = %lu\n", (unsigned long) iwd_size);
|
||||
|
||||
memset (&cmd, 0, sizeof (cmd));
|
||||
cmd.opcode = IBM_SCSI_GET_WINDOW;
|
||||
#if 1 /* it was if 0 */
|
||||
cmd.byte2 |= (SANE_Byte)0x01; /* set Single bit to get one window desc. */
|
||||
#endif
|
||||
_lto3b(iwd_size, cmd.len);
|
||||
status = sanei_scsi_cmd (fd, &cmd, sizeof (cmd), iwd, &iwd_size);
|
||||
|
||||
DBG (11, "<< get_window, datalen = %lu\n", (unsigned long) iwd_size);
|
||||
return (status);
|
||||
}
|
||||
|
||||
static SANE_Status
|
||||
read_data (int fd, void *buf, size_t * buf_size)
|
||||
{
|
||||
static struct scsi_read_scanner_cmd cmd;
|
||||
SANE_Status status;
|
||||
DBG (11, ">> read_data %lu\n", (unsigned long) *buf_size);
|
||||
|
||||
memset (&cmd, 0, sizeof (cmd));
|
||||
cmd.opcode = IBM_SCSI_READ_SCANNED_DATA;
|
||||
_lto3b(*buf_size, cmd.len);
|
||||
status = sanei_scsi_cmd (fd, &cmd, sizeof (cmd), buf, buf_size);
|
||||
|
||||
DBG (11, "<< read_data %lu\n", (unsigned long) *buf_size);
|
||||
return (status);
|
||||
}
|
||||
|
||||
static SANE_Status
|
||||
object_position (int fd, int load)
|
||||
{
|
||||
static struct scsi_object_position_cmd cmd;
|
||||
SANE_Status status;
|
||||
DBG (11, ">> object_position\n");
|
||||
|
||||
memset (&cmd, 0, sizeof (cmd));
|
||||
cmd.opcode = IBM_SCSI_OBJECT_POSITION;
|
||||
if (load)
|
||||
cmd.position_func = OBJECT_POSITION_LOAD;
|
||||
else
|
||||
cmd.position_func = OBJECT_POSITION_UNLOAD;
|
||||
_lto3b(1, cmd.count);
|
||||
status = sanei_scsi_cmd (fd, &cmd, sizeof (cmd), 0, 0);
|
||||
|
||||
DBG (11, "<< object_position\n");
|
||||
return (status);
|
||||
}
|
||||
|
||||
static SANE_Status
|
||||
get_data_status (int fd, struct scsi_status_desc *dbs)
|
||||
{
|
||||
static struct scsi_get_buffer_status_cmd cmd;
|
||||
static struct scsi_status_data ssd;
|
||||
size_t ssd_size = sizeof(ssd);
|
||||
SANE_Status status;
|
||||
DBG (11, ">> get_data_status %lu\n", (unsigned long) ssd_size);
|
||||
|
||||
memset (&cmd, 0, sizeof (cmd));
|
||||
cmd.opcode = IBM_SCSI_GET_BUFFER_STATUS;
|
||||
_lto2b(ssd_size, cmd.len);
|
||||
status = sanei_scsi_cmd (fd, &cmd, sizeof (cmd), &ssd, &ssd_size);
|
||||
|
||||
memcpy (dbs, &ssd.desc, sizeof(*dbs));
|
||||
if (status == SANE_STATUS_GOOD &&
|
||||
((unsigned int) _3btol(ssd.len) <= sizeof(*dbs) || _3btol(ssd.desc.filled) == 0)) {
|
||||
DBG (11, "get_data_status: busy\n");
|
||||
status = SANE_STATUS_DEVICE_BUSY;
|
||||
}
|
||||
|
||||
DBG (11, "<< get_data_status %lu\n", (unsigned long) ssd_size);
|
||||
return (status);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static SANE_Status
|
||||
ibm_wait_ready_tur (int fd)
|
||||
{
|
||||
struct timeval now, start;
|
||||
SANE_Status status;
|
||||
|
||||
gettimeofday (&start, 0);
|
||||
|
||||
while (1)
|
||||
{
|
||||
DBG(3, "scsi_wait_ready: sending TEST_UNIT_READY\n");
|
||||
|
||||
status = sanei_scsi_cmd (fd, test_unit_ready, sizeof (test_unit_ready),
|
||||
0, 0);
|
||||
switch (status)
|
||||
{
|
||||
default:
|
||||
/* Ignore errors while waiting for scanner to become ready.
|
||||
Some SCSI drivers return EIO while the scanner is
|
||||
returning to the home position. */
|
||||
DBG(1, "scsi_wait_ready: test unit ready failed (%s)\n",
|
||||
sane_strstatus (status));
|
||||
/* fall through */
|
||||
case SANE_STATUS_DEVICE_BUSY:
|
||||
gettimeofday (&now, 0);
|
||||
if (now.tv_sec - start.tv_sec >= MAX_WAITING_TIME)
|
||||
{
|
||||
DBG(1, "ibm_wait_ready: timed out after %lu seconds\n",
|
||||
(u_long) (now.tv_sec - start.tv_sec));
|
||||
return SANE_STATUS_INVAL;
|
||||
}
|
||||
usleep (100000); /* retry after 100ms */
|
||||
break;
|
||||
|
||||
case SANE_STATUS_GOOD:
|
||||
return status;
|
||||
}
|
||||
}
|
||||
return SANE_STATUS_INVAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
static SANE_Status
|
||||
ibm_wait_ready (Ibm_Scanner * s)
|
||||
{
|
||||
struct scsi_status_desc dbs;
|
||||
time_t now, start;
|
||||
SANE_Status status;
|
||||
|
||||
start = time(NULL);
|
||||
|
||||
while (1)
|
||||
{
|
||||
status = get_data_status (s->fd, &dbs);
|
||||
|
||||
switch (status)
|
||||
{
|
||||
default:
|
||||
/* Ignore errors while waiting for scanner to become ready.
|
||||
Some SCSI drivers return EIO while the scanner is
|
||||
returning to the home position. */
|
||||
DBG(1, "scsi_wait_ready: get datat status failed (%s)\n",
|
||||
sane_strstatus (status));
|
||||
/* fall through */
|
||||
case SANE_STATUS_DEVICE_BUSY:
|
||||
now = time(NULL);
|
||||
if (now - start >= MAX_WAITING_TIME)
|
||||
{
|
||||
DBG(1, "ibm_wait_ready: timed out after %lu seconds\n",
|
||||
(u_long) (now - start));
|
||||
return SANE_STATUS_INVAL;
|
||||
}
|
||||
break;
|
||||
|
||||
case SANE_STATUS_GOOD:
|
||||
DBG(11, "ibm_wait_ready: %d bytes ready\n", _3btol(dbs.filled));
|
||||
return status;
|
||||
break;
|
||||
}
|
||||
usleep (1000000); /* retry after 100ms */
|
||||
}
|
||||
return SANE_STATUS_INVAL;
|
||||
}
|
Plik diff jest za duży
Load Diff
|
@ -0,0 +1,3 @@
|
|||
scsi IBM 2456
|
||||
scsi RICOH
|
||||
/dev/scanner
|
|
@ -0,0 +1,393 @@
|
|||
/* sane - Scanner Access Now Easy.
|
||||
|
||||
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.
|
||||
|
||||
If you write modifications of your own for SANE, it is your choice
|
||||
whether to permit this exception to apply to your modifications.
|
||||
If you do not wish that, delete this exception notice. */
|
||||
|
||||
|
||||
|
||||
#ifndef ibm_h
|
||||
#define ibm_h 1
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <sane/config.h>
|
||||
|
||||
/* defines for scan_image_mode field */
|
||||
#define IBM_BINARY_MONOCHROME 0
|
||||
#define IBM_DITHERED_MONOCHROME 1
|
||||
#define IBM_GRAYSCALE 2
|
||||
|
||||
/* defines for paper field */
|
||||
#define IBM_PAPER_USER_DEFINED 0
|
||||
#define IBM_PAPER_A3 1
|
||||
#define IBM_PAPER_A4 2
|
||||
#define IBM_PAPER_A4L 3
|
||||
#define IBM_PAPER_A5 4
|
||||
#define IBM_PAPER_A5L 5
|
||||
#define IBM_PAPER_A6 6
|
||||
#define IBM_PAPER_B4 7
|
||||
#define IBM_PAPER_B5 8
|
||||
#define IBM_PAPER_LEGAL 9
|
||||
#define IBM_PAPER_LETTER 10
|
||||
|
||||
/* sizes for mode parameter's base_measurement_unit */
|
||||
#define INCHES 0
|
||||
#define MILLIMETERS 1
|
||||
#define POINTS 2
|
||||
#define DEFAULT_MUD 1200
|
||||
#define MEASUREMENTS_PAGE (SANE_Byte)(0x03)
|
||||
|
||||
/* Mode Page Control */
|
||||
#define PC_CURRENT 0x00
|
||||
#define PC_CHANGE 0x40
|
||||
#define PC_DEFAULT 0x80
|
||||
#define PC_SAVED 0xc0
|
||||
|
||||
static const SANE_String_Const mode_list[] =
|
||||
{
|
||||
"Lineart", "Halftone", "Gray",
|
||||
0
|
||||
};
|
||||
|
||||
static const SANE_String_Const paper_list[] =
|
||||
{
|
||||
"User",
|
||||
"A3",
|
||||
"A4", "A4R",
|
||||
"A5", "A5R",
|
||||
"A6",
|
||||
"B4", "B5",
|
||||
"Legal", "Letter",
|
||||
0
|
||||
};
|
||||
|
||||
#define PAPER_A3_W 14032
|
||||
#define PAPER_A3_H 19842
|
||||
#define PAPER_A4_W 9921
|
||||
#define PAPER_A4_H 14032
|
||||
#define PAPER_A4R_W 14032
|
||||
#define PAPER_A4R_H 9921
|
||||
#define PAPER_A5_W 7016
|
||||
#define PAPER_A5_H 9921
|
||||
#define PAPER_A5R_W 9921
|
||||
#define PAPER_A5R_H 7016
|
||||
#define PAPER_A6_W 4960
|
||||
#define PAPER_A6_H 7016
|
||||
#define PAPER_B4_W 11811
|
||||
#define PAPER_B4_H 16677
|
||||
#define PAPER_B5_W 8598
|
||||
#define PAPER_B5_H 12142
|
||||
#define PAPER_LEGAL_W 10200
|
||||
#define PAPER_LEGAL_H 16800
|
||||
#define PAPER_LETTER_W 10200
|
||||
#define PAPER_LETTER_H 13200
|
||||
|
||||
static const SANE_Range u8_range =
|
||||
{
|
||||
0, /* minimum */
|
||||
255, /* maximum */
|
||||
0 /* quantization */
|
||||
};
|
||||
|
||||
static const SANE_Range ibm2456_res_range =
|
||||
{
|
||||
100, /* minimum */
|
||||
600, /* maximum */
|
||||
0 /* quantization */
|
||||
};
|
||||
|
||||
static const SANE_Range default_x_range =
|
||||
{
|
||||
0, /* minimum */
|
||||
/* (SANE_Word) ( * DEFAULT_MUD), maximum */
|
||||
14032, /* maximum (found empirically for Gray mode) */
|
||||
/* in Lineart mode it works till 14062 */
|
||||
2 /* quantization */
|
||||
};
|
||||
|
||||
static const SANE_Range default_y_range =
|
||||
{
|
||||
0, /* minimum */
|
||||
/* (SANE_Word) (14 * DEFAULT_MUD), maximum */
|
||||
20410, /* maximum (found empirically) */
|
||||
2 /* quantization */
|
||||
};
|
||||
|
||||
|
||||
|
||||
static inline void
|
||||
_lto2b(SANE_Int val, SANE_Byte *bytes)
|
||||
|
||||
{
|
||||
|
||||
bytes[0] = (val >> 8) & 0xff;
|
||||
bytes[1] = val & 0xff;
|
||||
}
|
||||
|
||||
static inline void
|
||||
_lto3b(SANE_Int val, SANE_Byte *bytes)
|
||||
|
||||
{
|
||||
|
||||
bytes[0] = (val >> 16) & 0xff;
|
||||
bytes[1] = (val >> 8) & 0xff;
|
||||
bytes[2] = val & 0xff;
|
||||
}
|
||||
|
||||
static inline void
|
||||
_lto4b(SANE_Int val, SANE_Byte *bytes)
|
||||
{
|
||||
|
||||
bytes[0] = (val >> 24) & 0xff;
|
||||
bytes[1] = (val >> 16) & 0xff;
|
||||
bytes[2] = (val >> 8) & 0xff;
|
||||
bytes[3] = val & 0xff;
|
||||
}
|
||||
|
||||
static inline SANE_Int
|
||||
_2btol(SANE_Byte *bytes)
|
||||
{
|
||||
SANE_Int rv;
|
||||
|
||||
rv = (bytes[0] << 8) |
|
||||
bytes[1];
|
||||
return (rv);
|
||||
}
|
||||
|
||||
static inline SANE_Int
|
||||
_3btol(SANE_Byte *bytes)
|
||||
{
|
||||
SANE_Int rv;
|
||||
|
||||
rv = (bytes[0] << 16) |
|
||||
(bytes[1] << 8) |
|
||||
bytes[2];
|
||||
return (rv);
|
||||
}
|
||||
|
||||
static inline SANE_Int
|
||||
_4btol(SANE_Byte *bytes)
|
||||
{
|
||||
SANE_Int rv;
|
||||
|
||||
rv = (bytes[0] << 24) |
|
||||
(bytes[1] << 16) |
|
||||
(bytes[2] << 8) |
|
||||
bytes[3];
|
||||
return (rv);
|
||||
}
|
||||
|
||||
typedef enum
|
||||
{
|
||||
OPT_NUM_OPTS = 0,
|
||||
|
||||
OPT_MODE_GROUP,
|
||||
OPT_MODE,
|
||||
OPT_X_RESOLUTION,
|
||||
OPT_Y_RESOLUTION,
|
||||
OPT_ADF,
|
||||
|
||||
OPT_GEOMETRY_GROUP,
|
||||
OPT_PAPER, /* predefined formats */
|
||||
OPT_TL_X, /* top-left x */
|
||||
OPT_TL_Y, /* top-left y */
|
||||
OPT_BR_X, /* bottom-right x */
|
||||
OPT_BR_Y, /* bottom-right y */
|
||||
|
||||
OPT_ENHANCEMENT_GROUP,
|
||||
OPT_BRIGHTNESS,
|
||||
OPT_CONTRAST,
|
||||
|
||||
/* must come last: */
|
||||
NUM_OPTIONS
|
||||
}
|
||||
Ibm_Option;
|
||||
|
||||
typedef union
|
||||
{
|
||||
SANE_Bool b;
|
||||
SANE_Word w;
|
||||
SANE_Word *wa; /* word array */
|
||||
SANE_String s;
|
||||
}
|
||||
Option_Value;
|
||||
|
||||
typedef struct Ibm_Info
|
||||
{
|
||||
SANE_Range xres_range;
|
||||
SANE_Range yres_range;
|
||||
SANE_Range x_range;
|
||||
SANE_Range y_range;
|
||||
SANE_Range brightness_range;
|
||||
SANE_Range contrast_range;
|
||||
|
||||
SANE_Int xres_default;
|
||||
SANE_Int yres_default;
|
||||
SANE_Int image_mode_default;
|
||||
SANE_Int paper_default;
|
||||
SANE_Int brightness_default;
|
||||
SANE_Int contrast_default;
|
||||
SANE_Int adf_default;
|
||||
|
||||
SANE_Int bmu;
|
||||
SANE_Int mud;
|
||||
}
|
||||
Ibm_Info;
|
||||
|
||||
typedef struct Ibm_Device
|
||||
{
|
||||
struct Ibm_Device *next;
|
||||
SANE_Device sane;
|
||||
Ibm_Info info;
|
||||
}
|
||||
Ibm_Device;
|
||||
|
||||
typedef struct Ibm_Scanner
|
||||
{
|
||||
/* all the state needed to define a scan request: */
|
||||
struct Ibm_Scanner *next;
|
||||
int fd; /* SCSI filedescriptor */
|
||||
|
||||
SANE_Option_Descriptor opt[NUM_OPTIONS];
|
||||
Option_Value val[NUM_OPTIONS];
|
||||
SANE_Parameters params;
|
||||
/* scanner dependent/low-level state: */
|
||||
Ibm_Device *hw;
|
||||
|
||||
SANE_Int xres;
|
||||
SANE_Int yres;
|
||||
SANE_Int ulx;
|
||||
SANE_Int uly;
|
||||
SANE_Int width;
|
||||
SANE_Int length;
|
||||
SANE_Int brightness;
|
||||
SANE_Int contrast;
|
||||
SANE_Int image_composition;
|
||||
SANE_Int bpp;
|
||||
SANE_Bool reverse;
|
||||
/* next lines by mf */
|
||||
SANE_Int adf_state;
|
||||
#define ADF_UNUSED 0 /* scan from flatbed, not ADF */
|
||||
#define ADF_ARMED 1 /* scan from ADF, everything's set up */
|
||||
#define ADF_CLEANUP 2 /* eject paper from ADF on close */
|
||||
/* end lines by mf */
|
||||
size_t bytes_to_read;
|
||||
int scanning;
|
||||
}
|
||||
Ibm_Scanner;
|
||||
|
||||
struct inquiry_data {
|
||||
SANE_Byte devtype;
|
||||
SANE_Byte byte2;
|
||||
SANE_Byte byte3;
|
||||
SANE_Byte byte4;
|
||||
SANE_Byte byte5;
|
||||
SANE_Byte res1[2];
|
||||
SANE_Byte flags;
|
||||
SANE_Byte vendor[8];
|
||||
SANE_Byte product[8];
|
||||
SANE_Byte revision[4];
|
||||
SANE_Byte byte[60];
|
||||
};
|
||||
|
||||
#define IBM_WINDOW_DATA_SIZE 320
|
||||
struct ibm_window_data {
|
||||
/* header */
|
||||
SANE_Byte reserved[6];
|
||||
SANE_Byte len[2];
|
||||
/* data */
|
||||
SANE_Byte window_id; /* must be zero */
|
||||
SANE_Byte reserved0;
|
||||
SANE_Byte x_res[2];
|
||||
SANE_Byte y_res[2];
|
||||
SANE_Byte x_org[4];
|
||||
SANE_Byte y_org[4];
|
||||
SANE_Byte width[4];
|
||||
SANE_Byte length[4];
|
||||
SANE_Byte brightness;
|
||||
SANE_Byte threshold;
|
||||
SANE_Byte contrast;
|
||||
SANE_Byte image_comp; /* image composition (data type) */
|
||||
SANE_Byte bits_per_pixel;
|
||||
SANE_Byte halftone_code; /* halftone_pattern[0] in ricoh.h */
|
||||
SANE_Byte halftone_id; /* halftone_pattern[1] in ricoh.h */
|
||||
SANE_Byte pad_type;
|
||||
SANE_Byte bit_ordering[2];
|
||||
SANE_Byte compression_type;
|
||||
SANE_Byte compression_arg;
|
||||
SANE_Byte res3[6];
|
||||
|
||||
/* Vendor Specific parameter byte(s) */
|
||||
/* Ricoh specific, follow the scsi2 standard ones */
|
||||
SANE_Byte byte1;
|
||||
SANE_Byte byte2;
|
||||
SANE_Byte mrif_filtering_gamma_id;
|
||||
SANE_Byte byte3;
|
||||
SANE_Byte byte4;
|
||||
SANE_Byte binary_filter;
|
||||
SANE_Byte reserved2[18];
|
||||
|
||||
SANE_Byte reserved3[256];
|
||||
|
||||
};
|
||||
|
||||
struct measurements_units_page {
|
||||
SANE_Byte page_code; /* 0x03 */
|
||||
SANE_Byte parameter_length; /* 0x06 */
|
||||
SANE_Byte bmu;
|
||||
SANE_Byte res1;
|
||||
SANE_Byte mud[2];
|
||||
SANE_Byte res2[2]; /* anybody know what `COH' may mean ??? */
|
||||
/* next 4 lines by mf */
|
||||
SANE_Byte adf_page_code;
|
||||
SANE_Byte adf_parameter_length;
|
||||
SANE_Byte adf_control;
|
||||
SANE_Byte res3[5];
|
||||
};
|
||||
|
||||
struct mode_pages {
|
||||
SANE_Byte page_code;
|
||||
SANE_Byte parameter_length;
|
||||
SANE_Byte rest[14]; /* modified by mf; it was 6; see above */
|
||||
#if 0
|
||||
SANE_Byte more_pages[243]; /* maximum size 255 bytes (incl header) */
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
#endif /* ibm_h */
|
|
@ -51,7 +51,7 @@ SECT5 = sane-abaton.5 sane-agfafocus.5 sane-apple.5 sane-as6e.5 sane-dll.5 \
|
|||
sane-mustek_usb.5 sane-sceptre.5 sane-canon_pp.5 sane-canon630u.5 \
|
||||
sane-teco1.5 sane-teco2.5 sane-teco3.5 sane-test.5 sane-sp15c.5 \
|
||||
sane-coolscan2.5 sane-hpsj5s.5 sane-gt68xx.5 sane-artec_eplus48u.5 \
|
||||
sane-ma1509.5
|
||||
sane-ma1509.5 sane-ibm.5
|
||||
SECT7 = sane.7
|
||||
MANPAGES = $(SECT1) $(SECT5) $(SECT7)
|
||||
READMES = README AUTHORS COPYING ChangeLog LICENSE NEWS PROBLEMS \
|
||||
|
@ -90,7 +90,7 @@ DISTFILES = Makefile.in backend-writing.txt descriptions.txt \
|
|||
sane.tex saned.man scanimage.man sane-sceptre.man sane-canon_pp.man \
|
||||
sane-teco1.man sane-teco2.man sane-teco3.man sane-test.man sane-sp15c.man \
|
||||
sane-hpsj5s.man gamma4scanimage.man sane-gt68xx.man sane-artec_eplus48u.man \
|
||||
sane-ma1509.man
|
||||
sane-ma1509.man sane-ibm.man
|
||||
|
||||
.PHONY: all clean depend dist distclean html html-man install \
|
||||
install-mostang sane-html uninstall
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
; SANE Backend specification file
|
||||
;
|
||||
; It's basically emacs-lisp --- so ";" indicates comment to end of line.
|
||||
; All syntactic elements are keyword tokens, followed by a string or
|
||||
; keyword argument, as specified.
|
||||
;
|
||||
; ":backend" *must* be specified.
|
||||
; All other information is optional (but what good is the file without it?).
|
||||
;
|
||||
|
||||
:backend "ibm" ; name of backend
|
||||
:url "http://www.meier-geinitz.de/sane/ibm-backend/"
|
||||
:version "1.0-3" ; version of backend
|
||||
:status :alpha ; :alpha, :beta, :stable, :new
|
||||
;
|
||||
:manpage "sane-ibm" ; name of manpage (if it exists)
|
||||
|
||||
:devicetype :scanner
|
||||
|
||||
:mfg "IBM" ; name a manufacturer
|
||||
:url "http://www.ibm.com/"
|
||||
|
||||
:model "2456" ; name models for above-specified mfg.
|
||||
:interface "SCSI"
|
||||
:status :alpha
|
||||
;:comment "?"
|
||||
|
||||
:mfg "Ricoh" ; name a manufacturer
|
||||
:model "IS-410"
|
||||
:interface "SCSI"
|
||||
:status :untested
|
||||
:comment "Untested, please report!"
|
||||
|
||||
:model "IS-420"
|
||||
:interface "SCSI"
|
||||
:status :alpha
|
||||
:comment "Flatbed works."
|
||||
|
||||
:model "IS-430"
|
||||
:interface "SCSI"
|
||||
:status :untested
|
||||
:comment "Untested, please report!"
|
|
@ -0,0 +1,88 @@
|
|||
.TH sane-ibm 5 "14 Apr 2003" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
|
||||
.IX sane-ibm
|
||||
.SH NAME
|
||||
sane-ibm \- SANE backend for IBM and Ricoh SCSI flatbed scanners
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B sane-ibm
|
||||
library implements a SANE (Scanner Access Now Easy) backend that provides
|
||||
access to the IBM 2456 and the Ricoh IS-410, IS-420, and IS-430 flatbed
|
||||
scanners. Support for the IS-410 and IS-430 is untested. Please contact the
|
||||
sane-devel mailing list if you own such a scanner.
|
||||
.PP
|
||||
This backend is alpha-quality. It may have bugs and some scanners haven't been
|
||||
tested at all. Be careful and pull the plug if the scanner causes unusual
|
||||
noise.
|
||||
|
||||
.SH "DEVICE NAMES"
|
||||
This backend expects device names of the form:
|
||||
.PP
|
||||
.RS
|
||||
.I special
|
||||
.RE
|
||||
.PP
|
||||
Where
|
||||
.I special
|
||||
is either the path-name for the special device that corresponds to a SCSI
|
||||
scanner. The program
|
||||
.I sane-find-scanner
|
||||
helps to find out the correct device. Under Linux, such a device name could be
|
||||
.I /dev/sg0
|
||||
or
|
||||
.IR /dev/sga ,
|
||||
for example. See
|
||||
.BR sane-scsi (5)
|
||||
for details.
|
||||
|
||||
.SH CONFIGURATION
|
||||
The contents of the
|
||||
.I ibm.conf
|
||||
file is a list of device names that correspond to SCSI
|
||||
scanners. Empty lines and lines starting with a hash mark (#) are
|
||||
ignored. See
|
||||
.BR sane-scsi (5)
|
||||
on details of what constitutes a valid device name.
|
||||
|
||||
.SH FILES
|
||||
.TP
|
||||
.I @CONFIGDIR@/ibm.conf
|
||||
The backend configuration file (see also description of
|
||||
.B SANE_CONFIG_DIR
|
||||
below).
|
||||
.TP
|
||||
.I @LIBDIR@/libsane-ibm.a
|
||||
The static library implementing this backend.
|
||||
.TP
|
||||
.I @LIBDIR@/libsane-ibm.so
|
||||
The shared library implementing this backend (present on systems that
|
||||
support dynamic loading).
|
||||
.SH ENVIRONMENT
|
||||
.TP
|
||||
.B SANE_CONFIG_DIR
|
||||
This environment variable specifies the list of directories that may
|
||||
contain the configuration file. Under UNIX, the directories are
|
||||
separated by a colon (`:'), under OS/2, they are separated by a
|
||||
semi-colon (`;'). If this variable is not set, the configuration file
|
||||
is searched in two default directories: first, the current working
|
||||
directory (".") and then in @CONFIGDIR@. If the value of the
|
||||
environment variable ends with the directory separator character, then
|
||||
the default directories are searched after the explicitly specified
|
||||
directories. For example, setting
|
||||
.B SANE_CONFIG_DIR
|
||||
to "/tmp/config:" would result in directories "tmp/config", ".", and
|
||||
"@CONFIGDIR@" being searched (in this order).
|
||||
.TP
|
||||
.B SANE_DEBUG_IBM
|
||||
If the library was compiled with debug support enabled, this
|
||||
environment variable controls the debug level for this backend. Higher
|
||||
debug levels increase the verbosity of the output.
|
||||
|
||||
.SH "SEE ALSO"
|
||||
.BR sane (7),
|
||||
.BR sane\-find\-scanner (1),
|
||||
.BR sane\-scsi (5),
|
||||
|
||||
.SH AUTHOR
|
||||
mf <massifr@tiscalinet.it>
|
||||
.br
|
||||
Manual page and some fixes by Henning Meier-Geinitz <henning@meier-geinitz.de>
|
|
@ -1,4 +1,4 @@
|
|||
.TH sane 7 "13 Apr 2003" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
|
||||
.TH sane 7 "14 Apr 2003" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
|
||||
.IX sane
|
||||
|
||||
.SH NAME
|
||||
|
@ -260,6 +260,11 @@ The SANE backend for the Hewlett-Packard ScanJet 5S scanner. See
|
|||
.BR sane\-hpsj5s (5)
|
||||
for details.
|
||||
.TP
|
||||
.B ibm
|
||||
The SANE backend for some IBM and Ricoh SCSI scanners. See
|
||||
.BR sane\-ibm (5)
|
||||
for details.
|
||||
.TP
|
||||
.B leo
|
||||
This backend supports the Leo S3 and the Across FS-1130, which is a re-badged
|
||||
LEO FS-1130 scanner. See
|
||||
|
@ -793,6 +798,7 @@ you can also contact the author of this manual page:
|
|||
.BR sane\-gt68xx (5),
|
||||
.BR sane\-hp (5),
|
||||
.BR sane\-hpsj5s (5),
|
||||
.BR sane\-ibm (5),
|
||||
.BR sane\-leo (5),
|
||||
.BR sane\-ma1509 (5),
|
||||
.BR sane\-matsushita (5),
|
||||
|
|
Ładowanie…
Reference in New Issue