USB-Parallelアダプター を介して古い Lexmark 1100プリンター をセットアップしようとしています。
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のインストールも目に見えるエラーなしで行われます。
基本的に、 OpenPrintingのインストール で利用可能な手順に従います。
apt install lsb
dpkg -i openprinting-lm1100_1.0.2a-6lsb3.2_AMD64.deb
残念ながら、そのようなインストール手順の後、プリンターは単に印刷されません。テストページを印刷しようとすると、ほとんどの場合、プリンターは停止したように静かなままです。 CUPSから得た唯一の情報は、「プリンターの状態:処理中-プリンターにデータを送信中」です。
ドライバーパッケージを見ると、プリントヘッドをサービスと駐車位置に移動する2つの簡単なスクリプト(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-Parallelアダプターを使用するように編集する必要があります。ただし、/dev/lp0
を/dev/usb/lp0
に置き換えても、このようなスクリプトは機能しません。
この問題は、ハードウェアの破損が原因ではないと確信しています。理由は次のとおりです。
質問
lm1100change
とlm1100back
で機能させる方法はありますか?システム仕様
デバッグ
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
への唯一の参照がコメントと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)
したがって、lx
はデバイスパスに依存しないようであり、ソースコードを再コンパイルする必要はありません。それはただ呼び出すことの問題でしょう:
gs -q -sDEVICE=pbmraw -r288 \
-dNOPAUSE -dSAFER -dBATCH \
-sOutputFile=- \
$1 | lx > /dev/usb/lp0
uSB-Parallelアダプターを介して印刷するため。
最近、私は次のことを説明した開発者の1人と話をしました。
プログラム 'lx'は非常に単純です。ピクセルを取得し、強力な変換なしでプリンターに送信します。プログラムによって送信されるバイナリフローが、プリンタが受信するものと同じである場合、それは機能するはずです。そうでない場合、これは、バイナリフローがシステム(USBからパラレルドライバー、USBドライバー)のどこか、またはUSBからパラレルデバイスで変更されていることを意味します。どこかわからない。
さらに:
あなたの問題は簡単に解決することはできません:それは低レベルのデバッグを要求します。最初に確認することは、プリンター(/ dev/lp0または他の名前)の作成、そして簡単なコマンド(ヘッド移動)が機能しているかどうかです...
最後に、開発者がこの問題に問題を抱えているので、私はあきらめて、面倒なデスクトップPCI-Parallelカードを使い続ける必要があります。
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/
ディレクトリにインストールされる多数のファイルが含まれています。
/opt/OpenPrinting-lm1100/ppds/Lexmark/
ディレクトリのPPDファイルは、プリンタのモデル名以外は完全に同一のようです。したがって、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/
には、lm1100change
とlm1100back
という名前の2つの簡単なユーティリティスクリプトもあります。これらは/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]
を作成し、依存関係エラーで失敗したことを示します。しかし、それはデバイスのCUPS印刷キューを自動作成するudevベースのスクリプトのようであり、基本的にはすでに手動で行ったことを複製するため、ここでは重要ではないようです... udevベースでない限りスクリプトがアダプタの/dev/usb/lp*
デバイスの作成を妨害しています。
USB->パラレルアダプターに対応する/dev/bus/usb/*/*
デバイスもありますが、これはlibusb
およびその他のユーザースペースUSBドライバー用の汎用USBインターフェイスです。これは別のAPIを使用するため、Lexmarkドライバーなどの従来のパラレルポートと同様のインターフェイスを期待するアプリケーションには役立ちません。 /dev/usb/lp*
デバイスノードが見つからないか、一貫して作成されていない場合、CUPSに問題がある可能性があります。