diff --git a/backend_mitsu.c b/backend_mitsu.c index df2dd88..a2600c6 100644 --- a/backend_mitsu.c +++ b/backend_mitsu.c @@ -198,3 +198,59 @@ int mitsu_readlamdata(const char *fname, uint16_t lamstride, return CUPS_BACKEND_OK; } + +const char *mitsu_temperatures(uint8_t temp) +{ + switch(temp) { + case TEMPERATURE_NORMAL: + return "Normal"; + case TEMPERATURE_PREHEAT: + return "Warming Up"; + case TEMPERATURE_COOLING: + return "Cooling Down"; + default: + break; + } + return "Unknown Temperature Status"; +} + +const char *mitsu_media_types(uint8_t brand, uint8_t type) +{ + if (brand == 0xff && type == 0x01) + return "CK-D735 (3.5x5)"; + else if (brand == 0xff && type == 0x02) + return "CK-D746 (4x6)"; + else if (brand == 0xff && type == 0x04) + return "CK-D757 (5x7)"; + else if (brand == 0xff && type == 0x05) + return "CK-D769 (6x9)"; + else if (brand == 0xff && type == 0x0f) + return "CK-D768/CK-D868 (6x8)"; + else if (brand == 0x6c && type == 0x84) + return "Kodak 5R (5x7)"; + else if (brand == 0x6c && type == 0x8f) + return "Kodak 6R (6x8)"; + else if (brand == 0x61 && type == 0x84) + return "CK-K57R (5x7)"; + else if (brand == 0x61 && type == 0x8f) + return "CK-K76R (6x8)"; + else if (brand == 0x7a && type == 0x01) + return "RL-CF900 (3.5x5)"; + else if (brand == 0x7a && type == 0x02) + return "RK-CF800/4R (4x6)"; + else if (brand == 0x7a && type == 0x04) + return "R2L-CF460/5R (5x7)"; + else if (brand == 0x7a && type == 0x0f) + return "R68-CF400/6R (6x8)"; + else + return "Unknown"; + +// Also CK-D715, CK-D718, CK-D720, CK-D723 (4x6,5x8,6x8,6x9) for D70-S model +// CK-D746-U for D70-U model +// CK-D820 (6x8) for D80-S model +// D90 can use _all_ of these types except for the -U! + + // CK-M57S (5x7 for M1) + // CK-M68S (6x8 for M1) + // CK-M46S (6x4 for M1) +} diff --git a/backend_mitsu.h b/backend_mitsu.h index 731412f..3bf99cf 100644 --- a/backend_mitsu.h +++ b/backend_mitsu.h @@ -71,7 +71,7 @@ typedef void (*CP98xx_DestroyDataFN)(const struct mitsu98xx_data *data); #define REQUIRED_LIB_APIVERSION 5 -#define LIBMITSU_VER "0.03" +#define LIBMITSU_VER "0.04" /* Image processing library function prototypes */ #define LIB_NAME_RE "libMitsuD70ImageReProcess" DLL_SUFFIX @@ -114,3 +114,10 @@ int mitsu_apply3dlut(struct mitsu_lib *lib, char *lutfname, uint8_t *databuf, int mitsu_readlamdata(const char *fname, uint16_t lamstride, uint8_t *databuf, uint32_t *datalen, uint16_t rows, uint16_t cols, uint8_t bpp); + +#define TEMPERATURE_NORMAL 0x00 +#define TEMPERATURE_PREHEAT 0x40 +#define TEMPERATURE_COOLING 0x80 + +const char *mitsu_temperatures(uint8_t temp); +const char *mitsu_media_types(uint8_t brand, uint8_t type); diff --git a/backend_mitsu70x.c b/backend_mitsu70x.c index 52476cc..3202a4b 100644 --- a/backend_mitsu70x.c +++ b/backend_mitsu70x.c @@ -134,10 +134,6 @@ struct mitsu70x_jobs { struct mitsu70x_job jobs[NUM_JOBS]; } __attribute__((packed)); -#define TEMPERATURE_NORMAL 0x00 -#define TEMPERATURE_PREHEAT 0x40 -#define TEMPERATURE_COOLING 0x80 - #define MECHA_STATUS_INIT 0x80 #define MECHA_STATUS_FEED 0x50 #define MECHA_STATUS_LOAD 0x40 @@ -329,21 +325,6 @@ static int mitsu70x_main_loop(void *vctx, const void *vjob); /* Error dumps, etc */ -const char *mitsu70x_temperatures(uint8_t temp) -{ - switch(temp) { - case TEMPERATURE_NORMAL: - return "Normal"; - case TEMPERATURE_PREHEAT: - return "Warming Up"; - case TEMPERATURE_COOLING: - return "Cooling Down"; - default: - break; - } - return "Unknown Temperature Status"; -} - static const char *mitsu70x_mechastatus(uint8_t *sts) { switch(sts[0]) { @@ -579,43 +560,6 @@ static const char *mitsu70x_errors(uint8_t *err) return "Unknown error"; } -const char *mitsu70x_media_types(uint8_t brand, uint8_t type) -{ - if (brand == 0xff && type == 0x01) - return "CK-D735 (3.5x5)"; - else if (brand == 0xff && type == 0x02) - return "CK-D746 (4x6)"; - else if (brand == 0xff && type == 0x04) - return "CK-D757 (5x7)"; - else if (brand == 0xff && type == 0x05) - return "CK-D769 (6x9)"; - else if (brand == 0xff && type == 0x0f) - return "CK-D768/CK-D868 (6x8)"; - else if (brand == 0x6c && type == 0x84) - return "Kodak 5R (5x7)"; - else if (brand == 0x6c && type == 0x8f) - return "Kodak 6R (6x8)"; - else if (brand == 0x61 && type == 0x84) - return "CK-K57R (5x7)"; - else if (brand == 0x61 && type == 0x8f) - return "CK-K76R (6x8)"; - else if (brand == 0x7a && type == 0x01) - return "RL-CF900 (3.5x5)"; - else if (brand == 0x7a && type == 0x02) - return "RK-CF800/4R (4x6)"; - else if (brand == 0x7a && type == 0x04) - return "R2L-CF460/5R (5x7)"; - else if (brand == 0x7a && type == 0x0f) - return "R68-CF400/6R (6x8)"; - else - return "Unknown"; - -// Also CK-D715, CK-D718, CK-D720, CK-D723 (4x6,5x8,6x8,6x9) for D70-S model -// CK-D746-U for D70-U model -// CK-D820 (6x8) for D80-S model -// D90 can use _all_ of these types except for the -U! - -} #define CMDBUF_LEN 512 #define READBACK_LEN 256 @@ -695,7 +639,7 @@ static int mitsu70x_attach(void *vctx, struct libusb_device_handle *dev, int typ /* Set up markers */ ctx->marker[0].color = "#00FFFF#FF00FF#FFFF00"; - ctx->marker[0].name = mitsu70x_media_types(resp.lower.media_brand, resp.lower.media_type); + ctx->marker[0].name = mitsu_media_types(resp.lower.media_brand, resp.lower.media_type); ctx->marker[0].numtype = resp.lower.media_type; ctx->marker[0].levelmax = be16_to_cpu(resp.lower.capacity); ctx->marker[0].levelnow = be16_to_cpu(resp.lower.remain); @@ -703,7 +647,7 @@ static int mitsu70x_attach(void *vctx, struct libusb_device_handle *dev, int typ if (ctx->num_decks == 2) { ctx->marker[1].color = "#00FFFF#FF00FF#FFFF00"; - ctx->marker[1].name = mitsu70x_media_types(resp.upper.media_brand, resp.upper.media_type); + ctx->marker[1].name = mitsu_media_types(resp.upper.media_brand, resp.upper.media_type); ctx->marker[1].numtype = resp.upper.media_type; ctx->marker[1].levelmax = be16_to_cpu(resp.upper.capacity); ctx->marker[1].levelnow = be16_to_cpu(resp.upper.remain); @@ -2065,11 +2009,11 @@ static void mitsu70x_dump_printerstatus(struct mitsu70x_ctx *ctx, mitsu70x_errors(resp->lower.error_status), mitsu70x_errorrecovery(resp->lower.error_status)); } - INFO("Lower Temperature: %s\n", mitsu70x_temperatures(resp->lower.temperature)); + INFO("Lower Temperature: %s\n", mitsu_temperatures(resp->lower.temperature)); INFO("Lower Mechanical Status: %s\n", mitsu70x_mechastatus(resp->lower.mecha_status)); INFO("Lower Media Type: %s (%02x/%02x)\n", - mitsu70x_media_types(resp->lower.media_brand, resp->lower.media_type), + mitsu_media_types(resp->lower.media_brand, resp->lower.media_type), resp->lower.media_brand, resp->lower.media_type); INFO("Lower Prints Remaining: %03d/%03d\n", @@ -2087,11 +2031,11 @@ static void mitsu70x_dump_printerstatus(struct mitsu70x_ctx *ctx, mitsu70x_errors(resp->upper.error_status), mitsu70x_errorrecovery(resp->upper.error_status)); } - INFO("Upper Temperature: %s\n", mitsu70x_temperatures(resp->upper.temperature)); + INFO("Upper Temperature: %s\n", mitsu_temperatures(resp->upper.temperature)); INFO("Upper Mechanical Status: %s\n", mitsu70x_mechastatus(resp->upper.mecha_status)); INFO("Upper Media Type: %s (%02x/%02x)\n", - mitsu70x_media_types(resp->upper.media_brand, resp->upper.media_type), + mitsu_media_types(resp->upper.media_brand, resp->upper.media_type), resp->upper.media_brand, resp->upper.media_type); INFO("Upper Prints Remaining: %03d/%03d\n", @@ -2130,7 +2074,7 @@ static int mitsu70x_query_jobs(struct mitsu70x_ctx *ctx) mitsu70x_errors(jobstatus.error_status), mitsu70x_errorrecovery(jobstatus.error_status)); } - INFO("Lower Deck Temperature: %s\n", mitsu70x_temperatures(jobstatus.temperature)); + INFO("Lower Deck Temperature: %s\n", mitsu_temperatures(jobstatus.temperature)); INFO("Upper Deck Mechanical Status: %s\n", mitsu70x_mechastatus(jobstatus.mecha_status_up)); @@ -2140,7 +2084,7 @@ static int mitsu70x_query_jobs(struct mitsu70x_ctx *ctx) mitsu70x_errors(jobstatus.error_status_up), mitsu70x_errorrecovery(jobstatus.error_status_up)); } - INFO("Upper Deck Temperature: %s\n", mitsu70x_temperatures(jobstatus.temperature_up)); + INFO("Upper Deck Temperature: %s\n", mitsu_temperatures(jobstatus.temperature_up)); } else { INFO("Mechanical Status: %s\n", mitsu70x_mechastatus(jobstatus.mecha_status)); @@ -2150,7 +2094,7 @@ static int mitsu70x_query_jobs(struct mitsu70x_ctx *ctx) mitsu70x_errors(jobstatus.error_status), mitsu70x_errorrecovery(jobstatus.error_status)); } - INFO("Temperature: %s\n", mitsu70x_temperatures(jobstatus.temperature)); + INFO("Temperature: %s\n", mitsu_temperatures(jobstatus.temperature)); } // memory status? diff --git a/backend_mitsud90.c b/backend_mitsud90.c index aaaed9d..6155181 100644 --- a/backend_mitsud90.c +++ b/backend_mitsud90.c @@ -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; }