• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * SANE backend for Xerox Phaser 3200MFP
3  * Copyright 2008 ABC <abc@telekom.ru>
4  *
5  * This program is licensed under GPL + SANE exception.
6  * More info at http://www.sane-project.org/license.html
7  */
8 
9 #undef	BACKEND_NAME
10 #define	BACKEND_NAME xerox_mfp
11 #define DEBUG_DECLARE_ONLY
12 #define DEBUG_NOT_STATIC
13 #include "sane/config.h"
14 #include "sane/saneopts.h"
15 #include "sane/sanei_config.h"
16 #include "sane/sanei_backend.h"
17 #include "sane/sanei_debug.h"
18 #include "sane/sanei_usb.h"
19 #include "xerox_mfp.h"
20 
21 
22 extern int sanei_debug_xerox_mfp;
23 
24 int
usb_dev_request(struct device * dev,SANE_Byte * cmd,size_t cmdlen,SANE_Byte * resp,size_t * resplen)25 usb_dev_request(struct device *dev,
26                 SANE_Byte *cmd, size_t cmdlen,
27                 SANE_Byte *resp, size_t *resplen)
28 {
29     SANE_Status status;
30     size_t len = cmdlen;
31 
32     if (cmd && cmdlen) {
33         status = sanei_usb_write_bulk(dev->dn, cmd, &cmdlen);
34         if (status != SANE_STATUS_GOOD) {
35             DBG(1, "%s: sanei_usb_write_bulk: %s\n", __func__,
36                 sane_strstatus(status));
37             return SANE_STATUS_IO_ERROR;
38         }
39 
40         if (cmdlen != len) {
41             DBG(1, "%s: sanei_usb_write_bulk: wanted %lu bytes, wrote %lu bytes\n",
42                 __func__, (size_t)len, (size_t)cmdlen);
43             return SANE_STATUS_IO_ERROR;
44         }
45     }
46 
47     if (resp && resplen) {
48         status = sanei_usb_read_bulk(dev->dn, resp, resplen);
49         if (status != SANE_STATUS_GOOD) {
50             DBG(1, "%s: sanei_usb_read_bulk: %s\n", __func__,
51                 sane_strstatus(status));
52             return SANE_STATUS_IO_ERROR;
53         }
54     }
55 
56     return SANE_STATUS_GOOD;
57 }
58 
59 
60 SANE_Status
usb_dev_open(struct device * dev)61 usb_dev_open(struct device *dev)
62 {
63     SANE_Status status;
64 
65     DBG(3, "%s: open %p\n", __func__, (void *)dev);
66     status = sanei_usb_open(dev->sane.name, &dev->dn);
67     if (status != SANE_STATUS_GOOD) {
68         DBG(1, "%s: sanei_usb_open(%s): %s\n", __func__,
69             dev->sane.name, sane_strstatus(status));
70         dev->dn = -1;
71         return status;
72     }
73     sanei_usb_clear_halt(dev->dn);
74     return SANE_STATUS_GOOD;
75 }
76 
77 void
usb_dev_close(struct device * dev)78 usb_dev_close(struct device *dev)
79 {
80     if (!dev)
81         return;
82     DBG(3, "%s: closing dev %p\n", __func__, (void *)dev);
83 
84     /* finish all operations */
85     if (dev->scanning) {
86         dev->cancel = 1;
87         /* flush READ_IMAGE data */
88         if (dev->reading)
89             sane_read(dev, NULL, 1, NULL);
90         /* send cancel if not sent before */
91         if (dev->state != SANE_STATUS_CANCELLED)
92             ret_cancel(dev, 0);
93     }
94 
95     sanei_usb_clear_halt(dev->dn);	/* unstall for next users */
96     sanei_usb_close(dev->dn);
97     dev->dn = -1;
98 }
99 
100 
101 /* SANE API ignores return code of this callback */
102 SANE_Status
usb_configure_device(const char * devname,SANE_Status (* attach)(const char * dev))103 usb_configure_device(const char *devname, SANE_Status(*attach)(const char *dev))
104 {
105     sanei_usb_set_timeout(1000);
106     sanei_usb_attach_matching_devices(devname, attach);
107     sanei_usb_set_timeout(30000);
108     return SANE_STATUS_GOOD;
109 }
110 
111 
112 /* xerox_mfp-usb.c */
113