3

I'm trying to setup an old Lexmark 1100 printer via an USB-to-Parallel adapter.
It seems that Debian correctly recognizes the adapter:

root@debian:~# dmesg | tail --lines=6
[  130.042983] usb 5-1: new full-speed USB device number 2 using ohci-pci
[  130.232289] usb 5-1: New USB device found, idVendor=1a86, idProduct=7584
[  130.232297] usb 5-1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[  130.232301] usb 5-1: Product: USB2.0-Print
[  130.399415] usblp 5-1:1.0: usblp0: USB Bidirectional printer dev 2 if 0 alt 1 proto 2 vid 0x1A86 pid 0x7584
[  130.399507] usbcore: registered new interface driver usblp

 

CUPS installation also happens without any visible error.
Basically, I'm following the steps available at OpenPrinting installation:

  1. apt install lsb
  2. download the 64bit driver for Debian
  3. dpkg -i openprinting-lm1100_1.0.2a-6lsb3.2_amd64.deb
  4. Start Menu > Preferences > Print Settings
  5. Add printer to CUPS
    (sometimes the device is listed as "Unknown" sometimes as "Lexmark 1000", although the correct would be "Lexmark 1100", and the connection is always listed as "USB")

Unfortunately, after such installation steps, the printer simply doesn't print. When I try to print a test page, most of the time the printer remains quiet like dead. The only info I've got from CUPS is "Printer State: Processing - Sending data to printer."

Looking at the driver package, there are two simple scripts (lm1100change and lm1100back) that moves the print head to service and parking position:

    root@debian:~# cat /opt/OpenPrinting-lm1100/bin/lm1100change 
    #!/bin/sh
    dd if=/opt/OpenPrinting-lm1100/share/lexmarkchange of=/dev/lp0

    root@debian:~# cat /opt/OpenPrinting-lm1100/bin/lm1100back 
    #!/bin/sh
    dd if=/opt/OpenPrinting-lm1100/share/lexmarkback of=/dev/lp0

They are hardcoded to use /dev/lp0 and should probably be edited to use the USB-to-Parallel adapter instead. However, even replacing /dev/lp0 with /dev/usb/lp0 such scripts still don't work.

I'm sure this issue is not due to broken hardware because:

 

Questions

  • Any idea how to make the scripts lm1100change and lm1100back work?
  • Does the Lexmark 1100 driver supports an USB-to-Parallel adapter?
    If not, is there any workaround? ex: symbolic links?
  • Any idea how to install the Lexmark 1100 printer via an USB-to-Parallel adapter?

 


System Specification

 

Debug

root@debian:~# lpstat -lp
Lexmark-Lexmark-1000-3  root              1024   Tue 19 Nov 2019 12:26:55 PM -03
    Status: Sending data to printer.
    Alerts: job-printing
    queued for Lexmark-Lexmark-1000

root@debian:~# lpstat -v
device for Lexmark-Lexmark-1000: usb://Lexmark/1000

root@debian:~# cat /var/log/daemon.log | tail
Nov 19 13:16:30 debian systemd[1]: Stopped target Printer.
Nov 19 13:16:36 debian systemd[1]: cups.socket: Socket service cups.service already active, refusing.
Nov 19 13:16:36 debian systemd[1]: Failed to listen on CUPS Scheduler.
Nov 19 13:16:36 debian systemd[1]: Dependency failed for Configure Plugged-In Printer.
Nov 19 13:16:36 debian systemd[1]: configure-printer@usb-003-006.service: Job configure-printer@usb-003-006.service/start failed with result 'dependency'.
Nov 19 13:16:36 debian systemd[1]: Reached target Printer.
Nov 19 13:17:15 debian dbus[357]: [system] Activating via systemd: service name='org.freedesktop.hostname1' unit='dbus-org.freedesktop.hostname1.service'
Nov 19 13:17:15 debian systemd[1]: Starting Hostname Service...
Nov 19 13:17:15 debian dbus[357]: [system] Successfully activated service 'org.freedesktop.hostname1'
Nov 19 13:17:15 debian systemd[1]: Started Hostname Service.

