Added Samsung SCX-4500W scan over network support for xerox_mfp backend (by Alexander Kuznetsov).

autoconf and automake reconfigure.
merge-requests/1/head
Alex Belkin 2010-09-30 15:11:56 +04:00
rodzic a2b7cf935a
commit 842c98d204
19 zmienionych plików z 462 dodań i 109 usunięć

Wyświetl plik

@ -210,6 +210,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@

Wyświetl plik

@ -1046,13 +1046,13 @@ libsane_v4l_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
libsane_v4l_la_LIBADD = $(COMMON_LIBS) libv4l.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo $(LIBV4L_LIBS)
EXTRA_DIST += v4l.conf.in
libxerox_mfp_la_SOURCES = xerox_mfp.c xerox_mfp.h
libxerox_mfp_la_SOURCES = xerox_mfp.c xerox_mfp-usb.c xerox_mfp-tcp.c xerox_mfp.h
libxerox_mfp_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=xerox_mfp
nodist_libsane_xerox_mfp_la_SOURCES = xerox_mfp-s.c
libsane_xerox_mfp_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=xerox_mfp
libsane_xerox_mfp_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
libsane_xerox_mfp_la_LIBADD = $(COMMON_LIBS) libxerox_mfp.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS)
libsane_xerox_mfp_la_LIBADD = $(COMMON_LIBS) libxerox_mfp.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_tcp.lo $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS)
EXTRA_DIST += xerox_mfp.conf.in
libdll_la_SOURCES = dll.c

Wyświetl plik

