summaryrefslogtreecommitdiff
path: root/backend/xerox_mfp-usb.c
diff options
context:
space:
mode:
Diffstat (limited to 'backend/xerox_mfp-usb.c')
-rw-r--r--backend/xerox_mfp-usb.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/backend/xerox_mfp-usb.c b/backend/xerox_mfp-usb.c
new file mode 100644
index 0000000..b9b56d8
--- /dev/null
+++ b/backend/xerox_mfp-usb.c
@@ -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 */