root@debian:~# systemctl cat configure-printer@usb-003-006.service
# /lib/systemd/system/configure-printer@.service
[Unit]
Description=Configure Plugged-In Printer
Requires=cups.socket
After=cups.socket

[Service]
ExecStart=/lib/udev/udev-configure-printer add "%i"

 


Follow-up

Considering that the scripts lm1100change and lm1100back where hardcoded with /dev/lp0 instead of /dev/usb/lp0, at first you might guess that the executable lm1100 would also be hardcoded as /dev/lp0 instead of /dev/usb/lp0.

However, a careful look at the source code shows that the only reference to /dev/lp0 were in the comments and in the readme:

lx.c
 * Usage:
 *  Create the script 'lp':
 *      !/bin/sh
 *      gs -q -sDEVICE=pbmraw -r288 \
 *      -dNOPAUSE -dSAFER -dBATCH \
 *      -sOutputFile=- \
 *      $1 | lx > /dev/lp0
 *  then call:
 *      lp <file>.ps


README
    A way to print a postscript file would be to run:

    gs -q -sDEVICE=ppmraw \
          -r300 \
          -sPAPERSIZE=(Letter|A4|Legal) \
          -dNOPAUSE \
          -dSAFER \
          -sOutputFile=- \
          -  | lm1100 - > /dev/lp(0|1|2)

Therefore, it seems that lx is device path agnostic and the source code doesn't need to be recompile. It would be just a matter of calling:

    gs -q -sDEVICE=pbmraw -r288 \
    -dNOPAUSE -dSAFER -dBATCH \
    -sOutputFile=- \
    $1 | lx > /dev/usb/lp0

in order to make it print via the USB-to-Parallel adapter.

 

Recently, I've talked to one of the developers which explained the following:

The program 'lx' is very simple: it gets the pixels and send them to the printer without any strong conversion. If the binary flow sent by the program is the same as the one the printer receives, it should work. As it does not, this means the binary flow is changed somewhere in the system (USB to parallel driver, USB driver) and/or in the USB to parallel device. I cannot know where.

 

Moreover:

Your problem is not easy to solve: it asks for low level debug. The first things to check are the creation of the printer (/dev/lp0 or some other name), and, then, if simple commands (head move) are working...

 

Finally, since the developer is having trouble with this issue, I will have to give up and continue using the cumbersome Desktop PCI-Parallel card.

1
  • Exactly what did you do in your step 4 of the installation process? What is the output of lpstat -lp? How about lpstat -v? When you attempt to print, does it result in any messages produced in /var/log/daemon.log? What do they say? – telcoM Nov 19 '19 at 8:27
1

I downloaded and manually extracted the openprinting-lm1100_1.0.2a-6lsb3.2_amd64.deb driver package.

mkdir /tmp/workdir
cd /tmp/workdir
wget https://www.openprinting.org/download/printdriver/debian/dists/lsb3.2/contrib/binary-amd64/openprinting-lm1100_1.0.2a-6lsb3.2_amd64.deb
ar x openprinting-lm1100_1.0.2a-6lsb3.2_amd64.deb
tar xvf data.tar.gz
[... results at /tmp/workdir/opt/OpenPrinting-lm1100...]

It contains a number of files that would install to /opt/OpenPrinting-lm1100/ directory.

The PPD files at /opt/OpenPrinting-lm1100/ppds/Lexmark/ directory seem to be completely identical other than by printer model names. So Lexmark 1000, 1020 and 1100 would be treated completely identically by this driver.

If the various printers in the series are that indistinguishable, it is possible that the identification string received by CUPS only identifies the model series, not the actual model. That might explain the usb://Lexmark/1000 string you're seeing.

I noticed that the PPD files contain various lines that seem to be wrapped at exactly 71 characters with && indicating the wrapping, for example:

