|
|
|
@ -32,9 +32,6 @@ |
|
|
|
|
#define USB_VID_MITSU 0x06D3 |
|
|
|
|
#define USB_PID_MITSU_D90 0x3B60 |
|
|
|
|
|
|
|
|
|
const char *mitsu70x_media_types(uint8_t brand, uint8_t type); |
|
|
|
|
const char *mitsu70x_temperatures(uint8_t temp); |
|
|
|
|
|
|
|
|
|
/* Printer data structures */ |
|
|
|
|
#define D90_STATUS_TYPE_MODEL 0x01 // 10, null-terminated ASCII. 'CPD90D'
|
|
|
|
|
#define D90_STATUS_TYPE_x02 0x02 // 1, 0x5f ?
|
|
|
|
@ -150,7 +147,8 @@ struct mitsud90_job_hdr { |
|
|
|
|
uint8_t hdr[6]; /* 1b 53 50 30 00 33 */ |
|
|
|
|
uint16_t cols; /* BE */ |
|
|
|
|
uint16_t rows; /* BE */ |
|
|
|
|
uint8_t unk[4]; /* 64 00 00 01 */ // XXX 00 01 might be the jobid?
|
|
|
|
|
uint8_t waittime; /* 0-100 */ |
|
|
|
|
uint8_t unk[3]; /* 00 00 01 */ // XXX 00 01 might be the jobid?
|
|
|
|
|
uint8_t margincut; /* 1 for enabled, 0 for disabled */ |
|
|
|
|
union { |
|
|
|
|
#if 0 |
|
|
|
@ -163,15 +161,15 @@ struct mitsud90_job_hdr { |
|
|
|
|
} __attribute__((packed)); |
|
|
|
|
uint8_t zero[24]; |
|
|
|
|
|
|
|
|
|
/*@x30*/uint8_t overcoat; |
|
|
|
|
uint8_t quality; |
|
|
|
|
uint8_t colorcorr; |
|
|
|
|
uint8_t sharp_h; |
|
|
|
|
uint8_t sharp_v; |
|
|
|
|
/*@x30*/uint8_t overcoat; /* 0 glossy, matte is 2 (D90) or 3 (M1) */ |
|
|
|
|
uint8_t quality; /* 0 is automatic */ |
|
|
|
|
uint8_t colorcorr; /* Always 1 on M1 */ |
|
|
|
|
uint8_t sharp_h; /* Always 0 on M1 */ |
|
|
|
|
uint8_t sharp_v; /* Always 0 on M1 */ |
|
|
|
|
uint8_t zero_b[5]; |
|
|
|
|
union { |
|
|
|
|
struct { |
|
|
|
|
uint16_t pano_on; /* 0x0001 when pano is on, */ |
|
|
|
|
uint16_t pano_on; /* 0x0001 when pano is on, or always 0x000a on M1 */ |
|
|
|
|
uint8_t pano_tot; /* 2 or 3 */ |
|
|
|
|
uint8_t pano_pg; /* 1, 2, 3 */ |
|
|
|
|
uint16_t pano_rows; /* always 0x097c (BE), ie 2428 ie 8" print */ |
|
|
|
@ -182,16 +180,22 @@ struct mitsud90_job_hdr { |
|
|
|
|
uint8_t zero_c[16]; |
|
|
|
|
}; |
|
|
|
|
uint8_t zero_d[6]; |
|
|
|
|
uint8_t zero_fill[432]; |
|
|
|
|
uint8_t zero_e[17]; |
|
|
|
|
uint8_t rgbrate; /* M1 only */ |
|
|
|
|
uint8_t oprate; /* M1 only */ |
|
|
|
|
uint8_t zero_fill[413]; |
|
|
|
|
} __attribute__((packed)); |
|
|
|
|
|
|
|
|
|
struct mitsud90_plane_hdr { |
|
|
|
|
uint8_t hdr[6]; /* 1b 5a 54 01 00 09 */ |
|
|
|
|
uint16_t origin_cols; |
|
|
|
|
uint16_t origin_rows; |
|
|
|
|
uint16_t origin_cols; /* Leave at 0 */ |
|
|
|
|
uint16_t origin_rows; /* Leave at 0 */ |
|
|
|
|
uint16_t cols; /* BE */ |
|
|
|
|
uint16_t rows; /* BE */ |
|
|
|
|
uint8_t zero_fill[498]; |
|
|
|
|
uint8_t zero_a[6]; |
|
|
|
|
uint16_t lamcols; /* BE (M1 only, OC=3) should be cols+origin_cols */ |
|
|
|
|
uint16_t lamrows; /* BE (M1 only, OC=3) should be rows+origin_rows+12 */ |
|
|
|
|
uint8_t zero_fill[488]; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
struct mitsud90_job_footer { |
|
|
|
@ -406,7 +410,7 @@ static void mitsud90_dump_status(struct mitsud90_status_resp *resp) |
|
|
|
|
mitsud90_mecha_statuses(resp->mecha), |
|
|
|
|
resp->mecha[0], resp->mecha[1]); |
|
|
|
|
INFO("Temperature Status: %s\n", |
|
|
|
|
mitsu70x_temperatures(resp->temp)); |
|
|
|
|
mitsu_temperatures(resp->temp)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Private data structure */ |
|
|
|
@ -584,7 +588,7 @@ static int mitsud90_attach(void *vctx, struct libusb_device_handle *dev, int typ |
|
|
|
|
|
|
|
|
|
ctx->marker.color = "#00FFFF#FF00FF#FFFF00"; |
|
|
|
|
ctx->marker.numtype = resp.media.type; |
|
|
|
|
ctx->marker.name = mitsu70x_media_types(resp.media.brand, resp.media.type); |
|
|
|
|
ctx->marker.name = mitsu_media_types(resp.media.brand, resp.media.type); |
|
|
|
|
ctx->marker.levelmax = be16_to_cpu(resp.media.capacity); |
|
|
|
|
ctx->marker.levelnow = be16_to_cpu(resp.media.remain); |
|
|
|
|
|
|
|
|
@ -935,7 +939,7 @@ static int mitsud90_get_media(struct mitsud90_ctx *ctx) |
|
|
|
|
return CUPS_BACKEND_FAILED; |
|
|
|
|
|
|
|
|
|
INFO("Media Type: %s (%02x/%02x)\n", |
|
|
|
|
mitsu70x_media_types(resp.media.brand, resp.media.type), |
|
|
|
|
mitsu_media_types(resp.media.brand, resp.media.type), |
|
|
|
|
resp.media.brand, |
|
|
|
|
resp.media.type); |
|
|
|
|
INFO("Prints Remaining: %03d/%03d\n", |
|
|
|
@ -1337,13 +1341,17 @@ struct dyesub_backend mitsud90_backend = { |
|
|
|
|
|
|
|
|
|
[[HEADER 1]] |
|
|
|
|
|
|
|
|
|
1b 53 50 30 00 33 XX XX YY YY 64 00 00 01 MM ?? XX XX == COLS, YY XX ROWS (BE) |
|
|
|
|
?? ?? ?? ?? ?? ?? ?? ?? 00 00 00 00 00 00 00 00 <-- cut position, see below |
|
|
|
|
1b 53 50 30 00 33 XX XX YY YY TT 00 00 01 MM ?? XX XX == COLS, YY XX ROWS (BE) |
|
|
|
|
?? ?? ?? ?? ?? ?? ?? ?? 00 00 00 00 00 00 00 00 ?? = cut position, see below |
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 MM == 0 for no margin cut, 1 for margin cut |
|
|
|
|
QQ RR SS HH VV 00 00 00 00 00 01 00 03 II 09 7c QQ == 02 matte, 00 glossy, |
|
|
|
|
09 4c 00 00 02 58 00 0c 00 06 RR == 00 auto, 03 == fine, 02 == superfine. |
|
|
|
|
SS == 00 colorcorr, 01 == none |
|
|
|
|
HH/VV sharpening for Horiz/Vert, 0-8, 0 is off, 4 is normal |
|
|
|
|
QQ RR SS HH VV 00 00 00 00 00 ZZ 00 03 II 09 7c QQ == 02 matte (D90) or 03 (M1), 00 glossy, |
|
|
|
|
09 4c 00 00 02 58 00 0c 00 06 00 00 00 00 00 00 RR == 00 auto, 03 == fine, 02 == superfine. |
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 SS == 00 colorcorr, 01 == none (always 01 on M1) |
|
|
|
|
00 Z1 Z2 00 00 00 00 00 HH/VV sharpening for Horiz/Vert, 0-8, 0 is off, 4 is normal (always 00 on M1) |
|
|
|
|
TT is waittime (100 max, always 100 on D90) |
|
|
|
|
ZZ is 0a on M1, D90 see below |
|
|
|
|
Z1 is RGB Rate (M1) |
|
|
|
|
Z2 is OP Rate (M1) |
|
|
|
|
[pad to 512b] |
|
|
|
|
|
|
|
|
|
normal == rows 00 00 00 00 00 00 00 00 00 |
|
|
|
@ -1356,7 +1364,10 @@ struct dyesub_backend mitsud90_backend = { |
|
|
|
|
9x6div3 == 2724 00 03 90 00 07 14 00 00 00 |
|
|
|
|
9x6div4 == 2628 00 02 97 00 05 22 00 07 ad |
|
|
|
|
|
|
|
|
|
from [01 00 03 03] onwards, only shows in 8x20" PANORAMA prints. Assume 2" overlap. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from [ZZ 00 03 03] onwards, only shows in 8x20" PANORAMA prints. Assume 2" overlap. |
|
|
|
|
ZZ == 00 (normal) or 01 (panorama) |
|
|
|
|
II == 01 02 03 (which panel # in panorama!) |
|
|
|
|
[02 58] == 600, aka 2" * 300dpi? |
|
|
|
|
[09 4c] == 2380 (48 less than 8 size? (trim length on ends?) |
|
|
|
@ -1431,7 +1442,7 @@ Comms Protocol for D90 & CP-M1 |
|
|
|
|
|
|
|
|
|
WW == 0x50 or 0x00 (seen, no idea what it means) |
|
|
|
|
VV == Media vendor (0xff etc) |
|
|
|
|
TT == Media type, 0x02/0x0f etc (see mitsu70x_media_types!) |
|
|
|
|
TT == Media type, 0x02/0x0f etc (see mitsu_media_types!) |
|
|
|
|
XX XX == Media capacity, BE |
|
|
|
|
YY YY == Media remain, BE |
|
|
|
|
QQ QQ == 00 00 normal, 3f 37 error |
|
|
|
@ -1739,15 +1750,12 @@ static int cpm1_fillmatte(struct mitsud90_printjob *job) |
|
|
|
|
|
|
|
|
|
struct mitsud90_job_hdr *hdr = (struct mitsud90_job_hdr *) job->databuf; |
|
|
|
|
|
|
|
|
|
// XXX fill out lamination header?
|
|
|
|
|
ret = mitsu_readlamdata(MITSU_CPM1_LAMINATE_FILE, LAMINATE_STRIDE, |
|
|
|
|
job->databuf, &job->datalen, |
|
|
|
|
be16_to_cpu(hdr->rows), be16_to_cpu(hdr->cols), 1); |
|
|
|
|
be16_to_cpu(hdr->rows) + 12, be16_to_cpu(hdr->cols), 1); |
|
|
|
|
|
|
|
|
|
if (ret) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
// XXX fill out footer?
|
|
|
|
|
|
|
|
|
|
return CUPS_BACKEND_OK; |
|
|
|
|
} |
|
|
|
|