s2145: Enumerate every known error condition, guessing as to their major/minor codes.

This commit is contained in:
Solomon Peachy 2013-07-24 21:52:16 -04:00
parent 66c0f2831a
commit a552498716
1 changed files with 215 additions and 24 deletions

View File

@ -358,6 +358,212 @@ struct s2145_status_hdr {
#define ERROR_PRINTER 0x11
#define ERROR_BUFFER_FULL 0x21
/*
I have a list of 72 different errors that are displayed on the printer,
but it appears the list is incomplete, and there's no mapping between
category and major code numbers. Also, not all of the individual errors
have minor codes listed (particularly the "consumables")
These are the observed error codes to date (via stored error log dumps):
0x01/0x16 @ 77845 [ jam/reloading or controller/paramtable or consumables? ]
0x06/0x0b @ 77822, 70053 [ controller/fpga ? or consumables? ]
0x05/0x64 @ 76034 [ jam ? (no match ) ]
0x05/0x61 @ 76034, 75420 [ jam/cantload ? ]
0x05/0x62 @ 76034 [ jam/cantload ? ]
0x05/0x4e @ 69824, 69820, 69781 [ jam ? (no match) ]
*/
static char *error_codes(uint8_t major, uint8_t minor)
{
switch(major) {
case 9: /* "Controller Error" */
switch(minor) {
case 0x01:
return "Controller: 01 EEPROM";
case 0x02:
return "Controller: 02 EEPROM";
case 0x04:
return "Controller: 04 DSP";
case 0x05:
return "Controller: 05 DSP";
case 0x06:
return "Controller: 06 Main FW";
case 0x07:
return "Controller: 07 Main FW";
case 0x08:
return "Controller: 08 DSP FW";
case 0x09:
return "Controller: 09 DSP FW";
case 0x0A:
return "Controller: 0A ASIC";
case 0x0B:
return "Controller: 0B FPGA";
case 0x0D:
return "Controller: 0D Tone Curve";
case 0x16:
return "Controller: 16 Parameter Table";
case 0x17:
return "Controller: 17 Parameter Table";
case 0x18:
return "Controller: 18 Parameter Table";
case 0x29:
return "Controller: 29 DSP Comms";
case 0x2A:
return "Controller: 2A DSP Comms";
default:
return "Controller: Unknown";
}
case 8: /* XXXX "Mechanical Error" */
switch (minor) {
case 0x01:
return "Mechanical: 01 Thermal Head";
case 0x02:
return "Mechanical: 02 Thermal Head";
case 0x03:
return "Mechanical: 03 Thermal Head";
case 0x04:
return "Mechanical: 04 Pinch Roller";
case 0x05:
return "Mechanical: 05 Pinch Roller";
case 0x06:
return "Mechanical: 06 Pinch Roller";
case 0x07:
return "Mechanical: 07 Pinch Roller";
case 0x08:
return "Mechanical: 08 Pinch Roller";
case 0x09:
return "Mechanical: 09 Cutter";
case 0x0A:
return "Mechanical: 0A Cutter";
default:
return "Mechanical: Unknown";
}
case 2: /* XXXX "Sensor Error" */
switch (minor) {
case 0x01:
return "Sensor: 01 Thermal Head";
case 0x02:
return "Sensor: 02 Pinch Roller";
case 0x03:
return "Sensor: 03 Cutter";
case 0x04:
return "Sensor: 04 Cutter";
case 0x05:
return "Sensor: 05 Cutter";
default:
return "Sensor: Unknown";
}
case 3: /* XXXX "Temperature Sensor Error" */
switch (minor) {
case 0x01:
return "Temp Sensor: 01 Thermal Head High";
case 0x02:
return "Temp Sensor: 02 Thermal Head Low";
case 0x03:
return "Temp Sensor: 03 Environment High";
case 0x04:
return "Temp Sensor: 04 Environment Low";
case 0x05:
return "Temp Sensor: 05 Warmup Timed Out";
default:
return "Temp Sensor: Unknown";
}
case 4: /* XXXX "Front Cover Open" */
switch (minor) {
case 0x01:
return "Front Cover: 01 Cover Open";
case 0x02:
return "Front Cover: 02 Cover Open Error";
default:
return "Front Cover: Unknown";
}
case 5: /* XXX "Paper Jam" */
switch (minor) {
case 0x01:
return "Paper Jam: 01 Loading";
case 0x02:
return "Paper Jam: 02 Loading";
case 0x03:
return "Paper Jam: 03 Loading";
case 0x04:
return "Paper Jam: 04 Loading";
case 0x05:
return "Paper Jam: 05 Loading";
case 0x11:
return "Paper Jam: 11 Reloading";
case 0x12:
return "Paper Jam: 12 Reloading";
case 0x13:
return "Paper Jam: 13 Reloading";
case 0x14:
return "Paper Jam: 14 Reloading";
case 0x15:
return "Paper Jam: 15 Reloading";
case 0x16:
return "Paper Jam: 16 Reloading";
case 0x21:
return "Paper Jam: 21 Takeup";
case 0x22:
return "Paper Jam: 22 Takeup";
case 0x41:
return "Paper Jam: 41 Printing";
case 0x42:
return "Paper Jam: 42 Printing";
case 0x43:
return "Paper Jam: 43 Printing";
case 0x44:
return "Paper Jam: 44 Printing";
case 0x45:
return "Paper Jam: 45 Printing";
case 0x46:
return "Paper Jam: 46 Printing";
case 0x47:
return "Paper Jam: 47 Printing";
case 0x49:
return "Paper Jam: 49 Printing";
case 0x4A:
return "Paper Jam: 4A Ribbon Cut";
case 0x61:
return "Paper Jam: 61 Can't Load";
case 0x62:
return "Paper Jam: 62 Can't Load";
default:
return "Paper Jam: Unknown";
}
case 6: /* XXXX "Consumables" */
switch (minor) {
case 0x01: // XXX
return "Consumables: XX No Ribbon+Paper";
case 0x02: // XXX
return "Consumables: XX No Ribbon";
case 0x03: // XXX
return "Consumables: XX Ribbon Empty";
case 0x04: // XXX
return "Consumables: XX Ribbon Mismatch";
case 0x05: // XXX
return "Consumables: XX 01 Ribbon Incorrect";
case 0x06: // XXX
return "Consumables: XX 02 Ribbon Incorrect";
case 0x07: // XXX
return "Consumables: XX 03 Ribbon Incorrect";
case 0x08: // XXX
return "Consumables: XX No Paper";
case 0x09: // XXX
return "Consumables: XX Paper Empty";
case 0x0A: // XXX
return "Consumables: XX Paper Mismatch";
default:
return "Consumables: Unknown";
}
default:
return "Unknown Error";
}
}
static char *error_str(uint8_t v) {
switch (v) {
case ERROR_NONE:
@ -381,22 +587,6 @@ static char *error_str(uint8_t v) {
}
}
/* XXX observed major/minor error codes:
0x01/0x16 @ 77845 [maybe paper out?]
0x06/0x0b @ 77822, 70053
0x05/0x64 @ 76034
0x05/0x61 @ 76034, 75420
0x05/0x62 @ 76034
0x05/0x4e @ 69824, 69820, 69781
Unfortunately I have no idea what these refer to.
major (0x01/5/6) may refer to above error codes or media/print modes.
minor (0x61/62/64) may refer to equivalent status codes (see below)
*/
#define STATUS_READY 0x00
#define STATUS_INIT_CPU 0x31
#define STATUS_INIT_RIBBON 0x32
@ -624,9 +814,9 @@ static int s2145_do_cmd(libusb_device_handle *dev,
if (resp->result != RESULT_SUCCESS) {
INFO("Printer Status: %02x (%s)\n", resp->status,
status_str(resp->status));
INFO(" Result: 0x%02x Error: 0x%02x (0x%02x/0x%02x)\n",
INFO(" Result: 0x%02x Error: 0x%02x (0x%02x/0x%02x = %s)\n",
resp->result, resp->error, resp->printer_major,
resp->printer_minor);
resp->printer_minor, error_codes(resp->printer_major, resp->printer_minor));
return -99;
}
@ -1257,8 +1447,9 @@ top:
INFO("Printer Status: 0x%02x (%s)\n",
sts->hdr.status, status_str(sts->hdr.status));
if (sts->hdr.error == ERROR_PRINTER) {
ERROR("Printer Reported Error: 0x%02x.0x%02x\n",
sts->hdr.printer_major, sts->hdr.printer_minor);
ERROR("Printer Reported Error: 0x%02x.0x%02x = %s\n",
sts->hdr.printer_major, sts->hdr.printer_minor,
error_codes(sts->hdr.printer_major, sts->hdr.printer_minor));
}
memcpy(rdbuf2, rdbuf, READBACK_LEN);
} else if (state == last_state) {
@ -1353,13 +1544,13 @@ top:
return 0;
printer_error:
ERROR("Printer reported error: %#x (%s) status: %#x (%s) -> %#x.%#x\n",
ERROR("Printer reported error: %#x (%s) status: %#x (%s) -> %#x.%#x = %s\n",
sts->hdr.error,
error_str(sts->hdr.error),
sts->hdr.status,
status_str(sts->hdr.status),
sts->hdr.printer_major, sts->hdr.printer_minor);
// XXX need to decode these errors..
sts->hdr.printer_major, sts->hdr.printer_minor,
error_codes(sts->hdr.printer_major, sts->hdr.printer_minor));
return 1;
}
@ -1397,7 +1588,7 @@ static int shinkos2145_query_serno(struct libusb_device_handle *dev, uint8_t end
struct dyesub_backend shinkos2145_backend = {
.name = "Shinko/Sinfonia CHC-S2145",
.version = "0.18",
.version = "0.19",
.uri_prefix = "shinkos2145",
.cmdline_usage = shinkos2145_cmdline,
.cmdline_arg = shinkos2145_cmdline_arg,