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/ekplp0でSystem 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"