トップ «前の日記(2012年04月05日) 最新 次の日記(2012年04月16日)» 編集

Masa's blog

検索キーワード:

2012年04月15日 EPSON PM-3500C をUSB接続で利用する場合の注意 [長年日記]

_ EPSON PM-3500C をUSB接続で利用する場合の注意

PM-3500Cを含む多くのEPSONプリンタでは、単純にUSBポートに接続するだけでは、カーネルはちゃんと認識しているが、いざデータを送っても全く反応しない。Linux USB FAQ:My Epson printer doesn't print anything.によると、以下のデータをプリンタに送ってやらないとパラレルモードからUSBモードに切り替わらないということらしい。

echo -e "\x00\x00\x00\x1b\x01\x40\x45\x4a\x4c\x20\x31\x32\x38\x34\x2e\x34\x0a\x40\x45\x4a\x4c\x20\x20\x20\x20\x20\x0a" >/dev/usblp0

実際、上記の操作を行ったら、

echo -e "aaa\f" >/dev/usblp0

で "aaa" が印字された。

_ LPRng-3.8.35

Slackware-11.0 + kernel-2.6.17.14という若干古めな環境に、EPSON PM-3500CをUSBで接続することにしたのだが、そのマシンというのは、このmyh.no-ip.orgのこと。常時起動マシンに繋げるのだから、lpd的なものを立ち上げてネットワーク越しに、奥さん(Linux)や息子のPC(Windows7)から常に印字できるようにしたい。

さすがにSlackware-11.0という古い環境でも、プリント環境はCUPSになっている。しかしこちらはlpd止まりの知識しか持ち合わせていない。また、このマシンはXorgは起動していないので、ブラウザベースで管理するCUPSではちと勝手が悪い...。

と、都合の良い理由をつけて、(いにしえの)LPRngをインストールした。

LPRng-3.8.35

  • tar xvzf LPRng-3.8.35.tgz
  • cd LPRng-3.8.35
  • vi Makefile.in
*** Makefile.in.ORG     2012-04-15 21:13:45.000000000 +0900
--- Makefile.in 2012-04-15 21:14:28.000000000 +0900
***************
*** 45,51 ****
  LPD_CONF_PATH=\"@LPD_CONF_PATH@\"
  PRINTCAP_PATH=\"@PRINTCAP_PATH@\"
  LPD_PATH=\"@LPD_DIR@/lpd\"
! SHELL="@SHELL@"
  LOCKFILE=\"@LOCKFILE@\"
  CONFIG_SUBDIR="@CONFIG_SUBDIR@"
  PSHOWALL="@PSHOWALL@"
--- 45,51 ----
  LPD_CONF_PATH=\"@LPD_CONF_PATH@\"
  PRINTCAP_PATH=\"@PRINTCAP_PATH@\"
  LPD_PATH=\"@LPD_DIR@/lpd\"
! SHELL=@SHELL@
  LOCKFILE=\"@LOCKFILE@\"
  CONFIG_SUBDIR="@CONFIG_SUBDIR@"
  PSHOWALL="@PSHOWALL@"
  • make
  • su
  • make install

/etc/group

lpdがユーザdaemonの権限で動き、USBプリンタのデバイスが、

$ ls -al /dev/usb/lp0
crw-rw-r-- 1 root lp 180, 0 2012-04-15 21:21 /dev/usb/lp0

という状況なので、vipw -gにて

lp::7:lp,daemon

と設定する。

スプールディレクトリの作成

  • mkdir /var/spool/lpd; chown daemon.daemon /var/spool/lpd; chmod 775 /var/spool/lpd
  • mkdir /var/spool/lpd/lp; chown daemon.daemon /var/spool/lpd/lp; chmod 700 /var/spool/lpd/lp
  • mkdir /var/spool/lpd/lpraw; chown daemon.daemon /var/spool/lpd/lpraw; chmod 700 /var/spool/lpd/lpraw

