Linux Setup Notes

name and address
created aug 12, 2012

Setting up USB printer in Suse 11

When my Lexmark E323n printer got struck by lightning, it lost the ability to print over the network. Luckily, only the network card was destroyed and USB printing still worked. This page documents how to set up USB printing in Linux.

USB

Plug the printer in to a USB port and monitor the system logs to make sure Linux can see it. As shown below, the computer assigned it to /dev/usblp0 (which is a link to /dev/usb/lp0). On my computer, only the USB ports on the back of the computer worked in Linux. Ports on the front and top didn't work.

crw-rw---- 1 root lp 180, 0 2012-08-12 08:01 /dev/usb/lp0

The logs should look something like this:

Aug 12 08:01:58 nitrogen kernel: usb 2-4: new full speed USB device using ohci_hcd and address 9
Aug 12 08:01:58 nitrogen kernel: usb 2-4: configuration #1 chosen from 1 choice
Aug 12 08:01:58 nitrogen kernel: usblp0: USB Bidirectional printer dev 9 if 0 alt 0 proto 2 vid 0x043D pid 0x0070
Aug 12 08:01:58 nitrogen kernel: usb 2-4: New USB device found, idVendor=043d, idProduct=0070
Aug 12 08:01:58 nitrogen kernel: usb 2-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Aug 12 08:01:58 nitrogen kernel: usb 2-4: Product: Lexmark E323
Aug 12 08:01:58 nitrogen kernel: usb 2-4: Manufacturer: Lexmark International, Inc.
Aug 12 08:01:58 nitrogen kernel: usb 2-4: SerialNumber: 8909GRX

LPRng

Lprng works with a USB printer, provided the OS can see the printer. Below is a printcap that works on my system:

lp:\
	:cm=lpdfilter drv=upp method=auto dpi=600\
	:lp=/dev/usb/lp0:\
	:sd=/var/spool/lpd/lp:\
	:lf=/var/spool/lpd/lp/log:\
	:af=/var/spool/lpd/lp/acct:\
	:if=/usr/lib/lpf:\
	:la@:\
	:tr=:cl:sh:

Lpf is a little script that gets rid of the staircase effect (yes, Linux still has this after all these years). This must be executable, or nothing will be printed.

-rwxr-xr-x 1 root root 105 2012-07-31 10:20 /usr/lib/lpf 
#!/bin/sh
if [ "$1" = c ]; then
   cat
else
   sed -e s/$/<cr>
fi
# The echo -ne assumes bash
echo -ne \\f

This file contains binary characters, so typing the above won't work unless you change the <cr> to a real CR (Nedit is useful for this). The file is available here.

CUPS

Suse's Yast2 administration tool found the printer, but insisted on replacing Lprng with Cups. So, just for fun, I set up the printer in Cups. Yast2 installed quite a lot of stuff, then hung while trying to configure it. It also deletes your lpd and /etc/printcap files.

The preferred way to set up a USB printer in Cups is with a web browser.

 http://localhost:631 

Unlike Lprng, Cups requires a printer-specific "driver," which is Linux's way of making sure we always stay five years behind Windows. But once the proper driver is selected, it works. Cups overwrites your /etc/printcap file to look like this:

lp|Lexmark:rm=nitrogen.bankrupt-is-us.com:rp=lp: 

and automatically starts up the print daemon, /usr/sbin/cupsd. Once you set your printer as the "default" by clicking the "Set as Default" button, you can print by typing commands like lp mydocument or lp -d Lexmark mydocument.

Cups was also able to print Postscript files, but on my E323 the document was always chopped off at the bottom and the "Error" LED on the printer was always set. This may be because the closest driver available was for the Lexmark E321, or because of an error in the driver. This highlights the weakness of the CUPS system. If a driver for your printer is not available, or has bugs, you're screwed even if your printer natively handles PostScript (as the E323 does). This is why operating systems and programs that require the user to install drivers are an abomination upon the Earth. Other than that, Cups is great. But we curmudgeons prefer lprng, which adheres to the Unix philosophy of doing a single thing well, without requiring X Windows and a Web browser to set it up, and can send a PostScript file to a printer without mangling it.

Cups Documentation can be found at http://www.cups.org/doc-1.1/sam.html.

Back