summaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
Diffstat (limited to 'backend')
-rw-r--r--backend/epson2.c67
-rw-r--r--backend/epsonds-cmd.c2
-rw-r--r--backend/epsonds.c105
-rw-r--r--backend/epsonds.h1
-rw-r--r--backend/pixma.h2
-rw-r--r--backend/pixma_imageclass.c6
6 files changed, 63 insertions, 120 deletions
diff --git a/backend/epson2.c b/backend/epson2.c
index b1eda33..63ab045 100644
--- a/backend/epson2.c
+++ b/backend/epson2.c
@@ -356,10 +356,12 @@ print_params(const SANE_Parameters params)
static void
close_scanner(Epson_Scanner *s)
{
+ int i;
+
DBG(7, "%s: fd = %d\n", __func__, s->fd);
if (s->fd == -1)
- return;
+ goto free;
/* send a request_status. This toggles w_cmd_count and r_cmd_count */
if (r_cmd_count % 2)
@@ -381,6 +383,14 @@ close_scanner(Epson_Scanner *s)
}
s->fd = -1;
+
+free:
+ for (i = 0; i < LINES_SHUFFLE_MAX; i++) {
+ if (s->line_buffer[i] != NULL)
+ free(s->line_buffer[i]);
+ }
+
+ free(s);
}
static void
@@ -577,12 +587,12 @@ static SANE_Status detect_scsi(struct Epson_Scanner *s)
}
static SANE_Status
-detect_usb(struct Epson_Scanner *s)
+detect_usb(struct Epson_Scanner *s, SANE_Bool assume_valid)
{
SANE_Status status;
int vendor, product;
int i, numIds;
- SANE_Bool is_valid;
+ SANE_Bool is_valid = assume_valid;
/* if the sanei_usb_get_vendor_product call is not supported,
* then we just ignore this and rely on the user to config
@@ -604,19 +614,20 @@ detect_usb(struct Epson_Scanner *s)
}
numIds = sanei_epson_getNumberOfUSBProductIds();
- is_valid = SANE_FALSE;
i = 0;
/* check all known product IDs to verify that we know
about the device */
- while (i != numIds && !is_valid) {
- if (product == sanei_epson_usb_product_ids[i])
+ while (i != numIds) {
+ if (product == sanei_epson_usb_product_ids[i]) {
is_valid = SANE_TRUE;
+ break;
+ }
i++;
}
if (is_valid == SANE_FALSE) {
- DBG(1, "the device at %s is not a supported (product id=0x%x)\n",
+ DBG(1, "the device at %s is not supported (product id=0x%x)\n",
s->hw->sane.name, product);
return SANE_STATUS_INVAL;
}
@@ -650,7 +661,7 @@ scanner_create(struct Epson_Device *dev, SANE_Status *status)
}
static struct Epson_Scanner *
-device_detect(const char *name, int type, SANE_Status *status)
+device_detect(const char *name, int type, SANE_Bool assume_valid, SANE_Status *status)
{
struct Epson_Scanner *s;
struct Epson_Device *dev;
@@ -703,7 +714,7 @@ device_detect(const char *name, int type, SANE_Status *status)
} else if (dev->connection == SANE_EPSON_USB) {
- *status = detect_usb(s);
+ *status = detect_usb(s, assume_valid);
}
if (*status != SANE_STATUS_GOOD)
@@ -749,7 +760,6 @@ device_detect(const char *name, int type, SANE_Status *status)
close:
close_scanner(s);
- free(s);
return NULL;
}
@@ -762,12 +772,11 @@ attach(const char *name, int type)
DBG(7, "%s: devname = %s, type = %d\n", __func__, name, type);
- s = device_detect(name, type, &status);
+ s = device_detect(name, type, 0, &status);
if(s == NULL)
return status;
close_scanner(s);
- free(s);
return status;
}
@@ -814,6 +823,7 @@ attach_one_config(SANEI_Config __sane_unused__ *config, const char *line)
DBG(7, "%s: len = %d, line = %s\n", __func__, len, line);
if (sscanf(line, "usb %i %i", &vendor, &product) == 2) {
+
/* add the vendor and product IDs to the list of
known devices before we call the attach function */
@@ -1456,6 +1466,8 @@ sane_open(SANE_String_Const name, SANE_Handle *handle)
DBG(7, "%s: name = %s\n", __func__, name);
+ *handle = NULL;
+
/* probe if empty device name provided */
if (l == 0) {
@@ -1467,7 +1479,7 @@ sane_open(SANE_String_Const name, SANE_Handle *handle)
}
s = device_detect(first_dev->sane.name, first_dev->connection,
- &status);
+ 0, &status);
if (s == NULL) {
DBG(1, "cannot open a perfectly valid device (%s),"
" please report to the authors\n", name);
@@ -1477,15 +1489,15 @@ sane_open(SANE_String_Const name, SANE_Handle *handle)
} else {
if (strncmp(name, "net:", 4) == 0) {
- s = device_detect(name, SANE_EPSON_NET, &status);
+ s = device_detect(name, SANE_EPSON_NET, 0, &status);
if (s == NULL)
return status;
} else if (strncmp(name, "libusb:", 7) == 0) {
- s = device_detect(name, SANE_EPSON_USB, &status);
+ s = device_detect(name, SANE_EPSON_USB, 1, &status);
if (s == NULL)
return status;
} else if (strncmp(name, "pio:", 4) == 0) {
- s = device_detect(name, SANE_EPSON_PIO, &status);
+ s = device_detect(name, SANE_EPSON_PIO, 0, &status);
if (s == NULL)
return status;
} else {
@@ -1498,7 +1510,7 @@ sane_open(SANE_String_Const name, SANE_Handle *handle)
if (first_dev == NULL)
probe_devices();
- s = device_detect(name, SANE_EPSON_NODEV, &status);
+ s = device_detect(name, SANE_EPSON_NODEV, 0, &status);
if (s == NULL) {
DBG(1, "invalid device name: %s\n", name);
return SANE_STATUS_INVAL;
@@ -1513,8 +1525,6 @@ sane_open(SANE_String_Const name, SANE_Handle *handle)
init_options(s);
- *handle = (SANE_Handle) s;
-
status = open_scanner(s);
if (status != SANE_STATUS_GOOD) {
free(s);
@@ -1522,16 +1532,19 @@ sane_open(SANE_String_Const name, SANE_Handle *handle)
}
status = esci_reset(s);
- if (status != SANE_STATUS_GOOD)
+ if (status != SANE_STATUS_GOOD) {
close_scanner(s);
+ return status;
+ }
+
+ *handle = (SANE_Handle)s;
- return status;
+ return SANE_STATUS_GOOD;
}
void
sane_close(SANE_Handle handle)
{
- int i;
Epson_Scanner *s;
DBG(1, "* %s\n", __func__);
@@ -1543,15 +1556,7 @@ sane_close(SANE_Handle handle)
s = (Epson_Scanner *) handle;
- if (s->fd != -1)
- close_scanner(s);
-
- for (i = 0; i < LINES_SHUFFLE_MAX; i++) {
- if (s->line_buffer[i] != NULL)
- free(s->line_buffer[i]);
- }
-
- free(s);
+ close_scanner(s);
}
const SANE_Option_Descriptor *
diff --git a/backend/epsonds-cmd.c b/backend/epsonds-cmd.c
index 5fb1f9d..ba80c23 100644
--- a/backend/epsonds-cmd.c
+++ b/backend/epsonds-cmd.c
@@ -607,11 +607,13 @@ static SANE_Status capa_cb(void *userdata, char *token, int len)
if (strncmp("ADFDFL1", token, 3 + 4) == 0) {
DBG(1, " ADF: double feed detection\n");
+ s->hw->adf_has_dfd = 1;
}
}
if (len == 8 && strncmp("ADFDFL1DFL2", token, 3 + 4) == 0) {
DBG(1, " ADF: double feed detection (high sensitivity)\n");
+ s->hw->adf_has_dfd = 2;
}
if (strncmp("FMT", token, 3) == 0) {
diff --git a/backend/epsonds.c b/backend/epsonds.c
index d16744f..8db070b 100644
--- a/backend/epsonds.c
+++ b/backend/epsonds.c
@@ -133,7 +133,7 @@ close_scanner(epsonds_scanner *s)
DBG(7, "%s: fd = %d\n", __func__, s->fd);
if (s->fd == -1)
- return;
+ goto free;
if (s->locked) {
DBG(7, " unlocking scanner\n");
@@ -144,6 +144,8 @@ close_scanner(epsonds_scanner *s)
sanei_usb_close(s->fd);
}
+free:
+
free(s->front.ring);
free(s->back.ring);
free(s->line_buffer);
@@ -189,57 +191,6 @@ open_scanner(epsonds_scanner *s)
return status;
}
-static SANE_Status
-validate_usb(struct epsonds_scanner *s)
-{
- DBG(1, "%s\n", __func__);
-
- SANE_Status status;
- int vendor, product;
- int i = 0, numIds;
-
- SANE_Bool is_valid = SANE_FALSE;
-
- /* if the sanei_usb_get_vendor_product call is not supported,
- * then we just ignore this and rely on the user to config
- * the correct device.
- */
- status = sanei_usb_get_vendor_product(s->fd, &vendor, &product);
- if (status != SANE_STATUS_GOOD) {
- DBG(1, "the device cannot be verified - will continue\n");
- return SANE_STATUS_GOOD;
- }
-
- /* check the vendor ID to see if we are dealing with an EPSON device */
- if (vendor != SANE_EPSONDS_VENDOR_ID) {
- /* this is not a supported vendor ID */
- DBG(1, "not an Epson device at %s (vendor id=0x%x)\n",
- s->hw->sane.name, vendor);
- return SANE_STATUS_INVAL;
- }
-
- numIds = epsonds_get_number_of_ids();
-
- /* check all known product IDs to verify that we know
- about the device */
- while (i != numIds && !is_valid) {
- if (product == epsonds_usb_product_ids[i])
- is_valid = SANE_TRUE;
- i++;
- }
-
- if (is_valid == SANE_FALSE) {
- DBG(1, "the device at %s is not a supported (product id=0x%x)\n",
- s->hw->sane.name, product);
- return SANE_STATUS_INVAL;
- }
-
- DBG(1, "found valid Epson ESC/I-2 scanner: 0x%x/0x%x at %s\n",
- vendor, product, s->hw->sane.name);
-
- return SANE_STATUS_GOOD;
-}
-
static int num_devices; /* number of scanners attached to backend */
static epsonds_device *first_dev; /* first EPSON scanner in list */
@@ -311,13 +262,6 @@ device_detect(const char *name, int type, SANE_Status *status)
return NULL;
}
- if (dev->connection == SANE_EPSONDS_USB) {
- *status = validate_usb(s);
- }
-
- if (*status != SANE_STATUS_GOOD)
- goto close;
-
eds_dev_init(dev);
/* lock scanner */
@@ -415,19 +359,11 @@ attach_one_config(SANEI_Config __sane_unused__ *config, const char *line)
if (sscanf(line, "usb %i %i", &vendor, &product) == 2) {
- int numIds;
-
- /* add the vendor and product IDs to the list of
- known devices before we call the attach function */
-
DBG(7, " user configured device\n");
- numIds = epsonds_get_number_of_ids();
- if (vendor != 0x4b8)
- return SANE_STATUS_INVAL; /* this is not an EPSON device */
+ if (vendor != SANE_EPSONDS_VENDOR_ID)
+ return SANE_STATUS_INVAL; /* this is not an Epson device */
- /* add to last slot */
- epsonds_usb_product_ids[numIds - 1] = product;
sanei_usb_attach_matching_devices(line, attach_one_usb);
} else if (strncmp(line, "usb", 3) == 0 && len == 3) {
@@ -439,9 +375,10 @@ attach_one_config(SANEI_Config __sane_unused__ *config, const char *line)
numIds = epsonds_get_number_of_ids();
for (i = 0; i < numIds; i++) {
- sanei_usb_find_devices(0x4b8,
+ sanei_usb_find_devices(SANE_EPSONDS_VENDOR_ID,
epsonds_usb_product_ids[i], attach_one_usb);
}
+
} else {
DBG(0, "unable to parse config line: %s\n", line);
}
@@ -709,12 +646,10 @@ sane_open(SANE_String_Const name, SANE_Handle *handle)
SANE_Status status;
epsonds_scanner *s = NULL;
- int l = strlen(name);
-
- DBG(7, "** %s: name = %s\n", __func__, name);
+ DBG(7, "** %s: name = '%s'\n", __func__, name);
/* probe if empty device name provided */
- if (l == 0) {
+ if (name[0] == '\0') {
probe_devices();
@@ -738,20 +673,8 @@ sane_open(SANE_String_Const name, SANE_Handle *handle)
if (s == NULL)
return status;
} else {
-
- /* as a last resort, check for a match
- * in the device list. This should handle SCSI
- * devices and platforms without libusb.
- */
-
- if (first_dev == NULL)
- probe_devices();
-
- s = device_detect(name, SANE_EPSONDS_NODEV, &status);
- if (s == NULL) {
- DBG(1, "invalid device name: %s\n", name);
- return SANE_STATUS_INVAL;
- }
+ DBG(1, "invalid device name: %s\n", name);
+ return SANE_STATUS_INVAL;
}
}
@@ -1189,6 +1112,12 @@ sane_start(SANE_Handle handle)
s->val[OPT_ADF_MODE].w ? "DPLX" : "",
s->val[OPT_ADF_SKEW].w ? "SKEW" : "");
+ if (s->hw->adf_has_dfd == 2) {
+ strcat(buf, "DFL2");
+ } else if (s->hw->adf_has_dfd == 1) {
+ strcat(buf, "DFL1");
+ }
+
} else if (strcmp(source_list[s->val[OPT_SOURCE].w], FBF_STR) == 0) {
strcpy(buf, "#FB ");
diff --git a/backend/epsonds.h b/backend/epsonds.h
index 2c2e422..024773b 100644
--- a/backend/epsonds.h
+++ b/backend/epsonds.h
@@ -138,6 +138,7 @@ struct epsonds_device
SANE_Bool adf_has_load; /* supports load command */
SANE_Bool adf_has_eject; /* supports eject command */
SANE_Byte adf_alignment; /* left, center, right */
+ SANE_Byte adf_has_dfd; /* supports double feed detection */
SANE_Bool has_tpu; /* tpu */
SANE_Range tpu_x_range; /* transparency unit x range */
diff --git a/backend/pixma.h b/backend/pixma.h
index eedf74d..4be43bd 100644
--- a/backend/pixma.h
+++ b/backend/pixma.h
@@ -114,7 +114,7 @@ typedef uint32_t uint32_t;
/**@{*/
#define PIXMA_VERSION_MAJOR 0
#define PIXMA_VERSION_MINOR 17
-#define PIXMA_VERSION_BUILD 17
+#define PIXMA_VERSION_BUILD 18
/**@}*/
/** \name Error codes */
diff --git a/backend/pixma_imageclass.c b/backend/pixma_imageclass.c
index 3995805..f4bad37 100644
--- a/backend/pixma_imageclass.c
+++ b/backend/pixma_imageclass.c
@@ -80,6 +80,7 @@
#define MF3200_PID 0x2684
#define MF6500_PID 0x2686
/* generation 2 scanners (>=0x2707) */
+#define MF8300_PID 0x2708
#define MF4500_PID 0x2736
#define MF4410_PID 0x2737
#define MF3010_PID 0x2759
@@ -208,6 +209,7 @@ activate (pixma_t * s, uint8_t x)
case D420_PID:
case MF4360_PID:
case MF4100_PID:
+ case MF8300_PID:
return iclass_exec (s, &mf->cb, 1);
break;
default:
@@ -239,6 +241,7 @@ select_source (pixma_t * s)
case D420_PID:
case MF4360_PID:
case MF4100_PID:
+ case MF8300_PID:
return iclass_exec (s, &mf->cb, 0);
break;
default:
@@ -273,6 +276,7 @@ send_scan_param (pixma_t * s)
case D420_PID:
case MF4360_PID:
case MF4100_PID:
+ case MF8300_PID:
return iclass_exec (s, &mf->cb, 0);
break;
default:
@@ -369,6 +373,7 @@ read_error_info (pixma_t * s, void *buf, unsigned size)
case D420_PID:
case MF4360_PID:
case MF4100_PID:
+ case MF8300_PID:
error = iclass_exec (s, &mf->cb, 0);
break;
default:
@@ -795,6 +800,7 @@ const pixma_config_t pixma_iclass_devices[] = {
DEV ("Canon i-SENSYS MF4800 Series", "MF4800", MF4800_PID, 600, 0, 640, 1050, PIXMA_CAP_ADF),
DEV ("Canon imageCLASS MF4570dw", "MF4570dw", MF4570_PID, 600, 0, 640, 877, 0),
DEV ("Canon i-SENSYS MF8200C Series", "MF8200C", MF8200_PID, 600, 300, 640, 1050, PIXMA_CAP_ADF),
+ DEV ("Canon i-SENSYS MF8300 Series", "MF8300", MF8300_PID, 600, 0, 640, 1050, PIXMA_CAP_ADF),
DEV ("Canon imageCLASS D530", "D530", D530_PID, 600, 0, 640, 877, 0),
/* FIXME: the following capabilities all need updating/verifying */
DEV ("Canon imageCLASS MF5630", "MF5630", MF5630_PID, 600, 0, 640, 877, PIXMA_CAP_ADF),