一通りできたら、root権限でcheckpcを実行してみると良い。パーミッション等で不適切な状態があれば指摘してくれる。

/usr/local/etc/printcap

.common:
   :sd=/var/spool/lpd/%P
   :sh:mx=0:mc=0
#
lp:lp=/dev/usblp0:\
        :tc=.common:\
        :filter=/usr/libexec/filters/lp-filter.sh:
#
lpraw:lp=/dev/usblp0:\
        :tc=.common:\
        :filter=/usr/libexec/filters/lpraw-filter.sh:
        :ff=:

lpはローカルから打ち出すためのプリンタ定義。lprawはネットワーク越しに他のPCからの印字を受けるプリンタ定義。フィルタは以前の設定を参照。

pips3500-2.1.2

EPSONから提供されているフィルタを使うのだが、メンテはとっくに止まっている感じ。コンパイル時もエラーが出た。下記のパッチをあてればコンパイルは通る。

*** ekpstm/ekpstm-1.0.2/src/main.c.ORG  2012-04-15 11:52:39.000000000 +0900
--- ekpstm/ekpstm-1.0.2/src/main.c      2012-04-15 11:53:15.000000000 +0900
***************
*** 72,77 ****
--- 72,79 ----
            break;

          default:
+           break;
+
         }
     }

ただし、printcapに、

# written for pips3500
pm3500c:\
   :sd=/var/spool/lpd/pm3500c:\
   :mx#0:\
   :sh:\
   :lp=/var/ekpd/ekplp0:\
   :if=/usr/local/EPKowa/PM3500C/filter3500:
# pips3500  end

の定義をいれると、lprで印字できない。/var/ekpd/ekplp0System call interruptみたいなメッセージがでる。なので、この定義はコメントアウトしておき、/etc/rc.d/rc.localに追加されている/etc/rc.d/rc.ekpdの起動部分もコメントアウトしておく。

/etc/rc.d/rc.lprng

#!/bin/sh
case "$1" in
start)
# Start daemons.
      /usr/bin/echo "Starting lpd"; /usr/local/sbin/lpd; /usr/bin/echo "";
      ;;
stop)
# Stop daemons.
      /usr/bin/printf "Shutting down lpd: "
      pkill lpd
      /usr/bin/echo "done"
      ;;
*)
      echo "Usage: lpd {start|stop}"
      ;;
esac

/usr/libexec/filters/initepsonusb.sh

#! /bin/sh
/usr/bin/echo -e "\x00\x00\x00\x1b\x01\x40\x45\x4a\x4c\x20\x31\x32\x38\x34\x2e\x34\x0a\x40\x45\x4a\x4c\x20\x20\x20\x20\x20"

/usr/libexec/filters/lp-filter.sh

#! /bin/sh
#
# txt, ps, jpg, gif
#
PATH=/usr/libexec/filters:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
export PATH
#
# FUNCTION
#
function terminate(){
    rm /tmp/prfilter.*.$$.tmp
    exit 0
}
#
initepsonusb.sh
#
cat >/tmp/prfilter.1.$$.tmp
fileattr=`file /tmp/prfilter.1.$$.tmp`
#
# mt=$1   # PLAIN SFINE PMPHOTO
# re=$2   # 360 720
# ql=$3   # STD FINE PHOTO
# hs=$4   # ON OFF
# in=$5   # COLOR MONO
# cc=$6   # PHOTO GRAPH NONE
#
# POSTSCRIPT file
#
if [ "X`echo $fileattr|grep -i ' postscript'`" != "X" ]
then
    cat /tmp/prfilter.1.$$.tmp |\
    psfilter.sh PLAIN 360 STD ON COLOR PHOTO
    terminate
fi
#
# JPEG file
#
if [ "X`echo $fileattr|grep -i ' jpeg'`" != "X" -o \
     "X`echo $fileattr|grep -i ' jfif'`" != "X" ]
then
    djpeg -pnm /tmp/prfilter.1.$$.tmp |\
    pnmtops -nocenter |\
    psfilter.sh PLAIN 360 STD ON COLOR PHOTO
    terminate