@ -572,9 +572,9 @@ libsane_fujitsu_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(libsane_fujitsu_la_LDFLAGS) $(LDFLAGS) -o $@
libsane_genesys_la_DEPENDENCIES = $(COMMON_LIBS) libgenesys.la \
../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo \
../sanei/sanei_config.lo sane_strstatus.lo \
../sanei/sanei_usb.lo ../sanei/sanei_magic.lo $(am__DEPENDENCIES_1) \
../sanei/sanei_magic.lo ../sanei/sanei_init_debug.lo \
../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo \
sane_strstatus.lo ../sanei/sanei_usb.lo $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
nodist_libsane_genesys_la_OBJECTS = libsane_genesys_la-genesys-s.lo
libsane_genesys_la_OBJECTS = $(nodist_libsane_genesys_la_OBJECTS)
@ -1189,8 +1189,9 @@ libsane_v4l_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
libsane_xerox_mfp_la_DEPENDENCIES = $(COMMON_LIBS) libxerox_mfp.la \
../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo \
../sanei/sanei_config.lo sane_strstatus.lo \
../sanei/sanei_usb.lo $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
../sanei/sanei_usb.lo ../sanei/sanei_tcp.lo \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1)
nodist_libsane_xerox_mfp_la_OBJECTS = \
libsane_xerox_mfp_la-xerox_mfp-s.lo
libsane_xerox_mfp_la_OBJECTS = $(nodist_libsane_xerox_mfp_la_OBJECTS)
@ -1258,7 +1259,9 @@ libv4l_la_LIBADD =
am_libv4l_la_OBJECTS = libv4l_la-v4l.lo
libv4l_la_OBJECTS = $(am_libv4l_la_OBJECTS)
libxerox_mfp_la_LIBADD =
am_libxerox_mfp_la_OBJECTS = libxerox_mfp_la-xerox_mfp.lo
am_libxerox_mfp_la_OBJECTS = libxerox_mfp_la-xerox_mfp.lo \
libxerox_mfp_la-xerox_mfp-usb.lo \
libxerox_mfp_la-xerox_mfp-tcp.lo
libxerox_mfp_la_OBJECTS = $(am_libxerox_mfp_la_OBJECTS)
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include/sane
depcomp = $(SHELL) $(top_srcdir)/depcomp
@ -1532,6 +1535,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
@ -1998,7 +2002,7 @@ libgenesys_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=genesys
nodist_libsane_genesys_la_SOURCES = genesys-s.c
libsane_genesys_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=genesys
libsane_genesys_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
libsane_genesys_la_LIBADD = $(COMMON_LIBS) libgenesys.la ../sanei/sanei_magic.lo ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS)
libsane_genesys_la_LIBADD = $(COMMON_LIBS) libgenesys.la ../sanei/sanei_magic.lo ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS)
libgphoto2_i_la_SOURCES = gphoto2.c gphoto2.h
libgphoto2_i_la_CPPFLAGS = $(AM_CPPFLAGS) @GPHOTO2_CPPFLAGS@ -DBACKEND_NAME=gphoto2
nodist_libsane_gphoto2_la_SOURCES = gphoto2-s.c
@ -2345,12 +2349,12 @@ nodist_libsane_v4l_la_SOURCES = v4l-s.c
libsane_v4l_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=v4l
libsane_v4l_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
libsane_v4l_la_LIBADD = $(COMMON_LIBS) libv4l.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo $(LIBV4L_LIBS)
libxerox_mfp_la_SOURCES = xerox_mfp.c xerox_mfp.h
libxerox_mfp_la_SOURCES = xerox_mfp.c xerox_mfp-usb.c xerox_mfp-tcp.c xerox_mfp.h
libxerox_mfp_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=xerox_mfp
nodist_libsane_xerox_mfp_la_SOURCES = xerox_mfp-s.c
libsane_xerox_mfp_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=xerox_mfp
libsane_xerox_mfp_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
libsane_xerox_mfp_la_LIBADD = $(COMMON_LIBS) libxerox_mfp.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS)
libsane_xerox_mfp_la_LIBADD = $(COMMON_LIBS) libxerox_mfp.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_tcp.lo $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS)
libdll_la_SOURCES = dll.c
BUILT_SOURCES = dll-preload.h
libdll_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=dll
@ -3038,6 +3042,8 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libumax_pp_la-umax_pp_low.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libumax_pp_la-umax_pp_mid.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libv4l_la-v4l.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libxerox_mfp_la-xerox_mfp-tcp.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libxerox_mfp_la-xerox_mfp-usb.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libxerox_mfp_la-xerox_mfp.Plo@am__quote@
.c.o:
@ -4517,6 +4523,20 @@ libxerox_mfp_la-xerox_mfp.lo: xerox_mfp.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxerox_mfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libxerox_mfp_la-xerox_mfp.lo `test -f 'xerox_mfp.c' || echo '$(srcdir)/'`xerox_mfp.c
libxerox_mfp_la-xerox_mfp-usb.lo: xerox_mfp-usb.c
@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxerox_mfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libxerox_mfp_la-xerox_mfp-usb.lo -MD -MP -MF $(DEPDIR)/libxerox_mfp_la-xerox_mfp-usb.Tpo -c -o libxerox_mfp_la-xerox_mfp-usb.lo `test -f 'xerox_mfp-usb.c' || echo '$(srcdir)/'`xerox_mfp-usb.c
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libxerox_mfp_la-xerox_mfp-usb.Tpo $(DEPDIR)/libxerox_mfp_la-xerox_mfp-usb.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='xerox_mfp-usb.c' object='libxerox_mfp_la-xerox_mfp-usb.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxerox_mfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libxerox_mfp_la-xerox_mfp-usb.lo `test -f 'xerox_mfp-usb.c' || echo '$(srcdir)/'`xerox_mfp-usb.c
libxerox_mfp_la-xerox_mfp-tcp.lo: xerox_mfp-tcp.c
@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxerox_mfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libxerox_mfp_la-xerox_mfp-tcp.lo -MD -MP -MF $(DEPDIR)/libxerox_mfp_la-xerox_mfp-tcp.Tpo -c -o libxerox_mfp_la-xerox_mfp-tcp.lo `test -f 'xerox_mfp-tcp.c' || echo '$(srcdir)/'`xerox_mfp-tcp.c
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libxerox_mfp_la-xerox_mfp-tcp.Tpo $(DEPDIR)/libxerox_mfp_la-xerox_mfp-tcp.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='xerox_mfp-tcp.c' object='libxerox_mfp_la-xerox_mfp-tcp.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxerox_mfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libxerox_mfp_la-xerox_mfp-tcp.lo `test -f 'xerox_mfp-tcp.c' || echo '$(srcdir)/'`xerox_mfp-tcp.c
mostlyclean-libtool:
-rm -f *.lo

