diff options
Diffstat (limited to 'src/cups/backend_mitsu9550.c')
-rw-r--r-- | src/cups/backend_mitsu9550.c | 74 |
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: |