Posted on: 2024-05-19
UPDATE: The proprietary drivers for the CPD70DW are useless but Solomon Peachy has developed an open source driver which works perfectly. I haven't had a chance to try it it out with the CPD70DW-U yet. But if you just want to print with the CPD70DW, get the open source driver and ignore my post.
So, I recently bought a Mitsubishi CP-D70DW-U. What I actually wanted however was a CP-D70DW without the "-U" suffix. There is another printer with an "-S" suffix which is actually just two printers in one but otherwise the same. So my naïve though was "Meh, that doesn't matter. It's gonna be the same." Big mistake!
The reason why I wanted the CPD70DW is that I'm working on a project for a client which has a CPD70DW and I wanted to write new software. But the printer is sometimes a bit wonky with the Linux driver, doesn't print until USB is reconnected or other has other weird issues. I can't get much work done at the clients location and can't borrow the printer for a couple of days to get everything ironed out, so I had to seek another option. My idea was to just buy a cheap used CPD70DW, play around with it until I'm done - client's happy, I'm happy - and I can sell the printer to my client as a spare or use it for myself.
My eBay original bid on a CPD70DW got sniped three seconds before the end of the auction so I got the CPD70DW-U instead.
Turns out the CPD70DW-U doesn't work with CPD70DW media. So I couldn't use the paper and ink ribbon I borrowed from my client, instead I had to buy another 800 print roll of paper. So the resell aspect was gone. Meh.
Fine, things arrived, I put them in and printed a test page right from the printer. It came out fine. Then I tried a print job from my PC and ... Nothing. Printer accepts print job, prints nothing. Tried it from a Windows VM - nothing, same issue.
On a Dutch Photokiosk rental site I finally found the answer: There is no printer driver for the CPD70DW-U. Well, that info came a bit too late :( The printer is only for the EasyPhoto Kiosk.
So now I've spent a lot of money on something that might never work out, but I wasn't done trying. I ordered an EasyPhoto Kiosk and as mentioned in the previous post, with the Kiosk it worked just fine. But that's not good enough! I need a way to programmatically print photos, not by tapping on a touchscreen! Good thing the software is written in unobfuscated Java which allows for easy decompilation. But first I had to get this thing running in a VM for easier development. This is quite easy. From the base image it's just a few steps to get it working via KVM
Starting the EasyPhoto Software in a VM
Some things first:
- Set the disk controller to SATA. The old Debian system doesn't know about Virtio disks
- Add an E1000 network adapter. Even if you don't plan on using the network, the adapter is required so that the Kiosk software can retrieve its address for License checking
Then boot the system. It will drop into a root shell
Delete or rename /etc/X11/xorg.conf
as it references the non-existent touchscreen. The default settings will do fine. Then, the system uses the board ID read from dmidecode
to determine the hardware version. This does not exist in a VM so it won't work correctly. On my VM I simple renamed /usr/sbin/dmidecode
and replaced it with this simple shell script:
#!/bin/sh
echo 00000002
Don't forget to forward the USB device to the VM, then reboot. You should be able to print photos now.
I found it easiest to make an ISO file with mkisofs
, attach that to the VM and select the option to print from this "CD".
Adding an API
Next, I wanted to add a simple API which allows me to HTTP-PUT files to the Easyphoto and have it print out with default settings. By decompiling the application and analyzing the classes I came up with this little Java project. The jar file needs to be added to the classpath in /root/runApp.sh
and the main class changed from com.mitsubishi.it1000.Main
to easyphotorest.Easyphotorest
When sending a JPG via a PUT request to port 8000, the photo will be printed. Or not, there is little error handling, sorry :/
Modified firmware image
I've made the modified image available for download as well. The modifications are:
- Renamed
xorg.conf
anddmidecode
as mentioned above, for testing. The original files are still present so they can be restored. - Set fixed IP address to
fc00:210::1/64
(or 192.168.210.1/24, if you are a fan of outdated protocols) - Enabled ssh by default, user
root
, passwordroot
. Change this if you expose the machine to an actual network! - Messed with the start scripts to disable the screensaver, manager app and make sure the main app always restarts to keep the port open.
The SSH Server is quite old and modern SSH clients won't communicate with it unless forced to. This command works:
ssh -oHostKeyAlgorithms=+ssh-dss root@fc00:210::1
Now, on to the download link. If you don't know about mycdntool read my previous blogpost with the command to get the original image. You are only allowed to install this if you own a Mitsubishi EasyPhoto! Use at your own risk, I will not be held liable for damages! This command downloads it:
mycdntool catlf cGfstKb98EXQE9iOIOCG0.coNMs.70kC26Dhg8cIsZ4 > easyphoto-with-api.img
Once it's running and you have set your PC to an IP within the same network you can initiate a test print with:
curl -T some-photo-on-your-disk.jpg 'http://[fc00:210::1]:8000'
Trivia
- When trying to print photos which are too large (like the 108 Megapixel photos from my Xiaomi phone) or otherwise fail to load, the printer only spits out a black page
- The software seems to be written by people who don't use English as as their primary IT language. This leads to interesting naming conventions such as "Temporal files" instead of "Temporary files"
- Some error messages and variable names are in Spanish, others seem to be German but thankfully most of it is reasonably well written English. There might be other languages too.
- In one Java package they spelled "Mitsubishi" wrong. It's named "Mitusubishi"
- The ICC color profile for the printer is encrypted for some reason. But if needed, it's trivial to decrypt as it's a very primitive encryption, more obfuscation than encryption actually. I didn't bother, just found it curious.