Wyświetl plik

@ -0,0 +1,178 @@
/*
* SANE backend for
* Samsung SCX-4500W
*
* Network Scanners Support
* Copyright 2010 Alexander Kuznetsov <acca(at)cpan.org>
*
* This program is licensed under GPL + SANE exception.
* More info at http://www.sane-project.org/license.html
*
*/
#undef BACKEND_NAME
#define BACKEND_NAME xerox_mfp
#define DEBUG_DECLARE_ONLY
#define DEBUG_NOT_STATIC
#include "sane/config.h"
#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/time.h>
#include "sane/saneopts.h"
#include "sane/sanei_scsi.h"
#include "sane/sanei_usb.h"
#include "sane/sanei_pio.h"
#include "sane/sanei_tcp.h"
#include "sane/sanei_udp.h"
#include "sane/sanei_backend.h"
#include "sane/sanei_config.h"
#include "xerox_mfp.h"
#define RECV_TIMEOUT 1 /* seconds */
extern int sanei_debug_xerox_mfp;
int tcp_dev_request (struct device *dev,
SANE_Byte *cmd, size_t cmdlen,
SANE_Byte *resp, size_t *resplen)
{
size_t bytes_recv = 0;
ssize_t rc = 1;
size_t len;
/* Send request, if any */
if (cmd && cmdlen) {
len = (size_t)sanei_tcp_write(dev->dn, cmd, cmdlen);
if (len != cmdlen) {
DBG (1, "%s: sent only %lu bytes of %lu\n",
__FUNCTION__, (u_long)len, (u_long)cmdlen);
return SANE_STATUS_IO_ERROR;
}
}
/* Receive response, if expected */
if (resp && resplen) {
DBG (3, "%s: wait for %i bytes\n", __FUNCTION__, (int)*resplen);
while (bytes_recv < *resplen && rc > 0) {
rc = recv(dev->dn, resp+bytes_recv, *resplen-bytes_recv, 0);
if (rc > 0) bytes_recv += rc;
else {
DBG(1, "%s: error %s, bytes requested: %i, bytes read: %i\n",
__FUNCTION__, strerror(errno), (int)*resplen, (int)bytes_recv);
*resplen = bytes_recv;
/*
TODO:
do something smarter than that!
*/
return SANE_STATUS_GOOD;
return SANE_STATUS_IO_ERROR;
}
}
}
*resplen = bytes_recv;
return SANE_STATUS_GOOD;
}
SANE_Status tcp_dev_open (struct device *dev)
{
SANE_Status status;
char* strhost;
char* strport;
int port;
struct servent *sp;
struct timeval tv;
SANE_String_Const devname;
devname = dev->sane.name;
DBG (3, "%s: open %s\n", __FUNCTION__, devname);
if (strncmp (devname, "tcp", 3) != 0) return SANE_STATUS_INVAL;
devname += 3;
devname = sanei_config_skip_whitespace (devname);
if (!*devname) return SANE_STATUS_INVAL;
devname = sanei_config_get_string (devname, &strhost);
devname = sanei_config_skip_whitespace (devname);
if (*devname)
devname = sanei_config_get_string (devname, &strport);
else
strport = "9400";
if (isdigit(*strport)) {
port = atoi(strport);
} else {
if ((sp = getservbyname(strport, "tcp"))) {
port = ntohs(sp->s_port);
} else {
DBG (1, "%s: unknown TCP service %s\n", __FUNCTION__, strport);
return SANE_STATUS_IO_ERROR;
}
}
status = sanei_tcp_open(strhost, port, &dev->dn);
if (status == SANE_STATUS_GOOD) {
tv.tv_sec = RECV_TIMEOUT;
tv.tv_usec = 0;
if (setsockopt (dev->dn, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv) < 0) {
DBG(1, "%s: setsockopts %s", __FUNCTION__, strerror(errno));
}
}
return status;
}
void
tcp_dev_close (struct device *dev)
{
if (!dev) return;
DBG (3, "%s: closing dev %p\n", __FUNCTION__, (void *)dev);
/* finish all operations */
if (dev->scanning) {
dev->cancel = 1;
/* flush READ_IMAGE data */
if (dev->reading) sane_read(dev, NULL, 1, NULL);
/* send cancel if not sent before */
if (dev->state != SANE_STATUS_CANCELLED)
ret_cancel(dev, 0);
}
sanei_tcp_close(dev->dn);
dev->dn = -1;
}
SANE_Status
tcp_configure_device (const char *devname, SANE_Status (*list_one)(SANE_String_Const devname))
{
/*
TODO: LAN scanners multicast discovery.
devname would contain "tcp auto"
We find new devnames and feed them to
`list_one_device' one by one
*/
return list_one(devname);
}
/* xerox_mfp-tcp.c */

