web-dev-qa-db-ja.com

Debian:USB-Parallelアダプター経由で印刷

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のインストール で利用可能な手順に従います。

  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から得た唯一の情報は、「プリンターの状態:処理中-プリンターにデータを送信中」です。

ドライバーパッケージを見ると、プリントヘッドをサービスと駐車位置に移動する2つの簡単なスクリプト(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-Parallelアダプターを使用するように編集する必要があります。ただし、/dev/lp0/dev/usb/lp0に置き換えても、このようなスクリプトは機能しません。

この問題は、ハードウェアの破損が原因ではないと確信しています。理由は次のとおりです。

  • プリンタは、PCIパラレルカードを介して正常に動作します。
  • USB-パラレルアダプタは、 Epson Stylus Color 480プリンタ で正常に動作します。

質問

  • スクリプトをlm1100changelm1100backで機能させる方法はありますか?
  • Lexmark 1100ドライバーはUSB-Parallelアダプターをサポートしていますか?
    そうでない場合、回避策はありますか?例: シンボリックリンク
  • Lexmark 1100プリンターをUSB-パラレルアダプター経由でインストールする方法はありますか?


システム仕様

デバッグ

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カードを使い続ける必要があります。

3
Mark Messa

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/には、lm1100changelm1100backという名前の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に問題がある可能性があります。

1
telcoM