*FoomaticRIPCommandLine: "gs -q -sDEVICE=ppmraw -r300 %A -dBATCH -dNOP&&
AUSE -dPARANOIDSAFER %Z -sOutputFile=- - | /opt/OpenPrinting-lm1100/bin/lm1100 %B -"

Apparently that is a valid line-wrapping syntax for PPDs. Live and learn...

The above-mentioned command line will basically use gs (i.e. GhostScript) to turn any PDF or PS-formatted print job into ppmraw format and then pipe the result to /opt/OpenPrinting-lm1100/bin/lm1100 command, which is a binary. It should output the print job data in a format suitable for the printer, which CUPS then should pipe into the actual printer device, which would be something like /dev/usb/lp1 when using a USB->parallel converter.

There are also two simple utility scripts in /opt/OpenPrinting-lm1100/bin/, named lm1100change and lm1100back. Those are hardcoded to use /dev/lp0 and should probably be edited to use /dev/usb/lp1 (or whatever your USB->parallel adapter ends up being) instead. The /opt/OpenPrinting-lm1100/doc/README.maintenance file indicates that lm1100change should move the print head into appropriate position for changing the print cartridges, and lm1100back should move it back to the normal parking position.

The fact that sometimes the device is listed as "Unknown" and sometimes as "Lexmark 1000" indicates that the USB->parallel adapter reads the IEEE-1284 parallel port printer identification strings, so CUPS could match them against the PPD files and find the correct PPD automatically that way. The Lexmark-1100-lm1100-en.ppd file contains the line:

*1284DeviceID: "DRV:Dlm1100,R1,M0,TF;"

You might be able to see the identification strings with cat /sys/class/usbmisc/lp1/ieee1284_id: if that is not empty, the adapter has probed for the identification string and received a response from the printer.

Your log message

configure-printer@usb-003-006.service: Job configure-printer@usb-003-006.service/start failed with result 'dependency'.

indicates that something has created a systemd service configure-printer@usb-003-006.service and it has failed with a dependency error. But that seems to be just an udev-based script that would auto-create the CUPS print queue for the device, essentially replicating what you already have done manually, so it does not seem to be important here... unless the udev-based script is somehow interfering with the creation of the /dev/usb/lp* device for the adapter.

There is also a /dev/bus/usb/*/* device corresponding to the USB->parallel adapter, but that is a generic USB interface for libusb and other userspace USB drivers. It uses a different API and is not useful for applications expecting an interface that is similar to a traditional parallel port, like the Lexmark driver. If the /dev/usb/lp* device node is missing or is not getting consistently created, that might explain the problems CUPS is having.

9
  • > "There are also two simple utility scripts in /opt/OpenPrinting-lm1100/bin/, named lm1100change and lm1100back." Yes, I often use them to check if the printer is alive. But, so far, they only works in the desktop + PCI-parallel card. – Mark Messa Nov 19 '19 at 22:22
  • I missed the fact that you had tried the driver with the PCI-Parallel card, so apparently && is a valid line-wrapping technique in PPDs. Live and learn... Anyway, the error message seems to be about a system that would auto-generate the print queue, effectively doing what you seem to have done manually anyway. So that does not seem to be significant either. The lm1100change and lm1100back would need editing to direct them to the USB adapter, as I indicated above. It might be that the lm1100 filter binary might need something similar, but that would require recompiling it from source. – telcoM Nov 19 '19 at 22:24
  • > "Those are hardcoded to use /dev/lp0" Yes, you are correct. The main command of lm1100change is dd if=/opt/OpenPrinting-lm1100/share/lexmarkback of=/dev/lp0. – Mark Messa Nov 19 '19 at 22:29
  • Yes, and for the USB->parallel adapter, the device won't be /dev/lp0 but something like /dev/usb/lp1 as I indicated above. – telcoM Nov 19 '19 at 22:30
  • > "You might be able to see the identification strings with cat /sys/class/usbmisc/lp1/ieee1284_id:" I've just tried that: cat: /sys/class/usbmisc/lp1/ieee1284_id: No such file or directory – Mark Messa Nov 19 '19 at 22:34

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.