summaryrefslogtreecommitdiff
path: root/backend/magicolor.c
diff options
context:
space:
mode:
Diffstat (limited to 'backend/magicolor.c')
-rw-r--r--backend/magicolor.c71
1 files changed, 57 insertions, 14 deletions
diff --git a/backend/magicolor.c b/backend/magicolor.c
index 5278937..aac46be 100644
--- a/backend/magicolor.c
+++ b/backend/magicolor.c
@@ -105,16 +105,19 @@
static struct MagicolorCmd magicolor_cmd[] = {
{"mc1690mf", CMD, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x12, NET, 0x00, 0x01, 0x02, 0x03},
{"mc4690mf", CMD, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x12, NET, 0x00, 0x01, 0x02, 0x03},
+ {"es2323am", CMD, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x12, NET, 0x00, 0x01, 0x02, 0x03},
};
static SANE_Int magicolor_default_resolutions[] = {150, 300, 600};
static SANE_Int magicolor_default_depths[] = {1,8};
+static SANE_Int estudio_default_resolutions[] = {150, 200, 300, 400, 600};
+
static struct MagicolorCap magicolor_cap[] = {
/* KONICA MINOLTA magicolor 1690MF, USB ID 0x123b:2089 */
{
- 0x2089, "mc1690mf", "KONICA MINOLTA magicolor 1690MF", ".1.3.6.1.4.1.18334.1.1.1.1.1.23.1.1",
+ 0x2089, "mc1690mf", "magicolor 1690MF", ".1.3.6.1.4.1.18334.1.1.1.1.1.23.1.1",
-1, 0x85,
600, {150, 600, 0}, magicolor_default_resolutions, 3, /* 600 dpi max, 3 resolutions */
8, magicolor_default_depths, /* color depth 8 default, 1 and 8 possible */
@@ -126,7 +129,7 @@ static struct MagicolorCap magicolor_cap[] = {
/* KONICA MINOLTA magicolor 4690MF, USB ID 0x132b:2079 */
{
- 0x2079, "mc4690mf", "KONICA MINOLTA magicolor 4690MF",
+ 0x2079, "mc4690mf", "magicolor 4690MF",
"FIXME", /* FIXME: fill in the correct OID! */
0x03, 0x85,
600, {150, 600, 0}, magicolor_default_resolutions, 3, /* 600 dpi max, 3 resolutions */
@@ -137,13 +140,25 @@ static struct MagicolorCap magicolor_cap[] = {
{0, SANE_FIX(0x1390 * MM_PER_INCH / 600), 0}, {0, SANE_FIX(0x20dc * MM_PER_INCH / 600), 0},
},
+ /* TOSHIBA e-STUDIO2323AM, USB ID 0x08a6:8056 */
+ {
+ 0x8056, "es2323am", "e-STUDIO2323AM", ".1.3.6.1.4.1.1129.2.3.72.1",
+ 0x03, 0x85,
+ 600, {150, 600, 0}, estudio_default_resolutions, 5,
+ 8, magicolor_default_depths,
+ {-100, 100, 0},
+ {0, SANE_FIX(0x13f8 * MM_PER_INCH / 600), 0}, {0, SANE_FIX(0x1b9c * MM_PER_INCH / 600), 0},
+ SANE_TRUE, SANE_TRUE,
+ {0, SANE_FIX(0x1390 * MM_PER_INCH / 600), 0}, {0, SANE_FIX(0x20dc * MM_PER_INCH / 600), 0},
+ },
+
};
static int MC_SNMP_Timeout = 2500;
static int MC_Scan_Data_Timeout = 15000;
static int MC_Request_Timeout = 5000;
-
+#define ESTUDIO_DEVICE(s) ((s)->hw->cap->id == 0x8056)
/****************************************************************************
* General configuration parameter definitions
@@ -235,7 +250,7 @@ print_params(const SANE_Parameters params)
#define MAGICOLOR_SNMP_SYSOBJECT_OID ".1.3.6.1.2.1.1.2.0"
#define MAGICOLOR_SNMP_MAC_OID ".1.3.6.1.2.1.2.2.1.6.1"
#define MAGICOLOR_SNMP_DEVICE_TREE ".1.3.6.1.4.1.18334.1.1.1.1.1"
-
+#define ESTUDIO_SNMP_DEVICE_TREE ".1.3.6.1.4.1.1129.2.3.72.1"
/* We don't have a packet wrapper, which holds packet size etc., so we
don't have to use a *read_raw and a *_read function... */
@@ -342,8 +357,13 @@ sanei_magicolor_net_open(struct Magicolor_Scanner *s)
buf[1] = cmd->net_lock;
buf[2] = 0x00;
/* Copy the device's USB id to bytes 3-4: */
- buf[3] = s->hw->cap->id & 0xff;
- buf[4] = (s->hw->cap->id >> 8) & 0xff;
+ if (ESTUDIO_DEVICE(s)) {
+ buf[3] = (s->hw->cap->id >> 8) & 0xff;
+ buf[4] = s->hw->cap->id & 0xff;
+ } else {
+ buf[3] = s->hw->cap->id & 0xff;
+ buf[4] = (s->hw->cap->id >> 8) & 0xff;
+ }
DBG(32, "Proper welcome message received, locking the scanner...\n");
sanei_magicolor_net_write_raw(s, buf, 5, &status);
@@ -777,7 +797,6 @@ cmd_finish_scan (SANE_Handle handle)
return status;
}
memset (&returned[0], 0x00, 0x0b);
-
status = mc_txrx (s, buf, buflen, returned, 0x0b);
free (buf);
if (status != SANE_STATUS_GOOD)
@@ -995,7 +1014,20 @@ cmd_read_data (SANE_Handle handle, unsigned char *buf, size_t len)
/* Temporarily set the poll timeout to 10 seconds instead of 2,
* because a color scan needs >5 seconds to initialize. */
MC_Request_Timeout = MC_Scan_Data_Timeout;
- status = mc_txrx (s, txbuf, txbuflen, buf, len);
+
+ if (ESTUDIO_DEVICE(s)) {
+ /* e-STUDIO device returns 5-bytes of ack data here
+ * ignore it to not mess up image buffer */
+ unsigned char ack[5];
+
+ status = mc_txrx (s, txbuf, txbuflen, ack, sizeof(ack));
+ if (status == SANE_STATUS_GOOD) {
+ mc_recv (s, buf, len, &status);
+ }
+ } else {
+ status = mc_txrx (s, txbuf, txbuflen, buf, len);
+ }
+
MC_Request_Timeout = oldtimeout;
free (txbuf);
if (status != SANE_STATUS_GOOD)
@@ -1029,8 +1061,8 @@ mc_dev_init(Magicolor_Device *dev, const char *devname, int conntype)
dev->connection = conntype;
dev->sane.name = devname;
dev->sane.model = NULL;
- dev->sane.type = "flatbed scanner";
- dev->sane.vendor = "Magicolor";
+ dev->sane.type = "multi-function peripheral";
+ dev->sane.vendor = "Konica Minolta";
dev->cap = &magicolor_cap[MAGICOLOR_CAP_DEFAULT];
dev->cmd = &magicolor_cmd[MAGICOLOR_LEVEL_DEFAULT];
/* Change default level when using a network connection */
@@ -1042,8 +1074,10 @@ static SANE_Status
mc_dev_post_init(struct Magicolor_Device *dev)
{
DBG(5, "%s\n", __func__);
- NOT_USED (dev);
/* Correct device parameters if needed */
+ if (dev->cap->id == 0x8056)
+ dev->sane.vendor = "Toshiba";
+
return SANE_STATUS_GOOD;
}
@@ -1305,7 +1339,8 @@ mc_scan_finish(Magicolor_Scanner * s)
s->buf = s->end = s->ptr = NULL;
/* TODO: Any magicolor command for "scan finished"? */
- status = cmd_finish_scan (s);
+ if (!ESTUDIO_DEVICE(s))
+ status = cmd_finish_scan (s);
status = cmd_request_error(s);
if (status != SANE_STATUS_GOOD) {
@@ -1922,8 +1957,16 @@ mc_network_discovery_handle (struct snmp_pdu *pdu, snmp_discovery_data *magic)
vp->val.objid, value_len) == 0) {
DBG (5, "%s: Device appears to be a magicolor device (OID=%s)\n", __func__, device);
} else {
- DBG (5, "%s: Device is not a Magicolor device\n", __func__);
- return 0;
+ anOID_len = MAX_OID_LEN;
+ read_objid(ESTUDIO_SNMP_DEVICE_TREE, anOID, &anOID_len);
+
+ if (netsnmp_oid_is_subtree (anOID, anOID_len,
+ vp->val.objid, value_len) == 0) {
+ DBG (5, "%s: Device appears to be a estudio device (OID=%s)\n", __func__, device);
+ } else {
+ DBG (5, "%s: Device is not a e-STUDIO / Magicolor device\n", __func__);
+ return 0;
+ }
}
}