我正在尝试设置一个旧的利盟 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 安装也没有任何可见错误。
基本上,我正在按照以下位置提供的步骤进行操作打开打印安装:
apt install lsb
- 下载适用于 Debian 的 64 位驱动程序
dpkg -i openprinting-lm1100_1.0.2a-6lsb3.2_amd64.deb
- 开始菜单 > 首选项 > 打印设置
- 将打印机添加到 CUPS
(有时设备被列为“未知”,有时被列为“Lexmark 1000”,尽管正确的应该是“Lexmark 1100”,并且连接始终列为“USB”)
不幸的是,经过这样的安装步骤后,打印机根本无法打印。当我尝试打印测试页时,大多数时候打印机都保持安静,就像死机一样。我从 CUPS 获得的唯一信息是“打印机状态:处理 - 将数据发送到打印机”。
查看驱动程序包,有两个简单的脚本(lm1100change
和lm1100back
)将打印头移动到维修和停车位置:
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
这样的脚本仍然不起作用。
我确信这个问题不是由于硬件损坏造成的,因为:
- 打印机通过 PCI 并行卡工作正常。
- USB 转并行适配器可与Epson Stylus Color 480 打印机。
问题
- 知道如何制作脚本
lm1100change
和lm1100back
工作吗? - Lexmark 1100 驱动程序支持 USB 转并行适配器吗?
如果没有,有什么解决方法吗?前任:符号链接? - 知道如何通过 USB 并行适配器安装 Lexmark 1100 打印机吗?
系统规格
- 操作系统:Debian 延伸 LXDE
- USB 转并行打印机适配器: BF-1284|手动的
- 打印机: 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"
跟进
考虑到脚本lm1100change
和lm1100back
位置是用/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/
,namedlm1100change
和lm1100back
.这些是硬编码的/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 遇到的问题。