summaryrefslogtreecommitdiff
path: root/src/cups/backend_mitsu9550.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cups/backend_mitsu9550.c')
-rw-r--r--src/cups/backend_mitsu9550.c74
1 files changed, 56 insertions, 18 deletions
diff --git a/src/cups/backend_mitsu9550.c b/src/cups/backend_mitsu9550.c
index 1599e9f..12ff0e8 100644
--- a/src/cups/backend_mitsu9550.c
+++ b/src/cups/backend_mitsu9550.c
@@ -39,15 +39,17 @@
#include "backend_common.h"
-#define USB_VID_MITSU 0x06D3
-#define USB_PID_MITSU_9000D 0x0393
-#define USB_PID_MITSU_9500D 0x0394
+#define USB_VID_MITSU 0x06D3
+#define USB_PID_MITSU_9500D 0x0393
+#define USB_PID_MITSU_9000D 0x0394
+#define USB_PID_MITSU_9000AM 0x0395
#define USB_PID_MITSU_9550D 0x03A1
#define USB_PID_MITSU_9550DS 0x03A5 // or DZ/DZS/DZU
#define USB_PID_MITSU_9600D 0x03A9
//#define USB_PID_MITSU_9600DS XXXXXX
-//#define USB_PID_MITSU_9800D XXXXXX
+#define USB_PID_MITSU_9800D 0x03AD
#define USB_PID_MITSU_9800DS 0x03AE
+#define USB_PID_MITSU_98__D 0x3B21
//#define USB_PID_MITSU_9810D XXXXXX
//#define USB_PID_MITSU_9820DS XXXXXX
@@ -150,7 +152,8 @@ struct mitsu9550_status {
uint8_t sts1; // MM
uint8_t nullb[1];
uint16_t copies; // BE, NN
- uint8_t nullc[6];
+ uint8_t sts2; // ZZ (9600 only?)
+ uint8_t nullc[5];
uint8_t sts3; // QQ
uint8_t sts4; // RR
uint8_t sts5; // SS
@@ -162,9 +165,9 @@ struct mitsu9550_status {
struct mitsu9550_status2 {
uint8_t hdr[2]; /* 21 2e */
- uint8_t unk[40];
- uint8_t remain; /* BE, media remaining */
- uint8_t unkb[4];
+ uint8_t unk[39];
+ uint16_t remain; /* BE, media remaining */
+ uint8_t unkb[4]; /* 0a 00 00 01 */
} __attribute__((packed));
#define CMDBUF_LEN 64
@@ -226,6 +229,11 @@ struct mitsu9550_status2 {
sleep(1); \
goto top; \
} \
+ /* Check for known errors */ \
+ if (sts->sts2 != 0) { \
+ ERROR("Printer cover open!\n"); \
+ return CUPS_BACKEND_STOP; \
+ } \
} while (0);
static void *mitsu9550_init(void)
@@ -909,6 +917,11 @@ top:
ERROR("Unexpected response (sts3 %02x)\n", sts->sts3);
return CUPS_BACKEND_FAILED;
}
+ /* Check for known errors */
+ if (sts->sts2 != 0) {
+ ERROR("Printer cover open!\n");
+ return CUPS_BACKEND_STOP;
+ }
}
/* Send "end data" command */
@@ -1013,7 +1026,11 @@ top:
INFO("Fast return mode enabled.\n");
break;
}
-
+ /* Check for known errors */
+ if (sts->sts2 != 0) {
+ ERROR("Printer cover open!\n");
+ return CUPS_BACKEND_STOP;
+ }
sleep(1);
}
@@ -1036,8 +1053,15 @@ static void mitsu9550_dump_status(struct mitsu9550_status *resp)
resp->sts1, resp->sts1 ? "Printing": "Idle");
INFO("Pages remaining : %03d\n",
be16_to_cpu(resp->copies));
- INFO("Other status : %02x %02x %02x %02x %02x\n",
- resp->sts3, resp->sts4, resp->sts5, resp->sts6, resp->sts7);
+ INFO("Other status : %02x %02x %02x %02x %02x %02x\n",
+ resp->sts2, resp->sts3, resp->sts4,
+ resp->sts5, resp->sts6, resp->sts7);
+}
+
+static void mitsu9550_dump_status2(struct mitsu9550_status2 *resp)
+{
+ INFO("Prints remaining on media : %03d\n",
+ be16_to_cpu(resp->remain));
}
static int mitsu9550_query_media(struct mitsu9550_ctx *ctx)
@@ -1066,6 +1090,19 @@ static int mitsu9550_query_status(struct mitsu9550_ctx *ctx)
return ret;
}
+static int mitsu9550_query_status2(struct mitsu9550_ctx *ctx)
+{
+ struct mitsu9550_status2 resp;
+ int ret;
+
+ ret = mitsu9550_get_status(ctx, (uint8_t*) &resp, 0, 1, 0);
+
+ if (!ret)
+ mitsu9550_dump_status2(&resp);
+
+ return ret;
+}
+
static int mitsu9550_query_serno(struct libusb_device_handle *dev, uint8_t endp_up, uint8_t endp_down, char *buf, int buf_len)
{
struct mitsu9550_cmd cmd;
@@ -1141,6 +1178,8 @@ static int mitsu9550_cmdline_arg(void *vctx, int argc, char **argv)
break;
case 's':
j = mitsu9550_query_status(ctx);
+ if (!j)
+ j = mitsu9550_query_status2(ctx);
break;
default:
break; /* Ignore completely */
@@ -1155,7 +1194,7 @@ static int mitsu9550_cmdline_arg(void *vctx, int argc, char **argv)
/* Exported */
struct dyesub_backend mitsu9550_backend = {
.name = "Mitsubishi CP-9550 family",
- .version = "0.27",
+ .version = "0.29",
.uri_prefix = "mitsu9550",
.cmdline_usage = mitsu9550_cmdline,
.cmdline_arg = mitsu9550_cmdline_arg,
@@ -1166,14 +1205,16 @@ struct dyesub_backend mitsu9550_backend = {
.main_loop = mitsu9550_main_loop,
.query_serno = mitsu9550_query_serno,
.devices = {
+ { USB_VID_MITSU, USB_PID_MITSU_9000AM, P_MITSU_9550, ""},
{ USB_VID_MITSU, USB_PID_MITSU_9000D, P_MITSU_9550, ""},
{ USB_VID_MITSU, USB_PID_MITSU_9500D, P_MITSU_9550, ""},
{ USB_VID_MITSU, USB_PID_MITSU_9550D, P_MITSU_9550, ""},
{ USB_VID_MITSU, USB_PID_MITSU_9550DS, P_MITSU_9550S, ""},
{ USB_VID_MITSU, USB_PID_MITSU_9600D, P_MITSU_9600, ""},
// { USB_VID_MITSU, USB_PID_MITSU_9600D, P_MITSU_9600S, ""},
-// { USB_VID_MITSU, USB_PID_MITSU_9800D, P_MITSU_9800, ""},
+ { USB_VID_MITSU, USB_PID_MITSU_9800D, P_MITSU_9800, ""},
{ USB_VID_MITSU, USB_PID_MITSU_9800DS, P_MITSU_9800S, ""},
+ { USB_VID_MITSU, USB_PID_MITSU_98__D, P_MITSU_9810, ""},
// { USB_VID_MITSU, USB_PID_MITSU_9810D, P_MITSU_9810, ""},
// { USB_VID_MITSU, USB_PID_MITSU_9820DS, P_MITSU_9820S, ""},
{ 0, 0, 0, ""}
@@ -1298,7 +1339,7 @@ struct dyesub_backend mitsu9550_backend = {
Status Query
-> 1b 56 30 00
- -> 30 2e 00 00 00 00 MM 00 NN NN 00 00 00 00 00 00 :: MM, NN
+ -> 30 2e 00 00 00 00 MM 00 NN NN ZZ 00 00 00 00 00 :: MM, NN, ZZ
QQ RR SS 00 00 00 00 00 00 00 00 00 00 00 00 00 :: QQ, RR, SS
00 00 00 00 00 00 00 00 00 00 00 00 TT UU 00 00 :: TT, UU
@@ -1395,10 +1436,7 @@ struct dyesub_backend mitsu9550_backend = {
Seen on 9600DW
- ?? 3e 00 00 8a 44 :: scrap bin?
- ?? 3e 00 00 8a 45 :: No scrap bin | no paper?
- ?? 3e 00 00 8a 46 :: no ribbon
- ?? 3e 00 00 8a 47 :: Cover open
+ ZZ == 08 Door open
Working theory of interpreting the status flags: