9 ms·
Ask HN: How do I write a Linux driver for my 15 year old photo printer?
I'm interested in writing a x86_64 Linux driver for my 15 year old photo printer.
It looks like someone out there maintains 32 bit drivers for this printer, but I'd like low-hassle native support for my 64-bit install.
https://askubuntu.com/questions/1324015/how-to-install-printer-canon-pixma-ip1800-on-xubuntu-20-04 https://askubuntu.com/questions/1324015/how-to-install-print...
Where do I get started with this? What's the toolchain for sniffing USB data and that sort of thing?
- yyyk 4y agoModern printers usually work one of two ways: You can feed them directly a typical printer language (PostScript, PCL or PDF), or you work with CUPS PPD files. Both are userspace. It would be easiest to see if there's a PPD for closely related printer* - most manufacturers reuse components and/or evolve them incrementally - and start modifying stuff from there. There's a decent chance it would already work for basic functionality, and that you'll be able to improve it by trial and error. If you are lucky, you may be able to get a decent driver without even needing to bother with USB sniffing. * e.g. A similar Canon printer by model name.
- pessimizer 4y ago> Modern printers usually work one of two ways Are 15 year old photo printers modern?
- sgt 4y agoYes, since the tech hasn't changed much
- Underphil 4y ago15 years ago is only 2007.
- hutzlibu 4y agoYeah. I think I was someone else back then. And I think quite some people and events did not yet exist back then. But printers might not have fundamentally changed in that time, the way mobile phones have for example ..
- Underphil 4y agoI don't recall printers changing all that much since the early 2000s at all. I mean they added USB, WiFi, Bluetooth and other such things but the protocols to talk to them largely remain the same. There's only so many ways to tell the machine to 'replicate this but on paper'.
- pessimizer 4y agoI love the sentiment. 15 years young!
- shakna 4y agoThe IPP protocol, how most printers work today over a network, first became popular about 20 years ago, and hasn't really changed much since. Windows 2000 had full support builtin, and CUPS has had it for about the same timeframe, making it really damn easy to print anything, from any device built since, and its all in userspace.
- the_only_law 4y ago> making it really damn easy to print anything, from any device built since I guess at some point they had to ruin it by making all consumer printers use buggy wifi stacks.
- zamalek 4y agoYou might the PPD in a Windows installer.
- jchw 4y agoI'd recommend doing some reconnaissance by looking at the 32 bit driver. What does the package contain? Prod at any binaries with binwalk, strings and maybe even Ghidra if you can to try to gather information. If you don't understand the higher level bits of what's going on in the driver, it leaves room for a gap in understanding what exactly you might need to write to replace the 32 bit parts of the driver. If the driver works with cups, it'd be good to try to understand how exactly that works. (I'm being somewhat vague here since I don't personally know.)
- deleted 4y ago[deleted]
- deleted 4y ago[deleted]
- mmastrac 4y agoThe printer driver appears to be 100% userspace, so you can more than likely use QEMU in userspace mode to run the driver on any system: https://www.qemu.org/docs/master/user/main.html https://www.qemu.org/docs/master/user/main.html
- kelnos 4y agoIf it's an IA32 binary and the system is x86_64, you don't even need qemu; 64-bit Linux can run 32-bit binaries natively. You just need to install the 32-bit versions of any library dependencies (trivial on something like Debian, where the packaging system supports doing this out of the box).
- lallysingh 4y agoThese folks seem to have a 64-bit linux driver for it, for $49 eur: https://www.turboprint.info/ https://www.turboprint.info/
- digitallyfree 4y agoUnless there's a specific reason for using this printer the unit itself is worth far less than 49EUR. There are used models that can be had for cheap with full Linux support. Now writing or reversing a Linux driver for the printer though can be a fun project but I personally wouldn't buy this driver just so I can use the printer.
- Joel_Mckay 4y agoTraining on the kernel is probably necessary, and the Linux foundation course is expensive... but LFD430 is what you are seeking. Primarily, there were many trends in the kernel module structures, and a lot of deprecated apis. If you just read the code, you are guaranteed have issues with the legacy code peppered in the module source. Essentially, if you just need a USB workaround, than a user space program with libusb will greatly simplify your life. =)
- nixcraft 4y agoRMS started open source because of printer driver issues (he wanted the source code but wasn't allowed it and thought it as a betrayal of the hacker culture). This post is like history repeating itself.
- pessimizer 4y agoWe can blame RMS for inspiring business to react to him with Open Source, but he started Free Software.
- Flankk 4y agoI'd just like to interject for a moment. What you're referring to as Free Software is actually GNU/Free Software. GNU/Free Software is not an ecosystem unto itself, but rather one component of a fully functioning GNU ecosystem.
- pessimizer 4y agoIs this some kind of annoying autoreply for everyone who mentions RMS? Sorry for saying the guy who started the Free Software Foundation started Free Software, and not Open Source. Open Source, which is different from and often hostile to Free Software, which is also often hostile to it.
- forgotpwd16 4y agoIt's a meme. https://wiki.installgentoo.com/index.php/Interjection https://wiki.installgentoo.com/index.php/Interjection Speaking of RMS writings and your comment, he also wrote on free software v. open source. https://www.gnu.org/philosophy/open-source-misses-the-point.en.html https://www.gnu.org/philosophy/open-source-misses-the-point.... Wouldn't go that far to call them hostile.
- matheusmoreira 4y agoLooks like RMS addressed this 4chan shitpost in the GNU website. https://www.gnu.org/gnu/incorrect-quotation.html https://www.gnu.org/gnu/incorrect-quotation.html Actually pretty funny! I can't believe he wrote an article about it.
- AshamedCaptain 4y agoWhy don't you try one of the CUPS, GutenPrint, etc. user mailing lists? This is not the most appropriate venue for asking this type of questions.
- btdmaster 4y agoAUR package: https://aur.archlinux.org/packages/cnijfilter-ip1800series https://aur.archlinux.org/packages/cnijfilter-ip1800series (Arch uses PKGBUILDs, which are roughly bash shell scripts: https://wiki.archlinux.org/title/PKGBUILD https://wiki.archlinux.org/title/PKGBUILD) If you read https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=cnijfilter-ip1800series https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=cnijf..., you should be able to compile the 32-bit driver yourself and try and port stuff from there, but note that only parts of the driver are GPL2 and some are proprietary, and it's not entirely obvious which is which (though, from the looks of it, the prebuilt libraries are proprietary and everything with Makefile.am and autogen.sh is GPL2)
- chpatrick 4y agoMaybe it's easier to add it to Gutenprint? http://gimp-print.sourceforge.net/ http://gimp-print.sourceforge.net/ It supports Pixma ip2000, so maybe it's not a huge change. This describes how to add a new printer: http://gimp-print.sourceforge.net/reference-html/c199.html http://gimp-print.sourceforge.net/reference-html/c199.html
- chpatrick 4y agoIn the Canon drivers the IP1800 is included as the same package as IP3300 which is already supported in Gutenprint, so maybe that's the closest one to copy from. https://github.com/endlessm/cnijfilter-common/blob/0c5cfbf85cd6efc46d2dbb9da68ce8fac2815371/311/database/cifip2500.conf https://github.com/endlessm/cnijfilter-common/blob/0c5cfbf85...
- antegamisou 4y agoGrab a copy of Linux Device Drivers by Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman: https://lwn.net/Kernel/LDD3/ https://lwn.net/Kernel/LDD3/ Don't mind the document's age, the principles have largely remained unchanged. Besides, it's probably a better fit since you're targeting a device from 2007 I understand this may be kind of non-specific to what you were expecting, but it's the most rewarding way of achieving what you want and coming up much faster with a driver for an obscure device next time.
- fuckstick 4y agoUnfortunately, it’s completely irrelevant to the question asked as printers are typically not driven by kernel mode device drivers.
- deleted 4y ago[deleted]
- antegamisou 4y agoThe book covers the user space as well iirc. And who says you can't write a kernel driver for a printer? It's certainly overkill but if you're into low level programming it's a very fascinating way to dive deeper into it, as I assumed is the case going by the last sentence of the OP.
- fuckstick 4y ago> The book covers the user space as well iirc. No it does not. It’s easy enough to scan the USB chapter and see that it is entirely targeting the kernel interface. > And who says you can't write a kernel driver for a printer Well there already is one - usblp. If you’re trying to grok the esoterica of Linux USB kernel mode interfaces - a printer class driver is not the worst exercise - but this is to me very far removed from the task at hand - driving the hardware.
- antegamisou 4y ago
- deleted 4y ago[deleted]
- fuckstick 4y agoThis is an extremely poor venue for this type of question - the answers are all over the place and mostly unhelpful (printer drivers in Linux almost never involve a custom kernel driver). You might have better luck on Arch Linux forums of all places. What you’re asking for probably won’t be low hassle compared to just running the 32 bit usermode “driver” - which should run fine on a 64 bit system with some packaging help. Ask yourself, are you trying to use the damn printer or you want a possibly educational rabbit hole to go down. Even if you sniff the USB (you can simply use pcap/wireshark) what are you expecting to see? It will likely be Canons proprietary raster and control format. Reversing that from the bus alone will be an enormous amount of work. I’ve written proprietary “WinPrinter” printer drivers with the spec in hand and it’s still not trivial.
- jrockway 4y agoThis is the best advice I've read so far. I think that it's good to separate "I need a hard copy of a document I have" with "I'd like to learn how to reverse engineer proprietary hardware". If you need a hard copy of a document, just email the thing to Kinkos and be done. If you want to start reverse engineering stuff, I'd get the "forward engineering" down first. Get a USB-capable arduino, try making a rotary encoder attached to it into a Linux input device. Make it show up as a device you can write 3 bytes to and turn the onboard LED that color. If you really want to crawl before you walk, skip USB and attach these things to a Raspberry Pi or similar. (Linux has built in drivers for all of these things, amazingly!) Now you have the basics of the communication down, and you can consider looking at wading into the undocumented archana of a proprietary one-off printer. It's going to be a really big project even for someone who has designed a printer and written a driver for it. That said, sniffing and replaying packets might get you pretty far. You should be able to do basic things like making the windows driver eject a piece of paper, and then doing that from Linux.
- JLCarveth 4y ago> Make it show up as a device you can write 3 bytes to I've been curious about doing something like this for a while, but don't even really know where to start when it comes to researching information on this topic. Do you have any good resources for accomplishing this?
- rroot 4y agoSmall rant, although on topic. I once had to ditch a perfectly functioning scanner (HP), due to out-of-date drivers and no linux support. I now do my best to always buy hardware that I know is well supported on Linux. For example, some CanoScan scanners are completely supported by Sane, see http://www.sane-project.org/lists/sane-mfgs-cvs.html http://www.sane-project.org/lists/sane-mfgs-cvs.html
- jherskovic 4y agoI bought a VueScan[1] license because of this. Awesome piece of software. There's a 5-month-old thread on it here: https://news.ycombinator.com/item?id=30760850 https://news.ycombinator.com/item?id=30760850 [1] https://www.hamrick.com/ https://www.hamrick.com/
- Maultasche 4y agoYep, my old Brother Printer/Scanner is no longer supported on modern versions of MacOS, but VueScan works great with it.
- jandrese 4y agoMy old CanoScan is only supported by Linux now. The last set of drivers they released were for Windows 7 32-bit only. The Mac drivers also stop at a similar vintage and are not forward compatible. Sane is the only remaining option.
- brudgers 4y agoFor what it's worth, fifty bucks solved my Linux photoprinter driver problem (Canon Pro100). [1] I bought Turboprint. https://www.turboprint.info/ https://www.turboprint.info/ To me, it is the shortcut that will save endless searching for something that doesn't exist. My free all Linux based solution was driverless printing, but it has limitations. My non-Linux exclusive solution was an old Thinkpad running windows and SD card sneakernet. That was the simplest thing that might work so I tried it first. Good luck. [1] Well mostly solved it...I mean it solved all the important issues with a color managed workflow. At the scale of color managed workflows, $50 is about rounding error on X-rite gear...or even Datacolor gear. Never mind if you price your time.
- Comevius 4y agohttps://github.com/endlessm/cnijfilter-common https://github.com/endlessm/cnijfilter-common You only need cnijfilter-4.10, pstocanonij and 312/libs_bin32, which are the 32-bit proprietary libraries used to communicate with your printer. Those are the ones you would want to replace.
- deleted 4y ago[deleted]
- hasajacyszatan 4y agoYou can install Windows XP with printing server in virtual machine
- m00dy 4y agoFirst of all, you would need a buffer :) Just joking, I would try to check out the source code and build it under 64bit arch you have. There might be some issues on the way and start to fix them could be the first step.
- MisterTea 4y agoPrinters are odd beasts. At first glance they appear to be a bitmap printing engine for paper (or whatever the medium) and you send it a bitmap and maybe some settings. But no, they actually have a front end computer that speaks one or more page layout languages. That language tells the printer how to render the data into bitmap which is printed. You first have to figure out which language your printer speaks. If it speaks a common language like postscript (basis for PDF) or PCL (printer command language) then you might be able to use a generic driver or one from a similar printer. If it is proprietary you will need to reverse engineer it by installing the printer in a native environment along with tools to sniff/log the communications send some test prints with magic data and figure out the command language that way. Given that your printer already has a 32 bit driver it stands to reason you could have a look at the 386 source and see what fails to build on an amd64 machine. Then correct that and you have a driver.
- userbinator 4y agoI'm not familiar with the exact model in question, but photo-oriented (as opposed to text-oriented) printers are usually bitmap-only, especially the cheaper ones. The main problem is that the format is not documented, and there may also be a layer of compression.
- barkingcat 4y agoDo you have technical documentation regarding this device?
- iam-TJ 4y agoLots of great advice here along the lines of "is it really worth your time and energy", but if you really want to tackle it don't focus on the hardware, focus on the existing (proprietary) software, and wrap it with your own libraries to observe and record inputs and outputs. lp myfile -> input-wrapper -> proprietary-library -> system-library -> printer | | ---------floss-library--------- As the existing driver is 32-bit there are two options for debugging on a x86_64 platform: 1. A 32-bit virtual-machine install with the printer connected via USB pass-through so the existing driver correctly operates the printer 2. As someone else said, use qemu-system-i386 with a 32-bit chroot minimal install Look at the source-code of the binary package containing the driver. Identify the proprietary binary blobs (most likely shared libraries) that are included. Use tools like objdump to identify the names of external functions they import from system libraries (which they'll call), and the functions they export for other tools to call into. Create basic wrapper libraries with the same names as the system libraries that export the same function names and signatures as the system library. Have those functions in your wrapper libraries call the same functions in the system libraries and pass through the arguments untouched BUT also have your wrapper functions log/dump/record the function and arguments being passed. In the same way create wrapper libraries that have the same name as the proprietary blob libraries and export the same functions. Have these functions call into the proprietary libraries and pass arguments untouched, and log/dump/record in the same way. Use LD_LIBRARY_PATH to have your wrapper libraries loaded and used by the tool used to print - I'd recommend using something basic like "lp". Do basic text printing to begin with and observe what the proprietary libraries output to the printer in response. You'll likely see control codes to configure the printer and then possibly the actual ASCII codes of the text unless the driver converts everything to bitmaps before sending. Even then, by printing one character at a time it is usually possibly to determine the data format of bitmaps and the positioning data. Compare with existing open-source drivers for similar devices from the same manufacturer since there is likely to be a lot of overlap and shared technology/code. Once you think you've got a handle on it have your wrapper library that pretends to be the proprietary library bypass the proprietary library and directly format and send the data to the system libraries. As you figure out more of the data format put that into your replacement FLOSS library until the proprietary is no longer required. At that point you can build the FLOSS library for 64-bit and upstream it for everyone to enjoy. Or just buy a replacement printer that is well supported already!
- glouwbug 4y agoHackernews is primarily software. Hackaday could help
- lifeisstillgood 4y agoThank you for posting this here. I have managed to get bogged down just replacing my home router with OpenWRT version (I blame lack of time) so while I cannot give you any useful tips, I can celebrate your bravery (or time management skills) and wish you all the very best. The site is Hacker News, so we need a bit more low level hackery here, and a few less insights into ideal product management style.
- gigatexal 4y agoThe hassle is not worth it. Just buy a new, modern AirPrint compatible printer.
- triggercut 4y agoThere was a really good article posted the other day here, and while focusing on windows, gives a lot of interesting tips for investigating the history of how the driver package was put together and who wrote the driver and using that to help. https://news.ycombinator.com/item?id=32714806 https://news.ycombinator.com/item?id=32714806
- weare138 4y agoMight be easier to check out the source to the 32bit driver if it works. The USB and printing protocols should already be implemented and possibly documented in the source. Then you could poke around with the 64bit drivers for similar model printers, that same protocol is probably used in other printers. Could be able to just lift the relevant code from an existing 64bit driver.
- SanjayMehta 4y agoLook at Gutenprint code for ideas. They had an open source driver for my photo printer. They might even support your printer, if getting it to work is the only objective.
- worthless-trash 4y agoYou're all jerking up the wrong tree. The actual source is available, http://ppa.launchpad.net/thierry-f/fork-michael-gruz/ubuntu/pool/main/c/cnijfilter2/ http://ppa.launchpad.net/thierry-f/fork-michael-gruz/ubuntu/... http://ppa.launchpad.net/thierry-f/fork-michael-gruz/ubuntu/pool/main/c/cnrdrvcups-lb/ http://ppa.launchpad.net/thierry-f/fork-michael-gruz/ubuntu/... etc.. The packages are compiled for x86-64. What am i missing, no reversing required ?
- hapless 4y agoCanon devices usually support PCL and Postscript. The proprietary drivers are just faster/fancier.
- bgorman 4y agoEven the low end devices? Doesn’t postscript cost an arm and a leg to license?
- jrockway 4y agoI doubt it. The printer vendors paid the license fees decades ago and the patents have since expired. While researching this comment I read an article from 1997 about how Adobe changed the spec to be able to extract more revenue. Whatever patent they used as a stick has since expired. I can't really find a definitive answer, of course, but all of the basics are from the early 90s, with some obvious followup "oh shit we need money" patents from 2000. (Obviously, 2000s era technology seems obvious today. I don't know if it was obvious in 2000. Things like "4 digit dates" were a new idea back then ;)
- progre 4y agoNope. Source: have an old low end Canon printer/scanner combo. Pixma M270, works great but no postscript. Gutenprint drivers are available
- floxy 4y agoIt is so sad that printers don't do postscript anymore. Back in 1984, when 300dpi on an 8.5x11 sheet needed a whole 1 MB of memory to rasterize the entire page, that made the printers more expensive. But that excuse died a long time ago.
- torstenvl 4y agoI've never written a kernel driver, but wouldn't it be easier to start with the 32-bit driver, update the kernel APIs, and move (most?) integer types to fixed-width?
- tpmx 4y agoIt looks like the 32-bit driver is closed source. The download doesn't contain any source code, despite the text on this page. https://www.canon-europe.com/support/consumer_products/products/printers/inkjet/pixma_ip_series/pixma_ip1800.html?type=download&language=en&os=linux%20(32-bit) https://www.canon-europe.com/support/consumer_products/produ...
- tssva 4y agoThe source is available in several GitHub repos including at least one which claims to have updated the code to compile on modern systems.
- raverbashing 4y agoThat's exactly it (not sure if the kernel USB API is the same, that might be a tricky part)
- hapless 4y agoPrinter drivers are user space.
- lagrange77 4y ago> What's the toolchain for sniffing USB data You can use Wireshark for that part. https://wiki.wireshark.org/CaptureSetup/USB https://wiki.wireshark.org/CaptureSetup/USB