Wyświetl plik

@ -0,0 +1,112 @@
/*
* SANE backend for Xerox Phaser 3200MFP
* Copyright 2008 ABC <abc@telekom.ru>
*
* This program is licensed under GPL + SANE exception.
* More info at http://www.sane-project.org/license.html
*/
#undef BACKEND_NAME
#define BACKEND_NAME xerox_mfp
#define DEBUG_DECLARE_ONLY
#define DEBUG_NOT_STATIC
#include "sane/config.h"
#include "sane/saneopts.h"
#include "sane/sanei_config.h"
#include "sane/sanei_backend.h"
#include "sane/sanei_debug.h"
#include "sane/sanei_usb.h"
#include "xerox_mfp.h"
extern int sanei_debug_xerox_mfp;
int
usb_dev_request (struct device *dev,
SANE_Byte *cmd, size_t cmdlen,
SANE_Byte *resp, size_t *resplen)
{
SANE_Status status;
size_t len = cmdlen;
if (cmd && cmdlen) {
status = sanei_usb_write_bulk (dev->dn, cmd, &cmdlen);
if (status != SANE_STATUS_GOOD) {
DBG (1, "%s: sanei_usb_write_bulk: %s\n", __FUNCTION__,
sane_strstatus (status));
return SANE_STATUS_IO_ERROR;
}
if (cmdlen != len) {
DBG (1, "%s: sanei_usb_write_bulk: wanted %lu bytes, wrote %lu bytes\n",
__FUNCTION__, (size_t)len, (size_t)cmdlen);
return SANE_STATUS_IO_ERROR;
}
}
if (resp && resplen) {
status = sanei_usb_read_bulk (dev->dn, resp, resplen);
if (status != SANE_STATUS_GOOD) {
DBG (1, "%s: sanei_usb_read_bulk: %s\n", __FUNCTION__,
sane_strstatus (status));
return SANE_STATUS_IO_ERROR;
}
}
return SANE_STATUS_GOOD;
}
SANE_Status
usb_dev_open (struct device *dev)
{
SANE_Status status;
DBG (3, "%s: open %p\n", __FUNCTION__, (void *)dev);
status = sanei_usb_open (dev->sane.name, &dev->dn);
if (status != SANE_STATUS_GOOD) {
DBG (1, "%s: sanei_usb_open(%s): %s\n", __FUNCTION__,
dev->sane.name, sane_strstatus (status));
dev->dn = -1;
return status;
}
sanei_usb_clear_halt (dev->dn);
return SANE_STATUS_GOOD;
}
void
usb_dev_close (struct device *dev)
{
if (!dev)
return;
DBG (3, "%s: closing dev %p\n", __FUNCTION__, (void *)dev);
/* finish all operations */
if (dev->scanning) {
dev->cancel = 1;
/* flush READ_IMAGE data */
if (dev->reading)
sane_read(dev, NULL, 1, NULL);
/* send cancel if not sent before */
if (dev->state != SANE_STATUS_CANCELLED)
ret_cancel(dev, 0);
}
sanei_usb_clear_halt (dev->dn); /* unstall for next users */
sanei_usb_close (dev->dn);
dev->dn = -1;
}
/* SANE API ignores return code of this callback */
SANE_Status
usb_configure_device (const char *devname, SANE_Status (*attach) (const char *dev))
{
sanei_usb_set_timeout (1000);
sanei_usb_attach_matching_devices (devname, attach);
sanei_usb_set_timeout (30000);
return SANE_STATUS_GOOD;
}
/* xerox_mfp-usb.c */

