diff options
Diffstat (limited to 'backend/xerox_mfp-usb.c')
-rw-r--r-- | backend/xerox_mfp-usb.c | 112 |
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 */ |