fi
#
# GIF file
#
if [ "X`echo $fileattr|grep -i ' gif'`" != "X" ]
then
    giftopnm /tmp/prfilter.1.$$.tmp |\
    pnmtops -nocenter |\
    psfilter.sh PLAIN 360 STD ON COLOR PHOTO
    terminate
fi
#DEL_#
#DEL_# OBJ(Tgif) file
#DEL_#
#DEL_if [ "X`echo $fileattr|grep -i ' tgif'`" != "X" ]
#DEL_then
#DEL_    cp /tmp/prfilter.1.$$.tmp /tmp/prfilter.1.$$.obj
#DEL_    tgif -print -color -o/tmp -ps -stdout /tmp/prfilter.1.$$.obj 2>/dev/null |\
#DEL_    psfilter.sh PLAIN 360 STD ON COLOR PHOTO
#DEL_    rm /tmp/prfilter.1.$$.obj
#DEL_    terminate
#DEL_fi
#
# TEXT file
#
if [ "X`echo $fileattr|grep -i ' text'`" != "X" ]
then
    PROVDIR=/usr/local/prov; export PROVDIR
    ${PROVDIR}/bin/prov -text /dev/null /tmp/prfilter.1.$$.tmp |\
    psfilter.sh PLAIN 360 STD ON MONO NONE
    terminate
fi
#
# NOT SUPPORTED
#
(echo $fileattr; echo ""; echo "NOT SUPPORTED"; echo "^L") >/tmp/prfilter.2.$$.tmp
PROVDIR=/usr/local/prov; export PROVDIR
${PROVDIR}/bin/prov -text /dev/null /tmp/prfilter.2.$$.tmp |\
psfilter.sh PLAIN 360 STD ON MONO NONE
terminate

/usr/libexec/filters/psfilter.sh

#! /bin/sh
PATH=/usr/libexec/filters:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
export PATH
#
#LANG=ja_JP.eucJP
#export LANG
#
mt=$1   # PLAIN SFINE PMPHOTO
re=$2   # 360 720
ql=$3   # STD FINE PHOTO
hs=$4   # ON OFF
in=$5   # COLOR MONO
cc=$6   # PHOTO GRAPH NONE
#
# width =210-3-3 =204mm = 204x(360/25.4)=2891dot = 8inch
# height=297-3-14=280mm = 280x(360/25.4)=3968dot =11inch
#
gs -r${re} \
   -sPAPERSIZE=a4 \
   -q \
   -dNOPROMPT \
   -dNOPAUSE \
   -dSAFER \
   -sDEVICE=png16m \
   -sOutputFile=- \
   - \
   -c \
   quit |\
pips3500 -ui C \
         -ms A4 \
         -mt ${mt} \
         -re ${re} \
         -ql ${ql} \
         -hs ${hs} \
         -ht ED \
         -sc 100 \
         -in ${in} \
         -cc ${cc} \
         -br 0 \
         -co 0 \
         -sa 0 \
         -st 0 0 0 \
         -mg 3 3 \
         -ps AUTO

/usr/libexec/filters/lpraw-filter.sh

#!/bin/sh
#
# raw filter for any printer
#
initepsonusb.sh
/bin/cat

prov

lp-filter.sh中で使用している、拙作provに関しては、prov-1.1 -- Overlay printing utility for UNIX-like systemsを参照。

_ lpr(LPRng等)とgtk+-2.0系のアプリケーションに関して

firefox等のgtk+-2.0系のアプリケーションで印刷を行う際に、デフォルトでは[LPRに印刷する]の選択肢が出てこない。まぁ大方の人間はCUPSを使っているのだろうから構わないということなのだろう。

[LPRに印刷する]の選択肢を出すためには、/etc/gtk-2.0/gtkrcまたは~/.gtkrc-2.0に以下のような記述を追加する。

gtk-print-backends="file,lpr,cups"