***************************************************************************
Canon SELPHY ES/CP series print assister
(c) 2007-2012 Solomon Peachy <pizza@shaftnet.org>
The latest version of this program can be found at
http://git.shaftnet.org/git/gitweb.cgi?p=selphy_print.git
***************************************************************************
The SELPHY ES/CP series of dyesub printers from Canon generally require
intelligent buffering of the raw print data in order to keep the printer
from locking up. This tool accomplishes just that.
Verified supported printers:
ES1, ES2, ES30, CP-330, CP400, CP510, CP720, CP730, CP740, CP750,
CP760, CP780
Unverified/untested, but should work:
ES20, ES3, CP-10, CP-100, CP-200, CP-220, CP-300, CP500, CP520,
CP530, CP600, CP710, CP770, CP800, CP810, CP900
NOT currently supported: (Readback codes needed)
ES40, CP790
***************************************************************************
Compilation:
You will need libusb-1.0 to build this tool.
Fedora/RedHat:
yum install libusb1-devel
Debian/Ubuntu
apt-get install libusb-1.0-0-dev
And all you need to do after that is type 'make'
***************************************************************************
CUPS backend usage:
cp selphy_print_libusb /usr/lib/cups/backend/selphy
chown root:root /usr/lib/cups/backend/selphy
chmod 500 /usr/lib/cups/backend/selphy
You may need to restart CUPS, and you will also need a prerelease
version of gutenprint installed.
Please note that this will eventually be bundled with gutenprint.
[[[ TODO: -- finish this ]]]
***************************************************************************
Standalone usage:
selphy_print_libusb filename
selphy_print_libusb - < filename
somecommand | selphy_print_libusb -
***************************************************************************
Selphy ES1:
Init func: 40 00 [typeA] [pgcode] 00 00 00 00 00 00 00 00
Plane func: 40 01 [typeB] [plane] [length, 32-bit LE] 00 00 00 00
TypeA codes are 0x10 for Color papers, 0x20 for B&W papers.
TypeB codes are 0x01 for Color papers, 0x02 for B&W papers.
Plane codes are 0x01, 0x03, 0x07 for Y, M, and C, respectively.
B&W Jobs have a single plane code of 0x01.
'P' papers pgcode of 0x11 and a plane length of 2227456 bytes
'CP_L' pgcode of 0x12 and a plane length of 1601600 bytes.
'Card' pgcode of 0x13 and a plane length of 698880 bytes.
Readback values seen:
02 00 00 00 02 01 [pg] 01 00 00 00 00 [idle, waiting for init seq]
04 00 00 00 02 01 [pg] 01 00 00 00 00 [init received, not ready..]
04 00 01 00 02 01 [pg] 01 00 00 00 00 [waiting for Y data]
04 00 03 00 02 01 [pg] 01 00 00 00 00 [waiting for M data]
04 00 07 00 02 01 [pg] 01 00 00 00 00 [waiting for C data]
04 00 00 00 02 01 [pg] 01 00 00 00 00 [all data sent; not ready..]
05 00 00 00 02 01 [pg] 01 00 00 00 00 [?? transitions to this]
06 00 00 00 02 01 [pg] 01 00 00 00 00 [?? transitions to this]
02 00 00 00 02 01 [pg] 01 00 00 00 00 [..transitions back to idle]
Known paper types for all ES printers: P, Pbw, C, Cl
Additional types for ES3/30/40: Pg, Ps
Known pg codes: 0x01 -- P-size
0x03 -- C-size
Readbacks for other paper types are currently unknown.
P* sizes are 100x148mm "postcards"
CP_L sizes are 89x119mm "labels"
Card sizes are 54x86mm "cards"
***************************************************************************
Selphy ES2/20:
Init func: 40 00 [pgcode] 00 02 00 00 [type] 00 00 00 [pg2] [length, 32-bit LE]
Plane func: 40 01 [plane] 00 00 00 00 00 00 00 00 00
Type codes are 0x00 for Color papers, 0x01 for B&W papers.
Plane codes are 0x01, 0x02, 0x03 for Y, M, and C, respectively.
B&W Jobs have a single plane code of 0x01.
'P' papers pgcode of 0x01 and a plane length of 2227456 bytes
'CP_L' pgcode of 0x02 and a plane length of 1601600 bytes.
'Card' pgcode of 0x03 and a plane length of 698880 bytes.
pg2 is 0x00 for all media types except for 'Card', which is 0x01.
Readback values seen on an ES2:
02 00 00 00 [pg] 00 [pg2] [xx] 00 00 00 00 [idle, waiting for init seq]
03 00 01 00 [pg] 00 [pg2] [xx] 00 00 00 00 [init complete, ready for Y]
04 00 01 00 [pg] 00 [pg2] [xx] 00 00 00 00 [? paper loaded]
05 00 01 00 [pg] 00 [pg2] [xx] 00 00 00 00 [? transitions to this]
06 00 03 00 [pg] 00 [pg2] [xx] 00 00 00 00 [ready for M]
08 00 03 00 [pg] 00 [pg2] [xx] 00 00 00 00 [? transitions to this]
09 00 07 00 [pg] 00 [pg2] [xx] 00 00 00 00 [ready for C]
09 00 00 00 [pg] 00 [pg2] 00 00 00 00 00 [? transitions to this]
0b 00 00 00 [pg] 00 [pg2] 00 00 00 00 00 [? transisions to this]
0c 00 00 00 [pg] 00 [pg2] 00 00 00 00 00 [? transitions to this]
0f 00 00 00 [pg] 00 [pg2] 00 00 00 00 00 [? transitions to this]
13 00 00 00 [pg] 00 [pg2] 00 00 00 00 00 [? transitions to this]
02 00 00 00 [pg] 00 [pg2] 00 00 00 00 00 [back to idle, waiting for init seq]
[xx] can be 0x00 or 0xff, depending on if a print job has completed or not.
14 00 00 00 [pg] 00 [pg2] 00 00 00 00 00 [out of paper/ink]
14 00 01 00 [pg] 00 [pg2] 00 01 00 00 00 [out of paper/ink]
[pg] is: 0x01 for P-paper
0x03 for C-paper
[pg2] is: 0x00 for P-paper
0x01 for C-paper (label)
***************************************************************************
Selphy ES3/30:
Init func: 40 00 [pgcode] [type] 00 00 00 00 00 00 00 00 [length, 32-bit LE]
Plane func: 40 01 [plane] 00 00 00 00 00 00 00 00 00
End func: 40 20 00 00 00 00 00 00 00 00 00 00
Type codes are 0x00 for Color papers, 0x01 for B&W papers.
Plane codes are 0x01, 0x02, 0x03 for Y, M, and C, respectively.
B&W Jobs have a single plane code of 0x01.
'P' papers pgcode of 0x01 and a plane length of 2227456 bytes.
'CP_L' pgcode of 0x02 and a plane length of 1601600 bytes.
'Card' pgcode of 0x03 and a plane length of 698880 bytes.
Readback values seen on an ES30:
00 ff 00 00 ff ff ff ff 00 00 00 00 [idle, waiting for init seq]
01 ff 01 00 ff ff ff ff 00 00 00 00 [init complete, ready for Y]
03 ff 01 00 ff ff ff ff 00 00 00 00 [?]
03 ff 02 00 ff ff ff ff 00 00 00 00 [ready for M]
05 ff 02 00 ff ff ff ff 00 00 00 00 [?]
05 ff 03 00 ff ff ff ff 00 00 00 00 [ready for C]
07 ff 03 00 ff ff ff ff 00 00 00 00 [?]
0b ff 03 00 ff ff ff ff 00 00 00 00 [?]
13 ff 03 00 ff ff ff ff 00 00 00 00 [?]
00 ff 10 00 ff ff ff ff 00 00 00 00 [done, ready for footer]
There appears to be no paper code in the readback; codes were identical for
the standard 'P-Color' and 'C-Label' cartridges:
***************************************************************************
Selphy ES40:
Init func: 40 00 [pgcode] [type] 00 00 00 00 00 00 00 00 [length, 32-bit LE]
Plane func: 40 01 [plane] 00 00 00 00 00 00 00 00 00
End func: 40 20 00 00 00 00 00 00 00 00 00 00
Type codes are 0x00 for Color papers, 0x01 for B&W papers.
Plane codes are 0x01, 0x02, 0x03 for Y, M, and C, respectively.
B&W Jobs have a single plane code of 0x01.
'P' papers pgcode of 0x00 and a plane length of 2227456 bytes.
'CP_L' pgcode of 0x01 and a plane length of 1601600 bytes.
'Card' pgcode of 0x02 and a plane length of 698880 bytes.
Readback codes are unknown.
***************************************************************************
Selphy CP790:
Init func: 40 00 [pgcode] 00 00 00 00 00 00 00 00 00 [length, 32-bit LE]
Plane func: 40 01 [plane] 00 00 00 00 00 00 00 00 00
End func: 40 20 00 00 00 00 00 00 00 00 00 00
Plane codes are 0x01, 0x02, 0x03 for Y, M, and C, respectively.
'P' papers pgcode of 0x00 and a plane length of 2227456 bytes.
'CP_L' pgcode of 0x01 and a plane length of 1601600 bytes.
'Card' pgcode of 0x02 and a plane length of 698880 bytes.
'Wide' pgcode of 0x03 and a plane length of 2976512 bytes.
Readback codes are unknown.
***************************************************************************
Selphy CP-900
Init func: 40 00 00 [pgcode] 00 00 00 00 00 00 00 00
Plane func: 40 01 00 [plane] [length, 32-bit LE] 00 00 00 00
End func: 00 00 00 00
plane codes are 0x00, 0x01, 0x02 for Y, M, and C, respectively.
'P' paper pgcode 0x01 plane length 2227456 bytes.
'CP_L' pgcode 0x02 plane length 1601600 bytes.
'Card' paper pgcode 0x03 plane length 698880 bytes.
Readback codes are unknown, but likely identical to the other CP-series.
***************************************************************************
Selphy CP-series (except for CP790/CP900):
Init func: 40 00 00 [pgcode] 00 00 00 00 00 00 00 00
Plane func: 40 01 00 [plane] [length, 32-bit LE] 00 00 00 00
plane codes are 0x00, 0x01, 0x02 for Y, M, and C, respectively.
'P' paper pgcode 0x01 plane length 2227456 bytes.
'CP_L' pgcode 0x02 plane length 1601600 bytes.
'Card' paper pgcode 0x03 plane length 698880 bytes.
'Wide' paper pgcode 0x04 plane length 2976512 bytes.
Known readback values (From CP-330/CP400/CP510/CP720/CP730/CP740/CP750/CP760/CP720/CP780)
01 00 00 00 00 00 [pg] 00 00 00 00 [xx] [idle, waiting for init]
02 00 00 00 70 00 [pg] 00 00 00 00 [xx] [waiting for Y data]
04 00 00 00 00 00 [pg] 00 00 00 00 [xx] [waiting for M data]
08 00 00 00 00 00 [pg] 00 00 00 00 [xx] [waiting for C data]
10 00 00 00 00 00 [pg] 00 00 00 00 [xx] [C done, waiting]
20 00 00 00 00 00 [pg] 00 00 00 00 [xx] [All done]
[xx] is 0x01 on the CP780, 0x00 on all others.
'P' paper has a code of 0x11
'CP_L' paper has a code of 0x22
'Card' paper has a code of 0x33
'Wide' paper has a code of 0x44
Paper readback code is as follows -- first four bits are paper, second
four bits are the ribbon. So it's possible to have a readback of, say,
0x41 if the 'Wide' paper tray is loaded with a 'P' ribbon. A '0' is used
to signify nothing being loaded.