跟进

跟进

我正在尝试设置一个旧的利盟 1100 打印机通过一个USB 转并口适配器
Debian 似乎正确识别了适配器:

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 安装也没有任何可见错误。
基本上,我正在按照以下位置提供的步骤进行操作打开打印安装

  1. apt install lsb
  2. 下载适用于 Debian 的 64 位驱动程序
  3. dpkg -i openprinting-lm1100_1.0.2a-6lsb3.2_amd64.deb
  4. 开始菜单 > 首选项 > 打印设置
  5. 将打印机添加到 CUPS
    (有时设备被列为“未知”,有时被列为“Lexmark 1000”,尽管正确的应该是“Lexmark 1100”,并且连接始终列为“USB”)

不幸的是,经过这样的安装步骤后,打印机根本无法打印。当我尝试打印测试页时,大多数时候打印机都保持安静,就像死机一样。我从 CUPS 获得的唯一信息是“打印机状态:处理 - 将数据发送到打印机”。

查看驱动程序包,有两个简单的脚本(lm1100changelm1100back)将打印头移动到维修和停车位置:

    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

它们被硬编码以供使用/dev/lp0,并且可能应该进行编辑以使用 USB 转并行适配器。然而,即使替换/dev/lp0/dev/usb/lp0这样的脚本仍然不起作用。

我确信这个问题不是由于硬件损坏造成的,因为:

 

问题

  • 知道如何制作脚本lm1100changelm1100back工作吗?
  • Lexmark 1100 驱动程序支持 USB 转并行适配器吗?
    如果没有,有什么解决方法吗?前任:符号链接
  • 知道如何通过 USB 并行适配器安装 Lexmark 1100 打印机吗?

 


系统规格

 

调试

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]: [email protected]: Job [email protected]/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 [email protected]
# /lib/systemd/system/[email protected]
[Unit]
Description=Configure Plugged-In Printer
Requires=cups.socket
After=cups.socket

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

 


跟进

考虑到脚本lm1100changelm1100back位置是用/dev/lp0而不是硬编码的/dev/usb/lp0,首先您可能会猜测可执行文件lm1100也会被硬编码为/dev/lp0而不是/dev/usb/lp0

然而,仔细观察一下源代码显示唯一的引用/dev/lp0是在评论和自述文件中:

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)

因此,似乎lx设备路径无关,并且源代码不需要重新编译。这只是一个调用的问题:

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

以使其通过 USB 并行适配器进行打印。

 

最近,我与一位开发人员交谈,他解释了以下内容:

程序“lx”非常简单:它获取像素并将其发送到打印机,无需任何强转换。如果程序发送的二进制流与打印机接收的二进制流相同,则它应该可以工作。因为事实并非如此,这意味着二进制流在系统中的某个位置(USB 到并行驱动程序、USB 驱动程序)和/或 USB 到并行设备中发生了更改。我不知道在哪里。

 

而且:

您的问题不容易解决:它需要低级调试。首先要检查的是打印机的创建(/dev/lp0 或其他名称),然后,简单的命令(头部移动)是否正常工作......

 

最后,由于开发人员在这个问题上遇到了麻烦,我将不得不放弃并继续使用笨重的桌面 PCI 并行卡。

答案1

我下载并手动解压了openprinting-lm1100_1.0.2a-6lsb3.2_amd64.deb驱动程序包。

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...]

它包含许多将安装到/opt/OpenPrinting-lm1100/目录的文件。

除了打印机型号名称之外,目录中的 PPD 文件/opt/OpenPrinting-lm1100/ppds/Lexmark/似乎完全相同。因此,该驱动程序对 Lexmark 1000、1020 和 1100 的处理方式完全相同。

如果系列中的各个打印机难以区分,则 CUPS 接收到的标识字符串可能仅标识型号系列,而不标识实际型号。这可能可以解释usb://Lexmark/1000您所看到的字符串。

我注意到 PPD 文件包含各种行,这些行似乎恰好以 71 个字符换行并&&指示换行,例如:

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

显然,这是 PPD 的有效换行语法。活到老,学到老...

上面提到的命令行基本上会使用gs(即GhostScript)将任何PDF或PS格式的打印作业转换为ppmraw格式,然后将结果通过管道传递给/opt/OpenPrinting-lm1100/bin/lm1100命令,这是一个二进制文件。它应该以适合打印机的格式输出打印作业数据,然后 CUPS 应通过管道传输到实际的打印机设备,这类似于/dev/usb/lp1使用 USB-> 并行转换器。

中还有两个简单的实用程序脚本/opt/OpenPrinting-lm1100/bin/,namedlm1100changelm1100back.这些是硬编码的/dev/lp0,应该可以编辑使用/dev/usb/lp1(或者无论你的USB->并行适配器最终是什么)。该/opt/OpenPrinting-lm1100/doc/README.maintenance文件指出,lm1100change更换墨盒时应将打印头移至合适的位置,并lm1100back应将其移回正常停放位置。

有时设备被列为“未知”,有时被列为“Lexmark 1000”,这表明 USB-> 并行适配器读取 IEEE-1284 并行端口打印机标识字符串,因此 CUPS 可以将它们与 PPD 文件进行匹配并找到这样就可以自动修正 PPD。该Lexmark-1100-lm1100-en.ppd文件包含以下行:

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

您也许能够看到带有 的标识字符串cat /sys/class/usbmisc/lp1/ieee1284_id:如果该字符串不为空,则适配器已探测到标识字符串并收到了来自打印机的响应。

您的日志消息

[email protected]: Job [email protected]/start failed with result 'dependency'.

表示某项已创建systemd服务[email protected],但因依赖错误而失败。但这似乎只是一个基于 udev 的脚本,它将自动为设备创建 CUPS 打印队列,本质上是复制您已经手动完成的操作,因此它在这里似乎并不重要......除非基于 udev 的脚本脚本在某种程度上干扰了/dev/usb/lp*适配器设备的创建。

还有一个与 USB->并行适配器相对应的设备,但那是用于和其他用户空间 USB 驱动程序/dev/bus/usb/*/*的通用 USB 接口。libusb它使用不同的 API,对于需要类似于传统并行端口的接口(例如 Lexmark 驱动程序)的应用程序来说没有用处。如果/dev/usb/lp*设备节点丢失或创建不一致,这可能可以解释 CUPS 遇到的问题。

相关内容