Wyświetl plik

@ -2,10 +2,16 @@
* SANE backend for Xerox Phaser 3200MFP
* Copyright 2008 ABC <abc@telekom.ru>
*
* Network Scanners Support
* Copyright 2010 Alexander Kuznetsov <acca(at)cpan.org>
*
* This program is licensed under GPL + SANE exception.
* More info at http://www.sane-project.org/license.html
*/
#define DEBUG_NOT_STATIC
#define BACKEND_NAME xerox_mfp
#include "../include/sane/config.h"
#include "../include/lassert.h"
#include <ctype.h>
@ -22,50 +28,20 @@
#include "../include/sane/sanei_thread.h"
#include "../include/sane/sanei_usb.h"
#include "../include/sane/sanei_config.h"
#define BACKEND_NAME xerox_mfp
#include "../include/sane/sanei_backend.h"
#include "xerox_mfp.h"
#define BACKEND_BUILD 11
#define BACKEND_BUILD 12
#define XEROX_CONFIG_FILE "xerox_mfp.conf"
static const SANE_Device **devlist = NULL; /* sane_get_devices array */
static struct device *devices_head = NULL; /* sane_get_devices list */
static int
dev_request (struct device *dev,
SANE_Byte *cmd, size_t cmdlen,
SANE_Byte *resp, size_t *resplen)
{
SANE_Status status;
size_t len = cmdlen;
if (cmd && cmdlen) {
status = sanei_usb_write_bulk (dev->dn, cmd, &cmdlen);
if (status != SANE_STATUS_GOOD) {
DBG (1, "%s: sanei_usb_write_bulk: %s\n", __FUNCTION__,
sane_strstatus (status));
return SANE_STATUS_IO_ERROR;
}
if (cmdlen != len) {
DBG (1, "%s: sanei_usb_write_bulk: wanted %lu bytes, wrote %lu bytes\n",
__FUNCTION__, (u_long)len, (u_long)cmdlen);
return SANE_STATUS_IO_ERROR;
}
}
if (resp && resplen) {
status = sanei_usb_read_bulk (dev->dn, resp, resplen);
if (status != SANE_STATUS_GOOD) {
DBG (1, "%s: sanei_usb_read_bulk: %s\n", __FUNCTION__,
sane_strstatus (status));
return SANE_STATUS_IO_ERROR;
}
}
return SANE_STATUS_GOOD;
}
transport available_transports[] = {
{ "usb", usb_dev_request, usb_dev_open, usb_dev_close, usb_configure_device },
{ "tcp", tcp_dev_request, tcp_dev_open, tcp_dev_close, tcp_configure_device },
{ 0 }
};
static int resolv_state(int state)
{
@ -155,7 +131,7 @@ static int dev_command (struct device *dev, SANE_Byte * cmd, size_t reqlen)
dev->state = 0;
DBG (4, ":: dev_command(%s[%#x], %lu)\n", str_cmd(cmd[2]), cmd[2],
(u_long)reqlen);
status = dev_request (dev, cmd, sendlen, res, &dev->reslen);
status = dev->io->dev_request(dev, cmd, sendlen, res, &dev->reslen);
if (status != SANE_STATUS_GOOD) {
DBG (1, "%s: dev_request: %s\n", __FUNCTION__, sane_strstatus (status));
dev->state = SANE_STATUS_IO_ERROR;
@ -251,7 +227,7 @@ static SANE_Status dev_stop(struct device *dev)
return state;
}
static SANE_Status ret_cancel(struct device *dev, SANE_Status ret)
SANE_Status ret_cancel(struct device *dev, SANE_Status ret)
{
dev_cmd(dev, CMD_ABORT);
if (dev->scanning) {
@ -810,46 +786,6 @@ sane_control_option (SANE_Handle h, SANE_Int opt, SANE_Action act,
return SANE_STATUS_GOOD;
}
static SANE_Status
dev_open (struct device *dev)
{
SANE_Status status;
DBG (3, "%s: open %p\n", __FUNCTION__, (void *)dev);
status = sanei_usb_open (dev->sane.name, &dev->dn);
if (status != SANE_STATUS_GOOD) {
DBG (1, "%s: sanei_usb_open(%s): %s\n", __FUNCTION__,
dev->sane.name, sane_strstatus (status));
dev->dn = -1;
return status;
}
sanei_usb_clear_halt (dev->dn);
return SANE_STATUS_GOOD;
}
static void
dev_close (struct device *dev)
{
if (!dev)
return;
DBG (3, "%s: closing dev %p\n", __FUNCTION__, (void *)dev);
/* finish all operations */
if (dev->scanning) {
dev->cancel = 1;
/* flush READ_IMAGE data */
if (dev->reading)
sane_read(dev, NULL, 1, NULL);
/* send cancel if not sent before */
if (dev->state != SANE_STATUS_CANCELLED)
ret_cancel(dev, 0);
}
sanei_usb_clear_halt (dev->dn); /* unstall for next users */
sanei_usb_close (dev->dn);
dev->dn = -1;
}
static void
dev_free (struct device *dev)
{
@ -894,6 +830,7 @@ list_one_device (SANE_String_Const devname)
{
struct device *dev;
SANE_Status status;
transport *tr;
DBG (4, "%s: %s\n", __FUNCTION__, devname);
@ -902,12 +839,20 @@ list_one_device (SANE_String_Const devname)
return SANE_STATUS_GOOD;
}
for (tr = available_transports; tr->ttype; tr++) {
if (!strncmp (devname, tr->ttype, strlen(tr->ttype)))
break;
}
if (!tr->ttype)
return SANE_STATUS_INVAL;
dev = calloc (1, sizeof (struct device));
if (dev == NULL)
return SANE_STATUS_NO_MEM;
dev->sane.name = strdup (devname);
status = dev_open (dev);
dev->io = tr;
status = tr->dev_open (dev);
if (status != SANE_STATUS_GOOD) {
dev_free (dev);
return status;
@ -915,7 +860,7 @@ list_one_device (SANE_String_Const devname)
/* status = dev_cmd (dev, CMD_ABORT);*/
status = dev_inquiry (dev);
dev_close (dev);
tr->dev_close (dev);
if (status != SANE_STATUS_GOOD) {
DBG (1, "%s: dev_inquiry(%s): %s\n", __FUNCTION__,
dev->sane.name, sane_strstatus (status));
@ -933,8 +878,13 @@ list_one_device (SANE_String_Const devname)
static SANE_Status
list_conf_devices (UNUSED (SANEI_Config * config), const char *devname)
{
sanei_usb_attach_matching_devices (devname, list_one_device);
return SANE_STATUS_GOOD;
transport *tr;
for (tr = available_transports; tr->ttype; tr++) {
if (!strncmp (devname, tr->ttype, strlen(tr->ttype)))
return tr->configure_device(devname, list_one_device);
}
return SANE_STATUS_INVAL;
}
SANE_Status
@ -980,15 +930,11 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local)
}
free_devices ();
sanei_usb_set_timeout (1000);
config.count = 0;
config.descriptors = NULL;
config.values = NULL;
sanei_configure_attach (XEROX_CONFIG_FILE, &config, list_conf_devices);
sanei_usb_attach_matching_devices ("usb 0x0924 0x3da4", list_one_device);
sanei_usb_set_timeout (30000);
for (dev_count = 0, dev = devices_head; dev; dev = dev->next)
dev_count++;
@ -1018,7 +964,7 @@ sane_close (SANE_Handle h)
return;
DBG (3, "%s: %p (%s)\n", __FUNCTION__, (void *)dev, dev->sane.name);
dev_close (dev);
dev->io->dev_close(dev);
}
SANE_Status
@ -1043,7 +989,7 @@ sane_open (SANE_String_Const name, SANE_Handle * h)
for (dev = devices_head; dev; dev = dev->next) {
if (strcmp(name, dev->sane.name) == 0) {
*h = dev;
return dev_open(dev);
return dev->io->dev_open(dev);
}
}
}
@ -1250,7 +1196,7 @@ sane_read (SANE_Handle h, SANE_Byte * buf, SANE_Int maxlen, SANE_Int * lenp)
DBG (9, "<> request len: %lu, [%d, %d; %d]\n",
(u_long)datalen, dev->dataoff, DATATAIL(dev), dev->datalen);
if ((status = dev_request (dev, NULL, 0, rbuf, &datalen)) !=
if ((status = dev->io->dev_request(dev, NULL, 0, rbuf, &datalen)) !=
SANE_STATUS_GOOD)
return status;
dev->datalen += datalen;

Wyświetl plik

@ -1,5 +1,8 @@
#xerox_mfp.conf
#Xerox Phaser 3200MFP
usb 0x0924 0x3da4
#Dell MFP Laser Printer 1815dn
usb 0x413c 0x5124
@ -42,3 +45,7 @@ usb 0x0924 0x4293
#Xerox WorkCentre 3220
usb 0x0924 0x4294
# Samsung SCX-4500W, network mode
# tcp HOST_ADDR PORT
# Uncomment and configure:
#tcp scx4500 9400

Wyświetl plik

@ -2,10 +2,16 @@
* SANE backend for Xerox Phaser 3200MFP
* Copyright 2008 ABC <abc@telekom.ru>
*
* Network scanners support
* Copyright 2010 Alexander Kuznetsov <acca(at)cpan.org>
*
* This program is licensed under GPL + SANE exception.
* More info at http://www.sane-project.org/license.html
*/
#ifndef xerox_mfp_h
#define xerox_mfp_h
#ifdef __GNUC__
#define UNUSED(x) x __attribute__((unused))
#else
@ -37,6 +43,8 @@ enum options {
NUM_OPTIONS
};
typedef struct transport transport;
struct device {
struct device *next;
SANE_Device sane;
@ -103,8 +111,36 @@ struct device {
int total_img_size; /* predicted image size */
int total_out_size; /* total we sent to user */
int total_data_size; /* total of what scanner sent us */
/* transport to use */
transport *io;
};
/* Transport abstract layer */
struct transport {
char* ttype;
int (*dev_request) (struct device *dev,
SANE_Byte *cmd, size_t cmdlen,
SANE_Byte *resp, size_t *resplen);
SANE_Status (*dev_open) (struct device *dev);
void (*dev_close) (struct device *dev);
SANE_Status (*configure_device) (const char *devname, SANE_Status (*cb)(SANE_String_Const devname));
};
/* USB transport */
int usb_dev_request (struct device *dev, SANE_Byte *cmd, size_t cmdlen, SANE_Byte *resp, size_t *resplen);
SANE_Status usb_dev_open (struct device *dev);
void usb_dev_close (struct device *dev);
SANE_Status usb_configure_device (const char *devname, SANE_Status (*cb)(SANE_String_Const devname));
/* TCP unicast */
int tcp_dev_request (struct device *dev, SANE_Byte *cmd, size_t cmdlen, SANE_Byte *resp, size_t *resplen);
SANE_Status tcp_dev_open (struct device *dev);
void tcp_dev_close (struct device *dev);
SANE_Status tcp_configure_device (const char *devname, SANE_Status (*cb)(SANE_String_Const devname));
/* device wants transfer buffer to be multiple of 512 */
#define USB_BLOCK_SIZE 512
#define USB_BLOCK_MASK ~(USB_BLOCK_SIZE - 1)
@ -119,6 +155,9 @@ static inline int dataroom(struct device *dev) {
return DATASIZE - tail;
}
/* Functions from original xerox_mfp.c, used in -usb.c and -tcp.c */
SANE_Status ret_cancel(struct device *dev, SANE_Status ret);
/* a la SCSI commands. */ /* request len, response len, exception */
#define CMD_ABORT 0x06 /* 4, 32 */
#define CMD_INQUIRY 0x12 /* 4, 70 */
@ -174,4 +213,4 @@ static inline int dataroom(struct device *dev) {
#define DOC_FLATBED 0x40
#define DOC_AUTO 0x80
/* xerox_mfp.h */
#endif /* xerox_mfp_h */

Wyświetl plik

@ -173,6 +173,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@

Wyświetl plik

@ -77,3 +77,7 @@
:interface "USB"
:usbid "0x04e8" "0x3434"
:status :good
:model "SCX-4500W"
:interface "Ethernet"
:status :basic

Wyświetl plik

@ -6,10 +6,28 @@ sane\-xerox_mfp \- SANE backend for Xerox Phaser 3200MFP device
The
.B sane\-xerox_mfp
library implements a SANE (Scanner Access Now Easy) backend that provides
access to the following Xerox USB multifunction-peripheral:
access to the following USB and network multifunction-peripheral:
.PP
.RS
Phaser 3200MFP
.br
Dell MFP Laser Printer 1815dn
.br
Xerox Phaser 6110MFP
.br
Samsung CLX-3170fn & CLX-3175FW
.br
Samsung SCX-4200
.br
Samsung SCX-4300
.br
Samsung SCX-4500
.br
Samsung SCX-4500W
.br
Samsung SCX4725-FN
.br
Xerox WorkCentre 3119 Series
.RE
.PP
If you own a scanner other than the ones listed above that works with this
@ -20,9 +38,24 @@ the USB vendor and device ids (e.g. from
or syslog) to us. Even if the scanner's name is only slightly different from
the models mentioned above, please let us know.
.SH CONFIGURATION
None required.
.I @CONFIGDIR@/xerox_mfp.conf
USB scanners do not need any configuration.
For SCX-4500W in network mode you need to specify
.PP
.RS
.B tcp host_address [port]
.RE
.PP
The
.B host_address
is passed through resolver, thus can be a dotted quad or a name from /etc/hosts or resolvable through DNS.
.SH FILES
.TP
.I @CONFIGDIR@/xerox_mfp.conf
The backend configuration file. By default all scanner types/models are enabled, you
may want to comment out unwanted.
.TP
.I @LIBDIR@/libsane\-xerox_mfp.a
The static library implementing this backend.
.TP
@ -37,12 +70,16 @@ debug levels increase the verbosity of the output.
Example:
export SANE_DEBUG_XEROX_MFP=4
.SH "SEE ALSO"
.BR sane (7),
.BR sane\-usb (5),
.br
.SH AUTHOR
Alex Belkin <abc@telekom.ru>
Samsung SCX-4500W scan over network support
Alexander Kuznetsov <acca(at)cpan.org>
.SH BUGS:
Multicast autoconfiguration for LAN scanners is not implemented yet. IPv6 addressing never been tested.
.SH "SEE ALSO"
.BR sane (7),
.BR sane\-usb (5)
.br

Wyświetl plik

@ -172,6 +172,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@

Wyświetl plik

@ -158,6 +158,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@

Wyświetl plik

@ -181,6 +181,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@

Wyświetl plik

@ -156,6 +156,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@

Wyświetl plik

@ -133,6 +133,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@

Wyświetl plik

@ -172,6 +172,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@

Wyświetl plik

@ -131,6 +131,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@

Wyświetl plik

@ -191,6 +191,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@